diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm index a29cbee046..fd79d83dc5 100644 --- a/code/ZAS/Phoron.dm +++ b/code/ZAS/Phoron.dm @@ -40,18 +40,28 @@ var/image/contamination_overlay = image('icons/effects/contamination.dmi') obj/var/contaminated = 0 +obj/var/phoronproof = 0 + /obj/item/proc/can_contaminate() //Clothing and backpacks can be contaminated. - if(flags & PHORONGUARD) return 0 - else if(istype(src,/obj/item/weapon/storage/backpack)) return 0 //Cannot be washed :( - else if(istype(src,/obj/item/clothing)) return 1 + if(flags & PHORONGUARD) + return 0 + else if(phoronproof == 1) + return 0 + else if(istype(src,/obj/item/weapon/storage/backpack)) + return 0 //Cannot be washed :( + else if(istype(src,/obj/item/clothing)) + return 1 /obj/item/proc/contaminate() //Do a contamination overlay? Temporary measure to keep contamination less deadly than it was. - if(!contaminated) - contaminated = 1 - overlays += contamination_overlay + if(!can_contaminate()) + return + else + if(!contaminated) + contaminated = 1 + overlays += contamination_overlay /obj/item/proc/decontaminate() contaminated = 0 @@ -114,6 +124,15 @@ obj/var/contaminated = 0 src << "High levels of toxins cause you to spontaneously mutate!" domutcheck(src,null) +/mob/living/carbon/human/vox/pl_effects() + //Handles all the bad things phoron can do to Vox. + + //Contamination + if(vsc.plc.CLOTH_CONTAMINATION) contaminate() + + //Anything else requires them to not be dead. + if(stat >= 2) + return /mob/living/carbon/human/proc/burn_eyes() var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES] diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 2797c8c904..bcd85b53be 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -192,3 +192,10 @@ #define NOMUT 0 #define COLORMUT 1 #define SPECIESMUT 2 + +//carbon taste sensitivity defines, used in mob/living/carbon/proc/ingest +#define TASTE_HYPERSENSITIVE 3 //anything below 5% +#define TASTE_SENSITIVE 2 //anything below 7% +#define TASTE_NORMAL 1 //anything below 15% +#define TASTE_DULL 0.5 //anything below 30% +#define TASTE_NUMB 0.1 //anything below 150% \ No newline at end of file diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index c1aaed9e42..957a690f4f 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -5,12 +5,15 @@ #define NO_PAIN 0x8 // Cannot suffer halloss/recieves deceptive health indicator. #define NO_SLIP 0x10 // Cannot fall over. #define NO_POISON 0x20 // Cannot not suffer toxloss. +#define NO_EMBED 0x40 // Can step on broken glass with no ill-effects and cannot have shrapnel embedded in it. // unused: 0x8000 - higher than this will overflow // Species spawn flags #define SPECIES_IS_WHITELISTED 0x1 // Must be whitelisted to play. #define SPECIES_IS_RESTRICTED 0x2 // Is not a core/normally playable species. (castes, mutantraces) #define SPECIES_CAN_JOIN 0x4 // Species is selectable in chargen. +#define SPECIES_NO_FBP_CONSTRUCTION 0x8 // FBP of this species can't be made in-game. +#define SPECIES_NO_FBP_CHARGEN 0x10 // FBP of this species can't be selected at chargen. // Species appearance flags #define HAS_SKIN_TONE 0x1 // Skin tone selectable in chargen. (0-255) @@ -22,15 +25,22 @@ #define RADIATION_GLOWS 0x40 // Radiation causes this character to glow. // Languages. +#define LANGUAGE_GALCOM "Galactic Common" +#define LANGUAGE_EAL "Encoded Audio Language" #define LANGUAGE_SOL_COMMON "Sol Common" #define LANGUAGE_UNATHI "Sinta'unathi" #define LANGUAGE_SIIK "Siik" #define LANGUAGE_SKRELLIAN "Skrellian" -#define LANGUAGE_ROOTSPEAK "Rootspeak" #define LANGUAGE_TRADEBAND "Tradeband" #define LANGUAGE_GUTTER "Gutter" +#define LANGUAGE_SIGN "Sign Language" #define LANGUAGE_SCHECHI "Schechi" +#define LANGUAGE_ROOTLOCAL "Local Rootspeak" +#define LANGUAGE_ROOTGLOBAL "Global Rootspeak" #define LANGUAGE_CULT "Cult" +#define LANGUAGE_OCCULT "Occult" +#define LANGUAGE_CHANGELING "Changeling" +#define LANGUAGE_VOX "Vox-Pidgin" // Language flags. #define WHITELISTED 1 // Language is available if the speaker is whitelisted. @@ -42,3 +52,4 @@ #define INNATE 64 // All mobs can be assumed to speak and understand this language. (audible emotes) #define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message #define NO_STUTTER 256 // No stuttering, slurring, or other speech problems +#define ALT_TRANSMIT 512 // Language is not based on vision or sound (Todo: add this into the say code and use it for the rootspeak languages) \ No newline at end of file diff --git a/code/_helpers/turfs.dm b/code/_helpers/turfs.dm index 8583628114..1926246856 100644 --- a/code/_helpers/turfs.dm +++ b/code/_helpers/turfs.dm @@ -32,3 +32,10 @@ if(!available_turfs.len) available_turfs = start_turfs return pick(available_turfs) + +/proc/is_below_sound_pressure(var/turf/T) + var/datum/gas_mixture/environment = T ? T.return_air() : null + var/pressure = environment ? environment.return_pressure() : 0 + if(pressure < SOUND_MINIMUM_PRESSURE) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/_helpers/type2type.dm b/code/_helpers/type2type.dm index 0bcf546123..8dc9cb020b 100644 --- a/code/_helpers/type2type.dm +++ b/code/_helpers/type2type.dm @@ -73,14 +73,14 @@ // Turns a direction into text /proc/dir2text(direction) switch (direction) - if (1.0) return "north" - if (2.0) return "south" - if (4.0) return "east" - if (8.0) return "west" - if (5.0) return "northeast" - if (6.0) return "southeast" - if (9.0) return "northwest" - if (10.0) return "southwest" + if (NORTH) return "north" + if (SOUTH) return "south" + if (EAST) return "east" + if (WEST) return "west" + if (NORTHEAST) return "northeast" + if (SOUTHEAST) return "southeast" + if (NORTHWEST) return "northwest" + if (SOUTHWEST) return "southwest" // Turns text into proper directions /proc/text2dir(direction) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index d8623fa3eb..716e439283 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1165,12 +1165,12 @@ proc/is_hot(obj/item/W as obj) /proc/is_surgery_tool(obj/item/W as obj) return ( \ - istype(W, /obj/item/weapon/scalpel) || \ - istype(W, /obj/item/weapon/hemostat) || \ - istype(W, /obj/item/weapon/retractor) || \ - istype(W, /obj/item/weapon/cautery) || \ - istype(W, /obj/item/weapon/bonegel) || \ - istype(W, /obj/item/weapon/bonesetter) + istype(W, /obj/item/weapon/surgical/scalpel) || \ + istype(W, /obj/item/weapon/surgical/hemostat) || \ + istype(W, /obj/item/weapon/surgical/retractor) || \ + istype(W, /obj/item/weapon/surgical/cautery) || \ + istype(W, /obj/item/weapon/surgical/bonegel) || \ + istype(W, /obj/item/weapon/surgical/bonesetter) ) //check if mob is lying down on something we can operate him on. diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 522db6e1c4..d899f62049 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -300,6 +300,13 @@ else contents.Add(0) + // And here's for the Vox + if ("phoron") + if(t.air_contents.gas["phoron"] && !t.air_contents.gas["oxygen"]) + contents.Add(t.air_contents.gas["phoron"]) + else + contents.Add(0) + else //no tank so we set contents to 0 diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 2ceda25312..6ff37e0449 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -161,6 +161,7 @@ var/list/gamemode_cache = list() var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database + var/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database var/simultaneous_pm_warning_timeout = 100 @@ -279,6 +280,9 @@ var/list/gamemode_cache = list() if ("use_age_restriction_for_jobs") config.use_age_restriction_for_jobs = 1 + if ("use_age_restriction_for_antags") + config.use_age_restriction_for_antags = 1 + if ("jobs_have_minimal_access") config.jobs_have_minimal_access = 1 diff --git a/code/datums/autolathe/medical.dm b/code/datums/autolathe/medical.dm index 40211f9a8f..0762b5076e 100644 --- a/code/datums/autolathe/medical.dm +++ b/code/datums/autolathe/medical.dm @@ -1,26 +1,26 @@ /datum/category_item/autolathe/medical/scalpel name = "scalpel" - path =/obj/item/weapon/scalpel + path =/obj/item/weapon/surgical/scalpel /datum/category_item/autolathe/medical/circularsaw name = "circular saw" - path =/obj/item/weapon/circular_saw + path =/obj/item/weapon/surgical/circular_saw /datum/category_item/autolathe/medical/surgicaldrill name = "surgical drill" - path =/obj/item/weapon/surgicaldrill + path =/obj/item/weapon/surgical/surgicaldrill /datum/category_item/autolathe/medical/retractor name = "retractor" - path =/obj/item/weapon/retractor + path =/obj/item/weapon/surgical/retractor /datum/category_item/autolathe/medical/cautery name = "cautery" - path =/obj/item/weapon/cautery + path =/obj/item/weapon/surgical/cautery /datum/category_item/autolathe/medical/hemostat name = "hemostat" - path =/obj/item/weapon/hemostat + path =/obj/item/weapon/surgical/hemostat /datum/category_item/autolathe/medical/beaker name = "glass beaker" diff --git a/code/datums/supplypacks/atmospherics.dm b/code/datums/supplypacks/atmospherics.dm index fdbb4cafc3..4d097c4370 100644 --- a/code/datums/supplypacks/atmospherics.dm +++ b/code/datums/supplypacks/atmospherics.dm @@ -98,7 +98,7 @@ /obj/item/weapon/storage/toolbox/emergency = 2, /obj/item/clothing/suit/storage/hazardvest = 2, /obj/item/clothing/suit/storage/vest = 2, - /obj/item/weapon/tank/emergency_oxygen/engi = 4, + /obj/item/weapon/tank/emergency/oxygen/engi = 4, /obj/item/clothing/suit/space/emergency = 4, /obj/item/clothing/head/helmet/space/emergency = 4, /obj/item/clothing/mask/gas = 4 diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index 18f18db672..51a7e6e03c 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -49,17 +49,17 @@ /datum/supply_packs/med/surgery name = "Surgery crate" contains = list( - /obj/item/weapon/cautery, - /obj/item/weapon/surgicaldrill, + /obj/item/weapon/surgical/cautery, + /obj/item/weapon/surgical/surgicaldrill, /obj/item/clothing/mask/breath/medical, /obj/item/weapon/tank/anesthetic, - /obj/item/weapon/FixOVein, - /obj/item/weapon/hemostat, - /obj/item/weapon/scalpel, - /obj/item/weapon/bonegel, - /obj/item/weapon/retractor, - /obj/item/weapon/bonesetter, - /obj/item/weapon/circular_saw + /obj/item/weapon/surgical/FixOVein, + /obj/item/weapon/surgical/hemostat, + /obj/item/weapon/surgical/scalpel, + /obj/item/weapon/surgical/bonegel, + /obj/item/weapon/surgical/retractor, + /obj/item/weapon/surgical/bonesetter, + /obj/item/weapon/surgical/circular_saw ) cost = 25 containertype = "/obj/structure/closet/crate/secure" @@ -237,7 +237,7 @@ /obj/item/device/camera, /obj/item/device/camera_film = 2, /obj/item/weapon/autopsy_scanner, - /obj/item/weapon/scalpel, + /obj/item/weapon/surgical/scalpel, /obj/item/weapon/storage/box/masks, /obj/item/weapon/storage/box/gloves, /obj/item/weapon/pen diff --git a/code/datums/supplypacks/misc.dm b/code/datums/supplypacks/misc.dm index 4fa22ddc50..5be62b2a58 100644 --- a/code/datums/supplypacks/misc.dm +++ b/code/datums/supplypacks/misc.dm @@ -37,8 +37,7 @@ /obj/item/clothing/shoes/black, /obj/item/clothing/suit/nun, /obj/item/clothing/head/nun_hood, - /obj/item/clothing/suit/chaplain_hoodie, - /obj/item/clothing/head/chaplain_hood, + /obj/item/clothing/suit/storage/hooded/chaplain_hoodie, /obj/item/clothing/suit/holidaypriest, /obj/item/clothing/under/wedding/bride_white, /obj/item/weapon/storage/backpack/cultpack, diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm index f4ff3d9505..9a4ab9600b 100644 --- a/code/datums/underwear/undershirts.dm +++ b/code/datums/underwear/undershirts.dm @@ -141,7 +141,7 @@ /datum/category_item/underwear/undershirt/longjon name = "Long John Shirt" - icon_state = "longjont" + icon_state = "ljont" has_color = TRUE /datum/category_item/underwear/undershirt/longstripe_black diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 627bd27e7b..5ecc707227 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -573,7 +573,7 @@ name = "subspace wavelength analyzer" icon_state = "wavelength_analyzer" desc = "A sophisticated analyzer capable of analyzing cryptic subspace wavelengths." - origin_tech = list(TECH_DATA = 3, TECH_MAGNETS = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) + origin_tech = list(TECH_DATA = 3, TECH_MAGNET = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2) matter = list(DEFAULT_WALL_MATERIAL = 30,"glass" = 10) /obj/item/weapon/stock_parts/subspace/crystal diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index 348bf6244d..47b82b82ac 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -47,6 +47,7 @@ var/mob_path = /mob/living/carbon/human // Mobtype this antag will use if none is provided. var/feedback_tag = "traitor_objective" // End of round var/bantype = "Syndicate" // Ban to check when spawning this antag. + var/minimum_player_age = 7 // Players need to be at least minimum_player_age days old before they are eligable for auto-spawning var/suspicion_chance = 50 // Prob of being on the initial Command report var/flags = 0 // Various runtime options. @@ -105,6 +106,8 @@ if(ghosts_only && !istype(player.current, /mob/observer/dead)) candidates -= player log_debug("[key_name(player)] is not eligible to become a [role_text]: Only ghosts may join as this role! They have been removed from the draft.") + else if(config.use_age_restriction_for_antags && player.current.client.player_age < minimum_player_age) + log_debug("[key_name(player)] is not eligible to become a [role_text]: Is only [player.current.client.player_age] day\s old, has to be [minimum_player_age] day\s!") else if(istype(player.current, /mob/living/voice)) candidates -= player log_debug("[key_name(player)] is not eligible to become a [role_text]: They are only a communicator voice. They have been removed from the draft.") diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index 7bfa22ad43..ae77e8f216 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -204,23 +204,26 @@ var/datum/antagonist/raider/raiders if(!..()) return 0 - var/new_shoes = pick(raider_shoes) - var/new_uniform = pick(raider_uniforms) - var/new_glasses = pick(raider_glasses) - var/new_helmet = pick(raider_helmets) - var/new_suit = pick(raider_suits) + if(player.species && player.species.get_bodytype() == "Vox") + equip_vox(player) + else + var/new_shoes = pick(raider_shoes) + var/new_uniform = pick(raider_uniforms) + var/new_glasses = pick(raider_glasses) + var/new_helmet = pick(raider_helmets) + var/new_suit = pick(raider_suits) - player.equip_to_slot_or_del(new new_shoes(player),slot_shoes) - if(!player.shoes) - //If equipping shoes failed, fall back to equipping sandals - var/fallback_type = pick(/obj/item/clothing/shoes/sandal, /obj/item/clothing/shoes/jackboots/toeless) - player.equip_to_slot_or_del(new fallback_type(player), slot_shoes) + player.equip_to_slot_or_del(new new_shoes(player),slot_shoes) + if(!player.shoes) + //If equipping shoes failed, fall back to equipping sandals + var/fallback_type = pick(/obj/item/clothing/shoes/sandal, /obj/item/clothing/shoes/jackboots/toeless) + player.equip_to_slot_or_del(new fallback_type(player), slot_shoes) - player.equip_to_slot_or_del(new new_uniform(player),slot_w_uniform) - player.equip_to_slot_or_del(new new_glasses(player),slot_glasses) - player.equip_to_slot_or_del(new new_helmet(player),slot_head) - player.equip_to_slot_or_del(new new_suit(player),slot_wear_suit) - equip_weapons(player) + player.equip_to_slot_or_del(new new_uniform(player),slot_w_uniform) + player.equip_to_slot_or_del(new new_glasses(player),slot_glasses) + player.equip_to_slot_or_del(new new_helmet(player),slot_head) + player.equip_to_slot_or_del(new new_suit(player),slot_wear_suit) + equip_weapons(player) var/obj/item/weapon/card/id/id = create_id("Visitor", player, equip = 0) id.name = "[player.real_name]'s Passport" @@ -296,3 +299,20 @@ var/datum/antagonist/raider/raiders var/grenade_type = pick(grenades) new grenade_type(ammobox) player.put_in_any_hand_if_possible(ammobox) + +/datum/antagonist/raider/proc/equip_vox(var/mob/living/carbon/human/player) + + var/uniform_type = pick(list(/obj/item/clothing/under/vox/vox_robes,/obj/item/clothing/under/vox/vox_casual)) + + player.equip_to_slot_or_del(new uniform_type(player), slot_w_uniform) + player.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(player), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES. + player.equip_to_slot_or_del(new /obj/item/clothing/gloves/vox(player), slot_gloves) // AS ABOVE. + player.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat/vox(player), slot_wear_mask) + player.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(player), slot_back) + player.equip_to_slot_or_del(new /obj/item/device/flashlight(player), slot_r_store) + + player.internal = locate(/obj/item/weapon/tank) in player.contents + if(istype(player.internal,/obj/item/weapon/tank) && player.internals) + player.internals.icon_state = "internal1" + + return 1 diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm index ac98f15c40..357639fde6 100644 --- a/code/game/gamemodes/changeling/powers/armor.dm +++ b/code/game/gamemodes/changeling/powers/armor.dm @@ -37,7 +37,7 @@ desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." flags = STOPPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, //it still ends up in your blood. (also balance but muh fluff) - allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/tank/oxygen) + allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/tank/oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) //No armor at all. canremove = 0 diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index f463c9bd0f..5868bf4b59 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -106,7 +106,7 @@ icon_state = "cult_armour" desc = "A bulky suit of armour, bristling with spikes. It looks space-worthy." w_class = ITEMSIZE_NORMAL - allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) + allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/suit_cooling_unit) slowdown = 1 armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) siemens_coefficient = 0 diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 7205d0e850..393d3aee74 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -5,11 +5,11 @@ /var/list/meteors_normal = list(/obj/effect/meteor/dust=3, /obj/effect/meteor/medium=8, /obj/effect/meteor/big=3, \ /obj/effect/meteor/flaming=1, /obj/effect/meteor/irradiated=3) //for normal meteor event -/var/list/meteors_threatening = list(/obj/effect/meteor/medium=4, /obj/effect/meteor/big=8, \ - /obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3) //for threatening meteor event +/var/list/meteors_threatening = list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=10, \ + /obj/effect/meteor/flaming=3, /obj/effect/meteor/irradiated=3, /obj/effect/meteor/emp=3) //for threatening meteor event /var/list/meteors_catastrophic = list(/obj/effect/meteor/medium=5, /obj/effect/meteor/big=75, \ - /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event + /obj/effect/meteor/flaming=10, /obj/effect/meteor/irradiated=10, /obj/effect/meteor/emp=10, /obj/effect/meteor/tunguska = 1) //for catastrophic meteor event /var/list/meteors_dust = list(/obj/effect/meteor/dust) //for space dust event @@ -38,7 +38,6 @@ var/Me = pickweight(meteortypes) var/obj/effect/meteor/M = new Me(pickedstart) M.dest = pickedgoal - M.z_original = startLevel spawn(0) walk_towards(M, M.dest, 1) return @@ -97,11 +96,16 @@ var/dest pass_flags = PASSTABLE var/heavy = 0 - var/z_original = 1 + var/z_original var/meteordrop = /obj/item/weapon/ore/iron var/dropamt = 2 +/obj/effect/meteor/New() + ..() + z_original = z + + /obj/effect/meteor/Move() if(z != z_original || loc == dest) qdel(src) @@ -151,7 +155,7 @@ hits-- if(hits <= 0) make_debris() - meteor_effect(heavy) + meteor_effect() qdel(src) /obj/effect/meteor/ex_act() @@ -168,8 +172,8 @@ var/obj/item/O = new meteordrop(get_turf(src)) O.throw_at(dest, 5, 10) -/obj/effect/meteor/proc/meteor_effect(var/effect=1) - if(effect) +/obj/effect/meteor/proc/meteor_effect() + if(heavy) for(var/mob/M in player_list) var/turf/T = get_turf(M) if(!T || T.z != src.z) @@ -197,7 +201,7 @@ dropamt = 3 /obj/effect/meteor/medium/meteor_effect() - ..(heavy) + ..() explosion(src.loc, 0, 1, 2, 3, 0) //Large-sized @@ -209,7 +213,7 @@ dropamt = 4 /obj/effect/meteor/big/meteor_effect() - ..(heavy) + ..() explosion(src.loc, 1, 2, 3, 4, 0) //Flaming meteor @@ -221,7 +225,7 @@ meteordrop = /obj/item/weapon/ore/phoron /obj/effect/meteor/flaming/meteor_effect() - ..(heavy) + ..() explosion(src.loc, 1, 2, 3, 4, 0, 0, 5) //Radiation meteor @@ -233,12 +237,25 @@ /obj/effect/meteor/irradiated/meteor_effect() - ..(heavy) + ..() explosion(src.loc, 0, 0, 4, 3, 0) new /obj/effect/decal/cleanable/greenglow(get_turf(src)) for(var/mob/living/L in view(5, src)) L.apply_effect(40, IRRADIATE) +/obj/effect/meteor/emp + name = "conducting meteor" + icon_state = "glowing_blue" + desc = "Hide your floppies!" + meteordrop = /obj/item/weapon/ore/osmium + dropamt = 3 + +/obj/effect/meteor/emp/meteor_effect() + ..() + // Best case scenario: Comparable to a low-yield EMP grenade. + // Worst case scenario: Comparable to a standard yield EMP grenade. + empulse(src, rand(2, 4), rand(4, 10)) + //Station buster Tunguska /obj/effect/meteor/tunguska name = "tunguska meteor" @@ -250,7 +267,7 @@ meteordrop = /obj/item/weapon/ore/phoron /obj/effect/meteor/tunguska/meteor_effect() - ..(heavy) + ..() explosion(src.loc, 5, 10, 15, 20, 0) /obj/effect/meteor/tunguska/Bump() diff --git a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm index 9c18e774ed..a4761c847a 100644 --- a/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm +++ b/code/game/gamemodes/technomancer/devices/gloves_of_regen.dm @@ -47,7 +47,7 @@ ..() /obj/item/clothing/gloves/regen/process() - if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition >= 10) + if(!wearer || wearer.isSynthetic() || wearer.stat == DEAD || wearer.nutrition <= 10) return // Robots and dead people don't have a metabolism. if(wearer.getBruteLoss()) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 25acb8caa7..519a1bd5a2 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -14,8 +14,12 @@ return check_access(id) return 0 -/obj/item/proc/GetAccess() - return list() +///obj/item/proc/GetAccess() +// return list() + +/atom/movable/proc/GetAccess() + var/obj/item/weapon/card/id/id = GetIdCard() + return id ? id.GetAccess() : list() /obj/proc/GetID() return null @@ -197,7 +201,7 @@ "Emergency Response Team", "Emergency Response Team Leader") -/mob/proc/GetIdCard() +/atom/movable/proc/GetIdCard() return null /mob/living/bot/GetIdCard() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index e234ac4d23..cbdcfb9f2f 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -13,7 +13,7 @@ desc = "Emergency air-tight shutter, capable of sealing off breached areas." icon = 'icons/obj/doors/DoorHazard.dmi' icon_state = "door_open" - req_one_access = list(access_atmospherics, access_engine_equip) + req_one_access = list(access_eva) //access_atmospherics, access_engine_equip) opacity = 0 density = 0 layer = DOOR_OPEN_LAYER - 0.01 diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 13168e19f4..4349752370 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -8,7 +8,7 @@ obj/machinery/recharger idle_power_usage = 4 active_power_usage = 40000 //40 kW var/obj/item/charging = null - var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight) + var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly) var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered @@ -60,6 +60,11 @@ obj/machinery/recharger if(!L.stored_computer.battery) user << "There's no battery in it!" return + if(istype(G, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/assembly = G + if(!assembly.battery) + to_chat(user, "The assembly doesn't have a power cell.") + return user.drop_item() G.loc = src charging = G @@ -161,6 +166,21 @@ obj/machinery/recharger update_use_power(1) return + if(istype(charging, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/assembly = charging + if(assembly.battery) + if(!assembly.battery.fully_charged()) + icon_state = icon_state_charging + assembly.battery.give(active_power_usage*CELLRATE) + update_use_power(2) + else + icon_state = icon_state_charged + update_use_power(1) + else + icon_state = icon_state_idle + update_use_power(1) + return + /obj/machinery/recharger/emp_act(severity) if(stat & (NOPOWER|BROKEN) || !anchored) ..(severity) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 64e8c5e539..0559b626e1 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -206,37 +206,16 @@ R.activate_module(src) R.hud_used.update_robot_modules_display() -// Due to storage type consolidation this should get used more now. -// I have cleaned it up a little, but it could probably use more. -Sayu /obj/item/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/weapon/storage)) + if(istype(W, /obj/item/weapon/storage)) var/obj/item/weapon/storage/S = W if(S.use_to_pickup) - if(S.collection_mode) //Mode is set to collect all items on a tile and we clicked on a valid one. + if(S.collection_mode) //Mode is set to collect all items if(isturf(src.loc)) - var/list/rejections = list() - var/success = 0 - var/failure = 0 - - for(var/obj/item/I in src.loc) - if(I.type in rejections) // To limit bag spamming: any given type only complains once - continue - if(!S.can_be_inserted(I)) // Note can_be_inserted still makes noise when the answer is no - rejections += I.type // therefore full bags are still a little spammy - failure = 1 - continue - success = 1 - S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. - if(success && !failure) - user << "You put everything in [S]." - else if(success) - user << "You put some things in [S]." - else - user << "You fail to pick anything up with \the [S]." + S.gather_all(src.loc, user) else if(S.can_be_inserted(src)) S.handle_item_insertion(src) - return /obj/item/proc/talk_into(mob/M as mob, text) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 6c86b7ebf4..a2310cda92 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -132,7 +132,7 @@ var/obj/item/weapon/tank/tank = null /obj/structure/closet/body_bag/cryobag/New() - tank = new /obj/item/weapon/tank/emergency_oxygen(null) //It's in nullspace to prevent ejection when the bag is opened. + tank = new /obj/item/weapon/tank/emergency/oxygen(null) //It's in nullspace to prevent ejection when the bag is opened. ..() /obj/structure/closet/body_bag/cryobag/Destroy() diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index eec5638523..55cdc170e2 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -508,7 +508,7 @@ the implant may become unstable and either pre-maturely inject the subject or si qdel(src) /obj/item/weapon/implant/compressed/implanted(mob/source as mob) - src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") + src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") if (source.mind) source.mind.store_memory("Compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) source << "The implanted compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm index 3913ebf1b2..92021a46a2 100644 --- a/code/game/objects/items/weapons/implants/implantfreedom.dm +++ b/code/game/objects/items/weapons/implants/implantfreedom.dm @@ -9,7 +9,7 @@ /obj/item/weapon/implant/freedom/New() - src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") + src.activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") src.uses = rand(1, 5) ..() return diff --git a/code/game/objects/items/weapons/implants/implantuplink.dm b/code/game/objects/items/weapons/implants/implantuplink.dm index 785fc64f75..644ebf1bb7 100644 --- a/code/game/objects/items/weapons/implants/implantuplink.dm +++ b/code/game/objects/items/weapons/implants/implantuplink.dm @@ -4,7 +4,7 @@ var/activation_emote = "chuckle" /obj/item/weapon/implant/uplink/New() - activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") + activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") hidden_uplink = new(src) //hidden_uplink.uses = 5 //Code currently uses a mind var for telecrystals, balancing is currently an issue. Will investigate. @@ -12,7 +12,7 @@ return /obj/item/weapon/implant/uplink/implanted(mob/source) - activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") + activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") source.mind.store_memory("Uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) source << "The implanted uplink implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." listening_objects |= src diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 5c3d090d71..4f9a3bd6ef 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -55,12 +55,17 @@ /obj/item/weapon/storage/box/survival/New() ..() new /obj/item/clothing/mask/breath(src) - new /obj/item/weapon/tank/emergency_oxygen(src) + new /obj/item/weapon/tank/emergency/oxygen(src) + +/obj/item/weapon/storage/box/vox/New() + ..() + new /obj/item/clothing/mask/breath(src) + new /obj/item/weapon/tank/emergency/phoron(src) /obj/item/weapon/storage/box/engineer/New() ..() new /obj/item/clothing/mask/breath(src) - new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/weapon/tank/emergency/oxygen/engi(src) /obj/item/weapon/storage/box/gloves name = "box of latex gloves" @@ -574,9 +579,9 @@ icon_state = "light" desc = "This box is shaped on the inside so that only light tubes and bulbs fit." item_state_slots = list(slot_r_hand_str = "syringe_kit", slot_l_hand_str = "syringe_kit") - storage_slots = 21 + storage_slots = 24 can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb) - max_storage_space = ITEMSIZE_COST_SMALL * 21 //holds 21 items of w_class 2 + max_storage_space = ITEMSIZE_COST_SMALL * 24 //holds 24 items of w_class 2 use_to_pickup = 1 // for picking up broken bulbs, not that most people will try /obj/item/weapon/storage/box/lights/bulbs/New() diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index f6703bb7cb..1c77e1f6cb 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -138,15 +138,15 @@ /obj/item/weapon/storage/firstaid/surgery/New() ..() if (empty) return - new /obj/item/weapon/bonesetter(src) - new /obj/item/weapon/cautery(src) - new /obj/item/weapon/circular_saw(src) - new /obj/item/weapon/hemostat(src) - new /obj/item/weapon/retractor(src) - new /obj/item/weapon/scalpel(src) - new /obj/item/weapon/surgicaldrill(src) - new /obj/item/weapon/bonegel(src) - new /obj/item/weapon/FixOVein(src) + new /obj/item/weapon/surgical/bonesetter(src) + new /obj/item/weapon/surgical/cautery(src) + new /obj/item/weapon/surgical/circular_saw(src) + new /obj/item/weapon/surgical/hemostat(src) + new /obj/item/weapon/surgical/retractor(src) + new /obj/item/weapon/surgical/scalpel(src) + new /obj/item/weapon/surgical/surgicaldrill(src) + new /obj/item/weapon/surgical/bonegel(src) + new /obj/item/weapon/surgical/FixOVein(src) new /obj/item/stack/medical/advanced/bruise_pack(src) return diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index e691ed2795..8c1c47713a 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -478,6 +478,27 @@ src.add_fingerprint(user) return +/obj/item/weapon/storage/proc/gather_all(turf/T as turf, mob/user as mob) + var/list/rejections = list() + var/success = 0 + var/failure = 0 + + for(var/obj/item/I in T) + if(I.type in rejections) // To limit bag spamming: any given type only complains once + continue + if(!can_be_inserted(I, user)) // Note can_be_inserted still makes noise when the answer is no + rejections += I.type // therefore full bags are still a little spammy + failure = 1 + continue + success = 1 + handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed. + if(success && !failure) + to_chat(user, "You put everything in [src].") + else if(success) + to_chat(user, "You put some things in [src].") + else + to_chat(user, "You fail to pick anything up with \the [src].") + /obj/item/weapon/storage/verb/toggle_gathering_mode() set name = "Switch Gathering Method" set category = "Object" diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index f45e766610..573325e079 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -22,7 +22,7 @@ new /obj/item/clothing/suit/space/syndicate(src) new /obj/item/clothing/head/helmet/space/syndicate(src) new /obj/item/clothing/mask/gas/syndicate(src) - new /obj/item/weapon/tank/emergency_oxygen/double(src) + new /obj/item/weapon/tank/emergency/oxygen/double(src) return if("guns") @@ -59,7 +59,7 @@ new /obj/item/clothing/suit/space/syndicate(src) new /obj/item/clothing/head/helmet/space/syndicate(src) new /obj/item/clothing/mask/gas/syndicate(src) - new /obj/item/weapon/tank/emergency_oxygen/double(src) + new /obj/item/weapon/tank/emergency/oxygen/double(src) new /obj/item/weapon/card/emag(src) return @@ -121,7 +121,7 @@ new /obj/item/clothing/suit/space/syndicate(src) new /obj/item/clothing/head/helmet/space/syndicate(src) new /obj/item/clothing/mask/gas/syndicate(src) - new /obj/item/weapon/tank/emergency_oxygen/double(src) + new /obj/item/weapon/tank/emergency/oxygen/double(src) return /obj/item/weapon/storage/box/syndie_kit/chameleon diff --git a/code/game/objects/items/weapons/surgery_tools.dm b/code/game/objects/items/weapons/surgery_tools.dm index 0c942bf486..2c5673790a 100644 --- a/code/game/objects/items/weapons/surgery_tools.dm +++ b/code/game/objects/items/weapons/surgery_tools.dm @@ -11,55 +11,59 @@ /* * Retractor */ -/obj/item/weapon/retractor + +/obj/item/weapon/surgical + name = "Surgical tool" + desc = "This shouldn't be here, ahelp it." + icon = 'icons/obj/surgery.dmi' + w_class = ITEMSIZE_SMALL + flags = CONDUCT + var/helpforce = 0 //For help intent things + +/obj/item/weapon/surgical/attack(mob/M, mob/user) + if(user.a_intent == I_HELP) //A tad messy, but this should stop people from smacking their patients in surgery + return 0 + ..() + +/obj/item/weapon/surgical/retractor name = "retractor" desc = "Retracts stuff." icon = 'icons/obj/surgery.dmi' icon_state = "retractor" matter = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 5000) - flags = CONDUCT - w_class = ITEMSIZE_SMALL origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) /* * Hemostat */ -/obj/item/weapon/hemostat +/obj/item/weapon/surgical/hemostat name = "hemostat" desc = "You think you have seen this before." - icon = 'icons/obj/surgery.dmi' icon_state = "hemostat" matter = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) - flags = CONDUCT - w_class = ITEMSIZE_SMALL origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) attack_verb = list("attacked", "pinched") /* * Cautery */ -/obj/item/weapon/cautery +/obj/item/weapon/surgical/cautery name = "cautery" desc = "This stops bleeding." - icon = 'icons/obj/surgery.dmi' icon_state = "cautery" matter = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) - flags = CONDUCT - w_class = ITEMSIZE_SMALL origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) attack_verb = list("burnt") /* * Surgical Drill */ -/obj/item/weapon/surgicaldrill +/obj/item/weapon/surgical/surgicaldrill name = "surgical drill" desc = "You can drill using this item. You dig?" - icon = 'icons/obj/surgery.dmi' icon_state = "drill" hitsound = 'sound/weapons/circsawhit.ogg' matter = list(DEFAULT_WALL_MATERIAL = 15000, "glass" = 10000) - flags = CONDUCT force = 15.0 w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 1) @@ -73,12 +77,10 @@ /* * Scalpel */ -/obj/item/weapon/scalpel +/obj/item/weapon/surgical/scalpel name = "scalpel" desc = "Cut, cut, and once more cut." - icon = 'icons/obj/surgery.dmi' icon_state = "scalpel" - flags = CONDUCT force = 10.0 sharp = 1 edge = 1 @@ -100,27 +102,27 @@ /* * Researchable Scalpels */ -/obj/item/weapon/scalpel/laser1 +/obj/item/weapon/surgical/scalpel/laser1 name = "laser scalpel" desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks basic and could be improved." icon_state = "scalpel_laser1_on" damtype = "fire" -/obj/item/weapon/scalpel/laser2 +/obj/item/weapon/surgical/scalpel/laser2 name = "laser scalpel" desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks somewhat advanced." icon_state = "scalpel_laser2_on" damtype = "fire" force = 12.0 -/obj/item/weapon/scalpel/laser3 +/obj/item/weapon/surgical/scalpel/laser3 name = "laser scalpel" desc = "A scalpel augmented with a directed laser, for more precise cutting without blood entering the field. This one looks to be the pinnacle of precision energy cutlery!" icon_state = "scalpel_laser3_on" damtype = "fire" force = 15.0 -/obj/item/weapon/scalpel/manager +/obj/item/weapon/surgical/scalpel/manager name = "incision management system" desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision allowing for the immediate commencement of therapeutic steps." icon_state = "scalpel_manager_on" @@ -129,13 +131,11 @@ /* * Circular Saw */ -/obj/item/weapon/circular_saw +/obj/item/weapon/surgical/circular_saw name = "circular saw" desc = "For heavy duty cutting." - icon = 'icons/obj/surgery.dmi' icon_state = "saw3" hitsound = 'sound/weapons/circsawhit.ogg' - flags = CONDUCT force = 15.0 w_class = ITEMSIZE_NORMAL throwforce = 9.0 @@ -148,31 +148,25 @@ edge = 1 //misc, formerly from code/defines/weapons.dm -/obj/item/weapon/bonegel +/obj/item/weapon/surgical/bonegel name = "bone gel" - icon = 'icons/obj/surgery.dmi' icon_state = "bone-gel" force = 0 - w_class = ITEMSIZE_SMALL throwforce = 1.0 -/obj/item/weapon/FixOVein +/obj/item/weapon/surgical/FixOVein name = "FixOVein" - icon = 'icons/obj/surgery.dmi' icon_state = "fixovein" force = 0 throwforce = 1.0 origin_tech = list(TECH_MATERIAL = 1, TECH_BIO = 3) - w_class = ITEMSIZE_SMALL var/usage_amount = 10 -/obj/item/weapon/bonesetter +/obj/item/weapon/surgical/bonesetter name = "bone setter" - icon = 'icons/obj/surgery.dmi' icon_state = "bone setter" force = 8.0 throwforce = 9.0 throw_speed = 3 throw_range = 5 - w_class = ITEMSIZE_SMALL attack_verb = list("attacked", "hit", "bludgeoned") diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 83372ffa58..6c2b6aa885 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -16,15 +16,15 @@ icon_state = "oxygen" distribute_pressure = ONE_ATMOSPHERE*O2STANDARD - New() +/obj/item/weapon/tank/oxygen/New() ..() air_contents.adjust_gas("oxygen", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) return - examine(mob/user) - if(..(user, 0) && air_contents.gas["oxygen"] < 10) - user << text("The meter on \the [src] indicates you are almost out of oxygen!") - //playsound(usr, 'sound/effects/alert.ogg', 50, 1) +/obj/item/weapon/tank/oxygen/examine(mob/user) + if(..(user, 0) && air_contents.gas["oxygen"] < 10) + user << text("The meter on \the [src] indicates you are almost out of oxygen!") + //playsound(usr, 'sound/effects/alert.ogg', 50, 1) /obj/item/weapon/tank/oxygen/yellow desc = "A tank of oxygen, this one is yellow." @@ -59,10 +59,10 @@ desc = "Mixed anyone?" icon_state = "oxygen" - examine(mob/user) - if(..(user, 0) && air_contents.gas["oxygen"] < 1 && loc==user) - user << "The meter on the [src.name] indicates you are almost out of air!" - user << sound('sound/effects/alert.ogg') +/obj/item/weapon/tank/air/examine(mob/user) + if(..(user, 0) && air_contents.gas["oxygen"] < 1 && loc==user) + user << "The meter on the [src.name] indicates you are almost out of air!" + user << sound('sound/effects/alert.ogg') /obj/item/weapon/tank/air/New() ..() @@ -100,44 +100,97 @@ src.loc = F return +/obj/item/weapon/tank/vox //Can't be a child of phoron or the gas amount gets screwey. + name = "phoron tank" + desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable." + icon_state = "oxygen_fr" + gauge_icon = null + flags = CONDUCT + distribute_pressure = ONE_ATMOSPHERE*O2STANDARD + slot_flags = SLOT_BACK //these ones have straps! + +/obj/item/weapon/tank/vox/New() + ..() + + air_contents.adjust_gas("phoron", (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + return + /* * Emergency Oxygen */ -/obj/item/weapon/tank/emergency_oxygen - name = "emergency oxygen tank" - desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it." + +/obj/item/weapon/tank/emergency + name = "emergency tank" icon_state = "emergency" gauge_icon = "indicator_emergency" gauge_cap = 4 flags = CONDUCT slot_flags = SLOT_BELT w_class = ITEMSIZE_SMALL - force = 4.0 + force = 4 distribute_pressure = ONE_ATMOSPHERE*O2STANDARD volume = 2 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) - New() +/obj/item/weapon/tank/emergency/oxygen + name = "emergency oxygen tank" + desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it." + icon_state = "emergency" + gauge_icon = "indicator_emergency" + +/obj/item/weapon/tank/emergency/oxygen/New() ..() src.air_contents.adjust_gas("oxygen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) return - examine(mob/user) - if(..(user, 0) && air_contents.gas["oxygen"] < 0.2 && loc==user) - user << text("The meter on the [src.name] indicates you are almost out of air!") - user << sound('sound/effects/alert.ogg') +/obj/item/weapon/tank/emergency/oxygen/examine(mob/user) + if(..(user, 0) && air_contents.gas["oxygen"] < 0.2 && loc==user) + user << text("The meter on the [src.name] indicates you are almost out of air!") + user << sound('sound/effects/alert.ogg') -/obj/item/weapon/tank/emergency_oxygen/engi +/obj/item/weapon/tank/emergency/oxygen/engi name = "extended-capacity emergency oxygen tank" icon_state = "emergency_engi" volume = 6 -/obj/item/weapon/tank/emergency_oxygen/double +/obj/item/weapon/tank/emergency/oxygen/double name = "double emergency oxygen tank" icon_state = "emergency_double" gauge_icon = "indicator_emergency_double" volume = 10 +/obj/item/weapon/tank/emergency/nitrogen + name = "emergency nitrogen tank" + desc = "An emergency air tank hastily painted red." + icon_state = "emergency_nitro" + gauge_icon = "indicator_emergency" + +/obj/item/weapon/tank/emergency/nitrogen/New() + ..() + src.air_contents.adjust_gas("nitrogen", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + +/obj/item/weapon/tank/emergency/nitrogen/double + name = "double emergency nitrogen tank" + icon_state = "emergency_double_nitrogen" + gauge_icon = "indicator_emergency_double" + volume = 10 + +/obj/item/weapon/tank/emergency/phoron + name = "emergency phoron tank" + desc = "An emergency air tank hastily painted red." + icon_state = "emergency_nitro" + gauge_icon = "indicator_emergency" + +/obj/item/weapon/tank/emergency/phoron/New() + ..() + src.air_contents.adjust_gas("phoron", (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + +/obj/item/weapon/tank/emergency/phoron/double + name = "double emergency nitrogen tank" + icon_state = "emergency_double_nitrogen" + gauge_icon = "indicator_emergency_double" + volume = 10 + /* * Nitrogen */ diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index bea64ddce9..cd12ad5a0c 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -462,9 +462,9 @@ prob(4);/obj/item/weapon/tank/oxygen/yellow, prob(4);/obj/item/weapon/tank/oxygen/red, prob(3);/obj/item/weapon/tank/air, - prob(4);/obj/item/weapon/tank/emergency_oxygen, - prob(3);/obj/item/weapon/tank/emergency_oxygen/engi, - prob(2);/obj/item/weapon/tank/emergency_oxygen/double, + prob(4);/obj/item/weapon/tank/emergency/oxygen, + prob(3);/obj/item/weapon/tank/emergency/oxygen/engi, + prob(2);/obj/item/weapon/tank/emergency/oxygen/double, prob(1);/obj/item/device/suit_cooling_unit) /obj/random/cigarettes diff --git a/code/game/objects/structures/crates_lockers/closets/l3closet.dm b/code/game/objects/structures/crates_lockers/closets/l3closet.dm index 1b4b27b196..c00875e522 100644 --- a/code/game/objects/structures/crates_lockers/closets/l3closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/l3closet.dm @@ -53,8 +53,8 @@ new /obj/item/clothing/head/bio_hood/janitor(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/mask/gas(src) - new /obj/item/weapon/tank/emergency_oxygen/engi(src) - new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/weapon/tank/emergency/oxygen/engi(src) + new /obj/item/weapon/tank/emergency/oxygen/engi(src) /obj/structure/closet/l3closet/scientist diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index c7095514cc..6417f93ab7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -57,7 +57,7 @@ new /obj/item/clothing/gloves/black(src) // new /obj/item/weapon/cartridge/quartermaster(src) new /obj/item/clothing/suit/fire/firefighter(src) - new /obj/item/weapon/tank/emergency_oxygen(src) + new /obj/item/weapon/tank/emergency/oxygen(src) new /obj/item/clothing/mask/gas(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/clothing/head/soft(src) 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 3ead9d15aa..f79203c3ba 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -36,7 +36,7 @@ new /obj/item/device/flash(src) new /obj/item/taperoll/engineering(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src) - new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/weapon/tank/emergency/oxygen/engi(src) return @@ -127,7 +127,7 @@ new /obj/item/weapon/cartridge/engineering(src) new /obj/item/taperoll/engineering(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering(src) - new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/weapon/tank/emergency/oxygen/engi(src) return @@ -162,5 +162,5 @@ new /obj/item/weapon/cartridge/atmos(src) new /obj/item/taperoll/atmos(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos(src) - new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/weapon/tank/emergency/oxygen/engi(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index a564ddb074..9f6109b8ef 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -143,7 +143,7 @@ new /obj/item/device/radio/headset/headset_med/alt(src) new /obj/item/weapon/cartridge/medical(src) new /obj/item/device/flashlight(src) - new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/weapon/tank/emergency/oxygen/engi(src) new /obj/item/clothing/glasses/hud/health(src) new /obj/item/device/healthanalyzer(src) new /obj/item/device/radio/off(src) 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 a7d50f24e6..4bed035b82 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -127,6 +127,7 @@ new /obj/item/clothing/head/beret/sec/corporate/hos(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src) new /obj/item/device/flashlight/maglight(src) + new /obj/item/clothing/mask/gas/half(src) return @@ -173,6 +174,7 @@ new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src) new /obj/item/device/flashlight/maglight(src) new /obj/item/device/megaphone(src) + new /obj/item/clothing/mask/gas/half(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 714be281b8..5c8aa2b2e0 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -24,27 +24,27 @@ switch (pickweight(list("small" = 55, "aid" = 25, "tank" = 10, "both" = 10))) if ("small") - new /obj/item/weapon/tank/emergency_oxygen(src) - new /obj/item/weapon/tank/emergency_oxygen(src) + new /obj/item/weapon/tank/emergency/oxygen(src) + new /obj/item/weapon/tank/emergency/oxygen(src) new /obj/item/clothing/mask/breath(src) new /obj/item/clothing/mask/breath(src) new /obj/item/clothing/suit/space/emergency(src) new /obj/item/clothing/head/helmet/space/emergency(src) if ("aid") - new /obj/item/weapon/tank/emergency_oxygen(src) + new /obj/item/weapon/tank/emergency/oxygen(src) new /obj/item/weapon/storage/toolbox/emergency(src) new /obj/item/clothing/mask/breath(src) new /obj/item/weapon/storage/firstaid/o2(src) new /obj/item/clothing/suit/space/emergency(src) new /obj/item/clothing/head/helmet/space/emergency(src) if ("tank") - new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/weapon/tank/emergency/oxygen/engi(src) new /obj/item/clothing/mask/breath(src) - new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/weapon/tank/emergency/oxygen/engi(src) new /obj/item/clothing/mask/breath(src) if ("both") new /obj/item/weapon/storage/toolbox/emergency(src) - new /obj/item/weapon/tank/emergency_oxygen/engi(src) + new /obj/item/weapon/tank/emergency/oxygen/engi(src) new /obj/item/clothing/mask/breath(src) new /obj/item/weapon/storage/firstaid/o2(src) new /obj/item/clothing/suit/space/emergency(src) diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm index 1fadf10eec..39204e3491 100644 --- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm @@ -16,7 +16,7 @@ /obj/structure/closet/walllocker/emerglocker name = "emergency locker" desc = "A wall mounted locker with emergency supplies." - var/list/spawnitems = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/crowbar/red) + var/list/spawnitems = list(/obj/item/weapon/tank/emergency/oxygen,/obj/item/clothing/mask/breath,/obj/item/weapon/crowbar/red) var/amount = 2 // spawns each items X times. icon_state = "emerg" diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 3dcdd0e85c..f69242fcfa 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -147,8 +147,7 @@ new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/suit/nun(src) new /obj/item/clothing/head/nun_hood(src) - new /obj/item/clothing/suit/chaplain_hoodie(src) - new /obj/item/clothing/head/chaplain_hood(src) + new /obj/item/clothing/suit/storage/hooded/chaplain_hoodie(src) new /obj/item/clothing/suit/holidaypriest(src) new /obj/item/clothing/under/wedding/bride_white(src) new /obj/item/weapon/storage/backpack/cultpack (src) @@ -536,6 +535,7 @@ new /obj/item/clothing/under/pants/black(src) new /obj/item/clothing/under/pants/tan(src) new /obj/item/clothing/under/pants/track(src) + new /obj/item/clothing/suit/storage/toggle/track(src) new /obj/item/clothing/under/pants(src) new /obj/item/clothing/under/pants/khaki(src) new /obj/item/clothing/mask/bandana/blue(src) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 588517a7ed..0d8a94944d 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -78,6 +78,9 @@ else user << "[src] can't hold any more signs." + else if(istype(I, /obj/item/weapon/reagent_containers/glass)) + return // So we do not put them in the trash bag as we mean to fill the mop bucket + else if(mybag) mybag.attackby(I, user) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index a8747e07ec..cd0ab5ec9c 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -113,3 +113,31 @@ else user.visible_message("[user] hits [src] and bounces off!") return 1 + +// The following mirror is ~special~. +/obj/structure/mirror/raider + name = "cracked mirror" + desc = "Something seems strange about this old, dirty mirror. Your reflection doesn't look like you remember it." + icon_state = "mirror_broke" + shattered = 1 + +/obj/structure/mirror/raider/attack_hand(var/mob/living/carbon/human/user) + if(istype(get_area(src),/area/syndicate_mothership)) + if(istype(user) && user.mind && user.mind.special_role == "Raider" && user.species.name != "Vox" && is_alien_whitelisted(user, "Vox")) + var/choice = input("Do you wish to become a true Vox of the Shoal? This is not reversible.") as null|anything in list("No","Yes") + if(choice && choice == "Yes") + var/mob/living/carbon/human/vox/vox = new(get_turf(src),"Vox") + vox.gender = user.gender + raiders.equip(vox) + if(user.mind) + user.mind.transfer_to(vox) + spawn(1) + var/newname = sanitizeSafe(input(vox,"Enter a name, or leave blank for the default name.", "Name change","") as text, MAX_NAME_LEN) + if(!newname || newname == "") + var/datum/language/L = all_languages[vox.species.default_language] + newname = L.get_random_name() + vox.real_name = newname + vox.name = vox.real_name + raiders.update_access(vox) + qdel(user) + ..() \ No newline at end of file diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 4172457b1f..0b2da66927 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -147,8 +147,8 @@ slip_stun = 4 slip_dist = 2 - if(M.slip("the [floor_type] floor",slip_stun)) - for(var/i = 0;iMovement is admin-disabled." //This is to identify lag problems diff --git a/code/modules/admin/news.dm b/code/modules/admin/news.dm index 7881febe3a..179391987c 100644 --- a/code/modules/admin/news.dm +++ b/code/modules/admin/news.dm @@ -1,13 +1,13 @@ #define NEWSFILE "data/news.sav" //where the memos are saved /client/ - var/last_news_hash = null // Stores a hash of the last news window it saw, which gets compared to the current one to see if it is different. + //var/last_news_hash = null // Stores a hash of the last news window it saw, which gets compared to the current one to see if it is different. // Returns true if news was updated since last seen. /client/proc/check_for_new_server_news() var/savefile/F = get_server_news() if(F) - if(md5(F["body"]) != last_news_hash) + if(md5(F["body"]) != prefs.lastnews) return TRUE return FALSE @@ -21,11 +21,17 @@ var/savefile/F = new(NEWSFILE) if(F) var/title = F["title"] - var/body = F["body"] + var/body = html2paper_markup(F["body"]) var/new_title = sanitize(input(src,"Write a good title for the news update. Note: HTML is NOT supported.","Write News", title) as null|text, extra = 0) if(!new_title) return - var/new_body = sanitize(input(src,"Write the body of the news update here. Note: HTML is NOT supported.","Write News", body) as null|message, extra = 0) + var/new_body = sanitize(input(src,"Write the body of the news update here. Note: HTML is NOT supported, however paper markup is supported. \n\ + Hitting enter will automatically add a line break. \n\ + Valid markup includes: \[b\], \[i\], \[u\], \[large\], \[h1\], \[h2\], \[h3\]\ \[*\], \[hr\], \[small\], \[list\], \[table\], \[grid\], \ + \[row\], \[cell\], \[logo\], \[sglogo\].","Write News", body) as null|message, extra = 0) + + new_body = paper_markup2html(new_body) + if(findtext(new_body,"") + text = replacetext(text, "\[center\]", "
") + text = replacetext(text, "\[/center\]", "
") + text = replacetext(text, "\[br\]", "
") + text = replacetext(text, "\[b\]", "") + text = replacetext(text, "\[/b\]", "") + text = replacetext(text, "\[i\]", "") + text = replacetext(text, "\[/i\]", "") + text = replacetext(text, "\[u\]", "") + text = replacetext(text, "\[/u\]", "") + text = replacetext(text, "\[large\]", "") + text = replacetext(text, "\[/large\]", "") + text = replacetext(text, "\[h1\]", "

") + text = replacetext(text, "\[/h1\]", "

") + text = replacetext(text, "\[h2\]", "

") + text = replacetext(text, "\[/h2\]", "

") + text = replacetext(text, "\[h3\]", "

") + text = replacetext(text, "\[/h3\]", "

") + + text = replacetext(text, "\[*\]", "
  • ") + text = replacetext(text, "\[hr\]", "
    ") + text = replacetext(text, "\[small\]", "") + text = replacetext(text, "\[/small\]", "") + text = replacetext(text, "\[list\]", "
      ") + text = replacetext(text, "\[/list\]", "
    ") + text = replacetext(text, "\[table\]", "") + text = replacetext(text, "\[/table\]", "
    ") + text = replacetext(text, "\[grid\]", "") + text = replacetext(text, "\[/grid\]", "
    ") + text = replacetext(text, "\[row\]", "") + text = replacetext(text, "\[cell\]", "") + text = replacetext(text, "\[logo\]", "") // Not sure if these would get used but why not + text = replacetext(text, "\[sglogo\]", "") + return text + +// This is used when reading text that went through paper_markup2html(), to reverse it so that edits don't need to replace everything once more to avoid sanitization. +/proc/html2paper_markup(var/text) + text = replacetext(text, "
    ", "\[br\]") + text = replacetext(text, "
    ", "\[center\]") + text = replacetext(text, "
    ", "\[/center\]") + text = replacetext(text, "
    ", "\[br\]") + text = replacetext(text, "", "\[b\]") + text = replacetext(text, "", "\[/b\]") + text = replacetext(text, "", "\[i\]") + text = replacetext(text, "", "\[/i\]") + text = replacetext(text, "", "\[u\]") + text = replacetext(text, "", "\[/u\]") + text = replacetext(text, "", "\[large\]") + text = replacetext(text, "", "\[/large\]") + text = replacetext(text, "

    ", "\[h1\]") + text = replacetext(text, "

    ", "\[/h1\]") + text = replacetext(text, "

    ", "\[h2\]") + text = replacetext(text, "

    ", "\[/h2\]") + text = replacetext(text, "

    ", "\[h3\]") + text = replacetext(text, "

    ", "\[/h3\]") + + text = replacetext(text, "
  • ", "\[*\]") + text = replacetext(text, "
    ", "\[hr\]") + text = replacetext(text, "", "\[small\]") + text = replacetext(text, "", "\[/small\]") + text = replacetext(text, "
      ", "\[list\]") + text = replacetext(text, "
    ", "\[/list\]") + text = replacetext(text, "", "\[table\]") + text = replacetext(text, "
    ", "\[/table\]") + text = replacetext(text, "", "\[grid\]") + text = replacetext(text, "
    ", "\[/grid\]") + text = replacetext(text, "", "\[row\]") + text = replacetext(text, "", "\[cell\]") + text = replacetext(text, "", "\[logo\]") // Not sure if these would get used but why not + text = replacetext(text, "", "\[sglogo\]") + return text #undef NEWSFILE \ No newline at end of file diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 258945bd8f..fa2c51e7e5 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -542,10 +542,9 @@ M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes) M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves) M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask) - M.equip_to_slot_or_del(new /obj/item/clothing/head/chaplain_hood(M), slot_head) M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses) - M.equip_to_slot_or_del(new /obj/item/clothing/suit/chaplain_hoodie(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/hooded/chaplain_hoodie(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_r_store) var/obj/item/weapon/card/id/W = new(M) @@ -568,7 +567,7 @@ M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses) M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit) M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_l_store) - M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) + M.equip_to_slot_or_del(new /obj/item/weapon/surgical/scalpel(M), slot_r_store) var/obj/item/weapon/material/twohanded/fireaxe/fire_axe = new(M) M.equip_to_slot_or_del(fire_axe, slot_r_hand) diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 09fd236be0..4c061c71d2 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -112,7 +112,7 @@ corpsemask = /obj/item/clothing/mask/gas/syndicate corpsehelmet = /obj/item/clothing/head/helmet/space/void/merc corpseback = /obj/item/weapon/tank/jetpack/oxygen - corpsepocket1 = /obj/item/weapon/tank/emergency_oxygen + corpsepocket1 = /obj/item/weapon/tank/emergency/oxygen corpseid = 1 corpseidjob = "Operative" corpseidaccess = "Syndicate" diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 3c11e5ce31..079713c7ea 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -111,7 +111,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_BRAIN)) + for(var/name in list(O_HEART,O_EYES,O_LUNGS,O_BRAIN)) var/status = pref.organ_data[name] if(!status) continue @@ -178,6 +178,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O organ_name = "eyes" if(O_BRAIN) organ_name = "brain" + if(O_LUNGS) + organ_name = "lungs" if(status == "cyborg") ++ind @@ -211,6 +213,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O switch(organ_name) if("heart") . += "\tPacemaker-assisted [organ_name]" + if("lungs") + . += "\tAssisted [organ_name]" if("voicebox") //on adding voiceboxes for speaking skrell/similar replacements . += "\tSurgically altered [organ_name]" if("eyes") @@ -539,7 +543,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", "Brain") + var/organ_name = input(user, "Which internal function do you want to change?") as null|anything in list("Heart", "Eyes", "Lungs", "Brain") if(!organ_name) return var/organ = null @@ -548,6 +552,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O organ = O_HEART if("Eyes") organ = O_EYES + if("Lungs") + organ = O_LUNGS if("Brain") if(pref.organ_data[BP_HEAD] != "cyborg") user << "You may only select an assisted or synthetic brain if you have a full prosthetic body." diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index c7635cbb91..f213c15a8a 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -8,12 +8,14 @@ /datum/category_item/player_setup_item/player_global/settings/load_preferences(var/savefile/S) S["lastchangelog"] >> pref.lastchangelog + S["lastnews"] >> pref.lastnews S["default_slot"] >> pref.default_slot S["preferences"] >> pref.preferences_enabled S["preferences_disabled"] >> pref.preferences_disabled /datum/category_item/player_setup_item/player_global/settings/save_preferences(var/savefile/S) S["lastchangelog"] << pref.lastchangelog + S["lastnews"] << pref.lastnews S["default_slot"] << pref.default_slot S["preferences"] << pref.preferences_enabled S["preferences_disabled"] << pref.preferences_disabled @@ -47,6 +49,7 @@ pref.preferences_disabled -= key pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog)) + pref.lastnews = sanitize_text(pref.lastnews, initial(pref.lastnews)) pref.default_slot = sanitize_integer(pref.default_slot, 1, config.character_slots, initial(pref.default_slot)) /datum/category_item/player_setup_item/player_global/settings/content(var/mob/user) diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm index 5909b0eb2e..533cf88a51 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm @@ -42,15 +42,13 @@ display_name = "Security HUD, sunglasses (Security)" path = /obj/item/clothing/glasses/sunglasses/sechud -/datum/gear/eyes/secaviators - display_name = "Security HUD Aviators" +/datum/gear/eyes/security/aviator + display_name = "Security HUD Aviators (Security)" path = /obj/item/clothing/glasses/sunglasses/sechud/aviator - allowed_roles = list("Security Officer","Head of Security","Warden") -/datum/gear/eyes/secaviators/prescription - display_name = "Security HUD Aviators, prescription" +/datum/gear/eyes/security/aviator/prescription + display_name = "Security HUD Aviators, prescription (Security)" path = /obj/item/clothing/glasses/sunglasses/sechud/aviator/prescription - allowed_roles = list("Security Officer","Head of Security","Warden") /datum/gear/eyes/medical display_name = "Medical HUD (Medical)" @@ -61,10 +59,32 @@ display_name = "Medical HUD, prescription (Medical)" path = /obj/item/clothing/glasses/hud/health/prescription -/datum/gear/eyes/shades - display_name = "Sunglasses, fat (Security/Command)" - path = /obj/item/clothing/glasses/sunglasses/big - allowed_roles = list("Security Officer","Head of Security","Warden","Colony Director","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") +/datum/gear/eyes/medical/aviator + display_name = "Medical HUD Aviators (Medical)" + path = /obj/item/clothing/glasses/sunglasses/medhud/aviator + +/datum/gear/eyes/medical/aviator + display_name = "Medical HUD Aviators, prescription (Medical)" + path = /obj/item/clothing/glasses/sunglasses/medhud/aviator/prescription + +/datum/gear/eyes/meson + display_name = "Optical Meson Scanners (Engineering)" + path = /obj/item/clothing/glasses/meson + allowed_roles = list("Station Engineer","Chief Engineer","Atmospheric Technician") + +/datum/gear/eyes/meson/prescription + display_name = "Optical Meson Scanners, prescription (Engineering)" + path = /obj/item/clothing/glasses/meson/prescription + +/datum/gear/eyes/meson/aviator + display_name = "Optical Meson Aviators, (Engineering)" + path = /obj/item/clothing/glasses/meson/aviator + +/datum/gear/eyes/meson/aviator/prescription + display_name = "Optical Meson Aviators, prescription (Engineering)" + path = /obj/item/clothing/glasses/meson/aviator/prescription + +/datum/gear/eyes/meson/aviator/prescription /datum/gear/eyes/glasses/fakesun display_name = "Sunglasses, stylish" @@ -74,7 +94,16 @@ display_name = "Sunglasses, stylish aviators" path = /obj/item/clothing/glasses/fakesunglasses/aviator -/datum/gear/eyes/shades/prescriptionsun +/datum/gear/eyes/sun + display_name = "Sunglasses (Security/Command)" + path = /obj/item/clothing/glasses/sunglasses + allowed_roles = list("Security Officer","Head of Security","Warden","Colony Director","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") + +/datum/gear/eyes/sun/shades + display_name = "Sunglasses, fat (Security/Command)" + path = /obj/item/clothing/glasses/sunglasses/big + +/datum/gear/eyes/sun/prescriptionsun display_name = "sunglasses, presciption (Security/Command)" path = /obj/item/clothing/glasses/sunglasses/prescription cost = 2 diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index f951450134..518b11a521 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -387,7 +387,7 @@ path = /obj/item/clothing/under/pt /datum/gear/uniform/pt/expeditionary - display_name = "pt uniform, expeditionary" + display_name = "pt uniform, sifguard" path = /obj/item/clothing/under/pt/expeditionary /datum/gear/uniform/pt/fleet diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index d3fe97fcae..824b7a988b 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -1,4 +1,4 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33 +#define SAVE_RESET -1 var/list/preferences_datums = list() @@ -114,6 +114,8 @@ datum/preferences var/datum/category_collection/player_setup_collection/player_setup var/datum/browser/panel + var/lastnews // Hash of last seen lobby news content. + /datum/preferences/New(client/C) player_setup = new(src) set_biological_gender(pick(MALE, FEMALE)) @@ -197,7 +199,8 @@ datum/preferences dat += "Slot - " dat += "Load slot - " dat += "Save slot - " - dat += "Reload slot" + dat += "Reload slot - " + dat += "Reset slot" else dat += "Please create an account to save your preferences." @@ -246,6 +249,11 @@ datum/preferences load_character(text2num(href_list["changeslot"])) attempt_vr(client.prefs_vr,"load_vore","") //VOREStation Edit close_load_dialog(usr) + else if(href_list["resetslot"]) + if("No" == alert("This will reset the current slot. Continue?", "Reset current slot?", "No", "Yes")) + return 0 + load_character(SAVE_RESET) + sanitize_preferences() else return 0 diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index d3fad955d6..22eab43de5 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -67,11 +67,20 @@ if(!S) return 0 S.cd = "/" if(!slot) slot = default_slot - slot = sanitize_integer(slot, 1, config.character_slots, initial(default_slot)) - if(slot != default_slot) - default_slot = slot - S["default_slot"] << slot - S.cd = "/character[slot]" + if(slot != SAVE_RESET) // SAVE_RESET will reset the slot as though it does not exist, but keep the current slot for saving purposes. + slot = sanitize_integer(slot, 1, config.character_slots, initial(default_slot)) + if(slot != default_slot) + default_slot = slot + S["default_slot"] << slot + else + S["default_slot"] << default_slot + + if(slot != SAVE_RESET) + S.cd = "/character[slot]" + player_setup.load_character(S) + else + player_setup.load_character(S) + S.cd = "/character[default_slot]" player_setup.load_character(S) return 1 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 68dc3c25ce..39f437f93a 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -114,7 +114,8 @@ w_class = ITEMSIZE_TINY throwforce = 2 slot_flags = SLOT_EARS - sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/ears.dmi') + sprite_sheets = list( + "Teshari" = 'icons/mob/species/seromi/ears.dmi') /obj/item/clothing/ears/attack_hand(mob/user as mob) if (!user) return @@ -186,9 +187,9 @@ body_parts_covered = HANDS slot_flags = SLOT_GLOVES attack_verb = list("challenged") - species_restricted = null sprite_sheets = list( "Teshari" = 'icons/mob/species/seromi/gloves.dmi', + "Vox" = 'icons/mob/species/vox/gloves.dmi' ) /obj/item/clothing/gloves/update_clothing_icon() @@ -245,7 +246,8 @@ var/on = 0 sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/head.dmi' + "Teshari" = 'icons/mob/species/seromi/head.dmi', + "Vox" = 'icons/mob/species/vox/head.dmi' ) /obj/item/clothing/head/attack_self(mob/user) @@ -348,6 +350,7 @@ body_parts_covered = FACE|EYES sprite_sheets = list( "Teshari" = 'icons/mob/species/seromi/masks.dmi', + "Vox" = 'icons/mob/species/vox/masks.dmi' ) var/voicechange = 0 @@ -386,9 +389,10 @@ slowdown = SHOES_SLOWDOWN force = 2 var/overshoes = 0 - species_restricted = list("exclude","Teshari") + species_restricted = list("exclude","Teshari", "Vox") sprite_sheets = list( "Teshari" = 'icons/mob/species/seromi/shoes.dmi', + "Vox" = 'icons/mob/species/vox/shoes.dmi' ) /obj/item/clothing/shoes/proc/draw_knife() @@ -404,6 +408,7 @@ if(usr.put_in_hands(holding)) usr.visible_message("\The [usr] pulls a knife out of their boot!") + playsound(src.loc, 'sound/weapons/flipblade.ogg', 40, 1) holding = null else usr << "Your need an empty, unbroken hand to do that." @@ -415,6 +420,11 @@ update_icon() return +/obj/item/clothing/shoes/attack_hand(var/mob/living/M) + if(can_hold_knife == 1 && holding && src.loc == M) + draw_knife() + return + ..() /obj/item/clothing/shoes/attackby(var/obj/item/I, var/mob/user) if((can_hold_knife == 1) && (istype(I, /obj/item/weapon/material/shard) || \ @@ -471,7 +481,7 @@ name = "suit" var/fire_resist = T0C+100 body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - allowed = list(/obj/item/weapon/tank/emergency_oxygen) + allowed = list(/obj/item/weapon/tank/emergency/oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) slot_flags = SLOT_OCLOTHING var/blood_overlay_type = "suit" @@ -479,7 +489,8 @@ w_class = ITEMSIZE_NORMAL sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/suit.dmi' + "Teshari" = 'icons/mob/species/seromi/suit.dmi', + "Vox" = 'icons/mob/species/vox/suit.dmi' ) valid_accessory_slots = list("over", "armband") @@ -517,7 +528,8 @@ var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled var/rolled_sleeves = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/uniform.dmi' + "Teshari" = 'icons/mob/species/seromi/uniform.dmi', + "Vox" = 'icons/mob/species/vox/uniform.dmi' ) //convenience var for defining the icon state for the overlay used when the clothing is worn. diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 04770b5668..53678c13e4 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -27,7 +27,8 @@ BLIND // can't see anything var/obj/screen/overlay = null sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/eyes.dmi' + "Teshari" = 'icons/mob/species/seromi/eyes.dmi', + "Vox" = 'icons/mob/species/vox/eyes.dmi' ) /obj/item/clothing/glasses/update_clothing_icon() @@ -68,6 +69,19 @@ BLIND // can't see anything desc = "Optical Meson Scanner with prescription lenses." prescription = 1 +/obj/item/clothing/glasses/meson/aviator + name = "Engineering Aviators" + icon_state = "aviator_eng" + off_state = "aviator" + item_state_slots = list(slot_r_hand_str = "sunglasses", slot_l_hand_str = "sunglasses") + action_button_name = "Toggle HUD" + activation_sound = 'sound/effects/pop.ogg' + +/obj/item/clothing/glasses/meson/aviator/prescription + name = "Prescription Engineering Aviators" + desc = "Engineering Aviators with prescription lenses." + prescription = 1 + /obj/item/clothing/glasses/science name = "Science Goggles" desc = "The goggles do nothing!" @@ -92,6 +106,11 @@ BLIND // can't see anything see_invisible = SEE_INVISIBLE_NOLIGHTING off_state = "denight" +/obj/item/clothing/glasses/night/vox + name = "Alien Optics" + species_restricted = list("Vox") + phoronproof = 1 + /obj/item/clothing/glasses/night/New() ..() overlay = global_hud.nvg @@ -236,20 +255,20 @@ BLIND // can't see anything icon_state = "bigsunglasses" /obj/item/clothing/glasses/fakesunglasses //Sunglasses without flash immunity - desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes." name = "stylish sunglasses" + desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes." icon_state = "sun" item_state_slots = list(slot_r_hand_str = "sunglasses", slot_l_hand_str = "sunglasses") /obj/item/clothing/glasses/fakesunglasses/aviator - desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes." name = "stylish aviators" - icon_state = "sec_flash" + desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes." + icon_state = "aviator" /obj/item/clothing/glasses/sunglasses/sechud name = "HUDSunglasses" desc = "Sunglasses with a HUD." - icon_state = "sunhud" + icon_state = "sunSecHud" var/obj/item/clothing/glasses/hud/security/hud = null New() @@ -263,10 +282,10 @@ BLIND // can't see anything icon_state = "swatgoggles" /obj/item/clothing/glasses/sunglasses/sechud/aviator - name = "HUD aviators" + name = "Security HUD aviators" desc = "Modified aviator glasses that can be switch between HUD and flash protection modes." - icon_state = "sec_hud" - off_state = "sec_flash" + icon_state = "aviator_sec" + off_state = "aviator" action_button_name = "Toggle Mode" var/on = 1 toggleable = 1 @@ -305,10 +324,68 @@ BLIND // can't see anything icon_state = off_state /obj/item/clothing/glasses/sunglasses/sechud/aviator/prescription - name = "Prescription HUD aviators" + name = "Prescription Security HUD aviators" desc = "Modified aviator glasses that can be switch between HUD and flash protection modes. Comes with bonus prescription lenses." prescription = 6 +/obj/item/clothing/glasses/sunglasses/medhud + name = "HUDSunglasses" + desc = "Sunglasses with a HUD." + icon_state = "sunMedHud" + var/obj/item/clothing/glasses/hud/health/hud = null + +/obj/item/clothing/glasses/sunglasses/medhud/New() + ..() + src.hud = new/obj/item/clothing/glasses/hud/health(src) + return + +/obj/item/clothing/glasses/sunglasses/medhud/aviator + name = "Medical HUD aviators" + desc = "Modified aviator glasses with a toggled health HUD." + icon_state = "aviator_med" + off_state = "aviator" + action_button_name = "Toggle Mode" + var/on = 1 + toggleable = 1 + activation_sound = 'sound/effects/pop.ogg' + + var/hud_holder + +/obj/item/clothing/glasses/sunglasses/medhud/aviator/New() + ..() + hud_holder = hud + +/obj/item/clothing/glasses/sunglasses/medhud/aviator/Destroy() + qdel(hud_holder) + hud_holder = null + hud = null + . = ..() + +/obj/item/clothing/glasses/sunglasses/medhud/aviator/attack_self(mob/user) + if(toggleable && !user.incapacitated()) + on = !on + if(on) + src.hud = hud_holder + to_chat(user, "You switch the [src] to HUD mode.") + else + src.hud = null + to_chat(user, "You switch \the [src] off.") + update_icon() + user << activation_sound + user.update_inv_glasses() + user.update_action_buttons() + +/obj/item/clothing/glasses/sunglasses/medhud/aviator/update_icon() + if(on) + icon_state = initial(icon_state) + else + icon_state = off_state + +/obj/item/clothing/glasses/sunglasses/medhud/aviator/prescription + name = "Prescription Medical HUD aviators" + desc = "Modified aviator glasses with a toggled health HUD. Comes with bonus prescription lenses." + prescription = 6 + /obj/item/clothing/glasses/thermal name = "Optical Thermal Scanner" desc = "Thermals in the shape of glasses." diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index b901862e42..2de7c06aeb 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -5,7 +5,7 @@ item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red") /obj/item/clothing/gloves/boxing/attackby(obj/item/weapon/W, mob/user) - if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel)) + if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/surgical/scalpel)) user << "That won't work." //Nope return ..() diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 27e6ad0369..4e17916853 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -82,3 +82,19 @@ siemens_coefficient = 0.50 permeability_coefficient = 0.05 armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 0, rad = 0) + +/obj/item/clothing/gloves/vox + desc = "These bizarre gauntlets seem to be fitted for... bird claws?" + name = "insulated gauntlets" + icon_state = "gloves-vox" + item_state = "gloves-vox" + item_flags = PHORONGUARD + siemens_coefficient = 0 + phoronproof = 1 + permeability_coefficient = 0.05 + species_restricted = list("Vox") + + cold_protection = HANDS + min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE + heat_protection = HANDS + max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index ca7ca8aedd..cd5a927892 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -10,7 +10,8 @@ desc = "an ultra rare hat. It commands a certain respect." icon_state = "petehat" sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/head.dmi' + "Teshari" = 'icons/mob/species/seromi/head.dmi', + "Vox" = 'icons/mob/species/vox/head.dmi' ) /obj/item/clothing/head/collectable/slime diff --git a/code/modules/clothing/head/solgov.dm b/code/modules/clothing/head/solgov.dm index 9ed37a4eda..f7d4c417b4 100644 --- a/code/modules/clothing/head/solgov.dm +++ b/code/modules/clothing/head/solgov.dm @@ -11,8 +11,8 @@ ) /obj/item/clothing/head/soft/sol/expedition - name = "\improper Expeditionary Corps cap" - desc = "It's a black ballcap bearing a Expeditonary Corps crest." + name = "\improper SifGuard cap" + desc = "It's a black ballcap bearing a Sif Homeguard Corps crest." icon_state = "expeditionsoft" item_state_slots = list( slot_l_hand_str = "blacksoft", @@ -114,13 +114,13 @@ body_parts_covered = 0 /obj/item/clothing/head/dress/expedition - name = "expedition dress cap" - desc = "A peaked grey dress uniform cap belonging to the SCG Expeditionary Corps." + name = "\improper SifGuard dress cap" + desc = "A peaked grey dress uniform cap belonging to the Sif Homeguard Corps." icon_state = "greydresscap" /obj/item/clothing/head/dress/expedition/command - name = "expedition command dress cap" - desc = "A peaked grey dress uniform cap belonging to the SCG Expeditionary Corps. This one is trimmed in gold." + name = "\improper SifGuard command dress cap" + desc = "A peaked grey dress uniform cap belonging to the Sif Homeguard Corps. This one is trimmed in gold." icon_state = "greydresscap_com" /obj/item/clothing/head/dress/fleet @@ -181,33 +181,33 @@ icon_state = "beret_white" /obj/item/clothing/head/beret/sol/expedition - name = "expeditionary beret" - desc = "A black beret belonging to the SCG Expeditionary Corps. For personnel that are more inclined towards style than safety." + name = "\improper SifGuard beret" + desc = "A black beret belonging to the Sif Homeguard Corps. For personnel that are more inclined towards style than safety." icon_state = "beret_black" /obj/item/clothing/head/beret/sol/expedition/security - name = "expeditionary security beret" - desc = "An SCG Expeditionary Corps beret with a security crest. For personnel that are more inclined towards style than safety." + name = "\improper SifGuard security beret" + desc = "An Sif Homeguard Corps beret with a security crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_security" /obj/item/clothing/head/beret/sol/expedition/medical - name = "expeditionary medical beret" - desc = "An SCG Expeditionary Corps beret with a medical crest. For personnel that are more inclined towards style than safety." + name = "\improper SifGuard medical beret" + desc = "An Sif Homeguard Corps beret with a medical crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_medical" /obj/item/clothing/head/beret/sol/expedition/engineering - name = "expeditionary engineering beret" - desc = "An SCG Expeditionary Corps beret with an engineering crest. For personnel that are more inclined towards style than safety." + name = "\improper SifGuard engineering beret" + desc = "An Sif Homeguard Corps beret with an engineering crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_engineering" /obj/item/clothing/head/beret/sol/expedition/supply - name = "expeditionary supply beret" - desc = "An SCG Expeditionary Corps beret with a supply crest. For personnel that are more inclined towards style than safety." + name = "\improper SifGuard supply beret" + desc = "An Sif Homeguard Corps beret with a supply crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_supply" /obj/item/clothing/head/beret/sol/expedition/command - name = "expeditionary command beret" - desc = "An SCG Expeditionary Corps beret with a command crest. For personnel that are more inclined towards style than safety." + name = "\improper SifGuard command beret" + desc = "An Sif Homeguard Corps beret with a command crest. For personnel that are more inclined towards style than safety." icon_state = "beret_black_command" /obj/item/clothing/head/beret/sol/fleet diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index f03684931d..48d24bb8c2 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -9,6 +9,8 @@ gas_transfer_coefficient = 0.10 permeability_coefficient = 0.50 var/hanging = 0 + action_button_name = "Adjust Breath Mask" + /obj/item/clothing/mask/breath/proc/adjust_mask(mob/user) if(user.canmove && !user.stat) diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 0b9723d47b..b7df12fa0a 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -52,6 +52,15 @@ siemens_coefficient = 0.7 body_parts_covered = FACE|EYES +/obj/item/clothing/mask/gas/swat/vox + name = "\improper alien mask" + desc = "Clearly not designed for a human face." + body_parts_covered = 0 //Hack to allow vox to eat while wearing this mask. + item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | PHORONGUARD + phoronproof = 1 + species_restricted = list("Vox") + filtered_gases = list("oxygen", "sleeping_agent") + /obj/item/clothing/mask/gas/syndicate name = "tactical mask" desc = "A close-fitting tactical mask that can be connected to an air supply." diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 19eda1a1dd..63e4d93965 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -74,4 +74,51 @@ var/state = "disabled" if(item_flags & NOSLIP) state = "enabled" - user << "Its mag-pulse traction system appears to be [state]." \ No newline at end of file + user << "Its mag-pulse traction system appears to be [state]." + +/obj/item/clothing/shoes/magboots/vox + + desc = "A pair of heavy, jagged armoured foot pieces, seemingly suitable for a velociraptor." + name = "vox magclaws" + item_state = "boots-vox" + icon_state = "boots-vox" + item_flags = PHORONGUARD + phoronproof = 1 + species_restricted = list("Vox") + + action_button_name = "Toggle the magclaws" + +/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user) + if(src.magpulse) + item_flags &= ~NOSLIP + magpulse = 0 + canremove = 1 + to_chat(user, "You relax your deathgrip on the flooring.") + else + //make sure these can only be used when equipped. + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + if (H.shoes != src) + to_chat(user, "You will have to put on the [src] before you can do that.") + return + + item_flags |= NOSLIP + magpulse = 1 + canremove = 0 //kinda hard to take off magclaws when you are gripping them tightly. + to_chat(user, "You dig your claws deeply into the flooring, bracing yourself.") + user.update_action_buttons() + +//In case they somehow come off while enabled. +/obj/item/clothing/shoes/magboots/vox/dropped(mob/user as mob) + ..() + if(src.magpulse) + user.visible_message("The [src] go limp as they are removed from [usr]'s feet.", "The [src] go limp as they are removed from your feet.") + item_flags &= ~NOSLIP + magpulse = 0 + canremove = 1 + +/obj/item/clothing/shoes/magboots/vox/examine(mob/user) + ..(user) + if (magpulse) + to_chat(user, "It would be hard to take these off without relaxing your grip first.")//theoretically this message should only be seen by the wearer when the claws are equipped. \ No newline at end of file diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 4d1cfe6088..755c657bac 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -27,36 +27,7 @@ armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) item_flags = NOSLIP siemens_coefficient = 0.6 - var/obj/item/weapon/material/hatchet/tacknife - -/obj/item/clothing/shoes/swat/attack_hand(var/mob/living/M) - if(tacknife) - tacknife.loc = get_turf(src) - if(M.put_in_active_hand(tacknife)) - M << "You slide \the [tacknife] out of [src]." - playsound(M, 'sound/weapons/flipblade.ogg', 40, 1) - tacknife = null - update_icon() - return - ..() - -/obj/item/clothing/shoes/swat/attackby(var/obj/item/I, var/mob/living/M) - if(istype(I, /obj/item/weapon/material/hatchet/tacknife)) - if(tacknife) - return - M.drop_item() - tacknife = I - I.loc = src - M << "You slide the [I] into [src]." - playsound(M, 'sound/weapons/flipblade.ogg', 40, 1) - update_icon() - ..() - -/obj/item/clothing/shoes/swat/update_icon() - if(tacknife) - icon_state = "swat_1" - else - icon_state = initial(icon_state) + can_hold_knife = 1 //Stolen from CM, refurbished to be less terrible. /obj/item/clothing/shoes/marine @@ -66,36 +37,7 @@ item_state_slots = list(slot_r_hand_str = "jackboots", slot_l_hand_str = "jackboots") armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) siemens_coefficient = 0.6 - var/obj/item/weapon/material/hatchet/tacknife - -/obj/item/clothing/shoes/marine/attack_hand(var/mob/living/M) - if(tacknife) - tacknife.loc = get_turf(src) - if(M.put_in_active_hand(tacknife)) - M << "You slide \the [tacknife] out of [src]." - playsound(M, 'sound/weapons/flipblade.ogg', 40, 1) - tacknife = null - update_icon() - return - ..() - -/obj/item/clothing/shoes/marine/attackby(var/obj/item/I, var/mob/living/M) - if(istype(I, /obj/item/weapon/material/hatchet/tacknife)) - if(tacknife) - return - M.drop_item() - tacknife = I - I.loc = src - M << "You slide the [I] into [src]." - playsound(M, 'sound/weapons/flipblade.ogg', 40, 1) - update_icon() - ..() - -/obj/item/clothing/shoes/marine/update_icon() - if(tacknife) - icon_state = "jackboots_1" - else - icon_state = initial(icon_state) + can_hold_knife = 1 /obj/item/clothing/shoes/combat //Basically SWAT shoes combined with galoshes. name = "combat boots" @@ -105,6 +47,7 @@ armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0) item_flags = NOSLIP siemens_coefficient = 0.6 + can_hold_knife = 1 cold_protection = FEET min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE @@ -118,6 +61,7 @@ force = 3 armor = list(melee = 30, bullet = 10, laser = 10, energy = 15, bomb = 20, bio = 10, rad = 0) siemens_coefficient = 0.7 + can_hold_knife = 1 /obj/item/clothing/shoes/dutyboots name = "duty boots" @@ -125,6 +69,7 @@ icon_state = "duty" armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20) siemens_coefficient = 0.7 + can_hold_knife = 1 /obj/item/clothing/shoes/tactical name = "tactical boots" @@ -133,6 +78,7 @@ force = 3 armor = list(melee = 40, bullet = 30, laser = 40,energy = 25, bomb = 50, bio = 0, rad = 0) siemens_coefficient = 0.7 + can_hold_knife = 1 /obj/item/clothing/shoes/dress name = "dress shoes" diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index 9d940c9e30..43a19c558f 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -25,4 +25,65 @@ icon_state = "skrell_suit_white" /obj/item/clothing/suit/space/skrell/black - icon_state = "skrell_suit_black" \ No newline at end of file + icon_state = "skrell_suit_black" + +// Vox space gear (vaccuum suit, low pressure armour) +// Can't be equipped by any other species due to bone structure and vox cybernetics. +/obj/item/clothing/suit/space/vox + w_class = ITEMSIZE_NORMAL + item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | PHORONGUARD + allowed = list(/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/tank) + phoronproof = 1 + armor = list(melee = 60, bullet = 50, laser = 40,energy = 15, bomb = 30, bio = 30, rad = 30) + siemens_coefficient = 0.2 + heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS + max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE + species_restricted = list("Vox") + +/obj/item/clothing/head/helmet/space/vox + armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 30, rad = 30) + siemens_coefficient = 0.2 + item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL | AIRTIGHT | PHORONGUARD + flags_inv = 0 + phoronproof = 1 + species_restricted = list("Vox") + +/obj/item/clothing/head/helmet/space/vox/pressure + name = "alien helmet" + icon_state = "vox-pressure" + desc = "Hey, wasn't this a prop in \'The Abyss\'?" + +/obj/item/clothing/suit/space/vox/pressure + name = "alien pressure suit" + icon_state = "vox-pressure" + desc = "A huge, armoured, pressurized suit, designed for distinctly nonhuman proportions." + +/obj/item/clothing/head/helmet/space/vox/carapace + name = "alien visor" + icon_state = "vox-carapace" + desc = "A glowing visor, perhaps stolen from a depressed Cylon." + +/obj/item/clothing/suit/space/vox/carapace + name = "alien carapace armour" + icon_state = "vox-carapace" + desc = "An armoured, segmented carapace with glowing purple lights. It looks pretty run-down." + +/obj/item/clothing/head/helmet/space/vox/stealth + name = "alien stealth helmet" + icon_state = "vox-stealth" + desc = "A smoothly contoured, matte-black alien helmet." + +/obj/item/clothing/suit/space/vox/stealth + name = "alien stealth suit" + icon_state = "vox-stealth" + desc = "A sleek black suit. It seems to have a tail, and is very heavy." + +/obj/item/clothing/head/helmet/space/vox/medic + name = "alien goggled helmet" + icon_state = "vox-medic" + desc = "An alien helmet with enormous goggled lenses." + +/obj/item/clothing/suit/space/vox/medic + name = "alien armour" + icon_state = "vox-medic" + desc = "An almost organic looking nonhuman pressure suit." \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index f4b7101b82..c66ff3440c 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -18,7 +18,7 @@ permeability_coefficient = 0.02 item_flags = STOPPRESSUREDAMAGE body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS - allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) + allowed = list(/obj/item/weapon/tank/emergency/oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs) slowdown = 1.5 armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL @@ -81,7 +81,7 @@ desc = "Yarr." icon_state = "pirate" w_class = ITEMSIZE_NORMAL - 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/emergency_oxygen) + 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/emergency/oxygen) slowdown = 0 armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) siemens_coefficient = 0.9 diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index dd7c473215..373ca946d3 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -13,7 +13,8 @@ sprite_sheets = list( "Tajara" = 'icons/mob/species/tajaran/helmet.dmi', "Skrell" = 'icons/mob/species/skrell/helmet.dmi', - "Unathi" = 'icons/mob/species/unathi/helmet.dmi' + "Unathi" = 'icons/mob/species/unathi/helmet.dmi', + "Vox" = 'icons/mob/species/vox/head.dmi' ) species_restricted = null @@ -50,7 +51,8 @@ can_breach = 1 sprite_sheets = list( "Tajara" = 'icons/mob/species/tajaran/suit.dmi', - "Unathi" = 'icons/mob/species/unathi/suit.dmi' + "Unathi" = 'icons/mob/species/unathi/suit.dmi', + "Vox" = 'icons/mob/species/vox/suit.dmi' ) supporting_limbs = list() var/obj/item/weapon/material/hatchet/tacknife diff --git a/code/modules/clothing/spacesuits/rig/suits/alien.dm b/code/modules/clothing/spacesuits/rig/suits/alien.dm index 5662e8b181..d34739cad3 100644 --- a/code/modules/clothing/spacesuits/rig/suits/alien.dm +++ b/code/modules/clothing/spacesuits/rig/suits/alien.dm @@ -1,3 +1,7 @@ +/* + * UNATHI + */ + /obj/item/weapon/rig/breacher name = "\improper NT breacher chassis control module" desc = "A cheap NT knock-off of an Unathi battle-rig. Looks like a fish, moves like a fish, steers like a cow." @@ -30,4 +34,91 @@ species_restricted = list("Unathi") /obj/item/clothing/shoes/magboots/rig/breacher - species_restricted = list("Unathi") \ No newline at end of file + species_restricted = list("Unathi") + +/* + * VOX + */ + +/obj/item/weapon/rig/vox //Just to get the flags set up + name = "alien control module" + desc = "This metal box writhes and squirms as if it were alive..." + suit_type = "alien" + icon_state = "vox_rig" + armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 30, rad = 30) + item_flags = THICKMATERIAL + siemens_coefficient = 0.2 + phoronproof = 1 + + air_type = /obj/item/weapon/tank/vox + + helm_type = /obj/item/clothing/head/helmet/space/rig/vox + boot_type = /obj/item/clothing/shoes/magboots/rig/vox + chest_type = /obj/item/clothing/suit/space/rig/vox + glove_type = /obj/item/clothing/gloves/gauntlets/rig/vox + +/obj/item/clothing/head/helmet/space/rig/vox + species_restricted = list("Vox") + flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + phoronproof = 1 + +/obj/item/clothing/shoes/magboots/rig/vox + name = "talons" + species_restricted = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/shoes.dmi' + ) + phoronproof = 1 + +/obj/item/clothing/suit/space/rig/vox + species_restricted = list("Vox") + phoronproof = 1 + +/obj/item/clothing/gloves/gauntlets/rig/vox + siemens_coefficient = 0 + species_restricted = list("Vox") + sprite_sheets = list( + "Vox" = 'icons/mob/species/vox/gloves.dmi' + ) + phoronproof = 1 + +/obj/item/weapon/rig/vox/carapace + name = "dense alien control module" + suit_type = "dense alien" + armor = list(melee = 60, bullet = 50, laser = 40, energy = 15, bomb = 30, bio = 30, rad = 30) + emp_protection = 40 //change this to 30 if too high. + phoronproof = 1 + + req_access = list(access_syndicate) + + cell_type = /obj/item/weapon/cell/hyper + + initial_modules = list( + /obj/item/rig_module/mounted/energy_blade, + /obj/item/rig_module/sprinter, + /obj/item/rig_module/electrowarfare_suite, + /obj/item/rig_module/vision, + /obj/item/rig_module/power_sink, + /obj/item/rig_module/self_destruct + ) + +/obj/item/weapon/rig/vox/stealth + name = "sinister alien control module" + suit_type = "sinister alien" + icon_state = "voxstealth_rig" + armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 30, bio = 100, rad = 100) + emp_protection = 40 //change this to 30 if too high. + slowdown = 0 + phoronproof = 1 + + req_access = list(access_syndicate) + + cell_type = /obj/item/weapon/cell/hyper + + initial_modules = list( + /obj/item/rig_module/stealth_field, + /obj/item/rig_module/electrowarfare_suite, + /obj/item/rig_module/vision, + /obj/item/rig_module/power_sink, + /obj/item/rig_module/self_destruct + ) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index b0c8838532..11dfbfb961 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -201,6 +201,7 @@ req_access = list(access_medical) initial_modules = list( + /obj/item/rig_module/sprinter, /obj/item/rig_module/chem_dispenser/injector, /obj/item/rig_module/maneuvering_jets, /obj/item/rig_module/device/healthscanner, diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index e931cb14a4..07f8160b48 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -51,7 +51,7 @@ permeability_coefficient = 0.02 item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/suit_cooling_unit) slowdown = 3 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 7c8cfdaba2..9de95f3d6c 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -11,7 +11,7 @@ icon_state = "syndicate" desc = "A crimson spacesuit sporting clean lines and durable plating. Robust, reliable, and slightly suspicious." w_class = ITEMSIZE_NORMAL - allowed = list(/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/tank/emergency_oxygen) + allowed = list(/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/tank/emergency/oxygen) slowdown = 1 armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) siemens_coefficient = 0.6 diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 32962252bf..d08726371a 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -126,7 +126,7 @@ permeability_coefficient = 0.01 item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS - 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/emergency_oxygen,/obj/item/clothing/head/helmet) + 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/emergency/oxygen,/obj/item/clothing/head/helmet) slowdown = 1 w_class = ITEMSIZE_HUGE armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 100, rad = 100) @@ -417,7 +417,7 @@ item_state_slots = list(slot_r_hand_str = "armor", slot_l_hand_str = "armor") w_class = ITEMSIZE_LARGE//bulky item body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/head/helmet) + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency/oxygen,/obj/item/clothing/head/helmet) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index d2dcbc9a02..c6eb2ac459 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -18,7 +18,7 @@ permeability_coefficient = 0.01 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS slowdown = 1.0 - allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen) + allowed = list(/obj/item/weapon/tank/emergency/oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER siemens_coefficient = 0.9 diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 2f93ed3bb8..ffab2d6a8c 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -29,13 +29,14 @@ flags_inv = HIDEHOLSTER //Chaplain -/obj/item/clothing/suit/chaplain_hoodie +/obj/item/clothing/suit/storage/hooded/chaplain_hoodie name = "chaplain hoodie" desc = "This suit says to you \"Hush\"!" icon_state = "chaplain_hoodie" item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black") - body_parts_covered = UPPER_TORSO|ARMS + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEHOLSTER + hoodtype = /obj/item/clothing/head/chaplain_hood allowed = list (/obj/item/weapon/storage/bible) //Chaplain @@ -99,7 +100,7 @@ blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEHOLSTER - allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight, /obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, + allowed = list(/obj/item/weapon/tank/emergency/oxygen, /obj/item/device/flashlight, /obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/handcuffs, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/flame/lighter, /obj/item/device/taperecorder, /obj/item/device/uv_light) armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0) @@ -116,7 +117,7 @@ desc = "A forensics technician jacket." body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEHOLSTER - allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight, /obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, + allowed = list(/obj/item/weapon/tank/emergency/oxygen, /obj/item/device/flashlight, /obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/melee/baton, /obj/item/weapon/handcuffs, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/flame/lighter, /obj/item/device/taperecorder, /obj/item/device/uv_light) armor = list(melee = 10, bullet = 10, laser = 15, energy = 10, bomb = 0, bio = 0, rad = 0) @@ -150,7 +151,7 @@ icon_state = "hazard" blood_overlay_type = "armor" allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner, - /obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/weapon/tank/emergency_oxygen, + /obj/item/weapon/crowbar, /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/weapon/tank/emergency/oxygen, /obj/item/clothing/mask/gas, /obj/item/taperoll/engineering) body_parts_covered = UPPER_TORSO @@ -211,7 +212,7 @@ icon_closed = "fr_jacket" blood_overlay_type = "armor" allowed = list(/obj/item/stack/medical, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/hypospray, /obj/item/weapon/reagent_containers/syringe, - /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen) + /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency/oxygen) body_parts_covered = UPPER_TORSO|ARMS /obj/item/clothing/suit/storage/toggle/fr_jacket/ems @@ -229,8 +230,8 @@ blood_overlay_type = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO allowed = list(/obj/item/stack/medical, /obj/item/weapon/reagent_containers/dropper, /obj/item/weapon/reagent_containers/hypospray, /obj/item/weapon/reagent_containers/syringe, \ - /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/scalpel,/obj/item/weapon/retractor,/obj/item/weapon/hemostat, \ - /obj/item/weapon/cautery,/obj/item/weapon/bonegel,/obj/item/weapon/FixOVein) + /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency/oxygen,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/retractor,/obj/item/weapon/surgical/hemostat, \ + /obj/item/weapon/surgical/cautery,/obj/item/weapon/surgical/bonegel,/obj/item/weapon/surgical/FixOVein) //Mime /obj/item/clothing/suit/suspenders diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 5f7c9e3875..46f60382dc 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -92,7 +92,7 @@ icon_state = "vest" item_state_slots = list(slot_r_hand_str = "wcoat", slot_l_hand_str = "wcoat") blood_overlay_type = "armor" - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/suit/wcoat/red @@ -131,7 +131,7 @@ icon_state = "syndicate" desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" w_class = ITEMSIZE_NORMAL - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen,/obj/item/toy) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET @@ -272,7 +272,7 @@ name = "leather coat" desc = "A long, thick black leather coat." icon_state = "leathercoat_alt" - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") flags_inv = HIDEHOLSTER @@ -287,7 +287,7 @@ name = "brown leather coat" desc = "A long, brown leather coat." icon_state = "browncoat" - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) item_state_slots = list(slot_r_hand_str = "brown_jacket", slot_l_hand_str = "brown_jacket") flags_inv = HIDEHOLSTER @@ -295,7 +295,7 @@ name = "black coat" desc = "A flowing, black coat." icon_state = "neocoat" - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") flags_inv = HIDEHOLSTER @@ -318,7 +318,7 @@ desc = "A rugged canvas trenchcoat, designed and created by TX Fabrication Corp. The coat appears to have its kevlar lining removed." icon_state = "detective" blood_overlay_type = "coat" - allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder,/obj/item/device/uv_light) + allowed = list(/obj/item/weapon/tank/emergency/oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder,/obj/item/device/uv_light) flags_inv = HIDEHOLSTER /obj/item/clothing/suit/storage/trench/grey @@ -393,7 +393,7 @@ item_state_slots = list(slot_r_hand_str = "brown_jacket", slot_l_hand_str = "brown_jacket") icon_open = "bomber_open" icon_closed = "bomber" - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEHOLSTER cold_protection = UPPER_TORSO|ARMS @@ -416,7 +416,7 @@ desc = "A black leather coat." icon_state = "leather_jacket" icon_open = "leather_jacket_open" - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEHOLSTER @@ -460,7 +460,7 @@ item_state_slots = list(slot_r_hand_str = "brown_jacket", slot_l_hand_str = "brown_jacket") icon_open = "brown_jacket_open" icon_closed = "brown_jacket" - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEHOLSTER @@ -496,7 +496,7 @@ item_state_slots = list(slot_r_hand_str = "denim_jacket", slot_l_hand_str = "denim_jacket") icon_open = "denim_jacket_open" icon_closed = "denim_jacket" - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEHOLSTER @@ -679,9 +679,8 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) hooded = 1 - action_button_name = "Toggle Winter Hood" hoodtype = /obj/item/clothing/head/winterhood - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) /obj/item/clothing/head/winterhood name = "winter hood" @@ -697,57 +696,99 @@ icon_state = "coatcaptain" item_state_slots = list(slot_r_hand_str = "coatcaptain", slot_l_hand_str = "coatcaptain") armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0) + hoodtype = /obj/item/clothing/head/winterhood/captain + +/obj/item/clothing/head/winterhood/captain + name = "colony director's winter hood" + armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0) /obj/item/clothing/suit/storage/hooded/wintercoat/security name = "security winter coat" icon_state = "coatsecurity" item_state_slots = list(slot_r_hand_str = "coatsecurity", slot_l_hand_str = "coatsecurity") armor = list(melee = 25, bullet = 20, laser = 20, energy = 15, bomb = 20, bio = 0, rad = 0) + hoodtype = /obj/item/clothing/head/winterhood/security + +/obj/item/clothing/head/winterhood/security + name = "security winter hood" + armor = list(melee = 25, bullet = 20, laser = 20, energy = 15, bomb = 20, bio = 0, rad = 0) /obj/item/clothing/suit/storage/hooded/wintercoat/medical name = "medical winter coat" icon_state = "coatmedical" item_state_slots = list(slot_r_hand_str = "coatmedical", slot_l_hand_str = "coatmedical") armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0) + hoodtype = /obj/item/clothing/head/winterhood/medical + +/obj/item/clothing/head/winterhood/medical + name = "medical winter hood" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0) /obj/item/clothing/suit/storage/hooded/wintercoat/science name = "science winter coat" icon_state = "coatscience" item_state_slots = list(slot_r_hand_str = "coatscience", slot_l_hand_str = "coatscience") armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0) + hoodtype = /obj/item/clothing/head/winterhood/science + +/obj/item/clothing/head/winterhood/science + name = "science winter hood" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0) /obj/item/clothing/suit/storage/hooded/wintercoat/engineering name = "engineering winter coat" icon_state = "coatengineer" item_state_slots = list(slot_r_hand_str = "coatengineer", slot_l_hand_str = "coatengineer") armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20) + hoodtype = /obj/item/clothing/head/winterhood/engineering + +/obj/item/clothing/head/winterhood/engineering + name = "engineering winter hood" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20) /obj/item/clothing/suit/storage/hooded/wintercoat/engineering/atmos name = "atmospherics winter coat" icon_state = "coatatmos" item_state_slots = list(slot_r_hand_str = "coatatmos", slot_l_hand_str = "coatatmos") + hoodtype = /obj/item/clothing/head/winterhood/engineering/atmos + +/obj/item/clothing/head/winterhood/engineering/atmos + name = "atmospherics winter hood" /obj/item/clothing/suit/storage/hooded/wintercoat/hydro name = "hydroponics winter coat" icon_state = "coathydro" item_state_slots = list(slot_r_hand_str = "coathydro", slot_l_hand_str = "coathydro") + hoodtype = /obj/item/clothing/head/winterhood/hydro + +/obj/item/clothing/head/winterhood/hydro + name = "hydroponics winter hood" /obj/item/clothing/suit/storage/hooded/wintercoat/cargo name = "cargo winter coat" icon_state = "coatcargo" item_state_slots = list(slot_r_hand_str = "coatcargo", slot_l_hand_str = "coatcargo") + hoodtype = /obj/item/clothing/head/winterhood/cargo + +/obj/item/clothing/head/winterhood/cargo + name = "cargo winter hood" /obj/item/clothing/suit/storage/hooded/wintercoat/miner name = "mining winter coat" icon_state = "coatminer" item_state_slots = list(slot_r_hand_str = "coatminer", slot_l_hand_str = "coatminer") armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + hoodtype = /obj/item/clothing/head/winterhood/miner + +/obj/item/clothing/head/winterhood/miner + name = "mining winter hood" + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) /obj/item/clothing/suit/varsity name = "black varsity jacket" desc = "A favorite of jocks everywhere from Sol to Nyx." icon_state = "varsity" - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black") flags_inv = HIDETIE|HIDEHOLSTER @@ -781,7 +822,7 @@ item_state_slots = list(slot_r_hand_str = "black_labcoat", slot_l_hand_str = "black_labcoat") icon_open = "trackjacket_open" icon_closed = "trackjacket" - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) /obj/item/clothing/suit/storage/toggle/track/blue name = "blue track jacket" @@ -818,7 +859,7 @@ desc = "A comfy, grey flannel shirt. Unleash your inner hipster." icon_state = "flannel" item_state_slots = list(slot_r_hand_str = "black_labcoat", slot_l_hand_str = "black_labcoat") - allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) flags_inv = HIDEHOLSTER var/rolled = 0 var/tucked = 0 diff --git a/code/modules/clothing/suits/solgov.dm b/code/modules/clothing/suits/solgov.dm index 90b561ba3e..e38e68164d 100644 --- a/code/modules/clothing/suits/solgov.dm +++ b/code/modules/clothing/suits/solgov.dm @@ -10,51 +10,51 @@ body_parts_covered = UPPER_TORSO|ARMS armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 - allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/flashlight,/obj/item/weapon/pen,/obj/item/clothing/head/soft,/obj/item/clothing/head/beret,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder,/obj/item/device/analyzer,/obj/item/device/radio,/obj/item/taperoll) + allowed = list(/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/flashlight,/obj/item/weapon/pen,/obj/item/clothing/head/soft,/obj/item/clothing/head/beret,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder,/obj/item/device/analyzer,/obj/item/device/radio,/obj/item/taperoll) /obj/item/clothing/suit/storage/service/expeditionary - name = "expeditionary jacket" - desc = "A uniform service jacket belonging to the SCG Expeditionary Corps. It has silver buttons." + name = "\improper SifGuard jacket" + desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has silver buttons." icon_state = "blackservice_crew" /obj/item/clothing/suit/storage/service/expeditionary/medical - name = "expeditionary medical jacket" - desc = "A uniform service jacket belonging to the SCG Expeditionary Corps. It has silver buttons and blue trim." + name = "\improper SifGuard medical jacket" + desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has silver buttons and blue trim." icon_state = "blackservice_med" /obj/item/clothing/suit/storage/service/expeditionary/medical/command - name = "expeditionary medical command jacket" - desc = "A uniform service jacket belonging to the SCG Expeditionary Corps. It has gold buttons and blue trim." + name = "\improper SifGuard medical command jacket" + desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has gold buttons and blue trim." icon_state = "blackservice_medcom" /obj/item/clothing/suit/storage/service/expeditionary/engineering - name = "expeditionary engineering jacket" - desc = "A uniform service jacket belonging to the SCG Expeditionary Corps. It has silver buttons and orange trim." + name = "\improper SifGuard engineering jacket" + desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has silver buttons and orange trim." icon_state = "blackservice_eng" /obj/item/clothing/suit/storage/service/expeditionary/engineering/command - name = "expeditionary engineering command jacket" - desc = "A uniform service jacket belonging to the SCG Expeditionary Corps. It has gold buttons and orange trim." + name = "\improper SifGuard engineering command jacket" + desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has gold buttons and orange trim." icon_state = "blackservice_engcom" /obj/item/clothing/suit/storage/service/expeditionary/supply - name = "expeditionary supply jacket" - desc = "A uniform service jacket belonging to the SCG Expeditionary Corps. It has silver buttons and brown trim." + name = "\improper SifGuard supply jacket" + desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has silver buttons and brown trim." icon_state = "blackservice_sup" /obj/item/clothing/suit/storage/service/expeditionary/security - name = "expeditionary security jacket" - desc = "A uniform service jacket belonging to the SCG Expeditionary Corps. It has silver buttons and red trim." + name = "\improper SifGuard security jacket" + desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has silver buttons and red trim." icon_state = "blackservice_sec" /obj/item/clothing/suit/storage/service/expeditionary/security/command - name = "expeditionary security command jacket" - desc = "A uniform service jacket belonging to the SCG Expeditionary Corps. It has gold buttons and red trim." + name = "\improper SifGuard security command jacket" + desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has gold buttons and red trim." icon_state = "blackservice_seccom" /obj/item/clothing/suit/storage/service/expeditionary/command - name = "expeditionary command jacket" - desc = "A uniform service jacket belonging to the SCG Expeditionary Corps. It has gold buttons and gold trim." + name = "\improper SifGuard command jacket" + desc = "A uniform service jacket belonging to the Sif Homeguard Corps. It has gold buttons and gold trim." icon_state = "blackservice_com" /obj/item/clothing/suit/storage/service/marine @@ -112,7 +112,7 @@ body_parts_covered = UPPER_TORSO|ARMS armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) siemens_coefficient = 0.9 - allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/flashlight,/obj/item/clothing/head/soft,/obj/item/clothing/head/beret,/obj/item/device/radio,/obj/item/weapon/pen) + allowed = list(/obj/item/weapon/tank/emergency/oxygen,/obj/item/device/flashlight,/obj/item/clothing/head/soft,/obj/item/clothing/head/beret,/obj/item/device/radio,/obj/item/weapon/pen) /obj/item/clothing/suit/dress/expedition name = "expeditionary dress jacket" diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 9bd162dc7f..1176b91089 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -1,10 +1,11 @@ //Hoods for winter coats and chaplain hoodie etc /obj/item/clothing/suit/storage/hooded - var/obj/item/clothing/head/winterhood/hood + var/obj/item/clothing/head/hood var/hoodtype = null //so the chaplain hoodie or other hoodies can override this var/suittoggled = 0 var/hooded = 0 + action_button_name = "Toggle Hood" /obj/item/clothing/suit/storage/hooded/New() MakeHood() diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 02f4b16254..656fac4809 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -17,7 +17,7 @@ gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/extinguisher) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen,/obj/item/weapon/extinguisher) slowdown = 1.0 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER item_flags = STOPPRESSUREDAMAGE @@ -89,7 +89,7 @@ gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS|FEET - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/head/radiation,/obj/item/clothing/mask/gas) + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen,/obj/item/clothing/head/radiation,/obj/item/clothing/mask/gas) slowdown = 1.5 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) flags_inv = HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 98855ead83..045e03fc93 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -49,7 +49,7 @@ item_state = "classicponcho" icon_override = 'icons/mob/ties.dmi' var/fire_resist = T0C+100 - allowed = list(/obj/item/weapon/tank/emergency_oxygen) + allowed = list(/obj/item/weapon/tank/emergency/oxygen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) slot_flags = SLOT_OCLOTHING | SLOT_TIE body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS @@ -138,7 +138,7 @@ item_state = "vest" icon_override = 'icons/mob/ties.dmi' item_state_slots = list(slot_r_hand_str = "wcoat", slot_l_hand_str = "wcoat") - allowed = list(/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + allowed = list(/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) slot_flags = SLOT_OCLOTHING | SLOT_TIE body_parts_covered = UPPER_TORSO|LOWER_TORSO diff --git a/code/modules/clothing/under/solgov.dm b/code/modules/clothing/under/solgov.dm index 6dc92e1238..eb3ed28a85 100644 --- a/code/modules/clothing/under/solgov.dm +++ b/code/modules/clothing/under/solgov.dm @@ -11,8 +11,8 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/pt/expeditionary - name = "expeditionary pt uniform" - desc = "A baggy shirt bearing the seal of the SCG Expeditionary Corps and some dorky looking blue shorts." + name = "\improper SifGuard pt uniform" + desc = "A baggy shirt bearing the seal of the Sif Homeguard Corps and some dorky looking blue shorts." icon_state = "expeditionpt" worn_state = "expeditionpt" @@ -40,57 +40,57 @@ siemens_coefficient = 0.9 /obj/item/clothing/under/utility/expeditionary - name = "expeditionary uniform" - desc = "The utility uniform of the SCG Expeditionary Corps, made from biohazard resistant material. This one has silver trim." + name = "\improper SifGuard uniform" + desc = "The utility uniform of the Sif Homeguard Corps, 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/expeditionary/medical - name = "expeditionary medical uniform" - desc = "The utility uniform of the SCG Expeditionary Corps, made from biohazard resistant material. This one has silver trim and blue blazes." + name = "\improper SifGuard medical uniform" + desc = "The utility uniform of the Sif Homeguard Corps, 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/utility/expeditionary/medical/command - name = "expeditionary medical command uniform" - desc = "The utility uniform of the SCG Expeditionary Corps, made from biohazard resistant material. This one has gold trim and blue blazes." + name = "\improper SifGuard medical command uniform" + desc = "The utility uniform of the Sif Homeguard Corps, 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/utility/expeditionary/engineering - name = "expeditionary engineering uniform" - desc = "The utility uniform of the SCG Expeditionary Corps, made from biohazard resistant material. This one has silver trim and organge blazes." + name = "\improper SifGuard engineering uniform" + desc = "The utility uniform of the Sif Homeguard Corps, 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/utility/expeditionary/engineering/command - name = "expeditionary engineering command uniform" - desc = "The utility uniform of the SCG Expeditionary Corps, made from biohazard resistant material. This one has gold trim and organge blazes." + name = "\improper SifGuard engineering command uniform" + desc = "The utility uniform of the Sif Homeguard Corps, 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/utility/expeditionary/supply - name = "expeditionary supply uniform" - desc = "The utility uniform of the SCG Expeditionary Corps, made from biohazard resistant material. This one has silver trim and brown blazes." + name = "\improper SifGuard supply uniform" + desc = "The utility uniform of the Sif Homeguard Corps, 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/utility/expeditionary/security - name = "expeditionary security uniform" - desc = "The utility uniform of the SCG Expeditionary Corps, made from biohazard resistant material. This one has silver trim and red blazes." + name = "\improper SifGuard security uniform" + desc = "The utility uniform of the Sif Homeguard Corps, 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/utility/expeditionary/security/command - name = "expeditionary security command uniform" - desc = "The utility uniform of the SCG Expeditionary Corps, made from biohazard resistant material. This one has gold trim and red blazes." + name = "\improper SifGuard security command uniform" + desc = "The utility uniform of the Sif Homeguard Corps, 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/utility/expeditionary/command - name = "expeditionary command uniform" - desc = "The utility uniform of the SCG Expeditionary Corps, made from biohazard resistant material. This one has gold trim and gold blazes." + name = "\improper SifGuard command uniform" + desc = "The utility uniform of the Sif Homeguard Corps, made from biohazard resistant material. This one has gold trim and gold blazes." icon_state = "blackutility_com" worn_state = "blackutility_com" @@ -221,14 +221,14 @@ siemens_coefficient = 0.9 /obj/item/clothing/under/dress/expeditionary - name = "expeditionary dress uniform" - desc = "The dress uniform of the SCG Expeditionary Corps in silver trim." + name = "\improper SifGuard dress uniform" + desc = "The dress uniform of the Sif Homeguard Corps in silver trim." icon_state = "greydress" worn_state = "greydress" /obj/item/clothing/under/dress/expeditionary/command - name = "expeditionary command dress uniform" - desc = "The dress uniform of the SCG Expeditionary Corps in gold trim." + name = "\improper SifGuard command dress uniform" + desc = "The dress uniform of the Sif Homeguard Corps in gold trim." icon_state = "greydress_com" worn_state = "greydress_com" diff --git a/code/modules/clothing/under/xenos/vox.dm b/code/modules/clothing/under/xenos/vox.dm new file mode 100644 index 0000000000..b29df92e8c --- /dev/null +++ b/code/modules/clothing/under/xenos/vox.dm @@ -0,0 +1,33 @@ +/obj/item/clothing/under/vox + has_sensor = 0 + species_restricted = list("Vox") + valid_accessory_slots = list("vox") + restricted_accessory_slots = list("vox") + phoronproof = 1 + +/obj/item/clothing/under/vox/vox_casual + name = "alien clothing" + desc = "This doesn't look very comfortable." + icon_state = "vox-casual-1" + item_state = "vox-casual-1" + body_parts_covered = LEGS + +/obj/item/clothing/under/vox/vox_robes + name = "alien robes" + desc = "Weird and flowing!" + icon_state = "vox-casual-2" + item_state = "vox-casual-2" + +//Vox Accessories +/obj/item/clothing/accessory/storage/vox + name = "alien mesh" + desc = "An alien mesh. Seems to be made up mostly of pockets and writhing flesh." + icon_state = "webbing-vox" + slot = "vox" + + slots = 5 + +/obj/item/clothing/accessory/storage/vox/New() + ..() + hold.max_storage_space = slots * ITEMSIZE_COST_NORMAL + hold.max_w_class = ITEMSIZE_NORMAL \ No newline at end of file diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 43d79ecc97..39b34d9ae7 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -45,4 +45,5 @@ if(!C.stat) var/turf/T = get_turf(C) if(istype(T, /turf/space)) - qdel(C) + if(!prob(25)) + qdel(C) \ No newline at end of file diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 6781adb399..7f234b1455 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -136,6 +136,7 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT 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), 0, 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, "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), diff --git a/code/modules/events/shipping_error.dm b/code/modules/events/shipping_error.dm new file mode 100644 index 0000000000..ba1492e65a --- /dev/null +++ b/code/modules/events/shipping_error.dm @@ -0,0 +1,6 @@ +/datum/event/shipping_error/start() + var/datum/supply_order/O = new /datum/supply_order() + O.ordernum = supply_controller.ordernum + O.object = supply_controller.supply_packs[pick(supply_controller.supply_packs)] + O.orderedby = random_name(pick(MALE,FEMALE), species = "Human") + supply_controller.shoppinglist += O \ No newline at end of file diff --git a/code/modules/games/spaceball_cards.dm b/code/modules/games/spaceball_cards.dm index 11ded83550..9488192a72 100644 --- a/code/modules/games/spaceball_cards.dm +++ b/code/modules/games/spaceball_cards.dm @@ -14,7 +14,7 @@ P.name = "Spaceball Jones, [year] Brickburn Galaxy Trekers" P.card_icon = "spaceball_jones" else - var/language_type = pick(/datum/language/human,/datum/language/diona,/datum/language/tajaran,/datum/language/unathi) + var/language_type = pick(/datum/language/human,/datum/language/diona_local,/datum/language/tajaran,/datum/language/unathi) var/datum/language/L = new language_type() var/team = pick("Brickburn Galaxy Trekers","Mars Rovers", "Qerrbalak Saints", "Moghes Rockets", "Meralar Lightning", starsys_name+" Vixens", "Euphoric-Earth Alligators") P.name = "[L.get_random_name(pick(MALE,FEMALE))], [year - rand(0,50)] [team]" diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 1a89c9c0a4..edc796594c 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -52,9 +52,13 @@ var/list/reagent_data = seed.chems[rid] if(reagent_data && reagent_data.len) var/rtotal = reagent_data[1] + var/list/data = list() if(reagent_data.len > 1 && potency > 0) rtotal += round(potency/reagent_data[2]) - reagents.add_reagent(rid,max(1,rtotal)) + if(rid == "nutriment") + data[seed.seed_name] = max(1,rtotal) + + reagents.add_reagent(rid,max(1,rtotal),data) update_desc() if(reagents.total_volume > 0) bitesize = 1+round(reagents.total_volume / 2, 1) diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index 88fd37c466..fffbbda7d5 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -44,7 +44,7 @@ /obj/item/weapon/corncob/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() - if(istype(W, /obj/item/weapon/circular_saw) || istype(W, /obj/item/weapon/material/hatchet) || istype(W, /obj/item/weapon/material/kitchen/utensil/knife) || istype(W, /obj/item/weapon/material/knife) || istype(W, /obj/item/weapon/material/knife/ritual)) + if(istype(W, /obj/item/weapon/surgical/circular_saw) || istype(W, /obj/item/weapon/material/hatchet) || istype(W, /obj/item/weapon/material/kitchen/utensil/knife) || istype(W, /obj/item/weapon/material/knife) || istype(W, /obj/item/weapon/material/knife/ritual)) user << "You use [W] to fashion a pipe out of the corn cob!" new /obj/item/clothing/mask/smokable/pipe/cobpipe (user.loc) qdel(src) diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index e8f2cfa918..6961513b20 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -237,7 +237,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) plant_controller.add_plant(src) - if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/scalpel)) + if(istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/weapon/surgical/scalpel)) if(sampled) user << "\The [src] has already been sampled recently." return diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index ce48a8f11d..ddcde8a2b1 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -426,7 +426,7 @@ if(O.is_open_container()) return 0 - if(istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/weapon/scalpel)) + if(istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/weapon/surgical/scalpel)) if(!seed) user << "There is nothing to take a sample from in \the [src]." diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm index d9daa035d5..c404f61581 100644 --- a/code/modules/integrated_electronics/_defines.dm +++ b/code/modules/integrated_electronics/_defines.dm @@ -8,6 +8,13 @@ #define IC_SPAWN_DEFAULT 1 // If the circuit comes in the default circuit box. #define IC_SPAWN_RESEARCH 2 // If the circuit design will be autogenerated for RnD. +#define IC_FORMAT_STRING "\" +#define IC_FORMAT_NUMBER "\" +#define IC_FORMAT_REF "\" +#define IC_FORMAT_LIST "\" +#define IC_FORMAT_ANY "\" +#define IC_FORMAT_PULSE "\" + var/list/all_integrated_circuits = list() /proc/initialize_integrated_circuits_list() @@ -20,377 +27,19 @@ var/list/all_integrated_circuits = list() icon = 'icons/obj/electronic_assemblies.dmi' icon_state = "template" w_class = ITEMSIZE_TINY + var/obj/item/device/electronic_assembly/assembly = null // Reference to the assembly holding this circuit, if any. var/extended_desc = null var/list/inputs = list() var/list/outputs = list() var/list/activators = list() var/next_use = 0 //Uses world.time - var/complexity = 1 //This acts as a limitation on building machines, more resource-intensive components cost more 'space'. - var/cooldown_per_use = 1 SECOND - var/spawn_flags = null // Used for world initializing, see the #defines above. - var/category_text = "NO CATEGORY" // To show up on circuit printer, and perhaps other places. - var/autopulse = -1 // When input is received, the circuit will pulse itself if set to 1. 0 means it won't. -1 means it is permanently off. - -/obj/item/integrated_circuit/examine(mob/user) - ..() - to_chat(user, "This board has [inputs.len] input pin\s and [outputs.len] output pin\s.") - for(var/datum/integrated_io/input/I in inputs) - if(I.linked.len) - to_chat(user, "The [I] is connected to [I.get_linked_to_desc()].") - for(var/datum/integrated_io/output/O in outputs) - if(O.linked.len) - to_chat(user, "The [O] is connected to [O.get_linked_to_desc()].") - for(var/datum/integrated_io/activate/A in activators) - if(A.linked.len) - to_chat(user, "The [A] is connected to [A.get_linked_to_desc()].") - - interact(user) - -/obj/item/integrated_circuit/New() - setup_io(inputs, /datum/integrated_io/input) - setup_io(outputs, /datum/integrated_io/output) - setup_io(activators, /datum/integrated_io/activate) - ..() - -/obj/item/integrated_circuit/proc/setup_io(var/list/io_list, var/io_type) - var/list/io_list_copy = io_list.Copy() - io_list.Cut() - for(var/io_entry in io_list_copy) - io_list.Add(new io_type(src, io_entry, io_list_copy[io_entry])) - -/obj/item/integrated_circuit/proc/on_data_written() //Override this for special behaviour when new data gets pushed to the circuit. - return - -/obj/item/integrated_circuit/Destroy() - for(var/datum/integrated_io/I in inputs) - qdel(I) - for(var/datum/integrated_io/O in outputs) - qdel(O) - for(var/datum/integrated_io/A in activators) - qdel(A) - . = ..() - -/obj/item/integrated_circuit/nano_host() - if(istype(src.loc, /obj/item/device/electronic_assembly)) - var/obj/item/device/electronic_assembly/assembly = loc - return assembly.resolve_nano_host() - return ..() - -/obj/item/integrated_circuit/emp_act(severity) - for(var/datum/integrated_io/io in inputs + outputs + activators) - io.scramble() - -/obj/item/integrated_circuit/verb/rename_component() - set name = "Rename Circuit" - set category = "Object" - set desc = "Rename your circuit, useful to stay organized." - - var/mob/M = usr - if(!CanInteract(M, physical_state)) - return - - var/input = sanitizeSafe(input("What do you want to name the circuit?", "Rename", src.name) as null|text, MAX_NAME_LEN) - if(src && input && CanInteract(M, physical_state)) - to_chat(M, "The circuit '[src.name]' is now labeled '[input]'.") - name = input - -/obj/item/integrated_circuit/proc/get_pin_ref(var/pin_type, var/pin_number) - switch(pin_type) - if(IC_INPUT) - if(pin_number > inputs.len) - return null - return inputs[pin_number] - if(IC_OUTPUT) - if(pin_number > outputs.len) - return null - return outputs[pin_number] - if(IC_ACTIVATOR) - if(pin_number > activators.len) - return null - return activators[pin_number] - return null - -/obj/item/integrated_circuit/interact(mob/user) - if(!CanInteract(user, physical_state)) - return - - var/window_height = 350 - var/window_width = 600 - - //var/table_edge_width = "[(window_width - window_width * 0.1) / 4]px" - //var/table_middle_width = "[(window_width - window_width * 0.1) - (table_edge_width * 2)]px" - var/table_edge_width = "30%" - var/table_middle_width = "40%" - - var/HTML = list() - HTML += "[src.name]" - HTML += "
    " - HTML += "" - - HTML += "
    \[Refresh\] | " - HTML += "\[Rename\] | " - HTML += "\[Remove\]
    " - - HTML += "" - //HTML += "" - //HTML += "" - //HTML += "" - HTML += "" - HTML += "" - HTML += "" - HTML += "" - - var/column_width = 3 - var/row_height = max(inputs.len, outputs.len, 1) - - for(var/i = 1 to row_height) - HTML += "" - for(var/j = 1 to column_width) - var/datum/integrated_io/io = null - var/words = list() - var/height = 1 - switch(j) - if(1) - io = get_pin_ref(IC_INPUT, i) - if(io) - if(io.linked.len) - words += "[io.name] [io.display_data()]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - else - words += "[io.name] [io.display_data()]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - if(outputs.len > inputs.len) - height = 1 - if(2) - if(i == 1) - words += "[src.name]

    [src.desc]" - height = row_height - else - continue - if(3) - io = get_pin_ref(IC_OUTPUT, i) - if(io) - if(io.linked.len) - words += "[io.name] [io.display_data()]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - else - words += "[io.name] [io.display_data()]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - if(inputs.len > outputs.len) - height = 1 - HTML += "" - HTML += "" - - for(var/activator in activators) - var/datum/integrated_io/io = activator - var/words = list() - if(io.linked.len) - words += "[io.name]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - else - words += "[io.name]
    " - for(var/datum/integrated_io/linked in io.linked) - words += "\[[linked.name]\] \ - @ [linked.holder]
    " - HTML += "" - HTML += "" - HTML += "" - - HTML += "
    [jointext(words, null)]
    [jointext(words, null)]
    " - HTML += "
    " - - if(autopulse != -1) - HTML += "
    Meta Variables;" - HTML += "
    \[Autopulse\] = [autopulse ? "ON" : "OFF"]" - HTML += "
    " - - HTML += "
    Complexity: [complexity]" - HTML += "
    [extended_desc]" - - HTML += "" - user << browse(jointext(HTML, null), "window=circuit-\ref[src];size=[window_width]x[window_height];border=1;can_resize=1;can_close=1;can_minimize=1") - - onclose(user, "circuit-\ref[src]") - -/obj/item/integrated_circuit/Topic(href, href_list, state = physical_state) - if(..()) - return 1 - var/pin = locate(href_list["pin"]) in inputs + outputs + activators - - var/obj/held_item = usr.get_active_hand() - if(href_list["wire"]) - if(istype(held_item, /obj/item/device/integrated_electronics/wirer)) - var/obj/item/device/integrated_electronics/wirer/wirer = held_item - if(pin) - wirer.wire(pin, usr) - - else if(istype(held_item, /obj/item/device/integrated_electronics/debugger)) - var/obj/item/device/integrated_electronics/debugger/debugger = held_item - if(pin) - debugger.write_data(pin, usr) - else - to_chat(usr, "You can't do a whole lot without the proper tools.") - - if(href_list["examine"]) - examine(usr) - - if(href_list["rename"]) - rename_component(usr) - - if(href_list["autopulse"]) - if(autopulse != -1) - autopulse = !autopulse - - if(href_list["remove"]) - if(istype(held_item, /obj/item/weapon/screwdriver)) - disconnect_all() - var/turf/T = get_turf(src) - forceMove(T) - playsound(T, 'sound/items/Crowbar.ogg', 50, 1) - to_chat(usr, "You pop \the [src] out of the case, and slide it out.") - else - to_chat(usr, "You need a screwdriver to remove components.") - var/obj/item/device/electronic_assembly/ea = loc - if(istype(ea)) - ea.interact(usr) - return - - interact(usr) // To refresh the UI. - -/datum/integrated_io - var/name = "input/output" - var/obj/item/integrated_circuit/holder = null - var/weakref/data = null // This is a weakref, to reduce typecasts. Note that oftentimes numbers and text may also occupy this. - var/list/linked = list() - var/io_type = DATA_CHANNEL - -/datum/integrated_io/New(var/newloc, var/name, var/data) - ..() - src.name = name - src.data = data - holder = newloc - if(!istype(holder)) - message_admins("ERROR: An integrated_io ([src.name]) spawned without a valid holder! This is a bug.") - -/datum/integrated_io/Destroy() - disconnect() - data = null - holder = null - . = ..() - -/datum/integrated_io/nano_host() - return holder.nano_host() + var/complexity = 1 //This acts as a limitation on building machines, more resource-intensive components cost more 'space'. + var/cooldown_per_use = 1 SECOND // Circuits are limited in how many times they can be work()'d by this variable. + var/power_draw_per_use = 0 // How much power is drawn when work()'d. + var/power_draw_idle = 0 // How much power is drawn when doing nothing. + var/spawn_flags = null // Used for world initializing, see the #defines above. + var/category_text = "NO CATEGORY THIS IS A BUG" // To show up on circuit printer, and perhaps other places. + var/autopulse = -1 // When input is received, the circuit will pulse itself if set to 1. 0 means it won't. -1 means it is permanently off. + var/removable = TRUE // Determines if a circuit is removable from the assembly. -/datum/integrated_io/proc/data_as_type(var/as_type) - if(!isweakref(data)) - return - var/weakref/w = data - var/output = w.resolve() - return istype(output, as_type) ? output : null - -/datum/integrated_io/proc/display_data() - if(isnull(data)) - return "(null)" // Empty data means nothing to show. - if(istext(data)) - return "(\"[data]\")" // Wraps the 'string' in escaped quotes, so that people know it's a 'string'. - if(isweakref(data)) - var/weakref/w = data - var/atom/A = w.resolve() - //return A ? "([A.name] \[Ref\])" : "(null)" // For refs, we want just the name displayed. - return A ? "(\ref[A] \[Ref\])" : "(null)" - return "([data])" // Nothing special needed for numbers or other stuff. - -/datum/integrated_io/activate/display_data() - return "(\[pulse\])" - -/datum/integrated_io/proc/scramble() - if(isnull(data)) - return - if(isnum(data)) - write_data_to_pin(rand(-10000, 10000)) - if(istext(data)) - write_data_to_pin("ERROR") - push_data() - -/datum/integrated_io/activate/scramble() - push_data() - -/datum/integrated_io/proc/write_data_to_pin(var/new_data) - if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want. - data = new_data - holder.on_data_written() - -/datum/integrated_io/proc/push_data() - for(var/datum/integrated_io/io in linked) - io.write_data_to_pin(data) - -/datum/integrated_io/activate/push_data() - for(var/datum/integrated_io/io in linked) - io.holder.check_then_do_work() - -/datum/integrated_io/proc/pull_data() - for(var/datum/integrated_io/io in linked) - write_data_to_pin(io.data) - -/datum/integrated_io/proc/get_linked_to_desc() - if(linked.len) - return "the [english_list(linked)]" - return "nothing" - -/datum/integrated_io/proc/disconnect() - //First we iterate over everything we are linked to. - for(var/datum/integrated_io/their_io in linked) - //While doing that, we iterate them as well, and disconnect ourselves from them. - for(var/datum/integrated_io/their_linked_io in their_io.linked) - if(their_linked_io == src) - their_io.linked.Remove(src) - else - continue - //Now that we're removed from them, we gotta remove them from us. - src.linked.Remove(their_io) - -/datum/integrated_io/input - name = "input pin" - -/datum/integrated_io/output - name = "output pin" - -/datum/integrated_io/activate - name = "activation pin" - io_type = PULSE_CHANNEL - -/obj/item/integrated_circuit/proc/push_data() - for(var/datum/integrated_io/output/O in outputs) - O.push_data() - -/obj/item/integrated_circuit/proc/pull_data() - for(var/datum/integrated_io/input/I in inputs) - I.push_data() - -/obj/item/integrated_circuit/proc/check_then_do_work() - if(world.time < next_use) // All intergrated circuits have an internal cooldown, to protect from spam. - return - next_use = world.time + cooldown_per_use - do_work() - -/obj/item/integrated_circuit/proc/do_work() - return - -/obj/item/integrated_circuit/proc/disconnect_all() - for(var/datum/integrated_io/input/I in inputs) - I.disconnect() - for(var/datum/integrated_io/output/O in outputs) - O.disconnect() - for(var/datum/integrated_io/activate/A in activators) - A.disconnect() \ No newline at end of file diff --git a/code/modules/integrated_electronics/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm similarity index 51% rename from code/modules/integrated_electronics/assemblies.dm rename to code/modules/integrated_electronics/core/assemblies.dm index ff994aa43c..88b804f80a 100644 --- a/code/modules/integrated_electronics/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -11,6 +11,7 @@ var/max_components = IC_COMPONENTS_BASE var/max_complexity = IC_COMPLEXITY_BASE var/opened = 0 + var/obj/item/weapon/cell/device/battery = null // Internal cell which most circuits need to work. /obj/item/device/electronic_assembly/medium name = "electronic mechanism" @@ -23,8 +24,8 @@ name = "electronic machine" icon_state = "setup_large" w_class = ITEMSIZE_LARGE - max_components = IC_COMPONENTS_BASE * 3 - max_complexity = IC_COMPLEXITY_BASE * 3 + max_components = IC_COMPONENTS_BASE * 4 + max_complexity = IC_COMPLEXITY_BASE * 4 /obj/item/device/electronic_assembly/drone name = "electronic drone" @@ -41,6 +42,32 @@ max_complexity = IC_COMPLEXITY_BASE / 2 var/obj/item/weapon/implant/integrated_circuit/implant = null +/obj/item/device/electronic_assembly/New() + ..() + battery = new(src) + processing_objects |= src + +/obj/item/device/electronic_assembly/Destroy() + battery = null + processing_objects -= src + for(var/atom/movable/AM in contents) + qdel(AM) + ..() + +/obj/item/device/electronic_assembly/process() + handle_idle_power() + +/obj/item/device/electronic_assembly/proc/handle_idle_power() + // First we generate power. + for(var/obj/item/integrated_circuit/passive/power/P in contents) + P.make_energy() + + // Now spend it. + for(var/obj/item/integrated_circuit/IC in contents) + if(IC.power_draw_idle) + if(!draw_power(IC.power_draw_idle)) + IC.power_fail() + /obj/item/device/electronic_assembly/implant/update_icon() ..() implant.icon_state = icon_state @@ -70,13 +97,18 @@ HTML += "
    \[Refresh\] | " HTML += "\[Rename\]
    " HTML += "[total_parts]/[max_components] ([round((total_parts / max_components) * 100, 0.1)]%) space taken up in the assembly.
    " - HTML += "[total_complexity]/[max_complexity] ([round((total_complexity / max_complexity) * 100, 0.1)]%) maximum complexity." + HTML += "[total_complexity]/[max_complexity] ([round((total_complexity / max_complexity) * 100, 0.1)]%) maximum complexity.
    " + if(battery) + HTML += "[round(battery.charge, 0.1)]/[battery.maxcharge] ([round(battery.percent(), 0.1)]%) cell charge. \[Remove\]" + else + HTML += "No powercell detected!" HTML += "

    " HTML += "Components;
    " for(var/obj/item/integrated_circuit/circuit in contents) HTML += "[circuit.name] | " HTML += "\[Rename\] | " - HTML += "\[Remove\]" + if(circuit.removable) + HTML += "\[Remove\]" HTML += "
    " HTML += "" @@ -89,6 +121,16 @@ if(href_list["rename"]) rename(usr) + if(href_list["remove_cell"]) + if(!battery) + to_chat(usr, "There's no power cell to remove from \the [src].") + else + var/turf/T = get_turf(src) + battery.forceMove(T) + playsound(T, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(usr, "You pull \the [battery] out of \the [src]'s power supplier.") + battery = null + interact(usr) // To refresh the UI. /obj/item/device/electronic_assembly/verb/rename() @@ -117,39 +159,84 @@ else icon_state = initial(icon_state) +/obj/item/device/electronic_assembly/GetAccess() + . = list() + for(var/obj/item/integrated_circuit/part in contents) + . |= part.GetAccess() + +/obj/item/device/electronic_assembly/GetIdCard() + . = list() + for(var/obj/item/integrated_circuit/part in contents) + var/id_card = part.GetIdCard() + if(id_card) + return id_card + /obj/item/device/electronic_assembly/examine(mob/user) . = ..(user, 1) if(.) - for(var/obj/item/integrated_circuit/output/screen/S in contents) - if(S.stuff_to_display) - to_chat(user, "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'.") + for(var/obj/item/integrated_circuit/IC in contents) + IC.external_examine(user) + // for(var/obj/item/integrated_circuit/output/screen/S in contents) + // if(S.stuff_to_display) + // to_chat(user, "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'.") if(opened) interact(user) +/obj/item/device/electronic_assembly/proc/get_part_complexity() + . = 0 + for(var/obj/item/integrated_circuit/part in contents) + . += part.complexity + +/obj/item/device/electronic_assembly/proc/get_part_size() + . = 0 + for(var/obj/item/integrated_circuit/part in contents) + . += part.w_class + +// Returns true if the circuit made it inside. +/obj/item/device/electronic_assembly/proc/add_circuit(var/obj/item/integrated_circuit/IC, var/mob/user) + if(!opened) + to_chat(user, "\The [src] isn't opened, so you can't put anything inside. Try using a crowbar.") + return FALSE + + if(IC.w_class > src.w_class) + to_chat(user, "\The [IC] is way too big to fit into \the [src].") + return FALSE + + var/total_part_size = get_part_size() + var/total_complexity = get_part_complexity() + + if((total_part_size + IC.w_class) > max_components) + to_chat(user, "You can't seem to add the '[IC.name]', as there's insufficient space.") + return FALSE + if((total_complexity + IC.complexity) > max_complexity) + to_chat(user, "You can't seem to add the '[IC.name]', since this setup's too complicated for the case.") + return FALSE + + if(!IC.forceMove(src)) + return FALSE + + IC.assembly = src + + return TRUE + +/obj/item/device/electronic_assembly/afterattack(atom/target, mob/user, proximity) + if(proximity) + var/scanned = FALSE + for(var/obj/item/integrated_circuit/input/sensor/S in contents) + S.set_pin_data(IC_OUTPUT, 1, weakref(target)) + S.check_then_do_work() + scanned = TRUE + if(scanned) + visible_message("\The [user] waves \the [src] around [target].") + /obj/item/device/electronic_assembly/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/integrated_circuit)) - if(!opened) - to_chat(user, "\The [src] isn't opened, so you can't put anything inside. Try using a crowbar.") + if(!user.unEquip(I)) return 0 - var/obj/item/integrated_circuit/IC = I - var/total_parts = 0 - var/total_complexity = 0 - for(var/obj/item/integrated_circuit/part in contents) - total_parts++ - total_complexity = total_complexity + part.complexity - - if( (total_parts + 1) > max_components) - to_chat(user, "You can't seem to add this [IC.name], since there's no more room.") - return 0 - if( (total_complexity + IC.complexity) > max_complexity) - to_chat(user, "You can't seem to add this [IC.name], since this setup's too complicated for the case.") - return 0 - - to_chat(user, "You slide \the [IC] inside \the [src].") - user.drop_item() - IC.forceMove(src) - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) - interact(user) + if(add_circuit(I, user)) + to_chat(user, "You slide \the [I] inside \the [src].") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + interact(user) else if(istype(I, /obj/item/weapon/crowbar)) playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) opened = !opened @@ -161,6 +248,21 @@ else to_chat(user, "\The [src] isn't opened, so you can't fiddle with the internal components. \ Try using a crowbar.") + else if(istype(I, /obj/item/weapon/cell/device)) + if(!opened) + to_chat(user, "\The [src] isn't opened, so you can't put anything inside. Try using a crowbar.") + return FALSE + if(battery) + to_chat(user, "\The [src] already has \a [battery] inside. Remove it first if you want to replace it.") + return FALSE + var/obj/item/weapon/cell/device/cell = I + user.drop_item(cell) + cell.forceMove(src) + battery = cell + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + to_chat(user, "You slot \the [cell] inside \the [src]'s power supplier.") + interact(user) + else return ..() @@ -179,4 +281,16 @@ /obj/item/device/electronic_assembly/emp_act(severity) ..() for(var/atom/movable/AM in contents) - AM.emp_act(severity) \ No newline at end of file + AM.emp_act(severity) + +// Returns true if power was successfully drawn. +/obj/item/device/electronic_assembly/proc/draw_power(amount) + if(battery && battery.checked_use(amount * CELLRATE)) + return TRUE + return FALSE + +// Ditto for giving. +/obj/item/device/electronic_assembly/proc/give_power(amount) + if(battery && battery.give(amount * CELLRATE)) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/integrated_electronics/core/helpers.dm b/code/modules/integrated_electronics/core/helpers.dm new file mode 100644 index 0000000000..c98d74e79f --- /dev/null +++ b/code/modules/integrated_electronics/core/helpers.dm @@ -0,0 +1,44 @@ +/obj/item/integrated_circuit/proc/setup_io(var/list/io_list, var/io_type) + var/list/io_list_copy = io_list.Copy() + io_list.Cut() + for(var/io_entry in io_list_copy) + io_list.Add(new io_type(src, io_entry, io_list_copy[io_entry])) + +/obj/item/integrated_circuit/proc/set_pin_data(var/pin_type, var/pin_number, var/new_data) + var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number) + return pin.write_data_to_pin(new_data) + +/obj/item/integrated_circuit/proc/get_pin_data(var/pin_type, var/pin_number) + var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number) + return pin.get_data() + +/obj/item/integrated_circuit/proc/get_pin_data_as_type(var/pin_type, var/pin_number, var/as_type) + var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number) + return pin.data_as_type(as_type) + +/obj/item/integrated_circuit/proc/activate_pin(var/pin_number) + var/datum/integrated_io/activate/A = activators[pin_number] + A.push_data() + +/datum/integrated_io/proc/get_data() + if(isnull(data)) + return + if(isweakref(data)) + return data.resolve() + return data + +/obj/item/integrated_circuit/proc/get_pin_ref(var/pin_type, var/pin_number) + switch(pin_type) + if(IC_INPUT) + if(pin_number > inputs.len) + return null + return inputs[pin_number] + if(IC_OUTPUT) + if(pin_number > outputs.len) + return null + return outputs[pin_number] + if(IC_ACTIVATOR) + if(pin_number > activators.len) + return null + return activators[pin_number] + return null diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm new file mode 100644 index 0000000000..87bb4cd182 --- /dev/null +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -0,0 +1,282 @@ +/* + Integrated circuits are essentially modular machines. Each circuit has a specific function, and combining them inside Electronic Assemblies allows +a creative player the means to solve many problems. Circuits are held inside an electronic assembly, and are wired using special tools. +*/ + +/obj/item/integrated_circuit/examine(mob/user) + . = ..() + external_examine(user) + +// This should be used when someone is examining while the case is opened. +/obj/item/integrated_circuit/proc/internal_examine(mob/user) + to_chat(user, "This board has [inputs.len] input pin\s, [outputs.len] output pin\s and [activators.len] activation pin\s.") + for(var/datum/integrated_io/input/I in inputs) + if(I.linked.len) + to_chat(user, "The '[I]' is connected to [I.get_linked_to_desc()].") + for(var/datum/integrated_io/output/O in outputs) + if(O.linked.len) + to_chat(user, "The '[O]' is connected to [O.get_linked_to_desc()].") + for(var/datum/integrated_io/activate/A in activators) + if(A.linked.len) + to_chat(user, "The '[A]' is connected to [A.get_linked_to_desc()].") + any_examine(user) + interact(user) + +// This should be used when someone is examining from an 'outside' perspective, e.g. reading a screen or LED. +/obj/item/integrated_circuit/proc/external_examine(mob/user) + any_examine(user) + +/obj/item/integrated_circuit/proc/any_examine(mob/user) + return + +/obj/item/integrated_circuit/New() + setup_io(inputs, /datum/integrated_io/input) + setup_io(outputs, /datum/integrated_io/output) + setup_io(activators, /datum/integrated_io/activate) + ..() + +/obj/item/integrated_circuit/proc/on_data_written() //Override this for special behaviour when new data gets pushed to the circuit. + return + +/obj/item/integrated_circuit/Destroy() + for(var/datum/integrated_io/I in inputs) + qdel(I) + for(var/datum/integrated_io/O in outputs) + qdel(O) + for(var/datum/integrated_io/A in activators) + qdel(A) + . = ..() + +/obj/item/integrated_circuit/nano_host() + if(istype(src.loc, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/assembly = loc + return assembly.resolve_nano_host() + return ..() + +/obj/item/integrated_circuit/emp_act(severity) + for(var/datum/integrated_io/io in inputs + outputs + activators) + io.scramble() + +/obj/item/integrated_circuit/verb/rename_component() + set name = "Rename Circuit" + set category = "Object" + set desc = "Rename your circuit, useful to stay organized." + + var/mob/M = usr + if(!CanInteract(M, physical_state)) + return + + var/input = sanitizeSafe(input("What do you want to name the circuit?", "Rename", src.name) as null|text, MAX_NAME_LEN) + if(src && input && CanInteract(M, physical_state)) + to_chat(M, "The circuit '[src.name]' is now labeled '[input]'.") + name = input + +/obj/item/integrated_circuit/interact(mob/user) + if(!CanInteract(user, physical_state)) + return + + var/window_height = 350 + var/window_width = 600 + + //var/table_edge_width = "[(window_width - window_width * 0.1) / 4]px" + //var/table_middle_width = "[(window_width - window_width * 0.1) - (table_edge_width * 2)]px" + var/table_edge_width = "30%" + var/table_middle_width = "40%" + + var/HTML = list() + HTML += "[src.name]" + HTML += "
    " + HTML += "" + + HTML += "
    \[Refresh\] | " + HTML += "\[Rename\] | " + HTML += "\[Remove\]
    " + + HTML += "" + //HTML += "" + //HTML += "" + //HTML += "" + HTML += "" + HTML += "" + HTML += "" + HTML += "" + + var/column_width = 3 + var/row_height = max(inputs.len, outputs.len, 1) + + for(var/i = 1 to row_height) + HTML += "" + for(var/j = 1 to column_width) + var/datum/integrated_io/io = null + var/words = list() + var/height = 1 + switch(j) + if(1) + io = get_pin_ref(IC_INPUT, i) + if(io) + if(io.linked.len) + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + else + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + if(outputs.len > inputs.len) + height = 1 + if(2) + if(i == 1) + words += "[src.name]

    [src.desc]" + height = row_height + else + continue + if(3) + io = get_pin_ref(IC_OUTPUT, i) + if(io) + if(io.linked.len) + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + else + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + if(inputs.len > outputs.len) + height = 1 + HTML += "" + HTML += "" + + for(var/activator in activators) + var/datum/integrated_io/io = activator + var/words = list() + if(io.linked.len) + words += "[io.name]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + else + words += "[io.name]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + HTML += "" + HTML += "" + HTML += "" + + HTML += "
    [jointext(words, null)]
    [jointext(words, null)]
    " + HTML += "
    " + + if(autopulse != -1) + HTML += "
    Meta Variables;" + HTML += "
    \[Autopulse\] = [autopulse ? "ON" : "OFF"]" + HTML += "
    " + + HTML += "
    Complexity: [complexity]" + if(power_draw_idle) + HTML += "
    Power Draw: [power_draw_idle] W (Idle)" + if(power_draw_per_use) + HTML += "
    Power Draw: [power_draw_per_use] W (Active)" // Borgcode says that powercells' checked_use() takes joules as input. + HTML += "
    [extended_desc]" + + HTML += "" + user << browse(jointext(HTML, null), "window=circuit-\ref[src];size=[window_width]x[window_height];border=1;can_resize=1;can_close=1;can_minimize=1") + + onclose(user, "circuit-\ref[src]") + +/obj/item/integrated_circuit/Topic(href, href_list, state = physical_state) + if(..()) + return 1 + var/pin = locate(href_list["pin"]) in inputs + outputs + activators + + var/obj/held_item = usr.get_active_hand() + if(href_list["wire"]) + if(istype(held_item, /obj/item/device/integrated_electronics/wirer)) + var/obj/item/device/integrated_electronics/wirer/wirer = held_item + if(pin) + wirer.wire(pin, usr) + + else if(istype(held_item, /obj/item/device/integrated_electronics/debugger)) + var/obj/item/device/integrated_electronics/debugger/debugger = held_item + if(pin) + debugger.write_data(pin, usr) + else + to_chat(usr, "You can't do a whole lot without the proper tools.") + + if(href_list["examine"]) + examine(usr) + + if(href_list["rename"]) + rename_component(usr) + + if(href_list["autopulse"]) + if(autopulse != -1) + autopulse = !autopulse + + if(href_list["remove"]) + if(istype(held_item, /obj/item/weapon/screwdriver)) + if(!removable) + to_chat(usr, "\The [src] seems to be permanently attached to the case.") + return + disconnect_all() + var/turf/T = get_turf(src) + forceMove(T) + assembly = null + playsound(T, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(usr, "You pop \the [src] out of the case, and slide it out.") + else + to_chat(usr, "You need a screwdriver to remove components.") + var/obj/item/device/electronic_assembly/ea = loc + if(istype(ea)) + ea.interact(usr) + return + + interact(usr) // To refresh the UI. + +/obj/item/integrated_circuit/proc/push_data() + for(var/datum/integrated_io/output/O in outputs) + O.push_data() + +/obj/item/integrated_circuit/proc/pull_data() + for(var/datum/integrated_io/input/I in inputs) + I.push_data() + +/obj/item/integrated_circuit/proc/draw_idle_power() + if(assembly) + return assembly.draw_power(power_draw_idle) + +// Override this for special behaviour when there's no power left. +/obj/item/integrated_circuit/proc/power_fail() + return + +// Returns true if there's enough power to work(). +/obj/item/integrated_circuit/proc/check_power() + if(!assembly) + return FALSE // Not in an assembly, therefore no power. + if(assembly.draw_power(power_draw_per_use)) + return TRUE // Battery has enough. + return FALSE // Not enough power. + +/obj/item/integrated_circuit/proc/check_then_do_work() + if(world.time < next_use) // All intergrated circuits have an internal cooldown, to protect from spam. + return + if(power_draw_per_use) + if(!check_power()) + power_fail() + return + next_use = world.time + cooldown_per_use + do_work() + +/obj/item/integrated_circuit/proc/do_work() + return + +/obj/item/integrated_circuit/proc/disconnect_all() + for(var/datum/integrated_io/input/I in inputs) + I.disconnect() + for(var/datum/integrated_io/output/O in outputs) + O.disconnect() + for(var/datum/integrated_io/activate/A in activators) + A.disconnect() diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm new file mode 100644 index 0000000000..dc6d48e303 --- /dev/null +++ b/code/modules/integrated_electronics/core/pins.dm @@ -0,0 +1,139 @@ +/* + Pins both hold data for circuits, as well move data between them. Some also cause circuits to do their function. DATA_CHANNEL pins are the data holding/moving kind, +where as PULSE_CHANNEL causes circuits to work() when their pulse hits them. + + +A visualization of how pins work is below. Imagine the below image involves an addition circuit. +When the bottom pin, the activator, receives a pulse, all the numbers on the left (input) get added, and the answer goes on the right side (output). + +Inputs Outputs + +A [2]\ /[8] result +B [1]-\|++|/ +C [4]-/|++| +D [1]/ || + || + Activator + + + +*/ +/datum/integrated_io + var/name = "input/output" + var/obj/item/integrated_circuit/holder = null + var/weakref/data = null // This is a weakref, to reduce typecasts. Note that oftentimes numbers and text may also occupy this. + var/list/linked = list() + var/io_type = DATA_CHANNEL + +/datum/integrated_io/New(var/newloc, var/name, var/data) + ..() + src.name = name + src.data = data + holder = newloc + if(!istype(holder)) + message_admins("ERROR: An integrated_io ([src.name]) spawned without a valid holder! This is a bug.") + +/datum/integrated_io/Destroy() + disconnect() + data = null + holder = null + . = ..() + +/datum/integrated_io/nano_host() + return holder.nano_host() + + +/datum/integrated_io/proc/data_as_type(var/as_type) + if(!isweakref(data)) + return + var/weakref/w = data + var/output = w.resolve() + return istype(output, as_type) ? output : null + +/datum/integrated_io/proc/display_data() + if(isnull(data)) + return "(null)" // Empty data means nothing to show. + if(istext(data)) + return "(\"[data]\")" // Wraps the 'string' in escaped quotes, so that people know it's a 'string'. + if(isweakref(data)) + var/weakref/w = data + var/atom/A = w.resolve() + //return A ? "([A.name] \[Ref\])" : "(null)" // For refs, we want just the name displayed. + return A ? "(\ref[A] \[Ref\])" : "(null)" + return "([data])" // Nothing special needed for numbers or other stuff. + +/datum/integrated_io/activate/display_data() + return "(\[pulse\])" + +/datum/integrated_io/proc/display_pin_type() + return IC_FORMAT_ANY + +/datum/integrated_io/activate/display_pin_type() + return IC_FORMAT_PULSE + +/datum/integrated_io/proc/scramble() + if(isnull(data)) + return + if(isnum(data)) + write_data_to_pin(rand(-10000, 10000)) + if(istext(data)) + write_data_to_pin("ERROR") + push_data() + +/datum/integrated_io/activate/scramble() + push_data() + +/datum/integrated_io/proc/write_data_to_pin(var/new_data) + if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want. + data = new_data + holder.on_data_written() + +/datum/integrated_io/proc/push_data() + for(var/datum/integrated_io/io in linked) + io.write_data_to_pin(data) + +/datum/integrated_io/activate/push_data() + for(var/datum/integrated_io/io in linked) + io.holder.check_then_do_work() + +/datum/integrated_io/proc/pull_data() + for(var/datum/integrated_io/io in linked) + write_data_to_pin(io.data) + +/datum/integrated_io/proc/get_linked_to_desc() + if(linked.len) + return "the [english_list(linked)]" + return "nothing" + +/datum/integrated_io/proc/disconnect() + //First we iterate over everything we are linked to. + for(var/datum/integrated_io/their_io in linked) + //While doing that, we iterate them as well, and disconnect ourselves from them. + for(var/datum/integrated_io/their_linked_io in their_io.linked) + if(their_linked_io == src) + their_io.linked.Remove(src) + else + continue + //Now that we're removed from them, we gotta remove them from us. + src.linked.Remove(their_io) + +/datum/integrated_io/input + name = "input pin" + +/datum/integrated_io/output + name = "output pin" + +/datum/integrated_io/activate + name = "activation pin" + io_type = PULSE_CHANNEL + +/datum/integrated_io/list + name = "list pin" + +/datum/integrated_io/list/write_data_to_pin(var/new_data) + if(islist(new_data)) + data = new_data + holder.on_data_written() + +/datum/integrated_io/list/display_pin_type() + return IC_FORMAT_LIST \ No newline at end of file diff --git a/code/modules/integrated_electronics/tools.dm b/code/modules/integrated_electronics/core/tools.dm similarity index 71% rename from code/modules/integrated_electronics/tools.dm rename to code/modules/integrated_electronics/core/tools.dm index 6c76b9b4ff..21a56f014d 100644 --- a/code/modules/integrated_electronics/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -20,6 +20,9 @@ icon_state = "wirer-[mode]" /obj/item/device/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user) + if(!io.holder.assembly) + to_chat(user, "\The [io.holder] needs to be secured inside an assembly first.") + return if(mode == WIRE) selected_io = io to_chat(user, "You attach a data wire to \the [selected_io.holder]'s [selected_io.name] data channel.") @@ -33,6 +36,9 @@ to_chat(user, "Those two types of channels are incompatable. The first is a [selected_io.io_type], \ while the second is a [io.io_type].") return + if(io.holder.assembly && io.holder.assembly != selected_io.holder.assembly) + to_chat(user, "Both \the [io.holder] and \the [selected_io.holder] need to be inside the same assembly.") + return selected_io.linked |= io io.linked |= selected_io @@ -191,6 +197,7 @@ new /obj/item/weapon/storage/bag/circuits/mini/reagents(src) new /obj/item/weapon/storage/bag/circuits/mini/transfer(src) new /obj/item/weapon/storage/bag/circuits/mini/converter(src) + new /obj/item/weapon/storage/bag/circuits/mini/power(src) new /obj/item/device/electronic_assembly(src) new /obj/item/device/integrated_electronics/wirer(src) @@ -202,11 +209,24 @@ /obj/item/weapon/storage/bag/circuits/all/New() ..() spawn(2 SECONDS) // So the list has time to initialize. - for(var/obj/item/integrated_circuit/IC in all_integrated_circuits) - for(var/i = 1 to 10) - new IC.type(src) + new /obj/item/weapon/storage/bag/circuits/mini/arithmetic/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/trig/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/input/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/output/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/memory/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/logic/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/smart/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/manipulation/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/time/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/reagents/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/transfer/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/converter/all(src) + new /obj/item/weapon/storage/bag/circuits/mini/power/all(src) new /obj/item/device/electronic_assembly(src) + new /obj/item/device/electronic_assembly/medium(src) + new /obj/item/device/electronic_assembly/large(src) + new /obj/item/device/electronic_assembly/drone(src) new /obj/item/device/integrated_electronics/wirer(src) new /obj/item/device/integrated_electronics/debugger(src) new /obj/item/weapon/crowbar(src) @@ -219,16 +239,20 @@ w_class = 2 display_contents_with_number = 1 can_hold = list(/obj/item/integrated_circuit) + var/spawn_flags_to_use = IC_SPAWN_DEFAULT /obj/item/weapon/storage/bag/circuits/mini/arithmetic name = "arithmetic circuit box" desc = "Warning: Contains math." icon_state = "box_arithmetic" +/obj/item/weapon/storage/bag/circuits/mini/arithmetic/all // Don't believe this will ever be needed. + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/arithmetic/New() ..() for(var/obj/item/integrated_circuit/arithmetic/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -239,10 +263,13 @@ desc = "Danger: Contains more math." icon_state = "box_trig" +/obj/item/weapon/storage/bag/circuits/mini/trig/all // Ditto + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/trig/New() ..() for(var/obj/item/integrated_circuit/trig/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -253,10 +280,13 @@ desc = "Tell these circuits everything you know." icon_state = "box_input" +/obj/item/weapon/storage/bag/circuits/mini/input/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/input/New() ..() for(var/obj/item/integrated_circuit/input/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -267,10 +297,13 @@ desc = "Circuits to interface with the world beyond itself." icon_state = "box_output" +/obj/item/weapon/storage/bag/circuits/mini/output/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/output/New() ..() for(var/obj/item/integrated_circuit/output/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -281,25 +314,30 @@ desc = "Machines can be quite forgetful without these." icon_state = "box_memory" +/obj/item/weapon/storage/bag/circuits/mini/memory/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/memory/New() ..() for(var/obj/item/integrated_circuit/memory/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() - /obj/item/weapon/storage/bag/circuits/mini/logic name = "logic circuit box" desc = "May or may not be Turing complete." icon_state = "box_logic" +/obj/item/weapon/storage/bag/circuits/mini/logic/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/logic/New() ..() for(var/obj/item/integrated_circuit/logic/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -310,10 +348,13 @@ desc = "No time machine parts, sadly." icon_state = "box_time" +/obj/item/weapon/storage/bag/circuits/mini/time/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/time/New() ..() for(var/obj/item/integrated_circuit/time/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -324,10 +365,13 @@ desc = "Unlike most electronics, these circuits are supposed to come in contact with liquids." icon_state = "box_reagents" +/obj/item/weapon/storage/bag/circuits/mini/reagents/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/reagents/New() ..() for(var/obj/item/integrated_circuit/reagent/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -338,10 +382,13 @@ desc = "Useful for moving data representing something arbitrary to another arbitrary virtual place." icon_state = "box_transfer" +/obj/item/weapon/storage/bag/circuits/mini/transfer/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/transfer/New() ..() for(var/obj/item/integrated_circuit/transfer/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() @@ -352,10 +399,66 @@ desc = "Transform one piece of data to another type of data with these." icon_state = "box_converter" +/obj/item/weapon/storage/bag/circuits/mini/converter/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + /obj/item/weapon/storage/bag/circuits/mini/converter/New() ..() for(var/obj/item/integrated_circuit/converter/IC in all_integrated_circuits) - if(IC.spawn_flags & IC_SPAWN_DEFAULT) + if(IC.spawn_flags & spawn_flags_to_use) + for(var/i = 1 to 3) + new IC.type(src) + make_exact_fit() + +/obj/item/weapon/storage/bag/circuits/mini/smart + name = "smart box" + desc = "Sentience not included." + icon_state = "box_ai" + +/obj/item/weapon/storage/bag/circuits/mini/smart/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/weapon/storage/bag/circuits/mini/smart/New() + ..() + for(var/obj/item/integrated_circuit/smart/IC in all_integrated_circuits) + if(IC.spawn_flags & spawn_flags_to_use) + for(var/i = 1 to 3) + new IC.type(src) + make_exact_fit() + +/obj/item/weapon/storage/bag/circuits/mini/manipulation + name = "manipulation box" + desc = "Make your machines actually useful with these." + icon_state = "box_manipulation" + +/obj/item/weapon/storage/bag/circuits/mini/manipulation/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/weapon/storage/bag/circuits/mini/manipulation/New() + ..() + for(var/obj/item/integrated_circuit/manipulation/IC in all_integrated_circuits) + if(IC.spawn_flags & spawn_flags_to_use) + for(var/i = 1 to 3) + new IC.type(src) + make_exact_fit() + + +/obj/item/weapon/storage/bag/circuits/mini/power + name = "power circuit box" + desc = "Electronics generally require electricity." + icon_state = "box_power" + +/obj/item/weapon/storage/bag/circuits/mini/power/all + spawn_flags_to_use = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/weapon/storage/bag/circuits/mini/power/New() + ..() + for(var/obj/item/integrated_circuit/passive/power/IC in all_integrated_circuits) + if(IC.spawn_flags & spawn_flags_to_use) + for(var/i = 1 to 3) + new IC.type(src) + for(var/obj/item/integrated_circuit/power/IC in all_integrated_circuits) + if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 3) new IC.type(src) make_exact_fit() \ No newline at end of file diff --git a/code/modules/integrated_electronics/data_transfer.dm b/code/modules/integrated_electronics/data_transfer.dm deleted file mode 100644 index 7e37995df5..0000000000 --- a/code/modules/integrated_electronics/data_transfer.dm +++ /dev/null @@ -1,85 +0,0 @@ -/obj/item/integrated_circuit/transfer - category_text = "Data Transfer" - autopulse = 1 - -/obj/item/integrated_circuit/transfer/on_data_written() - if(autopulse == 1) - check_then_do_work() - -/obj/item/integrated_circuit/transfer/splitter - name = "splitter" - desc = "Splits incoming data into all of the output pins." - icon_state = "splitter" - complexity = 3 - inputs = list("data to split") - outputs = list("A","B") - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/transfer/splitter/medium - name = "four splitter" - icon_state = "splitter4" - complexity = 5 - outputs = list("A","B","C","D") - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/transfer/splitter/large - name = "eight splitter" - icon_state = "splitter8" - complexity = 9 - outputs = list("A","B","C","D","E","F","G","H") - spawn_flags = IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/transfer/splitter/do_work() - var/datum/integrated_io/I = inputs[1] - for(var/datum/integrated_io/output/O in outputs) - O.data = I.data - -/obj/item/integrated_circuit/transfer/activator_splitter - name = "activator splitter" - desc = "Splits incoming activation pulses into all of the output pins." - icon_state = "splitter" - complexity = 3 - activators = list( - "incoming pulse", - "outgoing pulse A", - "outgoing pulse B" - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/transfer/activator_splitter/do_work() - for(var/datum/integrated_io/activate/A in outputs) - if(A == activators[1]) - continue - if(A.linked.len) - for(var/datum/integrated_io/activate/target in A.linked) - target.holder.check_then_do_work() - -/obj/item/integrated_circuit/transfer/activator_splitter/medium - name = "four activator splitter" - icon_state = "splitter4" - complexity = 5 - activators = list( - "incoming pulse", - "outgoing pulse A", - "outgoing pulse B", - "outgoing pulse C", - "outgoing pulse D" - ) - spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - -/obj/item/integrated_circuit/transfer/activator_splitter/large - name = "eight activator splitter" - icon_state = "splitter4" - complexity = 9 - activators = list( - "incoming pulse", - "outgoing pulse A", - "outgoing pulse B", - "outgoing pulse C", - "outgoing pulse D", - "outgoing pulse E", - "outgoing pulse F", - "outgoing pulse G", - "outgoing pulse H" - ) - spawn_flags = IC_SPAWN_RESEARCH \ No newline at end of file diff --git a/code/modules/integrated_electronics/passive/passive.dm b/code/modules/integrated_electronics/passive/passive.dm new file mode 100644 index 0000000000..02f03d48d7 --- /dev/null +++ b/code/modules/integrated_electronics/passive/passive.dm @@ -0,0 +1,7 @@ +// 'Passive' components do not have any pins, and instead contribute in some form to the assembly holding them. +/obj/item/integrated_circuit/passive + inputs = list() + outputs = list() + activators = list() + power_draw_idle = 0 + power_draw_per_use = 0 \ No newline at end of file diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm new file mode 100644 index 0000000000..9e08a96d24 --- /dev/null +++ b/code/modules/integrated_electronics/passive/power.dm @@ -0,0 +1,109 @@ + +/obj/item/integrated_circuit/passive/power + name = "power thingy" + desc = "Does power stuff." + complexity = 5 + origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 2, TECH_DATA = 2) + category_text = "Power - Passive" + +/obj/item/integrated_circuit/passive/power/proc/make_energy() + return + +// For calculators. +/obj/item/integrated_circuit/passive/power/solar_cell + name = "tiny photovoltaic cell" + desc = "It's a very tiny solar cell, generally used in calculators." + extended_desc = "The cell generates 1W of energy per second in optimal lighting conditions. Less light will result in less power being generated." + icon_state = "solar_cell" + complexity = 8 + origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + var/max_power = 1 + +/obj/item/integrated_circuit/passive/power/solar_cell/make_energy() + var/atom/movable/lighting_overlay/light = locate(/atom/movable/lighting_overlay) in get_turf(src) + var/light_amount = 1 // Unsimulated tiles are pretend-lit, so we need to be pretend too if that somehow happens. + if(light) + light_amount = (light.lum_r + light.lum_g + light.lum_b) / 3 + + var/adjusted_power = max(max_power * light_amount, 0) + adjusted_power = round(adjusted_power, 0.1) + if(adjusted_power) + if(assembly) + assembly.give_power(adjusted_power) + +// For implants. +/obj/item/integrated_circuit/passive/power/metabolic_siphon + name = "metabolic siphon" + desc = "A complicated piece of technology which converts bodily nutriments of a host into electricity." + extended_desc = "The siphon generates 10W of energy, so long as the siphon exists inside a biological entity. The entity will feel an increased \ + appetite and will need to eat more often due to this. This device will fail if used inside synthetic entities." + icon_state = "setup_implant" + complexity = 10 + origin_tech = list(TECH_POWER = 4, TECH_ENGINEERING = 4, TECH_DATA = 4, TECH_BIO = 5) + spawn_flags = IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/passive/power/metabolic_siphon/proc/test_validity(var/mob/living/carbon/human/host) + if(!host || host.isSynthetic() || host.stat == DEAD || host.nutrition <= 10) + return FALSE // Robots and dead people don't have a metabolism. + return TRUE + +/obj/item/integrated_circuit/passive/power/metabolic_siphon/make_energy() + var/mob/living/carbon/human/host = null + if(assembly && istype(assembly, /obj/item/device/electronic_assembly/implant)) + var/obj/item/device/electronic_assembly/implant/implant_assembly = assembly + if(implant_assembly.implant.imp_in) + host = implant_assembly.implant.imp_in + if(host && test_validity(host)) + assembly.give_power(10) + host.nutrition = max(host.nutrition - DEFAULT_HUNGER_FACTOR, 0) + +/obj/item/integrated_circuit/passive/power/metabolic_siphon/synthetic + name = "internal energy siphon" + desc = "A small circuit designed to be connected to an internal power wire inside a synthetic entity." + extended_desc = "The siphon generates 10W of energy, so long as the siphon exists inside a synthetic entity. The entity need to recharge \ + more often due to this. This device will fail if used inside organic entities." + icon_state = "setup_implant" + complexity = 10 + origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 4, TECH_DATA = 3) + spawn_flags = IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/passive/power/metabolic_siphon/synthetic/test_validity(var/mob/living/carbon/human/host) + if(!host || !host.isSynthetic() || host.stat == DEAD || host.nutrition <= 10) + return FALSE // This time we don't want a metabolism. + return TRUE + +// For fat machines that need fat power, like drones. +/obj/item/integrated_circuit/passive/power/relay + name = "tesla power relay" + desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them." + w_class = ITEMSIZE_NORMAL + extended_desc = "The siphon generates 250W of energy, so long as an APC is in the same room, with a cell that has energy. It will always drain \ + from the 'equipment' power channel." + icon_state = "power_relay" + complexity = 7 + origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2) + spawn_flags = IC_SPAWN_RESEARCH + var/power_amount = 250 + +// For really fat machines. +/obj/item/integrated_circuit/passive/power/relay/large + name = "large tesla power relay" + desc = "A seemingly enigmatic device which connects to nearby APCs wirelessly and draws power from them, now in industiral size!" + w_class = ITEMSIZE_LARGE + extended_desc = "The siphon generates 2 kW of energy, so long as an APC is in the same room, with a cell that has energy. It will always drain \ + from the 'equipment' power channel." + icon_state = "power_relay" + complexity = 15 + origin_tech = list(TECH_POWER = 6, TECH_ENGINEERING = 5, TECH_DATA = 4) + spawn_flags = IC_SPAWN_RESEARCH + power_amount = 2000 + +/obj/item/integrated_circuit/passive/power/relay/make_energy() + if(!assembly) + return + var/area/A = get_area(src) + if(A) + if(A.powered(EQUIP)) + A.use_power(power_amount, EQUIP) + assembly.give_power(power_amount) // give_power() handles CELLRATE on its own. diff --git a/code/modules/integrated_electronics/arithmetic.dm b/code/modules/integrated_electronics/subtypes/arithmetic.dm similarity index 99% rename from code/modules/integrated_electronics/arithmetic.dm rename to code/modules/integrated_electronics/subtypes/arithmetic.dm index 37eabf2027..c6134f9bd1 100644 --- a/code/modules/integrated_electronics/arithmetic.dm +++ b/code/modules/integrated_electronics/subtypes/arithmetic.dm @@ -6,6 +6,7 @@ activators = list("compute") category_text = "Arithmetic" autopulse = 1 + power_draw_per_use = 5 // Math is pretty cheap. /obj/item/integrated_circuit/arithmetic/on_data_written() if(autopulse == 1) diff --git a/code/modules/integrated_electronics/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm similarity index 99% rename from code/modules/integrated_electronics/converters.dm rename to code/modules/integrated_electronics/subtypes/converters.dm index 96494ba469..9e04e24db5 100644 --- a/code/modules/integrated_electronics/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -6,6 +6,7 @@ activators = list("convert") category_text = "Converter" autopulse = 1 + power_draw_per_use = 10 /obj/item/integrated_circuit/converter/on_data_written() if(autopulse == 1) diff --git a/code/modules/integrated_electronics/subtypes/data_transfer.dm b/code/modules/integrated_electronics/subtypes/data_transfer.dm new file mode 100644 index 0000000000..c5fe9741be --- /dev/null +++ b/code/modules/integrated_electronics/subtypes/data_transfer.dm @@ -0,0 +1,186 @@ +/obj/item/integrated_circuit/transfer + category_text = "Data Transfer" + autopulse = 1 + power_draw_per_use = 2 + +/obj/item/integrated_circuit/transfer/on_data_written() + if(autopulse == 1) + check_then_do_work() + +/obj/item/integrated_circuit/transfer/splitter + name = "splitter" + desc = "Splits incoming data into all of the output pins." + icon_state = "splitter" + complexity = 3 + inputs = list("data to split") + outputs = list("A","B") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/transfer/splitter/medium + name = "four splitter" + icon_state = "splitter4" + complexity = 5 + outputs = list("A","B","C","D") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 + +/obj/item/integrated_circuit/transfer/splitter/large + name = "eight splitter" + icon_state = "splitter8" + w_class = ITEMSIZE_SMALL + complexity = 9 + outputs = list("A","B","C","D","E","F","G","H") + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 8 + +/obj/item/integrated_circuit/transfer/splitter/do_work() + var/datum/integrated_io/I = inputs[1] + for(var/datum/integrated_io/output/O in outputs) + O.data = I.data + +/obj/item/integrated_circuit/transfer/activator_splitter + name = "activator splitter" + desc = "Splits incoming activation pulses into all of the output pins." + icon_state = "splitter" + complexity = 3 + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B" + ) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 2 + +/obj/item/integrated_circuit/transfer/activator_splitter/do_work() + for(var/datum/integrated_io/activate/A in outputs) + if(A == activators[1]) + continue + if(A.linked.len) + for(var/datum/integrated_io/activate/target in A.linked) + target.holder.check_then_do_work() + +/obj/item/integrated_circuit/transfer/activator_splitter/medium + name = "four activator splitter" + icon_state = "splitter4" + complexity = 5 + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B", + "outgoing pulse C", + "outgoing pulse D" + ) + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 + +/obj/item/integrated_circuit/transfer/activator_splitter/large + name = "eight activator splitter" + icon_state = "splitter4" + w_class = ITEMSIZE_SMALL + complexity = 9 + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B", + "outgoing pulse C", + "outgoing pulse D", + "outgoing pulse E", + "outgoing pulse F", + "outgoing pulse G", + "outgoing pulse H" + ) + spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 8 + + +/obj/item/integrated_circuit/transfer/multiplexer + name = "two multiplexer" + desc = "This is what those in the business tend to refer to as a 'mux' or data selector. It moves data from one of the selected inputs to the output." + extended_desc = "The first input pin is used to select which of the other input pins which has its data moved to the output. If the input selection is outside the valid range then no output is given." + complexity = 2 + icon_state = "mux2" + inputs = list("input selection") + outputs = list("output") + activators = list("select") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 + var/number_of_inputs = 2 + +/obj/item/integrated_circuit/transfer/multiplexer/New() + for(var/i = 1 to number_of_inputs) + inputs += "input [i]" + complexity = number_of_inputs + ..() + desc += " It has [number_of_inputs] input pins." + extended_desc += " This multiplexer has a range from 1 to [inputs.len - 1]." + +/obj/item/integrated_circuit/transfer/multiplexer/do_work() + var/input_index = get_pin_data(IC_INPUT, 1) + var/output = null + + if(isnum(input_index) && (input_index >= 1 && input_index < inputs.len)) + output = get_pin_data(IC_INPUT, input_index + 1) + set_pin_data(IC_OUTPUT, 1, output) + +/obj/item/integrated_circuit/transfer/multiplexer/medium + name = "four multiplexer" + number_of_inputs = 4 + icon_state = "mux4" + +/obj/item/integrated_circuit/transfer/multiplexer/large + name = "eight multiplexer" + number_of_inputs = 8 + w_class = ITEMSIZE_SMALL + icon_state = "mux8" + +/obj/item/integrated_circuit/transfer/multiplexer/huge + name = "sixteen multiplexer" + icon_state = "mux16" + w_class = ITEMSIZE_SMALL + number_of_inputs = 16 + +/obj/item/integrated_circuit/transfer/demultiplexer + name = "two demultiplexer" + desc = "This is what those in the business tend to refer to as a 'demux'. It moves data from the input to one of the selected outputs." + extended_desc = "The first input pin is used to select which of the output pins is given the data from the second input pin. If the output selection is outside the valid range then no output is given." + complexity = 2 + icon_state = "dmux2" + inputs = list("output selection","input") + outputs = list() + activators = list("select") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 + var/number_of_outputs = 2 + +/obj/item/integrated_circuit/transfer/demultiplexer/New() + for(var/i = 1 to number_of_outputs) + outputs += "output [i]" + complexity = number_of_outputs + + ..() + desc += " It has [number_of_outputs] output pins." + extended_desc += " This demultiplexer has a range from 1 to [outputs.len]." + +/obj/item/integrated_circuit/transfer/demultiplexer/do_work() + var/output_index = get_pin_data(IC_INPUT, 1) + var/output = get_pin_data(IC_INPUT, 2) + + for(var/i = 1 to outputs.len) + set_pin_data(IC_OUTPUT, i, i == output_index ? output : null) + +/obj/item/integrated_circuit/transfer/demultiplexer/medium + name = "four demultiplexer" + icon_state = "dmux4" + number_of_outputs = 4 + +/obj/item/integrated_circuit/transfer/demultiplexer/large + name = "eight demultiplexer" + icon_state = "dmux8" + w_class = ITEMSIZE_SMALL + number_of_outputs = 8 + +/obj/item/integrated_circuit/transfer/demultiplexer/huge + name = "sixteen demultiplexer" + icon_state = "dmux16" + w_class = ITEMSIZE_SMALL + number_of_outputs = 16 \ No newline at end of file diff --git a/code/modules/integrated_electronics/input_output.dm b/code/modules/integrated_electronics/subtypes/input_output.dm similarity index 76% rename from code/modules/integrated_electronics/input_output.dm rename to code/modules/integrated_electronics/subtypes/input_output.dm index c77ad3dc69..baa5738d4e 100644 --- a/code/modules/integrated_electronics/input_output.dm +++ b/code/modules/integrated_electronics/subtypes/input_output.dm @@ -1,6 +1,7 @@ /obj/item/integrated_circuit/input var/can_be_asked_input = 0 category_text = "Input" + power_draw_per_use = 5 /obj/item/integrated_circuit/input/proc/ask_for_input(mob/user) return @@ -23,6 +24,21 @@ target.holder.check_then_do_work() to_chat(user, "You press the button labeled '[src.name]'.") +/obj/item/integrated_circuit/input/toggle_button + name = "toggle button" + desc = "It toggles on, off, on, off..." + icon_state = "toggle_button" + complexity = 1 + inputs = list() + outputs = list("on" = 0) + activators = list("on toggle") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/input/toggle_button/ask_for_input(mob/user) // Ditto. + set_pin_data(IC_OUTPUT, 1, !get_pin_data(IC_OUTPUT, 1)) + activate_pin(1) + to_chat(user, "You toggle the button labeled '[src.name]' [get_pin_data(IC_OUTPUT, 1) ? "on" : "off"].") + /obj/item/integrated_circuit/input/numberpad name = "number pad" desc = "This small number pad allows someone to input a number into the system." @@ -33,6 +49,7 @@ outputs = list("number entered") activators = list("on entered") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 /obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user) var/new_input = input(user, "Enter a number, please.","Number pad") as null|num @@ -53,6 +70,7 @@ outputs = list("string entered") activators = list("on entered") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 /obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user) var/new_input = input(user, "Enter some words, please.","Number pad") as null|text @@ -73,6 +91,7 @@ activators = list("scan") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2) + power_draw_per_use = 40 /obj/item/integrated_circuit/input/med_scanner/do_work() var/datum/integrated_io/I = inputs[1] @@ -111,6 +130,7 @@ activators = list("scan") spawn_flags = IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIO = 4) + power_draw_per_use = 80 /obj/item/integrated_circuit/input/adv_med_scanner/do_work() var/datum/integrated_io/I = inputs[1] @@ -148,12 +168,12 @@ outputs = list("located ref") activators = list("locate") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 20 /obj/item/integrated_circuit/input/local_locator/do_work() var/datum/integrated_io/O = outputs[1] O.data = null - if(istype(src.loc, /obj/item/device/electronic_assembly)) // Check to make sure we're actually in a machine. - var/obj/item/device/electronic_assembly/assembly = src.loc + if(assembly) if(istype(assembly.loc, /mob/living)) // Now check if someone's holding us. O.data = weakref(assembly.loc) @@ -170,6 +190,7 @@ outputs = list("located ref") activators = list("locate") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 30 /obj/item/integrated_circuit/input/adjacent_locator/do_work() var/datum/integrated_io/I = inputs[1] @@ -205,7 +226,9 @@ outputs = list() activators = list("send signal","on signal received") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_MAGNETS = 2) + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_MAGNET = 2) + power_draw_idle = 5 + power_draw_per_use = 40 var/frequency = 1457 var/code = 30 @@ -287,7 +310,8 @@ outputs = list("address received", "data received", "secondary text received") activators = list("send data", "on data received") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH - origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_MAGNETS = 2, TECH_BLUESPACE = 2) + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_MAGNET = 2, TECH_BLUESPACE = 2) + power_draw_per_use = 50 var/datum/exonet_protocol/exonet = null /obj/item/integrated_circuit/input/EPv2/New() @@ -334,6 +358,7 @@ outputs = list("X (abs)", "Y (abs)") activators = list("get coordinates") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 30 /obj/item/integrated_circuit/input/gps/do_work() var/turf/T = get_turf(src) @@ -361,6 +386,7 @@ outputs = list("speaker \", "message \") activators = list("on message received") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 15 /obj/item/integrated_circuit/input/microphone/New() ..() @@ -385,9 +411,27 @@ for(var/datum/integrated_io/output/out in outputs) out.push_data() + A.push_data() +/obj/item/integrated_circuit/input/sensor + name = "sensor" + desc = "Scans and obtains a reference for any objects or persons near you. All you need to do is shove the machine in their face." + icon_state = "recorder" + complexity = 12 + inputs = list() + outputs = list("scanned ref \") + activators = list("on scanned") + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 120 + +/obj/item/integrated_circuit/input/sensor/do_work() + // Because this gets called by attack(), all this needs to do is pulse the activator. + for(var/datum/integrated_io/output/O in outputs) + O.push_data() + var/datum/integrated_io/activate/A = activators[1] + A.push_data() /obj/item/integrated_circuit/output @@ -401,8 +445,18 @@ outputs = list() activators = list("load data") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 10 + autopulse = 1 var/stuff_to_display = null + +/obj/item/integrated_circuit/output/screen/disconnect_all() + ..() + stuff_to_display = null + +/obj/item/integrated_circuit/output/screen/any_examine(mob/user) + to_chat(user, "There is a little screen labeled '[name]', which displays [stuff_to_display ? "'[stuff_to_display]'" : "nothing"].") + /obj/item/integrated_circuit/output/screen/do_work() var/datum/integrated_io/I = inputs[1] if(isweakref(I.data)) @@ -416,22 +470,24 @@ name = "screen" desc = "This screen allows for people holding the device to see a piece of data." icon_state = "screen_medium" + power_draw_per_use = 20 /obj/item/integrated_circuit/output/screen/medium/do_work() ..() var/list/nearby_things = range(0, get_turf(src)) for(var/mob/M in nearby_things) - var/obj/O = istype(loc, /obj/item/device/electronic_assembly) ? loc : src - visible_message("\icon[O] [stuff_to_display]") + var/obj/O = assembly ? assembly : src + to_chat(M, "\icon[O] [stuff_to_display]") /obj/item/integrated_circuit/output/screen/large name = "large screen" desc = "This screen allows for people able to see the device to see a piece of data." icon_state = "screen_large" + power_draw_per_use = 40 /obj/item/integrated_circuit/output/screen/large/do_work() ..() - var/obj/O = istype(loc, /obj/item/device/electronic_assembly) ? loc : src + var/obj/O = assembly ? loc : assembly O.visible_message("\icon[O] [stuff_to_display]") /obj/item/integrated_circuit/output/light @@ -446,6 +502,10 @@ var/light_toggled = 0 var/light_brightness = 3 var/light_rgb = "#FFFFFF" + power_draw_idle = 0 // Adjusted based on brightness. + +/obj/item/integrated_circuit/output/light/Destroy() + ..() /obj/item/integrated_circuit/output/light/do_work() light_toggled = !light_toggled @@ -456,6 +516,7 @@ set_light(l_range = light_brightness, l_power = light_brightness, l_color = light_rgb) else set_light(0) + power_draw_idle = light_toggled ? light_brightness * 2 : 0 /obj/item/integrated_circuit/output/light/advanced/update_lighting() var/datum/integrated_io/R = inputs[1] @@ -473,6 +534,10 @@ ..() +/obj/item/integrated_circuit/output/light/power_fail() // Turns off the flashlight if there's no power left. + light_toggled = FALSE + update_lighting() + /obj/item/integrated_circuit/output/light/advanced name = "advanced light" desc = "This light can turn on and off on command, in any color, and in various brightness levels." @@ -504,6 +569,7 @@ ) outputs = list() activators = list("play sound") + power_draw_per_use = 20 var/list/sounds = list() /obj/item/integrated_circuit/output/text_to_speech @@ -517,11 +583,12 @@ outputs = list() activators = list("to speech") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 60 /obj/item/integrated_circuit/output/text_to_speech/do_work() var/datum/integrated_io/text = inputs[1] if(istext(text.data)) - var/obj/O = istype(loc, /obj/item/device/electronic_assembly) ? loc : src + var/obj/O = assembly ? loc : assembly audible_message("\icon[O] \The [O.name] states, \"[text.data]\"") /obj/item/integrated_circuit/output/sound/New() @@ -576,4 +643,118 @@ "secure day" = 'sound/voice/bsecureday.ogg', ) spawn_flags = IC_SPAWN_RESEARCH - origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_ILLEGAL = 1) \ No newline at end of file + origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_ILLEGAL = 1) + +/obj/item/integrated_circuit/output/video_camera + name = "video camera circuit" + desc = "This small camera allows a remote viewer to see what it sees." + extended_desc = "The camera is linked to the Research camera network." + icon_state = "video_camera" + w_class = ITEMSIZE_SMALL + complexity = 10 + inputs = list("camera name" = "video camera circuit", "camera active" = 0) + outputs = list() + activators = list() + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_idle = 5 // Raises to 80 when on. + var/obj/machinery/camera/network/research/camera + +/obj/item/integrated_circuit/output/video_camera/New() + ..() + camera = new(src) + on_data_written() + +/obj/item/integrated_circuit/output/video_camera/Destroy() + qdel(camera) + ..() + +/obj/item/integrated_circuit/output/video_camera/proc/set_camera_status(var/status) + if(camera) + camera.set_status(status) + power_draw_idle = camera.status ? 80 : 5 + if(camera.status) // Ensure that there's actually power. + if(!draw_idle_power()) + power_fail() + +/obj/item/integrated_circuit/output/video_camera/on_data_written() + if(camera) + var/datum/integrated_io/cam_name = inputs[1] + var/datum/integrated_io/cam_active = inputs[2] + if(istext(cam_name.data)) + camera.c_tag = cam_name.data + if(isnum(cam_active.data)) + set_camera_status(cam_active.data) + +/obj/item/integrated_circuit/output/video_camera/power_fail() + if(camera) + set_camera_status(0) + var/datum/integrated_io/cam_active = inputs[2] + cam_active.data = FALSE + +/obj/item/integrated_circuit/output/led + name = "light-emitting diode" + desc = "This a LED that is lit whenever there is TRUE-equivalent data on its input." + extended_desc = "TRUE-equivalent values are: Non-empty strings, non-zero numbers, and valid refs." + complexity = 0.1 + icon_state = "led" + inputs = list("lit") + outputs = list() + activators = list() + power_draw_idle = 0 // Raises to 1 when lit. + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + var/led_color + +/obj/item/integrated_circuit/output/led/on_data_written() + power_draw_idle = get_pin_data(IC_INPUT, 1) ? 1 : 0 + +/obj/item/integrated_circuit/output/led/power_fail() + set_pin_data(IC_INPUT, 1, FALSE) + +/obj/item/integrated_circuit/output/led/any_examine(mob/user) + var/text_output = list() + var/initial_name = initial(name) + + // Doing all this work just to have a color-blind friendly output. + text_output += "There is " + if(name == initial_name) + text_output += "\an [name]" + else + text_output += "\an ["\improper[initial_name]"] labeled '[name]'" + text_output += " which is currently [get_pin_data(IC_INPUT, 1) ? "lit ¤" : "unlit."]" + to_chat(user,jointext(text_output,null)) + +/obj/item/integrated_circuit/output/led/red + name = "red LED" + led_color = COLOR_RED + +/obj/item/integrated_circuit/output/led/orange + name = "orange LED" + led_color = COLOR_ORANGE + +/obj/item/integrated_circuit/output/led/yellow + name = "yellow LED" + led_color = COLOR_YELLOW + +/obj/item/integrated_circuit/output/led/green + name = "green LED" + led_color = COLOR_GREEN + +/obj/item/integrated_circuit/output/led/blue + name = "blue LED" + led_color = COLOR_BLUE + +/obj/item/integrated_circuit/output/led/purple + name = "purple LED" + led_color = COLOR_PURPLE + +/obj/item/integrated_circuit/output/led/cyan + name = "cyan LED" + led_color = COLOR_CYAN + +/obj/item/integrated_circuit/output/led/white + name = "white LED" + led_color = COLOR_WHITE + +/obj/item/integrated_circuit/output/led/pink + name = "pink LED" + led_color = COLOR_PINK diff --git a/code/modules/integrated_electronics/logic.dm b/code/modules/integrated_electronics/subtypes/logic.dm similarity index 87% rename from code/modules/integrated_electronics/logic.dm rename to code/modules/integrated_electronics/subtypes/logic.dm index d477be3cbe..8feed0457c 100644 --- a/code/modules/integrated_electronics/logic.dm +++ b/code/modules/integrated_electronics/subtypes/logic.dm @@ -4,9 +4,10 @@ extended_desc = "Logic circuits will treat a null, 0, and a \"\" string value as FALSE and anything else as TRUE." complexity = 3 outputs = list("result") - activators = list("compare", "on true result") + activators = list("compare", "on true result", "on false result") category_text = "Logic" autopulse = 1 + power_draw_per_use = 1 /obj/item/integrated_circuit/logic/on_data_written() if(autopulse == 1) @@ -14,10 +15,13 @@ /obj/item/integrated_circuit/logic/do_work() var/datum/integrated_io/O = outputs[1] - var/datum/integrated_io/P = activators[2] + var/datum/integrated_io/T = activators[2] + var/datum/integrated_io/F = activators[3] O.push_data() if(O.data) - P.push_data() + T.push_data() + else + F.push_data() /obj/item/integrated_circuit/logic/binary inputs = list("A","B") @@ -53,6 +57,15 @@ /obj/item/integrated_circuit/logic/binary/equals/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) return A.data == B.data +/obj/item/integrated_circuit/logic/binary/not_equals + name = "not equal gate" + desc = "This gate compares two values, and outputs the number one if both are different." + icon_state = "not equal" + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + +/obj/item/integrated_circuit/logic/binary/not_equals/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data != B.data + /obj/item/integrated_circuit/logic/binary/and name = "and gate" desc = "This gate will output 'one' if both inputs evaluate to true." @@ -114,4 +127,4 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH /obj/item/integrated_circuit/logic/unary/not/do_check(var/datum/integrated_io/A) - return !A.data \ No newline at end of file + return !A.data diff --git a/code/modules/integrated_electronics/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm similarity index 90% rename from code/modules/integrated_electronics/manipulation.dm rename to code/modules/integrated_electronics/subtypes/manipulation.dm index f49b96d16c..65bae751e0 100644 --- a/code/modules/integrated_electronics/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -9,6 +9,7 @@ The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Note that the \ normal limitations to firearms, such as ammunition requirements and firing delays, still hold true if fired by the mechanism." complexity = 20 + w_class = ITEMSIZE_NORMAL inputs = list( "target X rel", "target Y rel" @@ -20,6 +21,7 @@ var/obj/item/weapon/gun/installed_gun = null spawn_flags = IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_COMBAT = 4) + power_draw_per_use = 50 // The targeting mechanism uses this. The actual gun uses its own cell for firing if it's an energy weapon. /obj/item/integrated_circuit/manipulation/weapon_firing/Destroy() qdel(installed_gun) @@ -106,20 +108,21 @@
    \ Pulsing the 'step towards dir' activator pin will cause the machine to move a meter in that direction, assuming it is not \ being held, or anchored in some way. It should be noted that the ability to move is dependant on the type of assembly that this circuit inhabits." + w_class = ITEMSIZE_NORMAL complexity = 20 inputs = list("dir num") outputs = list() activators = list("step towards dir") spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 100 /obj/item/integrated_circuit/manipulation/locomotion/do_work() ..() var/turf/T = get_turf(src) - if(T && istype(loc, /obj/item/device/electronic_assembly)) - var/obj/item/device/electronic_assembly/machine = loc - if(machine.anchored || !machine.can_move()) + if(T && assembly) + if(assembly.anchored || !assembly.can_move()) return - if(machine.loc == T) // Check if we're held by someone. If the loc is the floor, we're not held. + if(assembly.loc == T) // Check if we're held by someone. If the loc is the floor, we're not held. var/datum/integrated_io/wanted_dir = inputs[1] if(isnum(wanted_dir.data)) - step(machine, wanted_dir.data) \ No newline at end of file + step(assembly, wanted_dir.data) \ No newline at end of file diff --git a/code/modules/integrated_electronics/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm similarity index 96% rename from code/modules/integrated_electronics/memory.dm rename to code/modules/integrated_electronics/subtypes/memory.dm index f9cd109dce..49a049a982 100644 --- a/code/modules/integrated_electronics/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -8,6 +8,7 @@ activators = list("set") category_text = "Memory" spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 1 /obj/item/integrated_circuit/memory/examine(mob/user) ..() @@ -33,15 +34,18 @@ name = "memory circuit" desc = "This circuit can store four pieces of data." icon_state = "memory4" + w_class = ITEMSIZE_SMALL complexity = 4 inputs = list("input pin 1","input pin 2","input pin 3","input pin 4") outputs = list("output pin 1","output pin 2","output pin 3","output pin 4") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 2 /obj/item/integrated_circuit/memory/large name = "large memory circuit" desc = "This big circuit can hold eight pieces of data." icon_state = "memory8" + w_class = ITEMSIZE_SMALL complexity = 8 inputs = list( "input pin 1", @@ -63,11 +67,13 @@ "output pin 8") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3) + power_draw_per_use = 4 /obj/item/integrated_circuit/memory/huge name = "large memory stick" desc = "This stick of memory can hold up up to sixteen pieces of data." icon_state = "memory16" + w_class = ITEMSIZE_NORMAL complexity = 16 inputs = list( "input pin 1", @@ -106,6 +112,7 @@ "output pin 16") spawn_flags = IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4) + power_draw_per_use = 8 /obj/item/integrated_circuit/memory/constant name = "constant chip" diff --git a/code/modules/integrated_electronics/subtypes/power.dm b/code/modules/integrated_electronics/subtypes/power.dm new file mode 100644 index 0000000000..7b3256e06b --- /dev/null +++ b/code/modules/integrated_electronics/subtypes/power.dm @@ -0,0 +1,80 @@ +/obj/item/integrated_circuit/power/ + category_text = "Power - Active" + +/obj/item/integrated_circuit/power/transmitter + name = "power transmission circuit" + desc = "This can wirelessly transmit electricity from an assembly's battery towards a nearby machine." + icon_state = "power_transmitter" + extended_desc = "This circuit transmits 5 kJ of electricity every time the activator pin is pulsed. The input pin must be \ + a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \ + inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \ + some power is lost due to ineffiency." + w_class = ITEMSIZE_SMALL + complexity = 16 + inputs = list("target ref") + outputs = list("target cell charge", "target cell max charge", "target cell percentage") + activators = list("transmit") + spawn_flags = IC_SPAWN_RESEARCH + origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4, TECH_POWER = 4, TECH_MAGNET = 3) + power_draw_per_use = 500 // Inefficency has to come from somewhere. + var/amount_to_move = 5000 + +/obj/item/integrated_circuit/power/transmitter/large + name = "large power transmission circuit" + desc = "This can wirelessly transmit a lot of electricity from an assembly's battery towards a nearby machine. Warning: Do not operate in flammable enviroments." + extended_desc = "This circuit transmits 20 kJ of electricity every time the activator pin is pulsed. The input pin must be \ + a reference to a machine to send electricity to. This can be a battery, or anything containing a battery. The machine can exist \ + inside the assembly, or adjacent to it. The power is sourced from the assembly's power cell. If the target is outside of the assembly, \ + some power is lost due to ineffiency." + w_class = ITEMSIZE_LARGE + complexity = 32 + origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4, TECH_POWER = 6, TECH_MAGNET = 5) + power_draw_per_use = 2000 + amount_to_move = 20000 + +/obj/item/integrated_circuit/power/transmitter/do_work() + set_pin_data(IC_OUTPUT, 1, null) + set_pin_data(IC_OUTPUT, 2, null) + set_pin_data(IC_OUTPUT, 3, null) + var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable) + if(AM) + if(!assembly) + return FALSE // Pointless to do everything else if there's no battery to draw from. + + var/obj/item/weapon/cell/cell = null + if(istype(AM, /obj/item/weapon/cell)) // Is this already a cell? + cell = AM + else // If not, maybe there's a cell inside it? + for(var/obj/item/weapon/cell/C in AM.contents) + if(C) // Find one cell to charge. + cell = C + break + if(cell) + var/transfer_amount = amount_to_move + var/turf/A = get_turf(src) + var/turf/B = get_turf(AM) + if(A.Adjacent(B)) + if(AM.loc != assembly) + transfer_amount *= 0.8 // Losses due to distance. + + if(cell.fully_charged()) + return FALSE + + if(transfer_amount && assembly.draw_power(amount_to_move)) // CELLRATE is already handled in draw_power() + cell.give(transfer_amount * CELLRATE) + AM.update_icon() + + set_pin_data(IC_OUTPUT, 1, cell.charge) + set_pin_data(IC_OUTPUT, 2, cell.maxcharge) + set_pin_data(IC_OUTPUT, 3, cell.percent()) + return TRUE + return FALSE + +/obj/item/integrated_circuit/power/transmitter/large/do_work() + if(..()) // If the above code succeeds, do this below. + if(prob(2)) + var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() + sparks.set_up(3, 0, get_turf(src)) + sparks.start() + visible_message("\The [assembly] makes some sparks!") + qdel(sparks) \ No newline at end of file diff --git a/code/modules/integrated_electronics/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm similarity index 98% rename from code/modules/integrated_electronics/reagents.dm rename to code/modules/integrated_electronics/subtypes/reagents.dm index bd6cd1d933..d0c26baf66 100644 --- a/code/modules/integrated_electronics/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -23,6 +23,7 @@ spawn_flags = IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIO = 3) volume = 100 + power_draw_per_use = 20 /obj/item/integrated_circuit/reagent/smoke/do_work() playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) @@ -47,6 +48,7 @@ activators = list("inject") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH volume = 30 + power_draw_per_use = 15 /obj/item/integrated_circuit/reagent/injector/proc/inject_amount() var/datum/integrated_io/amount = inputs[2] @@ -92,6 +94,7 @@ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2) var/transfer_amount = 10 + power_draw_per_use = 10 /obj/item/integrated_circuit/reagent/pump/on_data_written() var/datum/integrated_io/amount = inputs[3] diff --git a/code/modules/integrated_electronics/subtypes/smart.dm b/code/modules/integrated_electronics/subtypes/smart.dm new file mode 100644 index 0000000000..c159522e97 --- /dev/null +++ b/code/modules/integrated_electronics/subtypes/smart.dm @@ -0,0 +1,33 @@ +/obj/item/integrated_circuit/smart + category_text = "Smart" + +/obj/item/integrated_circuit/smart/basic_pathfinder + name = "basic pathfinder" + desc = "This complex circuit is able to determine what direction a given target is." + extended_desc = "This circuit uses a miniturized, integrated camera to determine where the target is. If the machine \ + cannot see the target, it will not be able to calculate the correct direction." + icon_state = "numberpad" + complexity = 25 + inputs = list("target ref") + outputs = list("dir") + activators = list("calculate dir") + spawn_flags = IC_SPAWN_RESEARCH + origin_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 5) + power_draw_per_use = 40 + +/obj/item/integrated_circuit/smart/basic_pathfinder/do_work() + var/datum/integrated_io/I = inputs[1] + var/datum/integrated_io/O = outputs[1] + O.data = null + + if(!isweakref(I.data)) + return + var/atom/A = I.data.resolve() + if(!A) + return + if(!(A in view(get_turf(src)))) + return // Can't see the target. + var/desired_dir = get_dir(get_turf(src), A) + if(desired_dir) + O.data = desired_dir + O.push_data() \ No newline at end of file diff --git a/code/modules/integrated_electronics/time.dm b/code/modules/integrated_electronics/subtypes/time.dm similarity index 97% rename from code/modules/integrated_electronics/time.dm rename to code/modules/integrated_electronics/subtypes/time.dm index 50bcc5e386..72766c0c48 100644 --- a/code/modules/integrated_electronics/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -14,6 +14,7 @@ var/delay = 2 SECONDS activators = list("incoming pulse","outgoing pulse") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 2 /obj/item/integrated_circuit/time/delay/do_work() set waitfor = 0 // Don't sleep in a proc that is called by a processor. It'll delay the entire thing @@ -82,6 +83,7 @@ inputs = list("enable ticking") activators = list("outgoing pulse") spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 4 /obj/item/integrated_circuit/time/ticker/Destroy() if(is_running) @@ -116,6 +118,7 @@ complexity = 12 ticks_to_pulse = 2 spawn_flags = IC_SPAWN_RESEARCH + power_draw_per_use = 8 /obj/item/integrated_circuit/time/ticker/slow name = "slow ticker" @@ -124,6 +127,7 @@ complexity = 4 ticks_to_pulse = 6 spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 2 /obj/item/integrated_circuit/time/clock name = "integrated clock" @@ -132,6 +136,7 @@ inputs = list() outputs = list("time (string)", "hours (number)", "minutes (number)", "seconds (number)") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + power_draw_per_use = 4 /obj/item/integrated_circuit/time/clock/do_work() var/datum/integrated_io/time = outputs[1] diff --git a/code/modules/integrated_electronics/trig.dm b/code/modules/integrated_electronics/subtypes/trig.dm similarity index 97% rename from code/modules/integrated_electronics/trig.dm rename to code/modules/integrated_electronics/subtypes/trig.dm index e8e2e09ca9..b1a19f4a40 100644 --- a/code/modules/integrated_electronics/trig.dm +++ b/code/modules/integrated_electronics/subtypes/trig.dm @@ -7,6 +7,7 @@ category_text = "Trig" extended_desc = "Input and output are in degrees." autopulse = 1 + power_draw_per_use = 1 // Still cheap math. /obj/item/integrated_circuit/trig/on_data_written() if(autopulse == 1) @@ -118,7 +119,7 @@ /obj/item/integrated_circuit/trig/cotangent name = "cot circuit" - desc = "Outputs the cotangent of A. Has nothing to do with the security department." + desc = "Outputs the cotangent of A." icon_state = "cotangent" inputs = list("A") spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH diff --git a/code/modules/integrated_electronics/~defines.dm b/code/modules/integrated_electronics/~defines.dm deleted file mode 100644 index 7aea6dabbb..0000000000 --- a/code/modules/integrated_electronics/~defines.dm +++ /dev/null @@ -1,6 +0,0 @@ -#undef IC_INPUT -#undef IC_OUTPUT -#undef IC_ACTIVATOR - -#undef DATA_CHANNEL -#undef PULSE_CHANNEL \ No newline at end of file diff --git a/code/modules/integrated_electronics/~defines/~defines.dm b/code/modules/integrated_electronics/~defines/~defines.dm new file mode 100644 index 0000000000..78ce72f365 --- /dev/null +++ b/code/modules/integrated_electronics/~defines/~defines.dm @@ -0,0 +1,16 @@ +#undef IC_INPUT +#undef IC_OUTPUT +#undef IC_ACTIVATOR + +#undef DATA_CHANNEL +#undef PULSE_CHANNEL + +#undef IC_SPAWN_DEFAULT +//#undef IC_SPAWN_RESEARCH // Research designs depend on this unfortunately. + +#undef IC_FORMAT_STRING +#undef IC_FORMAT_NUMBER +#undef IC_FORMAT_REF +#undef IC_FORMAT_LIST +#undef IC_FORMAT_ANY +#undef IC_FORMAT_PULSE \ No newline at end of file diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 7c964b9d4b..31d99ebb05 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -252,8 +252,9 @@ for(var/iy = 0,iy < 5, iy++) for(var/ix = 0, ix < 5, ix++) mine_turf = locate(tx + ix, ty + iy, T.z) - if(mine_turf && mine_turf.has_resources) - resource_field += mine_turf + if(!istype(mine_turf, /turf/space/)) + if(mine_turf && mine_turf.has_resources) + resource_field += mine_turf if(!resource_field.len) system_error("resources depleted") diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 0a5c2d94c3..b9fc47e4e9 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -35,7 +35,7 @@ var/list/mining_overlay_cache = list() var/ignore_mapgen var/ore_types = list( - "iron" = /obj/item/weapon/ore/iron, + "hematite" = /obj/item/weapon/ore/iron, "uranium" = /obj/item/weapon/ore/uranium, "gold" = /obj/item/weapon/ore/gold, "silver" = /obj/item/weapon/ore/silver, @@ -44,7 +44,7 @@ var/list/mining_overlay_cache = list() "osmium" = /obj/item/weapon/ore/osmium, "hydrogen" = /obj/item/weapon/ore/hydrogen, "silicates" = /obj/item/weapon/ore/glass, - "carbonaceous rock" = /obj/item/weapon/ore/coal + "carbon" = /obj/item/weapon/ore/coal ) has_resources = 1 @@ -483,6 +483,11 @@ var/list/mining_overlay_cache = list() if(prob(50)) M.Stun(5) M.apply_effect(25, IRRADIATE) + if(prob(25)) + excavate_find(prob(5), finds[1]) + else if(rand(1,500) == 1) + visible_message("An old dusty crate was buried within!") + new /obj/structure/closet/crate/secure/loot(src) make_floor() update_icon(1) @@ -546,10 +551,10 @@ var/list/mining_overlay_cache = list() var/mineral_name if(rare_ore) - mineral_name = pickweight(list("uranium" = 10, "platinum" = 10, "iron" = 20, "coal" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20)) + mineral_name = pickweight(list("uranium" = 10, "platinum" = 10, "hematite" = 20, "carbon" = 20, "diamond" = 2, "gold" = 10, "silver" = 10, "phoron" = 20)) else - mineral_name = pickweight(list("uranium" = 5, "platinum" = 5, "iron" = 35, "coal" = 35, "diamond" = 1, "gold" = 5, "silver" = 5, "phoron" = 10)) + mineral_name = pickweight(list("uranium" = 5, "platinum" = 5, "hematite" = 35, "carbon" = 35, "diamond" = 1, "gold" = 5, "silver" = 5, "phoron" = 10)) if(mineral_name && (mineral_name in ore_data)) mineral = ore_data[mineral_name] diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index dc08557ff9..0642ff14b7 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -843,3 +843,9 @@ mob/observer/dead/MayRespawn(var/feedback = 0) if(finalized == "No") icon_state = previous_state + +/mob/observer/dead/is_blind() + return FALSE + +/mob/observer/dead/is_deaf() + return FALSE diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 343b8e4225..a240277d38 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -59,7 +59,7 @@ if(is_preference_enabled(/datum/client_preference/ghost_ears) && (speaker in view(src))) message = "[message]" - if((sdisabilities & DEAF) || ear_deaf) + 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!" diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 952fc93bb0..b6b99781f4 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -9,7 +9,8 @@ var/list/holder_mob_icon_cache = list() show_messages = 1 sprite_sheets = list( - "Teshari" = 'icons/mob/species/seromi/head.dmi' + "Teshari" = 'icons/mob/species/seromi/head.dmi', + "Vox" = 'icons/mob/species/vox/head.dmi' ) origin_tech = null diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index 8e22cd0493..7df164c821 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -20,7 +20,7 @@ // 'basic' language; spoken by default. /datum/language/common - name = "Galactic Common" + name = LANGUAGE_GALCOM desc = "The common galactic tongue." speech_verb = "says" whisper_verb = "whispers" @@ -39,7 +39,7 @@ // Galactic common languages (systemwide accepted standards). /datum/language/trader - name = "Tradeband" + name = LANGUAGE_TRADEBAND desc = "Maintained by the various trading cartels in major systems, this elegant, structured language is used for bartering and bargaining." speech_verb = "enunciates" colour = "say_quote" @@ -56,7 +56,7 @@ // Criminal language. /datum/language/gutter - name = "Gutter" + name = LANGUAGE_GUTTER desc = "There is no true language named Gutter. 'Gutter' is a catchall term for a collection of unofficial SolCom dialects that has somehow managed to spread across the stars." speech_verb = "growls" colour = "rough" @@ -115,7 +115,7 @@ "his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi") /datum/language/sign - name = "Sign Language" + name = LANGUAGE_SIGN desc = "A sign language commonly used for those who are deaf or mute." signlang_verb = list("gestures") colour = "say_quote" diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index f3d59d3649..b9eb226e12 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -160,12 +160,15 @@ // Can we speak this language, as opposed to just understanding it? /mob/proc/can_speak(datum/language/speaking) //Prevents someone from speaking a null language. - if(speaking) - return (speaking.can_speak_special(src) && (universal_speak || (speaking && (speaking.flags & INNATE)) || speaking in src.languages)) - else + if(!speaking) log_debug("[src] attempted to speak a null language.") return 0 + if (only_species_language && speaking != all_languages[species_language]) + return 0 + + return (speaking.can_speak_special(src) && (universal_speak || (speaking && (speaking.flags & INNATE)) || speaking in src.languages)) + /mob/proc/get_language_prefix() if(client && client.prefs.language_prefixes && client.prefs.language_prefixes.len) return client.prefs.language_prefixes[1] @@ -213,7 +216,10 @@ /mob/living/Topic(href, href_list) if(href_list["default_lang"]) if(href_list["default_lang"] == "reset") - set_default_language(null) + if (species_language) + set_default_language(all_languages[species_language]) + else + set_default_language(null) else var/datum/language/L = locate(href_list["default_lang"]) if(L && (L in languages)) @@ -223,4 +229,10 @@ else return ..() +/proc/transfer_languages(var/mob/source, var/mob/target, var/except_flags) + for(var/datum/language/L in source.languages) + if(L.flags & except_flags) + continue + target.add_language(L.name) + #undef SCRAMBLE_CACHE_LEN diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index f8634f8f54..8c174a2ff7 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -1,5 +1,5 @@ /datum/language/ling - name = "Changeling" + name = LANGUAGE_CHANGELING desc = "Although they are normally wary and suspicious of each other, changelings can commune over a distance." speech_verb = "says" colour = "changeling" @@ -37,6 +37,22 @@ speaker_mask = B.truename ..(speaker,message,speaker_mask) +/datum/language/vox + name = LANGUAGE_VOX + desc = "The common tongue of the various Vox ships making up the Shoal. It sounds like chaotic shrieking to everyone else." + speech_verb = "shrieks" + ask_verb = "creels" + exclaim_verb = "SHRIEKS" + colour = "vox" + key = "5" + flags = WHITELISTED + syllables = list("ti","ti","ti","hi","hi","ki","ki","ki","ki","ya","ta","ha","ka","ya","chi","cha","kah", \ + "SKRE","AHK","EHK","RAWK","KRA","AAA","EEE","KI","II","KRI","KA") + machine_understands = 0 + +/datum/language/vox/get_random_name() + return ..(FEMALE,1,6) + /datum/language/cultcommon name = LANGUAGE_CULT desc = "The chants of the occult, the incomprehensible." @@ -57,7 +73,7 @@ "d'rekkathnor", "khari'd", "gual'te", "nikka", "nikt'o", "barada", "kla'atu", "barhah", "hra" ,"zar'garis", "spiri", "malum") /datum/language/cult - name = "Occult" + name = LANGUAGE_OCCULT desc = "The initiated can share their thoughts by means defying all reason." speech_verb = "intones" ask_verb = "intones" diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 77cb8f1ad5..b69c9cca5f 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -1,6 +1,6 @@ -/datum/language/diona - name = "Rootspeak" - desc = "A creaking, subvocal language spoken instinctively by the Dionaea. Due to the unique makeup of the average Diona, a phrase of Rootspeak can be a combination of anywhere from one to twelve individual voices and notes." +/datum/language/diona_local + name = LANGUAGE_ROOTLOCAL + desc = "A complex language known instinctively by Dionaea, 'spoken' by emitting modulated radio waves. This version uses high frequency waves for quick communication at short ranges." speech_verb = "creaks and rustles" ask_verb = "creaks" exclaim_verb = "rustles" @@ -9,13 +9,19 @@ flags = RESTRICTED syllables = list("hs","zt","kr","st","sh") -/datum/language/diona/get_random_name() +/datum/language/diona_local/get_random_name() var/new_name = "[pick(list("To Sleep Beneath","Wind Over","Embrace of","Dreams of","Witnessing","To Walk Beneath","Approaching the"))]" new_name += " [pick(list("the Void","the Sky","Encroaching Night","Planetsong","Starsong","the Wandering Star","the Empty Day","Daybreak","Nightfall","the Rain"))]" return new_name +/datum/language/diona_global + name = LANGUAGE_ROOTGLOBAL + desc = "A complex language known instinctively by Dionaea, 'spoken' by emitting modulated radio waves. This version uses low frequency waves for slow communication at long ranges." + key = "w" + flags = RESTRICTED | HIVEMIND + /datum/language/unathi - name = "Sinta'unathi" + name = LANGUAGE_UNATHI desc = "The common language of Moghes, composed of sibilant hisses and rattles. Spoken natively by Unathi." speech_verb = "hisses" ask_verb = "hisses" @@ -42,7 +48,7 @@ return capitalize(new_name) /datum/language/tajaran - name = "Siik" + name = LANGUAGE_SIIK desc = "The most prevalant language of Meralar, composed of expressive yowls and chirps. Native to the Tajaran." speech_verb = "mrowls" ask_verb = "mrowls" @@ -65,7 +71,7 @@ return new_name /datum/language/skrell - name = "Skrellian" + name = LANGUAGE_SKRELLIAN desc = "A melodic and complex language spoken by the Skrell of Qerrbalak. Some of the notes are inaudible to humans." speech_verb = "warbles" ask_verb = "warbles" @@ -76,7 +82,7 @@ syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix","*","!") /datum/language/human - name = "Sol Common" + name = LANGUAGE_SOL_COMMON desc = "A bastardized hybrid of informal English and elements of Mandarin Chinese; the common language of the Sol system." speech_verb = "says" whisper_verb = "whispers" @@ -104,8 +110,8 @@ return ..() /datum/language/machine - name = "Encoded Audio Language" - desc = "A efficient language of encoded tones developed by synthetics and cyborgs." + name = LANGUAGE_EAL + desc = "An efficient language of encoded tones developed by synthetics and cyborgs." speech_verb = "whistles" ask_verb = "chirps" exclaim_verb = "whistles loudly" @@ -127,7 +133,7 @@ return pick(ai_names) /datum/language/seromi - name = "Schechi" + name = LANGUAGE_SCHECHI desc = "A trilling language spoken by the diminutive Teshari." speech_verb = "chirps" ask_verb = "chirrups" diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm index ba8932ebf9..ebcd4d7774 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona.dm @@ -7,9 +7,11 @@ speak_emote = list("chirrups") icon_state = "nymph" item_state = "nymph" - language = "Rootspeak" + language = LANGUAGE_ROOTLOCAL + species_language = LANGUAGE_ROOTLOCAL + only_species_language = 1 death_msg = "expires with a pitiful chirrup..." - universal_understand = 1 + universal_understand = 0 universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea. can_pull_size = ITEMSIZE_SMALL @@ -22,6 +24,8 @@ ..() species = all_species["Diona"] + add_language(LANGUAGE_ROOTGLOBAL) + add_language(LANGUAGE_GALCOM) verbs += /mob/living/carbon/alien/diona/proc/merge /mob/living/carbon/alien/diona/put_in_hands(var/obj/item/W) // No hands. diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm index e31a293047..150df16fee 100644 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ b/code/modules/mob/living/carbon/alien/emote.dm @@ -80,6 +80,9 @@ message = "The [src.name] sulks down sadly." m_type = 1 if("twitch") + message = "The [src.name] twitches." + m_type = 1 + if("twitch_v") message = "The [src.name] twitches violently." m_type = 1 if("dance") diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm index 371058511b..4a22c34c6d 100644 --- a/code/modules/mob/living/carbon/alien/progression.dm +++ b/code/modules/mob/living/carbon/alien/progression.dm @@ -28,6 +28,8 @@ adult.set_species(new_species) show_evolution_blurb() + transfer_languages(src, adult) + if(mind) mind.transfer_to(adult) if (can_namepick_as_adult) diff --git a/code/modules/mob/living/carbon/alien/say.dm b/code/modules/mob/living/carbon/alien/say.dm index 28ae01391f..b92b5dc06d 100644 --- a/code/modules/mob/living/carbon/alien/say.dm +++ b/code/modules/mob/living/carbon/alien/say.dm @@ -17,9 +17,6 @@ var/datum/language/speaking = parse_language(message) - if(speaking) - message = copytext(message, 2+length(speaking.key)) - message = trim(message) if(!message || stat) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 27cdc59d80..8060e328ee 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -177,7 +177,7 @@ /obj/item/device/mmi/digital/New() src.brainmob = new(src) src.brainmob.add_language("Robot Talk") - src.brainmob.add_language("Encoded Audio Language") + src.brainmob.add_language(LANGUAGE_EAL) src.brainmob.loc = src src.brainmob.container = src src.brainmob.stat = 0 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5ca686cae3..204730a8e8 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -4,6 +4,8 @@ ingested = new/datum/reagents/metabolism(1000, src, CHEM_INGEST) touching = new/datum/reagents/metabolism(1000, src, CHEM_TOUCH) reagents = bloodstr + if (!default_language && species_language) + default_language = all_languages[species_language] ..() /mob/living/carbon/Life() @@ -435,7 +437,6 @@ stop_pulling() src << "You slipped on [slipped_on]!" playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3) - Stun(stun_duration) Weaken(Floor(stun_duration/2)) return 1 diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index fa0cf273e2..d6deb9b964 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -25,3 +25,8 @@ var/pulse = PULSE_NORM //current pulse level var/does_not_breathe = 0 //Used for specific mobs that can't take advantage of the species flags (changelings) + + //these two help govern taste. The first is the last time a taste message was shown to the plaer. + //the second is the message in question. + var/last_taste_time = 0 + var/last_taste_text = "" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index f1a84d6d9d..56e71d931a 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -188,11 +188,11 @@ m_type = 2 if ("twitch") - message = "twitches violently." + message = "twitches." m_type = 1 - if ("twitch_s") - message = "twitches." + if ("twitch_v") + message = "twitches violently." m_type = 1 if ("faint") @@ -590,6 +590,9 @@ src.animate_tail_stop() if("vomit") + if(isSynthetic()) + src << "You are unable to vomit." + return vomit() return @@ -597,7 +600,7 @@ 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, shake, shiver, shrug, sigh, signal-#1-10, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, sway/wag, swish, tremble, twitch, -twitch_s, vomit, whimper, wink, yawn"} +twitch_v, vomit, whimper, wink, yawn"} else src << "\blue Unusable emote '[act]'. Say *help for a list." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9158297ae1..6fe8e8ab87 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -28,6 +28,8 @@ if(mind) mind.name = real_name + nutrition = rand(200,400) + hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud_med.dmi', src, "100") hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") @@ -688,12 +690,20 @@ if(istype(src.head, /obj/item/clothing/head/helmet/space/emergency)) number -= 2 if(istype(src.glasses, /obj/item/clothing/glasses/thermal)) - number -= 1 + var/obj/item/clothing/glasses/thermal/T = src.glasses + if(T.active) + number -= 1 + if(istype(src.glasses, /obj/item/clothing/glasses/night)) + var/obj/item/clothing/glasses/night/N = src.glasses + if(N.active) + number -= 1 if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses)) if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses/sechud/aviator)) var/obj/item/clothing/glasses/sunglasses/sechud/aviator/S = src.glasses - if(!S.on) + if(!S.active) number += 1 + else if(istype(src.glasses, /obj/item/clothing/glasses/sunglasses/medhud/aviator)) + number += 0 else number += 1 if(istype(src.glasses, /obj/item/clothing/glasses/welding)) @@ -1323,7 +1333,8 @@ /mob/living/carbon/human/slip(var/slipped_on, stun_duration=8) if((species.flags & NO_SLIP) || (shoes && (shoes.item_flags & NOSLIP))) return 0 - ..(slipped_on,stun_duration) + if(..(slipped_on,stun_duration)) + return 1 /mob/living/carbon/human/proc/undislocate() set category = "Object" diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 97153394db..d9f4d5681e 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -54,10 +54,10 @@ if (!lying && !buckled && world.time - l_move_time < 15) //Moving around with fractured ribs won't do you any good - if (E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15)) - var/obj/item/organ/I = pick(E.internal_organs) - custom_pain("You feel broken bones moving in your [E.name]!", 1) - I.take_damage(rand(3,5)) + if (prob(10) && !stat && can_feel_pain() && analgesic < 50 && E.is_broken() && E.internal_organs.len) + custom_pain("Pain jolts through your broken [E.encased ? E.encased : E.name], staggering you!", 50) + drop_item(loc) + Stun(2) //Moving makes open wounds get infected much faster if (E.wounds.len) diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 948f338297..0567be8e8f 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -114,11 +114,15 @@ set name = "Split" set desc = "Split your humanoid form into its constituent nymphs." set category = "Abilities" + diona_split_into_nymphs(5) // Separate proc to void argments being supplied when used as a verb +/mob/living/carbon/human/proc/diona_split_into_nymphs(var/number_of_resulting_nymphs) var/turf/T = get_turf(src) var/mob/living/carbon/alien/diona/S = new(T) S.set_dir(dir) + transfer_languages(src, S) + if(mind) mind.transfer_to(S) @@ -129,12 +133,14 @@ for(var/mob/living/carbon/alien/diona/D in src) nymphs++ - D.loc = T + D.forceMove(T) + transfer_languages(src, D, WHITELISTED|RESTRICTED) D.set_dir(pick(NORTH, SOUTH, EAST, WEST)) - if(nymphs < 5) - for(var/i in nymphs to 4) + if(nymphs < number_of_resulting_nymphs) + for(var/i in nymphs to (number_of_resulting_nymphs - 1)) var/mob/M = new /mob/living/carbon/alien/diona(T) + transfer_languages(src, M, WHITELISTED|RESTRICTED) M.set_dir(pick(NORTH, SOUTH, EAST, WEST)) @@ -169,3 +175,84 @@ output += "[IO.name] - OK\n" src << output + +/mob/living/carbon/human + var/next_sonar_ping = 0 + +/mob/living/carbon/human/proc/sonar_ping() + set name = "Listen In" + set desc = "Allows you to listen in to movement and noises around you." + set category = "Abilities" + + if(incapacitated()) + 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." + return + if(is_deaf() || is_below_sound_pressure(get_turf(src))) + 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..." + 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)) + continue + heard_something = TRUE + var/feedback = list() + feedback += "There are noises of movement " + var/direction = get_dir(src, L) + if(direction) + feedback += "towards the [dir2text(direction)], " + switch(get_dist(src, L) / client.view) + if(0 to 0.2) + feedback += "very close by." + if(0.2 to 0.4) + feedback += "close by." + if(0.4 to 0.6) + feedback += "some distance away." + if(0.6 to 0.8) + feedback += "further away." + else + feedback += "far away." + else // No need to check distance if they're standing right on-top of us + feedback += "right on top of you." + feedback += "" + src << jointext(feedback,null) + if(!heard_something) + src << "You hear no movement but your own." + +/mob/living/carbon/human/proc/regenerate() + set name = "Regenerate" + set desc = "Allows you to regrow limbs and heal organs." + set category = "Abilities" + + if(nutrition < 250) + to_chat(src, "You lack the biomass regrow anything!") + return + + nutrition -= 200 + + // Theoretically the only internal organ a slime will have + // is the slime core. but we might as well be thorough. + for(var/obj/item/organ/I in internal_organs) + if(I.damage > 0) + I.damage = 0 + to_chat(src, "You feel a soothing sensation within your [I.name]...") + + // Replace completely missing limbs. + for(var/limb_type in src.species.has_limbs) + var/obj/item/organ/external/E = src.organs_by_name[limb_type] + if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)))) + E.removed() + qdel(E) + E = null + if(!E) + var/list/organ_data = src.species.has_limbs[limb_type] + var/limb_path = organ_data["path"] + var/obj/item/organ/O = new limb_path(src) + organ_data["descriptor"] = O.name + to_chat(src, "You feel a slithering sensation as your [O.name] reform.") + src.update_body() diff --git a/code/modules/mob/living/carbon/human/human_species.dm b/code/modules/mob/living/carbon/human/human_species.dm index ea1afb157f..fa7460b19e 100644 --- a/code/modules/mob/living/carbon/human/human_species.dm +++ b/code/modules/mob/living/carbon/human/human_species.dm @@ -21,6 +21,10 @@ h_style = "Unathi Horns" ..(new_loc, "Unathi") +/mob/living/carbon/human/vox/New(var/new_loc) + h_style = "Short Vox Quills" + ..(new_loc, "Vox") + /mob/living/carbon/human/diona/New(var/new_loc) ..(new_loc, "Diona") diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm new file mode 100644 index 0000000000..1a9a986dd1 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -0,0 +1,89 @@ +/datum/species/vox + name = "Vox" + name_plural = "Vox" + icobase = 'icons/mob/human_races/r_vox.dmi' + deform = 'icons/mob/human_races/r_def_vox.dmi' + default_language = LANGUAGE_VOX + language = LANGUAGE_GALCOM + num_alternate_languages = 1 + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/strong, /datum/unarmed_attack/bite/strong) + rarity_value = 4 + blurb = "The Vox are the broken remnants of a once-proud race, now reduced to little more than \ + scavenging vermin who prey on isolated stations, ships or planets to keep their own ancient arkships \ + alive. They are four to five feet tall, reptillian, beaked, tailed and quilled; human crews often \ + refer to them as 'shitbirds' for their violent and offensive nature, as well as their horrible \ + smell.

    Most humans will never meet a Vox raider, instead learning of this insular species through \ + dealing with their traders and merchants; those that do rarely enjoy the experience." + +// taste_sensitivity = TASTE_DULL + + slowdown = -0.5 + + speech_sounds = list('sound/voice/shriek1.ogg') + speech_chance = 20 + + warning_low_pressure = 50 + hazard_low_pressure = 0 + + cold_level_1 = 80 + cold_level_2 = 50 + cold_level_3 = 0 + + gluttonous = 1 + + breath_type = "phoron" + poison_type = "oxygen" + siemens_coefficient = 0.2 + + flags = NO_SCAN + spawn_flags = SPECIES_IS_WHITELISTED + appearance_flags = HAS_EYE_COLOR | HAS_HAIR_COLOR + + blood_color = "#9066BD" + flesh_color = "#808D11" + + reagent_tag = IS_VOX + + 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/vox), + 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) + ) + + + has_organ = list( + O_HEART = /obj/item/organ/internal/heart/vox, + O_LUNGS = /obj/item/organ/internal/lungs/vox, + O_LIVER = /obj/item/organ/internal/liver/vox, + O_KIDNEYS = /obj/item/organ/internal/kidneys/vox, + O_BRAIN = /obj/item/organ/internal/brain/vox, + O_EYES = /obj/item/organ/internal/eyes, + ) + + genders = list(NEUTER) + +/datum/species/vox/get_random_name(var/gender) + var/datum/language/species_language = all_languages[default_language] + return species_language.get_random_name(gender) + +/datum/species/vox/equip_survival_gear(var/mob/living/carbon/human/H) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) + if(H.backbag == 1) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/vox(H), slot_r_hand) + H.internal = H.back + else + H.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(H), slot_r_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/vox(H.back), slot_in_backpack) + H.internal = H.r_hand + H.internal = locate(/obj/item/weapon/tank) in H.contents + if(istype(H.internal,/obj/item/weapon/tank) && H.internals) + H.internals.icon_state = "internal1" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 42ec14d46b..6a3b4c7ad1 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -36,17 +36,19 @@ var/blood_volume = 560 // Initial blood volume. var/hunger_factor = 0.05 // Multiplier for hunger. + var/taste_sensitivity = TASTE_NORMAL // How sensitive the species is to minute tastes. + var/min_age = 17 var/max_age = 70 // Language/culture vars. - var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers. - var/language = "Galactic Common" // Default racial language, if any. + var/default_language = LANGUAGE_GALCOM // Default language is used when 'say' is used without modifiers. + var/language = LANGUAGE_GALCOM // Default racial language, if any. var/list/secondary_langs = list() // The names of secondary languages that are available to this species. var/list/speech_sounds // A list of sounds to potentially play when speaking. var/list/speech_chance // The likelihood of a speech sound playing. var/num_alternate_languages = 0 // How many secondary languages are available to select at character creation - var/name_language = "Galactic Common" // The language to use when determining names for this species, or null to use the first name/last name generator + var/name_language = LANGUAGE_GALCOM // The language to use when determining names for this species, or null to use the first name/last name generator // Combat vars. var/total_health = 100 // Point at which the mob will enter crit. 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 9316eaecad..df2bbd8cc8 100644 --- a/code/modules/mob/living/carbon/human/species/station/seromi.dm +++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm @@ -7,8 +7,8 @@ are only recently becoming known on human stations after reaching space with Skrell assistance." num_alternate_languages = 3 - secondary_langs = list("Schechi", "Skrellian") - name_language = "Schechi" + secondary_langs = list(LANGUAGE_SCHECHI, LANGUAGE_SKRELLIAN) + name_language = LANGUAGE_SCHECHI min_age = 12 max_age = 45 health_hud_intensity = 3 @@ -31,8 +31,9 @@ brute_mod = 1.35 burn_mod = 1.35 mob_size = MOB_SMALL + pass_flags = PASSTABLE holder_type = /obj/item/weapon/holder/human - short_sighted = 1 +// short_sighted = 1 gluttonous = 1 blood_volume = 400 hunger_factor = 0.2 @@ -84,40 +85,13 @@ /datum/unarmed_attack/claws, /datum/unarmed_attack/stomp/weak ) -/* - var/shock_cap = 30 - var/hallucination_cap = 25 -// I'm... so... ronrery, so ronery... -/datum/species/teshari/handle_environment_special(var/mob/living/carbon/human/H) - - // If they're dead or unconcious they're a bit beyond this kind of thing. - if(H.stat) - return - - // No point processing if we're already stressing the hell out. - if(H.hallucination >= hallucination_cap && H.shock_stage >= shock_cap) - return - - // Check for company. - for(var/mob/living/M in viewers(H)) - if(M == H || M.stat == DEAD || M.invisibility > H.see_invisible) - continue - if(M.faction == "neutral" || M.faction == H.faction) - return - - // No company? Suffer :( - if(H.shock_stage < shock_cap) - H.shock_stage += 1 - if(H.shock_stage >= shock_cap && H.hallucination < hallucination_cap) - H.hallucination += 2.5 -*/ -/datum/species/teshari/get_vision_flags(var/mob/living/carbon/human/H) - if(!(H.sdisabilities & DEAF) && !H.ear_deaf) - return SEE_SELF|SEE_MOBS - else - return SEE_SELF + inherent_verbs = list( + /mob/living/carbon/human/proc/sonar_ping, + /mob/living/proc/hide + ) /datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H) ..() H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) + diff --git a/code/modules/mob/living/carbon/taste.dm b/code/modules/mob/living/carbon/taste.dm new file mode 100644 index 0000000000..29e28a4559 --- /dev/null +++ b/code/modules/mob/living/carbon/taste.dm @@ -0,0 +1,60 @@ +/mob/living/carbon/proc/ingest(var/datum/reagents/from, var/datum/reagents/target, var/amount = 1, var/multiplier = 1, var/copy = 0) //we kind of 'sneak' a proc in here for ingesting stuff so we can play with it. + if(last_taste_time + 50 < world.time) + var/datum/reagents/temp = new(amount) //temporary holder used to analyse what gets transfered. + from.trans_to_holder(temp, amount, multiplier, 1) + + var/text_output = temp.generate_taste_message(src) + if(text_output != last_taste_text || last_taste_time + 100 < world.time) //We dont want to spam the same message over and over again at the person. Give it a bit of a buffer. + to_chat(src, "You can taste [text_output].")//no taste means there are too many tastes and not enough flavor. + + last_taste_time = world.time + last_taste_text = text_output + return from.trans_to_holder(target,amount,multiplier,copy) //complete transfer + +/* what this does: +catalogue the 'taste strength' of each one +calculate text size per text. +*/ +/datum/reagents/proc/generate_taste_message(mob/living/carbon/taster = null) + var/minimum_percent = 15 + if(ishuman(taster)) + var/mob/living/carbon/human/H = taster + minimum_percent = round(15/ (H.isSynthetic() ? TASTE_DULL : H.species.taste_sensitivity)) + + var/list/out = list() + var/list/tastes = list() //descriptor = strength + if(minimum_percent <= 100) + for(var/datum/reagent/R in reagent_list) + if(!R.taste_mult) + continue + if(R.id == "nutriment") //this is ugly but apparently only nutriment (not subtypes) has taste data TODO figure out why + var/list/taste_data = R.get_data() + for(var/taste in taste_data) + if(taste in tastes) + tastes[taste] += taste_data[taste] + else + tastes[taste] = taste_data[taste] + else + var/taste_desc = R.taste_description + var/taste_amount = get_reagent_amount(R.id) * R.taste_mult + if(R.taste_description in tastes) + tastes[taste_desc] += taste_amount + else + tastes[taste_desc] = taste_amount + + //deal with percentages + var/total_taste = 0 + for(var/taste_desc in tastes) + total_taste += tastes[taste_desc] + for(var/taste_desc in tastes) + var/percent = tastes[taste_desc]/total_taste * 100 + if(percent < minimum_percent) + continue + var/intensity_desc = "a hint of" + if(percent > minimum_percent * 2 || percent == 100) + intensity_desc = "the flavor of" + else if(percent > minimum_percent * 3) + intensity_desc = "the strong flavor of" + out += "[intensity_desc] [taste_desc]" + + return english_list(out, "something indescribable") \ No newline at end of file diff --git a/code/modules/mob/living/default_language.dm b/code/modules/mob/living/default_language.dm index 5204fb879b..b9eae4b5a1 100644 --- a/code/modules/mob/living/default_language.dm +++ b/code/modules/mob/living/default_language.dm @@ -5,11 +5,18 @@ set name = "Set Default Language" set category = "IC" - if(language && !can_speak(language)) - src << "You are unable to speak that language." - return + if (only_species_language && language != all_languages[src.species_language]) + to_chat(src, "You can only speak your species language, [src.species_language].") + return 0 + + if(language == all_languages[src.species_language]) + to_chat(src, "You will now speak your standard default language, [language], if you do not specify a language when speaking.") + else if (language) + + if(language && !can_speak(language)) + to_chat(src, "You are unable to speak that language.") + return - if(language) 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." diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index fd38776dd5..2ef6e62c9d 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -148,15 +148,16 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c //Languages add_language("Robot Talk", 1) - add_language("Galactic Common", 1) - add_language("Sol Common", 0) - add_language("Sinta'unathi", 0) - add_language("Siik", 0) - add_language("Skrellian", 0) - add_language("Tradeband", 1) - add_language("Gutter", 0) - add_language("Encoded Audio Language", 1) - add_language("Schechi", 0) + add_language(LANGUAGE_GALCOM, 1) + add_language(LANGUAGE_SOL_COMMON, 0) + add_language(LANGUAGE_UNATHI, 0) + add_language(LANGUAGE_SIIK, 0) + add_language(LANGUAGE_SKRELLIAN, 0) + add_language(LANGUAGE_TRADEBAND, 1) + add_language(LANGUAGE_GUTTER, 0) + add_language(LANGUAGE_EAL, 1) + add_language(LANGUAGE_SCHECHI, 0) + add_language(LANGUAGE_SIGN, 0) if(!safety)//Only used by AIize() to successfully spawn an AI. if (!B)//If there is no player/brain inside. diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 57a9dd837b..7ba76ecfb5 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -89,10 +89,11 @@ radio = card.radio //Default languages without universal translator software - add_language("Sol Common", 1) - add_language("Tradeband", 1) - add_language("Gutter", 1) - add_language("Encoded Audio Language", 1) + add_language(LANGUAGE_SOL_COMMON, 1) + add_language(LANGUAGE_TRADEBAND, 1) + add_language(LANGUAGE_GUTTER, 1) + add_language(LANGUAGE_EAL, 1) + add_language(LANGUAGE_SIGN, 0) verbs += /mob/living/silicon/pai/proc/choose_chassis verbs += /mob/living/silicon/pai/proc/choose_verbs diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 1b11e4e984..83f68056b7 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -468,13 +468,15 @@ // Sol Common, Tradeband and Gutter are added with New() and are therefore the current default, always active languages user.translator_on = !user.translator_on if(user.translator_on) - user.add_language("Sinta'unathi") - user.add_language("Siik") - user.add_language("Skrellian") + user.add_language(LANGUAGE_UNATHI) + user.add_language(LANGUAGE_SIIK) + user.add_language(LANGUAGE_SKRELLIAN) + user.add_language(LANGUAGE_SCHECHI) else - user.remove_language("Sinta'unathi") - user.remove_language("Siik") - user.remove_language("Skrellian") + user.remove_language(LANGUAGE_UNATHI) + user.remove_language(LANGUAGE_SIIK) + user.remove_language(LANGUAGE_SKRELLIAN) + user.remove_language(LANGUAGE_SCHECHI) is_active(mob/living/silicon/pai/user) return user.translator_on diff --git a/code/modules/mob/living/silicon/robot/custom_sprites.dm b/code/modules/mob/living/silicon/robot/custom_sprites.dm index 8eb937552e..07f27fcb2b 100644 --- a/code/modules/mob/living/silicon/robot/custom_sprites.dm +++ b/code/modules/mob/living/silicon/robot/custom_sprites.dm @@ -1,7 +1,7 @@ //list(ckey = real_name,) //Since the ckey is used as the icon_state, the current system will only permit a single custom robot sprite per ckey. -//While it might be possible for a ckey to use that custom sprite for several real_names, it seems rather pointless to support it. +//While it might be possible for a ckey to use that custom sprite for several real_names, it seems rather pointless to support it. ~Mech: We found it wasn't pointless. var/list/robot_custom_icons /hook/startup/proc/load_robot_custom_sprites() @@ -11,20 +11,22 @@ var/list/robot_custom_icons robot_custom_icons = list() for(var/line in lines) //split entry into ckey and real_name - var/split_idx = findtext(line, "-") //this works if ckey cannot contain dashes, and findtext starts from the beginning - if(!split_idx || split_idx == length(line)) + var/list/split_idx = splittext(line, "-") //this works if ckeys and borg names cannot contain dashes, and splittext starts from the beginning ~Mech + if(!split_idx || !split_idx.len) continue //bad entry - var/ckey = copytext(line, 1, split_idx) - var/real_name = copytext(line, split_idx+1) + var/ckey = split_idx[1] + //Prevents the CKEY from being considered a borg name / being processed into the name list. ~Mech + split_idx.Remove(ckey) - robot_custom_icons[ckey] = real_name + for(var/name in split_idx) + robot_custom_icons[name] = ckey return 1 /mob/living/silicon/robot/proc/set_custom_sprite() - var/rname = robot_custom_icons[ckey] - if(rname && rname == real_name) + var/sprite_owner = robot_custom_icons[real_name] + if(sprite_owner && sprite_owner == ckey) custom_sprite = 1 icon = CUSTOM_ITEM_SYNTH if(icon_state == "robot") - icon_state = "[ckey]-Standard" + icon_state = "[ckey]-[name]-Standard" //Compliant with robot.dm line 236 ~Mech diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 36a7e4511d..a75a8f4bcc 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -72,11 +72,11 @@ m_type = 2 if ("twitch") - message = "twitches violently." + message = "twitches." m_type = 1 - if ("twitch_s") - message = "twitches." + if ("twitch_v") + message = "twitches violently." m_type = 1 if ("nod") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 46e426c7b2..db412c4134 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -99,7 +99,7 @@ spark_system.attach(src) add_language("Robot Talk", 1) - add_language("Encoded Audio Language", 1) + add_language(LANGUAGE_EAL, 1) wires = new(src) @@ -233,7 +233,7 @@ module_sprites = new_sprites.Copy() //Custom_sprite check and entry if (custom_sprite == 1) - module_sprites["Custom"] = "[src.ckey]-[modtype]" + module_sprites["Custom"] = "[ckey]-[name]-[modtype]" //Made compliant with custom_sprites.dm line 32. (src.) was apparently redundant as it's implied. ~Mech icontype = "Custom" else icontype = module_sprites[1] diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 8b6161d049..389a25066b 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -23,7 +23,7 @@ var/global/list/robot_modules = list( var/hide_on_manifest = 0 var/channels = list() var/networks = list() - var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0) + var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0) var/sprites = list() var/can_be_pushed = 1 var/no_slip = 0 @@ -192,15 +192,15 @@ var/global/list/robot_modules = list( ..() src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo(src) - src.modules += new /obj/item/weapon/scalpel(src) - src.modules += new /obj/item/weapon/hemostat(src) - src.modules += new /obj/item/weapon/retractor(src) - src.modules += new /obj/item/weapon/cautery(src) - src.modules += new /obj/item/weapon/bonegel(src) - src.modules += new /obj/item/weapon/FixOVein(src) - src.modules += new /obj/item/weapon/bonesetter(src) - src.modules += new /obj/item/weapon/circular_saw(src) - src.modules += new /obj/item/weapon/surgicaldrill(src) + src.modules += new /obj/item/weapon/surgical/scalpel(src) + src.modules += new /obj/item/weapon/surgical/hemostat(src) + src.modules += new /obj/item/weapon/surgical/retractor(src) + src.modules += new /obj/item/weapon/surgical/cautery(src) + src.modules += new /obj/item/weapon/surgical/bonegel(src) + src.modules += new /obj/item/weapon/surgical/FixOVein(src) + src.modules += new /obj/item/weapon/surgical/bonesetter(src) + src.modules += new /obj/item/weapon/surgical/circular_saw(src) + src.modules += new /obj/item/weapon/surgical/surgicaldrill(src) src.modules += new /obj/item/weapon/gripper/no_use/organ(src) src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("pacid", 250) @@ -478,10 +478,12 @@ var/global/list/robot_modules = list( LANGUAGE_UNATHI = 1, LANGUAGE_SIIK = 1, LANGUAGE_SKRELLIAN = 1, - LANGUAGE_ROOTSPEAK = 1, + LANGUAGE_ROOTLOCAL = 0, LANGUAGE_TRADEBAND = 1, LANGUAGE_GUTTER = 1, - LANGUAGE_SCHECHI = 1 + LANGUAGE_SCHECHI = 1, + LANGUAGE_EAL = 1, + LANGUAGE_SIGN = 0 ) /obj/item/weapon/robot_module/robot/clerical/butler @@ -601,8 +603,8 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/wirecutters(src) src.modules += new /obj/item/device/multitool(src) - src.modules += new /obj/item/weapon/scalpel(src) - src.modules += new /obj/item/weapon/circular_saw(src) + src.modules += new /obj/item/weapon/surgical/scalpel(src) + src.modules += new /obj/item/weapon/surgical/circular_saw(src) src.modules += new /obj/item/weapon/reagent_containers/syringe(src) src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) src.emag = new /obj/item/weapon/hand_tele(src) @@ -631,9 +633,11 @@ var/global/list/robot_modules = list( LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_SKRELLIAN = 0, - LANGUAGE_ROOTSPEAK = 0, + LANGUAGE_ROOTLOCAL = 0, LANGUAGE_GUTTER = 1, - LANGUAGE_SCHECHI = 0 + LANGUAGE_SCHECHI = 0, + LANGUAGE_EAL = 1, + LANGUAGE_SIGN = 0 ) sprites = list( "Dread" = "securityrobot", diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm index f59f6444e0..dfcefb28a1 100644 --- a/code/modules/mob/living/simple_animal/borer/borer.dm +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -86,7 +86,7 @@ host.adjustBrainLoss(0.1) if(prob(host.brainloss/20)) - host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_s","gasp"))]") + host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_v","gasp"))]") /mob/living/simple_animal/borer/Stat() ..() diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index 93b79423ce..00b2d114c8 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -110,7 +110,7 @@ corpsemask = /obj/item/clothing/mask/gas/syndicate corpsehelmet = /obj/item/clothing/head/helmet/space/void/merc corpseback = /obj/item/weapon/tank/jetpack/oxygen - corpsepocket1 = /obj/item/weapon/tank/emergency_oxygen + corpsepocket1 = /obj/item/weapon/tank/emergency/oxygen corpseid = 1 corpseidjob = "Operative" corpseidaccess = "Syndicate" diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index fadfafc458..6ef066a257 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -43,8 +43,8 @@ /mob/living/simple_animal/spiderbot/New() ..() - add_language("Galactic Common") - default_language = all_languages["Galactic Common"] + add_language(LANGUAGE_GALCOM) + default_language = all_languages[LANGUAGE_GALCOM] verbs |= /mob/living/proc/ventcrawl verbs |= /mob/living/proc/hide diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a2251b1b20..d11319d492 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -51,13 +51,13 @@ if(!client) return if (type) - if((type & 1) && ((sdisabilities & BLIND) || blinded || paralysis) )//Vision related + if((type & 1) && (is_blind() || paralysis) )//Vision related if (!( alt )) return else msg = alt type = alt_type - if ((type & 2) && ((sdisabilities & DEAF) || ear_deaf))//Hearing related + if ((type & 2) && is_deaf())//Hearing related if (!( alt )) return else @@ -155,6 +155,12 @@ return UNBUCKLED return restrained() ? FULLY_BUCKLED : PARTIALLY_BUCKLED +/mob/proc/is_blind() + return ((sdisabilities & BLIND) || blinded || incapacitated(INCAPACITATION_KNOCKOUT)) + +/mob/proc/is_deaf() + return ((sdisabilities & DEAF) || ear_deaf || incapacitated(INCAPACITATION_KNOCKOUT)) + /mob/proc/is_physically_disabled() return incapacitated(INCAPACITATION_DISABLED) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index a586ad1efb..0f5ece0073 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -90,6 +90,8 @@ var/list/pinned = list() // List of things pinning this creature to walls (see living_defense.dm) var/list/embedded = list() // Embedded items, since simple mobs don't have organs. var/list/languages = list() // For speaking/listening. + var/species_language = null // For species who want reset to use a specified default. + var/only_species_language = 0 // For species who can only speak their default and no other languages. Does not affect understanding. var/list/speak_emote = list("says") // Verbs used when speaking. Defaults to 'say' if speak_emote is null. var/emote_type = 1 // Define emote default type, 1 for seen emotes, 2 for heard emotes var/facing_dir = null // Used for the ancient art of moonwalking. diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a6272f9c2a..dfae9eadbf 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -297,7 +297,8 @@ return var/savefile/F = get_server_news() if(F) - client.last_news_hash = md5(F["body"]) + client.prefs.lastnews = md5(F["body"]) + client.prefs.save_preferences() var/dat = "
    " dat += "

    [F["title"]]

    " diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index a68e2d1293..9e2cdf02e0 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -553,7 +553,7 @@ name = "Shaved" icon_state = "bald" gender = NEUTER - species_allowed = list("Human","Unathi","Tajara","Skrell", "Machine","Teshari") + species_allowed = list("Human","Unathi","Tajara","Skrell", "Machine","Teshari", "Vox") watson name = "Watson Mustache" @@ -884,6 +884,21 @@ icon_state = "teshari_mushroom" species_allowed = list("Teshari") + vox_quills_short + name = "Short Vox Quills" + icon_state = "vox_shortquills" + species_allowed = list("Vox") + + vox_quills_kingly + name = "Kingly Vox Quills" + icon_state = "vox_kingly" + species_allowed = list("Vox") + + vox_quills_mohawk + name = "Quill Mohawk" + icon_state = "vox_mohawk" + species_allowed = list("Vox") + /datum/sprite_accessory/facial_hair taj_sideburns diff --git a/code/modules/organs/internal/eyes.dm b/code/modules/organs/internal/eyes.dm index ddde872662..064a668686 100644 --- a/code/modules/organs/internal/eyes.dm +++ b/code/modules/organs/internal/eyes.dm @@ -11,9 +11,6 @@ /obj/item/organ/internal/eyes/robotize() ..() name = "optical sensor" - icon = 'icons/obj/robot_component.dmi' - icon_state = "camera" - dead_icon = "camera_broken" verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color /obj/item/organ/internal/eyes/robot diff --git a/code/modules/organs/internal/organ_internal.dm b/code/modules/organs/internal/organ_internal.dm index c1bfebb673..edfa5f70b7 100644 --- a/code/modules/organs/internal/organ_internal.dm +++ b/code/modules/organs/internal/organ_internal.dm @@ -33,4 +33,18 @@ if(istype(E)) E.internal_organs -= src ..() +/obj/item/organ/internal/robotize() + ..() + name = "prosthetic [initial(name)]" + icon_state = "[initial(icon_state)]_prosthetic" + if(dead_icon) + dead_icon = "[initial(dead_icon)]_prosthetic" + +/obj/item/organ/internal/mechassist() + ..() + name = "assisted [initial(name)]" + icon_state = "[initial(icon_state)]_assisted" + if(dead_icon) + dead_icon = "[initial(dead_icon)]_assisted" + // Brain is defined in brain.dm \ No newline at end of file diff --git a/code/modules/organs/misc.dm b/code/modules/organs/misc.dm index 7da4dd1106..862c96a96f 100644 --- a/code/modules/organs/misc.dm +++ b/code/modules/organs/misc.dm @@ -56,3 +56,7 @@ if(owner && owner.stat != DEAD && !is_broken()) backup_time = world.time if(owner.mind) backup = owner.mind + +/obj/item/organ/internal/stack/vox/stack + name = "vox cortical stack" + icon_state = "cortical_stack" \ No newline at end of file diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index c3a349df17..ce4103268f 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -266,7 +266,7 @@ var/list/organ_cache = list() robotize() /obj/item/organ/emp_act(severity) - if(!(robotic >= ORGAN_ROBOT)) + if(!(robotic >= ORGAN_ASSISTED)) return switch (severity) if (1) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index cae9940029..cde0b07fa7 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -140,17 +140,17 @@ /obj/item/organ/external/attackby(obj/item/weapon/W as obj, mob/living/user as mob) switch(stage) if(0) - if(istype(W,/obj/item/weapon/scalpel)) + if(istype(W,/obj/item/weapon/surgical/scalpel)) user.visible_message("[user] cuts [src] open with [W]!") stage++ return if(1) - if(istype(W,/obj/item/weapon/retractor)) + if(istype(W,/obj/item/weapon/surgical/retractor)) user.visible_message("[user] cracks [src] open like an egg with [W]!") stage++ return if(2) - if(istype(W,/obj/item/weapon/hemostat)) + if(istype(W,/obj/item/weapon/surgical/hemostat)) if(contents.len) var/obj/item/removing = pick(contents) removing.loc = get_turf(user.loc) @@ -257,8 +257,9 @@ I.take_damage(brute / 2) brute -= brute / 2 - if(status & ORGAN_BROKEN && prob(40) && brute) - if(!((species.flags & NO_PAIN) || (robotic >= ORGAN_ROBOT))) + if(status & ORGAN_BROKEN && brute) + jostle_bone(brute) + if(can_feel_pain() && prob(40)) owner.emote("scream") //getting hit on broken hand hurts if(used_weapon) add_autopsy_data("[used_weapon]", brute + burn) @@ -1002,7 +1003,8 @@ Note that amputating the affected organ does in fact remove the infection from t "You hear a loud cracking sound coming from \the [owner].",\ "Something feels like it shattered in your [name]!",\ "You hear a sickening crack.") - if(!(species.flags & NO_PAIN)) + jostle_bone() + if(can_feel_pain()) owner.emote("scream") playsound(src.loc, "fracture", 10, 1, -2) @@ -1207,6 +1209,16 @@ Note that amputating the affected organ does in fact remove the infection from t "You hear a sickening sizzle.") disfigured = 1 +/obj/item/organ/external/proc/jostle_bone(force) + if(!(status & ORGAN_BROKEN)) //intact bones stay still + return + if(brute_dam + force < min_broken_damage/5) //no papercuts moving bones + return + if(internal_organs.len && prob(brute_dam + force)) + owner.custom_pain("A piece of bone in your [encased ? encased : name] moves painfully!", 50) + var/obj/item/organ/I = pick(internal_organs) + I.take_damage(rand(3,5)) + /obj/item/organ/external/proc/get_wounds_desc() . = "" if(status & ORGAN_DESTROYED && !is_stump()) diff --git a/code/modules/organs/subtypes/vox.dm b/code/modules/organs/subtypes/vox.dm new file mode 100644 index 0000000000..c8872892d3 --- /dev/null +++ b/code/modules/organs/subtypes/vox.dm @@ -0,0 +1,30 @@ +/obj/item/organ/external/head/vox + eye_icon = "vox_eyes_s" + +//vox got different organs within. This will also help with regular surgeons knowing the organs within an alien as alien as vox. +/obj/item/organ/internal/brain/vox + icon_state = "brain_prosthetic" + dead_icon = null + +/obj/item/organ/internal/heart/vox + icon_state = "vox_heart" + dead_icon = null + parent_organ = BP_GROIN + +/obj/item/organ/internal/lungs/vox + name = "air capillary sack" //Like birds, Vox absorb gas via air capillaries. + icon_state = "vox_lung" + +/obj/item/organ/internal/kidneys/vox + name = "filtration bladder" + icon_state = "lungs" //wow are vox kidneys fat. + color = "#99ccff" + parent_organ = BP_TORSO + +/obj/item/organ/internal/liver/vox + name = "waste tract" + parent_organ = BP_TORSO + color = "#0033cc" + +/obj/item/organ/external/groin/vox //vox have an extended ribcage for extra protection. + encased = "lower ribcage" diff --git a/code/modules/projectiles/effects.dm b/code/modules/projectiles/effects.dm index 8089893b5e..71d5d12d2e 100644 --- a/code/modules/projectiles/effects.dm +++ b/code/modules/projectiles/effects.dm @@ -223,4 +223,25 @@ icon_state = "impact_lightning" light_range = 2 light_power = 0.5 - light_color = "#00C6FF" \ No newline at end of file + light_color = "#00C6FF" + +//---------------------------- +// Dark matter +//---------------------------- +/obj/effect/projectile/darkmatter/tracer + icon_state = "darkb" + light_range = 2 + light_power = 0.5 + light_color = "#8837A3" + +/obj/effect/projectile/darkmatter/muzzle + icon_state = "muzzle_darkb" + light_range = 2 + light_power = 0.5 + light_color = "#8837A3" + +/obj/effect/projectile/darkmatter/impact + icon_state = "impact_darkb" + light_range = 2 + light_power = 0.5 + light_color = "#8837A3" \ No newline at end of file diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm deleted file mode 100644 index 5889b523e1..0000000000 --- a/code/modules/projectiles/guns/alien.dm +++ /dev/null @@ -1,46 +0,0 @@ -// Alien pinning weapon. -/obj/item/weapon/gun/launcher/spikethrower - - name = "spike thrower" - desc = "A vicious alien projectile weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." - - var/last_regen = 0 - var/spike_gen_time = 150 - var/max_spikes = 3 - var/spikes = 3 - release_force = 30 - icon = 'icons/obj/gun.dmi' - icon_state = "spikethrower3" - item_state = "spikethrower" - fire_sound_text = "a strange noise" - fire_sound = 'sound/weapons/bladeslice.ogg' - -/obj/item/weapon/gun/launcher/spikethrower/New() - ..() - processing_objects.Add(src) - last_regen = world.time - -/obj/item/weapon/gun/launcher/spikethrower/Destroy() - processing_objects.Remove(src) - ..() - -/obj/item/weapon/gun/launcher/spikethrower/process() - if(spikes < max_spikes && world.time > last_regen + spike_gen_time) - spikes++ - last_regen = world.time - update_icon() - -/obj/item/weapon/gun/launcher/spikethrower/examine(mob/user) - ..(user) - user << "It has [spikes] spike\s remaining." - -/obj/item/weapon/gun/launcher/spikethrower/update_icon() - icon_state = "spikethrower[spikes]" - -/obj/item/weapon/gun/launcher/spikethrower/update_release_force() - return - -/obj/item/weapon/gun/launcher/spikethrower/consume_next_projectile() - if(spikes < 1) return null - spikes-- - return new /obj/item/weapon/spike(src) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 6a02d8a38f..4443775df5 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -149,4 +149,4 @@ obj/item/weapon/gun/energy/staff/focus charge_cost = 200 user << "The [src.name] will now strike only a single person." projectile_type = "/obj/item/projectile/forcebolt" - */ + */ \ 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 b41c1b090b..41e8c9a53d 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -55,3 +55,14 @@ force = 10 matter = list(DEFAULT_WALL_MATERIAL = 200000) projectile_type = /obj/item/projectile/energy/bolt/large + +/obj/item/weapon/gun/energy/plasmastun + name = "plasma pulse projector" + desc = "The Mars Military Industries MA21 Selkie is a weapon that uses a laser pulse to ionise the local atmosphere, creating a disorienting pulse of plasma and deafening shockwave as the wave expands." + icon_state = "plasma_stun" + item_state = "plasma_stun" + fire_sound = 'sound/weapons/blaster.ogg' + origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_POWER = 3) + fire_delay = 20 + charge_cost = 600 + projectile_type = /obj/item/projectile/energy/plasmastun \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/boltaction.dm b/code/modules/projectiles/guns/projectile/boltaction.dm index c6e25ca767..f96dfd22ea 100644 --- a/code/modules/projectiles/guns/projectile/boltaction.dm +++ b/code/modules/projectiles/guns/projectile/boltaction.dm @@ -30,7 +30,7 @@ // Stole hacky terrible code from doublebarrel shotgun. -Spades /obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin/attackby(var/obj/item/A as obj, mob/user as mob) - if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter) && w_class != ITEMSIZE_NORMAL) + if(istype(A, /obj/item/weapon/surgical/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter) && w_class != ITEMSIZE_NORMAL) user << "You begin to shorten the barrel and stock of \the [src]." if(loaded.len) afterattack(user, user) //will this work? //it will. we call it twice, for twice the FUN diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 520333c242..84ad0bc426 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -87,7 +87,7 @@ //this is largely hacky and bad :( -Pete /obj/item/weapon/gun/projectile/shotgun/doublebarrel/attackby(var/obj/item/A as obj, mob/user as mob) - if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter)) + if(istype(A, /obj/item/weapon/surgical/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter)) user << "You begin to shorten the barrel of \the [src]." if(loaded.len) var/burstsetting = burst diff --git a/code/modules/projectiles/guns/vox.dm b/code/modules/projectiles/guns/vox.dm new file mode 100644 index 0000000000..c1e0e84cf8 --- /dev/null +++ b/code/modules/projectiles/guns/vox.dm @@ -0,0 +1,139 @@ +/* + * Vox Spike Thrower + * Alien pinning weapon. + */ + +/obj/item/weapon/gun/launcher/spikethrower + name = "spike thrower" + desc = "A vicious alien projectile weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." + + var/last_regen = 0 + var/spike_gen_time = 150 + var/max_spikes = 3 + var/spikes = 3 + release_force = 30 + icon = 'icons/obj/gun.dmi' + icon_state = "spikethrower3" + item_state = "spikethrower" + fire_sound_text = "a strange noise" + fire_sound = 'sound/weapons/bladeslice.ogg' + +/obj/item/weapon/gun/launcher/spikethrower/New() + ..() + processing_objects.Add(src) + last_regen = world.time + +/obj/item/weapon/gun/launcher/spikethrower/Destroy() + processing_objects.Remove(src) + ..() + +/obj/item/weapon/gun/launcher/spikethrower/process() + if(spikes < max_spikes && world.time > last_regen + spike_gen_time) + spikes++ + last_regen = world.time + update_icon() + +/obj/item/weapon/gun/launcher/spikethrower/examine(mob/user) + ..(user) + user << "It has [spikes] spike\s remaining." + +/obj/item/weapon/gun/launcher/spikethrower/update_icon() + icon_state = "spikethrower[spikes]" + +/obj/item/weapon/gun/launcher/spikethrower/update_release_force() + return + +/obj/item/weapon/gun/launcher/spikethrower/consume_next_projectile() + if(spikes < 1) return null + spikes-- + return new /obj/item/weapon/spike(src) + +/* + * Vox Darkmatter Cannon + */ +/obj/item/weapon/gun/energy/darkmatter + name = "dark matter gun" + desc = "A vicious alien beam weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." + icon_state = "darkcannon" + item_state = "darkcannon" + fire_sound = 'sound/weapons/eLuger.ogg' + charge_cost = 600 + projectile_type = /obj/item/projectile/beam/darkmatter + self_recharge = 1 + accuracy = 2 + + firemodes = list( + list(mode_name="focused", burst=1, fire_delay=null, move_delay=null, burst_accuracy=list(2), dispersion=null, projectile_type=/obj/item/projectile/beam/darkmatter, charge_cost = 600), + list(mode_name="scatter burst", burst=8, fire_delay=null, move_delay=4, burst_accuracy=list(0, 0, 0, 0, 0, 0, 0, 0), dispersion=list(3, 3, 3, 3, 3, 3, 3, 3, 3), projectile_type=/obj/item/projectile/energy/darkmatter, charge_cost = 300), + ) + +/obj/item/projectile/beam/darkmatter + name = "dark matter bolt" + icon_state = "darkb" + damage = 60 + armor_penetration = 35 + damage_type = BRUTE + check_armour = "energy" + light_color = "#8837A3" + + embed_chance = 0 + + muzzle_type = /obj/effect/projectile/darkmatter/muzzle + tracer_type = /obj/effect/projectile/darkmatter/tracer + impact_type = /obj/effect/projectile/darkmatter/impact + +/obj/item/projectile/energy/darkmatter + name = "dark matter pellet" + icon_state = "dark_pellet" + damage = 20 + armor_penetration = 35 + damage_type = BRUTE + check_armour = "energy" + light_color = "#8837A3" + + embed_chance = 0 + +/* + * Vox Darkmatter Cannon + */ +/obj/item/weapon/gun/energy/sonic + name = "soundcannon" + desc = "A vicious alien sound weapon. Parts of it quiver gelatinously, as though the thing is insectile and alive." + icon_state = "noise" + item_state = "noise" + fire_sound = 'sound/effects/basscannon.ogg' + self_recharge = 1 + charge_cost = 600 + + projectile_type=/obj/item/projectile/sonic/strong + + firemodes = list( + list(mode_name="normal", projectile_type=/obj/item/projectile/sonic/strong, charge_cost = 600), + list(mode_name="suppressive", projectile_type=/obj/item/projectile/sonic/weak, charge_cost = 300), + ) + +/obj/item/projectile/sonic + name = "sonic pulse" + icon_state = "sound" + damage = 15 + armor_penetration = 30 + damage_type = BRUTE + check_armour = "melee" + embed_chance = 0 + vacuum_traversal = 0 + +// var/amplitude = 10 //Roughly how loud it is, changes the way damage will work, and such + +/obj/item/projectile/sonic/weak + agony = 30 + +/obj/item/projectile/sonic/strong + damage = 45 + +//Already have thoughts on how to improve this, will take a day or two after initial testing. - Anewbe + +/obj/item/projectile/sonic/strong/on_hit(var/atom/movable/target, var/blocked = 0) + if(ismob(target)) + var/throwdir = get_dir(firer,target) + target.throw_at(get_edge_target_turf(target, throwdir), rand(1,6), 10) + return 1 \ No newline at end of file diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 484c1e0163..750164a260 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -65,6 +65,8 @@ var/tracer_type var/impact_type + var/vacuum_traversal = 1 //Determines if the projectile can exist in vacuum, if false, the projectile will be deleted if it enters vacuum. + var/datum/plot_vector/trajectory // used to plot the path of the projectile var/datum/vector_loc/location // current location of the projectile in pixel space var/matrix/effect_transform // matrix to rotate and scale projectile effects - putting it here so it doesn't @@ -300,6 +302,10 @@ qdel(src) // if it's left the world... kill it return + if (is_below_sound_pressure(get_turf(src)) && !vacuum_traversal) //Deletes projectiles that aren't supposed to bein vacuum if they leave pressurised areas + qdel(src) + return + before_move() Move(location.return_turf()) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 1f0dd03854..bf83edecec 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -8,6 +8,7 @@ eyeblur = 4 var/frequency = 1 hitscan = 1 + embed_chance = 0 invisibility = 101 //beam projectiles are invisible as they are rendered by the effect engine light_range = 2 light_power = 0.5 diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 0d9d4ef5fa..5345f06dc9 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -133,3 +133,42 @@ light_range = 2 light_power = 0.5 light_color = "#33CC00" + +/obj/item/projectile/energy/plasmastun + name = "plasma pulse" + icon_state = "plasma_stun" + armor_penetration = 10 + kill_count = 4 + damage = 5 + agony = 55 + damage_type = BURN + vacuum_traversal = 0 //Projectile disappears in empty space + +/obj/item/projectile/energy/plasmastun/proc/bang(var/mob/living/carbon/M) + + to_chat(M, "You hear a loud roar.") + playsound(M.loc, 'sound/effects/bang.ogg', 50, 1) + var/ear_safety = 0 + ear_safety = M.get_ear_protection() + if(ear_safety == 1) + M.confused += 150 + else if (ear_safety > 1) + M.confused += 30 + else if (!ear_safety) + M.Stun(10) + M.Weaken(2) + M.ear_damage += rand(1, 10) + M.ear_deaf = max(M.ear_deaf,15) + if (M.ear_damage >= 15) + to_chat(M, "Your ears start to ring badly!") + if (prob(M.ear_damage - 5)) + to_chat(M, "You can't hear anything!") + M.sdisabilities |= DEAF + else + if (M.ear_damage >= 5) + to_chat(M, "Your ears start to ring!") + M.update_icons() + +/obj/item/projectile/energy/plasmastun/on_hit(var/atom/target) + bang(target) + . = ..() \ No newline at end of file diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 7ce94948fc..8aba3c0928 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -156,4 +156,3 @@ nodamage = 1 damage_type = HALLOSS muzzle_type = /obj/effect/projectile/bullet/muzzle - diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index c2b4157ff3..49c1099184 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -383,7 +383,7 @@ return trans_to_holder(R, amount, multiplier, copy) if(type == CHEM_INGEST) var/datum/reagents/R = C.ingested - return trans_to_holder(R, amount, multiplier, copy) + return C.ingest(src, R, amount, multiplier, copy) if(type == CHEM_TOUCH) var/datum/reagents/R = C.touching return trans_to_holder(R, amount, multiplier, copy) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 29d997cde5..9e7fbd461f 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -14,6 +14,8 @@ var/name = "Reagent" var/id = "reagent" var/description = "A non-descript chemical." + var/taste_description = "bitterness" + var/taste_mult = 1 //how this taste compares to others. Higher values means it is more noticable var/datum/reagents/holder = null var/reagent_state = SOLID var/list/data = null diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index 27f40820e7..f6208f59ff 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -2,6 +2,8 @@ data = new/list("donor" = null, "viruses" = null, "species" = "Human", "blood_DNA" = null, "blood_type" = null, "blood_colour" = "#A10808", "resistances" = null, "trace_chem" = null, "antibodies" = list()) name = "Blood" id = "blood" + taste_description = "iron" + taste_mult = 1.3 reagent_state = LIQUID metabolism = REM * 5 mrate_static = TRUE @@ -74,6 +76,7 @@ /datum/reagent/antibodies data = list("antibodies"=list()) name = "Antibodies" + taste_description = "slime" id = "antibodies" reagent_state = LIQUID color = "#0050F0" @@ -88,6 +91,7 @@ /datum/reagent/water name = "Water" id = "water" + taste_description = "water" description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen." reagent_state = LIQUID color = "#0064C877" @@ -150,6 +154,7 @@ name = "Welding fuel" id = "fuel" description = "Required for welders. Flamable." + taste_description = "gross metal" reagent_state = LIQUID color = "#660000" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index 617fb31e58..44ad6f24a2 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -2,13 +2,17 @@ name = "Aluminum" id = "aluminum" description = "A silvery white and ductile member of the boron group of chemical elements." + taste_description = "metal" + taste_mult = 1.1 reagent_state = SOLID color = "#A8A8A8" /datum/reagent/carbon name = "Carbon" id = "carbon" - description = "A chemical element, the builing block of life." + description = "A chemical element, the building block of life." + taste_description = "sour chalk" + taste_mult = 1.5 reagent_state = SOLID color = "#1C1300" ingest_met = REM * 5 @@ -37,6 +41,7 @@ name = "Chlorine" id = "chlorine" description = "A chemical element with a characteristic odour." + taste_description = "pool water" reagent_state = GAS color = "#808080" @@ -50,12 +55,14 @@ name = "Copper" id = "copper" description = "A highly ductile metal." + taste_description = "pennies" color = "#6E3B08" /datum/reagent/ethanol name = "Ethanol" //Parent class for all alcoholic reagents. id = "ethanol" description = "A well-known alcohol with a variety of applications." + taste_description = "pure alcohol" reagent_state = LIQUID color = "#404030" var/nutriment_factor = 0 @@ -87,6 +94,8 @@ var/strength_mod = 1 if(alien == IS_SKRELL) strength_mod *= 5 + if(alien == IS_TAJARA) + strength_mod *= 1.75 if(alien == IS_DIONA) strength_mod = 0 @@ -140,6 +149,7 @@ name = "Fluorine" id = "fluorine" description = "A highly-reactive chemical element." + taste_description = "acid" reagent_state = GAS color = "#808080" @@ -153,6 +163,7 @@ name = "Hydrogen" id = "hydrogen" description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas." + taste_mult = 0 //no taste reagent_state = GAS color = "#808080" @@ -160,6 +171,7 @@ name = "Iron" id = "iron" description = "Pure iron is a metal." + taste_description = "metal" reagent_state = SOLID color = "#353535" @@ -171,6 +183,7 @@ name = "Lithium" id = "lithium" description = "A chemical element, used as antidepressant." + taste_description = "metal" reagent_state = SOLID color = "#808080" @@ -185,6 +198,7 @@ name = "Mercury" id = "mercury" description = "A chemical element." + taste_mult = 0 //mercury apparently is tasteless. IDK reagent_state = LIQUID color = "#484848" @@ -200,17 +214,15 @@ name = "Nitrogen" id = "nitrogen" description = "A colorless, odorless, tasteless gas." + taste_mult = 0 //no taste reagent_state = GAS color = "#808080" -/datum/reagent/nitrogen/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(alien == IS_VOX) - M.adjustOxyLoss(-removed * 3) - /datum/reagent/oxygen name = "Oxygen" id = "oxygen" description = "A colorless, odorless gas." + taste_mult = 0 reagent_state = GAS color = "#808080" @@ -222,6 +234,7 @@ name = "Phosphorus" id = "phosphorus" description = "A chemical element, the backbone of biological energy carriers." + taste_description = "vinegar" reagent_state = SOLID color = "#832828" @@ -229,6 +242,7 @@ name = "Potassium" id = "potassium" description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water." + taste_description = "sweetness" //potassium is bitter in higher doses but sweet in lower ones. reagent_state = SOLID color = "#A0A0A0" @@ -236,6 +250,7 @@ name = "Radium" id = "radium" description = "Radium is an alkaline earth metal. It is extremely radioactive." + taste_mult = 0 //Apparently radium is tasteless reagent_state = SOLID color = "#C7C7C7" @@ -268,6 +283,7 @@ name = "Sulphuric acid" id = "sacid" description = "A very corrosive mineral acid with the molecular formula H2SO4." + taste_description = "acid" reagent_state = LIQUID color = "#DB5008" metabolism = REM * 2 @@ -354,6 +370,7 @@ name = "Silicon" id = "silicon" description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon." + taste_mult = 0 reagent_state = SOLID color = "#A8A8A8" @@ -361,6 +378,7 @@ name = "Sodium" id = "sodium" description = "A chemical element, readily reacts with water." + taste_description = "salty metal" reagent_state = SOLID color = "#808080" @@ -368,6 +386,8 @@ name = "Sugar" id = "sugar" description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste." + taste_description = "sugar" + taste_mult = 1.8 reagent_state = SOLID color = "#FFFFFF" @@ -400,6 +420,7 @@ name = "Sulfur" id = "sulfur" description = "A chemical element with a pungent smell." + taste_description = "old eggs" reagent_state = SOLID color = "#BF8C00" @@ -407,5 +428,7 @@ name = "Tungsten" id = "tungsten" description = "A chemical element, and a strong oxidising agent." + taste_description = "metal" + taste_mult = 0 //no taste reagent_state = SOLID color = "#DCDCDC" 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 57a95b338f..5cff9231a1 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -4,6 +4,7 @@ name = "Nutriment" id = "nutriment" description = "All the vitamins, minerals, and carbohydrates the body needs in pure form." + taste_mult = 4 reagent_state = SOLID metabolism = REM * 4 mrate_static = TRUE @@ -11,6 +12,26 @@ var/injectable = 0 color = "#664330" +/datum/reagent/nutriment/mix_data(var/list/newdata, var/newamount) + + if(!islist(newdata) || !newdata.len) + return + + //add the new taste data + for(var/taste in newdata) + if(taste in data) + data[taste] += newdata[taste] + else + data[taste] = newdata[taste] + + //cull all tastes below 10% of total + var/totalFlavor = 0 + for(var/taste in data) + totalFlavor += data[taste] + for(var/taste in data) + if(data[taste]/totalFlavor < 0.1) + data -= taste + /datum/reagent/nutriment/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(!injectable) M.adjustToxLoss(0.1 * removed) @@ -28,6 +49,7 @@ /datum/reagent/nutriment/glucose name = "Glucose" id = "glucose" + taste_description = "sweetness" color = "#FFFFFF" injectable = 1 @@ -35,6 +57,7 @@ /datum/reagent/nutriment/protein // Bad for Skrell! name = "animal protein" id = "protein" + taste_description = "some sort of meat" color = "#440000" /datum/reagent/nutriment/protein/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) @@ -58,12 +81,14 @@ /datum/reagent/nutriment/protein/egg // Also bad for skrell. name = "egg yolk" id = "egg" + taste_description = "egg" color = "#FFFFAA" /datum/reagent/nutriment/honey name = "Honey" id = "honey" description = "A golden yellow syrup, loaded with sugary sweetness." + taste_description = "sweetness" nutriment_factor = 10 color = "#FFFF00" @@ -92,6 +117,7 @@ name = "flour" id = "flour" description = "This is what you rub all over yourself to pretend to be a ghost." + taste_description = "chalky wheat" reagent_state = SOLID nutriment_factor = 1 color = "#FFFFFF" @@ -104,6 +130,8 @@ name = "Coco Powder" id = "coco" description = "A fatty, bitter paste made from coco beans." + taste_description = "bitterness" + taste_mult = 1.3 reagent_state = SOLID nutriment_factor = 5 color = "#302000" @@ -112,6 +140,8 @@ name = "Soysauce" id = "soysauce" description = "A salty sauce made from the soy plant." + taste_description = "umami" + taste_mult = 1.1 reagent_state = LIQUID nutriment_factor = 2 color = "#792300" @@ -120,6 +150,7 @@ name = "Ketchup" id = "ketchup" description = "Ketchup, catsup, whatever. It's tomato paste." + taste_description = "ketchup" reagent_state = LIQUID nutriment_factor = 5 color = "#731008" @@ -128,6 +159,8 @@ name = "Rice" id = "rice" description = "Enjoy the great taste of nothing." + taste_description = "rice" + taste_mult = 0.4 reagent_state = SOLID nutriment_factor = 1 color = "#FFFFFF" @@ -136,6 +169,8 @@ name = "Cherry Jelly" id = "cherryjelly" description = "Totally the best. Only to be spread on foods with excellent lateral symmetry." + taste_description = "cherry" + taste_mult = 1.3 reagent_state = LIQUID nutriment_factor = 1 color = "#801E28" @@ -144,6 +179,8 @@ name = "Corn Oil" id = "cornoil" description = "An oil derived from various types of corn." + taste_description = "slime" + taste_mult = 0.1 reagent_state = LIQUID nutriment_factor = 20 color = "#302000" @@ -167,6 +204,8 @@ name = "Virus Food" id = "virusfood" description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." + taste_description = "vomit" + taste_mult = 2 reagent_state = LIQUID nutriment_factor = 2 color = "#899613" @@ -175,6 +214,7 @@ name = "Sprinkles" id = "sprinkles" description = "Multi-colored little bits of sugar, commonly found on donuts. Loved by cops." + taste_description = "sugar" nutriment_factor = 1 color = "#FF00FF" @@ -182,6 +222,7 @@ name = "Mint" id = "mint" description = "Also known as Mentha." + taste_description = "mint" reagent_state = LIQUID color = "#CF3600" @@ -189,6 +230,7 @@ name = "Lipozine" id = "lipozine" description = "A chemical compound that causes a powerful fat-burning reaction." + taste_description = "mothballs" reagent_state = LIQUID color = "#BBEDA4" overdose = REAGENTS_OVERDOSE @@ -205,6 +247,7 @@ name = "Table Salt" id = "sodiumchloride" description = "A salt made of sodium chloride. Commonly used to season food." + taste_description = "salt" reagent_state = SOLID color = "#FFFFFF" overdose = REAGENTS_OVERDOSE @@ -213,6 +256,7 @@ name = "Black Pepper" id = "blackpepper" description = "A powder ground from peppercorns. *AAAACHOOO*" + taste_description = "pepper" reagent_state = SOLID color = "#000000" @@ -220,6 +264,8 @@ name = "Universal Enzyme" id = "enzyme" description = "A universal enzyme used in the preperation of certain chemicals and foods." + taste_description = "sweetness" + taste_mult = 0.7 reagent_state = LIQUID color = "#365E30" overdose = REAGENTS_OVERDOSE @@ -228,6 +274,8 @@ name = "Frost Oil" id = "frostoil" description = "A special oil that noticably chills the body. Extracted from Ice Peppers." + taste_description = "mint" + taste_mult = 1.5 reagent_state = LIQUID color = "#B31008" @@ -245,6 +293,8 @@ name = "Capsaicin Oil" id = "capsaicin" description = "This is what makes chilis hot." + taste_description = "hot peppers" + taste_mult = 1.5 reagent_state = LIQUID color = "#B31008" @@ -275,6 +325,8 @@ name = "Condensed Capsaicin" id = "condensedcapsaicin" description = "A chemical agent used for self-defense and in police work." + taste_description = "fire" + taste_mult = 10 reagent_state = LIQUID touch_met = 50 // Get rid of it quickly color = "#B31008" @@ -388,6 +440,7 @@ name = "Banana Juice" id = "banana" description = "The raw essence of a banana." + taste_description = "banana" color = "#C3AF00" glass_name = "banana juice" @@ -397,6 +450,7 @@ name = "Berry Juice" id = "berryjuice" description = "A delicious blend of several different kinds of berries." + taste_description = "berries" color = "#990066" glass_name = "berry juice" @@ -406,6 +460,7 @@ name = "Carrot juice" id = "carrotjuice" description = "It is just like a carrot but without crunching." + taste_description = "carrots" color = "#FF8C00" // rgb: 255, 140, 0 glass_name = "carrot juice" @@ -419,6 +474,7 @@ name = "Grape Juice" id = "grapejuice" description = "It's grrrrrape!" + taste_description = "grapes" color = "#863333" glass_name = "grape juice" @@ -449,6 +505,8 @@ name = "Lemon Juice" id = "lemonjuice" description = "This juice is VERY sour." + taste_description = "sourness" + taste_mult = 1.1 color = "#AFAF00" glass_name = "lemon juice" @@ -458,6 +516,8 @@ name = "Lime Juice" id = "limejuice" description = "The sweet-sour juice of limes." + taste_description = "sourness" + taste_mult = 1.8 color = "#365E30" glass_name = "lime juice" @@ -473,6 +533,7 @@ name = "Orange juice" id = "orangejuice" description = "Both delicious AND rich in Vitamin C, what more do you need?" + taste_description = "oranges" color = "#E78108" glass_name = "orange juice" @@ -488,6 +549,7 @@ name = "Poison Berry Juice" id = "poisonberryjuice" description = "A tasty juice blended from various kinds of very deadly and toxic berries." + taste_description = "berries" color = "#863353" strength = 5 @@ -498,6 +560,7 @@ name = "Potato Juice" id = "potato" description = "Juice of the potato. Bleh." + taste_description = "potatoes" nutrition = 2 color = "#302000" @@ -508,6 +571,7 @@ name = "Tomato Juice" id = "tomatojuice" description = "Tomatoes made into juice. What a waste of big, juicy tomatoes, huh?" + taste_description = "tomatoes" color = "#731008" glass_name = "tomato juice" @@ -523,6 +587,7 @@ name = "Watermelon Juice" id = "watermelonjuice" description = "Delicious juice made from watermelon." + taste_description = "sweet watermelon" color = "#B83333" glass_name = "watermelon juice" @@ -534,6 +599,7 @@ name = "Milk" id = "milk" description = "An opaque white liquid produced by the mammary glands of mammals." + taste_description = "milk" color = "#DFDFDF" glass_name = "milk" @@ -547,6 +613,7 @@ name = "Chocolate Milk" id = "chocolate_milk" description = "A delicious mixture of perfectly healthy mix and terrible chocolate." + taste_description = "chocolate milk" color = "#74533b" cup_icon_state = "cup_brown" @@ -568,6 +635,7 @@ name = "Cream" id = "cream" description = "The fatty, still liquid part of milk. Why don't you mix this with sum scotch, eh?" + taste_description = "thick milk" color = "#DFD7AF" glass_name = "cream" @@ -581,6 +649,7 @@ name = "Soy Milk" id = "soymilk" description = "An opaque white liquid made from soybeans." + taste_description = "soy milk" color = "#DFDFC7" glass_name = "soy milk" @@ -594,6 +663,7 @@ name = "Tea" id = "tea" description = "Tasty black tea, it has antioxidants, it's good for you!" + taste_description = "black tea" color = "#832700" adj_dizzy = -2 adj_drowsy = -1 @@ -617,6 +687,7 @@ name = "Iced Tea" id = "icetea" description = "No relation to a certain rap artist/ actor." + taste_description = "sweet tea" color = "#AC7F24" // rgb: 16, 64, 56 adj_temp = -5 @@ -632,6 +703,8 @@ name = "Coffee" id = "coffee" description = "Coffee is a brewed drink prepared from roasted seeds, commonly called coffee beans, of the coffee plant." + taste_description = "coffee" + taste_mult = 1.3 color = "#482000" adj_dizzy = -5 adj_drowsy = -3 @@ -651,16 +724,25 @@ if(alien == IS_DIONA) return ..() - + if(alien == IS_TAJARA) + M.adjustToxLoss(0.5 * removed) + M.make_jittery(4) //extra sensitive to caffine if(adj_temp > 0) holder.remove_reagent("frostoil", 10 * removed) /datum/reagent/nutriment/coffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() + if(alien == IS_TAJARA) + M.adjustToxLoss(2 * removed) + M.make_jittery(4) + return /datum/reagent/drink/coffee/overdose(var/mob/living/carbon/M, var/alien) if(alien == IS_DIONA) return + if(alien == IS_TAJARA) + M.adjustToxLoss(4 * REM) + M.apply_effect(3, STUTTER) M.make_jittery(5) /datum/reagent/drink/coffee/icecoffee @@ -678,6 +760,7 @@ name = "Soy Latte" id = "soy_latte" description = "A nice and tasty beverage while you are reading your hippie books." + taste_description = "creamy coffee" color = "#C65905" adj_temp = 5 @@ -697,6 +780,7 @@ name = "Cafe Latte" id = "cafe_latte" description = "A nice, strong and tasty beverage while you are reading." + taste_description = "bitter cream" color = "#C65905" adj_temp = 5 @@ -715,6 +799,7 @@ name = "Hot Chocolate" id = "hot_coco" description = "Made with love! And cocoa beans." + taste_description = "creamy chocolate" reagent_state = LIQUID color = "#403010" nutrition = 2 @@ -731,6 +816,7 @@ name = "Soda Water" id = "sodawater" description = "A can of club soda. Why not make a scotch and soda?" + taste_description = "carbonated water" color = "#619494" adj_dizzy = -5 adj_drowsy = -3 @@ -744,6 +830,7 @@ name = "Grape Soda" id = "grapesoda" description = "Grapes made into a fine drank." + taste_description = "grape soda" color = "#421C52" adj_drowsy = -3 @@ -755,6 +842,7 @@ name = "Tonic Water" id = "tonic" description = "It tastes strange but at least the quinine keeps the Space Malaria at bay." + taste_description = "tart and fresh" color = "#619494" adj_dizzy = -5 @@ -767,8 +855,9 @@ /datum/reagent/drink/soda/lemonade name = "Lemonade" - description = "Oh the nostalgia..." id = "lemonade" + description = "Oh the nostalgia..." + taste_description = "lemonade" color = "#FFFF00" adj_temp = -5 @@ -778,8 +867,9 @@ /datum/reagent/drink/soda/kiraspecial name = "Kira Special" - description = "Long live the guy who everyone had mistaken for a girl. Baka!" id = "kiraspecial" + description = "Long live the guy who everyone had mistaken for a girl. Baka!" + taste_description = "fruity sweetness" color = "#CCCC99" adj_temp = -5 @@ -789,8 +879,9 @@ /datum/reagent/drink/soda/brownstar name = "Brown Star" - description = "It's not what it sounds like..." id = "brownstar" + description = "It's not what it sounds like..." + taste_description = "orange and cola soda" color = "#9F3400" adj_temp = -2 @@ -799,8 +890,9 @@ /datum/reagent/drink/milkshake name = "Milkshake" - description = "Glorious brainfreezing mixture." id = "milkshake" + description = "Glorious brainfreezing mixture." + taste_description = "vanilla milkshake" color = "#AEE5E4" adj_temp = -9 @@ -830,8 +922,9 @@ /datum/reagent/drink/rewriter name = "Rewriter" - description = "The secret of the sanctuary of the Libarian..." id = "rewriter" + description = "The secret of the sanctuary of the Libarian..." + taste_description = "citrus and coffee" color = "#485000" adj_temp = -5 @@ -846,6 +939,7 @@ name = "Nuka Cola" id = "nuka_cola" description = "Cola, cola never changes." + taste_description = "cola" color = "#100800" adj_temp = -5 adj_sleepy = -2 @@ -866,6 +960,7 @@ name = "Grenadine Syrup" id = "grenadine" description = "Made in the modern day with proper pomegranate substitute. Who uses real fruit, anyways?" + taste_description = "100% pure pomegranate" color = "#FF004F" glass_name = "grenadine syrup" @@ -875,6 +970,7 @@ name = "Space Cola" id = "cola" description = "A refreshing beverage." + taste_description = "cola" reagent_state = LIQUID color = "#100800" adj_drowsy = -3 @@ -888,6 +984,7 @@ name = "Mountain Wind" id = "spacemountainwind" description = "Blows right through you like a space wind." + taste_description = "sweet citrus soda" color = "#102000" adj_drowsy = -7 adj_sleepy = -1 @@ -901,6 +998,7 @@ name = "Dr. Gibb" id = "dr_gibb" description = "A delicious blend of 42 different flavours" + taste_description = "cherry soda" color = "#102000" adj_drowsy = -6 adj_temp = -5 @@ -912,6 +1010,7 @@ name = "Space-Up" id = "space_up" description = "Tastes like a hull breach in your mouth." + taste_description = "citrus soda" color = "#202800" adj_temp = -8 @@ -921,8 +1020,9 @@ /datum/reagent/drink/soda/lemon_lime name = "Lemon Lime" - description = "A tangy substance made of 0.5% natural citrus!" id = "lemon_lime" + description = "A tangy substance made of 0.5% natural citrus!" + taste_description = "tangy lime and lemon soda" color = "#878F00" adj_temp = -8 @@ -932,8 +1032,9 @@ /datum/reagent/drink/shirley_temple name = "Shirley Temple" - description = "A sweet concotion hated even by its namesake." id = "shirley_temple" + description = "A sweet concotion hated even by its namesake." + taste_description = "sweet ginger ale" color = "#EF304F" adj_temp = -8 @@ -943,8 +1044,9 @@ /datum/reagent/drink/roy_rogers name = "Roy Rogers" - description = "I'm a cowboy, on a steel horse I ride." id = "roy_rogers" + description = "I'm a cowboy, on a steel horse I ride." + taste_description = "cola and fruit" color = "#4F1811" adj_temp = -8 @@ -954,8 +1056,9 @@ /datum/reagent/drink/collins_mix name = "Collins Mix" - description = "Best hope it isn't a hoax." id = "collins_mix" + description = "Best hope it isn't a hoax." + taste_description = "gin and lemonade" color = "#D7D0B3" adj_temp = -8 @@ -965,8 +1068,9 @@ /datum/reagent/drink/arnold_palmer name = "Arnold Palmer" - description = "Tastes just like the old man." id = "arnold_palmer" + description = "Tastes just like the old man." + taste_description = "lemon and sweet tea" color = "#AF5517" adj_temp = -8 @@ -978,6 +1082,7 @@ name = "The Doctor's Delight" id = "doctorsdelight" description = "A gulp a day keeps the MediBot away. That's probably for the best." + taste_description = "homely fruit smoothie" reagent_state = LIQUID color = "#FF8CFF" nutrition = 1 @@ -1001,6 +1106,7 @@ name = "Dry Ramen" id = "dry_ramen" description = "Space age food, since August 25, 1958. Contains dried noodles, vegetables, and chemicals that boil in contact with water." + taste_description = "dry cheap noodles" reagent_state = SOLID nutrition = 1 color = "#302000" @@ -1009,6 +1115,7 @@ name = "Hot Ramen" id = "hot_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." + taste_description = "noodles and salt" reagent_state = LIQUID color = "#302000" nutrition = 5 @@ -1018,6 +1125,8 @@ name = "Hell Ramen" id = "hell_ramen" description = "The noodles are boiled, the flavors are artificial, just like being back in school." + taste_description = "noodles and spice" + taste_mult = 1.7 reagent_state = LIQUID color = "#302000" nutrition = 5 @@ -1032,6 +1141,7 @@ name = "Ice" id = "ice" description = "Frozen water, your dentist wouldn't like you chewing this." + taste_description = "ice" reagent_state = SOLID color = "#619494" adj_temp = -5 @@ -1044,6 +1154,7 @@ name = "Nothing" id = "nothing" description = "Absolutely nothing." + taste_description = "nothing" glass_name = "nothing" glass_desc = "Absolutely nothing." @@ -1056,6 +1167,8 @@ name = "Absinthe" id = "absinthe" description = "Watch out that the Green Fairy doesn't come for you!" + taste_description = "licorice" + taste_mult = 1.5 color = "#33EE00" strength = 12 @@ -1066,6 +1179,7 @@ name = "Ale" id = "ale" description = "A dark alchoholic beverage made by malted barley and yeast." + taste_description = "hearty barley ale" color = "#4C3100" strength = 50 @@ -1076,6 +1190,7 @@ name = "Beer" id = "beer" description = "An alcoholic beverage made from malted grains, hops, yeast, and water." + taste_description = "beer" color = "#FFD300" strength = 50 nutriment_factor = 1 @@ -1093,6 +1208,8 @@ name = "Blue Curacao" id = "bluecuracao" description = "Exotically blue, fruity drink, distilled from oranges." + taste_description = "oranges" + taste_mult = 1.1 color = "#0000CD" strength = 15 @@ -1103,6 +1220,8 @@ name = "Cognac" id = "cognac" description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication." + taste_description = "rich and smooth alcohol" + taste_mult = 1.1 color = "#AB3C05" strength = 15 @@ -1113,6 +1232,8 @@ name = "Deadrum" id = "deadrum" description = "Popular with the sailors. Not very popular with everyone else." + taste_description = "butterscotch and salt" + taste_mult = 1.1 color = "#ECB633" strength = 50 @@ -1129,6 +1250,7 @@ name = "Gin" id = "gin" description = "It's gin. In space. I say, good sir." + taste_description = "an alcoholic christmas tree" color = "#0064C6" strength = 50 @@ -1148,16 +1270,31 @@ M.sleeping = max(0, M.sleeping - 2) if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) + if(alien == IS_TAJARA) + M.adjustToxLoss(0.5 * removed) + M.make_jittery(4) //extra sensitive to caffine + +/datum/reagent/ethanol/coffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_TAJARA) + M.adjustToxLoss(2 * removed) + M.make_jittery(4) + return + ..() /datum/reagent/ethanol/coffee/overdose(var/mob/living/carbon/M, var/alien) if(alien == IS_DIONA) return + if(alien == IS_TAJARA) + M.adjustToxLoss(4 * REM) + M.apply_effect(3, STUTTER) M.make_jittery(5) /datum/reagent/ethanol/coffee/kahlua name = "Kahlua" id = "kahlua" description = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936!" + taste_description = "spiked latte" + taste_mult = 1.1 color = "#4C3100" strength = 15 @@ -1168,6 +1305,7 @@ name = "Melon Liquor" id = "melonliquor" description = "A relatively sweet and fruity 46 proof liquor." + taste_description = "fruity alcohol" color = "#138808" // rgb: 19, 136, 8 strength = 50 @@ -1178,6 +1316,8 @@ name = "Rum" id = "rum" description = "Yohoho and all that." + taste_description = "spiked butterscotch" + taste_mult = 1.1 color = "#ECB633" strength = 15 @@ -1188,6 +1328,7 @@ name = "Sake" id = "sake" description = "Anime's favorite drink." + taste_description = "dry alcohol" color = "#DDDDDD" strength = 25 @@ -1198,6 +1339,7 @@ name = "Tequila" id = "tequilla" description = "A strong and mildly flavoured, mexican produced spirit. Feeling thirsty hombre?" + taste_description = "paint thinner" color = "#FFFF91" strength = 25 @@ -1208,6 +1350,7 @@ name = "Thirteen Loko" id = "thirteenloko" description = "A potent mixture of caffeine and alcohol." + taste_description = "battery acid" color = "#102000" strength = 25 nutriment_factor = 1 @@ -1228,6 +1371,8 @@ name = "Vermouth" id = "vermouth" description = "You suddenly feel a craving for a martini..." + taste_description = "dry alcohol" + taste_mult = 1.3 color = "#91FF91" // rgb: 145, 255, 145 strength = 15 @@ -1238,6 +1383,7 @@ name = "Vodka" id = "vodka" description = "Number one drink AND fueling choice for Russians worldwide." + taste_description = "grain alcohol" color = "#0064C8" // rgb: 0, 100, 200 strength = 15 @@ -1252,6 +1398,7 @@ name = "Whiskey" id = "whiskey" description = "A superb and well-aged single-malt whiskey. Damn." + taste_description = "molasses" color = "#4C3100" strength = 25 @@ -1262,6 +1409,7 @@ name = "Wine" id = "wine" description = "An premium alchoholic beverage made from distilled grape juice." + taste_description = "bitter sweetness" color = "#7E4043" // rgb: 126, 64, 67 strength = 15 @@ -1274,6 +1422,7 @@ name = "Acid Spit" id = "acidspit" description = "A drink for the daring, can be deadly if incorrectly prepared!" + taste_description = "bitter tang" reagent_state = LIQUID color = "#365000" strength = 30 @@ -1285,6 +1434,7 @@ name = "Allies Cocktail" id = "alliescocktail" description = "A drink made from your allies, not as sweet as when made from your enemies." + taste_description = "bitter sweetness" color = "#D8AC45" strength = 25 @@ -1295,6 +1445,7 @@ name = "Aloe" id = "aloe" description = "So very, very, very good." + taste_description = "sweet and creamy" color = "#B7EA75" strength = 15 @@ -1305,6 +1456,7 @@ name = "Amasec" id = "amasec" description = "Official drink of the Gun Club!" + taste_description = "dark and metallic" reagent_state = LIQUID color = "#FF975D" strength = 25 @@ -1316,6 +1468,7 @@ name = "Andalusia" id = "andalusia" description = "A nice, strangely named drink." + taste_description = "lemons" color = "#F4EA4A" strength = 15 @@ -1326,6 +1479,7 @@ name = "Anti-freeze" id = "antifreeze" description = "Ultimate refreshment." + taste_description = "ice cold vodka" color = "#56DEEA" strength = 12 adj_temp = 20 @@ -1338,6 +1492,7 @@ name = "Atomic Bomb" id = "atomicbomb" description = "Nuclear proliferation never tasted so good." + taste_description = "coffee, almonds, and whiskey, with a kick" reagent_state = LIQUID color = "#666300" strength = 10 @@ -1350,6 +1505,8 @@ name = "B-52" id = "b52" description = "Coffee, Irish Cream, and cognac. You will get bombed." + taste_description = "coffee, almonds, and whiskey" + taste_mult = 1.3 color = "#997650" strength = 12 @@ -1360,6 +1517,7 @@ name = "Bahama mama" id = "bahama_mama" description = "Tropical cocktail." + taste_description = "lime and orange" color = "#FF7F3B" strength = 25 @@ -1370,6 +1528,7 @@ name = "Banana Mama" id = "bananahonk" description = "A drink from Clown Heaven." + taste_description = "bananas and sugar" nutriment_factor = 1 color = "#FFFF91" strength = 12 @@ -1381,6 +1540,7 @@ name = "Barefoot" id = "barefoot" description = "Barefoot and pregnant" + taste_description = "creamy berries" color = "#FFCDEA" strength = 30 @@ -1391,6 +1551,8 @@ name = "Beepsky Smash" id = "beepskysmash" description = "Deny drinking this and prepare for THE LAW." + taste_description = "whiskey and citrus" + taste_mult = 2 reagent_state = LIQUID color = "#404040" strength = 12 @@ -1406,6 +1568,7 @@ name = "Bilk" id = "bilk" description = "This appears to be beer mixed with milk. Disgusting." + taste_description = "sour milk" color = "#895C4C" strength = 50 nutriment_factor = 2 @@ -1417,6 +1580,7 @@ name = "Black Russian" id = "blackrussian" description = "For the lactose-intolerant. Still as classy as a White Russian." + taste_description = "coffee" color = "#360000" strength = 15 @@ -1427,6 +1591,7 @@ name = "Bloody Mary" id = "bloodymary" description = "A strange yet pleasurable mixture made of vodka, tomato and lime juice. Or at least you THINK the red stuff is tomato juice." + taste_description = "tomatoes with a hint of lime" color = "#B40000" strength = 15 @@ -1437,6 +1602,7 @@ name = "Booger" id = "booger" description = "Ewww..." + taste_description = "sweet 'n creamy" color = "#8CFF8C" strength = 30 @@ -1447,6 +1613,8 @@ name = "Brave Bull" id = "bravebull" description = "It's just as effective as Dutch-Courage!" + taste_description = "coffee and paint thinner" + taste_mult = 1.1 color = "#4C3100" strength = 15 @@ -1457,6 +1625,7 @@ name = "Changeling Sting" id = "changelingsting" description = "You take a tiny sip and feel a burning sensation..." + taste_description = "constantly changing flavors" color = "#2E6671" strength = 10 @@ -1467,6 +1636,7 @@ name = "Classic Martini" id = "martini" description = "Vermouth with Gin. Not quite how 007 enjoyed it, but still delicious." + taste_description = "dry class" color = "#0064C8" strength = 25 @@ -1477,6 +1647,7 @@ name = "Cuba Libre" id = "cubalibre" description = "Rum, mixed with cola. Viva la revolucion." + taste_description = "cola" color = "#3E1B00" strength = 30 @@ -1487,6 +1658,8 @@ name = "Demons Blood" id = "demonsblood" description = "AHHHH!!!!" + taste_description = "sweet tasting iron" + taste_mult = 1.5 color = "#820000" strength = 15 @@ -1497,6 +1670,7 @@ name = "Devils Kiss" id = "devilskiss" description = "Creepy time!" + taste_description = "bitter iron" color = "#A68310" strength = 15 @@ -1507,6 +1681,7 @@ name = "Driest Martini" id = "driestmartini" description = "Only for the experienced. You think you see sand floating in the glass." + taste_description = "a beach" nutriment_factor = 1 color = "#2E6671" strength = 12 @@ -1518,6 +1693,7 @@ name = "Gin Fizz" id = "ginfizz" description = "Refreshingly lemony, deliciously dry." + taste_description = "dry, tart lemons" color = "#FFFFAE" strength = 30 @@ -1528,6 +1704,7 @@ name = "Grog" id = "grog" description = "Watered-down rum, pirate approved!" + taste_description = "a poor excuse for alcohol" reagent_state = LIQUID color = "#FFBB00" strength = 100 @@ -1540,6 +1717,7 @@ name = "Erika Surprise" id = "erikasurprise" description = "The surprise is, it's green!" + taste_description = "tartness and bananas" color = "#2E6671" strength = 15 @@ -1550,6 +1728,8 @@ name = "Pan-Galactic Gargle Blaster" id = "gargleblaster" description = "Whoah, this stuff looks volatile!" + taste_description = "your brains smashed out by a lemon wrapped around a gold brick" + taste_mult = 5 reagent_state = LIQUID color = "#7F00FF" strength = 10 @@ -1561,6 +1741,7 @@ name = "Gin and Tonic" id = "gintonic" description = "An all time classic, mild cocktail." + taste_description = "mild and tart" color = "#0064C8" strength = 50 @@ -1571,6 +1752,8 @@ name = "Goldschlager" id = "goldschlager" description = "100 proof cinnamon schnapps, made for alcoholic teen girls on spring break." + taste_description = "burning cinnamon" + taste_mult = 1.3 color = "#F4E46D" strength = 15 @@ -1581,6 +1764,7 @@ name = "Hippies' Delight" id = "hippiesdelight" description = "You just don't get it maaaan." + taste_description = "giving peace a chance" reagent_state = LIQUID color = "#FF88FF" strength = 15 @@ -1593,6 +1777,7 @@ name = "Hooch" id = "hooch" description = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?" + taste_description = "pure alcohol" color = "#4C3100" strength = 25 toxicity = 2 @@ -1604,7 +1789,7 @@ name = "Iced Beer" id = "iced_beer" description = "A beer which is so cold the air around it freezes." - + taste_description = "refreshingly cold" color = "#FFD300" strength = 50 adj_temp = -20 @@ -1618,6 +1803,7 @@ name = "Irish Car Bomb" id = "irishcarbomb" description = "Mmm, tastes like chocolate cake..." + taste_description = "delicious anger" color = "#2E6671" strength = 15 @@ -1628,6 +1814,7 @@ name = "Irish Coffee" id = "irishcoffee" description = "Coffee, and alcohol. More fun than a Mimosa to drink in the morning." + taste_description = "giving up on the day" color = "#4C3100" strength = 15 @@ -1638,7 +1825,8 @@ name = "Irish Cream" id = "irishcream" description = "Whiskey-imbued cream, what else would you expect from the Irish." - color = "#DDDD9A3" + taste_description = "creamy alcohol" + color = "#DDD9A3" strength = 25 glass_name = "Irish cream" @@ -1648,6 +1836,7 @@ name = "Long Island Iced Tea" id = "longislandicedtea" description = "The liquor cabinet, brought together in a delicious mix. Intended for middle-aged alcoholic women only." + taste_description = "sweet tea, with a kick" color = "#895B1F" strength = 12 @@ -1658,6 +1847,7 @@ name = "Manhattan" id = "manhattan" description = "The Detective's undercover drink of choice. He never could stomach gin..." + taste_description = "mild dryness" color = "#C13600" strength = 15 @@ -1668,6 +1858,7 @@ name = "Manhattan Project" id = "manhattan_proj" description = "A scientist's drink of choice, for pondering ways to blow up the station." + taste_description = "death, the destroyer of worlds" color = "#C15D00" strength = 10 druggy = 30 @@ -1679,6 +1870,7 @@ name = "The Manly Dorf" id = "manlydorf" description = "Beer and Ale, brought together in a delicious mix. Intended for true men only." + taste_description = "hair on your chest and your chin" color = "#4C3100" strength = 25 @@ -1689,6 +1881,7 @@ name = "Margarita" id = "margarita" description = "On the rocks with salt on the rim. Arriba~!" + taste_description = "dry and salty" color = "#8CFF8C" strength = 15 @@ -1699,6 +1892,7 @@ name = "Mead" id = "mead" description = "A Viking's drink, though a cheap one." + taste_description = "sweet yet alcoholic" reagent_state = LIQUID color = "#FFBB00" strength = 30 @@ -1711,6 +1905,8 @@ name = "Moonshine" id = "moonshine" description = "You've really hit rock bottom now... your liver packed its bags and left last night." + taste_description = "bitterness" + taste_mult = 2.5 color = "#0064C8" strength = 12 @@ -1721,6 +1917,7 @@ name = "Neurotoxin" id = "neurotoxin" description = "A strong neurotoxin that puts the subject into a death-like state." + taste_description = "a numbing sensation" reagent_state = LIQUID color = "#2E2E61" strength = 10 @@ -1738,6 +1935,7 @@ name = "Patron" id = "patron" description = "Tequila with silver in it, a favorite of alcoholic women in the club scene." + taste_description = "metallic paint thinner" color = "#585840" strength = 30 @@ -1773,6 +1971,7 @@ name = "Red Mead" id = "red_mead" description = "The true Viking's drink! Even though it has a strange red color." + taste_description = "sweet and salty alcohol" color = "#C73C00" strength = 30 @@ -1783,6 +1982,7 @@ name = "Sbiten" id = "sbiten" description = "A spicy Vodka! Might be a little hot for the little guys!" + taste_description = "hot and spice" color = "#FFA371" strength = 15 adj_temp = 50 @@ -1795,6 +1995,7 @@ name = "Screwdriver" id = "screwdrivercocktail" description = "Vodka, mixed with plain ol' orange juice. The result is surprisingly delicious." + taste_description = "oranges" color = "#A68310" strength = 15 @@ -1805,6 +2006,8 @@ name = "Silencer" id = "silencer" description = "A drink from Mime Heaven." + taste_description = "a pencil eraser" + taste_mult = 1.2 nutriment_factor = 1 color = "#FFFFFF" strength = 12 @@ -1816,6 +2019,7 @@ name = "Singulo" id = "singulo" description = "A blue-space beverage!" + taste_description = "concentrated matter" color = "#2E6671" strength = 10 @@ -1826,6 +2030,7 @@ name = "Snow White" id = "snowwhite" description = "A cold refreshment" + taste_description = "refreshing cold" color = "#FFFFFF" strength = 30 @@ -1836,6 +2041,7 @@ name = "Sui Dream" id = "suidream" description = "Comprised of: White soda, blue curacao, melon liquor." + taste_description = "fruit" color = "#00A86B" strength = 100 @@ -1846,6 +2052,7 @@ name = "Syndicate Bomb" id = "syndicatebomb" description = "Tastes like terrorism!" + taste_description = "purified antagonism" color = "#2E6671" strength = 10 @@ -1856,6 +2063,7 @@ name = "Tequila Sunrise" id = "tequillasunrise" description = "Tequila and orange juice. Much like a Screwdriver, only Mexican~" + taste_description = "oranges" color = "#FFE48C" strength = 25 @@ -1866,6 +2074,7 @@ name = "Three Mile Island Iced Tea" id = "threemileisland" description = "Made for a woman, strong enough for a man." + taste_description = "dry" color = "#666340" strength = 10 druggy = 50 @@ -1877,6 +2086,7 @@ name = "Toxins Special" id = "phoronspecial" description = "This thing is ON FIRE! CALL THE DAMN SHUTTLE!" + taste_description = "spicy toxins" reagent_state = LIQUID color = "#7F00FF" strength = 10 @@ -1890,6 +2100,7 @@ name = "Vodka Martini" id = "vodkamartini" description = "Vodka with Gin. Not quite how 007 enjoyed it, but still delicious." + taste_description = "shaken, not stirred" color = "#0064C8" strength = 12 @@ -1901,6 +2112,7 @@ name = "Vodka and Tonic" id = "vodkatonic" description = "For when a gin and tonic isn't russian enough." + taste_description = "tart bitterness" color = "#0064C8" // rgb: 0, 100, 200 strength = 15 @@ -1912,6 +2124,7 @@ name = "White Russian" id = "whiterussian" description = "That's just, like, your opinion, man..." + taste_description = "coffee icecream" color = "#A68340" strength = 15 @@ -1923,6 +2136,7 @@ name = "Whiskey Cola" id = "whiskeycola" description = "Whiskey, mixed with cola. Surprisingly refreshing." + taste_description = "cola with an alcoholic undertone" color = "#3E1B00" strength = 25 @@ -1934,6 +2148,7 @@ name = "Whiskey Soda" id = "whiskeysoda" description = "For the more refined griffon." + taste_description = "carbonated whiskey" color = "#EAB300" strength = 15 @@ -1944,6 +2159,7 @@ name = "Special Blend Whiskey" id = "specialwhiskey" description = "Just when you thought regular station whiskey was good... This silky, amber goodness has to come along and ruin everything. The smell of it singes your nostrils." + taste_description = "unspeakable whiskey bliss" color = "#523600" strength = 7 diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index 8bbb4ac950..c049f3c0e9 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -4,6 +4,7 @@ name = "Inaprovaline" id = "inaprovaline" description = "Inaprovaline is a synaptic stimulant and cardiostimulant. Commonly used to stabilize patients." + taste_description = "bitterness" reagent_state = LIQUID color = "#00BFFF" overdose = REAGENTS_OVERDOSE * 2 @@ -20,6 +21,8 @@ name = "Bicaridine" id = "bicaridine" description = "Bicaridine is an analgesic medication and can be used to treat blunt trauma." + taste_description = "bitterness" + taste_mult = 3 reagent_state = LIQUID color = "#BF0000" overdose = REAGENTS_OVERDOSE @@ -33,6 +36,7 @@ name = "Kelotane" id = "kelotane" description = "Kelotane is a drug used to treat burns." + taste_description = "bitterness" reagent_state = LIQUID color = "#FFA800" overdose = REAGENTS_OVERDOSE @@ -46,6 +50,8 @@ name = "Dermaline" id = "dermaline" description = "Dermaline is the next step in burn medication. Works twice as good as kelotane and enables the body to restore even the direst heat-damaged tissue." + taste_description = "bitterness" + taste_mult = 1.5 reagent_state = LIQUID color = "#FF8000" overdose = REAGENTS_OVERDOSE * 0.5 @@ -59,6 +65,7 @@ name = "Dylovene" id = "anti_toxin" description = "Dylovene is a broad-spectrum antitoxin." + taste_description = "a roll of gauze" reagent_state = LIQUID color = "#00A000" scannable = 1 @@ -73,6 +80,7 @@ name = "Dexalin" id = "dexalin" description = "Dexalin is used in the treatment of oxygen deprivation." + taste_description = "bitterness" reagent_state = LIQUID color = "#0080FF" overdose = REAGENTS_OVERDOSE @@ -90,6 +98,7 @@ name = "Dexalin Plus" id = "dexalinp" description = "Dexalin Plus is used in the treatment of oxygen deprivation. It is highly effective." + taste_description = "bitterness" reagent_state = LIQUID color = "#0040FF" mrate_static = TRUE //Until it's not crazy strong, at least @@ -108,6 +117,7 @@ name = "Tricordrazine" id = "tricordrazine" description = "Tricordrazine is a highly potent stimulant, originally derived from cordrazine. Can be used to treat a wide range of injuries." + taste_description = "bitterness" reagent_state = LIQUID color = "#8040FF" scannable = 1 @@ -122,6 +132,7 @@ name = "Cryoxadone" id = "cryoxadone" description = "A chemical mixture with almost magical healing powers. Its main limitation is that the targets body temperature must be under 170K for it to metabolise correctly." + taste_description = "overripe bananas" reagent_state = LIQUID color = "#8080FF" metabolism = REM * 0.5 @@ -139,6 +150,7 @@ name = "Clonexadone" id = "clonexadone" description = "A liquid compound similar to that used in the cloning process. Can be used to 'finish' the cloning process when used in conjunction with a cryo tube." + taste_description = "rotten bananas" reagent_state = LIQUID color = "#80BFFF" metabolism = REM * 0.5 @@ -158,6 +170,7 @@ name = "Paracetamol" id = "paracetamol" description = "Most probably know this as Tylenol, but this chemical is a mild, simple painkiller." + taste_description = "bitterness" reagent_state = LIQUID color = "#C8A5DC" overdose = 60 @@ -176,6 +189,7 @@ name = "Tramadol" id = "tramadol" description = "A simple, yet effective painkiller." + taste_description = "sourness" reagent_state = LIQUID color = "#CB68FC" overdose = 30 @@ -194,6 +208,7 @@ name = "Oxycodone" id = "oxycodone" description = "An effective and very addictive painkiller." + taste_description = "bitterness" reagent_state = LIQUID color = "#800080" overdose = 20 @@ -214,6 +229,7 @@ name = "Synaptizine" id = "synaptizine" description = "Synaptizine is used to treat various diseases." + taste_description = "bitterness" reagent_state = LIQUID color = "#99CCFF" metabolism = REM * 0.05 @@ -236,6 +252,7 @@ name = "Alkysine" id = "alkysine" description = "Alkysine is a drug used to lessen the damage to neurological tissue after a catastrophic injury. Can heal brain tissue." + taste_description = "bitterness" reagent_state = LIQUID color = "#FFFF66" metabolism = REM * 0.25 @@ -252,6 +269,7 @@ name = "Imidazoline" id = "imidazoline" description = "Heals eye damage" + taste_description = "dull toxin" reagent_state = LIQUID color = "#C8A5DC" overdose = REAGENTS_OVERDOSE @@ -275,6 +293,7 @@ name = "Peridaxon" id = "peridaxon" description = "Used to encourage recovery of internal organs and nervous systems. Medicate cautiously." + taste_description = "bitterness" reagent_state = LIQUID color = "#561EC3" overdose = 10 @@ -295,6 +314,7 @@ name = "Ryetalyn" id = "ryetalyn" description = "Ryetalyn can cure all genetic abnomalities via a catalytic process." + taste_description = "acid" reagent_state = SOLID color = "#004000" overdose = REAGENTS_OVERDOSE @@ -315,6 +335,7 @@ name = "Ethylredoxrazine" id = "ethylredoxrazine" description = "A powerful oxidizer that reacts with ethanol." + taste_description = "bitterness" reagent_state = SOLID color = "#605048" overdose = REAGENTS_OVERDOSE @@ -335,6 +356,7 @@ name = "Hyronalin" id = "hyronalin" description = "Hyronalin is a medicinal drug used to counter the effect of radiation poisoning." + taste_description = "bitterness" reagent_state = LIQUID color = "#408000" metabolism = REM * 0.25 @@ -348,6 +370,7 @@ name = "Arithrazine" id = "arithrazine" description = "Arithrazine is an unstable medication used for the most extreme cases of radiation poisoning." + taste_description = "bitterness" reagent_state = LIQUID color = "#008000" metabolism = REM * 0.25 @@ -364,6 +387,7 @@ name = "Spaceacillin" id = "spaceacillin" description = "An all-purpose antiviral agent." + taste_description = "bitterness" reagent_state = LIQUID color = "#C1C1C1" metabolism = REM * 0.05 @@ -375,6 +399,7 @@ name = "Sterilizine" id = "sterilizine" description = "Sterilizes wounds in preparation for surgery and thoroughly removes blood." + taste_description = "bitterness" reagent_state = LIQUID color = "#C8A5DC" touch_met = 5 @@ -400,6 +425,7 @@ name = "Leporazine" id = "leporazine" description = "Leporazine can be use to stabilize an individuals body temperature." + taste_description = "bitterness" reagent_state = LIQUID color = "#C8A5DC" overdose = REAGENTS_OVERDOSE @@ -419,6 +445,7 @@ name = "Methylphenidate" id = "methylphenidate" description = "Improves the ability to concentrate." + taste_description = "bitterness" reagent_state = LIQUID color = "#BF80BF" metabolism = 0.01 @@ -440,6 +467,7 @@ name = "Citalopram" id = "citalopram" description = "Stabilizes the mind a little." + taste_description = "bitterness" reagent_state = LIQUID color = "#FF80FF" metabolism = 0.01 @@ -461,6 +489,7 @@ name = "Paroxetine" id = "paroxetine" description = "Stabilizes the mind greatly, but has a chance of adverse effects." + taste_description = "bitterness" reagent_state = LIQUID color = "#FF80BF" metabolism = 0.01 @@ -486,6 +515,7 @@ name = "Rezadone" id = "rezadone" description = "A powder with almost magical properties, this substance can effectively treat genetic damage in humanoids, though excessive consumption has side effects." + taste_description = "bitterness" reagent_state = SOLID color = "#669900" overdose = REAGENTS_OVERDOSE diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index 7a94e64ac6..4f8e17cb1e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -4,6 +4,7 @@ name = "Crayon dust" id = "crayon_dust" description = "Intensely coloured powder obtained by grinding crayons." + taste_description = "powdered wax" reagent_state = LIQUID color = "#888888" overdose = 5 @@ -52,6 +53,7 @@ name = "Paint" id = "paint" description = "This paint will stick to almost any object." + taste_description = "chalk" reagent_state = LIQUID color = "#808080" overdose = REAGENTS_OVERDOSE * 0.5 @@ -108,6 +110,7 @@ name = "Adminordrazine" id = "adminordrazine" description = "It's magic. We don't have to explain it." + taste_description = "bwoink" reagent_state = LIQUID color = "#C8A5DC" affects_dead = 1 //This can even heal dead people. @@ -146,6 +149,7 @@ name = "Gold" id = "gold" description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." + taste_description = "metal" reagent_state = SOLID color = "#F7C430" @@ -153,6 +157,7 @@ name = "Silver" id = "silver" description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." + taste_description = "metal" reagent_state = SOLID color = "#D0D0D0" @@ -160,6 +165,7 @@ name ="Uranium" id = "uranium" description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive." + taste_description = "metal" reagent_state = SOLID color = "#B8B8C0" @@ -181,6 +187,7 @@ name = "Adrenaline" id = "adrenaline" description = "Adrenaline is a hormone used as a drug to treat cardiac arrest and other cardiac dysrhythmias resulting in diminished or absent cardiac output." + taste_description = "bitterness" reagent_state = LIQUID color = "#C8A5DC" mrate_static = TRUE @@ -196,6 +203,7 @@ name = "Holy Water" id = "holywater" description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." + taste_description = "water" color = "#E0E8EF" mrate_static = TRUE @@ -217,6 +225,8 @@ name = "Ammonia" id = "ammonia" description = "A caustic substance commonly used in fertilizer or household cleaners." + taste_description = "mordant" + taste_mult = 2 reagent_state = GAS color = "#404030" @@ -224,6 +234,7 @@ name = "Diethylamine" id = "diethylamine" description = "A secondary amine, mildly corrosive." + taste_description = "iron" reagent_state = LIQUID color = "#604030" @@ -231,6 +242,7 @@ name = "Fluorosurfactant" id = "fluorosurfactant" description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." + taste_description = "metal" reagent_state = LIQUID color = "#9E6B38" @@ -238,6 +250,7 @@ name = "Foaming agent" id = "foaming_agent" description = "A agent that yields metallic foam when mixed with light metal and a strong acid." + taste_description = "metal" reagent_state = SOLID color = "#664B63" @@ -245,6 +258,7 @@ name = "Thermite" id = "thermite" description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." + taste_description = "sweet tasting metal" reagent_state = SOLID color = "#673910" touch_met = 50 @@ -269,6 +283,7 @@ name = "Space cleaner" id = "cleaner" description = "A compound used to clean things. Now with 50% more sodium hypochlorite!" + taste_description = "sourness" reagent_state = LIQUID color = "#A5F0EE" touch_met = 50 @@ -317,6 +332,7 @@ name = "Space Lube" id = "lube" description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity." + taste_description = "slime" reagent_state = LIQUID color = "#009CA8" @@ -330,6 +346,7 @@ name = "Silicate" id = "silicate" description = "A compound that can be used to reinforce glass." + taste_description = "plastic" reagent_state = LIQUID color = "#C7FFFF" @@ -344,6 +361,7 @@ name = "Glycerol" id = "glycerol" description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." + taste_description = "sweetness" reagent_state = LIQUID color = "#808080" @@ -351,6 +369,7 @@ name = "Nitroglycerin" id = "nitroglycerin" description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." + taste_description = "oil" reagent_state = LIQUID color = "#808080" @@ -358,6 +377,8 @@ name = "Coolant" id = "coolant" description = "Industrial cooling substance." + taste_description = "sourness" + taste_mult = 1.1 reagent_state = LIQUID color = "#C8A5DC" @@ -365,12 +386,14 @@ name = "Ultra Glue" id = "glue" description = "An extremely powerful bonding agent." + taste_description = "a special education class" color = "#FFFFCC" /datum/reagent/woodpulp name = "Wood Pulp" id = "woodpulp" description = "A mass of wood fibers." + taste_description = "wood" reagent_state = LIQUID color = "#B97A57" @@ -378,6 +401,7 @@ name = "Luminol" id = "luminol" description = "A compound that interacts with blood on the molecular level." + taste_description = "metal" reagent_state = LIQUID color = "#F2F3F4" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 729e091158..15ff2e4f80 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -1,13 +1,14 @@ /* Toxins, poisons, venoms */ /datum/reagent/toxin - name = "Toxin" + name = "toxin" id = "toxin" description = "A toxic chemical." + taste_description = "bitterness" + taste_mult = 1.2 reagent_state = LIQUID color = "#CF3600" metabolism = REM * 0.25 // 0.05 by default. Hopefully enough to get some help, or die horribly, whatever floats your boat - mrate_static = TRUE var/strength = 4 // How much damage it deals per unit /datum/reagent/toxin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) @@ -19,6 +20,7 @@ name = "Plasticide" id = "plasticide" description = "Liquid plastic, do not eat." + taste_description = "plastic" reagent_state = LIQUID color = "#CF3600" strength = 5 @@ -27,6 +29,7 @@ name = "Amatoxin" id = "amatoxin" description = "A powerful poison derived from certain species of mushroom." + taste_description = "mushroom" reagent_state = LIQUID color = "#792300" strength = 10 @@ -35,6 +38,7 @@ name = "Carpotoxin" id = "carpotoxin" description = "A deadly neurotoxin produced by the dreaded space carp." + taste_description = "fish" reagent_state = LIQUID color = "#003333" strength = 10 @@ -43,6 +47,7 @@ name = "Phoron" id = "phoron" description = "Phoron in its liquid form." + taste_mult = 1.5 reagent_state = LIQUID color = "#9D14DB" strength = 30 @@ -55,10 +60,18 @@ /datum/reagent/toxin/phoron/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) ..() M.adjust_fire_stacks(removed / 5) + if(alien == IS_VOX) + return M.take_organ_damage(0, removed * 0.1) //being splashed directly with phoron causes minor chemical burns if(prob(50)) M.pl_effects() +/datum/reagent/toxin/phoron/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_VOX) + M.adjustOxyLoss(-removed * 9) + return + ..() + /datum/reagent/toxin/phoron/touch_turf(var/turf/simulated/T, var/amount) if(!istype(T)) return @@ -69,6 +82,8 @@ name = "Cyanide" id = "cyanide" description = "A highly toxic chemical." + taste_description = "almond" + taste_mult = 0.6 reagent_state = LIQUID color = "#CF3600" strength = 20 @@ -83,12 +98,15 @@ name = "Hyperzine" id = "hyperzine" description = "Hyperzine is a highly effective, long lasting, muscle stimulant." + taste_description = "bitterness" reagent_state = LIQUID color = "#FF3300" overdose = REAGENTS_OVERDOSE * 0.5 strength = 2 /datum/reagent/toxin/hyperzine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_TAJARA) + removed *= 1.25 ..() if(prob(5)) M.emote(pick("twitch", "blink_r", "shiver")) @@ -98,12 +116,16 @@ name = "Stimm" id = "stimm" description = "A homemade stimulant with some serious side-effects." + taste_description = "sweetness" + taste_mult = 1.8 color = "#d0583a" metabolism = REM * 3 overdose = 10 strength = 3 /datum/reagent/toxin/stimm/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_TAJARA) + removed *= 1.25 ..() if(prob(15)) M.emote(pick("twitch", "blink_r", "shiver")) @@ -116,6 +138,7 @@ name = "Potassium Chloride" id = "potassium_chloride" description = "A delicious salt that stops the heart when injected into cardiac muscle." + taste_description = "salt" reagent_state = SOLID color = "#FFFFFF" strength = 0 @@ -135,6 +158,7 @@ name = "Potassium Chlorophoride" id = "potassium_chlorophoride" description = "A specific chemical based on Potassium Chloride to stop the heart for surgery. Not safe to eat!" + taste_description = "salt" reagent_state = SOLID color = "#FFFFFF" strength = 10 @@ -154,6 +178,7 @@ name = "Zombie Powder" id = "zombiepowder" description = "A strong neurotoxin that puts the subject into a death-like state." + taste_description = "numbness" reagent_state = SOLID color = "#669900" metabolism = REM @@ -179,6 +204,8 @@ name = "fertilizer" id = "fertilizer" description = "A chemical mix good for growing plants with." + taste_description = "plant food" + taste_mult = 0.5 reagent_state = LIQUID strength = 0.5 // It's not THAT poisonous. color = "#664330" @@ -199,6 +226,7 @@ name = "Plant-B-Gone" id = "plantbgone" description = "A harmful toxic mixture to kill plantlife. Do not ingest!" + taste_mult = 1 reagent_state = LIQUID color = "#49002E" strength = 4 @@ -227,6 +255,7 @@ name = "Polytrinic acid" id = "pacid" description = "Polytrinic acid is a an extremely corrosive chemical substance." + taste_description = "acid" reagent_state = LIQUID color = "#8E18A9" power = 10 @@ -236,6 +265,7 @@ name = "Lexorin" id = "lexorin" description = "Lexorin temporarily stops respiration. Causes tissue damage." + taste_description = "acid" reagent_state = LIQUID color = "#C8A5DC" overdose = REAGENTS_OVERDOSE @@ -256,6 +286,8 @@ name = "Unstable mutagen" id = "mutagen" description = "Might cause unpredictable mutations. Keep away from children." + taste_description = "slime" + taste_mult = 0.9 reagent_state = LIQUID color = "#13BC5E" @@ -291,6 +323,8 @@ name = "Slime Jelly" id = "slimejelly" description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL." + taste_description = "slime" + taste_mult = 1.3 reagent_state = LIQUID color = "#801E28" @@ -307,6 +341,7 @@ name = "Soporific" id = "stoxin" description = "An effective hypnotic used to treat insomnia." + taste_description = "bitterness" reagent_state = LIQUID color = "#009CA8" metabolism = REM * 0.5 @@ -341,6 +376,7 @@ name = "Chloral Hydrate" id = "chloralhydrate" description = "A powerful sedative." + taste_description = "bitterness" reagent_state = SOLID color = "#000067" metabolism = REM * 0.5 @@ -374,6 +410,7 @@ name = "Beer" id = "beer2" description = "An alcoholic beverage made from malted grains, hops, yeast, and water. The fermentation appears to be incomplete." //If the players manage to analyze this, they deserve to know something is wrong. + taste_description = "beer" reagent_state = LIQUID color = "#FFD300" @@ -385,6 +422,8 @@ name = "Space drugs" id = "space_drugs" description = "An illegal chemical compound used as drug." + taste_description = "bitterness" + taste_mult = 0.4 reagent_state = LIQUID color = "#60A584" metabolism = REM * 0.5 @@ -408,6 +447,7 @@ name = "Serotrotium" id = "serotrotium" description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." + taste_description = "bitterness" reagent_state = LIQUID color = "#202040" metabolism = REM * 0.25 @@ -424,6 +464,7 @@ name = "Cryptobiolin" id = "cryptobiolin" description = "Cryptobiolin causes confusion and dizzyness." + taste_description = "sourness" reagent_state = LIQUID color = "#000055" metabolism = REM * 0.5 @@ -442,6 +483,7 @@ name = "Impedrezene" id = "impedrezene" description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions." + taste_description = "numbness" reagent_state = LIQUID color = "#C8A5DC" overdose = REAGENTS_OVERDOSE @@ -461,6 +503,7 @@ name = "Mindbreaker Toxin" id = "mindbreaker" description = "A powerful hallucinogen, it can cause fatal effects in users." + taste_description = "sourness" reagent_state = LIQUID color = "#B31008" metabolism = REM * 0.25 @@ -479,6 +522,7 @@ name = "Psilocybin" id = "psilocybin" description = "A strong psycotropic derived from certain species of mushroom." + taste_description = "mushroom" color = "#E700E7" overdose = REAGENTS_OVERDOSE metabolism = REM * 0.5 @@ -519,6 +563,7 @@ name = "Nicotine" id = "nicotine" description = "A highly addictive stimulant extracted from the tobacco plant." + taste_description = "bitterness" reagent_state = LIQUID color = "#181818" @@ -528,6 +573,7 @@ name = "Mutation Toxin" id = "mutationtoxin" description = "A corruptive toxin produced by slimes." + taste_description = "sludge" reagent_state = LIQUID color = "#13BC5E" @@ -554,6 +600,7 @@ name = "Docility Toxin" id = "docilitytoxin" description = "A corruptive toxin produced by slimes." + taste_description = "sludge" reagent_state = LIQUID color = "#FF69B4" diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 7ee525fc0b..aa952915c3 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -57,7 +57,7 @@ safe_thing = victim.glasses if(safe_thing) - trans = reagents.trans_to_obj(safe_thing, amount_per_transfer_from_this) + trans = reagents.splash(safe_thing, amount_per_transfer_from_this, max_spill=30) user.visible_message("[user] tries to squirt something into [target]'s eyes, but fails!", "You transfer [trans] units of the solution.") return @@ -67,14 +67,15 @@ user.attack_log += text("\[[time_stamp()]\] Used the [name] to squirt [M.name] ([M.key]). Reagents: [contained]") msg_admin_attack("[user.name] ([user.ckey]) squirted [M.name] ([M.key]) with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)") - trans = reagents.trans_to_mob(target, reagents.total_volume, CHEM_INGEST) + trans += reagents.splash(target, reagents.total_volume/2, max_spill=30) + trans += reagents.trans_to_mob(target, reagents.total_volume/2, CHEM_BLOOD) //I guess it gets into the bloodstream through the eyes or something user.visible_message("[user] squirts something into [target]'s eyes!", "You transfer [trans] units of the solution.") return else - trans = reagents.trans_to(target, amount_per_transfer_from_this) //sprinkling reagents on generic non-mobs + trans = reagents.splash(target, amount_per_transfer_from_this, max_spill=30) //sprinkling reagents on generic non-mobs user << "You transfer [trans] units of the solution." else // Taking from something diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 0270c8f2a8..dd58e8a51e 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -12,9 +12,15 @@ var/dried_type = null var/dry = 0 var/nutriment_amt = 0 + var/list/nutriment_desc = list("food" = 1) center_of_mass = list("x"=16, "y"=16) w_class = ITEMSIZE_SMALL +/obj/item/weapon/reagent_containers/food/snacks/New() + ..() + if(nutriment_amt) + reagents.add_reagent("nutriment",nutriment_amt,nutriment_desc) + /obj/item/weapon/reagent_containers/food/snacks/New() ..() if(nutriment_amt) @@ -276,10 +282,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#468C00" center_of_mass = list("x"=17, "y"=11) + nutriment_amt = 8 + nutriment_desc = list("apples" = 3,"salad" = 5) /obj/item/weapon/reagent_containers/food/snacks/aesirsalad/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("doctorsdelight", 8) reagents.add_reagent("tricordrazine", 8) bitesize = 3 @@ -291,10 +298,11 @@ trash = /obj/item/trash/candy filling_color = "#7D5F46" center_of_mass = list("x"=15, "y"=15) + nutriment_amt = 1 + nutriment_desc = list("candy" = 1) /obj/item/weapon/reagent_containers/food/snacks/candy/New() ..() - reagents.add_reagent("nutriment", 1) reagents.add_reagent("sugar", 3) bitesize = 2 @@ -303,10 +311,11 @@ desc = "SwoleMAX brand protein bars, guaranteed to get you feeling perfectly overconfident." icon_state = "proteinbar" trash = /obj/item/trash/candy/proteinbar + nutriment_amt = 9 + nutriment_desc = list("candy" = 1, "protein" = 8) /obj/item/weapon/reagent_containers/food/snacks/candy/proteinbar/New() ..() - reagents.add_reagent("nutriment", 9) reagents.add_reagent("protein", 4) reagents.add_reagent("sugar", 4) bitesize = 6 @@ -315,10 +324,11 @@ name = "Donor Candy" desc = "A little treat for blood donors." trash = /obj/item/trash/candy + nutriment_amt = 9 + nutriment_desc = list("candy" = 10) /obj/item/weapon/reagent_containers/food/snacks/candy/donor/New() ..() - reagents.add_reagent("nutriment", 10) reagents.add_reagent("sugar", 3) bitesize = 5 @@ -328,10 +338,11 @@ icon_state = "candy_corn" filling_color = "#FFFCB0" center_of_mass = list("x"=14, "y"=10) + nutriment_amt = 4 + nutriment_desc = list("candy corn" = 4) /obj/item/weapon/reagent_containers/food/snacks/candy_corn/New() ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("sugar", 2) bitesize = 2 @@ -342,10 +353,11 @@ trash = /obj/item/trash/chips filling_color = "#E8C31E" center_of_mass = list("x"=15, "y"=15) + nutriment_amt = 3 + nutriment_desc = list("salt" = 1, "chips" = 2) /obj/item/weapon/reagent_containers/food/snacks/chips/New() ..() - reagents.add_reagent("nutriment", 3) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/cookie @@ -354,10 +366,11 @@ icon_state = "COOKIE!!!" filling_color = "#DBC94F" center_of_mass = list("x"=17, "y"=18) + nutriment_amt = 5 + nutriment_desc = list("sweetness" = 3, "cookie" = 2) /obj/item/weapon/reagent_containers/food/snacks/cookie/New() ..() - reagents.add_reagent("nutriment", 5) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/chocolatebar @@ -366,10 +379,11 @@ icon_state = "chocolatebar" filling_color = "#7D5F46" center_of_mass = list("x"=15, "y"=15) + nutriment_amt = 2 + nutriment_desc = list("chocolate" = 5) /obj/item/weapon/reagent_containers/food/snacks/chocolatebar/New() ..() - reagents.add_reagent("nutriment", 2) reagents.add_reagent("sugar", 2) reagents.add_reagent("coco", 2) bitesize = 2 @@ -380,10 +394,11 @@ icon_state = "chocolateegg" filling_color = "#7D5F46" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 3 + nutriment_desc = list("chocolate" = 5) /obj/item/weapon/reagent_containers/food/snacks/chocolateegg/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("sugar", 2) reagents.add_reagent("coco", 2) bitesize = 2 @@ -395,11 +410,13 @@ filling_color = "#D9C386" var/overlay_state = "box-donut1" center_of_mass = list("x"=13, "y"=16) + nutriment_desc = list("sweetness", "donut") /obj/item/weapon/reagent_containers/food/snacks/donut/normal name = "donut" desc = "Goes great with Robust Coffee." icon_state = "donut1" + nutriment_amt = 3 /obj/item/weapon/reagent_containers/food/snacks/donut/normal/New() ..() @@ -418,10 +435,10 @@ desc = "Like life, it never quite tastes the same." icon_state = "donut1" filling_color = "#ED11E6" + nutriment_amt = 2 /obj/item/weapon/reagent_containers/food/snacks/donut/chaos/New() ..() - reagents.add_reagent("nutriment", 2) reagents.add_reagent("sprinkles", 1) bitesize = 10 var/chaosselect = pick(1,2,3,4,5,6,7,8,9,10) @@ -458,10 +475,10 @@ icon_state = "jdonut1" filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 3 /obj/item/weapon/reagent_containers/food/snacks/donut/jelly/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("sprinkles", 1) reagents.add_reagent("berryjuice", 5) bitesize = 5 @@ -477,10 +494,10 @@ icon_state = "jdonut1" filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 3 /obj/item/weapon/reagent_containers/food/snacks/donut/slimejelly/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("sprinkles", 1) reagents.add_reagent("slimejelly", 5) bitesize = 5 @@ -496,10 +513,10 @@ icon_state = "jdonut1" filling_color = "#ED1169" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 3 /obj/item/weapon/reagent_containers/food/snacks/donut/cherryjelly/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("sprinkles", 1) reagents.add_reagent("cherryjelly", 5) bitesize = 5 @@ -620,10 +637,11 @@ desc = "We all love tofu." filling_color = "#FFFEE0" center_of_mass = list("x"=17, "y"=10) + nutriment_amt = 3 + nutriment_desc = list("tofu" = 3, "goeyness" = 3) /obj/item/weapon/reagent_containers/food/snacks/tofu/New() ..() - reagents.add_reagent("nutriment", 3) src.bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/tofurkey @@ -632,10 +650,11 @@ icon_state = "tofurkey" filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 12 + nutriment_desc = list("turkey" = 3, "tofu" = 5, "goeyness" = 4) /obj/item/weapon/reagent_containers/food/snacks/tofurkey/New() ..() - reagents.add_reagent("nutriment", 12) reagents.add_reagent("stoxin", 3) bitesize = 3 @@ -645,10 +664,11 @@ icon_state = "stuffing" filling_color = "#C9AC83" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 3 + nutriment_desc = list("dryness" = 2, "bread" = 2) /obj/item/weapon/reagent_containers/food/snacks/stuffing/New() ..() - reagents.add_reagent("nutriment", 3) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/carpmeat @@ -683,10 +703,11 @@ icon_state = "hugemushroomslice" filling_color = "#E0D7C5" center_of_mass = list("x"=17, "y"=16) + nutriment_amt = 3 + nutriment_desc = list("raw" = 2, "mushroom" = 2) /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("psilocybin", 3) src.bitesize = 6 @@ -696,10 +717,11 @@ icon_state = "tomatomeat" filling_color = "#DB0000" center_of_mass = list("x"=17, "y"=16) + nutriment_amt = 3 + nutriment_desc = list("raw" = 2, "tomato" = 3) /obj/item/weapon/reagent_containers/food/snacks/tomatomeat/New() ..() - reagents.add_reagent("nutriment", 3) src.bitesize = 6 /obj/item/weapon/reagent_containers/food/snacks/bearmeat @@ -822,10 +844,11 @@ icon_state = "ghostburger" filling_color = "#FFF2FF" center_of_mass = list("x"=16, "y"=11) + nutriment_desc = list("buns" = 3, "spookiness" = 3) + nutriment_amt = 2 /obj/item/weapon/reagent_containers/food/snacks/ghostburger/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/human @@ -849,11 +872,12 @@ desc = "The cheese adds a good flavor." icon_state = "cheeseburger" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 2 + nutriment_desc = list("cheese" = 2, "bun" = 2) /obj/item/weapon/reagent_containers/food/snacks/cheeseburger/New() ..() reagents.add_reagent("protein", 2) - reagents.add_reagent("nutriment", 2) /obj/item/weapon/reagent_containers/food/snacks/monkeyburger name = "burger" @@ -861,11 +885,12 @@ icon_state = "hburger" filling_color = "#D63C3C" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 3 + nutriment_desc = list("bun" = 2) /obj/item/weapon/reagent_containers/food/snacks/monkeyburger/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fishburger @@ -887,10 +912,11 @@ icon_state = "tofuburger" filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 6 + nutriment_desc = list("bun" = 2, "pseudo-soy meat" = 3) /obj/item/weapon/reagent_containers/food/snacks/tofuburger/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/roburger @@ -899,10 +925,11 @@ icon_state = "roburger" filling_color = "#CCCCCC" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 2 + nutriment_desc = list("bun" = 2, "metal" = 3) /obj/item/weapon/reagent_containers/food/snacks/roburger/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/roburgerbig @@ -935,10 +962,11 @@ icon_state = "clownburger" filling_color = "#FF00FF" center_of_mass = list("x"=17, "y"=12) + nutriment_amt = 6 + nutriment_desc = list("bun" = 2, "clown shoe" = 3) /obj/item/weapon/reagent_containers/food/snacks/clownburger/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/mimeburger @@ -947,6 +975,8 @@ icon_state = "mimeburger" filling_color = "#FFFFFF" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 6 + nutriment_desc = list("bun" = 2, "face paint" = 3) /obj/item/weapon/reagent_containers/food/snacks/mimeburger/New() ..() @@ -972,6 +1002,8 @@ icon_state = "muffin" filling_color = "#E0CF9B" center_of_mass = list("x"=17, "y"=4) + nutriment_amt = 6 + nutriment_desc = list("sweetness" = 3, "muffin" = 3) /obj/item/weapon/reagent_containers/food/snacks/muffin/New() ..() @@ -985,10 +1017,11 @@ trash = /obj/item/trash/plate filling_color = "#FBFFB8" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 4 + nutriment_desc = list("pie" = 3, "cream" = 2) /obj/item/weapon/reagent_containers/food/snacks/pie/New() ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("banana",5) bitesize = 3 @@ -1004,10 +1037,11 @@ icon_state = "berryclafoutis" trash = /obj/item/trash/plate center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 4 + nutriment_desc = list("sweetness" = 2, "pie" = 3) /obj/item/weapon/reagent_containers/food/snacks/berryclafoutis/New() ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("berryjuice", 5) bitesize = 3 @@ -1018,10 +1052,11 @@ trash = /obj/item/trash/waffles filling_color = "#E6DEB5" center_of_mass = list("x"=15, "y"=11) + nutriment_amt = 8 + nutriment_desc = list("waffle" = 8) /obj/item/weapon/reagent_containers/food/snacks/waffles/New() ..() - reagents.add_reagent("nutriment", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/eggplantparm @@ -1031,10 +1066,11 @@ trash = /obj/item/trash/plate filling_color = "#4D2F5E" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 6 + nutriment_desc = list("cheese" = 3, "eggplant" = 3) /obj/item/weapon/reagent_containers/food/snacks/eggplantparm/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soylentgreen @@ -1057,10 +1093,11 @@ trash = /obj/item/trash/waffles filling_color = "#E6FA61" center_of_mass = list("x"=15, "y"=11) + nutriment_amt = 10 + nutriment_desc = list("some sort of protein" = 10) //seasoned VERY well. /obj/item/weapon/reagent_containers/food/snacks/soylenviridians/New() ..() - reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatpie @@ -1083,10 +1120,11 @@ trash = /obj/item/trash/plate filling_color = "#FFFEE0" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 10 + nutriment_desc = list("tofu" = 2, "pie" = 8) /obj/item/weapon/reagent_containers/food/snacks/tofupie/New() ..() - reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/amanita_pie @@ -1095,10 +1133,11 @@ icon_state = "amanita_pie" filling_color = "#FFCCCC" center_of_mass = list("x"=17, "y"=9) + nutriment_amt = 5 + nutriment_desc = list("sweetness" = 3, "mushroom" = 3, "pie" = 2) /obj/item/weapon/reagent_containers/food/snacks/amanita_pie/New() ..() - reagents.add_reagent("nutriment", 5) reagents.add_reagent("amatoxin", 3) reagents.add_reagent("psilocybin", 1) bitesize = 3 @@ -1109,6 +1148,8 @@ icon_state = "plump_pie" filling_color = "#B8279B" center_of_mass = list("x"=17, "y"=9) + nutriment_amt = 8 + nutriment_desc = list("heartiness" = 2, "mushroom" = 3, "pie" = 3) /obj/item/weapon/reagent_containers/food/snacks/plump_pie/New() ..() @@ -1119,7 +1160,6 @@ reagents.add_reagent("tricordrazine", 5) bitesize = 2 else - reagents.add_reagent("nutriment", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xemeatpie @@ -1180,11 +1220,13 @@ desc = "Vegan meat, on a stick." trash = /obj/item/stack/rods filling_color = "#FFFEE0" + center_of_mass = list("x"=17, "y"=15) + nutriment_amt = 8 + nutriment_desc = list("tofu" = 3, "metal" = 1) /obj/item/weapon/reagent_containers/food/snacks/tofukabob/New() ..() - reagents.add_reagent("nutriment", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cubancarp @@ -1194,11 +1236,12 @@ trash = /obj/item/trash/plate filling_color = "#E9ADFF" center_of_mass = list("x"=12, "y"=5) + nutriment_amt = 3 + nutriment_desc = list("toasted bread" = 3) /obj/item/weapon/reagent_containers/food/snacks/cubancarp/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) reagents.add_reagent("carpotoxin", 3) reagents.add_reagent("capsaicin", 3) bitesize = 3 @@ -1211,11 +1254,13 @@ var/unpopped = 0 filling_color = "#FFFAD4" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 2 + nutriment_desc = list("popcorn" = 3) + /obj/item/weapon/reagent_containers/food/snacks/popcorn/New() ..() unpopped = rand(1,10) - reagents.add_reagent("nutriment", 2) bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0 /obj/item/weapon/reagent_containers/food/snacks/popcorn/On_Consume() @@ -1244,6 +1289,8 @@ trash = /obj/item/trash/raisins filling_color = "#343834" center_of_mass = list("x"=15, "y"=4) + nutriment_amt = 6 + nutriment_desc = list("dried raisins" = 6) /obj/item/weapon/reagent_containers/food/snacks/no_raisin/New() ..() @@ -1268,10 +1315,11 @@ trash = /obj/item/trash/cheesie filling_color = "#FFA305" center_of_mass = list("x"=15, "y"=9) + nutriment_amt = 4 + nutriment_desc = list("cheese" = 5, "chips" = 2) /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers/New() ..() - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/syndicake @@ -1280,12 +1328,12 @@ desc = "An extremely moist snack cake that tastes just as good after being nuked." filling_color = "#FF5D05" center_of_mass = list("x"=16, "y"=10) - trash = /obj/item/trash/syndi_cakes + nutriment_amt = 4 + nutriment_desc = list("sweetness" = 3, "cake" = 1) /obj/item/weapon/reagent_containers/food/snacks/syndicake/New() ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("doctorsdelight", 5) bitesize = 3 @@ -1295,10 +1343,11 @@ icon_state = "loadedbakedpotato" filling_color = "#9C7A68" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 3 + nutriment_desc = list("baked potato" = 3) /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("protein", 3) bitesize = 2 @@ -1309,10 +1358,11 @@ trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 4 + nutriment_desc = list("fresh fries" = 4) /obj/item/weapon/reagent_containers/food/snacks/fries/New() ..() - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/soydope @@ -1322,10 +1372,11 @@ trash = /obj/item/trash/plate filling_color = "#C4BF76" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 2 + nutriment_desc = list("slime" = 2, "soy" = 2) /obj/item/weapon/reagent_containers/food/snacks/soydope/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spagetti @@ -1334,10 +1385,11 @@ icon_state = "spagetti" filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=16) + nutriment_amt = 1 + nutriment_desc = list("noodles" = 2) /obj/item/weapon/reagent_containers/food/snacks/spagetti/New() ..() - reagents.add_reagent("nutriment", 1) bitesize = 1 /obj/item/weapon/reagent_containers/food/snacks/cheesyfries @@ -1347,11 +1399,12 @@ trash = /obj/item/trash/plate filling_color = "#EDDD00" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 4 + nutriment_desc = list("fresh fries" = 3, "cheese" = 3) /obj/item/weapon/reagent_containers/food/snacks/cheesyfries/New() ..() reagents.add_reagent("protein", 2) - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/fortunecookie @@ -1360,10 +1413,11 @@ icon_state = "fortune_cookie" filling_color = "#E8E79E" center_of_mass = list("x"=15, "y"=14) + nutriment_amt = 3 + nutriment_desc = list("fortune cookie" = 2) /obj/item/weapon/reagent_containers/food/snacks/fortunecookie/New() ..() - reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/badrecipe @@ -1401,10 +1455,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#42B873" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 6 + nutriment_desc = list("mushroom" = 6) /obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff/New() ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("psilocybin", 6) bitesize = 3 @@ -1415,10 +1470,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#ED0758" center_of_mass = list("x"=16, "y"=5) + nutriment_amt = 6 + nutriment_desc = list("jelly" = 3, "mushroom" = 3) /obj/item/weapon/reagent_containers/food/snacks/amanitajelly/New() ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("amatoxin", 6) reagents.add_reagent("psilocybin", 3) bitesize = 3 @@ -1430,10 +1486,11 @@ bitesize = 2 filling_color = "#916E36" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 5 + nutriment_desc = list("poppy seeds" = 2, "pretzel" = 3) /obj/item/weapon/reagent_containers/food/snacks/poppypretzel/New() ..() - reagents.add_reagent("nutriment", 5) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatballsoup @@ -1482,10 +1539,11 @@ icon_state = "clownstears" filling_color = "#C4FBFF" center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 4 + nutriment_desc = list("salt" = 1, "the worst joke" = 3) /obj/item/weapon/reagent_containers/food/snacks/clownstears/New() ..() - reagents.add_reagent("nutriment", 4) reagents.add_reagent("banana", 5) reagents.add_reagent("water", 10) bitesize = 5 @@ -1497,10 +1555,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#AFC4B5" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 8 + nutriment_desc = list("carot" = 2, "corn" = 2, "eggplant" = 2, "potato" = 2) /obj/item/weapon/reagent_containers/food/snacks/vegetablesoup/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("water", 5) bitesize = 5 @@ -1511,10 +1570,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#AFC4B5" center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 8 + nutriment_desc = list("salad" = 4, "egg" = 2, "potato" = 2) /obj/item/weapon/reagent_containers/food/snacks/nettlesoup/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("water", 5) reagents.add_reagent("tricordrazine", 5) bitesize = 5 @@ -1526,6 +1586,8 @@ trash = /obj/item/trash/snack_bowl filling_color = "#F082FF" center_of_mass = list("x"=16, "y"=6) + nutriment_amt = 1 + nutriment_desc = list("backwash" = 1) /obj/item/weapon/reagent_containers/food/snacks/mysterysoup/New() ..() @@ -1581,7 +1643,7 @@ bitesize = 5 if(prob(25)) src.desc = "A wish come true!" - reagents.add_reagent("nutriment", 8) + reagents.add_reagent("nutriment", 8, list("something good" = 8)) /obj/item/weapon/reagent_containers/food/snacks/hotchili name = "Hot Chili" @@ -1590,11 +1652,12 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FF3C00" center_of_mass = list("x"=15, "y"=9) + nutriment_amt = 3 + nutriment_desc = list("chilli peppers" = 3) /obj/item/weapon/reagent_containers/food/snacks/hotchili/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) reagents.add_reagent("capsaicin", 3) reagents.add_reagent("tomatojuice", 2) bitesize = 5 @@ -1605,13 +1668,13 @@ icon_state = "coldchili" filling_color = "#2B00FF" center_of_mass = list("x"=15, "y"=9) - trash = /obj/item/trash/snack_bowl + nutriment_amt = 3 + nutriment_desc = list("ice peppers" = 3) /obj/item/weapon/reagent_containers/food/snacks/coldchili/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) reagents.add_reagent("frostoil", 3) reagents.add_reagent("tomatojuice", 2) bitesize = 5 @@ -1695,10 +1758,11 @@ desc = "This is absolutely Ei Nath." icon_state = "spellburger" filling_color = "#D505FF" + nutriment_amt = 6 + nutriment_desc = list("magic" = 3, "buns" = 3) /obj/item/weapon/reagent_containers/food/snacks/spellburger/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger @@ -1707,11 +1771,12 @@ icon_state = "bigbiteburger" filling_color = "#E3D681" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 4 + nutriment_desc = list("buns" = 4) /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger/New() ..() reagents.add_reagent("protein", 10) - reagents.add_reagent("nutriment", 4) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/enchiladas @@ -1721,11 +1786,12 @@ trash = /obj/item/trash/tray filling_color = "#A36A1F" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 2 + nutriment_desc = list("tortilla" = 3, "corn" = 3) /obj/item/weapon/reagent_containers/food/snacks/enchiladas/New() ..() reagents.add_reagent("protein", 6) - reagents.add_reagent("nutriment",2) reagents.add_reagent("capsaicin", 6) bitesize = 4 @@ -1751,10 +1817,11 @@ icon_state = "baguette" filling_color = "#E3D796" center_of_mass = list("x"=18, "y"=12) + nutriment_amt = 6 + nutriment_desc = list("french bread" = 6) /obj/item/weapon/reagent_containers/food/snacks/baguette/New() ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("blackpepper", 1) reagents.add_reagent("sodiumchloride", 1) bitesize = 3 @@ -1765,11 +1832,12 @@ icon_state = "fishandchips" filling_color = "#E3D796" center_of_mass = list("x"=16, "y"=16) + nutriment_amt = 3 + nutriment_desc = list("salt" = 1, "chips" = 3) /obj/item/weapon/reagent_containers/food/snacks/fishandchips/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) reagents.add_reagent("carpotoxin", 3) bitesize = 3 @@ -1780,11 +1848,12 @@ trash = /obj/item/trash/plate filling_color = "#D9BE29" center_of_mass = list("x"=16, "y"=4) + nutriment_amt = 3 + nutriment_desc = list("bread" = 3, "cheese" = 3) /obj/item/weapon/reagent_containers/food/snacks/sandwich/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich @@ -1794,11 +1863,12 @@ trash = /obj/item/trash/plate filling_color = "#D9BE29" center_of_mass = list("x"=16, "y"=4) + nutriment_amt = 3 + nutriment_desc = list("toasted bread" = 3, "cheese" = 3) /obj/item/weapon/reagent_containers/food/snacks/toastedsandwich/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 3) reagents.add_reagent("carbon", 2) bitesize = 2 @@ -1808,11 +1878,12 @@ icon_state = "toastedsandwich" trash = /obj/item/trash/plate filling_color = "#D9BE29" + nutriment_amt = 3 + nutriment_desc = list("toasted bread" = 3, "cheese" = 3) /obj/item/weapon/reagent_containers/food/snacks/grilledcheese/New() ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 3) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tomatosoup @@ -1822,10 +1893,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#D92929" center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 5 + nutriment_desc = list("soup" = 5) /obj/item/weapon/reagent_containers/food/snacks/tomatosoup/New() ..() - reagents.add_reagent("nutriment", 5) reagents.add_reagent("tomatojuice", 10) bitesize = 3 @@ -1836,10 +1908,11 @@ trash = /obj/item/trash/waffles filling_color = "#FF00F7" center_of_mass = list("x"=15, "y"=11) + nutriment_amt = 8 + nutriment_desc = list("waffle" = 7, "sweetness" = 1) /obj/item/weapon/reagent_containers/food/snacks/rofflewaffles/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("psilocybin", 8) bitesize = 4 @@ -1849,11 +1922,12 @@ icon_state = "stew" filling_color = "#9E673A" center_of_mass = list("x"=16, "y"=5) + nutriment_amt = 6 + nutriment_desc = list("tomato" = 2, "potato" = 2, "carrot" = 2, "eggplant" = 2, "mushroom" = 2) /obj/item/weapon/reagent_containers/food/snacks/stew/New() ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 6) reagents.add_reagent("tomatojuice", 5) reagents.add_reagent("imidazoline", 5) reagents.add_reagent("water", 5) @@ -1866,10 +1940,11 @@ trash = /obj/item/trash/plate filling_color = "#B572AB" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 1 + nutriment_desc = list("toasted bread" = 2) /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/New() ..() - reagents.add_reagent("nutriment", 1) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jelliedtoast/cherry/New() @@ -1886,10 +1961,11 @@ icon_state = "jellyburger" filling_color = "#B572AB" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 5 + nutriment_desc = list("buns" = 5) /obj/item/weapon/reagent_containers/food/snacks/jellyburger/New() ..() - reagents.add_reagent("nutriment", 5) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/jellyburger/slime/New() @@ -1906,10 +1982,11 @@ icon_state = "milosoup" trash = /obj/item/trash/snack_bowl center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 8 + nutriment_desc = list("soy" = 8) /obj/item/weapon/reagent_containers/food/snacks/milosoup/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("water", 5) bitesize = 4 @@ -1919,10 +1996,11 @@ icon_state = "stewedsoymeat" trash = /obj/item/trash/plate center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 8 + nutriment_desc = list("soy" = 4, "tomato" = 4) /obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat/New() ..() - reagents.add_reagent("nutriment", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti @@ -1932,10 +2010,11 @@ trash = /obj/item/trash/plate filling_color = "#FCEE81" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 2 + nutriment_desc = list("noodles" = 2) /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/boiledrice @@ -1945,10 +2024,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" center_of_mass = list("x"=17, "y"=11) + nutriment_amt = 2 + nutriment_desc = list("rice" = 2) /obj/item/weapon/reagent_containers/food/snacks/boiledrice/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/ricepudding @@ -1958,10 +2038,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FFFBDB" center_of_mass = list("x"=17, "y"=11) + nutriment_amt = 4 + nutriment_desc = list("rice" = 2) /obj/item/weapon/reagent_containers/food/snacks/ricepudding/New() ..() - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/pastatomato @@ -1971,10 +2052,11 @@ trash = /obj/item/trash/plate filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 6 + nutriment_desc = list("tomato" = 3, "noodles" = 3) /obj/item/weapon/reagent_containers/food/snacks/pastatomato/New() ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("tomatojuice", 10) bitesize = 4 @@ -1985,11 +2067,12 @@ trash = /obj/item/trash/plate filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 4 + nutriment_desc = list("noodles" = 4) /obj/item/weapon/reagent_containers/food/snacks/meatballspagetti/New() ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/spesslaw @@ -1998,11 +2081,12 @@ icon_state = "spesslaw" filling_color = "#DE4545" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 4 + nutriment_desc = list("noodles" = 4) /obj/item/weapon/reagent_containers/food/snacks/spesslaw/New() ..() reagents.add_reagent("protein", 4) - reagents.add_reagent("nutriment", 4) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/carrotfries @@ -2012,10 +2096,11 @@ trash = /obj/item/trash/plate filling_color = "#FAA005" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 3 + nutriment_desc = list("carrot" = 3, "salt" = 1) /obj/item/weapon/reagent_containers/food/snacks/carrotfries/New() ..() - reagents.add_reagent("nutriment", 3) reagents.add_reagent("imidazoline", 3) bitesize = 2 @@ -2025,11 +2110,12 @@ icon_state = "superbiteburger" filling_color = "#CCA26A" center_of_mass = list("x"=16, "y"=3) + nutriment_amt = 25 + nutriment_desc = list("buns" = 25) /obj/item/weapon/reagent_containers/food/snacks/superbiteburger/New() ..() reagents.add_reagent("protein", 25) - reagents.add_reagent("nutriment", 25) bitesize = 10 /obj/item/weapon/reagent_containers/food/snacks/candiedapple @@ -2038,10 +2124,11 @@ icon_state = "candiedapple" filling_color = "#F21873" center_of_mass = list("x"=15, "y"=13) + nutriment_amt = 3 + nutriment_desc = list("apple" = 3, "caramel" = 3, "sweetness" = 2) /obj/item/weapon/reagent_containers/food/snacks/candiedapple/New() ..() - reagents.add_reagent("nutriment", 3) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/applepie @@ -2050,10 +2137,11 @@ icon_state = "applepie" filling_color = "#E0EDC5" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 4 + nutriment_desc = list("sweetness" = 2, "apple" = 2, "pie" = 2) /obj/item/weapon/reagent_containers/food/snacks/applepie/New() ..() - reagents.add_reagent("nutriment", 4) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/cherrypie @@ -2062,10 +2150,11 @@ icon_state = "cherrypie" filling_color = "#FF525A" center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 4 + nutriment_desc = list("sweetness" = 2, "cherry" = 2, "pie" = 2) /obj/item/weapon/reagent_containers/food/snacks/cherrypie/New() ..() - reagents.add_reagent("nutriment", 4) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/twobread @@ -2074,10 +2163,11 @@ icon_state = "twobread" filling_color = "#DBCC9A" center_of_mass = list("x"=15, "y"=12) + nutriment_amt = 2 + nutriment_desc = list("sourness" = 2, "bread" = 2) /obj/item/weapon/reagent_containers/food/snacks/twobread/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jellysandwich @@ -2087,10 +2177,11 @@ trash = /obj/item/trash/plate filling_color = "#9E3A78" center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 2 + nutriment_desc = list("bread" = 2) /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/New() ..() - reagents.add_reagent("nutriment", 2) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/jellysandwich/slime/New() @@ -2130,10 +2221,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#E386BF" center_of_mass = list("x"=17, "y"=10) + nutriment_amt = 8 + nutriment_desc = list("mushroom" = 8, "milk" = 2) /obj/item/weapon/reagent_containers/food/snacks/mushroomsoup/New() ..() - reagents.add_reagent("nutriment", 8) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit @@ -2142,6 +2234,8 @@ icon_state = "phelmbiscuit" filling_color = "#CFB4C4" center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 5 + nutriment_desc = list("mushroom" = 4) /obj/item/weapon/reagent_containers/food/snacks/plumphelmetbiscuit/New() ..() @@ -2149,7 +2243,6 @@ name = "exceptional plump helmet biscuit" desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" reagents.add_reagent("nutriment", 8) - reagents.add_reagent("tricordrazine", 5) bitesize = 2 else reagents.add_reagent("nutriment", 5) @@ -2175,11 +2268,12 @@ trash = /obj/item/trash/snack_bowl filling_color = "#FAC9FF" center_of_mass = list("x"=15, "y"=8) + nutriment_amt = 8 + nutriment_desc = list("tomato" = 4, "beet" = 4) /obj/item/weapon/reagent_containers/food/snacks/beetsoup/New() ..() name = pick(list("borsch","bortsch","borstch","borsh","borshch","borscht")) - reagents.add_reagent("nutriment", 8) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/tossedsalad @@ -2189,10 +2283,11 @@ trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" center_of_mass = list("x"=17, "y"=11) + nutriment_amt = 8 + nutriment_desc = list("salad" = 2, "tomato" = 2, "carrot" = 2, "apple" = 2) /obj/item/weapon/reagent_containers/food/snacks/tossedsalad/New() ..() - reagents.add_reagent("nutriment", 8) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/validsalad @@ -2202,11 +2297,12 @@ trash = /obj/item/trash/snack_bowl filling_color = "#76B87F" center_of_mass = list("x"=17, "y"=11) + nutriment_amt = 6 + nutriment_desc = list("100% real salad") /obj/item/weapon/reagent_containers/food/snacks/validsalad/New() ..() reagents.add_reagent("protein", 2) - reagents.add_reagent("nutriment", 6) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/appletart @@ -2216,10 +2312,11 @@ trash = /obj/item/trash/plate filling_color = "#FFFF00" center_of_mass = list("x"=16, "y"=18) + nutriment_amt = 8 + nutriment_desc = list("apple" = 8) /obj/item/weapon/reagent_containers/food/snacks/appletart/New() ..() - reagents.add_reagent("nutriment", 8) reagents.add_reagent("gold", 5) bitesize = 3 @@ -2239,11 +2336,12 @@ slices_num = 5 filling_color = "#FF7575" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 10 + nutriment_desc = list("bread" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread/New() ..() reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/meatbreadslice @@ -2269,11 +2367,12 @@ slices_num = 5 filling_color = "#8AFF75" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 10 + nutriment_desc = list("bread" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/xenomeatbread/New() ..() reagents.add_reagent("protein", 20) - reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/xenomeatbreadslice @@ -2299,11 +2398,12 @@ slices_num = 5 filling_color = "#EDE5AD" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 10 + nutriment_desc = list("bread" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/bananabread/New() ..() reagents.add_reagent("banana", 20) - reagents.add_reagent("nutriment", 20) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/bananabreadslice @@ -2329,6 +2429,8 @@ slices_num = 5 filling_color = "#F7FFE0" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 30 + nutriment_desc = list("bread" = 15, "tofu" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/tofubread/New() ..() @@ -2358,10 +2460,11 @@ slices_num = 5 filling_color = "#FFD675" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 25 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "carrot" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/carrotcake/New() ..() - reagents.add_reagent("nutriment", 25) reagents.add_reagent("imidazoline", 10) bitesize = 2 @@ -2388,11 +2491,12 @@ slices_num = 5 filling_color = "#E6AEDB" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 5 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "slime" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/braincake/New() ..() reagents.add_reagent("protein", 25) - reagents.add_reagent("nutriment", 5) reagents.add_reagent("alkysine", 10) bitesize = 2 @@ -2420,11 +2524,12 @@ slices_num = 5 filling_color = "#FAF7AF" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 10 + nutriment_desc = list("cake" = 10, "cream" = 10, "cheese" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesecake/New() ..() reagents.add_reagent("protein", 15) - reagents.add_reagent("nutriment", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesecakeslice @@ -2450,10 +2555,11 @@ slices_num = 5 filling_color = "#F7EDD5" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "vanilla" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/plaincake/New() ..() - reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/plaincakeslice name = "Vanilla Cake slice" @@ -2477,10 +2583,11 @@ slices_num = 5 filling_color = "#FADA8E" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "orange" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/orangecake/New() ..() - reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/orangecakeslice name = "Orange Cake slice" @@ -2504,6 +2611,8 @@ slices_num = 5 filling_color = "#CBFA8E" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "lime" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/limecake/New() ..() @@ -2531,10 +2640,11 @@ slices_num = 5 filling_color = "#FAFA8E" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "lemon" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/lemoncake/New() ..() - reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/lemoncakeslice name = "Lemon Cake slice" @@ -2558,10 +2668,11 @@ slices_num = 5 filling_color = "#805930" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "chocolate" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/chocolatecake/New() ..() - reagents.add_reagent("nutriment", 20) /obj/item/weapon/reagent_containers/food/snacks/chocolatecakeslice name = "Chocolate Cake slice" @@ -2585,10 +2696,12 @@ slices_num = 5 filling_color = "#FFF700" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 10 + nutriment_desc = list("cheese" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel/New() ..() - reagents.add_reagent("protein", 20) + reagents.add_reagent("protein", 10) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/cheesewedge @@ -2607,10 +2720,11 @@ slices_num = 5 filling_color = "#FFD6D6" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 20 + nutriment_desc = list("cake" = 10, "sweetness" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/birthdaycake/New() ..() - reagents.add_reagent("nutriment", 20) reagents.add_reagent("sprinkles", 10) bitesize = 3 @@ -2637,10 +2751,11 @@ slices_num = 5 filling_color = "#FFE396" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 6 + nutriment_desc = list("bread" = 6) /obj/item/weapon/reagent_containers/food/snacks/sliceable/bread/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/breadslice @@ -2666,11 +2781,12 @@ slices_num = 5 filling_color = "#FFF896" center_of_mass = list("x"=16, "y"=9) + nutriment_amt = 5 + nutriment_desc = list("bread" = 6, "cream" = 3, "cheese" = 3) /obj/item/weapon/reagent_containers/food/snacks/sliceable/creamcheesebread/New() ..() reagents.add_reagent("protein", 15) - reagents.add_reagent("nutriment", 5) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/creamcheesebreadslice @@ -2709,10 +2825,11 @@ slices_num = 5 filling_color = "#EBF5B8" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 15 + nutriment_desc = list("cake" = 10, "sweetness" = 10, "apple" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake/New() ..() - reagents.add_reagent("nutriment", 15) /obj/item/weapon/reagent_containers/food/snacks/applecakeslice name = "Apple Cake slice" @@ -2736,10 +2853,11 @@ slices_num = 5 filling_color = "#F5B951" center_of_mass = list("x"=16, "y"=10) + nutriment_amt = 15 + nutriment_desc = list("pie" = 5, "cream" = 5, "pumpkin" = 5) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pumpkinpie/New() ..() - reagents.add_reagent("nutriment", 15) /obj/item/weapon/reagent_containers/food/snacks/pumpkinpieslice name = "Pumpkin Pie slice" @@ -2761,10 +2879,11 @@ icon_state = "cracker" filling_color = "#F5DEB8" center_of_mass = list("x"=17, "y"=6) + nutriment_amt = 1 + nutriment_desc = list("salt" = 1, "cracker" = 2) /obj/item/weapon/reagent_containers/food/snacks/cracker/New() ..() - reagents.add_reagent("nutriment", 1) /////////////////////////////////////////////////PIZZA//////////////////////////////////////// @@ -2779,10 +2898,11 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/margheritaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 35 + nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/margherita/New() ..() - reagents.add_reagent("nutriment", 35) reagents.add_reagent("protein", 5) reagents.add_reagent("tomatojuice", 6) bitesize = 2 @@ -2809,10 +2929,12 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/meatpizzaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 10 + nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 15) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza/New() ..() - reagents.add_reagent("protein", 44) + reagents.add_reagent("protein", 34) reagents.add_reagent("tomatojuice", 6) bitesize = 2 @@ -2837,10 +2959,11 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/mushroompizzaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 35 + nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 5, "mushroom" = 10) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/mushroompizza/New() ..() - reagents.add_reagent("nutriment", 35) reagents.add_reagent("protein", 5) bitesize = 2 @@ -2865,10 +2988,11 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/vegetablepizzaslice slices_num = 6 center_of_mass = list("x"=16, "y"=11) + nutriment_amt = 25 + nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 5, "eggplant" = 5, "carrot" = 5, "corn" = 5) /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza/New() ..() - reagents.add_reagent("nutriment", 25) reagents.add_reagent("protein", 5) reagents.add_reagent("tomatojuice", 6) reagents.add_reagent("imidazoline", 12) @@ -3083,10 +3207,11 @@ trash = /obj/item/trash/plate filling_color = "#75754B" center_of_mass = list("x"=16, "y"=7) + nutriment_amt = 6 + nutriment_desc = list("a chorus of flavor" = 6) /obj/item/weapon/reagent_containers/food/snacks/dionaroast/New() ..() - reagents.add_reagent("nutriment", 6) reagents.add_reagent("radium", 2) bitesize = 2 @@ -3100,11 +3225,12 @@ icon_state = "dough" bitesize = 2 center_of_mass = list("x"=16, "y"=13) + nutriment_amt = 3 + nutriment_desc = list("uncooked dough" = 3) /obj/item/weapon/reagent_containers/food/snacks/dough/New() ..() reagents.add_reagent("protein", 1) - reagents.add_reagent("nutriment", 3) // Dough + rolling pin = flat dough /obj/item/weapon/reagent_containers/food/snacks/dough/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -3137,10 +3263,11 @@ slices_num = 1 bitesize = 2 center_of_mass = list("x"=17, "y"=19) + nutriment_amt = 1 + nutriment_desc = list("uncooked dough" = 1) /obj/item/weapon/reagent_containers/food/snacks/doughslice/New() ..() - reagents.add_reagent("nutriment", 1) /obj/item/weapon/reagent_containers/food/snacks/bun name = "bun" @@ -3149,10 +3276,11 @@ icon_state = "bun" bitesize = 2 center_of_mass = list("x"=16, "y"=12) + nutriment_amt = 4 + nutriment_desc = "bun" /obj/item/weapon/reagent_containers/food/snacks/bun/New() ..() - reagents.add_reagent("nutriment", 4) /obj/item/weapon/reagent_containers/food/snacks/bun/attackby(obj/item/weapon/W as obj, mob/user as mob) // Bun + meatball = burger @@ -3204,10 +3332,11 @@ icon_state = "bunbun" bitesize = 2 center_of_mass = list("x"=16, "y"=8) + nutriment_amt = 8 + nutriment_desc = list("bun" = 8) /obj/item/weapon/reagent_containers/food/snacks/bunbun/New() ..() - reagents.add_reagent("nutriment", 8) /obj/item/weapon/reagent_containers/food/snacks/taco name = "taco" @@ -3215,11 +3344,11 @@ icon_state = "taco" bitesize = 3 center_of_mass = list("x"=21, "y"=12) - + nutriment_amt = 4 + nutriment_desc = list("cheese" = 2,"taco shell" = 2) /obj/item/weapon/reagent_containers/food/snacks/taco/New() ..() reagents.add_reagent("protein", 3) - reagents.add_reagent("nutriment", 4) /obj/item/weapon/reagent_containers/food/snacks/rawcutlet name = "raw cutlet" @@ -3275,10 +3404,11 @@ icon_state = "flatbread" bitesize = 2 center_of_mass = list("x"=16, "y"=16) + nutriment_amt = 3 + nutriment_desc = list("bread" = 3) /obj/item/weapon/reagent_containers/food/snacks/flatbread/New() ..() - reagents.add_reagent("nutriment", 3) // potato + knife = raw sticks /obj/item/weapon/reagent_containers/food/snacks/grown/potato/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -3296,10 +3426,11 @@ icon_state = "rawsticks" bitesize = 2 center_of_mass = list("x"=16, "y"=12) + nutriment_amt = 3 + nutriment_desc = list("raw potato" = 3) /obj/item/weapon/reagent_containers/food/snacks/rawsticks/New() ..() - reagents.add_reagent("nutriment", 3) /obj/item/weapon/reagent_containers/food/snacks/liquidfood name = "\improper LiquidFood Ration" @@ -3308,10 +3439,11 @@ trash = /obj/item/trash/liquidfood filling_color = "#A8A8A8" center_of_mass = list("x"=16, "y"=15) + nutriment_amt = 20 + nutriment_desc = list("chalk" = 6) /obj/item/weapon/reagent_containers/food/snacks/liquidfood/New() ..() - reagents.add_reagent("nutriment", 20) reagents.add_reagent("iron", 3) bitesize = 4 @@ -3322,10 +3454,11 @@ trash = /obj/item/trash/tastybread filling_color = "#A66829" center_of_mass = list("x"=17, "y"=16) + nutriment_amt = 6 + nutriment_desc = list("bread" = 2, "sweetness" = 3) /obj/item/weapon/reagent_containers/food/snacks/tastybread/New() ..() - reagents.add_reagent("nutriment", 6) bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks @@ -3334,8 +3467,9 @@ icon_state = "skrellsnacks" filling_color = "#A66829" center_of_mass = list("x"=15, "y"=12) + nutriment_amt = 10 + nutriment_desc = list("mushroom" = 5, "salt" = 5) /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks/New() ..() - reagents.add_reagent("nutriment", 10) bitesize = 3 diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index bbb0b3e8ad..5c7459e3b2 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -23,6 +23,7 @@ var/image/filling //holds a reference to the current filling overlay var/visible_name = "a syringe" var/time = 30 + var/drawing = 0 /obj/item/weapon/reagent_containers/syringe/on_reagent_change() update_icon() @@ -98,7 +99,12 @@ user << "You are unable to locate any blood." return + if(drawing) + user << "You are already drawing blood from [T.name]." + return + var/datum/reagent/B + drawing = 1 if(istype(T, /mob/living/carbon/human)) var/mob/living/carbon/human/H = T if(H.species && !H.should_have_organ(O_HEART)) @@ -106,12 +112,16 @@ else if(ismob(H) && H != user) if(!do_mob(user, target, time)) + drawing = 0 return B = T.take_blood(src, amount) + drawing = 0 else if(!do_mob(user, target, time)) + drawing = 0 return B = T.take_blood(src,amount) + drawing = 0 if (B) reagents.reagent_list += B @@ -200,7 +210,10 @@ admin_inject_log(user, target, src, contained, trans) else trans = reagents.trans_to(target, amount_per_transfer_from_this) - user << "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." + if(trans) + user << "You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." + else + user << "The syringe is empty." if (reagents.total_volume <= 0 && mode == SYRINGE_INJECT) mode = SYRINGE_DRAW update_icon() diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 8e91f3f06a..ee1bbcaf2f 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -435,7 +435,7 @@ other types of metals and chemistry for reagents). id = "scalpel_laser1" 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/scalpel/laser1 + build_path = /obj/item/weapon/surgical/scalpel/laser1 sort_string = "MBBAA" /datum/design/item/scalpel_laser2 @@ -444,7 +444,7 @@ other types of metals and chemistry for reagents). id = "scalpel_laser2" 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/scalpel/laser2 + build_path = /obj/item/weapon/surgical/scalpel/laser2 sort_string = "MBBAB" /datum/design/item/scalpel_laser3 @@ -453,7 +453,7 @@ other types of metals and chemistry for reagents). id = "scalpel_laser3" 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/scalpel/laser3 + build_path = /obj/item/weapon/surgical/scalpel/laser3 sort_string = "MBBAC" /datum/design/item/scalpel_manager @@ -462,7 +462,7 @@ other types of metals and chemistry for reagents). id = "scalpel_manager" 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/scalpel/manager + build_path = /obj/item/weapon/surgical/scalpel/manager sort_string = "MBBAD" /datum/design/item/implant diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index 43e933c00c..02a05eb64d 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -44,7 +44,7 @@ H.real_name = "Synthmorph #[rand(100,999)]" H.name = H.real_name H.dir = 2 - H.add_language("Encoded Audio Language") + H.add_language(LANGUAGE_EAL) return H //////////////////// Prosthetics //////////////////// diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 818e208ff4..015661351f 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -5,7 +5,7 @@ /datum/surgery_step/glue_bone allowed_tools = list( - /obj/item/weapon/bonegel = 100, \ + /obj/item/weapon/surgical/bonegel = 100, \ /obj/item/weapon/screwdriver = 75 ) can_infect = 1 @@ -41,7 +41,7 @@ /datum/surgery_step/set_bone allowed_tools = list( - /obj/item/weapon/bonesetter = 100, \ + /obj/item/weapon/surgical/bonesetter = 100, \ /obj/item/weapon/wrench = 75 \ ) @@ -80,7 +80,7 @@ /datum/surgery_step/mend_skull allowed_tools = list( - /obj/item/weapon/bonesetter = 100, \ + /obj/item/weapon/surgical/bonesetter = 100, \ /obj/item/weapon/wrench = 75 \ ) @@ -114,7 +114,7 @@ /datum/surgery_step/finish_bone allowed_tools = list( - /obj/item/weapon/bonegel = 100, \ + /obj/item/weapon/surgical/bonegel = 100, \ /obj/item/weapon/screwdriver = 75 ) can_infect = 1 diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index 81b11d12db..51200b52bf 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -17,7 +17,7 @@ /datum/surgery_step/open_encased/saw allowed_tools = list( - /obj/item/weapon/circular_saw = 100, \ + /obj/item/weapon/surgical/circular_saw = 100, \ /obj/item/weapon/material/hatchet = 75 ) @@ -66,7 +66,7 @@ /datum/surgery_step/open_encased/retract allowed_tools = list( - /obj/item/weapon/retractor = 100, \ + /obj/item/weapon/surgical/retractor = 100, \ /obj/item/weapon/crowbar = 75 ) @@ -122,7 +122,7 @@ /datum/surgery_step/open_encased/close allowed_tools = list( - /obj/item/weapon/retractor = 100, \ + /obj/item/weapon/surgical/retractor = 100, \ /obj/item/weapon/crowbar = 75 ) @@ -179,7 +179,7 @@ /datum/surgery_step/open_encased/mend allowed_tools = list( - /obj/item/weapon/bonegel = 100, \ + /obj/item/weapon/surgical/bonegel = 100, \ /obj/item/weapon/screwdriver = 75 ) diff --git a/code/modules/surgery/face.dm b/code/modules/surgery/face.dm index dc1c0ab31c..10856bcf89 100644 --- a/code/modules/surgery/face.dm +++ b/code/modules/surgery/face.dm @@ -17,7 +17,7 @@ /datum/surgery_step/generic/cut_face allowed_tools = list( - /obj/item/weapon/scalpel = 100, \ + /obj/item/weapon/surgical/scalpel = 100, \ /obj/item/weapon/material/knife = 75, \ /obj/item/weapon/material/shard = 50, \ ) @@ -47,7 +47,7 @@ /datum/surgery_step/face/mend_vocal allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ + /obj/item/weapon/surgical/hemostat = 100, \ /obj/item/stack/cable_coil = 75, \ /obj/item/device/assembly/mousetrap = 10 //I don't know. Don't ask me. But I'm leaving it because hilarity. ) @@ -75,7 +75,7 @@ /datum/surgery_step/face/fix_face allowed_tools = list( - /obj/item/weapon/retractor = 100, \ + /obj/item/weapon/surgical/retractor = 100, \ /obj/item/weapon/crowbar = 55, \ /obj/item/weapon/material/kitchen/utensil/fork = 75) @@ -103,7 +103,7 @@ /datum/surgery_step/face/cauterize allowed_tools = list( - /obj/item/weapon/cautery = 100, \ + /obj/item/weapon/surgical/cautery = 100, \ /obj/item/clothing/mask/smokable/cigarette = 75, \ /obj/item/weapon/flame/lighter = 50, \ /obj/item/weapon/weldingtool = 25 diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index f08d677f6a..81a105a544 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -23,9 +23,9 @@ /datum/surgery_step/generic/cut_with_laser allowed_tools = list( - /obj/item/weapon/scalpel/laser3 = 95, \ - /obj/item/weapon/scalpel/laser2 = 85, \ - /obj/item/weapon/scalpel/laser1 = 75, \ + /obj/item/weapon/surgical/scalpel/laser3 = 95, \ + /obj/item/weapon/surgical/scalpel/laser2 = 85, \ + /obj/item/weapon/surgical/scalpel/laser1 = 75, \ /obj/item/weapon/melee/energy/sword = 5 ) priority = 2 @@ -65,7 +65,7 @@ /datum/surgery_step/generic/incision_manager allowed_tools = list( - /obj/item/weapon/scalpel/manager = 100 + /obj/item/weapon/surgical/scalpel/manager = 100 ) priority = 2 req_open = 0 @@ -106,7 +106,7 @@ /datum/surgery_step/generic/cut_open allowed_tools = list( - /obj/item/weapon/scalpel = 100, \ + /obj/item/weapon/surgical/scalpel = 100, \ /obj/item/weapon/material/knife = 75, \ /obj/item/weapon/material/shard = 50, \ ) @@ -146,7 +146,7 @@ /datum/surgery_step/generic/clamp_bleeders allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ + /obj/item/weapon/surgical/hemostat = 100, \ /obj/item/stack/cable_coil = 75, \ /obj/item/device/assembly/mousetrap = 20 ) @@ -181,7 +181,7 @@ /datum/surgery_step/generic/retract_skin allowed_tools = list( - /obj/item/weapon/retractor = 100, \ + /obj/item/weapon/surgical/retractor = 100, \ /obj/item/weapon/crowbar = 75, \ /obj/item/weapon/material/kitchen/utensil/fork = 50 ) @@ -236,7 +236,7 @@ /datum/surgery_step/generic/cauterize allowed_tools = list( - /obj/item/weapon/cautery = 100, \ + /obj/item/weapon/surgical/cautery = 100, \ /obj/item/clothing/mask/smokable/cigarette = 75, \ /obj/item/weapon/flame/lighter = 50, \ /obj/item/weapon/weldingtool = 25 @@ -273,7 +273,7 @@ /datum/surgery_step/generic/amputate allowed_tools = list( - /obj/item/weapon/circular_saw = 100, \ + /obj/item/weapon/surgical/circular_saw = 100, \ /obj/item/weapon/material/hatchet = 75 ) req_open = 0 diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index e97d09c833..3e49482c75 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -40,7 +40,7 @@ /datum/surgery_step/cavity/make_space allowed_tools = list( - /obj/item/weapon/surgicaldrill = 100, \ + /obj/item/weapon/surgical/surgicaldrill = 100, \ /obj/item/weapon/pen = 75, \ /obj/item/stack/rods = 50 ) @@ -69,7 +69,7 @@ /datum/surgery_step/cavity/close_space priority = 2 allowed_tools = list( - /obj/item/weapon/cautery = 100, \ + /obj/item/weapon/surgical/cautery = 100, \ /obj/item/clothing/mask/smokable/cigarette = 75, \ /obj/item/weapon/flame/lighter = 50, \ /obj/item/weapon/weldingtool = 25 @@ -144,7 +144,7 @@ /datum/surgery_step/cavity/implant_removal allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ + /obj/item/weapon/surgical/hemostat = 100, \ /obj/item/weapon/wirecutters = 75, \ /obj/item/weapon/material/kitchen/utensil/fork = 20 ) diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm index 3b6be3b9eb..ea5fb32091 100644 --- a/code/modules/surgery/limb_reattach.dm +++ b/code/modules/surgery/limb_reattach.dm @@ -57,7 +57,7 @@ /datum/surgery_step/limb/connect allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ + /obj/item/weapon/surgical/hemostat = 100, \ /obj/item/stack/cable_coil = 75, \ /obj/item/device/assembly/mousetrap = 20 ) diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm index f476f7b948..6abe4c3646 100644 --- a/code/modules/surgery/organs_internal.dm +++ b/code/modules/surgery/organs_internal.dm @@ -106,7 +106,7 @@ /datum/surgery_step/internal/detatch_organ allowed_tools = list( - /obj/item/weapon/scalpel = 100, \ + /obj/item/weapon/surgical/scalpel = 100, \ /obj/item/weapon/material/knife = 75, \ /obj/item/weapon/material/shard = 50, \ ) @@ -166,7 +166,7 @@ /datum/surgery_step/internal/remove_organ allowed_tools = list( - /obj/item/weapon/hemostat = 100, \ + /obj/item/weapon/surgical/hemostat = 100, \ /obj/item/weapon/wirecutters = 75, \ /obj/item/weapon/material/kitchen/utensil/fork = 20 ) @@ -292,7 +292,7 @@ /datum/surgery_step/internal/attach_organ allowed_tools = list( - /obj/item/weapon/FixOVein = 100, \ + /obj/item/weapon/surgical/FixOVein = 100, \ /obj/item/stack/cable_coil = 75 ) @@ -345,7 +345,7 @@ // To be finished after some tests. // /datum/surgery_step/ribcage/heart/cut // allowed_tools = list( -// /obj/item/weapon/scalpel = 100, \ +// /obj/item/weapon/surgical/scalpel = 100, \ // /obj/item/weapon/material/knife = 75, \ // /obj/item/weapon/material/shard = 50, \ // ) diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm index 4362dc969f..303dcfc141 100644 --- a/code/modules/surgery/other.dm +++ b/code/modules/surgery/other.dm @@ -7,7 +7,7 @@ /datum/surgery_step/fix_vein priority = 2 allowed_tools = list( - /obj/item/weapon/FixOVein = 100, \ + /obj/item/weapon/surgical/FixOVein = 100, \ /obj/item/stack/cable_coil = 75 ) can_infect = 1 @@ -55,7 +55,7 @@ /datum/surgery_step/fix_dead_tissue //Debridement priority = 2 allowed_tools = list( - /obj/item/weapon/scalpel = 100, \ + /obj/item/weapon/surgical/scalpel = 100, \ /obj/item/weapon/material/knife = 75, \ /obj/item/weapon/material/shard = 50, \ ) @@ -172,7 +172,7 @@ /datum/surgery_step/hardsuit allowed_tools = list( /obj/item/weapon/weldingtool = 80, - /obj/item/weapon/circular_saw = 60, + /obj/item/weapon/surgical/circular_saw = 60, /obj/item/weapon/pickaxe/plasmacutter = 100 ) req_open = 0 diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 544ddbbcfe..87e37e043e 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -56,7 +56,7 @@ /datum/surgery_step/robotics/open_hatch allowed_tools = list( - /obj/item/weapon/retractor = 100, + /obj/item/weapon/surgical/retractor = 100, /obj/item/weapon/crowbar = 100, /obj/item/weapon/material/kitchen/utensil = 50 ) @@ -88,7 +88,7 @@ /datum/surgery_step/robotics/close_hatch allowed_tools = list( - /obj/item/weapon/retractor = 100, + /obj/item/weapon/surgical/retractor = 100, /obj/item/weapon/crowbar = 100, /obj/item/weapon/material/kitchen/utensil = 50 ) @@ -196,7 +196,7 @@ /datum/surgery_step/robotics/fix_organ_robotic //For artificial organs allowed_tools = list( /obj/item/stack/nanopaste = 100, \ - /obj/item/weapon/bonegel = 30, \ + /obj/item/weapon/surgical/bonegel = 30, \ /obj/item/weapon/screwdriver = 70, \ ) diff --git a/code/modules/surgery/slimes.dm b/code/modules/surgery/slimes.dm index 3d9865c511..c423c8c49b 100644 --- a/code/modules/surgery/slimes.dm +++ b/code/modules/surgery/slimes.dm @@ -11,7 +11,7 @@ /datum/surgery_step/slime/cut_flesh allowed_tools = list( - /obj/item/weapon/scalpel = 100, \ + /obj/item/weapon/surgical/scalpel = 100, \ /obj/item/weapon/material/knife = 75, \ /obj/item/weapon/material/shard = 50, \ ) @@ -37,7 +37,7 @@ /datum/surgery_step/slime/cut_innards allowed_tools = list( - /obj/item/weapon/scalpel = 100, \ + /obj/item/weapon/surgical/scalpel = 100, \ /obj/item/weapon/material/knife = 75, \ /obj/item/weapon/material/shard = 50, \ ) @@ -63,7 +63,7 @@ /datum/surgery_step/slime/saw_core allowed_tools = list( - /obj/item/weapon/circular_saw = 100, \ + /obj/item/weapon/surgical/circular_saw = 100, \ /obj/item/weapon/material/hatchet = 75 ) diff --git a/code/modules/xenoarcheaology/artifacts/replicator.dm b/code/modules/xenoarcheaology/artifacts/replicator.dm index f60dd5d202..05d35a744e 100644 --- a/code/modules/xenoarcheaology/artifacts/replicator.dm +++ b/code/modules/xenoarcheaology/artifacts/replicator.dm @@ -41,17 +41,17 @@ /obj/item/device/radio/beacon, /obj/item/weapon/autopsy_scanner, /obj/item/weapon/bikehorn, - /obj/item/weapon/bonesetter, + /obj/item/weapon/surgical/bonesetter, /obj/item/weapon/material/knife/butch, /obj/item/weapon/caution, /obj/item/weapon/caution/cone, /obj/item/weapon/crowbar, /obj/item/weapon/clipboard, /obj/item/weapon/cell, - /obj/item/weapon/circular_saw, + /obj/item/weapon/surgical/circular_saw, /obj/item/weapon/material/hatchet, /obj/item/weapon/handcuffs, - /obj/item/weapon/hemostat, + /obj/item/weapon/surgical/hemostat, /obj/item/weapon/material/knife, /obj/item/weapon/flame/lighter, /obj/item/weapon/light/bulb, diff --git a/code/modules/xenobio2/mob/slime/slime.dm b/code/modules/xenobio2/mob/slime/slime.dm index 65d4ad64d8..48f5ce5756 100644 --- a/code/modules/xenobio2/mob/slime/slime.dm +++ b/code/modules/xenobio2/mob/slime/slime.dm @@ -18,7 +18,7 @@ Slime definitions, Life and New live here. var/is_child = 1 var/cores = 3 var/growthcounter = 0 - var/growthpoint = 50 //At what point they grow up. + var/growthpoint = 25 //At what point they grow up. var/shiny = 0 move_to_delay = 17 //Slimes shouldn't be able to go faster than humans. default_chems = list("slimejelly" = 5) @@ -26,11 +26,11 @@ Slime definitions, Life and New live here. response_help = "pats" response_disarm = "tries to stop" response_harm = "hits" - + var/emote_on = null - + maleable = MAX_MALEABLE - + //Slimes can speak all of the languages, oh no! universal_speak = 1 speak_chance = 1 @@ -45,7 +45,7 @@ Slime definitions, Life and New live here. //Overlay information var/overlay = 1 // 1 = normal lighting, 0 = shiny, 2 = too shiny, -1 = no overlay - + chemreact = list( "nutriment" = list("nutr" = 0.5), "radium" = list("toxic" = 0.3, "mut" = 1), "mutagen" = list("nutr" = 0.4, "mut" = 2), @@ -79,7 +79,7 @@ Slime definitions, Life and New live here. "glycerol" = list("nutr" = 0.6), "woodpulp" = list("heal" = 0.1, "nutr" = 0.7), "docilitytoxin" = list("nutr" = 0.3) ) - + /mob/living/simple_animal/xeno/slime/New() ..() for(var/datum/language/L in (typesof(/datum/language) - /datum/language)) @@ -91,4 +91,3 @@ Slime definitions, Life and New live here. resistances[TOX] = 1.5 GenerateChild() return 1 - \ No newline at end of file diff --git a/code/modules/xenobio2/mob/xeno.dm b/code/modules/xenobio2/mob/xeno.dm index 6783823d6a..979782e9bd 100644 --- a/code/modules/xenobio2/mob/xeno.dm +++ b/code/modules/xenobio2/mob/xeno.dm @@ -95,6 +95,12 @@ Also includes Life and New if(!health) stat = DEAD +/mob/living/simple_animal/xeno/bullet_act(var/obj/item/projectile/Proj) + if(istype(Proj, /obj/item/projectile/beam/stun/xeno)) + var/obj/item/projectile/beam/stun/xeno/hit = Proj + stasis += hit.stasisforce + ..() + /mob/living/simple_animal/xeno/Destroy() traitdat.Destroy() //Let's clean up after ourselves. traitdat = null diff --git a/code/modules/xenobio2/tools/slime_handling_tools.dm b/code/modules/xenobio2/tools/slime_handling_tools.dm index e06fa3a86b..050a97bc41 100644 --- a/code/modules/xenobio2/tools/slime_handling_tools.dm +++ b/code/modules/xenobio2/tools/slime_handling_tools.dm @@ -52,13 +52,19 @@ muzzle_type = /obj/effect/projectile/laser_omni/muzzle tracer_type = /obj/effect/projectile/laser_omni/tracer impact_type = /obj/effect/projectile/laser_omni/impact - +/* /obj/item/projectile/beam/stun/xeno/on_hit(var/atom/target, var/blocked = 0) if(istype(target, /mob/living/simple_animal/xeno)) + world << "is xeno" var/mob/living/simple_animal/xeno/X = target - if(istype(target, /mob/living/simple_animal/xeno/slime)) + world << "[target.name]" + if(istype(X, /mob/living/simple_animal/xeno/slime)) + world << "is slime" X.stasis += stasisforce else + world << "is not slime" X.stasis += (stasisforce / 8) else - ..() \ No newline at end of file + world << "is not xeno" + ..() +*/ \ No newline at end of file diff --git a/code/unit_tests/integrated_circuits/logic.dm b/code/unit_tests/integrated_circuits/logic.dm index 314150f3b4..a022078c07 100644 --- a/code/unit_tests/integrated_circuits/logic.dm +++ b/code/unit_tests/integrated_circuits/logic.dm @@ -65,6 +65,32 @@ +/datum/unit_test/integrated_circuits/not_equals_1 + name = "Logic Circuits: Not Equals - String True" + circuit_type = /obj/item/integrated_circuit/logic/binary/not_equals + inputs_to_give = list("Test", "Nope") + expected_outputs = list(TRUE) + +/datum/unit_test/integrated_circuits/not_equals_2 + name = "Logic Circuits: Not Equals - String False" + circuit_type = /obj/item/integrated_circuit/logic/binary/not_equals + inputs_to_give = list("Test", "Test") + expected_outputs = list(FALSE) + +/datum/unit_test/integrated_circuits/not_equals_3 + name = "Logic Circuits: Not Equals - Number True" + circuit_type = /obj/item/integrated_circuit/logic/binary/not_equals + inputs_to_give = list(150, 20) + expected_outputs = list(TRUE) + +/datum/unit_test/integrated_circuits/not_equals_4 + name = "Logic Circuits: Not Equals - Number False" + circuit_type = /obj/item/integrated_circuit/logic/binary/not_equals + inputs_to_give = list(100, 100) + expected_outputs = list(FALSE) + + + /datum/unit_test/integrated_circuits/and_1 name = "Logic Circuits: And - True" circuit_type = /obj/item/integrated_circuit/logic/binary/and diff --git a/config/example/config.txt b/config/example/config.txt index bb680b4b4a..a01bbf9b95 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -25,6 +25,11 @@ JOBS_HAVE_MINIMAL_ACCESS ## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. #USE_AGE_RESTRICTION_FOR_JOBS +## Unhash this entry to have certain antag roles require your account to be at least a certain number of days old for round start and auto-spawn selection. +## Non-automatic antagonist recruitment, such as being converted to cultism is not affected. Has the same database requirements and notes as USE_AGE_RESTRICTION_FOR_JOBS. +#USE_AGE_RESTRICTION_FOR_ANTAGS + + ## Unhash this to use recursive explosions, keep it hashed to use circle explosions. Recursive explosions react to walls, airlocks and blast doors, making them look a lot cooler than the boring old circular explosions. They require more CPU and are (as of january 2013) experimental #USE_RECURSIVE_EXPLOSIONS diff --git a/html/changelog.html b/html/changelog.html index 4ea1ab9d63..ae6ba88f27 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,67 @@ -->
    +

    28 January 2017

    +

    Anewbe updated:

    +
      +
    • Added Medical and Meson aviators.
    • +
    • Medical and Meson aviators are now in the loadout, department locked.
    • +
    • Meson Scanners have been added to the loadout, department locked.
    • +
    • Medical hardsuit has a toggleable sprint.
    • +
    • Carbon and Hematite should show up in asteroid walls.
    • +
    • Readded the random crates from mining.
    • +
    • Digging through an artifact sometimes doesn't destroy the artifact.
    • +
    • Space and cracked sand should no longer stop mining drills.
    • +
    • Diona can regenerate organs and limbs.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • Resetting a character slot now requires confirmation.
    • +
    +

    Zuhayr updated:

    +
      +
    • Added a reset slot button to chargen.
    • +
    + +

    23 January 2017

    +

    Anewbe updated:

    +
      +
    • Can now just click ones boots to draw a holstered knife.
    • +
    • More boots can hold knives now.
    • +
    • Added an action button for breath masks, making it easier to toggle them.
    • +
    • Space Carp have a chance of sticking around after their event completes.
    • +
    • Robotic limbs will no longer show up on the health scanners.
    • +
    • Medics and Security can open firedoors. Do so at your own risk.
    • +
    • Chaplain hoodie now has pockets and an actual hood.
    • +
    • Winter coat hoods have the same armor values as their coats.
    • +
    • Characters will now spawn in at a random level of hunger.
    • +
    • Assisted and Prosthetic organs now have sprites.
    • +
    • Surgical tools will not attack while on help intent, this should prevent people getting accidentally stabbed in surgery.
    • +
    • Tajaran now process reagents slightly faster.
    • +
    • Taj are now allergic to coffee again, per loremaster request.
    • +
    • Taj now get drunk faster.
    • +
    • Hyperzine is now more toxic to Taj.
    • +
    • Readded the Vox for admin/antag use and testing. They breathe Phoron now, rather than Nitrogen.
    • +
    • The Xenotaser should work properly.
    • +
    +

    FTangSteve updated:

    +
      +
    • RootSpeak is now split into a local and a global variant. For now the global acts as a hivemind.
    • +
    +

    Hubblenaut updated:

    +
      +
    • Can now click on turfs with trash bags and similar to quick-gather everything on it. No longer pixelhunting for cigarettes and bullets.
    • +
    • Buckets and other reagent holders will no longer simply be put into the janitorial cart's trash bag.
    • +
    +

    PsiOmegaDelta updated:

    +
      +
    • The round start and auto-antag spawners can now check if players have played long enough to be eligable for selection.
    • +
    +

    Techhead updated:

    +
      +
    • Added a new random event: Shipping Error - A random crate is mistakenly shipped to the station.
    • +
    +

    12 January 2017

    Anewbe updated:

      diff --git a/html/changelogs/Anewbe - CyberLimbs.yml b/html/changelogs/Yoshax-Logs.yml similarity index 84% rename from html/changelogs/Anewbe - CyberLimbs.yml rename to html/changelogs/Yoshax-Logs.yml index e454a4a8b5..eab0fe6fd3 100644 --- a/html/changelogs/Anewbe - CyberLimbs.yml +++ b/html/changelogs/Yoshax-Logs.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Anewbe +author: Yosh # 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: - - tweak: "Robotic limbs will no longer show up on the health scanners." \ No newline at end of file + - rscadd: "Some vending machines now log the items they've vended and had stocked, storing the name of the user, the time and the item. These can be found by using the new verb for vending machines, or from the right click menu." diff --git a/icons/effects/projectiles.dmi b/icons/effects/projectiles.dmi index 5598cf6f84..9664b3e13b 100644 Binary files a/icons/effects/projectiles.dmi and b/icons/effects/projectiles.dmi differ diff --git a/icons/mob/eyes.dmi b/icons/mob/eyes.dmi index 2afd8836d3..6657457344 100644 Binary files a/icons/mob/eyes.dmi and b/icons/mob/eyes.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index ec8a1543f2..201a8ffee5 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_races/r_vox.dmi b/icons/mob/human_races/r_vox.dmi new file mode 100644 index 0000000000..f212822aaf Binary files /dev/null and b/icons/mob/human_races/r_vox.dmi differ diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi index dd4369cce7..140f573f69 100644 Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ diff --git a/icons/mob/items/righthand_guns.dmi b/icons/mob/items/righthand_guns.dmi index d8f221abef..192798733f 100644 Binary files a/icons/mob/items/righthand_guns.dmi and b/icons/mob/items/righthand_guns.dmi differ diff --git a/icons/mob/rig_back.dmi b/icons/mob/rig_back.dmi index 96108539d1..19bf38764e 100644 Binary files a/icons/mob/rig_back.dmi and b/icons/mob/rig_back.dmi differ diff --git a/icons/mob/species/vox/eyes.dmi b/icons/mob/species/vox/eyes.dmi new file mode 100644 index 0000000000..6e15b3e58c Binary files /dev/null and b/icons/mob/species/vox/eyes.dmi differ diff --git a/icons/mob/species/vox/gloves.dmi b/icons/mob/species/vox/gloves.dmi new file mode 100644 index 0000000000..16fbe55fee Binary files /dev/null and b/icons/mob/species/vox/gloves.dmi differ diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi new file mode 100644 index 0000000000..6f272f4d1d Binary files /dev/null and b/icons/mob/species/vox/head.dmi differ diff --git a/icons/mob/species/vox/masks.dmi b/icons/mob/species/vox/masks.dmi new file mode 100644 index 0000000000..58bb8f7f20 Binary files /dev/null and b/icons/mob/species/vox/masks.dmi differ diff --git a/icons/mob/species/vox/shoes.dmi b/icons/mob/species/vox/shoes.dmi new file mode 100644 index 0000000000..a5a271f7cb Binary files /dev/null and b/icons/mob/species/vox/shoes.dmi differ diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi new file mode 100644 index 0000000000..9692c5d111 Binary files /dev/null and b/icons/mob/species/vox/suit.dmi differ diff --git a/icons/mob/species/vox/uniform.dmi b/icons/mob/species/vox/uniform.dmi new file mode 100644 index 0000000000..515595633f Binary files /dev/null and b/icons/mob/species/vox/uniform.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 74f49d6376..cacd2d2dbd 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index 010b04137f..c081276a2f 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index 662e2f91cf..ff4ea400ed 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index ae2c3ee288..6518425b54 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 1fdc351f6b..88105392b5 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 2db6cc7814..daddbeddbc 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/species/vox/hats.dmi b/icons/obj/clothing/species/vox/hats.dmi new file mode 100644 index 0000000000..a9a71009bf Binary files /dev/null and b/icons/obj/clothing/species/vox/hats.dmi differ diff --git a/icons/obj/clothing/species/vox/suits.dmi b/icons/obj/clothing/species/vox/suits.dmi new file mode 100644 index 0000000000..5efadccb80 Binary files /dev/null and b/icons/obj/clothing/species/vox/suits.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 5f562d64da..bbce516a0c 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index 2aa2e822c8..3adab0f88e 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/electronic_assemblies.dmi b/icons/obj/electronic_assemblies.dmi index 8fd1c4f5e1..81aa71eac7 100644 Binary files a/icons/obj/electronic_assemblies.dmi and b/icons/obj/electronic_assemblies.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 996ab9699d..09fb9b6b7a 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/meteor.dmi b/icons/obj/meteor.dmi index b9a83d510e..27ebc22445 100644 Binary files a/icons/obj/meteor.dmi and b/icons/obj/meteor.dmi differ diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi index 4c77191d26..30f8cdde7c 100644 Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi index 2e254cc5cb..61cb6a6a8f 100644 Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ diff --git a/icons/obj/rig_modules.dmi b/icons/obj/rig_modules.dmi index 6ce7962fb7..970d2f8a42 100644 Binary files a/icons/obj/rig_modules.dmi and b/icons/obj/rig_modules.dmi differ diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 202ec39bc8..f8aede48f2 100644 Binary files a/icons/obj/surgery.dmi and b/icons/obj/surgery.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 15152c2159..884b8ac41e 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm index ed088e1325..b9ca6d0677 100644 --- a/maps/polaris-1.dmm +++ b/maps/polaris-1.dmm @@ -2150,7 +2150,7 @@ "aPr" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/pool) "aPs" = (/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/structure/bed/chair{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/security/lobby) "aPt" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/pool) -"aPu" = (/obj/structure/closet/crate,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/double,/obj/effect/decal/cleanable/cobweb2,/obj/effect/landmark{name = "blobstart"},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/pool) +"aPu" = (/obj/structure/closet/crate,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/weapon/tank/emergency/oxygen/double,/obj/effect/decal/cleanable/cobweb2,/obj/effect/landmark{name = "blobstart"},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/pool) "aPv" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_inner"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1) "aPw" = (/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/brigdoor/northright{name = "Ammo"},/obj/structure/table/rack,/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/stunshells,/obj/item/weapon/storage/box/stunshells,/turf/simulated/floor/tiled/dark,/area/security/armoury) "aPx" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/range) @@ -2964,9 +2964,9 @@ "beZ" = (/turf/simulated/wall,/area/medical/surgeryobs) "bfa" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/cups{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/tiled,/area/medical/surgeryobs) "bfb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled/dark,/area/security/armoury) -"bfc" = (/obj/structure/table/standard,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/button/remote/blast_door{id = "surgeryobs2"; name = "Privacy Shutters"; pixel_x = -26; pixel_y = 0},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/surgery2) -"bfd" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery2) -"bfe" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/scalpel,/obj/effect/floor_decal/corner/pink{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/surgery2) +"bfc" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/FixOVein,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/scalpel,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/surgical/retractor,/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/cautery,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel,/obj/item/stack/nanopaste,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"; pixel_x = 2; pixel_y = 2},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) +"bfd" = (/obj/structure/table/standard,/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/cautery,/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/button/remote/blast_door{id = "surgeryobs2"; name = "Privacy Shutters"; pixel_x = -26; pixel_y = 0},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/surgery2) +"bfe" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw{pixel_y = 8},/obj/item/weapon/surgical/scalpel,/obj/effect/floor_decal/corner/pink{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bff" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "trade_shuttle_dock_airlock"; pixel_x = 28; pixel_y = 0; req_one_access = list(13); tag_airpump = "trade_shuttle_dock_pump"; tag_chamber_sensor = "trade_shuttle_dock_sensor"; tag_exterior_door = "trade_shuttle_dock_outer"; tag_interior_door = "trade_shuttle_dock_inner"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1) "bfg" = (/obj/structure/closet/secure_closet/medical2,/obj/effect/floor_decal/corner/pink/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bfh" = (/turf/simulated/wall,/area/medical/surgery2) @@ -3011,7 +3011,7 @@ "bfU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled,/area/medical/surgeryobs) "bfV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryobs) "bfW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "surgeryobs2"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgeryobs) -"bfX" = (/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/floor/tiled/white,/area/medical/surgery2) +"bfX" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/surgical/retractor,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bfY" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bfZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bga" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/surgery2) @@ -3231,7 +3231,7 @@ "bkg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/medical/surgeryobs) "bkh" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) "bki" = (/obj/machinery/status_display,/turf/simulated/wall,/area/medical/surgery2) -"bkj" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgicaldrill,/obj/item/weapon/FixOVein,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/obj/item/stack/nanopaste,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"; pixel_x = 2; pixel_y = 2},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) +"bkj" = (/obj/structure/table/standard,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"; pixel_x = 2; pixel_y = 2},/obj/item/weapon/surgical/FixOVein,/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bkk" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) "bkl" = (/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/structure/table/standard,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) "bkm" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/storage/pill_bottle/antitox,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/structure/closet/secure_closet/medical_wall{name = "Pill Cabinet"; pixel_y = -32},/obj/effect/floor_decal/corner/pink/full,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled/white,/area/medical/exam_room) @@ -3307,9 +3307,9 @@ "blE" = (/obj/machinery/camera/network/medbay{c_tag = "MED - Surgery Observation"; dir = 4},/turf/simulated/floor/tiled,/area/medical/surgeryobs) "blF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/surgeryobs) "blG" = (/obj/effect/floor_decal/corner/paleblue{dir = 2},/turf/simulated/floor/tiled,/area/medical/surgeryobs) -"blH" = (/obj/structure/table/standard,/obj/item/weapon/hemostat,/obj/item/weapon/cautery,/obj/machinery/button/remote/blast_door{id = "surgeryobs"; name = "Privacy Shutters"; pixel_x = -26; pixel_y = 0},/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/surgery) -"blI" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/retractor,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery) -"blJ" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/scalpel,/obj/effect/floor_decal/corner/pink{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/surgery) +"blH" = (/obj/structure/table/standard,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel,/turf/simulated/floor/tiled/white,/area/medical/surgery2) +"blI" = (/obj/structure/table/standard,/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/cautery,/obj/machinery/button/remote/blast_door{id = "surgeryobs"; name = "Privacy Shutters"; pixel_x = -26; pixel_y = 0},/obj/effect/floor_decal/corner/pink/full{dir = 8},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/surgery) +"blJ" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw{pixel_y = 8},/obj/item/weapon/surgical/scalpel,/obj/effect/floor_decal/corner/pink{dir = 5},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/medical/surgery) "blK" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "trade_shuttle_dock_airlock"; name = "exterior access button"; pixel_x = 28; pixel_y = -6; req_access = list(13)},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "trade_shuttle_dock_outer"; locked = 1; name = "Dock One External Access"; req_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1) "blL" = (/obj/structure/closet/secure_closet/medical2,/obj/effect/floor_decal/corner/pink/full{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/surgery) "blM" = (/turf/simulated/wall,/area/medical/surgery) @@ -3378,7 +3378,7 @@ "bmX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/bed/chair{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/surgeryobs) "bmY" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled,/area/medical/surgeryobs) "bmZ" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/medical/surgeryobs) -"bna" = (/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/turf/simulated/floor/tiled/white,/area/medical/surgery) +"bna" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/surgical/retractor,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/medical/surgery) "bnb" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/medical/surgery) "bnc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/surgery) "bnd" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/surgery) @@ -4085,7 +4085,7 @@ "bAC" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop{pixel_x = 3; pixel_y = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAD" = (/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAE" = (/obj/effect/floor_decal/corner/paleblue{dir = 2},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) -"bAF" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/accessory/stethoscope,/obj/item/clothing/glasses/hud/health,/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_x = 32; pixel_y = -2},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) +"bAF" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/medical,/obj/item/clothing/accessory/stethoscope,/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_x = 32; pixel_y = -2},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/corner/paleblue/full{dir = 4},/obj/item/clothing/glasses/sunglasses/medhud,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bAG" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/morgue) "bAH" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/medical/morgue) "bAI" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/medical/morgue) @@ -4493,7 +4493,7 @@ "bIu" = (/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bIv" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bIw" = (/obj/structure/bed/chair/office/light{dir = 1},/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/tiled/white,/area/assembly/robotics) -"bIx" = (/obj/structure/table/steel,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/machinery/light{dir = 1},/obj/item/weapon/cautery,/turf/simulated/floor/tiled,/area/medical/morgue) +"bIx" = (/obj/structure/table/standard,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"; pixel_x = 2; pixel_y = 2},/obj/item/weapon/surgical/FixOVein,/turf/simulated/floor/tiled/white,/area/medical/surgery) "bIy" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bIz" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/pink{dir = 5},/obj/effect/landmark/start{name = "Roboticist"},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bIA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/assembly/robotics) @@ -5123,7 +5123,7 @@ "bUA" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/bluegrid,/area/assembly/chargebay) "bUB" = (/turf/simulated/floor/tiled,/area/assembly/chargebay) "bUC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/assembly/chargebay) -"bUD" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw,/obj/item/weapon/scalpel{pixel_y = 12},/obj/item/weapon/hemostat,/obj/item/weapon/retractor,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"bUD" = (/obj/structure/table/standard,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel,/turf/simulated/floor/tiled/white,/area/medical/surgery) "bUE" = (/turf/simulated/wall/r_wall,/area/assembly/chargebay) "bUF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central_four) "bUG" = (/turf/simulated/wall/r_wall,/area/bridge/meeting_room) @@ -5492,7 +5492,7 @@ "cbF" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/button/remote/blast_door{dir = 2; id = "Skynet_launch"; name = "Mech Bay Door Control"; pixel_x = 0; pixel_y = -26; req_access = list(29)},/turf/simulated/floor/tiled,/area/assembly/chargebay) "cbG" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "cbH" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) -"cbI" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/item/weapon/circular_saw,/obj/item/weapon/hemostat,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"cbI" = (/obj/structure/table/steel,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/surgical/scalpel,/obj/effect/floor_decal/corner/paleblue/full{dir = 8},/obj/machinery/light{dir = 1},/obj/item/weapon/surgical/cautery,/turf/simulated/floor/tiled,/area/medical/morgue) "cbJ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/bridge/meeting_room) "cbK" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 6},/turf/simulated/floor/plating,/area/maintenance/research) "cbL" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/wood,/area/bridge/meeting_room) @@ -8281,7 +8281,7 @@ "ddm" = (/obj/machinery/space_heater,/turf/simulated/floor,/area/maintenance/engineering) "ddn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/engine_eva) "ddo" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry/D4) -"ddp" = (/obj/structure/table/steel,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/random/tech_supply,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/construction) +"ddp" = (/obj/structure/closet/crate,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/weapon/tank/emergency/oxygen/double,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/research) "ddq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/maintenance/bar) "ddr" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 1; frequency = 1441; icon_state = "map_injector"; id = "tox_in"; use_power = 1; pixel_y = 1},/turf/simulated/floor/reinforced/phoron,/area/engineering/atmos) "dds" = (/turf/simulated/wall,/area/hallway/secondary/entry/D4) @@ -8942,7 +8942,7 @@ "dpX" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/engineering{c_tag = "ENG - Hallway Starboard"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dpY" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dpZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "interior access button"; pixel_x = 30; pixel_y = -25; req_one_access = list(13,11,24)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dqa" = (/obj/structure/closet/crate,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/double,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/research) +"dqa" = (/obj/structure/closet/crate,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/weapon/tank/emergency/oxygen/double,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/cargo) "dqb" = (/obj/structure/table/rack,/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/clothing/mask/gas,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/random/maintenance/research,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/research) "dqc" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/extinguisher,/obj/random/maintenance/research,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/research) "dqd" = (/obj/structure/closet/secure_closet/paramedic,/obj/item/clothing/accessory/storage/black_vest,/obj/random/medical,/obj/random/medical,/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) @@ -9360,7 +9360,7 @@ "dxZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "dya" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3) "dyb" = (/turf/simulated/floor,/area/shuttle/constructionsite/station) -"dyc" = (/obj/structure/closet/crate,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/weapon/tank/emergency_oxygen/double,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/cargo) +"dyc" = (/obj/structure/table/steel,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/random/tech_supply,/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor,/area/construction) "dyd" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 4; tag_south = 2; tag_west = 0; use_power = 0},/turf/simulated/floor/plating,/area/engineering/engine_room) "dye" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/turf/simulated/floor,/area/engineering/engine_room) "dyf" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 4; tag_south = 2; tag_west = 1; use_power = 0},/turf/simulated/floor/plating,/area/engineering/engine_room) @@ -9814,9 +9814,9 @@ "dGL" = (/obj/structure/mirror{pixel_x = 30},/obj/item/weapon/soap/nanotrasen,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/freezer,/area/security/prison) "dGM" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/mirror{pixel_x = 28},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_5) "dGN" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/white,/area/rnd/research_foyer_auxiliary) -"dGO" = (/obj/structure/table/standard,/obj/item/weapon/surgicaldrill,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"; pixel_x = 2; pixel_y = 2},/obj/item/weapon/FixOVein,/turf/simulated/floor/tiled/white,/area/medical/surgery2) +"dGO" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/scalpel{pixel_y = 12},/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/retractor,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "dGP" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/virology) -"dGQ" = (/obj/structure/table/standard,/obj/item/weapon/surgicaldrill,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"; pixel_x = 2; pixel_y = 2},/obj/item/weapon/FixOVein,/turf/simulated/floor/tiled/white,/area/medical/surgery) +"dGQ" = (/obj/structure/table/standard,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/item/weapon/screwdriver,/obj/item/weapon/crowbar,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/hemostat,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled/white,/area/assembly/robotics) "dGR" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/corner/lime{dir = 6},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "dGS" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/vacant/vacant_site2) "dGT" = (/obj/effect/decal/cleanable/cobweb2{tag = "icon-cobweb1"; icon_state = "cobweb1"},/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"; tag = "icon-spiderling"},/turf/simulated/floor,/area/maintenance/medbay_aft) @@ -10042,15 +10042,15 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdaaaaaabbdaaaaaaaaabbdaaaaaaaaaaaaaaabbdaaaaaaaaabbdaaaaaabbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaQbpjbpjbpobpobpobpobpobpobpobpobpobppbpqbpjaahaZobbebbfdGNaZoaahaahaahaahaYPbbhbacbbibbjbbkbagbblaYPbbmbbnbbobbpbbqbbrbamahyahyahyaahaahaahaahaahaZCbbsbbtbbubbvbbwbbxbbybbzbbAbbBbbCaZFaahaZdaZdaZHaZdahyahybaybbDbbEbMcbfMbdCbdCdCqbbGbbHbbGbgHccSaRtdCpbbLbbEbbMbaMahyahybbNbbObbPbbQbbRasFasEasEasEasEasSasVasUasXasWasZasZasZatbatcamraahaahaahaahaZmbdOcRsaZmaahaahdEodEBaWDamccSdameamAamhamCamBamDamadEoaZWaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaQaaQbpjbpobpocTObpjbpjbpjbpjbpjbpjbpjbpjbpjbpjaahaZobccbcdbceaZoaahaahaahaahaYPbcfbcgbchbchbchbcibfvbcjbckbclbclbcmbcnbcobamahyahyaahaahaahaahaahaahaZCbcpbcqbcraZDbcsbctbcuaZDbcvaSRaSPaZFaahaahaZdaZHaZdahyaZIbcybbEbbFbfMdCqbbGbbGbczbcAbcBbcCbcDbbGbbGbgHdCrbbLbbEbcyaZIahyaTobcEbcFatdbRUatfateatPatOatPatSamratVatXatWatYatYauaatZaubamrbcRbcRbcRbcRaZmaWFbcTaZmaTWaTWdEodEBaYbalyamWamVanaamZdEodEodEodEodEoaZWaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQaaQaaQawwbpobpObpjbpjaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnbdobdpaZFaahaahaZdaZHaZdahybdqbaJbbFbfMdCqbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbgHdCrbdsbaKbdqahyaTobdubdvaUwbkaaowaLSaMWaMnaMnaMXamraMYaNaaMZamraUGaYMaVuaZSamrbdJbdKbdLbcRbdMaYNbdObdOaSTaSSaZmaZmaZmbcSaZmaZmaZmaZmaZmaTWaahaahaZmaZWaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaQaaQaaQaZUaZTbpjaTWaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPaSUbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbeibeUbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbfMdCqbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbgHdCvbiFbejahyaZPbesbetaUwaToamramramramramramramramramramramramramramramramrbkjbevbuJbcRbdMaYNbdObdObcwbdObdObcxbdtbdtbdAaWFbdObdObdOaZmaTWaahaZmaZWbIUaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaQaahaaQaZVbpobpjaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahaahaahbdlbdlbehbeTbeUbeTbeSbdlbdlaahaahaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGbekbiFbcyahybaNaYGbetbeYaToaahaahbeZbeZbfaaFLbeZbfcbfdbfedGObfgbfhbfidfJbcRbkhbevbevbflbdMberaZmaZmaZmaZmaZmaZmbfmbfmbfmaZmbeAbezbdObdOaZmaZmaZmaZWbdOdfNaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahbpjbqQbpjaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfucxEbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahaahaahbdlbfGbeTbfHbfIbfJbeTbfKbdlaahaahaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbjlbfPbfQbbGbbGdCAbfSaZIahybbNaYGbetbmQaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMaYNaZmbgDbgDbgDbgDbgkbgkbaBbgkbgkbgkbgkbdObdObdObdObdObglbfpbdOaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaQaaQaaQaZUaZTbpjaTWaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPaSUbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbeibeUbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbfMdCqbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbgHdCvbiFbejahyaZPbesbetaUwaToamramramramramramramramramramramramramramramramrbfcbevbuJbcRbdMaYNbdObdObcwbdObdObcxbdtbdtbdAaWFbdObdObdOaZmaTWaahaZmaZWbIUaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaQaahaaQaZVbpobpjaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahaahaahbdlbdlbehbeTbeUbeTbeSbdlbdlaahaahaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGbekbiFbcyahybaNaYGbetbeYaToaahaahbeZbeZbfaaFLbeZbfdbfXbfebkjbfgbfhbfidfJbcRbkhbevbevbflbdMberaZmaZmaZmaZmaZmaZmbfmbfmbfmaZmbeAbezbdObdOaZmaZmaZmaZWbdOdfNaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahbpjbqQbpjaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfucxEbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahaahaahbdlbfGbeTbfHbfIbfJbeTbfKbdlaahaahaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbjlbfPbfQbbGbbGdCAbfSaZIahybbNaYGbetbmQaToaahaahbeZbfTbfUbfVbfWblHbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMaYNaZmbgDbgDbgDbgDbgkbgkbaBbgkbgkbgkbgkbdObdObdObdObdObglbfpbdOaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahbpjbpobpjaahaahaahaahaahaahaahaahbdPbgnbfrbgobdPbgpbgqbgrbdTaahaahaahaahahyahyahyahyahyahyahyahyahyahybbobbobgsbcnbgtbeebefbgubgvbgwbgxbefaahaahaahaahbdlbgybeTbeibgzbeibeTbgAbdlaahaahaahaZdaZdaZHaZdahyaZIbgBdCBbfRbbGbgCbbGbbGdCCbnZbnXbosdCDbbGbbGbgCbbGbgGbgHazDaZIaZfaTobgIbgJbgKaToaToaahbeZbgLbgMbgNbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgYbgYbgYbgYbgYbgYbgZbgZbgZbgZbgZbgkbhabhYbaLbhdbhebgkbhfbhfbhfbhfbhfbhfbglbfpaZmaahaahaahaahaahbgmbgmbhgbhhbhibhhbhjbgmbgmaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahbpjbpobpjbimbimbimbimbimbimbimbimbdPbhkbhlbhkbdPbhmbfubhnbhobhobhobhoaahaahaahahyahyahyahyahyahyahyahyaZycrkbajbhqbhrbhsbefbhtbgvbgwbhubefaahaahaahaahbdlbhvbhybhxblrbhwbeTbhvbdlaahaahaahaZdaZGaZHaZdahybdqbaUdCFbbGbbGbbGbbGdCGbnZboGboGboGbosdCFbbGbbGbbGbhBbbGbhCbhDbhEbhFbhGbetaUwbhHaToaahbeZbhIbhJbgNbhKbhLbhLbhLbhLbhMbhNbgVbhObhPbgYbhQbhRbhSdinbgYbhUbhVbhVbhWbgZbhXbhYbhYbhZbhZbhYbaObhfbibbicdlrbiebhfbdOaZWaZmaahaahaahaahaahbgmbifbigbihbiibijbikbifbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahbpjbpjbpodmIbilbjybjzbjAbjBbjCbjDbjEbilbjFbinbiobipbeEbfubinbhobiqbirbhobhobhoaahaahahyahyahyahyahyahyahybambisaZzbitbiubdebivbiwbixbgwbhubefaahaahaahaahbdlbiyblsbizbiAbiBbltbiCbdlaahaahaahaZdbiDaZHaZdahybejbdrdCFbbGbbGbbGbbGdCGboNboGbjZboGbpGdCFbbGbbGbbGbiIbiJbiJbiKbiLbiMbiNbiObiPbiQaToaahbeZbfTbiRbiSbeZbiTbiUblObiWbxjbfhbzjbhObiYbgYdlQbjabjbbjcbgYbSjbjebjfbjgbgZbjhbjibjjdmFbkubjmbjnbhfbibbjobjpbjqbhfbjrbjsaZmaahaahaahaahaahbgmbjtbjubjvbjwbjvbjubjxbgmaahaahbgmbgmbgmbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaabkObkPbkQbkQbkSbkPbkOaahaahaahaahaahaahbpjbqSbpobqUbilbkTbkUbkVbkWbkXbkYbkZblabkRbjGbjHbjIbjJbjKbjLbhobjMbjNbjObjPbhoaahaahaahahyahyahyahyahyahybaibjQbjRbjSbhrbecbjTbjUbjVbgwbhubefaahaahaahaahbjWbjWbjWbjWbjXbjWbjWbjWbjWaahaahaahaZdbjYaZHaZdahybcybaUdCFbbGbbGbbGbbGdCGbrAboGboGboGbrDdCFbbGbbGbbGbkbbbGbbGbkcaZibkdaYGbetaUwbkeaToaahbeZaEqbkgblRbeZbfhbfhbfhbfhbkibfhbALbkkbklbgYbkmbknbkobkpbgYbkqbkrbksbktbgZblAbkvbkwdmPdmLbkzbkAbkBbkCbkDbaPbkFbhfbdObkGaZmaahaahbgmbgmbgmbgmbkHbkIbkHbkJbkHbkKbkHbgmbgmbgmbgmbkLbkMbkNbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPbmobmpbmqbmpbmobkPahyaahaahbkPbkPbkPblbbqVbpobpobilbmrbmsbjAbmtbmubmvbmwbilblcbdRbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahbjWbjWbjWbjWbopblvbopbjWbjWbjWbjWaahaahaZdaZdaZHaZdahyaZIblydCwbeqbbGblzbbGbbGdCrbrAbsEbrDbfMbbGbbGblzbbGblBdCHdCIaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblHblIblJdGQblLblMblNbhOblWbgYbgYblPblQbpabgYblSblTblUblVbgZbrKbhZbhYblXbhYbhYbaQbhfbjpbmabhfbmbbhfdnIaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgbmnbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnObnPbnQbnRbnRbnPbnSbnTbkPbkPbkPbnUbnVbkPbkPbsybkPbilbilbilbilbilbilbilbilbilbmxbfubmybdTbrebdTbrebhoblibmAbmBbmCblkbmDbmEbmFbllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahbjWbjWblwbmNblxbpHbmObmSbmRbjWbjWaahaahaahaZdaZHaZdahyaZIbmTblCbbJbbGbfPbfQbmUbbGbdCbdCbdCbbGbmUbeVbfNbbGbbGdCKbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbnabnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrcXObnsbhYbntbnubhfbnvbnwbhfbnxbhfdnJaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMaFMbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPbmobmpbmqbmpbmobkPahyaahaahbkPbkPbkPblbbqVbpobpobilbmrbmsbjAbmtbmubmvbmwbilblcbdRbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahbjWbjWbjWbjWbopblvbopbjWbjWbjWbjWaahaahaZdaZdaZHaZdahyaZIblydCwbeqbbGblzbbGbbGdCrbrAbsEbrDbfMbbGbbGblzbbGblBdCHdCIaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblIbnablJbIxblLblMblNbhOblWbgYbgYblPblQbpabgYblSblTblUblVbgZbrKbhZbhYblXbhYbhYbaQbhfbjpbmabhfbmbbhfdnIaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgbmnbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnObnPbnQbnRbnRbnPbnSbnTbkPbkPbkPbnUbnVbkPbkPbsybkPbilbilbilbilbilbilbilbilbilbmxbfubmybdTbrebdTbrebhoblibmAbmBbmCblkbmDbmEbmFbllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahbjWbjWblwbmNblxbpHbmObmSbmRbjWbjWaahaahaahaZdaZHaZdahyaZIbmTblCbbJbbGbfPbfQbmUbbGbdCbdCbdCbbGbmUbeVbfNbbGbbGdCKbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbUDbnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrcXObnsbhYbntbnubhfbnvbnwbhfbnxbhfdnJaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMaFMbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQbmqbpbbpcbpcbmqbpdbpebpfbpgbNxbLLbRubOUbUHbRvbUMbUIbWrbWqbWsbprbpsbprbptbnWbpvbpwbpubdTbpybnYbrfblkblkaybbobbocblkbodboeboebofbogbohboibllahyahybamaZzbcnbojbeebmKbmKbokbolbefaahaahaahbjWbjWbpJbombpLbmPbvMbmPborboqbrxbjWbjWaahaahaZdaZHaZdahybdqbiHdCBbfRbbGbbGbfPbfQbbGbbGbbGbbGbbGbembeWbbGbbGbbGbekbdxbdqahybaNbbObotbouaToaahaahbeZbgLbovbgNbowboxboybozboAboBboCbgVbhOboDdnKbgYboFbsDboFbgYboHboIbTzboKbgZbgkboLboMbtWboLboMboOboOboOboOboOboOboOboOaZWaZmaahbgmboPboQboRbkHboSbmfanuboUboVboWbmmbmgbkHbmibmmboXboYboSboZbuPbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpxbkQbnPbqJbpcbpcbqKbqLbqMbqNbqObqPbWubXYbWwbXZbqTbYbbYabqWbqXbYcbqYbqZbrabrbbrcbrdbgqbinbMKbpzbpzbpzbpAblkblkbpBblkblkbpCbpDbpEbpEbpEbpFbwZbllahyahybamaZzbcnbfBbeebefbefbefbefbefaahaahaahbjWbjWbrybukbonbpIbpIbpIbonbukbrzbjWbjWaahaahaZdaZHaZdahybejbiHdCDdCLbbGbelbbGbfPbenbbGbbGbbGbeobeWbbGbelbbGdCHdCMbdxbejahybbNaYGaYHaUwbpPahyaahbeZbpQbpRbgNbpSbpTbpUbpVbpVbpWbpXbpYbpZbqabqabqbbqcbqdbqcbqebqcbqfbqgbqhbqibqjbqkbqhbqlbqmbqnboObqoaCqbqqbqrbqsbqtboOaZWaZmaahbgmbqubqvbqwbkJbqxbqybqzbgmbqAbqBbqCbqCbqDbsnbqCbqEbqFbqGboZaycbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaacAacOacAacAacAacAacAacAacAacOacAacAacAacOacAacAacAacAaaaaaaacAacAacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqIaadahybkQbmqdnLbpcbpcbmqbsubsvbswbsxbYdbszbsAbkPbkPbsybkPbkPbkPbkPbkPbkPbkPbkPbkPbdTblcbfubinbMNburbrgbpzbrhbrebribrjbrkbrlbrmbrnbrobrpbrqbrrbrsbllahyahybambrtbrubrvaZyahyahyahyahyahyahyaahaahbjWbsQbsRbukbonbpKbsSbpKbonbukbxbbsTbjWaahaahaZdaZHaZdahybcyaTsbrBdCDdCLbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGdCHdCCbrCbdBbcyahyaTobrEaYHbrFbrGahyahybeZbfTblFbrHbeZbrIbrJbvUbrLbEEblMbrNbrObrPbrQbrRbrSbrTbrSbrSbrSbrUbrVbrWbrXbrYbrZbrYbsabrYbrYbsbbscaCrbsebsfbsgbsgboOaZWaZmaahbgmboPbshboRbkHbmibsibsjbskbslbmmbmmbsmbkHbuYbmmbsobspbmiboZbsqbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10058,20 +10058,20 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbb aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaacAaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaaacAaadaadaaaaaaaaaaaaaaaaaabtHbtIbtJbtKaaaaaabtLbtMbtNbtLbtLbtObmobmpbmqbmpbmobkPahyahyahyahyahyahybtHdobbYebZebsBaahbtTdINdIMdIPdIOdIRdIQdITdISdIUbMKbuvbtXbtYbpzbtZbeEbuabubbucbudbuebufbufbufbugbuhbuiahyahybamaZzbcnbhrbamahyahyahyahyahyaahaahaahbjWbjWbVfbpMboobpIbpIbpIbqHbpNcgdbjWbjWaahaahaZdaZHaZdahyahybbMbaMbbEbsVdCDdCNbzTdCOdCzdCzdCzdCNbvodCOdCCbrCbbEbaybbDahyahybaNbdubdvbunbrGahyahybuobvCbuqbwSbusbxdbyibxfbsXbuwbuxbuybuzayjaykbuCbuDbuEbuFbuGbuHbuIbtfbHXbuKbuLbuMbuNbuObuLbuNboObwxbuQbuRbuSbuTbuUboOaZWaZmaahbgmbgmbifbuVbkHboSbuWbmmbmfbmmbmmbtCbuXbkJbCQbwubuZbvabsmbvbbgmbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaacAaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadacOaaaaadaadaaaaaaaaaaaaaaabtHbtHbvdbvebtHbvfbvgbvhawxbvjbvkbkPbkPbkQbkQbkSbkPbkPdELdELahyahyahyahybtHbtHbYedoobsBaahbtTdIWdIVdIYdIXdIZdIJbvlbvmbvnbMNbykbvpbvqbvrbMKbvsbvtbvubvvbvwbvxbvybvzbvAbvBbDKbllahyahybaiaZzbMObhrbaiahyahyahyaahaahaahaahaahaahbjWbjWbrwbpMckQbZfclHcqpbrMbjWbjWaahaahaahaZdaZHaZdahyahyahybbMaZLbaJbgEbgEbvGbvHbiEbhzbiEbvKbvLbgEbgEbiGaZJbbDahyahyahybbNaYGbRLaUwbvNahyahybvObFrbuqbvQbGZbvSbvTcqsbsXanvbvWbvXbvYbvYbvZbwabwbbwcbwdbwebwebwfbwgbQwbwibwjbwkbwlbwmbwnbwoboObwpbwqbwrbtqbwsbwtboOaZWaZmaahaahbgmbgmbgmbgmbAQbwvbwwbmfbyUbwybwzbkJbkJbGRbkJbwAbwBbwCbgmbgmaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaadaadaaaaaaaaaaaabtHbwDbwEbwFbtHbwGbwHbwIbwJbwKbwLdJadELahyahyahyahydELdELahyahyahyahyahyahybtHbYebsBbwMbwMbwMbwMbwMbwMbwMbwMbwMbwNbwObwPbdTbHDbwRbKGbwTbMNbwUbuabsCbucbwVbwWbwXbllbwYbKJbwYbllahybeebeeblmblnblobboahyahyaahaahaahaahaahaahaahbjWbjWbjWcuwcuvbZgcuHcvCbjWbjWbjWaahaahaZdaZdaZHaZdaZdahyahyahyaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIahyahyahyahyaToaZjblDaZlaToaToahybxcbKKbxebvSbLZbxgbxhbxibsXanAbxkbxlbxmbvYbvYbxnbqhbxpbxqbthbthbxrbtfbxsbxtbxubxvbxwbxxbADbvRboOboOboOboObxAboOboOboOaZWaZmaahaahaahaahaahbgmbxBbxCbkJbxDbkJbxBbxEbkJbxFbxGbkJbxHbxIbkJbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaadaadaaaaaaaaabtHbxJbxKbxLbtHdDfbxMbxNbxObxPbxQbtLaahaahaahahyahyahyahyahyahyahyahyaahaahbtHbEUbwMbwMbxRbxSbxTbxUbxVbxWbxXbwMbxYbxZbyabdTbybbycbydbyebdTbyfbuabygbyhbyhbyhbyhbyhbMHbyjbNtbyhbfzbeebylaZzbcnbymbboaZdaahaahaahaahaahaahaahaahaahbjWbjWbjWbvDbjWbjWbjWbjWbjWaahaahaZdaZdaZGaZHaZGaZdaZdahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZdaToaYGbynbiPbyoaTobypbyqbyrbysbytbyubyvbywbyxbyybyzbyAbyBbyCbvYbxobsXbyEbtbbyFbyGbyHbyIbyJbyKbyLbyMbyNbxybyPbyQbyRbySbIxbCLbyVbyWbyXbyYbySaZWaZmaahaahaahaahaahbgmbyZbzabzbbzcbzdbzebzfbzgbzhbzibkJdkQbzkbzlbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaadaadaaaaaaaaabtHbxJbxKbxLbtHdDfbxMbxNbxObxPbxQbtLaahaahaahahyahyahyahyahyahyahyahyaahaahbtHbEUbwMbwMbxRbxSbxTbxUbxVbxWbxXbwMbxYbxZbyabdTbybbycbydbyebdTbyfbuabygbyhbyhbyhbyhbyhbMHbyjbNtbyhbfzbeebylaZzbcnbymbboaZdaahaahaahaahaahaahaahaahaahbjWbjWbjWbvDbjWbjWbjWbjWbjWaahaahaZdaZdaZGaZHaZGaZdaZdahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZdaToaYGbynbiPbyoaTobypbyqbyrbysbytbyubyvbywbyxbyybyzbyAbyBbyCbvYbxobsXbyEbtbbyFbyGbyHbyIbyJbyKbyLbyMbyNbxybyPbyQbyRbyScbIbCLbyVbyWbyXbyYbySaZWaZmaahaahaahaahaahbgmbyZbzabzbbzcbzdbzebzfbzgbzhbzibkJdkQbzkbzlbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaaaaadbzmbznbznbznbznbzobtHbtHbtLbzpbzqbzrbzsawybtLaahaahaahaahahyahyahyahyahyahyaahaahaahbtHbEUbwMbzubzvbzwbzxbzybzzbzAbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzPbNUbzUbzVbzWbzXbzYbecbajbhqbhrbzZaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaahaahbjWbxabjWbjWaZdaZdaZdaZdaZdaZdbAabAbbAcbAdaZGaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdbAebAfbAgbaRaUvbAibAjbAkbvSbAlbvSbAmbxgbAnbBEbuCbApbAqbArbAsbAtbAubuCdopbAwbqmbAxbAxbAybtfbAzbwibAAbABbACbADbAEbAFbySbAGbAHbAIbyWbyWbAJbySbAKaZmaahaahaahaahaahbgmbgmdkRbAMbANbAObAPcBYbARbASbATbAUbAVbAWbAXbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaabkfbBabBabBbbBcbBdbBebBfbBgbBhbBibtLbBjbBkbBlbBmbztbtLaahaahaahaahaahahyahyahyahyaahaahaahaahbtHbEUbwMbBnbzwbBobBpbBqbBrbBsbBrbBtbBubBvbBwbBxbjJbBybjJbBzbjJbjJbBAbBBbBCbBDcMebBFbBGbBHbBIbBJbBKbBLbBMbBNbBObBPbBQbBRbBSbBTbBUbBUbBUbBUbBVbBUbBWaZdaZdaZdaZdbBXaZdaZdaZdbBYbBZbBZbBZbBZbBZbCabCbbCcbCdbCdbCdbCdbCdbCdbCdbaSbaTbaTbaTbaTbaTbaVbaWbaWbaWbaXbaYbaWbaZbaWbbSbbabbTbClbCmbbRbCnbCobCpbCqbCrbvQbCsbvSbCtbCubwabCvbCwbCxbCzbyDbCybwabCBbCCbCDbCEbCEbCFbCGbwhbxtbCHbCIbCJbCKbIcbySbySbCMbCNbCObCPbyWbAJbySbAKaZmaahaahaahaahaahaahbgmbgmbgmbJJbCRbgmbgmbgmbgmbgmbgmbCSbCTbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbCUbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbCVdiNbAZbDabCZbDcbDdbDebDfbDgbDhbDibDjbtLbtLbDkbtLbtLbDlbtLaahaahaahaahaahaahaahahyahyaahaahaahaahbtHbEUbwMbDmbDnbDobDpbDqbDrbDsbDtbwMbDubDvbDwbDxbDybDzbDAbDBbDCbDDbDEbDFbyhbDGbDHbDIbDJbObbDLbzVbzWbzXbzYbecbecbDMbDNbDOaZdbDPbDQbDRbDSbDTbDUbDVbDWbDXbDYbDZbEabEbbBUbBUbBUbEcaZdaZdaZdaZdaZGbEdbEebEfaZGbEjbEjbEjbEjbEjbEjbbUaZGbbVbbXbbWaZGbEgbEgbEgbEgbEgbbYbEkbiDbjYaZdbElaUvbetbEmaVlbEnbEobEpbEqbErbEsbEtbEubEvbEwbsXbsYbsZbExbsYbEybsZbsXbEzbtbbyFbyGbyHbEAbtfbEBbuKbECbEDbuKbySbySbySdBabEFbEGbEHbEIbyWbAJbySbAKaZmaahaahaahaahaahaahaahbgmbEJbEKbELbgmaahaahaahaahbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaabkfbBabBabENbEObEPbEQbznbERbESbETbEUbEUbEVbEWbtHbEXbtHaahaahaahaahaahaahaahaahaahaahaahaahaahbtHbEUbwMbEYbEZbFabFbbFcbFdbFebFfbwMbFgbfubFhbFibFjbFkbFlbFmbFibFnbFobFnbyhbyhbyhbyhbyhbPNbFqbRGbyhbfzbeebFsbecbcnbFtbboaZdbFubFubFubFubFubFubFvdoyaZdbFxbFybFxaZdbFzbFAbFBdoCaZdaahaahaZdaZdaZGaZHaZGbEjbEjbcabbZbcHbcGbEjbcIbFQbEjbEgbEgbEgbEgbIQbIQbcJbEgbcKbFDbEgaZdaZdaTobcLbgJaUvbFSaTobypbyqbFTbAlbFUbFVbFWbFXbEqbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGjbGkbGlbtbbGmbGnbGobGpbySdoSbGrbGsbGtbGubGvbGwbyWbAJbySaZWaZmaZmaahaahaahaahaahaahbgmbxzbGydpKbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaadbtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaaaaaabGBbznbznbznbznbtHbtHbGCbGDbDibGEbGFbGGbGHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahbtHbEUbwMbwMbwMbGIbGJbGJbGJbwMbwMbwMbGKbGLbyfbGMbGNbGObGPbGQbFibGSbGUbGTbGWbGVbIsbGXbGYbFnbRMbFnbGYahybeebeebHabcnbecbHbbHcbFubHdbyObHfbHgbFubFubFubFuawzbHibHhbHjbHjbHkbHlbHjbHmaahaahaahaZdaZdaZHbEjbEjbcMbcNbKBbcPbcObdybcQbdzbEjcSPbdDbdEbEgbdGbdFbdUbdIbeybegbEgaahaahaTobHCblDbHCaToaToahybxcbTobHEbCqbHFbHGbHHbCqbHIbHJbHKbHLbHMbHNbHMbHObHPbHPbHQbHPbHPbHRbHSbHTbHUbHVbHWdBkbySbHYbHZbIabGtbGubGvbIbbyWbAJbySbbbdpMaZmaahaahaahaahaahaahbgmbHebIedGPbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaahaahaahaahaahaahaahaahbtHbtHbtHbtHbtHdqabIhbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahbtHbEUbwMbIjbGJbGIbGJbGJbGJbGJbIkbwMbIlbfubImbInbIobIpbIqbIrbFibItbIAbIybIubIubIwbIubJXbJWbIzbJYbKcahyahybIBbecbRQbecbICbHcbIDbFObIFbIFbIGbIHbIIbIJbFuaxjaxibIMbHjbINbIObIPbHjaahaahaahaahaZdaZGbfobfkbgjbcNbJabJabJabJabJabhbbiVbiablubkEblYbEgbmzblZbvEbupbHobvJbEgaahahybJeaUvbRSaUvbpPahyahybuobFrbvSbvSbJfbJgbvSbvSbJhbJibJjbJkbxqbJlbJmbJnbthbJobJpbJqbKLbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbJFbJGbJHbJIbySbglbfpaZmaahaahaahaahaahaahbgmbgmbLDbJKbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaaadaaaaaaaaaaahaahaahaahaahaahaahaahbtHbtHbtHbtHbtHddpbIhbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahbtHbEUbwMbIjbGJbGIbGJbGJbGJbGJbIkbwMbIlbfubImbInbIobIpbIqbIrbFibItbIAbIybIubIubIwbIubJXbJWbIzbJYbKcahyahybIBbecbRQbecbICbHcbIDbFObIFbIFbIGbIHbIIbIJbFuaxjaxibIMbHjbINbIObIPbHjaahaahaahaahaZdaZGbfobfkbgjbcNbJabJabJabJabJabhbbiVbiablubkEblYbEgbmzblZbvEbupbHobvJbEgaahahybJeaUvbRSaUvbpPahyahybuobFrbvSbvSbJfbJgbvSbvSbJhbJibJjbJkbxqbJlbJmbJnbthbJobJpbJqbKLbJsbJtbJubJvbJwbJxbJybJzbJAbJBbJCbJDbJEbJFbJGbJHbJIbySbglbfpaZmaahaahaahaahaahaahbgmbgmbLDbJKbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaabtEbGAbtGaaaacAaaaaaaaahaahahyahyahyahyahyahyahyahyaahaahaahbtHbtHdqbbIibtHaahaahaahaahaahaahaahaahaahaahaahaahbtHbtHbEUbwMbJMbGJbJNbJObGJbGJbGJbIkbwMbJPbtUbJQbJRbJSbIdbJUbJVbFibGYbKabJZbIubIubIubIubKbbIubIubLzboTahyahybKdbecbcnbecbKebHcbIEbKgbKhbKibKjbKhbKhbKkbFubKlbILbKmbHjbKnbKobKpbHjaahaahaahaahaZdbKqbYpbEjbAhbKBbJabJabJabJabJabCebCgbCfbFJbChaylbEgbEgbEgbEgbCibEgbEgbEgahyahybrGbCjbynbKFbrGahyahybvObVabKHbKHbKIbWHbXTbWNbKNbKNbKObKPbKQbKRbKNbKSbKTbKUbKVbKSbKWbKWbKWbKWbKWbKXbKYbKZbLabySbySbySbySbySbySbySbySbySbySbLbbLcaZmbLdbLebLebLebLdbLdbLfbLgbLhbLibLfbLdaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadacAaaabLjaahbLkbLkbLlbkQbkQbkQbLmbLkbLkahyaahaahaahbtHbLnbIibtHaahaahaahaahaahaahaahaahaahaahaahaahbtHdqcbEUbwMbLobLpbLqbGJbLrbGJbLsbwMbwMbLtbfubImbFibLubLvbLwbLxbLybGYbLCbLBbIvbIubIubIubKbbIvbIubLEboTahyahybKdbLGbhqbecbKebHcbKubLIbKhbLJbLKbLMbZjbLNbLObLPbLQbLRbLSbLTbLUbLVbHjaahaahaahaahaZdaZdbYpbEjbCkbKBbKBbMhbEibEhbEhbFpbMibJdbFEbChbFJbFFbFHbFGbFNbFMbFPaLTbFRahyahybvNccdbgJaUvbvNahyahybMkbMlbMmbYmbOcbMkbMkbMkbMkdqdbMqbMrbMsbMtbMsbKSbMubMvbMwbMxbKWbMybMzbMAbMBbMCbMDbMEbMFbMGbOdbMIbMJbRXbMLbMMdFecbabUSbMQbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNabNcbLdaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaaaadaadbLjaahbLkbNebNfbNgbNfbNgbNfbNebLkahyahyaahaahbtHdqebIibtHbtHaahaahaahaahaahaahaahaahaahaahaahbtHcapbEUbwMbwMbwMbwMbwMbwMbwMbwMbwMbNibNjbfubyfbGMbNkbNlbNmbLxbNnbGYbPkbNsbRfbPnaxraxUbRibRfbRkbRjbLFahyahybKdbecbDMbDNbKebYvbFubNubKhbNvbNwcaqbPsbNybFubNzbNAaGUbNCbNCbNCbNCbNCbNCbNCbNCaahaahaZdbYpbEjbHpbHnbHtbHrbHvbHubHwbNNbHxbKDbHzbHybHBbHAbISbIRbIVbITbFJbIWbIXahyahyaTobIYbetbYwaToahyahybMkbNVbNWbNXbNYbSkbUXbMnbModqPbMqbMrbOebOfbOgbKSbOhbOibOjbOkbKWbOlbOmbOnbOobOpbOqbOrbOsbOtbOtbOubOvbOqbOtbOwbOtbOxbOybOzbOAbOBbOCbODbOEbOEbOFbOEbOGbOHbOIbOJbOKbLdaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaadaadaadaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaahaahaahbOLdrabONbOObOPbOQbOLbORahyahyaahaahbtHbOSbIibOTbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHcbKbOVbOWbOXbOYbOZbzHbPabPbbPcbPdbPebPfbPgbImbInbIobPhbPibLxbPjbGYbSRbSQbSSbNqbNqbNrbNpbSSbRlbSTbGYahyahybKdbecbcnbecbPobHcbFubPpbKhbPqbPrbKhbPsbPtbFubPubPvbPwbNCbPxbPybPzbPAbNCbPBbNCbNCaahaZdbYpbEjbEjbEjbEjbEjbEjbEjbPMbIZbJcbJbbHzbFJbKrbKfbKtbKsbKxbKwbFJbKybIXahyahyaToaUvbetaUvaToaToahybMkbPQbPRbPSbPTbPUbPVbPWbPXbPYbPZbQabQbbQcbQdbKSbQebQfbQgbQhbKWbQibQjbQkbMBbQlbQmbQnbQobQpbQqbQrbQsbQtbQpbQubQvdGRbMPbMQbQxbQybQzbMUbMVbWWbQBbOJanDbQDbQEbOJcAfbLdaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaczaczacOacAaadaadaadacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaahaahaahbNgbQFbQGbQHbQHbQIbNgahyahyahyaahaahbtHbQJbQKbQLbQLbQLcbNbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbyfbJRbRabRbbRcbRdbRebGYbNobNpbNpbNpbNpbNpbNpbNpbRlbSUbGYahyahybKdbecbcnbRmbRnbRobRpbRqbRrbRsbRtcvjcoFbRwbFubRxbPvbRybNCbRzbRAbRBbRBbRCbRDbREbNCaahaZdbYpaZGcOUdBSbKCbKAbKEcrQctecMXbLWbEjbEgbLXbMabLYbHsbMdbMebKvbFJbRJbMbahyahybJeaUvbetaUvbvFaToahybMkbRYbRZbSabNWbSbbScbSdbSebSfbSgbShbSibMpbvIbKSbXibQfbSlbSmbKWbKWbKWbKWbKWbSnbSobSpbSpbSpbSpbSpbSqbSrbSqbSqbSqbSqbSqbSsbStbSubSvbSwbSwbSwbLdbLdbSxbSycNtbSxbLdbLdaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbOLbSAbQGbQHbQHbSBbOLbORahyahyaahaahbtHdrdbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbGYbUDbPlbPmbNpbNpbSzcpCcpubRlbZqbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubSWbFubFubFubSXbSYbSZbNCbTabTbaAIbTdbNCbTebTfbNCaahaZdbMfbCdcNKbMgbNDbMjbNEcrQbNHbNGbNKbNJbEgbFLbNLbEgbThbTibTibTibTibEgbEgahyahybrGaUvbTqbTrbTsaToahybMkbGxbTubTvbTubTtbScbTxbTybVhbTAbTBbTCcCjbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbOabTXdrebSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbNebNfbNgbUhbNgbNfbNebLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbGYbXUbRgbYYbNpbNpcbIbRgcGibRlcGQbGYahyahybKdbecbcnaZzbUFahybUGcbJbZxbUJbUKbULcVLbLHbUGbUNbUObUPbNCbNCbIKbNCbNCbNCbNCbNCbNCaahaZdbYpaZGcrQbNMbNPbNOcQAcrQbNQcPbbNRbUZbNSccVbNTbUVbUWbUWbUWbUWbOMcaCbZyahyahybrGaUvbetaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsbMpcCMcDxbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbOLbSAbQGbQHbQHbSBbOLbORahyahyaahaahbtHdrdbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbGYdGObPlbPmbNpbNpbSzcpCcpubRlbZqbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubSWbFubFubFubSXbSYbSZbNCbTabTbaAIbTdbNCbTebTfbNCaahaZdbMfbCdcNKbMgbNDbMjbNEcrQbNHbNGbNKbNJbEgbFLbNLbEgbThbTibTibTibTibEgbEgahyahybrGaUvbTqbTrbTsaToahybMkbGxbTubTvbTubTtbScbTxbTybVhbTAbTBbTCcCjbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbOabTXdrebSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbNebNfbNgbUhbNgbNfbNebLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbGYbXUbRgbYYbNpbNpdGQbRgcGibRlcGQbGYahyahybKdbecbcnaZzbUFahybUGcbJbZxbUJbUKbULcVLbLHbUGbUNbUObUPbNCbNCbIKbNCbNCbNCbNCbNCbNCaahaZdbYpaZGcrQbNMbNPbNOcQAcrQbNQcPbbNRbUZbNSccVbNTbUVbUWbUWbUWbUWbOMcaCbZyahyahybrGaUvbetaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsbMpcCMcDxbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbLlbVPbVQbVRbVSbVTbLmbLkahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebWfbWgbWhbWibWibWjbWkbUEcNkcIgcNkdHrdHrcNkdHscNkdHtcNkbUEahyahybKdbWobcnaZzbamahybWpcascZicZjcasbULbULcZvbYfbYgdaybUPbWxbWybWzbWAbWBbWCbWDbWEbNCaahaZdbYpbPCcrQcrQcrQbPDcrQcrQbPEcsYbPFccUdBObVcbPHclZbWLbWKbTwbWKbWLbWKcdSahyahybPIaUvbetaUvaToaToahybMkbWRbWSbMkbWRbWSbMkbMkbMkbYAbWUbWVbCAbKNbKNbKNaahaahaahaahbTJbWXbWYbWZbTNbXabXbbTQbXcbXdbXebSpdrhbXgbXhdrHbXjbXkbSqbXlbXmbXnbXobXpbSubSuaahaahbSxbXqbXrbSxbSxaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsbXtbXubXvbXsahyahyahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbXwbXxbXybXzbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbXKbXLbXMbXNbUEbUybUzbUAbUBbUBbUybUzbUybUCanGbUEahyahybKdbXVbhqbXWbamahybXXdaAcaEdaCdaBdaRdaOciCbUGbWvdbZbYibYjbYjbYkbNFbLAbYnbYnbTYbNCaahaZdbYpbPJcrQcQDbPLbPKcaFcHwcGzcsYbPFbUZcaHbWPbNTbWJbYrbWJbYrbWJbYrceHbURbPObPPaTobHCblDbHCaToahyahyahyahyahyahyahyahyahyahybKNbKNbYxbYybKNbKNaahaahaahaahaahaahbTJbTJbTJbTJbTJbYzciWbSpbSpbSpbSpbSpbSqbSqbSqbSqbSqbSqbSqbYBbYCbSubSubSubSuaahaahaahbSxbYDbVObYEbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybYFbYGbYHbYIbYFahyahyahyaahaahaahaahbtHbYJbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbYKbYLbYMbYNbYObYPbXMbYQbYRbYSbYTbYUbYRbYQbXMbXMbXMbYVbUEbWlbWmbWlbWnbUBbWlbWmbWlbUCanGbUEahyahyanHbecbDMbZbbamahybZcdcqdcbcfWbZibULddydeAddCbWvbZkbZlbZmbZnbZobZpcgwbZrbZsbUQbNCaahaZdbYpbRHaZdbRIbRNcIGbROcHwcGzcsYbPFbTlbRTbRPbRWbYsbTkccWbTkbTlbTkbTjbVeaUvaUvbTmbVgbdvaUvbJeahyahyahyahyahyahyahyahyahyahyahybZzbZAbZBbZzbeubeubeubeubeubeuaahbZCbZDbZEbZFbZGbTObTPbZHbZIbZJbZKbZLaahaahaahaahaahaahbZMbZNbZObZPbZQbZMaahaahaahaahbSxbZRbZSbZTbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10083,7 +10083,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbZUceXceYceXceZcfacfbcfccfdcfecffcfgcfhcficfjcfkcflcfmcfncfobZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXcfpcfqcfrcfscftcfuceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybbocfvcfwcfxcfycfzcfAcfBcfCcfDcfEcfFcfFcfFcfFcfGcfHcfFcfFcfFcfIcfJcfDcfKcfLcfMcfNceBcfPceCcevceEceDceFcsYceGcsYcsYcvuctbcFdcFdcFdciycQGdDwcQGdDvcQGceJceIcQGahyahyaTocfYbetcfOaVlcgacgbcgbcgbcgccgbcgbcgbcgbcgbcgbcgbcgecgfcggbZMdGYcgndsdbZMbZMbZMbZMbZMbZMcgjcgkcglcgmbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMdsgbZNbZMaahaahcbccgocgpcgTcgrcgscgtcgucgvcqbcgxceTceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahbZUcgycgzcgAccwcgBccwccwcgCccwcgDbZUcgEcgFcgEcgGcgHcgIcgJbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXcgKcgLceicgMcgNcgOceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZycgPcgQcgRcgSchucgUcbOcgVcgWcgXcgYcgZchacgWcgWchbcgWchcchdchechfcgWchgcbOcgUchuchhcfScfUcfTcevcfVcfZcizchjciAcizciBciIciDcFdcFdciXcQGdDAcQGdDzcQGchncQGcQGahyahybJechwchxbbQbbRchychzchzchzchAchzaoBchBchzchzchzchzchCchDchEchFchGchHchGchGchGchGchGchGchGchGchGchIchJchJchJchJchJchJchJchJchJchJchJchJchJchKbZMaahaahcbccgocgpciscgucgucgucgucgucgucguchMchNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahbZUchOchPchQchRchSchTchUccwchVchWbZUchXchYchZchYciacibciccidcidcidcidcidcidcidaoCcidcidcidcidcidcidcidcidcidcidcidcidciecifcidcidcigcihciicijcikcilceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybamcimbcnbeccbOcbOcbOcbOclXcmYcipcnbcnacnQcitcoucoccoTcozcpQcpbciGcpScqAcbOcbOcbOcbOchocfQchpciFcrQcrQcsLcrScrSchqcrUcrQcsLcrScrSchqcQGcQGcQGcQGcQGcQGcQGahyahyahybrGciJciKciLciKciMciNciNciOciNciNaoEciPciNciNciNciOciQciRciSbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMciTciUciVdsRbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMaahaahcbccgocgpcjAdtjciZcjacjbcjccjdcjeceTcjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgbZUbZUcjhcjicjjcgBcjkcjlcjlcjmbZUbZUcjnchYcjochYcjpcjqcjrcjsbZXbZXbZXdxLdxdcjvaoGcjvdycapdbZXbZXbZXbZXbZXbZXbZXbZXbZXdyxcjucjvcjvcjwcjxcjyceiceiceiceiahyahycjzcjzcjzcjzcjzcjzcjzahyahyahyahyahyahyahybaicimbcnbeccjBahyahycbOcbOcbOcjHcjCcjDcjEcjDcjDcjFcjDcjEcjDcjCcjGcbOcbOcbOahyahyckhchrchtchsciFaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybvNaUvaUvcjLcjMcaNcgqceMceMceMapuapAapvceMceMceNcaNcaNcaNcaNbZMaahaahaahaahaahaahaahaahbZMbZMbZMciVbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccjNceTceTceTceTceTceTceVceTceTcjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgbZUbZUcjhcjicjjcgBcjkcjlcjlcjmbZUbZUcjnchYcjochYcjpcjqcjrcjsbZXbZXbZXdxLdxdcjvaoGcjvdqaapdbZXbZXbZXbZXbZXbZXbZXbZXbZXdyxcjucjvcjvcjwcjxcjyceiceiceiceiahyahycjzcjzcjzcjzcjzcjzcjzahyahyahyahyahyahyahybaicimbcnbeccjBahyahycbOcbOcbOcjHcjCcjDcjEcjDcjDcjFcjDcjEcjDcjCcjGcbOcbOcbOahyahyckhchrchtchsciFaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybvNaUvaUvcjLcjMcaNcgqceMceMceMapuapAapvceMceMceNcaNcaNcaNcaNbZMaahaahaahaahaahaahaahaahbZMbZMbZMciVbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccjNceTceTceTceTceTceTceVceTceTcjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgcjOcjPcjgbVScjQbVQcjRbVScjQbVQbZUchYapCcjTchYcjUchYcjVcjWcjXcjqaahaahamYamYamYamYapFamYamYamYamYaahaahaahaahaahaahaahbZXbZXcjudyQbZXcjZbYlbZXaahahyahyahyahycjzcjzckbckcckdckeckfcjzcjzahyahyahyahyahybbobbockgblnccHbbobboahyahyahyckEahyahyahyahyahyahyahyahyahyahyahyahyckEahyahyahyciFciFckicfQcfRciFciFaahaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyciFciFckjckjckkciFciFahyahyahyahyapGapAapGahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccbccbccbccbccbccbccbccbccbccbccbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgcjgcklckmcknckockpckqckrckscktckuckvckwckxapHckzchYckAchYckBckCckDcjqaahaahamYaqwapIdfCapQapSanCaqwamYaahaahaahaahaahaahaahaahbZXcjubZXbZXbZXbZXbZXahyahyckKckFckFckGckHckIckIckIckIckIckIcjzahyahyahyahybbobbocFUcimbcnbecbDObboclmckLckMciFclmckLckLckLckLckLckLckLckLckLckLckMciFclmckLckMciFckNckOckPcfRcJfciFciFciFciFciFclmckLckLckLckLckLckLckLckLckLckLckRciFclmckLckRciFckScfRcfRckTckUciFciFahyahOahOahOapXahOahOahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgckVckmcknckWckXckYckZclaclbchVclccldclecleclfclgclhcjUchYclicljclkcjqaahaahamYdfDaoDaoDaqlaqnaqmaucamYaahaahaahaahaahaahaahaahbZXcjubZXaahaahaahaahahyahyclYclncloclpclqclrclscltcluclvclwcjzahyahyahyahyaZycrkbecclyclzclAclAclBclCclCclCclDclCclCclCclEclFcfRcfRcfRcKgclGcKhclIclJclIclIclIclKclLclMclNclIclIclKclIclOclIclPclIclIclQclIclIclIclIclIclRclIclSclIclTclIclQclIclKclIclUclUclVclWcrJcmpahyahOaqoaieaqsaqpaqtahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -10103,7 +10103,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcAEcAFcxgcxgcvScvTcAGczzcAHcBTcAJcAKcMdbWMcuXcxqcANcxqcxqcxrcxrcxrcxrcxrcxrcxrcxrcAOcxrcxraahaahaahcxrcAPcAPcAPcxrcxrcxrcxrcwdcwdcAQcARcAScwdcwdcwhcwhcwhcwhcwhczQcwhcwhaahaahcwhczRcwhaahahyahyahyahycxzcATczecAUcAVczeczeczgcAWcAXczecAYcxzaahahyahyaahaahaahaahczicAZcziaahaahaahcBacCScBccBacqvcqvcBdcBecBfcqvcBgcBgcBgcBgcBgahyahyahycBgcWQcBgcBgcBgaZRdalcURcQIcXdcUScZwcZhdazcZMcJLcJzcsNabTdcadbYacuacuacuacuacwabTaahaahcAiaGxaHMaGxcAicBmcDydHfcAiczpcBpcAocDDcDCcBscAoaJaaHOaJacAoaKbaJIaKbcAscBtcDMdHgcAscBwcBvcAycFkcBycBzcAyaKnaKpaKncAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcEBcyCcBBcBCcxgcxgcxgcBDcvTcAGczzcBEcuXcvrcvbcuXcuXcuXcxrcANcBFcxrcxraahaahaahaahaahaahcxrcBGcBHcxraahaahaahcBIcBIcBJcBIcBIaahaahaahaahcwdcBKcxucxvcwdaahaahaahaahaahcwhczQcwhaahaahaahcwhczRcwhaahaahaahahyahycxzcxzcxzcxzcBLcBMcBNcBOcbocxzcxzcxzcxzaahaahaahaahaahaahaahczicAbczicziczicBacBacymcBRcBacBScEIcrOcrPcqycBUcBgcBVcBWdCZcBgcBgahyahycBgdgZddqdhfddqdiadhSdlCdkBdmtdlJdBQdnjdbhaZRcJLcJzdBUcsXacudBVacuacuacuacuacwabTaahaahcAiaKqaKFaHMcAicAicFlcAicAicCdcvAcAocFmcCecAocAoaHOaKGaKHcAoaLuaLtaJIcAscAscFncAscAscvHcFycAycAycCncAycAyaKpaLxaLvcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcCrcyFcxgcxgcvScvTcAGczzcCscCtcCucCvcCwcFBcCycCzcCAcxrcxraahaahaahaahaahaahaahcxrcCBcCCcxrcxraahaahcBIcBQcCEcCDcBIcCGcCGcCGaahcwdcCHcCIcCJcCKcCKcCKcCKcCKcCKcCKcCLcCKcCKaahahycwhczRcwhaahaahaahaahahycxzcLucCNcABcCOczVcCPcCQcCRcEKcCTcCUcxzaahaahaahaahaahaahaahczicCVcCWcCXcCXcCYcCZcDacDbcDccDdcDecDfcDgcDhcBScBgcDjcDkcDlcDmcBgcBgcBgcBgcHqdCsdCsdCsaZRdbAddedcNdqVdgsdCtdBRdCuaZRdDlcJzctccwzdDmdBVacudDnatTadKabTabTaahaahcAicDtcDucDvcDwcDvcFAcFzcDzcDAcwIcDBcHFcHAcDEcDFcDEcDGcDHcAocDIcDJcDKcDLcDKcHGcHKcDOcwWcHNcDPcDQcDRcDScDTcDScDUcDVcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcDWcDXcDWcDYcDZcEacEbcEccEdcEeczzcEfcCtcEgcEhcEicEjcEkcCtcxrcxraahaahaahaahaahaahaahaahcxrcElcEmcxqcxraahaahcBIcBQcCEcCDcBIcEncEocCGcCGcwdcEpcEqcErcCKcEscEtdDOddpcEwcEwcEwcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcATczecEycAVczecEzczgcEAcFHczeczecxzaahaahaahaahaahaahaahczicECcEDcEEcEDcBackacEGcEHcFXcEJcGfcELcEMcENcEOcEPcEQcERcERcEScETcEUcEUcQedDpdDocGxdDoaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRdDqcJzciHaflaflafmaflaflaflaflabTaahaahaahcAicFfdEScyycFicFjcIjcIJcAicyccydcAocIPcIKcFocFpcFhdEUcFscAocFtdEVcFqcFwcFxcILcIRcAscyscAxcKacJRcIQcFCcFDcFvdEWcFGcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcDWcDXcDWcDYcDZcEacEbcEccEdcEeczzcEfcCtcEgcEhcEicEjcEkcCtcxrcxraahaahaahaahaahaahaahaahcxrcElcEmcxqcxraahaahcBIcBQcCEcCDcBIcEncEocCGcCGcwdcEpcEqcErcCKcEscEtdDOdyccEwcEwcEwcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcATczecEycAVczecEzczgcEAcFHczeczecxzaahaahaahaahaahaahaahczicECcEDcEEcEDcBackacEGcEHcFXcEJcGfcELcEMcENcEOcEPcEQcERcERcEScETcEUcEUcQedDpdDocGxdDoaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRdDqcJzciHaflaflafmaflaflaflaflabTaahaahaahcAicFfdEScyycFicFjcIjcIJcAicyccydcAocIPcIKcFocFpcFhdEUcFscAocFtdEVcFqcFwcFxcILcIRcAscyscAxcKacJRcIQcFCcFDcFvdEWcFGcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcGjcFIcFJcFKcDZcxgcxgcvScFLcyHcFMcFNcFOcFPcFQcFRcFScFTcCtaahaahaahaahaahaahaahaahaahaahcxrcMscMocMPcxraahaahcBIcCFcCEcCDcBIcFWcGpcFYcFZcwdcGacGbcGccCKdDScGecEwcEwcEwcEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcxzcxzcxzcGqczecGgcGhcOIcGBczecGkcxzaahaahaahaahaahaahaahczicECcGlcziczicBacGmcGncGocGScEJcHccGrcrPcqycGscBgcGtcGucGvcGwcBgcBgcBgcGxcHqdDocGxcGxdDsdDrdDrdCxdCPdCJdDBdDgdDFdDCcJLcJzdDCafldDGafBaueafDdDIaflaahaahaahaahcAicAicAicAicAicAicKbcAicAiczpcuAcAocAocFmcAocAocAocAocAocAocAscAscAscAscAscKScAscAscuLcBvcAycAycAycAycAycAycAycAycAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacHHcGCcGDcGEcGEcGFcGGcGGcGGcGGcGHcGIcGIcGJcGKcGLcCtbkQbkQahyahyahybkQbkQaahaahaahcxrcIdcIecxrcxraahaahcBIcFgcGPcFFcBIcGRcHRcCGcCGcwdcGTcCIcGUcGVcGWcGWcGWcGXcGXcGXcGXcGYcCKahyahycwhczRcwhaahaahaahaahaahcxzcGZczecABcHaczVcCPcCQcHbcHSczecGkcxzaahaahaahaahaahaahaahczicAbczicziaahcBacHdcHedmEcHgcHfcHccHicHjcHkcHlcHmcHncHocHmcHpcHmaahcBgcBgcHqcBgcOTdDadDXdDJdDJdDJdEGdEDdDBdEHdEMdEIdETdERcsNaflauddFcdFdaflaflaflaahaahaahaahaahaahaahaahcHycHzcKTazzcHycHCcHDcHEazAcKWcIzcHEaahaahaahaahaahaahaahcHIcHJcLgazBcHIcHMcLhcHOazCcHQcJtcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacJwcGCcDXcHTcDXcHUcHVcxgcxgcHWcCtcHXcGKcHYcHZcIacCtbkQcIbcIccIccIccIcbkQaahcJecJecJgcNHcJgcJgaahaahaahcBIcBQcIfcGOcBIcIhcIicKkcIkcwdcIlcImcIncCKcGecIocGecEwcGecEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcIpczecIqcAVcIrcIscItcAWcIuczecGkcxzaahaahaahaahaahaahaahczicAbcziaahaahcBacIvcIwcHhcFXcIycKDcrOcrPcIAcDicHmcIBcICcIDcIEcHmaahaahcBgcHqcBgcBgcBgdDsdFfdDJdDJdFhdFgdFjdFidFldFkdFvdFpdFwaflauddFxaggaghdFyaflaahaahaahaahcHycHycHycHycHycIIcMpdHhcHyczpcuAcHEcMqcIMcINcHEcHEcHEcHEcHEcHIcHIcHIcHIcIOcMrdHicHIcuLcBvcHOcMtcIScITcHOcHOcHOcHOcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/polaris-2.dmm b/maps/polaris-2.dmm index 39e0f57dab..70b0d991f4 100644 --- a/maps/polaris-2.dmm +++ b/maps/polaris-2.dmm @@ -591,7 +591,7 @@ "als" = (/obj/machinery/door/window/southright{name = "Cargo Hold"; req_access = list(160)},/turf/simulated/shuttle/floor4{icon_state = "floor7"; name = "shuttle floor"},/area/shuttle/trade/centcom) "alt" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/cell/high,/obj/item/weapon/cell/high,/obj/item/weapon/cell/hyper,/obj/item/weapon/cell/potato,/obj/structure/window/reinforced,/turf/simulated/shuttle/floor4{icon_state = "floor7"; name = "shuttle floor"},/area/shuttle/trade/centcom) "alu" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating,/area/shuttle/trade/centcom) -"alv" = (/obj/structure/table/standard,/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/scalpel,/obj/item/weapon/surgicaldrill,/obj/item/weapon/circular_saw,/obj/item/stack/nanopaste,/obj/item/weapon/hemostat{pixel_y = 4},/obj/item/weapon/cautery{pixel_y = 4},/obj/item/weapon/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) +"alv" = (/obj/structure/table/standard,/obj/item/clothing/gloves/latex,/obj/item/clothing/mask/surgical,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/circular_saw,/obj/item/stack/nanopaste,/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) "alw" = (/obj/machinery/iv_drip,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) "alx" = (/turf/unsimulated/wall,/area/syndicate_mothership) "aly" = (/obj/machinery/door/blast/shutters{density = 0; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/trade/centcom) @@ -1053,7 +1053,7 @@ "aum" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aun" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/suit/armor/vest/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/clothing/head/helmet/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/obj/item/weapon/storage/backpack/ert/medical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "auo" = (/obj/structure/table/rack,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aup" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aup" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "auq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aur" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_centcom_dock"; name = "docking port controller"; pixel_x = 0; pixel_y = -25; req_one_access = list(103); tag_door = "specops_centcom_dock_door"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aus" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/obj/effect/floor_decal/corner/red/diagonal,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) @@ -1132,7 +1132,7 @@ "avN" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/tramadol,/obj/item/weapon/storage/pill_bottle/dylovene,/obj/item/weapon/storage/pill_bottle/dylovene,/obj/item/weapon/storage/pill_bottle/dylovene,/obj/item/weapon/storage/pill_bottle/dermaline,/obj/item/weapon/storage/pill_bottle/dermaline,/obj/item/weapon/storage/pill_bottle/dermaline,/obj/item/weapon/storage/pill_bottle/spaceacillin,/obj/item/weapon/storage/pill_bottle/dexalin_plus,/obj/item/weapon/storage/pill_bottle/dexalin_plus,/obj/item/weapon/storage/pill_bottle/dexalin_plus,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "avO" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/bodybags{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/bodybags,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "avP" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"avQ" = (/obj/structure/closet/crate/medical,/obj/item/weapon/circular_saw,/obj/item/weapon/surgicaldrill,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/bonesetter,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/hemostat{pixel_y = 4},/obj/item/weapon/cautery{pixel_y = 4},/obj/item/weapon/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"avQ" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "avR" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/shuttle/specops/centcom) "avS" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/airless,/area/shuttle/specops/centcom) "avT" = (/obj/machinery/computer/security/telescreen{desc = ""; name = "Spec. Ops. Monitor"; network = list("NETWORK_ERT"); pixel_y = 30},/obj/machinery/computer/shuttle_control/specops,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) @@ -1326,7 +1326,7 @@ "azz" = (/obj/structure/table/rack,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/obj/item/device/flashlight/flare,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "azA" = (/obj/structure/table/rack,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "azB" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"azC" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/obj/item/weapon/tank/emergency_oxygen/double,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"azC" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/obj/item/weapon/tank/emergency/oxygen/double,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "azD" = (/obj/structure/shuttle/engine/propulsion{tag = "icon-propulsion_r (WEST)"; icon_state = "propulsion_r"; dir = 8},/turf/space,/area/shuttle/administration/centcom) "azE" = (/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/turf/simulated/shuttle/wall{dir = 4; icon_state = "diagonalWall3"},/area/shuttle/administration/centcom) "azF" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"; name = "Clothing Storage"},/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/stamp/chameleon,/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) @@ -1446,9 +1446,9 @@ "aBP" = (/obj/effect/floor_decal/corner/yellow/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "aBQ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/captain,/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 8},/obj/effect/floor_decal/carpet{dir = 9},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) "aBR" = (/obj/structure/table/standard,/obj/effect/floor_decal/carpet{dir = 1},/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 5},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) -"aBS" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/standard,/obj/item/weapon/surgicaldrill,/obj/item/weapon/cautery,/obj/item/weapon/retractor,/obj/item/stack/nanopaste,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"aBS" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/standard,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/cautery,/obj/item/weapon/surgical/retractor,/obj/item/stack/nanopaste,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "aBT" = (/obj/machinery/door/window{dir = 1; name = "Surgery"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"aBU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/standard,/obj/item/weapon/circular_saw,/obj/item/weapon/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/weapon/hemostat,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"aBU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/weapon/surgical/hemostat,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "aBV" = (/obj/structure/table/standard,/obj/structure/window/reinforced{dir = 8},/obj/item/weapon/storage/firstaid/toxin{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/adv{pixel_x = 1},/obj/item/weapon/storage/firstaid/fire{pixel_x = 1},/obj/item/weapon/storage/firstaid/o2{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/firstaid/regular,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "aBW" = (/obj/structure/table/standard,/obj/item/roller,/obj/item/roller,/obj/item/roller,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "aBX" = (/obj/item/weapon/weldingtool,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -1496,7 +1496,7 @@ "aCN" = (/obj/structure/closet/secure_closet/personal,/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{icon_state = "carpet"; dir = 2},/area/centcom/command) "aCO" = (/obj/machinery/iv_drip,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "aCP" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) -"aCQ" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/structure/table/standard,/obj/item/weapon/scalpel,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/stack/medical/advanced/bruise_pack,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) +"aCQ" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/obj/structure/table/standard,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/stack/medical/advanced/bruise_pack,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/syndicate_station/start) "aCR" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/syndicate_station/start) "aCS" = (/obj/machinery/teleport/station,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "aCT" = (/obj/machinery/teleport/hub,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) @@ -2118,6 +2118,7 @@ "aOL" = (/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) "aOM" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{icon_state = "lino"},/area/tdome/tdomeobserve) "aON" = (/obj/machinery/status_display{pixel_y = -30},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/escape/centcom) +"aOO" = (/obj/item/weapon/autopsy_scanner,/obj/item/weapon/surgical/scalpel,/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aOP" = (/obj/machinery/door/airlock/medical{name = "Observation Room"},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aOQ" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aOR" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) @@ -2147,7 +2148,7 @@ "aPp" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/medical_cloning,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aPq" = (/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aPr" = (/obj/effect/floor_decal/corner/blue{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"aPs" = (/obj/item/weapon/autopsy_scanner,/obj/item/weapon/scalpel,/obj/structure/table/standard,/obj/effect/floor_decal/corner/blue/full{dir = 4},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"aPs" = (/obj/structure/table/standard,/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/medical/advanced/bruise_pack,/obj/effect/floor_decal/corner/pink{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aPt" = (/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/structure/table/standard,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) "aPu" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) "aPv" = (/obj/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "white"},/area/tdome) @@ -2193,9 +2194,9 @@ "aQj" = (/obj/structure/bed/roller,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 26},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "aQk" = (/obj/machinery/recharge_station,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) "aQl" = (/obj/machinery/recharge_station,/obj/machinery/camera/network/crescent{c_tag = "Shuttle East Storage"; dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/escape/centcom) -"aQm" = (/obj/structure/table/standard,/obj/item/weapon/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/medical/advanced/bruise_pack,/obj/effect/floor_decal/corner/pink{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"aQn" = (/obj/structure/table/standard,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/scalpel,/obj/effect/floor_decal/corner/pink{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) -"aQo" = (/obj/structure/table/standard,/obj/item/weapon/surgicaldrill,/obj/item/weapon/circular_saw,/obj/effect/floor_decal/corner/pink/full{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"aQm" = (/obj/structure/table/standard,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/scalpel,/obj/effect/floor_decal/corner/pink{dir = 5},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"aQn" = (/obj/structure/table/standard,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/circular_saw,/obj/effect/floor_decal/corner/pink/full{dir = 1},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"aQo" = (/obj/structure/table/standard,/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/stack/nanopaste,/obj/effect/floor_decal/corner/pink{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aQp" = (/obj/machinery/door/blast/regular{id = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) "aQq" = (/obj/machinery/igniter,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) "aQr" = (/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) @@ -2205,7 +2206,7 @@ "aQv" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "aQw" = (/obj/machinery/sleep_console{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) "aQx" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/escape/centcom) -"aQy" = (/obj/structure/table/standard,/obj/item/weapon/cautery{pixel_y = 4},/obj/item/weapon/hemostat{pixel_y = 4},/obj/item/stack/nanopaste,/obj/effect/floor_decal/corner/pink{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"aQy" = (/obj/structure/table/standard,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/obj/effect/floor_decal/corner/pink{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aQz" = (/obj/effect/floor_decal/corner/pink{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aQA" = (/obj/machinery/door/airlock/glass_medical{name = "Virology Laboratory"},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aQB" = (/obj/structure/table/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/red,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome) @@ -2218,7 +2219,7 @@ "aQI" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/shuttle/escape/centcom) "aQJ" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 2},/area/shuttle/escape/centcom) "aQK" = (/turf/simulated/shuttle/wall{icon_state = "swall_s"; dir = 8},/area/shuttle/escape/centcom) -"aQL" = (/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/obj/effect/floor_decal/corner/pink{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) +"aQL" = (/obj/structure/closet/crate/medical,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/surgicaldrill,/obj/item/weapon/surgical/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/surgical/hemostat{pixel_y = 4},/obj/item/weapon/surgical/cautery{pixel_y = 4},/obj/item/weapon/surgical/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) "aQM" = (/obj/machinery/computer/operating,/obj/effect/floor_decal/corner/pink{dir = 6},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aQN" = (/obj/machinery/computer/centrifuge,/obj/effect/floor_decal/corner/green{dir = 9},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) "aQO" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/green/full{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/centcom/medical) @@ -2312,7 +2313,7 @@ "aSy" = (/obj/machinery/atmospherics/unary/cryo_cell{layer = 3.3},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) "aSz" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) "aSA" = (/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/wrench,/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) -"aSB" = (/obj/structure/closet/crate/medical,/obj/item/weapon/circular_saw,/obj/item/weapon/surgicaldrill,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/bonesetter,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/hemostat{pixel_y = 4},/obj/item/weapon/cautery{pixel_y = 4},/obj/item/weapon/FixOVein{pixel_x = -6; pixel_y = 1},/obj/item/stack/nanopaste,/obj/item/weapon/tank/anesthetic,/obj/item/clothing/mask/breath/medical,/obj/item/clothing/mask/surgical,/obj/item/clothing/mask/surgical,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/area/centcom/evac) +"aSB" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw{pixel_y = 8},/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/scalpel,/obj/item/stack/medical/advanced/bruise_pack,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) "aSC" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_c"; dir = 1},/area/centcom/evac) "aSD" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/snacks/chips,/turf/unsimulated/beach/sand,/area/beach) "aSE" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/obj/item/weapon/reagent_containers/food/drinks/cans/cola,/turf/unsimulated/beach/sand,/area/beach) @@ -2682,7 +2683,7 @@ "aZE" = (/obj/structure/table/standard,/obj/item/weapon/legcuffs,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/skipjack_station/start) "aZF" = (/obj/structure/table/standard,/obj/item/weapon/deck/cards,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/skipjack_station/start) "aZG" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) -"aZH" = (/obj/structure/table/standard,/obj/item/weapon/circular_saw{pixel_y = 8},/obj/item/weapon/hemostat,/obj/item/weapon/scalpel,/obj/item/stack/medical/advanced/bruise_pack,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) +"aZH" = (/obj/structure/table/standard,/obj/item/weapon/surgical/cautery,/obj/item/weapon/surgical/retractor,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) "aZI" = (/obj/machinery/mecha_part_fabricator,/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) "aZJ" = (/obj/structure/table/steel_reinforced,/obj/machinery/cell_charger,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) "aZK" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/ripley_build_and_repair,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) @@ -2692,7 +2693,7 @@ "aZO" = (/obj/structure/table/steel_reinforced,/obj/item/toy/sword,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) "aZP" = (/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/table/steel_reinforced,/obj/item/weapon/gun/energy/laser/practice,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) "aZQ" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) -"aZR" = (/obj/structure/table/standard,/obj/item/weapon/cautery,/obj/item/weapon/retractor,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/glass/bottle/stoxin,/obj/item/weapon/reagent_containers/syringe,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) +"aZR" = (/obj/structure/table/standard,/obj/item/weapon/surgical/bonesetter,/obj/item/weapon/surgical/bonegel,/obj/item/weapon/surgical/FixOVein,/obj/item/stack/nanopaste,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) "aZS" = (/obj/machinery/recharge_station,/turf/unsimulated/floor{icon_state = "dark"},/area/wizard_station) "aZT" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/engineering_hacking,/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Subversive Intercom"; pixel_x = 32; subspace_transmission = 1; syndie = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) "aZU" = (/obj/effect/floor_decal/industrial/warning/corner,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) @@ -2702,7 +2703,6 @@ "aZY" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/skipjack_station/start) "aZZ" = (/obj/item/weapon/bedsheet/rainbow,/obj/structure/bed/padded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) "baa" = (/obj/item/weapon/bedsheet/hos,/obj/structure/bed/padded,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/skipjack_station/start) -"bab" = (/obj/structure/table/standard,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel,/obj/item/weapon/FixOVein,/obj/item/stack/nanopaste,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/skipjack_station/start) "bac" = (/obj/item/robot_parts/r_arm,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) "bad" = (/obj/item/robot_parts/l_leg,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/wizard_station) "bae" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/book/manual/robotics_cyborgs,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/wizard_station) @@ -2918,12 +2918,12 @@ aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaa aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAZaAZaAZaAEaAEaAEaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAEaAEaAZaAZaAZaAEaAEaAEaMMaOtaKYaLGaMAaLBaKYaLGaMAaLBaKYaOuaMMaAEaAEaAEaAZaAZaAZaJKaLaaJXaJXaJXaKcaLIaKUaJXaOvaJKaJKaJKaOwaJKaJKaJKaOqaJXaJXaJXaOraMDaMXaMDaOxaOyaOyaOyaOyaOzaMDaMDaMDaMDaMDaMDaMDaMDaOAaMDaMDaMDaMDaMDaMDaMDaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAZaAZaAZaCxaCyaCzaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaCzaCyaCxaAZaAZaAZaNaaCyaNaaNbaKYaKYaKYaKYaKYaKYaKYaKYaKYaKYaKYaNbaNaaCyaNaaAZaAZaAZaJKaLaaJXaKcaLIaOBaJKaJKaOCaJKaJKaODaOEaJXaNHaOFaJKaOEaJXaJXaJXaOGaMDaMXaMDaOxaOyaOyaOyaOyaOzaMDaOHaOIaOJaOIaOKaOLaOLaOLaOLaOLaOKaOLaOKaOLaOMaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAZaAZaAZaCxaCyaCzaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaCzaCyaCxaAZaAZaAZaNaaCyaNaaNbaKYaKYaONaKYaKYaKYaKYaKYaONaKYaKYaNbaNaaCyaNaaAZaAZaAZaJKaJKaOPaJKaNeaJKaJKaOQaJXaORaJKaNxaJXaJXaJXaJXaOSaJXaJXaOTaJXaOUaMDaMXaMDaOVaOyaOyaOyaOyaOWaMDaOLaOXaOXaOXaOXaOXaOLaOLaOLaOXaOXaOXaOXaOYaOZaMDaMXaMDaMDaMDaMDaMDaMDaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP -aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAZaAZaAZaAEaAEaAEaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAEaAEaAZaAZaAZaAEaAEaAEaPaaLmaPbaPcaKyaKAaPdaKyaKAaPcaPbaLmaPeaAEaAEaAEaAZaAZaAZaJKaPfaJXaPgaPhaPiaJKaPjaJXaPkaJKaPlaPmaPnaPoaPpaJKaPqaPraPraPraPsaMDaMXaMDaOVaPtaPuaPuaOyaOyaPvaOLaOLaPwaPxaPwaOLaOLaOLaOLaOLaPwaPxaPwaPyaOLaMDaMXaMXaMXaMXaMXaMXaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP +aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAZaAZaAZaAEaAEaAEaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAEaAEaAZaAZaAZaAEaAEaAEaPaaLmaPbaPcaKyaKAaPdaKyaKAaPcaPbaLmaPeaAEaAEaAEaAZaAZaAZaJKaPfaJXaPgaPhaPiaJKaPjaJXaPkaJKaPlaPmaPnaPoaPpaJKaPqaPraPraPraOOaMDaMXaMDaOVaPtaPuaPuaOyaOyaPvaOLaOLaPwaPxaPwaOLaOLaOLaOLaOLaPwaPxaPwaPyaOLaMDaMXaMXaMXaMXaMXaMXaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAZaAZaAZaAFaaPaaPaaParuaruaruaruaruaruaruaruaruaruaruaaPaaPaaPaAFaAZaAZaAZaAFaaPaaPaMMaPzaPAaMMaPBaPCaPDaPEaPFaMMaPGaPHaMMaaPaaPaAFaAGaAGaAGaJKaPfaJXaPIaPJaPKaJKaPLaJXaPMaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaMDaMDaMXaMDaMDaMDaMDaMDaMDaMDaMDaOLaOXaOXaOXaOXaOXaOLaOLaOLaOXaOXaOXaOXaPNaOLaMDaMDaMDaMDaMDaMDaMDaMXaMDaMDaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAFaAZaAZaAZaAFaruaruaruaruaaPaaPaaPaaPaaPaaPaaPaaPaaParuaruaruaruaAFaAZaAZaAZaAFaruaruaMMaPOaPOaMMaPPaPQaPDaPDaPRaMMaPOaPOaMMaruaruaAFaAZaAZaAZaJKaJKaPSaJKaJMaJMaJKaJKaOCaJKaJKaPTaPUaPVaJMaPWaPXaNtaPYaPYaPZaMDaMXaMXaMDaMDaQaaQaaQaaQaaQaaMDaQbaQbaQbaQbaQbaQbaQbaQbaQbaQbaQbaQbaQbaQcaQbaMDaQdaQdaQdaQdaQdaMDaMXaMXaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP -aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaBtaAEaAEaAEaBtaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaBtaAEaAEaAEaBtaaPaaPaMMaQeaQfaMMaQgaPDaQhaQiaQjaMMaQkaQlaMMaaPaaPaBtaAZaAZaAZaJKaQmaJXaPgaQnaQoaJKaLaaJXaJYaNtaKbaJXaJYaJMaKbaJXaJXaJXaJXaKnaMDaMXaMDaMDaMDaQpaQpaQpaQpaQpaMDaQqaQraQraQraQraQraQraQraQraQraQraQraQraQsaQqaMDaQpaQpaQpaQpaQpaMDaMDaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP -aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAWaAXaAWaAEaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAWaAWaAWaAEaaPaaPaPaaQtaQtaMMaQuaQvaPDaQwaQxaMMaQtaQtaPeaaPaaPaAEaAZaAZaAZaJKaQyaJXaJXaJXaQzaJKaLaaJXaJXaKcaLIaJXaJXaQAaJXaJXaJXaJXaJXaKnaMDaMXaMDaQBaQCaQDaQDaQDaQDaQDaQEaQraQraQraQraQraQraQraQraQraQraQraQraQraQsaQraQEaQFaQFaQFaQFaQFaQCaQGaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP -aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAEaAEaAEaAEaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAEaAEaAEaAEaaPaaPaQHaQIaQIaQJaPcaQtaQtaQtaPcaQJaQIaQIaQKaaPaaPaAEaAZaAZaAZaJKaQLaJXaJXaOTaQMaJKaQNaJXaJXaKnaQOaJXaQPaJMaKUaJXaKpaJXaJXaKnaMDaMXaMDaQBaQCaQDaQQaQDaQQaQDaQEaQraQraQraQraQraQraQraQraQraQraQraQraQraQsaQraQEaQFaQRaQFaQRaQFaQCaQGaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP +aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaBtaAEaAEaAEaBtaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaBtaAEaAEaAEaBtaaPaaPaMMaQeaQfaMMaQgaPDaQhaQiaQjaMMaQkaQlaMMaaPaaPaBtaAZaAZaAZaJKaPsaJXaPgaQmaQnaJKaLaaJXaJYaNtaKbaJXaJYaJMaKbaJXaJXaJXaJXaKnaMDaMXaMDaMDaMDaQpaQpaQpaQpaQpaMDaQqaQraQraQraQraQraQraQraQraQraQraQraQraQsaQqaMDaQpaQpaQpaQpaQpaMDaMDaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP +aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAWaAXaAWaAEaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAWaAWaAWaAEaaPaaPaPaaQtaQtaMMaQuaQvaPDaQwaQxaMMaQtaQtaPeaaPaaPaAEaAZaAZaAZaJKaQoaJXaJXaJXaQzaJKaLaaJXaJXaKcaLIaJXaJXaQAaJXaJXaJXaJXaJXaKnaMDaMXaMDaQBaQCaQDaQDaQDaQDaQDaQEaQraQraQraQraQraQraQraQraQraQraQraQraQraQsaQraQEaQFaQFaQFaQFaQFaQCaQGaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP +aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAEaAEaAEaAEaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAEaAEaAEaAEaaPaaPaQHaQIaQIaQJaPcaQtaQtaQtaPcaQJaQIaQIaQKaaPaaPaAEaAZaAZaAZaJKaQyaJXaJXaOTaQMaJKaQNaJXaJXaKnaQOaJXaQPaJMaKUaJXaKpaJXaJXaKnaMDaMXaMDaQBaQCaQDaQQaQDaQQaQDaQEaQraQraQraQraQraQraQraQraQraQraQraQraQraQsaQraQEaQFaQRaQFaQRaQFaQCaQGaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaQHaQIaQIaQIaQKaaPaaPaaPaaPaaPaaPaAFaAZaAZaAZaJKaPfaJXaJXaJXaQSaJKaQTaJXaJXaQUaQVaJXaQWaJMaQXaQYaQZaRaaRaaRbaMDaMXaMDaQBaQCaQDaQDaRcaQDaQDaQEaQraQraQraQraQraQraQraRdaQraQraQraQraQraQsaQraQEaQFaQFaReaQFaQFaQCaQGaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAZaAZaAZaJKaRfaRgaRhaRiaRjaJKaRkaRlaRmaRnaRoaLIaOBaJKaJKaJKaJKaJKaJKaJKaMDaMXaMDaQBaQCaQDaQDaQDaQDaQDaQEaQraQraQraQraQraQraRpaRqaRpaQraQraQraQraQsaQraQEaQFaQFaQFaQFaQFaQCaQGaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAZaAZaAZaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaaPaaPaaPaaPaaPaaPaMDaMXaMDaQBaQCaQDaQQaQDaQQaQDaQEaQraQraQraQraQraQraRraRsaRtaQraQraQraQraQsaQraQEaQFaQRaQFaQRaQFaQCaQGaMDaMXaMDaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP @@ -2941,7 +2941,7 @@ aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaa aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaSgaSgaSgaSgaSgaSgaSgaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAZaAZaAEaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRaRZaSaaSaaSaaSaaShaSfaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRZaaR aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaSgaSgaSgaSgaSgaSgaSgaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaAEaAZaAZaAEaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRaRZaSaaSaaSaaSaaSaaSiaSiaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRZaaR aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaSgaSgaSgaSgaSgaSgaSgaSgaSgaaPaSjaSkaSkaSkaSkaSkaSkaSkaSkaSkaSkaSkaSkaSlaAEaAZaAZaAEaSjaSmaSmaSmaSmaSmaSmaSmaSmaSlaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRaRZaSaaSaaSaaSaaSiaSnaSoaSiaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRZaaR -aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaSpaSmaSmaSmaSmaSqaSkaSkaSkaSqaSkaSkaSkaSqaSraSgaSgaSgaSgaSgaSgaSgaSgaSgaSraSsaStaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSsaAFaAGaAGaAFaSsaSvaSwaSxaSyaSyaSzaSAaSBaSCaSlaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRaRZaSaaSaaSaaSaaSiaSDaSEaSiaSaaSaaShaSaaSFaSaaSaaSaaSaaSaaSaaRZaaR +aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaSpaSmaSmaSmaSmaSqaSkaSkaSkaSqaSkaSkaSkaSqaSraSgaSgaSgaSgaSgaSgaSgaSgaSgaSraSsaStaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSsaAFaAGaAGaAFaSsaSvaSwaSxaSyaSyaSzaSAaQLaSCaSlaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRaRZaSaaSaaSaaSaaSiaSDaSEaSiaSaaSaaShaSaaSFaSaaSaaSaaSaaSaaSaaRZaaR aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaSGaSHaStaSIaSJaSsaSKaSKaSKaSsaSLaSLaSLaSsaSraSMaSMaSMaSMaSMaSMaSMaSMaSMaSraSsaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSNaSOaSPaSPaSOaSQaSRaSRaSRaSSaSTaSUaSRaSRaSVaSsaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRaRZaSaaSaaSaaSaaSaaSiaSiaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaRZaaR aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaSWaSHaStaStaStaSsaSKaSKaSKaSsaSLaSLaSLaSsaSraSMaSMaSMaSMaSMaSMaSMaSMaSMaSraSsaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSsaSXaSYaSYaSXaSsaSZaTaaSRaSRaSRaSRaSRaSRaTbaSsaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRaRZaSaaSaaSfaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSdaSaaSaaRZaaR aaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaSWaSHaStaStaStaSsaSKaSKaSKaSsaSLaSLaSLaSsaSraSMaSMaSMaSMaSMaSMaSMaSMaSMaSraSsaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSuaSsaSYaTcaTcaSYaSsaSRaSRaSRaTdaTeaTfaSRaSRaTgaSOaSmaSmaSlaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaRaRZaSaaSaaShaSfaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSaaSfaSaaSaaRZaaR @@ -2986,9 +2986,9 @@ aaRaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaYsaYtaXTaYuaYvaXTaWxaYwaYxaXraXraXraX aaRaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaYMaYtaXTaXTaWxaYNaWxaWxaWxaYOaYPaYQaWxaWxaWxaYNaWxaYRaYSaYTaYMaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaWhaYUaWZaYVaWZaWZaWZaWZaXnaYnaWZaYWaWZaYnaXnaWZaWZaWZaWZaYXaYraYraWhaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaRaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaaPaWpaWxaYYaYZaYZaWxaZaaZbaZaaYiaZcaZdaZeaYiaZfaZgaZhaWxaZiaZjaZkaWxaWqaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaWhaZlaWZaYnaYnaWZaZmaZnaXvaZoaYnaWZaYnaZpaXvaZqaYnaWZaYnaXvaZraZsaWhaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaRaqAaqAaqAaaPaaPaaPaaPaqAaqAaaPaaPaaPaZtaWxaZuaZuaWxaWxaZaaZaaZaaYsaZcaZvaZeaYsaZhaZhaZwaWxaWxaZuaZuaWxaZxaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaWkaWZaWeaWgaYcaXnaYdaWgaYkaZyaZzaYnaZAaZBaYqaWgaYcaXnaYdaXYaWiaZCaWkaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP -aaRaqAaqAaqAaaPaaPaaPaaPaqAaqAaaPaaPaaPaaPaZtaZDaZDaZxaWxaZEaZFaZaaYMaZGaXraZGaYMaZhaZhaZHaWxaZtaZDaZDaZxaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaWoaWfaWjaZIaZJaWZaZKaZLaWoaWfaYcaXnaYdaWfaWjaZMaZNaWZaZOaZPaWoaWfaWjaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP -aaRaqAaqAaqAaaPaaPaaPaaPaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaWxaZaaZaaZaaWxaWxaXVaWxaWxaZQaZhaZRaWxaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaWhaZSaWZaWZaWZaWZaWZaZTaWkaZUaZVaZWaWkaZXaWZaWZaWZaWZaWZaWZaWhaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP -aaRaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaWxaZaaZaaZYaWxaZZaXrbaaaWxaZhaZhbabaWxaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaWoaWiaYrbacaYrbadaWZbaeaWXbafbagbahaWXaZNaWZbaibajbakbalaWeaWjaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP +aaRaqAaqAaqAaaPaaPaaPaaPaqAaqAaaPaaPaaPaaPaZtaZDaZDaZxaWxaZEaZFaZaaYMaZGaXraZGaYMaZhaZhaSBaWxaZtaZDaZDaZxaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaWoaWfaWjaZIaZJaWZaZKaZLaWoaWfaYcaXnaYdaWfaWjaZMaZNaWZaZOaZPaWoaWfaWjaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP +aaRaqAaqAaqAaaPaaPaaPaaPaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaWxaZaaZaaZaaWxaWxaXVaWxaWxaZQaZhaZHaWxaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaWhaZSaWZaWZaWZaWZaWZaZTaWkaZUaZVaZWaWkaZXaWZaWZaWZaWZaWZaWZaWhaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP +aaRaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaWxaZaaZaaZYaWxaZZaXrbaaaWxaZhaZhaZRaWxaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaWoaWiaYrbacaYrbadaWZbaeaWXbafbagbahaWXaZNaWZbaibajbakbalaWeaWjaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaRaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaWxaWxbamaZaaWxbanaXrbaoaWxbapbaqaWxaWxaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaWkaYrbarbasbataWZaWZaXnbauaWZbavaXnaWZaWZbawbaxbaybalaWkaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaRaqAaqAaqAaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaZtaWxaWxaWxaWxbazbaAbaBaWxaWxaWxaWxaZxaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaWoaWibaCaYraYraWZbaDaXvbafaWZbahaXvaYnaWZbaEbaFbaGaWeaWjaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP aaRaqAaqAaqAaqAaqAaaPaaPaaPaaPaqAaqAaaPaaPaaPaaPaaPaaPaaPaaPaZtaWxaZuaZuaZuaZuaZuaWxaZxaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaquaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaWoaWibaHbaIaWZbaJaYqaYcaXnaYdaYkaYnaWZbalbalaWeaWjaaPaaPaaPaaPaaPaiWaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaPaaP diff --git a/maps/polaris-3.dmm b/maps/polaris-3.dmm index 0dd5ec0d48..5c2ee3ba2e 100644 --- a/maps/polaris-3.dmm +++ b/maps/polaris-3.dmm @@ -17,7 +17,7 @@ "aq" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/derelict/ship) "ar" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 4},/turf/space,/area/derelict/ship) "as" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/turf/simulated/shuttle/wall{icon_state = "swall_c"; dir = 2},/area/derelict/ship) -"at" = (/obj/item/weapon/scalpel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) +"at" = (/obj/item/weapon/surgical/scalpel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "au" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 8},/area/derelict/ship) "av" = (/turf/simulated/shuttle/plating,/area/derelict/ship) "aw" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) @@ -82,7 +82,7 @@ "bD" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bE" = (/obj/structure/cable,/obj/structure/frame/computer,/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bF" = (/obj/structure/cable,/obj/structure/frame/computer,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bG" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) +"bG" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency/oxygen,/obj/item/weapon/tank/emergency/oxygen,/obj/item/weapon/tank/emergency/oxygen,/obj/item/weapon/tank/emergency/oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bH" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bI" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bJ" = (/obj/machinery/power/apc{dir = 8; name = "west bump-derelict"; operating = 0; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) diff --git a/maps/polaris-4.dmm b/maps/polaris-4.dmm index d7246141b8..f4ea399925 100644 --- a/maps/polaris-4.dmm +++ b/maps/polaris-4.dmm @@ -24,12 +24,12 @@ "ax" = (/obj/item/stack/material/steel,/turf/simulated/floor/airless,/area/wreck/main) "ay" = (/obj/item/stack/rods,/turf/simulated/floor/airless,/area/wreck/main) "az" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/stack/rods,/turf/simulated/floor/airless,/area/wreck/main) -"aB" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/scalpel/laser3,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"aA" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/surgical/scalpel/laser3,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"aB" = (/obj/item/weapon/surgical/circular_saw,/turf/simulated/floor/tiled/airless,/area/wreck/main) "aC" = (/obj/structure/table/steel_reinforced,/turf/simulated/floor/airless,/area/wreck/main) "aD" = (/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled/airless,/area/wreck/main) "aE" = (/obj/effect/decal/mecha_wreckage/phazon,/turf/simulated/floor/airless,/area/wreck/main) "aF" = (/obj/item/weapon/ore,/turf/simulated/floor/airless,/area/wreck/main) -"aG" = (/obj/item/weapon/circular_saw,/turf/simulated/floor/tiled/airless,/area/wreck/main) "aH" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/airless,/area/wreck/main) "aI" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled/white/airless,/area/wreck/main) "aJ" = (/turf/simulated/floor/tiled/white/airless,/area/wreck/main) @@ -452,8 +452,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababarararararabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababararararasarararaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababatatauauauauavavarararawawarararaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababavayaxatazaBcdaDaCauavavavawasarararawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaEaFavavavaHaGaJaIaJaKaHavavavavavaLararaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababavayaxatazaAcdaDaCauavavavawasarararawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaEaFavavavaHaBaJaIaJaKaHavavavavavaLararaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaMaNaFaOaOauaJaJaJaJaJauaPaOavavavavasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaQaFavauauauaJaJaRaJaJauauauavavavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaSavavavauauaTauaJaJaVaJaJauaTauauavavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/vorestation.dme b/vorestation.dme index 8fb514b57a..b43cefee21 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1330,6 +1330,7 @@ #include "code\modules\clothing\under\jobs\medsci.dm" #include "code\modules\clothing\under\jobs\security.dm" #include "code\modules\clothing\under\xenos\seromi.dm" +#include "code\modules\clothing\under\xenos\vox.dm" #include "code\modules\customitems\item_spawning.dm" #include "code\modules\detectivework\footprints.dm" #include "code\modules\detectivework\forensics.dm" @@ -1385,6 +1386,7 @@ #include "code\modules\events\radiation_storm.dm" #include "code\modules\events\random_antagonist.dm" #include "code\modules\events\rogue_drones.dm" +#include "code\modules\events\shipping_error.dm" #include "code\modules\events\solar_storm.dm" #include "code\modules\events\space_ninja.dm" #include "code\modules\events\spacevine.dm" @@ -1459,19 +1461,26 @@ #include "code\modules\hydroponics\trays\tray_tools.dm" #include "code\modules\hydroponics\trays\tray_update_icons.dm" #include "code\modules\integrated_electronics\_defines.dm" -#include "code\modules\integrated_electronics\arithmetic.dm" -#include "code\modules\integrated_electronics\assemblies.dm" -#include "code\modules\integrated_electronics\converters.dm" -#include "code\modules\integrated_electronics\data_transfer.dm" -#include "code\modules\integrated_electronics\input_output.dm" -#include "code\modules\integrated_electronics\logic.dm" -#include "code\modules\integrated_electronics\manipulation.dm" -#include "code\modules\integrated_electronics\memory.dm" -#include "code\modules\integrated_electronics\reagents.dm" -#include "code\modules\integrated_electronics\time.dm" -#include "code\modules\integrated_electronics\tools.dm" -#include "code\modules\integrated_electronics\trig.dm" -#include "code\modules\integrated_electronics\~defines.dm" +#include "code\modules\integrated_electronics\core\assemblies.dm" +#include "code\modules\integrated_electronics\core\helpers.dm" +#include "code\modules\integrated_electronics\core\integrated_circuit.dm" +#include "code\modules\integrated_electronics\core\pins.dm" +#include "code\modules\integrated_electronics\core\tools.dm" +#include "code\modules\integrated_electronics\passive\passive.dm" +#include "code\modules\integrated_electronics\passive\power.dm" +#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" +#include "code\modules\integrated_electronics\subtypes\converters.dm" +#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" +#include "code\modules\integrated_electronics\subtypes\input_output.dm" +#include "code\modules\integrated_electronics\subtypes\logic.dm" +#include "code\modules\integrated_electronics\subtypes\manipulation.dm" +#include "code\modules\integrated_electronics\subtypes\memory.dm" +#include "code\modules\integrated_electronics\subtypes\power.dm" +#include "code\modules\integrated_electronics\subtypes\reagents.dm" +#include "code\modules\integrated_electronics\subtypes\smart.dm" +#include "code\modules\integrated_electronics\subtypes\time.dm" +#include "code\modules\integrated_electronics\subtypes\trig.dm" +#include "code\modules\integrated_electronics\~defines\~defines.dm" #include "code\modules\library\lib_items.dm" #include "code\modules\library\lib_machines.dm" #include "code\modules\library\lib_readme.dm" @@ -1589,6 +1598,7 @@ #include "code\modules\mob\living\carbon\give.dm" #include "code\modules\mob\living\carbon\resist.dm" #include "code\modules\mob\living\carbon\shock.dm" +#include "code\modules\mob\living\carbon\taste.dm" #include "code\modules\mob\living\carbon\viruses.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" #include "code\modules\mob\living\carbon\alien\alien_attacks.dm" @@ -1651,6 +1661,7 @@ #include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm" #include "code\modules\mob\living\carbon\human\species\species_vr.dm" #include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" +#include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" #include "code\modules\mob\living\carbon\human\species\station\golem.dm" #include "code\modules\mob\living\carbon\human\species\station\monkey.dm" #include "code\modules\mob\living\carbon\human\species\station\monkey_vr.dm" @@ -1854,6 +1865,7 @@ #include "code\modules\organs\subtypes\seromi.dm" #include "code\modules\organs\subtypes\standard.dm" #include "code\modules\organs\subtypes\unbreakable.dm" +#include "code\modules\organs\subtypes\vox.dm" #include "code\modules\overmap\_defines.dm" #include "code\modules\overmap\sectors.dm" #include "code\modules\overmap\ships\ship.dm" @@ -1928,10 +1940,10 @@ #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\boxes.dm" #include "code\modules\projectiles\ammunition\bullets.dm" -#include "code\modules\projectiles\guns\alien.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\launcher.dm" #include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\guns\vox.dm" #include "code\modules\projectiles\guns\energy\laser.dm" #include "code\modules\projectiles\guns\energy\nuclear.dm" #include "code\modules\projectiles\guns\energy\pulse.dm"