diff --git a/.github/workflows/autochangelog.yml b/.github/workflows/autochangelog.yml new file mode 100644 index 0000000000..7732426718 --- /dev/null +++ b/.github/workflows/autochangelog.yml @@ -0,0 +1,39 @@ +name: Autochangelog +on: + pull_request: + types: closed + branches: + - master + +env: + BASENAME: "polaris" + +jobs: + autochangelog: + name: Autochangelog + runs-on: ubuntu-16.04 + if: github.event.pull_request.merged == true + steps: + - uses: /actions/checkout@v2 + - name: Ensure +x on CI directory + run: | + chmod -R +x ./tools/ci + - uses: actions/setup-python@v2 + with: + python-version: '3.7' + - name: Generate Changelog + run: | + pip install pyyaml + python tools/GenerateChangelog/ss13_autochangelog.py \ + html/changelogs \ + ${{ github.event.pull_request.number }} \ + "${{ github.event.pull_request.user.login }}" \ + "${{ github.event.pull_request.body }}" + python tools/GenerateChangelog/ss13_genchangelog.py \ + html/changelog.html \ + html/changelogs + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Automatic changelog generation for ${{ github.events.pull_request.number }} + branch: ${{ github.events.pull_request.base }} + commit_user_name: Autochangelog Bot diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index ccffcf4341..e7853f7059 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -9,25 +9,11 @@ #define DM_SIZE_STEAL "Size Steal" #define DM_HEAL "Heal" #define DM_EGG "Encase In Egg" -#define DM_TRANSFORM "Transform" //#define DM_ITEMWEAK "Digest (Item Friendly)" //#define DM_STRIPDIGEST "Strip Digest (Items Only)" //#define DM_DIGEST_NUMB "Digest (Numbing)" -//TF modes -#define DM_TRANSFORM_HAIR_AND_EYES "Transform (Hair and eyes)" -#define DM_TRANSFORM_MALE "Transform (Male)" -#define DM_TRANSFORM_FEMALE "Transform (Female)" -#define DM_TRANSFORM_KEEP_GENDER "Transform (Keep Gender)" -#define DM_TRANSFORM_REPLICA "Transform (Replica Of Self)" -#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR "Transform (Change Species and Taur)" -#define DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG "Transform (Change Species and Taur) (EGG)" -#define DM_TRANSFORM_REPLICA_EGG "Transform (Replica Of Self) (EGG)" -#define DM_TRANSFORM_KEEP_GENDER_EGG "Transform (Keep Gender) (EGG)" -#define DM_TRANSFORM_MALE_EGG "Transform (Male) (EGG)" -#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)" - //Addon mode flags #define DM_FLAG_NUMBING 0x1 #define DM_FLAG_STRIPPING 0x2 diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 82b1eabc60..69e949e495 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -157,6 +157,8 @@ #define MAT_GRAPHITE "graphite" #define MAT_LEATHER "leather" #define MAT_CHITIN "chitin" +#define MAT_CLOTH "cloth" +#define MAT_SYNCLOTH "syncloth" #define SHARD_SHARD "shard" #define SHARD_SHRAPNEL "shrapnel" @@ -480,4 +482,15 @@ GLOBAL_LIST_INIT(all_volume_channels, list( VOLUME_CHANNEL_ALARMS, VOLUME_CHANNEL_VORE, VOLUME_CHANNEL_DOORS, -)) \ No newline at end of file +)) + +#define APPEARANCECHANGER_CHANGED_RACE "Race" +#define APPEARANCECHANGER_CHANGED_GENDER "Gender" +#define APPEARANCECHANGER_CHANGED_GENDER_ID "Gender Identity" +#define APPEARANCECHANGER_CHANGED_SKINTONE "Skin Tone" +#define APPEARANCECHANGER_CHANGED_SKINCOLOR "Skin Color" +#define APPEARANCECHANGER_CHANGED_HAIRSTYLE "Hair Style" +#define APPEARANCECHANGER_CHANGED_HAIRCOLOR "Hair Color" +#define APPEARANCECHANGER_CHANGED_F_HAIRSTYLE "Facial Hair Style" +#define APPEARANCECHANGER_CHANGED_F_HAIRCOLOR "Facial Hair Color" +#define APPEARANCECHANGER_CHANGED_EYES "Eye Color" diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 34c68ebd08..f6ca0ea565 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -68,7 +68,7 @@ #define LANGUAGE_ALAI "Alai" #define LANGUAGE_ZADDAT "Vedahq" #define LANGUAGE_PROMETHEAN "Promethean Biolinguistics" -#define LANGUAGE_BLOB "Blob" +#define LANGUAGE_BLOB "Chemosense Transmission" #define LANGUAGE_GIBBERISH "Babel" // Language flags. diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 371f35b051..855decff39 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -215,7 +215,7 @@ var/global/list/string_slot_flags = list( GLOB.closet_appearances[T] = app // VOREStation Add - Vore Modes! - paths = typesof(/datum/digest_mode) - /datum/digest_mode/transform + paths = typesof(/datum/digest_mode) for(var/T in paths) var/datum/digest_mode/DM = new T GLOB.digest_modes[DM.id] = DM diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 0406099616..946cd9de0e 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -8,6 +8,7 @@ var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail var/global/list/wing_styles_list = list() // Stores /datum/sprite_accessory/wing indexed by type var/global/list/negative_traits = list() // Negative custom species traits, indexed by path var/global/list/neutral_traits = list() // Neutral custom species traits, indexed by path +var/global/list/everyone_traits = list() // Neutral traits available to all species, indexed by path var/global/list/positive_traits = list() // Positive custom species traits, indexed by path var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup var/global/list/all_traits = list() // All of 'em at once (same instances) @@ -457,7 +458,7 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, for(var/path in paths) var/datum/sprite_accessory/hair_accessory/instance = new path() hair_accesories_list[path] = instance - + // Custom species traits paths = typesof(/datum/trait) - /datum/trait for(var/path in paths) @@ -472,6 +473,8 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, negative_traits[path] = instance if(0) neutral_traits[path] = instance + if(!(instance.custom_only)) + everyone_traits[path] = instance if(0.1 to INFINITY) positive_traits[path] = instance diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 6a4579f191..b29a1192d9 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -354,19 +354,13 @@ facedir(direction) /obj/screen/click_catcher + name = "Darkness" icon = 'icons/mob/screen_gen.dmi' icon_state = "click_catcher" plane = CLICKCATCHER_PLANE + layer = LAYER_HUD_UNDER mouse_opacity = 2 - screen_loc = "CENTER-7,CENTER-7" - -/obj/screen/click_catcher/proc/MakeGreed() - . = list() - for(var/i = 0, i<15, i++) - for(var/j = 0, j<15, j++) - var/obj/screen/click_catcher/CC = new() - CC.screen_loc = "NORTH-[i],EAST-[j]" - . += CC + screen_loc = "SOUTHWEST to NORTHEAST" /obj/screen/click_catcher/Click(location, control, params) var/list/modifiers = params2list(params) @@ -374,7 +368,8 @@ var/mob/living/carbon/C = usr C.swap_hand() else - var/turf/T = screen_loc2turf(screen_loc, get_turf(usr)) + var/list/P = params2list(params) + var/turf/T = screen_loc2turf(P["screen-loc"], get_turf(usr)) if(T) T.Click(location, control, params) . = 1 diff --git a/code/_onclick/hud/screen_objects_vr.dm b/code/_onclick/hud/screen_objects_vr.dm index b3388f7bf7..1d8df98a38 100644 --- a/code/_onclick/hud/screen_objects_vr.dm +++ b/code/_onclick/hud/screen_objects_vr.dm @@ -11,6 +11,11 @@ var/mob/living/simple_mob/shadekin/SK = usr if(istype(SK)) to_chat(usr,"Energy: [SK.energy] ([SK.dark_gains])") + if("shadekin status") + var/turf/T = get_turf(usr) + if(T) + var/darkness = round(1 - T.get_lumcount(),0.1) + to_chat(usr,"Darkness: [darkness]") var/mob/living/carbon/human/H = usr if(istype(H) && istype(H.species, /datum/species/shadekin)) to_chat(usr,"Energy: [H.shadekin_get_energy(H)]") diff --git a/code/datums/autolathe/devices.dm b/code/datums/autolathe/devices.dm index 9c6ab5bb97..eed4839159 100644 --- a/code/datums/autolathe/devices.dm +++ b/code/datums/autolathe/devices.dm @@ -26,6 +26,12 @@ name = "mechanical trap" path =/obj/item/weapon/beartrap +/datum/category_item/autolathe/devices/barbedwire + name = "barbed wire" + path = /obj/item/weapon/material/barbedwire + hidden = 1 + resources = list(DEFAULT_WALL_MATERIAL = 10000) + /datum/category_item/autolathe/devices/electropack name = "electropack" path =/obj/item/device/radio/electropack diff --git a/code/datums/autolathe/tools.dm b/code/datums/autolathe/tools.dm index 9e9a87ea71..9b88a496fa 100644 --- a/code/datums/autolathe/tools.dm +++ b/code/datums/autolathe/tools.dm @@ -48,6 +48,11 @@ path = /obj/item/weapon/reagent_containers/spray resources = list(MAT_PLASTIC = 2000) +/datum/category_item/autolathe/devices/slowwire + name = "snare wire" + path = /obj/item/weapon/material/barbedwire/plastic + resources = list(MAT_PLASTIC = 10000) + /datum/category_item/autolathe/tools/spraynozzle name = "spray nozzle" path = /obj/item/weapon/reagent_containers/spray diff --git a/code/datums/uplink/tools.dm b/code/datums/uplink/tools.dm index 51d7ec7cd2..eee41e9699 100644 --- a/code/datums/uplink/tools.dm +++ b/code/datums/uplink/tools.dm @@ -92,6 +92,12 @@ desc = "A device which is capable of disrupting subspace communications, preventing the use of headsets, PDAs, and communicators within \ a radius of seven meters. It runs off weapon cells, which can be replaced as needed. One cell will last for approximately ten minutes." +/datum/uplink_item/item/tools/wall_elecrtifier + name = "Wall Electrifier" + item_cost = 10 + path = /obj/item/weapon/cell/spike + desc = "A modified powercell which will electrify walls and reinforced floors in a 3x3 tile range around it. Always active." + /datum/uplink_item/item/tools/emag name = "Cryptographic Sequencer" item_cost = 30 diff --git a/code/datums/wires/mines.dm b/code/datums/wires/mines.dm index 209fcc4c30..5e757ad16c 100644 --- a/code/datums/wires/mines.dm +++ b/code/datums/wires/mines.dm @@ -1,5 +1,5 @@ /datum/wires/mines - wire_count = 6 + wire_count = 7 randomize = TRUE holder_type = /obj/effect/mine proper_name = "Explosive Wires" @@ -7,6 +7,7 @@ /datum/wires/mines/New(atom/_holder) wires = list(WIRE_EXPLODE, WIRE_EXPLODE_DELAY, WIRE_DISARM, WIRE_BADDISARM) return ..() +#define WIRE_TRAP 64 /datum/wires/mines/get_status() . = ..() @@ -29,7 +30,13 @@ if(WIRE_DISARM) C.visible_message("[bicon(C)] *click!*", "[bicon(C)] *click!*") - new C.mineitemtype(get_turf(C)) + var/obj/effect/mine/MI = new C.mineitemtype(get_turf(C)) + + if(C.trap) + MI.trap = C.trap + C.trap = null + MI.trap.forceMove(MI) + spawn(0) qdel(C) @@ -37,6 +44,15 @@ C.visible_message("[bicon(C)] *BEEPBEEPBEEP*", "[bicon(C)] *BEEPBEEPBEEP*") spawn(20) C.explode() + + if(WIRE_TRAP) + C.visible_message("[bicon(C)] *click!*", "[bicon(C)] *click!*") + + if(mend) + C.visible_message("[bicon(C)] - The mine recalibrates[C.camo_net ? ", revealing \the [C.trap] inside." : "."]") + + C.alpha = 255 + ..() /datum/wires/mines/on_pulse(wire) @@ -57,6 +73,10 @@ if(WIRE_BADDISARM) C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*") + + if(WIRE_TRAP) + C.visible_message("[bicon(C)] *ping*", "[bicon(C)] *ping*") + ..() /datum/wires/mines/interactable(mob/user) diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index d68842fb2c..b65b44eb06 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -206,23 +206,9 @@ var/global/list/datum/dna/gene/dna_genes[0] // Technically custom_species is not part of the UI, but this place avoids merge problems. src.custom_species = character.custom_species - if(istype(character.species,/datum/species/custom)) - var/datum/species/custom/CS = character.species - src.species_traits = CS.traits.Copy() - src.base_species = CS.base_species - src.blood_color = CS.blood_color - - if(istype(character.species,/datum/species/xenochimera)) - var/datum/species/xenochimera/CS = character.species - //src.species_traits = CS.traits.Copy() //No traits - src.base_species = CS.base_species - src.blood_color = CS.blood_color - - if(istype(character.species,/datum/species/alraune)) - var/datum/species/alraune/CS = character.species - //src.species_traits = CS.traits.Copy() //No traits - src.base_species = CS.base_species - src.blood_color = CS.blood_color + src.base_species = character.species.base_species + src.blood_color = character.species.blood_color + src.species_traits = character.species.traits.Copy() // +1 to account for the none-of-the-above possibility SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 0edc6bb636..758f74d873 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -237,20 +237,9 @@ // Technically custom_species is not part of the UI, but this place avoids merge problems. H.custom_species = dna.custom_species - if(istype(H.species,/datum/species/custom)) - var/datum/species/custom/CS = H.species - var/datum/species/custom/new_CS = CS.produceCopy(dna.base_species,dna.species_traits,src) - new_CS.blood_color = dna.blood_color - - if(istype(H.species,/datum/species/xenochimera)) - var/datum/species/xenochimera/CS = H.species - var/datum/species/xenochimera/new_CS = CS.produceCopy(dna.base_species,dna.species_traits,src) - new_CS.blood_color = dna.blood_color - - if(istype(H.species,/datum/species/alraune)) - var/datum/species/alraune/CS = H.species - var/datum/species/alraune/new_CS = CS.produceCopy(dna.base_species,dna.species_traits,src) - new_CS.blood_color = dna.blood_color + H.species.blood_color = dna.blood_color + var/datum/species/S = H.species + S.produceCopy(dna.base_species,dna.species_traits,src) // VOREStation Edit End H.force_update_organs() //VOREStation Add - Gotta do this too diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index db27559796..64a3cc1fc7 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -1,111 +1,8 @@ /* CONTAINS: Deployable items -Barricades */ -//Barricades! -/obj/structure/barricade - name = "barricade" - desc = "This space is blocked off by a barricade." - icon = 'icons/obj/structures.dmi' - icon_state = "barricade" - anchored = 1.0 - density = 1.0 - var/health = 100 - var/maxhealth = 100 - var/datum/material/material - -/obj/structure/barricade/New(var/newloc, var/material_name) - ..(newloc) - if(!material_name) - material_name = "wood" - material = get_material_by_name("[material_name]") - if(!material) - qdel(src) - return - name = "[material.display_name] barricade" - desc = "This space is blocked off by a barricade made of [material.display_name]." - color = material.icon_colour - maxhealth = material.integrity - health = maxhealth - -/obj/structure/barricade/get_material() - return material - -/obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob) - user.setClickCooldown(user.get_attack_speed(W)) - if(istype(W, /obj/item/stack)) - var/obj/item/stack/D = W - if(D.get_material_name() != material.name) - return //hitting things with the wrong type of stack usually doesn't produce messages, and probably doesn't need to. - if(health < maxhealth) - if(D.get_amount() < 1) - to_chat(user, "You need one sheet of [material.display_name] to repair \the [src].") - return - visible_message("[user] begins to repair \the [src].") - if(do_after(user,20) && health < maxhealth) - if(D.use(1)) - health = maxhealth - visible_message("[user] repairs \the [src].") - return - return - else - switch(W.damtype) - if("fire") - health -= W.force * 1 - if("brute") - health -= W.force * 0.75 - if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) - playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) - else - playsound(src, 'sound/weapons/smash.ogg', 50, 1) - CheckHealth() - ..() - -/obj/structure/barricade/proc/CheckHealth() - if(health <= 0) - dismantle() - return - -/obj/structure/barricade/take_damage(var/damage) - health -= damage - CheckHealth() - return - -/obj/structure/barricade/attack_generic(var/mob/user, var/damage, var/attack_verb) - visible_message("[user] [attack_verb] the [src]!") - if(material == get_material_by_name("resin")) - playsound(src, 'sound/effects/attackblob.ogg', 100, 1) - else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) - playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) - else - playsound(src, 'sound/weapons/smash.ogg', 50, 1) - user.do_attack_animation(src) - health -= damage - CheckHealth() - return - -/obj/structure/barricade/proc/dismantle() - material.place_dismantled_product(get_turf(src)) - visible_message("\The [src] falls apart!") - qdel(src) - return - -/obj/structure/barricade/ex_act(severity) - switch(severity) - if(1.0) - dismantle() - if(2.0) - health -= 25 - CheckHealth() - -/obj/structure/barricade/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff. - if(istype(mover) && mover.checkpass(PASSTABLE)) - return TRUE - return FALSE - -//Actual Deployable machinery stuff /obj/machinery/deployable name = "deployable" desc = "deployable" diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index c522b4300e..c5e1f26c61 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -7,16 +7,32 @@ icon_state = "uglymine" var/triggered = 0 var/smoke_strength = 3 - var/mineitemtype = /obj/item/weapon/mine + var/obj/item/weapon/mine/mineitemtype = /obj/item/weapon/mine var/panel_open = 0 var/datum/wires/mines/wires = null register_as_dangerous_object = TRUE + var/camo_net = FALSE // Will the mine 'cloak' on deployment? + + // The trap item will be triggered in some manner when detonating. Default only checks for grenades. + var/obj/item/trap = null + /obj/effect/mine/New() icon_state = "uglyminearmed" wires = new(src) + if(ispath(trap)) + trap = new trap(src) + +/obj/effect/mine/Initialize() + ..() + + if(camo_net) + alpha = 50 + /obj/effect/mine/Destroy() + if(trap) + QDEL_NULL(trap) qdel_null(wires) return ..() @@ -25,11 +41,33 @@ triggered = 1 s.set_up(3, 1, src) s.start() - explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks. - visible_message("\The [src.name] detonates!") + + if(trap) + trigger_trap(M) + visible_message("\The [src.name] flashes as it is triggered!") + + else + explosion(loc, 0, 2, 3, 4) //land mines are dangerous, folks. + visible_message("\The [src.name] detonates!") + qdel(s) qdel(src) +/obj/effect/mine/proc/trigger_trap(var/mob/living/victim) + if(istype(trap, /obj/item/weapon/grenade)) + var/obj/item/weapon/grenade/G = trap + trap = null + G.forceMove(get_turf(src)) + if(victim.ckey) + msg_admin_attack("[key_name_admin(victim)] stepped on \a [src.name], triggering [trap]") + G.activate() + + if(istype(trap, /obj/item/device/transfer_valve)) + var/obj/item/device/transfer_valve/TV = trap + trap = null + TV.forceMove(get_turf(src)) + TV.toggle_valve() + /obj/effect/mine/bullet_act() if(prob(50)) explode() @@ -63,6 +101,9 @@ "You very carefully screw the mine's panel [panel_open ? "open" : "closed"].") playsound(src, W.usesound, 50, 1) + // Panel open, stay uncloaked, or uncloak if already cloaked. If you don't cloak on place, ignore it and just be normal alpha. + alpha = camo_net ? (panel_open ? 255 : 50) : 255 + else if((W.is_wirecutter() || istype(W, /obj/item/device/multitool)) && panel_open) interact(user) else @@ -74,6 +115,9 @@ user.set_machine(src) wires.Interact(user) +/obj/effect/mine/camo + camo_net = TRUE + /obj/effect/mine/dnascramble mineitemtype = /obj/item/weapon/mine/dnascramble @@ -193,6 +237,9 @@ spawn(0) qdel(src) +/obj/effect/mine/emp/camo + camo_net = TRUE + /obj/effect/mine/incendiary mineitemtype = /obj/item/weapon/mine/incendiary @@ -208,6 +255,26 @@ spawn(0) qdel(src) +/obj/effect/mine/gadget + mineitemtype = /obj/item/weapon/mine/gadget + +/obj/effect/mine/gadget/explode(var/mob/living/M) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() + triggered = 1 + s.set_up(3, 1, src) + s.start() + + if(trap) + trigger_trap(M) + visible_message("\The [src.name] flashes as it is triggered!") + + else + explosion(loc, 0, 0, 2, 2) + visible_message("\The [src.name] detonates!") + + qdel(s) + qdel(src) + ///////////////////////////////////////////// // The held item version of the above mines ///////////////////////////////////////////// @@ -219,6 +286,10 @@ var/countdown = 10 var/minetype = /obj/effect/mine //This MUST be an /obj/effect/mine type, or it'll runtime. + var/obj/item/trap = null + + var/list/allowed_gadgets = null + /obj/item/weapon/mine/attack_self(mob/user as mob) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times add_fingerprint(user) msg_admin_attack("[key_name_admin(user)] primed \a [src]") @@ -231,11 +302,39 @@ prime(user, TRUE) return +/obj/item/weapon/mine/attackby(obj/item/W as obj, mob/living/user as mob) + if(W.is_screwdriver() && trap) + to_chat(user, "You begin removing \the [trap].") + if(do_after(user, 10 SECONDS)) + to_chat(user, "You finish disconnecting the mine's trigger.") + trap.forceMove(get_turf(src)) + trap = null + return + + if(LAZYLEN(allowed_gadgets) && !trap) + var/allowed = FALSE + + for(var/path in allowed_gadgets) + if(istype(W, path)) + allowed = TRUE + break + + if(allowed) + user.drop_from_inventory(W) + W.forceMove(src) + trap = W + + ..() + /obj/item/weapon/mine/proc/prime(mob/user as mob, var/explode_now = FALSE) visible_message("\The [src.name] beeps as the priming sequence completes.") var/obj/effect/mine/R = new minetype(get_turf(src)) src.transfer_fingerprints_to(R) R.add_fingerprint(user) + if(trap) + R.trap = trap + trap = null + R.trap.forceMove(R) if(explode_now) R.explode(user) spawn(0) @@ -286,8 +385,14 @@ desc = "A small explosive mine with a fire symbol on the side." minetype = /obj/effect/mine/incendiary +/obj/item/weapon/mine/gadget + name = "gadget mine" + desc = "A small pressure-triggered device. If no component is added, the internal release bolts will detonate in unison when triggered." + + allowed_gadgets = list(/obj/item/weapon/grenade, /obj/item/device/transfer_valve) + // This tells AI mobs to not be dumb and step on mines willingly. /obj/item/weapon/mine/is_safe_to_step(mob/living/L) if(!L.hovering) return FALSE - return ..() \ No newline at end of file + return ..() diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 8e5fa683c9..f938f0eab1 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -509,8 +509,8 @@ return // Still no brain. // If the brain'd `defib_timer` var gets below this number, brain damage will happen at a linear rate. - // This is measures in `Life()` ticks. E.g. 10 minute defib timer = 6000 world.time units = 3000 `Life()` ticks. - var/brain_damage_timer = ((config.defib_timer MINUTES) / 2) - ((config.defib_braindamage_timer MINUTES) / 2) + // This is measures in `Life()` ticks. E.g. 10 minute defib timer = 300 `Life()` ticks. // Original math was VERY off. Life() tick occurs every ~2 seconds, not every 2 world.time ticks. + var/brain_damage_timer = ((config.defib_timer MINUTES) / 20) - ((config.defib_braindamage_timer MINUTES) / 20) if(brain.defib_timer > brain_damage_timer) return // They got revived before brain damage got a chance to set in. diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index 03d0bdd60c..60ca5cc1a2 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -88,6 +88,14 @@ if(get_dist(user, src) == 0) . += "It has a tiny camera inside. Needs to be both configured and brought in contact with monitor device to be fully functional." +/obj/item/device/camerabug/update_icon() + ..() + + if(anchored) // Standard versions are relatively obvious if not hidden in a container. Anchoring them is advised, to disguise them. + alpha = 50 + else + alpha = 255 + /obj/item/device/camerabug/attackby(obj/item/W as obj, mob/living/user as mob) if(istype(W, /obj/item/device/bug_monitor)) var/obj/item/device/bug_monitor/SM = W @@ -101,6 +109,15 @@ linkedmonitor = null else to_chat(user, "Error: The device is linked to another monitor.") + + else if(W.is_wrench() && user.a_intent != I_HURT) + if(isturf(loc)) + anchored = !anchored + + to_chat(user, "You [anchored ? "" : "un"]secure \the [src].") + + update_icon() + return else if(W.force >= 5) visible_message("\The [src] lens shatters!") diff --git a/code/game/objects/items/stacks/matter_synth.dm b/code/game/objects/items/stacks/matter_synth.dm index d92cd5f8dd..02c6518374 100644 --- a/code/game/objects/items/stacks/matter_synth.dm +++ b/code/game/objects/items/stacks/matter_synth.dm @@ -56,3 +56,6 @@ name = "Bandage Synthesizer" max_energy = 10 recharge_rate = 1 + +/datum/matter_synth/cloth + name = "Cloth Synthesizer" diff --git a/code/game/objects/items/stacks/sandbags.dm b/code/game/objects/items/stacks/sandbags.dm new file mode 100644 index 0000000000..c4e755c485 --- /dev/null +++ b/code/game/objects/items/stacks/sandbags.dm @@ -0,0 +1,158 @@ +/obj/item/stack/sandbags + name = "sandbag" + desc = "Filled sandbags. Fortunately pre-filled." + singular_name = "sandbag" + icon = 'icons/obj/sandbags.dmi' + icon_state = "sandbag" + w_class = ITEMSIZE_LARGE + force = 10.0 + throwforce = 20.0 + throw_speed = 5 + throw_range = 3 + drop_sound = 'sound/items/drop/clothing.ogg' + pickup_sound = 'sound/items/pickup/clothing.ogg' + matter = list(MAT_CLOTH = SHEET_MATERIAL_AMOUNT * 2) + max_amount = 30 + attack_verb = list("hit", "bludgeoned", "pillowed") + no_variants = TRUE + stacktype = /obj/item/stack/sandbags + + pass_color = TRUE + + var/bag_material = "cloth" + +/obj/item/stack/sandbags/cyborg + name = "sandbag synthesizer" + desc = "A device that makes filled sandbags. Don't ask how." + gender = NEUTER + matter = null + uses_charge = 1 + charge_costs = list(500) + stacktype = /obj/item/stack/sandbags + + bag_material = MAT_SYNCLOTH + +/obj/item/stack/sandbags/New(var/newloc, var/amt, var/bag_mat) + ..() + recipes = sandbag_recipes + update_icon() + + if(bag_mat) + bag_material = bag_mat + + var/datum/material/M = get_material_by_name("[bag_material]") + if(!M) + qdel(src) + return + + color = M.icon_colour + +/obj/item/stack/sandbags/update_icon() + var/amount = get_amount() + + slowdown = round(amount / 10, 0.1) + +var/global/list/datum/stack_recipe/sandbag_recipes = list( \ + new/datum/stack_recipe("barricade", /obj/structure/barricade/sandbag, 3, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)) + +/obj/item/stack/sandbags/produce_recipe(datum/stack_recipe/recipe, var/quantity, mob/user) + var/required = quantity*recipe.req_amount + var/produced = min(quantity*recipe.res_amount, recipe.max_res_amount) + + if (!can_use(required)) + if (produced>1) + to_chat(user, "You haven't got enough [src] to build \the [produced] [recipe.title]\s!") + else + to_chat(user, "You haven't got enough [src] to build \the [recipe.title]!") + return + + if (recipe.one_per_turf && (locate(recipe.result_type) in user.loc)) + to_chat(user, "There is another [recipe.title] here!") + return + + if (recipe.on_floor && !isfloor(user.loc)) + to_chat(user, "\The [recipe.title] must be constructed on the floor!") + return + + if (recipe.time) + to_chat(user, "Building [recipe.title] ...") + if (!do_after(user, recipe.time)) + return + + if (use(required)) + var/atom/O = new recipe.result_type(user.loc, bag_material) + + if(istype(O, /obj)) + var/obj/Ob = O + + if(LAZYLEN(Ob.matter)) // Law of equivalent exchange. + Ob.matter.Cut() + + else + Ob.matter = list() + + var/mattermult = istype(Ob, /obj/item) ? min(2000, 400 * Ob.w_class) : 2000 + + Ob.matter[recipe.use_material] = mattermult / produced * required + + O.set_dir(user.dir) + O.add_fingerprint(user) + + if (istype(O, /obj/item/stack)) + var/obj/item/stack/S = O + S.amount = produced + S.add_to_stacks(user) + + if (istype(O, /obj/item/weapon/storage)) //BubbleWrap - so newly formed boxes are empty + for (var/obj/item/I in O) + qdel(I) + + if ((pass_color || recipe.pass_color)) + if(!color) + if(recipe.use_material) + var/datum/material/MAT = get_material_by_name(recipe.use_material) + if(MAT.icon_colour) + O.color = MAT.icon_colour + else + return + else + O.color = color + +// Empty bags. Yes, you need to fill them. + +/obj/item/stack/emptysandbag + name = "sandbag" + desc = "Empty sandbags. You know what must be done." + singular_name = "sandbag" + icon = 'icons/obj/sandbags.dmi' + icon_state = "sandbag_e" + w_class = ITEMSIZE_LARGE + + strict_color_stacking = TRUE + max_amount = 30 + stacktype = /obj/item/stack/emptysandbag + + pass_color = TRUE + + var/bag_material = "cloth" + +/obj/item/stack/emptysandbag/New(var/newloc, var/amt, var/bag_mat) + ..(newloc, amt) + + if(bag_mat) + bag_material = bag_mat + + var/datum/material/M = get_material_by_name("[bag_material]") + if(!M) + qdel(src) + return + + color = M.icon_colour + +/obj/item/stack/emptysandbag/attack_self(var/mob/user) + while(do_after(user, 1 SECOND) && can_use(1) && istype(get_turf(src), /turf/simulated/floor/outdoors)) + use(1) + var/obj/item/stack/sandbags/SB = new (get_turf(src), 1, bag_material) + SB.color = color + if(user) + to_chat(user, "You fill a sandbag.") diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 5fa718564f..d42d6c0e56 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -163,7 +163,7 @@ if (recipe.time) to_chat(user, "Building [recipe.title] ...") - if (!do_after(user, recipe.time, exclusive = TRUE)) + if (!do_after(user, recipe.time)) return if (use(required)) diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm index 963f1d3683..4948adf425 100644 --- a/code/game/objects/items/weapons/material/material_weapons.dm +++ b/code/game/objects/items/weapons/material/material_weapons.dm @@ -99,6 +99,8 @@ /obj/item/weapon/material/proc/check_health(var/consumed) if(health<=0) + health = 0 + if(fragile) shatter(consumed) else if(!dulled && can_dull) diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 0ec9bc7af3..c583ce1eef 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -1,3 +1,9 @@ + +/* + * Beartraps. + * Buckles crossing individuals, doing moderate brute damage. + */ + /obj/item/weapon/beartrap name = "mechanical trap" throw_speed = 2 @@ -158,3 +164,238 @@ color = "#C9DCE1" origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_PHORON = 2, TECH_ARCANE = 1) + +/* + * Barbed-Wire. + * Slows individuals crossing it. Barefoot individuals will be cut. Can be electrified by placing over a cable node. + */ + +/obj/item/weapon/material/barbedwire + name = "barbed wire" + desc = "A coil of wire." + icon = 'icons/obj/trap.dmi' + icon_state = "barbedwire" + anchored = FALSE + layer = TABLE_LAYER + w_class = ITEMSIZE_LARGE + explosion_resistance = 1 + can_dull = TRUE + fragile = TRUE + force_divisor = 0.20 + thrown_force_divisor = 0.25 + + sharp = TRUE + +/obj/item/weapon/material/barbedwire/set_material(var/new_material) + ..() + + if(!QDELETED(src)) + health = round(material.integrity / 3) + name = (material.get_edge_damage() * force_divisor > 15) ? "[material.display_name] razor wire" : "[material.display_name] [initial(name)]" + +/obj/item/weapon/material/barbedwire/proc/can_use(mob/user) + return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained()) + +/obj/item/weapon/material/barbedwire/attack_hand(mob/user as mob) + if(anchored && can_use(user)) + user.visible_message( + "[user] starts to collect \the [src].", + "You begin collecting \the [src]!", + "You hear the sound of rustling [material.name]." + ) + playsound(src, 'sound/machines/click.ogg', 50, 1) + + if(do_after(user, health)) + user.visible_message( + "[user] has collected \the [src].", + "You have collected \the [src]!" + ) + anchored = 0 + update_icon() + else + ..() + +/obj/item/weapon/material/barbedwire/attack_self(mob/user as mob) + ..() + if(!anchored && can_use(user)) + user.visible_message( + "[user] starts to deploy \the [src].", + "You begin deploying \the [src]!", + "You hear the rustling of [material.name]." + ) + + if (do_after(user, 60)) + user.visible_message( + "[user] has deployed \the [src].", + "You have deployed \the [src]!", + "You hear the rustling of [material.name]." + ) + playsound(src, 'sound/items/Wirecutter.ogg',70, 1) + spawn(2) + playsound(src, 'sound/items/Wirecutter.ogg',40, 1) + user.drop_from_inventory(src) + forceMove(get_turf(src)) + anchored = 1 + update_icon() + +/obj/item/weapon/material/barbedwire/attackby(obj/item/W as obj, mob/user as mob) + if(!istype(W)) + return + + if((W.flags & NOCONDUCT) || !shock(user, 70, pick(BP_L_HAND, BP_R_HAND))) + user.setClickCooldown(user.get_attack_speed(W)) + user.do_attack_animation(src) + playsound(src, 'sound/effects/grillehit.ogg', 40, 1) + + var/inc_damage = W.force + + if(W.is_wirecutter()) + if(!shock(user, 100, pick(BP_L_HAND, BP_R_HAND))) + playsound(src, W.usesound, 100, 1) + inc_damage *= 3 + + if(W.damtype != BRUTE) + inc_damage *= 0.3 + + health -= inc_damage + + check_health() + + ..() + +/obj/item/weapon/material/barbedwire/update_icon() + ..() + + if(anchored) + icon_state = "[initial(icon_state)]-out" + else + icon_state = "[initial(icon_state)]" + +/obj/item/weapon/material/barbedwire/Crossed(atom/movable/AM as mob|obj) + if(AM.is_incorporeal()) + return + if(anchored && isliving(AM)) + var/mob/living/L = AM + if(L.m_intent == "run") + L.visible_message( + "[L] steps in \the [src].", + "You step in \the [src]!", + "You hear a sharp rustling!" + ) + attack_mob(L) + update_icon() + ..() + +/obj/item/weapon/material/barbedwire/proc/shock(mob/user as mob, prb, var/target_zone = BP_TORSO) + if(!anchored || health == 0) // anchored/destroyed grilles are never connected + return 0 + if(material.conductivity <= 0) + return 0 + if(!prob(prb)) + return 0 + if(!in_range(src, user))//To prevent TK and mech users from getting shocked + return 0 + var/turf/T = get_turf(src) + var/obj/structure/cable/C = T.get_cable_node() + if(C) + if(C.powernet) + var/datum/powernet/PN = C.powernet + + if(PN) + PN.trigger_warning() + + var/PN_damage = PN.get_electrocute_damage() * (material.conductivity / 50) + + var/drained_energy = PN_damage * 10 / CELLRATE + + PN.draw_power(drained_energy) + + if(ishuman(user)) + var/mob/living/carbon/human/H = user + + var/obj/item/organ/external/affected = H.get_organ(check_zone(target_zone)) + + H.electrocute_act(PN_damage, src, H.get_siemens_coefficient_organ(affected)) + + else + if(isliving(user)) + var/mob/living/L = user + L.electrocute_act(PN_damage, src, 0.8) + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() + if(user.stunned) + return 1 + else + return 0 + return 0 + +/obj/item/weapon/material/barbedwire/proc/attack_mob(mob/living/L) + var/target_zone + if(L.lying) + target_zone = ran_zone() + else + target_zone = pick("l_foot", "r_foot", "l_leg", "r_leg") + + //armour + var/blocked = L.run_armor_check(target_zone, "melee") + var/soaked = L.get_armor_soak(target_zone, "melee") + + if(blocked >= 100) + return + + if(soaked >= 30) + return + + if(L.buckled) //wheelchairs, office chairs, rollerbeds + return + + shock(L, 100, target_zone) + + L.add_modifier(/datum/modifier/entangled, 3 SECONDS) + + if(!L.apply_damage(force * (issilicon(L) ? 0.25 : 1), BRUTE, target_zone, blocked, soaked, src, sharp, edge)) + return + + playsound(src, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds + if(ishuman(L)) + var/mob/living/carbon/human/H = L + + if(H.species.siemens_coefficient<0.5) //Thick skin. + return + + if( H.shoes || ( H.wear_suit && (H.wear_suit.body_parts_covered & FEET) ) ) + return + + if(H.species.flags & NO_MINOR_CUT) + return + + to_chat(H, "You step directly on \the [src]!") + + var/list/check = list("l_foot", "r_foot") + while(check.len) + var/picked = pick(check) + var/obj/item/organ/external/affecting = H.get_organ(picked) + if(affecting) + if(affecting.robotic >= ORGAN_ROBOT) + return + if(affecting.take_damage(force, 0)) + H.UpdateDamageIcon() + H.updatehealth() + if(affecting.organ_can_feel_pain()) + H.Weaken(3) + return + check -= picked + + if(material.is_brittle() && prob(material.hardness)) + health = 0 + else if(!prob(material.hardness)) + health-- + check_health() + + return + +/obj/item/weapon/material/barbedwire/plastic + name = "snare wire" + default_material = MAT_PLASTIC diff --git a/code/game/objects/random/mapping.dm b/code/game/objects/random/mapping.dm index 16be9dff94..4d40578c1e 100644 --- a/code/game/objects/random/mapping.dm +++ b/code/game/objects/random/mapping.dm @@ -92,6 +92,8 @@ return pick(prob(30);/obj/effect/mine, prob(25);/obj/effect/mine/frag, prob(25);/obj/effect/mine/emp, + prob(15);/obj/effect/mine/camo, + prob(15);/obj/effect/mine/emp/camo, prob(10);/obj/effect/mine/stun, prob(10);/obj/effect/mine/incendiary,) diff --git a/code/game/objects/structures/barricades.dm b/code/game/objects/structures/barricades.dm new file mode 100644 index 0000000000..34ab6025c7 --- /dev/null +++ b/code/game/objects/structures/barricades.dm @@ -0,0 +1,185 @@ +//Barricades! +/obj/structure/barricade + name = "barricade" + desc = "This space is blocked off by a barricade." + icon = 'icons/obj/structures.dmi' + icon_state = "barricade" + anchored = 1.0 + density = 1.0 + var/health = 100 + var/maxhealth = 100 + var/datum/material/material + +/obj/structure/barricade/New(var/newloc, var/material_name) + ..(newloc) + if(!material_name) + material_name = "wood" + material = get_material_by_name("[material_name]") + if(!material) + qdel(src) + return + name = "[material.display_name] barricade" + desc = "This space is blocked off by a barricade made of [material.display_name]." + color = material.icon_colour + maxhealth = material.integrity + health = maxhealth + +/obj/structure/barricade/get_material() + return material + +/obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob) + user.setClickCooldown(user.get_attack_speed(W)) + if(istype(W, /obj/item/stack)) + var/obj/item/stack/D = W + if(D.get_material_name() != material.name) + return //hitting things with the wrong type of stack usually doesn't produce messages, and probably doesn't need to. + if(health < maxhealth) + if(D.get_amount() < 1) + to_chat(user, "You need one sheet of [material.display_name] to repair \the [src].") + return + visible_message("[user] begins to repair \the [src].") + if(do_after(user,20) && health < maxhealth) + if(D.use(1)) + health = maxhealth + visible_message("[user] repairs \the [src].") + return + return + else + switch(W.damtype) + if("fire") + health -= W.force * 1 + if("brute") + health -= W.force * 0.75 + if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) + playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) + else + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + CheckHealth() + ..() + +/obj/structure/barricade/proc/CheckHealth() + if(health <= 0) + dismantle() + + health = min(health, maxhealth) + + return + +/obj/structure/barricade/take_damage(var/damage) + health -= damage + CheckHealth() + return + +/obj/structure/barricade/attack_generic(var/mob/user, var/damage, var/attack_verb) + visible_message("[user] [attack_verb] the [src]!") + if(material == get_material_by_name("resin")) + playsound(src, 'sound/effects/attackblob.ogg', 100, 1) + else if(material == (get_material_by_name(MAT_CLOTH) || get_material_by_name(MAT_SYNCLOTH))) + playsound(src, 'sound/items/drop/clothing.ogg', 100, 1) + else if(material == (get_material_by_name(MAT_WOOD) || get_material_by_name(MAT_SIFWOOD))) + playsound(src, 'sound/effects/woodcutting.ogg', 100, 1) + else + playsound(src, 'sound/weapons/smash.ogg', 50, 1) + user.do_attack_animation(src) + health -= damage + CheckHealth() + return + +/obj/structure/barricade/proc/dismantle() + material.place_dismantled_product(get_turf(src)) + visible_message("\The [src] falls apart!") + qdel(src) + return + +/obj/structure/barricade/ex_act(severity) + switch(severity) + if(1.0) + dismantle() + if(2.0) + health -= 25 + CheckHealth() + +/obj/structure/barricade/CanPass(atom/movable/mover, turf/target)//So bullets will fly over and stuff. + if(istype(mover) && mover.checkpass(PASSTABLE)) + return TRUE + return FALSE + +/obj/structure/barricade/sandbag + name = "sandbags" + desc = "Bags. Bags of sand. It's rough and coarse and somehow stays in the bag." + icon = 'icons/obj/sandbags.dmi' + icon_state = "blank" + +/obj/structure/barricade/sandbag/New(var/newloc, var/material_name) + if(!material_name) + material_name = "cloth" + ..(newloc, material_name) + material = get_material_by_name("[material_name]") + if(!material) + qdel(src) + return + name = "[material.display_name] [initial(name)]" + desc = "This space is blocked off by a barricade made of [material.display_name]." + color = null + maxhealth = material.integrity * 2 // These things are, commonly, used to stop bullets where possible. + health = maxhealth + update_connections(1) + +/obj/structure/barricade/sandbag/Destroy() + update_connections(1, src) + ..() + +/obj/structure/barricade/sandbag/dismantle() + update_connections(1, src) + material.place_dismantled_product(get_turf(src)) + visible_message("\The [src] falls apart!") + qdel(src) + return + +/obj/structure/barricade/sandbag/update_icon() + if(!material) + return + + cut_overlays() + var/image/I + + for(var/i = 1 to 4) + I = image('icons/obj/sandbags.dmi', "sandbags[connections[i]]", dir = 1<<(i-1)) + I.color = material.icon_colour + add_overlay(I) + + return + +/obj/structure/barricade/sandbag/update_connections(propagate = 0, var/obj/structure/barricade/sandbag/ignore = null) + if(!material) + return + var/list/dirs = list() + for(var/obj/structure/barricade/sandbag/S in orange(src, 1)) + if(!S.material) + continue + if(S == ignore) + continue + if(propagate >= 1) + S.update_connections(propagate - 1, ignore) + if(can_join_with(S)) + dirs += get_dir(src, S) + + connections = dirs_to_corner_states(dirs) + + update_icon() + +/obj/structure/barricade/sandbag/proc/can_join_with(var/obj/structure/barricade/sandbag/S) + if(material == S.material) + return 1 + return 0 + +/obj/structure/barricade/sandbag/CanPass(atom/movable/mover, turf/target) + . = ..() + + if(.) + if(istype(mover, /obj/item/projectile)) + var/obj/item/projectile/P = mover + + if(P.firer && get_dist(P.firer, src) > 1) // If you're firing from adjacent turfs, you are unobstructed. + if(P.armor_penetration < (material.protectiveness + material.hardness) || prob(33)) + return FALSE diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index f93ceaf0a1..78384b0285 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -321,73 +321,344 @@ desc = "A warning sign which reads XENOBIOLOGY." icon_state = "xenobio3" +//direction signs presented by the order they appear in the dmi /obj/structure/sign/directions name = "direction sign" - desc = "A direction sign, claiming to know the way." + desc = "A direction sign, claiming to know the way to... somewhere?" icon_state = "direction" + icon = 'icons/obj/decals_directions.dmi' + //TODO: set up overlay systems, inc. interactions (e.g. vines clear w/ plantbgone or fire, snow can be brushed off or melted, and so on) +//disabled this proc, it serves no purpose except to overwrite the description that already exists. may have been intended for making your own signs? +//seems to defeat the point of having a generic directional sign that mappers could edit and use in POIs? left it here in case something breaks. +/* /obj/structure/sign/directions/New() ..() - desc = "A direction sign, pointing out which way \the [src] is." - -/obj/structure/sign/directions/science - name = "\improper Science department" - desc = "A direction sign, pointing out which way the Science department is." - icon_state = "direction_sci" + desc = "A direction sign, pointing out the way to \the [src]." +*/ +//engineering signs /obj/structure/sign/directions/engineering - name = "\improper Engineering department" - desc = "A direction sign, pointing out which way the Engineering department is." + name = "\improper Engineering Department" + desc = "A direction sign, pointing out the way to the Engineering Department." icon_state = "direction_eng" +/obj/structure/sign/directions/engineering/reactor + name = "\improper Reactor" + desc = "A direction sign, pointing out the way to the Reactor." + icon_state = "direction_core" + +/obj/structure/sign/directions/engineering/solars + name = "\improper Solar Array" + desc = "A direction sign, pointing out the way to the nearest Solar Array." + icon_state = "direction_solar" + +/obj/structure/sign/directions/engineering/atmospherics + name = "\improper Atmospherics Department" + desc = "A direction sign, pointing out the way to the Atmospherics Department." + icon_state = "direction_atmos" + +/obj/structure/sign/directions/engineering/gravgen + name = "\improper Gravity Generator" + desc = "A direction sign, pointing out the way to the Artificial Gravity Generator." + icon_state = "direction_grav" + +/obj/structure/sign/directions/engineering/engeqp + name = "\improper Engineering Equipment Storage" + desc = "A direction sign, pointing out the way to Engineering Equipment Storage." + icon_state = "direction_engeqp" + +//security signs /obj/structure/sign/directions/security - name = "\improper Security department" - desc = "A direction sign, pointing out which way the Security department is." + name = "\improper Security Department" + desc = "A direction sign, pointing out the way to the Security Department." icon_state = "direction_sec" +/obj/structure/sign/directions/security/armory + name = "\improper Armory" + desc = "A direction sign, pointing out the way to the Armory." + icon_state = "direction_armory" + +/obj/structure/sign/directions/security/brig + name = "\improper Brig" + desc = "A direction sign, pointing out the way to the Brig." + icon_state = "direction_brig" + +/obj/structure/sign/directions/security/seceqp + name = "\improper Security Equipment Storage" + desc = "A direction sign, pointing out the way to Security Equipment Storage." + icon_state = "direction_seceqp" + +/obj/structure/sign/directions/security/internal_affairs + name = "\improper Internal Affairs Office" + desc = "A direction sign, pointing out the way to the Internal Affairs Office." + icon_state = "direction_intaff" + +/obj/structure/sign/directions/security/forensics + name = "\improper Forensics Lab" + desc = "A direction sign, pointing out the way to the Forensics Lab." + icon_state = "direction_forensics" + +/obj/structure/sign/directions/security/forensics/alt + icon_state = "direction_lab" + +/obj/structure/sign/directions/security/interrogation + name = "\improper Interrogations" + desc = "A direction sign, pointing out the way to Interrogations." + icon_state = "direction_interrogation" + +//science signs +/obj/structure/sign/directions/science + name = "\improper Science Department" + desc = "A direction sign, pointing out the way to the Science Department." + icon_state = "direction_sci" + +/obj/structure/sign/directions/science/rnd + name = "\improper Research & Development" + desc = "A direction sign, pointing out the way to Research & Development." + icon_state = "direction_rnd" + +/obj/structure/sign/directions/science/toxins + name = "\improper Toxins Lab" + desc = "A direction sign, pointing out the way to the Toxins Lab." + icon_state = "direction_sci" + +/obj/structure/sign/directions/science/robotics + name = "\improper Robotics Workshop" + desc = "A direction sign, pointing out the way to the Robotics Workshop." + icon_state = "direction_robotics" + +/obj/structure/sign/directions/science/xenoarch + name = "\improper Xenoarchaeology Lab" + desc = "A direction sign, pointing out the way to the Xenoarchaeology Lab." + icon_state = "direction_xenoarch" + +/obj/structure/sign/directions/science/xenobiology + name = "\improper Xenobiology Lab" + desc = "A direction sign, pointing out the way to the Xenobiology Lab." + icon_state = "direction_xbio" + +/obj/structure/sign/directions/science/xenoflora + name = "\improper Xenoflora Lab" + desc = "A direction sign, pointing out the way to the Xenoflora Lab." + icon_state = "direction_xflora" + +/obj/structure/sign/directions/science/exploration + name = "\improper Exploration Department" + desc = "A direction sign, pointing out the way to the Exploration Department." + icon_state = "direction_explo" + +//medical signs /obj/structure/sign/directions/medical name = "\improper Medical Bay" - desc = "A direction sign, pointing out which way the Medical Bay is." + desc = "A direction sign, pointing out the way to the Medical Bay." icon_state = "direction_med" +/obj/structure/sign/directions/medical/chemlab + name = "\improper Chemistry Lab" + desc = "A direction sign, pointing out the way to the Chemistry Lab." + icon_state = "direction_med" + +/obj/structure/sign/directions/medical/surgery + name = "\improper Surgery" + desc = "A direction sign, pointing out the way to Surgery." + icon_state = "direction_surgery" + +/obj/structure/sign/directions/medical/operating_1 + name = "\improper Operating Theatre 1" + desc = "A direction sign, pointing out the way to Operating Theatre 1." + icon_state = "direction_op1" + +/obj/structure/sign/directions/medical/operating_2 + name = "\improper Operating Theatre 2" + desc = "A direction sign, pointing out the way to Operating Theatre 2." + icon_state = "direction_op2" + +/obj/structure/sign/directions/medical/virology + name = "\improper Virology" + desc = "A direction sign, pointing out the way to the Virology Lab." + icon_state = "direction_viro" + +/obj/structure/sign/directions/medical/medeqp + name = "\improper Medical Equipment Storage" + desc = "A direction sign, pointing out the way to Medical Equipment Storage." + icon_state = "direction_medeqp" + +/obj/structure/sign/directions/medical/morgue + name = "\improper Morgue" + desc = "A direction sign, pointing out the way to the Morgue." + icon_state = "direction_morgue" + +/obj/structure/sign/directions/medical/cloning + name = "\improper Cloning Lab" + desc = "A direction sign, pointing out the way to the Cloning Lab." + icon_state = "direction_cloning" + +/obj/structure/sign/directions/medical/resleeving + name = "\improper Resleeving Lab" + desc = "A direction sign, pointing out the way to the Resleeving Lab." + icon_state = "direction_resleeve" + +//special signs /obj/structure/sign/directions/evac name = "\improper Evacuation" - desc = "A direction sign, pointing out which way the Escape Shuttle dock is." + desc = "A direction sign, pointing out the way to the Escape Shuttle Dock." icon_state = "direction_evac" +/obj/structure/sign/directions/eva + name = "\improper Extra-Vehicular Activity" + desc = "A direction sign, pointing out the way to the EVA Bay." + icon_state = "direction_eva" + +//command signs +/obj/structure/sign/directions/ai_core + name = "\improper AI Core" + desc = "A direction sign, pointing out the way to the AI Core." + icon_state = "direction_ai_core" + /obj/structure/sign/directions/bridge name = "\improper Bridge" + desc = "A direction sign, pointing out the way to the Bridge." icon_state = "direction_bridge" +/obj/structure/sign/directions/command + name = "\improper Command" + desc = "A direction sign, pointing out the way to the Command Center." + icon_state = "direction_command" + +/obj/structure/sign/directions/teleporter + name = "\improper Teleporter" + desc = "A direction sign, pointing out the way to the Teleporter." + icon_state = "direction_teleport" + +/obj/structure/sign/directions/telecomms + name = "\improper Telecommunications Hub" + desc = "A direction sign, pointing out the way to the Telecommunications Hub." + icon_state = "direction_tcomms" + +//cargonia signs /obj/structure/sign/directions/cargo - name = "\improper Cargo department" - desc = "A direction sign, pointing out which way the Cargo department is." + name = "\improper Cargo Department" + desc = "A direction sign, pointing out the way to the Cargo Department." icon_state = "direction_crg" -// VOREStation Edit - New signs for us -/obj/structure/sign/directions/command - icon = 'icons/obj/decals_vr.dmi' - name = "\improper Command department" - desc = "A direction sign, pointing out which way the Command department is." - icon_state = "direction_cmd" +/obj/structure/sign/directions/cargo/mining + name = "\improper Mining Department" + desc = "A direction sign, pointing out the way to the Mining Department." + icon_state = "direction_mining" -/obj/structure/sign/directions/elevator - icon = 'icons/obj/decals_vr.dmi' - name = "\improper Space Elevator" - desc = "A direction sign, pointing out which way the Space Elevator is." - icon_state = "direction_elv" -// VOREStation Edit End - -/obj/structure/sign/directions/cryo - name = "\improper Cryogenic Storage" - desc = "A direction sign, pointing out which way cryogenic storage is." - icon_state = "direction_cry" +/obj/structure/sign/directions/cargo/refinery + name = "\improper Refinery" + desc = "A direction sign, pointing out the way to the Refinery." + icon_state = "direction_refinery" +//civilian/misc signs /obj/structure/sign/directions/roomnum name = "room number" desc = "A sign detailing the number of the room beside it." icon_state = "roomnum" +/obj/structure/sign/directions/cryo + name = "\improper Cryogenic Storage" + desc = "A direction sign, pointing out the way to Cryogenic Storage." + icon_state = "direction_cry" + +/obj/structure/sign/directions/elevator + name = "\improper Elevator" + desc = "A direction sign, pointing out the way to the nearest elevator." + icon_state = "direction_elv" + +/obj/structure/sign/directions/bar + name = "\improper Bar" + desc = "A direction sign, pointing out the way to the nearest watering hole." + icon_state = "direction_bar" + +/obj/structure/sign/directions/kitchen + name = "\improper Kitchen" + desc = "A pictographic direction sign with a knife, plate, and fork, pointing out the way to the nearest dining establishment." + icon_state = "direction_kitchen" + +/obj/structure/sign/directions/tram + name = "\improper Public Transit Station" + desc = "A direction sign, pointing out the way to the nearest public transit station." + icon_state = "direction_tram" + +/obj/structure/sign/directions/janitor + name = "\improper Custodial Closet" + desc = "A direction sign, pointing out the way to the Custodial Closet." + icon_state = "direction_janitor" + +/obj/structure/sign/directions/chapel + name = "\improper Chapel" + desc = "A direction sign, pointing out the way to the Chapel." + icon_state = "direction_chapel" + +/obj/structure/sign/directions/dorms + name = "\improper Dormitories" + desc = "A direction sign, pointing out the way to the Dormitories." + icon_state = "direction_dorms" + +/obj/structure/sign/directions/library + name = "\improper Library" + desc = "A direction sign, pointing out the way to the Library." + icon_state = "direction_library" + +/obj/structure/sign/directions/dock + name = "\improper Dock" + desc = "A direction sign, pointing out the way to the nearest docking area." + icon_state = "direction_dock" + +/obj/structure/sign/directions/gym + name = "\improper Gym" + desc = "A direction sign, pointing out the way to the Gym." + icon_state = "direction_gym" + +/obj/structure/sign/directions/pool + name = "\improper Pool" + desc = "A direction sign, pointing out the way to the Pool." + icon_state = "direction_pool" + +/obj/structure/sign/directions/recreation + name = "\improper Recreation Area" + desc = "A direction sign, pointing out the way to the nearest Recreation Area." + icon_state = "direction_recreation" + +/obj/structure/sign/directions/stairwell + name = "\improper Stairwell" + desc = "A direction sign with stairs and a door, pointing out the way to the nearest stairwell." + icon_state = "stairwell" + +/obj/structure/sign/directions/stairs_up + name = "\improper Stairs Up" + desc = "A direction sign with stairs and an upward-slanted arrow, pointing out the way to the nearest set of stairs that go up." + icon_state = "stairs_up" + +/obj/structure/sign/directions/stairs_down + name = "\improper Stairs Down" + desc = "A direction sign with stairs and a downward-slanted arrow, pointing out the way to the nearest set of stairs that go down." + icon_state = "stairs_down" + +/obj/structure/sign/directions/ladderwell + name = "\improper Access Shaft" + desc = "A direction sign with a ladder and a door, pointing out the way to the nearest access shaft." + icon_state = "ladderwell" + +/obj/structure/sign/directions/ladder_up + name = "\improper Ladder Up" + desc = "A direction sign with a ladder and an upward arrow, pointing out the way to the nearest ladder that goes up." + icon_state = "ladder_up" + +/obj/structure/sign/directions/ladder_down + name = "\improper Ladder Down" + desc = "A direction sign with a ladder and a downward arrow, pointing out the way to the nearest ladder that goes down." + icon_state = "ladder_down" + +/obj/structure/sign/directions/exit + name = "\improper Emergency Exit" + desc = "A lurid green sign that unmistakably identifies that the door it's next to as an emergency exit route." + icon_state = "exit_sign" + +//OTHER STUFF /obj/structure/sign/christmas/lights name = "Christmas lights" desc = "Flashy and pretty." diff --git a/code/game/turfs/unsimulated/beach_vr.dm b/code/game/turfs/unsimulated/beach_vr.dm new file mode 100644 index 0000000000..be3130a72e --- /dev/null +++ b/code/game/turfs/unsimulated/beach_vr.dm @@ -0,0 +1,5 @@ +/turf/simulated/floor/beach/sand/outdoors + outdoors = TRUE + +/turf/simulated/floor/beach/sand/desert/outdoors + outdoors = TRUE \ No newline at end of file diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 7ec68e40f6..6aa06ef4ec 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -23,7 +23,11 @@ var/corpseidjob = null // Needs to be in quotes, such as "Clown" or "Chef." This just determines what the ID reads as, not their access var/corpseidaccess = null //This is for access. See access.dm for which jobs give what access. Again, put in quotes. Use "Captain" if you want it to be all access. var/corpseidicon = null //For setting it to be a gold, silver, CentCom etc ID - var/species = SPECIES_HUMAN + var/species = SPECIES_HUMAN //defaults to generic-ass humans + var/random_species = FALSE //flip to TRUE to randomize species from the list below + var/list/random_species_list = list(SPECIES_HUMAN,SPECIES_TAJ,SPECIES_UNATHI,SPECIES_SKRELL) //preset list that can be overriden downstream. only includes common humanoids for voidsuit compatibility's sake. +// var/random_appearance = FALSE //TODO: make this work +// var/cause_of_death = null //TODO: set up a cause-of-death system. needs to support both damage types and actual wound types, so a body can have been bitten/stabbed/clawed/shot/burned/lasered/etc. to death delete_me = TRUE /obj/effect/landmark/corpse/Initialize() @@ -33,13 +37,20 @@ /obj/effect/landmark/corpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it. var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc) - M.set_species(species) + if(random_species) + var/random_pick = pick(random_species_list) + M.set_species(random_pick) + src.species = random_pick + else + M.set_species(species) + //TODO: insert appearance randomization, needs to be species-based M.real_name = src.name M.death(1) //Kills the new mob + //TODO: insert cause of death handling/wound simulation here if(src.corpseuniform) M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform) if(src.corpsesuit) - M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit) + M.equip_voidsuit_to_slot_or_del_with_refit(new src.corpsesuit(M), slot_wear_suit, src.species) if(src.corpseshoes) M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes) if(src.corpsegloves) @@ -51,7 +62,7 @@ if(src.corpsemask) M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask) if(src.corpsehelmet) - M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head) + M.equip_voidhelm_to_slot_or_del_with_refit(new src.corpsehelmet(M), slot_head, src.species) if(src.corpsebelt) M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt) if(src.corpsepocket1) @@ -84,10 +95,6 @@ // I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example. - - - - /obj/effect/landmark/corpse/syndicatesoldier name = "Mercenary" corpseuniform = /obj/item/clothing/under/syndicate @@ -102,8 +109,6 @@ corpseidjob = "Operative" corpseidaccess = "Syndicate" - - /obj/effect/landmark/corpse/syndicatecommando name = "Syndicate Commando" corpseuniform = /obj/item/clothing/under/syndicate @@ -119,10 +124,14 @@ corpseidjob = "Operative" corpseidaccess = "Syndicate" - - ///////////Civilians////////////////////// +/obj/effect/landmark/corpse/random_civ + name = "Civilian" + corpseuniform = /obj/item/clothing/under/color/grey + corpseshoes = /obj/item/clothing/shoes/black + random_species = TRUE + /obj/effect/landmark/corpse/chef name = "Chef" corpseuniform = /obj/item/clothing/under/rank/chef @@ -165,6 +174,7 @@ corpsesuit = /obj/item/clothing/suit/space/void/engineering corpsemask = /obj/item/clothing/mask/breath corpsehelmet = /obj/item/clothing/head/helmet/space/void/engineering + corpseback = /obj/item/weapon/tank/oxygen /obj/effect/landmark/corpse/clown name = "Clown" @@ -188,6 +198,39 @@ corpseid = 1 corpseidjob = "Scientist" corpseidaccess = "Scientist" + +/obj/effect/landmark/corpse/security + name = "Security Officer" + corpseradio = /obj/item/device/radio/headset/headset_sec + corpseuniform = /obj/item/clothing/under/rank/security + corpsesuit = /obj/item/clothing/suit/armor/vest + corpseback = /obj/item/weapon/storage/backpack/security + corpseshoes = /obj/item/clothing/shoes/boots/jackboots + corpseglasses = /obj/item/clothing/glasses/sunglasses/sechud + corpsegloves = /obj/item/clothing/gloves/black + corpsehelmet = /obj/item/clothing/head/helmet + corpseid = 1 + corpseidjob = "Security Officer" + corpseidaccess = "Security Officer" + +/obj/effect/landmark/corpse/security/rig + corpsesuit = /obj/item/clothing/suit/space/void/security + corpsemask = /obj/item/clothing/mask/breath + corpsehelmet = /obj/item/clothing/head/helmet/space/void/security + corpseback = /obj/item/weapon/tank/jetpack/oxygen + +/obj/effect/landmark/corpse/security/rig/eva + corpsesuit = /obj/item/clothing/suit/space/void/security/alt + corpsehelmet = /obj/item/clothing/head/helmet/space/void/security/alt + corpseidjob = "Starship Security Officer" + +/obj/effect/landmark/corpse/prisoner + name = "Unknown Prisoner" + corpseuniform = /obj/item/clothing/under/color/prison + corpseshoes = /obj/item/clothing/shoes/orange + corpseid = 1 + corpseidjob = "Prisoner" + random_species = TRUE /obj/effect/landmark/corpse/miner corpseradio = /obj/item/device/radio/headset/headset_cargo @@ -203,17 +246,69 @@ corpsesuit = /obj/item/clothing/suit/space/void/mining corpsemask = /obj/item/clothing/mask/breath corpsehelmet = /obj/item/clothing/head/helmet/space/void/mining + corpseback = /obj/item/weapon/tank/oxygen -//VORESTATION ADD START +/////////////////Vintage////////////////////// + +//define the basic props at this level and only change specifics for variants, e.z. +/obj/effect/landmark/corpse/vintage + name = "Unknown Crewmate" + corpseuniform = /obj/item/clothing/under/utility + corpsesuit = /obj/item/clothing/suit/space/void/refurb + corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb + corpsemask = /obj/item/clothing/mask/breath + corpseback = /obj/item/weapon/tank/oxygen + corpseid = 1 + corpseidjob = "Crewmate" + +/obj/effect/landmark/corpse/vintage/engineering + name = "Unknown Engineer" + corpsesuit = /obj/item/clothing/suit/space/void/refurb/engineering + corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/engineering + corpsebelt = /obj/item/weapon/storage/belt/utility/full + corpseback = /obj/item/weapon/tank/oxygen/yellow + corpseidjob = "Engineer" + +/obj/effect/landmark/corpse/vintage/marine + name = "Unknown Marine" + corpsesuit = /obj/item/clothing/suit/space/void/refurb/marine + corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/marine + corpsebelt = /obj/item/weapon/storage/belt/security/tactical + corpseidjob = "Marine" + +/obj/effect/landmark/corpse/vintage/medical + name = "Unknown Medic" + corpsesuit = /obj/item/clothing/suit/space/void/refurb/medical + corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/medical + corpsebelt = /obj/item/weapon/storage/belt/medical + corpseidjob = "Medic" + +/obj/effect/landmark/corpse/vintage/mercenary + name = "Unknown Mercenary" + corpsesuit = /obj/item/clothing/suit/space/void/refurb/mercenary + corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/mercenary + corpsebelt = /obj/item/weapon/storage/belt/security/tactical + corpseback = /obj/item/weapon/tank/oxygen/red + corpseidjob = "Mercenary" + +/obj/effect/landmark/corpse/vintage/officer + name = "Unknown Captain" + corpsesuit = /obj/item/clothing/suit/space/void/refurb/officer + corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/officer + corpseback = /obj/item/weapon/tank/oxygen/yellow + corpseidjob = "Captain" + /obj/effect/landmark/corpse/vintage/pilot - name = "Pilot" - corpseuniform = /obj/item/clothing/under/color/grey + name = "Unknown Pilot" corpsesuit = /obj/item/clothing/suit/space/void/refurb/pilot corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/pilot - corpseshoes = /obj/item/clothing/shoes/black - corpseback = /obj/item/weapon/tank/oxygen -//VORESTATION ADD END + corpseidjob = "Pilot" +/obj/effect/landmark/corpse/vintage/research + name = "Unknown Researcher" + corpsesuit = /obj/item/clothing/suit/space/void/refurb/research + corpsehelmet = /obj/item/clothing/head/helmet/space/void/refurb/research + corpseidjob = "Researcher" /////////////////Officers////////////////////// diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm index 71d4ad7254..f9c9eb588d 100644 --- a/code/modules/blob2/blobs/base_blob.dm +++ b/code/modules/blob2/blobs/base_blob.dm @@ -22,6 +22,7 @@ GLOBAL_LIST_EMPTY(all_blobs) /obj/structure/blob/Initialize(newloc, new_overmind) if(new_overmind) overmind = new_overmind + faction = overmind.blob_type.faction update_icon() if(!integrity) integrity = max_integrity @@ -47,19 +48,24 @@ GLOBAL_LIST_EMPTY(all_blobs) color = null set_light(0) +/obj/structure/blob/update_transform() + var/matrix/M = matrix() + M.Scale(icon_scale_x, icon_scale_y) + animate(src, transform = M, time = 10) + // Blob tiles are not actually dense so we need Special Code(tm). /obj/structure/blob/CanPass(atom/movable/mover, turf/target) if(istype(mover) && mover.checkpass(PASSBLOB)) return TRUE else if(istype(mover, /mob/living)) var/mob/living/L = mover - if(L.faction == "blob") + if(L.faction == faction) return TRUE else if(istype(mover, /obj/item/projectile)) var/obj/item/projectile/P = mover if(istype(P.firer, /obj/structure/blob)) return TRUE - if(istype(P.firer) && P.firer.faction == "blob") + if(istype(P.firer) && P.firer.faction == faction) return TRUE return FALSE @@ -88,6 +94,7 @@ GLOBAL_LIST_EMPTY(all_blobs) update_icon() pulse_timestamp = world.time + 1 SECOND if(overmind) + faction = overmind.blob_type.faction overmind.blob_type.on_pulse(src) return TRUE //we did it, we were pulsed! return FALSE //oh no we failed @@ -106,6 +113,9 @@ GLOBAL_LIST_EMPTY(all_blobs) for(var/L in blobs_to_affect) var/obj/structure/blob/B = L + if(B.faction != faction) + continue + if(!B.overmind && !istype(B, /obj/structure/blob/core) && prob(30)) B.overmind = pulsing_overmind //reclaim unclaimed, non-core blobs. B.update_icon() @@ -138,7 +148,8 @@ GLOBAL_LIST_EMPTY(all_blobs) var/dirn = pick(dirs) dirs.Remove(dirn) T = get_step(src, dirn) - if(!(locate(/obj/structure/blob) in T)) + var/obj/structure/blob/B = locate(/obj/structure/blob) in T + if(!B || B.faction != faction) // Allow opposing blobs to fight. break else T = null @@ -164,6 +175,7 @@ GLOBAL_LIST_EMPTY(all_blobs) if(make_blob) //well, can we? var/obj/structure/blob/B = new /obj/structure/blob/normal(src.loc) + B.faction = faction if(controller) B.overmind = controller else @@ -340,7 +352,7 @@ GLOBAL_LIST_EMPTY(all_blobs) if(!P) return - if(istype(P.firer) && P.firer.faction == "blob") + if(istype(P.firer) && P.firer.faction == faction) return var/damage = P.get_structure_damage() // So tasers don't hurt the blob. @@ -366,6 +378,31 @@ GLOBAL_LIST_EMPTY(all_blobs) if(overmind) overmind.blob_type.on_water(src, amount) +/obj/structure/blob/blob_act(var/obj/structure/blob/B) + . = ..() + + if(B) + + if(!B.overmind) + return + + if(B.faction != faction) + var/damage = rand(B.overmind.blob_type.damage_lower, B.overmind.blob_type.damage_upper) + var/inc_damage_type = B.overmind.blob_type.damage_type + + if(overmind) + damage = overmind.blob_type.on_received_damage(src, damage, inc_damage_type, B) + + else + faction = B.faction + overmind = B.overmind + update_icon() + return + + adjust_integrity(-1 * damage) + + return + /obj/structure/blob/proc/adjust_integrity(amount) integrity = between(0, integrity + amount, max_integrity) if(integrity == 0) diff --git a/code/modules/blob2/blobs/factory.dm b/code/modules/blob2/blobs/factory.dm index f9415a6e66..464f89f760 100644 --- a/code/modules/blob2/blobs/factory.dm +++ b/code/modules/blob2/blobs/factory.dm @@ -35,7 +35,7 @@ var/mob/living/simple_mob/blob/spore/S = null if(overmind) S = new overmind.blob_type.spore_type(src.loc, src) - S.faction = "blob" + S.faction = overmind.blob_type.faction if(istype(S)) S.overmind = overmind overmind.blob_mobs.Add(S) diff --git a/code/modules/blob2/blobs/normal.dm b/code/modules/blob2/blobs/normal.dm index a6e841d4dd..cf25ff5c1b 100644 --- a/code/modules/blob2/blobs/normal.dm +++ b/code/modules/blob2/blobs/normal.dm @@ -19,4 +19,13 @@ if(overmind) name = "[overmind.blob_type.name]" else - name = "inert [base_name]" \ No newline at end of file + name = "inert [base_name]" + +/obj/structure/blob/normal/pulsed() + ..() + + if(prob(30)) + adjust_scale((rand(10, 13) / 10), (rand(10, 13) / 10)) + + else + adjust_scale(1) diff --git a/code/modules/blob2/core_chunk.dm b/code/modules/blob2/core_chunk.dm index 7d8f588568..4abc06843e 100644 --- a/code/modules/blob2/core_chunk.dm +++ b/code/modules/blob2/core_chunk.dm @@ -5,6 +5,7 @@ description_info = "Some blob types will have core effects when the chunk is used in-hand, toggled with an alt click, or constantly active." icon = 'icons/mob/blob.dmi' icon_state = "blobcore" + flags = OPENCONTAINER var/datum/blob_type/blob_type // The blob type this dropped from. var/active_ability_cooldown = 20 SECONDS @@ -15,11 +16,17 @@ var/passive_ability_cooldown = 5 SECONDS var/last_passive_use = 0 + var/can_genesis = TRUE // Can the core chunk be used to grow a new blob? + drop_sound = 'sound/effects/slime_squish.ogg' +/obj/item/weapon/blobcore_chunk/is_open_container() + return 1 + /obj/item/weapon/blobcore_chunk/New(var/atom/newloc, var/datum/blob_type/parentblob = null) ..(newloc) + create_reagents(120) setup_blobtype(parentblob) /obj/item/weapon/blobcore_chunk/Destroy() @@ -91,10 +98,57 @@ blob_type.on_chunk_tick(src) /obj/item/weapon/blobcore_chunk/AltClick(mob/living/carbon/user) - if(blob_type &&blob_type.chunk_active_type == BLOB_CHUNK_TOGGLE) + if(blob_type && blob_type.chunk_active_type == BLOB_CHUNK_TOGGLE) should_tick = !should_tick if(should_tick) to_chat(user, "\The [src] shudders with life.") else to_chat(user, "\The [src] stills, returning to a death-like state.") + +/obj/item/weapon/blobcore_chunk/proc/regen(var/newfaction = null) + if(istype(blob_type)) + if(newfaction) + blob_type.faction = newfaction + + var/obj/structure/blob/core/NC = new (get_turf(src)) + NC.overmind.blob_type = blob_type + NC.overmind.blob_core.update_icon() + return TRUE + + return FALSE + +/datum/chemical_reaction/blob_reconstitution + name = "Hostile Blob Revival" + id = "blob_revival" + result = null + required_reagents = list("phoron" = 60) + result_amount = 1 + +/datum/chemical_reaction/blob_reconstitution/can_happen(var/datum/reagents/holder) + if(holder.my_atom && istype(holder.my_atom, /obj/item/weapon/blobcore_chunk)) + return ..() + return FALSE + +/datum/chemical_reaction/blob_reconstitution/on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/blobcore_chunk/chunk = holder.my_atom + if(chunk.can_genesis && chunk.regen()) + chunk.visible_message("[chunk] bubbles, surrounding itself with a rapidly expanding mass of [chunk.blob_type.name]!") + chunk.can_genesis = FALSE + else + chunk.visible_message("[chunk] shifts strangely, but falls still.") + +/datum/chemical_reaction/blob_reconstitution/domination + name = "Allied Blob Revival" + id = "blob_friend" + result = null + required_reagents = list("hydrophoron" = 40, "peridaxon" = 20, "mutagen" = 20) + result_amount = 1 + +/datum/chemical_reaction/blob_reconstitution/domination/on_reaction(var/datum/reagents/holder) + var/obj/item/weapon/blobcore_chunk/chunk = holder.my_atom + if(chunk.can_genesis && chunk.regen("neutral")) + chunk.visible_message("[chunk] bubbles, surrounding itself with a rapidly expanding mass of [chunk.blob_type.name]!") + chunk.can_genesis = FALSE + else + chunk.visible_message("[chunk] shifts strangely, but falls still.") diff --git a/code/modules/blob2/overmind/overmind.dm b/code/modules/blob2/overmind/overmind.dm index ffcd347dd8..6df0cba629 100644 --- a/code/modules/blob2/overmind/overmind.dm +++ b/code/modules/blob2/overmind/overmind.dm @@ -23,6 +23,14 @@ var/list/overminds = list() var/ai_controlled = TRUE var/auto_pilot = FALSE // If true, and if a client is attached, the AI routine will continue running. + universal_understand = TRUE + + var/list/has_langs = list(LANGUAGE_BLOB) + var/datum/language/default_language = null + +/mob/observer/blob/get_default_language() + return default_language + /mob/observer/blob/Initialize(newloc, pre_placed = 0, starting_points = 60, desired_blob_type = null) blob_points = starting_points if(pre_placed) //we already have a core! @@ -41,6 +49,11 @@ var/list/overminds = list() if(blob_core) blob_core.update_icon() + for(var/L in has_langs) + languages |= GLOB.all_languages[L] + if(languages.len) + default_language = languages[1] + return ..(newloc) /mob/observer/blob/Destroy() @@ -67,9 +80,9 @@ var/list/overminds = list() stat(null, "Power Stored: [blob_points]/[max_blob_points]") stat(null, "Total Blobs: [GLOB.all_blobs.len]") -/mob/observer/blob/Move(NewLoc, Dir = 0) +/mob/observer/blob/Move(var/atom/NewLoc, Dir = 0) if(placed) - var/obj/structure/blob/B = locate() in range("3x3", NewLoc) + var/obj/structure/blob/B = (locate() in view("5x5", NewLoc)) if(B) forceMove(NewLoc) return TRUE @@ -93,3 +106,62 @@ var/list/overminds = list() if(blob_points >= 100) if(!auto_factory() && !auto_resource()) auto_node() + +/mob/observer/blob/say(var/message, var/datum/language/speaking = null, var/whispering = 0) + message = sanitize(message) + + if(!message) + return + + //If you're muted for IC chat + if(client) + if(message) + client.handle_spam_prevention(MUTE_IC) + if((client.prefs.muted & MUTE_IC) || say_disabled) + to_chat(src, "You cannot speak in IC (Muted).") + return + + //These will contain the main receivers of the message + var/list/listening = list() + var/list/listening_obj = list() + + var/turf/T = get_turf(src) + if(T) + //Obtain the mobs and objects in the message range + var/list/results = get_mobs_and_objs_in_view_fast(T, world.view, remote_ghosts = client ? TRUE : FALSE) + listening = results["mobs"] + listening_obj = results["objs"] + else + return 1 //If we're in nullspace, then forget it. + + var/list/message_pieces = parse_languages(message) + if(istype(message_pieces, /datum/multilingual_say_piece)) // Little quirk for dealing with hivemind/signlang languages. + var/datum/multilingual_say_piece/S = message_pieces // Yay for BYOND's hilariously broken typecasting for allowing us to do this. + S.speaking.broadcast(src, S.message) + return 1 + + if(!LAZYLEN(message_pieces)) + log_runtime(EXCEPTION("Message failed to generate pieces. [message] - [json_encode(message_pieces)]")) + return 0 + + //Handle nonverbal languages here + for(var/datum/multilingual_say_piece/S in message_pieces) + if(S.speaking.flags & NONVERBAL) + custom_emote(1, "[pick(S.speaking.signlang_verb)].") + + for(var/mob/M in listening) + spawn() + if(M && src) + if(get_dist(M, src) <= world.view || (M.stat == DEAD && !forbid_seeing_deadchat)) + M.hear_say(message_pieces, "conveys", (M.faction == blob_type.faction), src) + + //Object message delivery + for(var/obj/O in listening_obj) + spawn(0) + if(O && src) //If we still exist, when the spawn processes + var/dst = get_dist(get_turf(O),get_turf(src)) + if(dst <= world.view) + O.hear_talk(src, message_pieces, "conveys") + + log_say(message, src) + return 1 diff --git a/code/modules/blob2/overmind/powers.dm b/code/modules/blob2/overmind/powers.dm index f5727e94bf..4177bac991 100644 --- a/code/modules/blob2/overmind/powers.dm +++ b/code/modules/blob2/overmind/powers.dm @@ -80,8 +80,8 @@ potential_blobs -= temp // Don't take up the core's shield spot. else if(!istype(temp, /obj/structure/blob/normal)) potential_blobs -= temp // Not a normal blob. - else if(temp.overmind != src) - potential_blobs -= temp // Not our blob. + else if(temp.overmind != src || temp.overmind.blob_type.faction != blob_type.faction) + potential_blobs -= temp // Not our blob, or even an ally. else B = temp break @@ -123,8 +123,8 @@ potential_blobs -= temp // Don't take up the core's shield spot. else if(!istype(temp, /obj/structure/blob/normal)) potential_blobs -= temp // Not a normal blob. - else if(temp.overmind != src) - potential_blobs -= temp // Not our blob. + else if(temp.overmind != src || temp.overmind.blob_type.faction != blob_type.faction) + potential_blobs -= temp // Not our blob, or even an ally else B = temp break @@ -165,8 +165,8 @@ potential_blobs -= temp else if(!istype(temp, /obj/structure/blob/normal)) potential_blobs -= temp - else if(temp.overmind != src) - potential_blobs -= temp // Not our blob. + else if(temp.overmind != src || temp.overmind.blob_type.faction != blob_type.faction) + potential_blobs -= temp // Not our blob, or even our ally. else B = temp break @@ -216,7 +216,7 @@ for(var/mob/living/L in view(src)) if(L.stat == DEAD) continue // Already dying or dead. - if(L.faction == "blob") + if(L.faction == blob_type.faction) continue // No friendly fire. if(locate(/obj/structure/blob) in L.loc) continue // Already has a blob over them. diff --git a/code/modules/blob2/overmind/types.dm b/code/modules/blob2/overmind/types.dm index 79df541aae..8fffbcdbca 100644 --- a/code/modules/blob2/overmind/types.dm +++ b/code/modules/blob2/overmind/types.dm @@ -9,6 +9,8 @@ var/color = "#FFFFFF" // The actual blob's color. var/complementary_color = "#000000" //a color that's complementary to the normal blob color. Blob mobs are colored in this. + var/faction = "blob" // The blob's faction. + var/attack_message = "The blob attacks you" // Base message the mob gets when blob_act() gets called on them by the blob. An exclaimation point is added to the end. var/attack_message_living = null // Appended to attack_message, if the target fails isSynthetic() check. var/attack_message_synth = null // Ditto, but if they pass isSynthetic(). diff --git a/code/modules/blob2/overmind/types/blazing_oil.dm b/code/modules/blob2/overmind/types/blazing_oil.dm index 094083e778..7d8c9f307d 100644 --- a/code/modules/blob2/overmind/types/blazing_oil.dm +++ b/code/modules/blob2/overmind/types/blazing_oil.dm @@ -33,6 +33,8 @@ env.add_thermal_energy(10 * 1000) /datum/blob_type/blazing_oil/on_chunk_tick(obj/item/weapon/blobcore_chunk/B) + B.reagents.add_reagent("thermite_v", 0.5) + var/turf/T = get_turf(B) if(!T) return diff --git a/code/modules/blob2/overmind/types/cryogenic_goo.dm b/code/modules/blob2/overmind/types/cryogenic_goo.dm index 32684ed58f..564516a71d 100644 --- a/code/modules/blob2/overmind/types/cryogenic_goo.dm +++ b/code/modules/blob2/overmind/types/cryogenic_goo.dm @@ -46,6 +46,8 @@ env.add_thermal_energy(-10 * 1000) /datum/blob_type/cryogenic_goo/on_chunk_tick(obj/item/weapon/blobcore_chunk/B) + B.reagents.add_reagent("cryoslurry", 0.5) + var/turf/simulated/T = get_turf(B) if(!istype(T)) return diff --git a/code/modules/blob2/overmind/types/ectoplasmic_horror.dm b/code/modules/blob2/overmind/types/ectoplasmic_horror.dm index f7689847cd..a528ce8388 100644 --- a/code/modules/blob2/overmind/types/ectoplasmic_horror.dm +++ b/code/modules/blob2/overmind/types/ectoplasmic_horror.dm @@ -35,7 +35,7 @@ listclearnulls(active_beams) var/atom/movable/beam_origin = B for(var/mob/living/L in oview(world.view, B)) - if(L.stat == DEAD || L.faction == "blob") + if(L.stat == DEAD || L.faction == faction) continue if(prob(5)) var/beamtarget_exists = FALSE @@ -82,7 +82,7 @@ if(nearby_mobs.len) listclearnulls(active_beams) for(var/mob/living/L in nearby_mobs) - if(L.stat == DEAD || L.faction == "blob") + if(L.stat == DEAD || L.faction == faction) continue if(prob(5)) var/beamtarget_exists = FALSE diff --git a/code/modules/blob2/overmind/types/explosive_lattice.dm b/code/modules/blob2/overmind/types/explosive_lattice.dm index d0484c3725..aec6787eab 100644 --- a/code/modules/blob2/overmind/types/explosive_lattice.dm +++ b/code/modules/blob2/overmind/types/explosive_lattice.dm @@ -30,7 +30,7 @@ for(var/mob/living/L in range(get_turf(victim), 1)) // We don't use orange(), in case there is more than one mob on the target tile. if(L == victim) // Already hit. continue - if(L.faction == "blob") // No friendly fire + if(L.faction == faction) // No friendly fire continue L.blob_act() diff --git a/code/modules/blob2/overmind/types/fulminant_organism.dm b/code/modules/blob2/overmind/types/fulminant_organism.dm index 2d940f9359..4f3788b787 100644 --- a/code/modules/blob2/overmind/types/fulminant_organism.dm +++ b/code/modules/blob2/overmind/types/fulminant_organism.dm @@ -24,9 +24,10 @@ var/mob/living/simple_mob/blob/spore/S = new spore_type(T) if(istype(S)) S.overmind = O + S.faction = faction O.blob_mobs.Add(S) else - S.faction = "blob" + S.faction = faction S.update_icons() /datum/blob_type/fulminant_organism/on_death(obj/structure/blob/B) @@ -35,9 +36,10 @@ B.visible_message("\The [S] floats free from the [name]!") if(istype(S)) S.overmind = B.overmind + S.faction = faction B.overmind.blob_mobs.Add(S) else - S.faction = "blob" + S.faction = faction S.update_icons() /datum/blob_type/fulminant_organism/on_chunk_use(obj/item/weapon/blobcore_chunk/B, mob/living/user) diff --git a/code/modules/blob2/overmind/types/grey_goo.dm b/code/modules/blob2/overmind/types/grey_goo.dm index 5c93fb46c8..558f624e96 100644 --- a/code/modules/blob2/overmind/types/grey_goo.dm +++ b/code/modules/blob2/overmind/types/grey_goo.dm @@ -14,6 +14,7 @@ attack_message = "The tide tries to swallow you" attack_message_living = ", and you feel your skin dissolve" attack_message_synth = ", and your external plating dissolves" + faction = "nanomachines" /datum/blob_type/grey_goo/on_emp(obj/structure/blob/B, severity) B.adjust_integrity(-(20 / severity)) diff --git a/code/modules/blob2/overmind/types/roiling_mold.dm b/code/modules/blob2/overmind/types/roiling_mold.dm index e909d06086..4594ad1c9f 100644 --- a/code/modules/blob2/overmind/types/roiling_mold.dm +++ b/code/modules/blob2/overmind/types/roiling_mold.dm @@ -44,7 +44,7 @@ if(!istype(L)) return - if(istype(B, /obj/structure/blob/factory) && L.stat != DEAD && prob(ai_aggressiveness) && L.faction != "blob") + if(istype(B, /obj/structure/blob/factory) && L.stat != DEAD && prob(ai_aggressiveness) && L.faction != faction) var/obj/item/projectile/arc/spore/P = new(get_turf(B)) P.launch_projectile(L, BP_TORSO, B) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 548ceaa74d..f6ef8a5c28 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -228,7 +228,6 @@ if(!void) void = new() - void.MakeGreed() screen += void if((prefs.lastchangelog != changelog_hash) && isnewplayer(src.mob)) //bolds the changelog button on the interface so we know there are updates. diff --git a/code/modules/client/preference_setup/loadout/loadout_head_vr.dm b/code/modules/client/preference_setup/loadout/loadout_head_vr.dm index ce6ada61ab..2aebfd668f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head_vr.dm @@ -18,4 +18,28 @@ /datum/gear/head/detective_alt display_name = "cyberscope headgear, detective" path = /obj/item/clothing/head/helmet/detective_alt - allowed_roles = list("Head of Security", "Detective") \ No newline at end of file + allowed_roles = list("Head of Security", "Detective") + +/datum/gear/head/bearpelt + display_name = "brown bear pelt" + path = /obj/item/clothing/head/pelt + +/datum/gear/head/wolfpelt + display_name = "brown wolf pelt" + path = /obj/item/clothing/head/pelt/wolfpelt + +/datum/gear/head/wolfpeltblack + display_name = "black wolf pelt" + path = /obj/item/clothing/head/pelt/wolfpeltblack + +/datum/gear/head/tigerpelt + display_name = "shiny tiger pelt" + path = /obj/item/clothing/head/pelt/tigerpelt + +/datum/gear/head/tigerpeltsnow + display_name = "snow tiger pelt" + path = /obj/item/clothing/head/pelt/tigerpeltsnow + +/datum/gear/head/tigerpeltpink + display_name = "pink tiger pelt" + path = /obj/item/clothing/head/pelt/tigerpeltpink \ No newline at end of file diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index e653166b7a..ecaaa840cf 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -58,21 +58,21 @@ if(pref.species != SPECIES_CUSTOM) pref.pos_traits.Cut() - pref.neu_traits.Cut() pref.neg_traits.Cut() - else - // Clean up positive traits - for(var/path in pref.pos_traits) - if(!(path in positive_traits)) - pref.pos_traits -= path - //Neutral traits - for(var/path in pref.neu_traits) - if(!(path in neutral_traits)) - pref.neu_traits -= path - //Negative traits - for(var/path in pref.neg_traits) - if(!(path in negative_traits)) - pref.neg_traits -= path + // Clean up positive traits + for(var/path in pref.pos_traits) + if(!(path in positive_traits)) + pref.pos_traits -= path + //Neutral traits + for(var/path in pref.neu_traits) + if(!(path in neutral_traits)) + pref.neu_traits -= path + if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits)) + pref.neu_traits -= path + //Negative traits + for(var/path in pref.neg_traits) + if(!(path in negative_traits)) + pref.neg_traits -= path var/datum/species/selected_species = GLOB.all_species[pref.species] if(selected_species.selects_bodytype) @@ -82,23 +82,27 @@ /datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character) character.custom_species = pref.custom_species - var/datum/species/selected_species = GLOB.all_species[pref.species] if(character.isSynthetic()) //Checking if we have a synth on our hands, boys. pref.dirty_synth = 1 - if(selected_species.selects_bodytype) - var/datum/species/custom/CS = character.species - var/S = pref.custom_base ? pref.custom_base : "Human" - var/datum/species/custom/new_CS = CS.produceCopy(S, pref.pos_traits + pref.neu_traits + pref.neg_traits, character) + var/datum/species/S = character.species + var/SB + if(S.selects_bodytype) + SB = pref.custom_base ? pref.custom_base : "Human" + else + SB = S.name + var/datum/species/new_S = S.produceCopy(SB, pref.pos_traits + pref.neu_traits + pref.neg_traits, character) - //Any additional non-trait settings can be applied here - new_CS.blood_color = pref.blood_color + //Any additional non-trait settings can be applied here + new_S.blood_color = pref.blood_color + + if(pref.species == SPECIES_CUSTOM) + //Statistics for this would be nice + var/english_traits = english_list(new_S.traits, and_text = ";", comma_text = ";") + log_game("TRAITS [pref.client_ckey]/([character]) with: [english_traits]") //Terrible 'fake' key_name()... but they aren't in the same entity yet + else - if(pref.species == SPECIES_CUSTOM) - //Statistics for this would be nice - var/english_traits = english_list(new_CS.traits, and_text = ";", comma_text = ";") - log_game("TRAITS [pref.client_ckey]/([character]) with: [english_traits]") //Terrible 'fake' key_name()... but they aren't in the same entity yet /datum/category_item/player_setup_item/vore/traits/content(var/mob/user) . += "Custom Species Name: " @@ -109,15 +113,16 @@ . += "Icon Base: " . += "[pref.custom_base ? pref.custom_base : "Human"]
" + var/traits_left = pref.max_traits + . += "Traits Left: [traits_left]
" if(pref.species == SPECIES_CUSTOM) var/points_left = pref.starting_trait_points - var/traits_left = pref.max_traits + for(var/T in pref.pos_traits + pref.neg_traits) points_left -= traits_costs[T] traits_left-- . += "Points Left: [points_left]
" - . += "Traits Left: [traits_left]
" if(points_left < 0 || traits_left < 0 || !pref.custom_species) . += "^ Fix things! ^
" @@ -128,19 +133,18 @@ . += "
  • - [trait.name] ([trait.cost])
  • " . += "" - . += "Neutral Trait +
    " - . += "" - . += "Negative Trait +
    " . += "" + . += "Neutral Trait +
    " + . += "" . += "Blood Color: " //People that want to use a certain species to have that species traits (xenochimera/promethean/spider) should be able to set their own blood color. . += "Set Color" . += "R
    " @@ -213,8 +217,12 @@ picklist = positive_traits.Copy() - pref.pos_traits mylist = pref.pos_traits if(NEUTRAL_MODE) - picklist = neutral_traits.Copy() - pref.neu_traits - mylist = pref.neu_traits + if(pref.species == SPECIES_CUSTOM) + picklist = neutral_traits.Copy() - pref.neu_traits + mylist = pref.neu_traits + else + picklist = everyone_traits.Copy() - pref.neu_traits + mylist = pref.neu_traits if(NEGATIVE_MODE) picklist = negative_traits.Copy() - pref.neg_traits mylist = pref.neg_traits diff --git a/code/modules/clothing/head/misc_vr.dm b/code/modules/clothing/head/misc_vr.dm index 0dbfa97d5e..1d1f039598 100644 --- a/code/modules/clothing/head/misc_vr.dm +++ b/code/modules/clothing/head/misc_vr.dm @@ -46,4 +46,44 @@ /obj/item/clothing/head/shiny_hood/closed/poly name = "polychromic closed shiny hood" icon_state = "hood_col_o" - polychromic = TRUE \ No newline at end of file + polychromic = TRUE + +/obj/item/clothing/head/pelt + name = "Bear pelt" + desc = "A luxurious bear pelt, good to keep warm in winter. Or to sleep through winter." + icon = 'icons/obj/clothing/hats_vr.dmi' + icon_override = 'icons/mob/head_vr.dmi' + icon_state = "bearpelt_brown" + item_state = "bearpelt_brown" + +/obj/item/clothing/head/pelt/wolfpelt + name = "Wolf pelt" + desc = "A fuzzy wolf pelt, demanding respect as a hunter, well if it isn't synthetic or anything at least. Or bought." + icon_override = 'icons/mob/wolfpelt_vr.dmi' + icon_state = "wolfpelt_brown" + item_state = "wolfpelt_brown" + +/obj/item/clothing/head/pelt/wolfpeltblack + name = "Wolf pelt" + desc = "A fuzzy wolf pelt, demanding respect as a hunter, well if it isn't synthetic or anything at least. Or bought." + icon_override = 'icons/mob/wolfpelt_vr.dmi' + icon_state = "wolfpelt_gray" + item_state = "wolfpelt_gray" + +/obj/item/clothing/head/pelt/tigerpelt + name = "Shiny tiger pelt" + desc = "A vibrant tiger pelt, particularly fabulous." + icon_state = "tigerpelt_shiny" + item_state = "tigerpelt_shiny" + +/obj/item/clothing/head/pelt/tigerpeltsnow + name = "Snow tiger pelt" + desc = "A pelt of a less vibrant tiger, but rather warm." + icon_state = "tigerpelt_snow" + item_state = "tigerpelt_snow" + +/obj/item/clothing/head/pelt/tigerpeltpink + name = "Pink tiger pelt" + desc = "A particularly vibrant tiger pelt, for those who want to be the most fabulous at parties." + icon_state = "tigerpelt_pink" + item_state = "tigerpelt_pink" \ No newline at end of file diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 268ef565ca..8741182c40 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -6049,6 +6049,23 @@ reagents.add_reagent("protein", 8) bitesize = 3 +/obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup + name = "chicken noodle soup" + gender = PLURAL + desc = "A bright bowl of yellow broth with cuts of meat, noodles and carrots." + icon = 'icons/obj/food_custom.dmi' + icon_state = "chickennoodlesoup" + filling_color = "#ead90c" + nutriment_amt = 6 + nutriment_desc = list("warm soup" = 6) + center_of_mass = list("x"=16, "y"=5) + +/obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup/Initialize() + . = ..() + reagents.add_reagent("protein", 4) + reagents.add_reagent("water", 5) + bitesize = 6 + /obj/item/weapon/reagent_containers/food/snacks/chilicheesefries name = "chili cheese fries" gender = PLURAL @@ -6559,4 +6576,4 @@ /obj/item/weapon/reagent_containers/food/snacks/cinnamonbun/New() ..() reagents.add_reagent("nutriment", 8) - bitesize = 1 \ No newline at end of file + bitesize = 1 diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index 7c19a2a310..b615932f43 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -941,6 +941,13 @@ I said no! ) result = /obj/item/weapon/reagent_containers/food/snacks/chickenfillet +/datum/recipe/chickennoodlesoup + fruit = list("carrot" = 1) + reagents = list("water" = 10) + items = list( /obj/item/weapon/reagent_containers/food/snacks/spagetti, /obj/item/weapon/reagent_containers/food/snacks/rawcutlet) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup + /datum/recipe/chilicheesefries items = list( /obj/item/weapon/reagent_containers/food/snacks/fries, @@ -1436,4 +1443,4 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/dough ) result = /obj/item/weapon/reagent_containers/food/snacks/cinnamonbun - result_quantity = 4 \ No newline at end of file + result_quantity = 4 diff --git a/code/modules/gamemaster/event2/events/engineering/brand_intelligence.dm b/code/modules/gamemaster/event2/events/engineering/brand_intelligence.dm index 85f51df192..d3478bb333 100644 --- a/code/modules/gamemaster/event2/events/engineering/brand_intelligence.dm +++ b/code/modules/gamemaster/event2/events/engineering/brand_intelligence.dm @@ -33,8 +33,8 @@ /datum/event2/event/brand_intelligence/announce() if(prob(90)) - command_announcement.Announce("An ongoing mass upload of malware for venders has been detected onboard \the [location_name()], \ - which appears to transmit to nearby vendors. The original infected machine is believed to be \a [vender_zero].", "Vender Service Alert") + command_announcement.Announce("An ongoing mass upload of malware for vendors has been detected onboard \the [location_name()], \ + which appears to transmit to nearby vendors. The original infected machine is believed to be \a [vender_zero].", "Vendor Service Alert") /datum/event2/event/brand_intelligence/start() infect_vender(vender_zero) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 91d7d8d666..0b58b5110f 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -343,7 +343,8 @@ H.update_icon() src.update_icon() usr.visible_message("\The [usr] plays \the [discarding].") - H.loc = get_step(usr,usr.dir) + H.loc = get_turf(usr) + H.Move(get_step(usr,usr.dir)) if(!cards.len) qdel(src) diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm index 6e4b7c741f..cf1389065a 100644 --- a/code/modules/materials/material_recipes.dm +++ b/code/modules/materials/material_recipes.dm @@ -28,6 +28,7 @@ recipes += new/datum/stack_recipe("[display_name] fork", /obj/item/weapon/material/kitchen/utensil/fork/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] knife", /obj/item/weapon/material/knife/plastic, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] blade", /obj/item/weapon/material/butterflyblade, 6, time = 20, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("[display_name] defense wire", /obj/item/weapon/material/barbedwire, 10, time = 1 MINUTE, one_per_turf = 0, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) /datum/material/steel/generate_recipes() ..() @@ -222,7 +223,7 @@ /datum/material/cloth/generate_recipes() recipes = list() - recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("woven net", /obj/item/weapon/material/fishing_net, 10, time = 30 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]") recipes += new/datum/stack_recipe("bedsheet", /obj/item/weapon/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE) recipes += new/datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE) recipes += new/datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE) @@ -237,6 +238,7 @@ recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE) recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE) recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]") /datum/material/resin/generate_recipes() recipes = list() @@ -269,4 +271,5 @@ recipes += new/datum/stack_recipe("[display_name] ring", /obj/item/clothing/gloves/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) recipes += new/datum/stack_recipe("[display_name] armor plate", /obj/item/weapon/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE) + recipes += new/datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]") recipes += new/datum/stack_recipe("whip", /obj/item/weapon/material/whip, 5, time = 15 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]") diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 4a4f16bf27..712451cfe6 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -1010,6 +1010,19 @@ var/list/name_to_material pass_stack_colors = TRUE supply_conversion_value = 2 +/datum/material/cloth/syncloth + name = "syncloth" + stack_origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 2) + door_icon_base = "wood" + ignition_point = T0C+532 + melting_point = T0C+600 + integrity = 200 + protectiveness = 15 // 4% + flags = MATERIAL_PADDING + conductive = 0 + pass_stack_colors = TRUE + supply_conversion_value = 3 + /datum/material/cult name = "cult" display_name = "disturbing stone" diff --git a/code/modules/mob/_modifiers/modifiers_misc.dm b/code/modules/mob/_modifiers/modifiers_misc.dm index 3b9663d855..fee761cf30 100644 --- a/code/modules/mob/_modifiers/modifiers_misc.dm +++ b/code/modules/mob/_modifiers/modifiers_misc.dm @@ -426,4 +426,14 @@ the artifact triggers the rage. heat_protection = -0.5 cold_protection = -0.5 - siemens_coefficient = 1.5 \ No newline at end of file + siemens_coefficient = 1.5 + +/datum/modifier/entangled + name = "entangled" + desc = "Its hard to move." + + on_created_text = "You're caught in something! It's hard to move." + on_expired_text = "Your movement is freed." + stacks = MODIFIER_STACK_EXTEND + + slowdown = 2 diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index e6a618272e..376a1fafa7 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -71,6 +71,15 @@ var/list/slot_equipment_priority = list( \ /mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot) return equip_to_slot_if_possible(W, slot, 1, 1, 0) +//hurgh. these feel hacky, but they're the only way I could get the damn thing to work. I guess they could be handy for antag spawners too? +/mob/proc/equip_voidsuit_to_slot_or_del_with_refit(obj/item/clothing/suit/space/void/W as obj, slot, species = SPECIES_HUMAN) + W.refit_for_species(species) + return equip_to_slot_if_possible(W, slot, 1, 1, 0) + +/mob/proc/equip_voidhelm_to_slot_or_del_with_refit(obj/item/clothing/head/helmet/space/void/W as obj, slot, species = SPECIES_HUMAN) + W.refit_for_species(species) + return equip_to_slot_if_possible(W, slot, 1, 1, 0) + //Checks if a given slot can be accessed at this time, either to equip or unequip I /mob/proc/slot_is_accessible(var/slot, var/obj/item/I, mob/user=null) return 1 diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index 91ba6e6080..649c9814d6 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -154,3 +154,31 @@ key = "]" flags = RESTRICTED syllables = list("chan","ange","thi","se") + +//Bloblang. +/datum/language/blob + name = LANGUAGE_BLOB + desc = "The massive processing power of the Blob's core gives the overmind finely tuned abilities to transmit messages to nearby life-forms through chemical signals." + speech_verb = "resonates" + ask_verb = "reverberates" + exclaim_verb = "shudders" + colour = "blob" + key = "}" + machine_understands = TRUE + flags = RESTRICTED + + syllables = list("^", "Ë…", "-", "°", "~") + +/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask) + + var/mob/living/simple_mob/animal/borer/B + + if(istype(speaker,/mob/living/carbon)) + var/mob/living/carbon/M = speaker + B = M.has_brain_worms() + else if(istype(speaker,/mob/living/simple_mob/animal/borer)) + B = speaker + + if(B) + speaker_mask = B.true_name + ..(speaker,message,speaker_mask) diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm index 3af25d4fae..dfd34037b6 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm @@ -54,8 +54,6 @@ base_color = "#f0f0f0" color_mult = 1 - inherent_verbs = list(/mob/living/proc/shred_limb) - has_glowing_eyes = TRUE death_message = "phases to somewhere far away!" @@ -66,8 +64,7 @@ speech_bubble_appearance = "ghost" - genders = list(PLURAL, NEUTER) //no sexual dymorphism - ambiguous_genders = TRUE //but just in case + genders = list(MALE, FEMALE, PLURAL, NEUTER) virus_immune = 1 diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm index 353946d976..7c62d02b25 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -21,6 +21,8 @@ var/icon_height = 32 var/agility = 20 //prob() to do agile things + var/list/traits = list() + /datum/species/proc/update_attack_types() unarmed_attacks = list() for(var/u_type in unarmed_types) @@ -44,3 +46,29 @@ nif.nifsofts = nifsofts else ..() +/datum/species/proc/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H) + ASSERT(to_copy) + ASSERT(istype(H)) + + if(ispath(to_copy)) + to_copy = "[initial(to_copy.name)]" + if(istext(to_copy)) + to_copy = GLOB.all_species[to_copy] + + var/datum/species/new_copy = new to_copy.type() + + new_copy.traits = traits + + //If you had traits, apply them + if(new_copy.traits) + for(var/trait in new_copy.traits) + var/datum/trait/T = all_traits[trait] + T.apply(new_copy,H) + + //Set up a mob + H.species = new_copy + + if(H.dna) + H.dna.ready_dna(H) + + return new_copy \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/alraune.dm b/code/modules/mob/living/carbon/human/species/station/alraune.dm index 8353d36cba..1b0ed79897 100644 --- a/code/modules/mob/living/carbon/human/species/station/alraune.dm +++ b/code/modules/mob/living/carbon/human/species/station/alraune.dm @@ -46,10 +46,6 @@ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR inherent_verbs = list( - /mob/living/carbon/human/proc/succubus_drain, - /mob/living/carbon/human/proc/succubus_drain_finalize, - /mob/living/carbon/human/proc/succubus_drain_lethal, - /mob/living/carbon/human/proc/bloodsuck, /mob/living/carbon/human/proc/alraune_fruit_select) //Give them the voremodes related to wrapping people in vines and sapping their fluids color_mult = 1 @@ -58,7 +54,7 @@ flesh_color = "#9ee02c" blood_color = "#edf4d0" //sap! base_color = "#1a5600" - + reagent_tag = IS_ALRAUNE blurb = "Alraunes are a rare sight in space. Their bodies are reminiscent of that of plants, and yet they share many\ @@ -449,7 +445,7 @@ //End of fruit gland code. -/datum/species/alraune/proc/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H) +/datum/species/alraune/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H) ASSERT(to_copy) ASSERT(istype(H)) @@ -475,6 +471,13 @@ new_copy.blood_mask = to_copy.blood_mask new_copy.damage_mask = to_copy.damage_mask new_copy.damage_overlays = to_copy.damage_overlays + new_copy.traits = traits + + //If you had traits, apply them + if(new_copy.traits) + for(var/trait in new_copy.traits) + var/datum/trait/T = all_traits[trait] + T.apply(new_copy,H) //Set up a mob H.species = new_copy diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm index 6fd2e5db2d..4267841319 100644 --- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -29,11 +29,11 @@ num_alternate_languages = 3 assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) + genders = list(MALE, FEMALE, PLURAL, NEUTER) + spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR - var/list/traits = list() - has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest, "descriptor" = "torso"), BP_GROIN = list("path" = /obj/item/organ/external/groin, "descriptor" = "groin"), @@ -55,7 +55,7 @@ var/datum/species/real = GLOB.all_species[base_species] return real.race_key -/datum/species/custom/proc/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H) +/datum/species/custom/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H) ASSERT(to_copy) ASSERT(istype(H)) diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm index 4c4be10cbd..cb0b86abe8 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm @@ -13,6 +13,10 @@ "Rapala", "Neaera", "Stok", "Farwa", "Sobaka", "Wolpin", "Saru", "Sparra") + spawn_flags = SPECIES_CAN_JOIN + wikilink="https://wiki.vore-station.net/Promethean" + genders = list(MALE, FEMALE, PLURAL, NEUTER) + color_mult = 1 mob_size = MOB_MEDIUM //As of writing, original was MOB_SMALL - Allows normal swapping trashcan = 1 //They have goopy bodies. They can just dissolve things within them. @@ -30,10 +34,5 @@ /mob/living/carbon/human/proc/shapeshifter_select_tail, /mob/living/carbon/human/proc/shapeshifter_select_ears, /mob/living/proc/set_size, - /mob/living/carbon/human/proc/succubus_drain, - /mob/living/carbon/human/proc/succubus_drain_finalize, - /mob/living/carbon/human/proc/succubus_drain_lethal, - /mob/living/carbon/human/proc/slime_feed, - /mob/living/proc/eat_trash, /mob/living/carbon/human/proc/promethean_select_opaqueness, ) diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm index 8d3bce89e9..405fd6c58c 100755 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_species.dm @@ -59,6 +59,8 @@ siemens_coefficient = 1.5 //Very bad zappy times rarity_value = 5 + genders = list(MALE, FEMALE, PLURAL, NEUTER) + has_organ = list( O_BRAIN = /obj/item/organ/internal/mmi_holder/posibrain/nano, O_ORCH = /obj/item/organ/internal/nano/orchestrator, @@ -96,9 +98,7 @@ /mob/living/carbon/human/proc/shapeshifter_select_gender, /mob/living/carbon/human/proc/shapeshifter_select_wings, /mob/living/carbon/human/proc/shapeshifter_select_tail, - /mob/living/carbon/human/proc/shapeshifter_select_ears, - /mob/living/proc/eat_trash, - /mob/living/carbon/human/proc/slime_feed + /mob/living/carbon/human/proc/shapeshifter_select_ears ) var/global/list/abilities = list() @@ -170,7 +170,7 @@ H.forceMove(H.temporary_form.drop_location()) H.ckey = H.temporary_form.ckey QDEL_NULL(H.temporary_form) - + to_chat(H, "You died as a Protean. Please sit out of the round for at least 60 minutes before respawning, to represent the time it would take to ship a new-you to the station.") for(var/obj/item/organ/I in H.internal_organs) diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index 07e9f8d3ed..7b7f3e8ed2 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -25,12 +25,7 @@ inherent_verbs = list( /mob/living/carbon/human/proc/reconstitute_form, /mob/living/carbon/human/proc/sonar_ping, - /mob/living/carbon/human/proc/succubus_drain, - /mob/living/carbon/human/proc/succubus_drain_finalize, - /mob/living/carbon/human/proc/succubus_drain_lethal, - /mob/living/carbon/human/proc/bloodsuck, /mob/living/carbon/human/proc/tie_hair, - /mob/living/proc/shred_limb, /mob/living/proc/flying_toggle, /mob/living/proc/start_wings_hovering) //Xenochimera get all the special verbs since they can't select traits. @@ -57,6 +52,8 @@ flags = NO_SCAN | NO_INFECT //Dying as a chimera is, quite literally, a death sentence. Well, if it wasn't for their revive, that is. appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + genders = list(MALE, FEMALE, PLURAL, NEUTER) + has_organ = list( //Same organ list as tajarans. O_HEART = /obj/item/organ/internal/heart, O_LUNGS = /obj/item/organ/internal/lungs, @@ -295,7 +292,7 @@ update_xenochimera_hud(H, danger, feral_state) -/datum/species/xenochimera/proc/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H) +/datum/species/xenochimera/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H) ASSERT(to_copy) ASSERT(istype(H)) @@ -321,6 +318,13 @@ new_copy.blood_mask = to_copy.blood_mask new_copy.damage_mask = to_copy.damage_mask new_copy.damage_overlays = to_copy.damage_overlays + new_copy.traits = traits + + //If you had traits, apply them + if(new_copy.traits) + for(var/trait in new_copy.traits) + var/datum/trait/T = all_traits[trait] + T.apply(new_copy,H) //Set up a mob H.species = new_copy @@ -402,6 +406,8 @@ spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + genders = list(MALE, FEMALE, PLURAL, NEUTER) + flesh_color = "#AFA59E" //Gray-ish. Not sure if this is really needed, but eh. base_color = "#333333" //Blackish-gray blood_color = "#0952EF" //Spiders have blue blood. @@ -458,13 +464,12 @@ spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR - inherent_verbs = list( - /mob/living/proc/shred_limb, - /mob/living/proc/eat_trash) flesh_color = "#AFA59E" base_color = "#777777" + genders = list(MALE, FEMALE, PLURAL, NEUTER) + heat_discomfort_strings = list( "Your fur prickles in the heat.", "You feel uncomfortably warm.", diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 35117374ee..a591e050ae 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -36,11 +36,12 @@ spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR - inherent_verbs = list(/mob/living/proc/shred_limb) flesh_color = "#AFA59E" base_color = "#777777" + genders = list(MALE, FEMALE, PLURAL, NEUTER) + heat_discomfort_strings = list( "Your fur prickles in the heat.", "You feel uncomfortably warm.", @@ -78,7 +79,6 @@ secondary_langs = list(LANGUAGE_SKRELLIAN) name_language = LANGUAGE_SKRELLIAN color_mult = 1 - inherent_verbs = list(/mob/living/proc/shred_limb) assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) min_age = 18 @@ -98,6 +98,8 @@ primitive_form = "Sobaka" + genders = list(MALE, FEMALE, PLURAL, NEUTER) + spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR @@ -125,7 +127,7 @@ secondary_langs = list(LANGUAGE_BIRDSONG) name_language = LANGUAGE_BIRDSONG color_mult = 1 - inherent_verbs = list(/mob/living/proc/shred_limb,/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering) + inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering) min_age = 18 max_age = 110 @@ -142,6 +144,8 @@ primitive_form = "Sparra" + genders = list(MALE, FEMALE, PLURAL, NEUTER) + spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR @@ -191,6 +195,8 @@ blood_color = "#240bc4" color_mult = 1 + genders = list(MALE, FEMALE, PLURAL, NEUTER) + heat_discomfort_strings = list( "Your fur prickles in the heat.", "You feel uncomfortably warm.", @@ -215,7 +221,7 @@ // gluttonous = 1 num_alternate_languages = 3 color_mult = 1 - inherent_verbs = list(/mob/living/proc/shred_limb, /mob/living/carbon/human/proc/lick_wounds) + inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds) blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \ dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \ @@ -232,6 +238,8 @@ spawn_flags = SPECIES_CAN_JOIN appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + genders = list(MALE, FEMALE, PLURAL, NEUTER) + flesh_color = "#966464" base_color = "#B43214" @@ -247,7 +255,7 @@ color_mult = 1 min_age = 18 gluttonous = 0 - inherent_verbs = list(/mob/living/proc/shred_limb) + genders = list(MALE, FEMALE, PLURAL, NEUTER) descriptors = list() wikilink="https://yawn.izac.live/Unathi" @@ -259,8 +267,9 @@ color_mult = 1 min_age = 18 gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm - inherent_verbs = list(/mob/living/proc/shred_limb, /mob/living/carbon/human/proc/lick_wounds) + inherent_verbs = list(/mob/living/carbon/human/proc/lick_wounds) heat_discomfort_level = 295 //Prevents heat discomfort spam at 20c + genders = list(MALE, FEMALE, PLURAL, NEUTER) wikilink="https://yawn.izac.live/Tajaran" agility = 90 @@ -272,12 +281,14 @@ min_age = 18 reagent_tag = null assisted_langs = list(LANGUAGE_EAL, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) + genders = list(MALE, FEMALE, PLURAL, NEUTER) wikilink="https://yawn.izac.live/Skrell" /datum/species/zaddat spawn_flags = SPECIES_CAN_JOIN min_age = 18 gluttonous = 0 + genders = list(MALE, FEMALE, PLURAL, NEUTER) descriptors = list() wikilink="https://yawn.izac.live/Zaddat" @@ -292,6 +303,7 @@ /datum/species/diona spawn_flags = SPECIES_CAN_JOIN min_age = 18 + genders = list(MALE, FEMALE, PLURAL, NEUTER) wikilink="https://yawn.izac.live/Diona" /datum/species/teshari @@ -305,6 +317,7 @@ push_flags = ~HEAVY //Allows them to use micro step code. swap_flags = ~HEAVY gluttonous = 0 + genders = list(MALE, FEMALE, PLURAL, NEUTER) descriptors = list() wikilink="https://yawn.izac.live/Teshari" agility = 90 @@ -312,7 +325,6 @@ inherent_verbs = list( /mob/living/carbon/human/proc/sonar_ping, /mob/living/proc/hide, - /mob/living/proc/shred_limb, /mob/living/proc/toggle_pass_table ) @@ -326,6 +338,7 @@ deform = 'icons/mob/human_races/r_def_human_vr.dmi' appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR min_age = 18 + genders = list(MALE, FEMALE, PLURAL, NEUTER) base_color = "#EECEB3" wikilink="https://yawn.izac.live/Human" @@ -338,7 +351,6 @@ min_age = 18 icobase = 'icons/mob/human_races/r_vox_old.dmi' deform = 'icons/mob/human_races/r_def_vox_old.dmi' - inherent_verbs = list(/mob/living/proc/shred_limb, /mob/living/proc/eat_trash) descriptors = list( /datum/mob_descriptor/vox_markings = 0 ) @@ -356,6 +368,7 @@ datum/species/harpy secondary_langs = list(LANGUAGE_BIRDSONG) name_language = null color_mult = 1 + genders = list(MALE, FEMALE, PLURAL, NEUTER) inherent_verbs = list(/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering) min_age = 18 @@ -441,8 +454,6 @@ datum/species/harpy base_color = "#f0f0f0" color_mult = 1 - inherent_verbs = list(/mob/living/proc/shred_limb) - has_glowing_eyes = TRUE male_cough_sounds = null @@ -452,8 +463,7 @@ datum/species/harpy speech_bubble_appearance = "ghost" - genders = list(PLURAL, NEUTER) //no sexual dymorphism - ambiguous_genders = TRUE //but just in case + genders = list(MALE, FEMALE, PLURAL, NEUTER) breath_type = null poison_type = null @@ -514,6 +524,7 @@ datum/species/harpy //primitive_form = "" //We don't have fennec-monkey sprites. spawn_flags = SPECIES_IS_RESTRICTED appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + genders = list(MALE, FEMALE, PLURAL, NEUTER) flesh_color = "#AFA59E" base_color = "#333333" @@ -553,6 +564,7 @@ datum/species/harpy spawn_flags = SPECIES_IS_RESTRICTED appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR + genders = list(MALE, FEMALE, PLURAL, NEUTER) blood_color = "#12ff12" flesh_color = "#201730" @@ -563,4 +575,3 @@ datum/species/harpy "You feel uncomfortably warm.", "Your chitin feels hot." ) - inherent_verbs = list(/mob/living/proc/shred_limb) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index 681eb282d9..8fda7612a8 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -72,7 +72,7 @@ cost = 0 var_changes = list("cold_level_1" = 200, "cold_level_2" = 150, "cold_level_3" = 90, "breath_cold_level_1" = 180, "breath_cold_level_2" = 100, "breath_cold_level_3" = 60, "cold_discomfort_level" = 210, "heat_level_1" = 305, "heat_level_2" = 360, "heat_level_3" = 700, "breath_heat_level_1" = 345, "breath_heat_level_2" = 380, "breath_heat_level_3" = 780, "heat_discomfort_level" = 295, "body_temperature" = 290) excludes = list(/datum/trait/hotadapt) - + /datum/trait/hotadapt name = "Heat-Adapted" desc = "You are able to withstand much hotter temperatures than other species, and can even be comfortable in extremely hot environments. You are also more vulnerable to cold environments, and have a higher body temperature as a consequence of these adaptations." @@ -128,6 +128,7 @@ YW change end */ name = "Minor Bloodsucker" desc = "Makes you unable to gain nutrition from anything but blood. To compensate, you get fangs that can be used to drain blood from prey." cost = 0 + custom_only = FALSE var_changes = list("gets_food_nutrition" = 0) //The verb is given in human.dm excludes = list(/datum/trait/bloodsucker_plus) @@ -139,6 +140,7 @@ YW change end */ name = "Succubus Drain" desc = "Makes you able to gain nutrition from draining prey in your grasp." cost = 0 + custom_only = FALSE /datum/trait/succubus_drain/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) @@ -150,6 +152,7 @@ YW change end */ name = "Feeder" desc = "Allows you to feed your prey using your own body." cost = 0 + custom_only = FALSE /datum/trait/feeder/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) @@ -159,6 +162,7 @@ YW change end */ name = "Brutal Predation" desc = "Allows you to tear off limbs & tear out internal organs." cost = 0 + custom_only = FALSE /datum/trait/hard_vore/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) @@ -168,6 +172,7 @@ YW change end */ name = "Trash Can" desc = "Allows you to dispose of some garbage on the go instead of having to look for a bin or littering like an animal." cost = 0 + custom_only = FALSE var_changes = list("trashcan" = 1) /datum/trait/trashcan/apply(var/datum/species/S,var/mob/living/carbon/human/H) @@ -178,6 +183,7 @@ YW change end */ name = "Expensive Taste" desc = "You only gain nutrition from raw ore and refined minerals. There's nothing that sates the appetite better than precious gems, exotic or rare minerals and you have damn fine taste. Anything else is beneath you." cost = 0 + custom_only = FALSE var_changes = list("gets_food_nutrition" = 0, "eat_minerals" = 1) /datum/trait/gem_eater/apply(var/datum/species/S,var/mob/living/carbon/human/H) @@ -188,12 +194,14 @@ YW change end */ name = "Glowing Eyes" desc = "Your eyes show up above darkness. SPOOKY! And kinda edgey too." cost = 0 + custom_only = FALSE var_changes = list("has_glowing_eyes" = 1) /datum/trait/glowing_body name = "Glowing Body" desc = "Your body glows about as much as a PDA light! Settable color and toggle in Abilities tab ingame." cost = 0 + custom_only = FALSE /datum/trait/glowing_body/apply(var/datum/species/S,var/mob/living/carbon/human/H) ..(S,H) @@ -205,36 +213,42 @@ YW change end */ name = "Extreme Spice Intolerance" desc = "Spicy (and chilly) peppers are three times as strong. (This does not affect pepperspray.)" cost = 0 + custom_only = FALSE var_changes = list("spice_mod" = 3) // 300% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this! - + /datum/trait/spice_intolerance_basic name = "Heavy Spice Intolerance" desc = "Spicy (and chilly) peppers are twice as strong. (This does not affect pepperspray.)" cost = 0 + custom_only = FALSE var_changes = list("spice_mod" = 2) // 200% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this! /datum/trait/spice_intolerance_slight name = "Slight Spice Intolerance" desc = "You have a slight struggle with spicy foods. Spicy (and chilly) peppers are one and a half times stronger. (This does not affect pepperspray.)" cost = 0 + custom_only = FALSE var_changes = list("spice_mod" = 1.5) // 150% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this! /datum/trait/spice_tolerance_basic name = "Spice Tolerance" desc = "Spicy (and chilly) peppers are only three-quarters as strong. (This does not affect pepperspray.)" cost = 0 + custom_only = FALSE var_changes = list("spice_mod" = 0.75) // 75% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this! - + /datum/trait/spice_tolerance_advanced name = "Strong Spice Tolerance" desc = "Spicy (and chilly) peppers are only half as strong. (This does not affect pepperspray.)" cost = 0 + custom_only = FALSE var_changes = list("spice_mod" = 0.5) // 50% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this! /datum/trait/spice_immunity name = "Extreme Spice Tolerance" desc = "Spicy (and chilly) peppers are basically ineffective! (This does not affect pepperspray.)" cost = 0 + custom_only = FALSE var_changes = list("spice_mod" = 0.25) // 25% as effective if spice_mod is set to 1. If it's not 1 in species.dm, update this! /*YW CHANGE START: Commented out because we got our own variants @@ -243,36 +257,42 @@ YW change end */ name = "Liver of Air" desc = "The only way you can hold a drink is if it's in your own two hands, and even then you'd best not inhale too deeply near it. Drinks are three times as strong." cost = 0 + custom_only = FALSE var_changes = list("alcohol_mod" = 3) // 300% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this! /datum/trait/alcohol_intolerance_basic name = "Liver of Lilies" desc = "You have a hard time with alcohol. Maybe you just never took to it, or maybe it doesn't agree with you... either way, drinks are twice as strong." cost = 0 + custom_only = FALSE var_changes = list("alcohol_mod" = 2) // 200% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this! /datum/trait/alcohol_intolerance_slight name = "Liver of Tulips" desc = "You have a slight struggle with alcohol. Drinks are one and a half times stronger." cost = 0 + custom_only = FALSE var_changes = list("alcohol_mod" = 1.5) // 150% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this! /datum/trait/alcohol_tolerance_basic name = "Liver of Iron" desc = "You can hold drinks much better than those lily-livered land-lubbers! Arr! Drinks are only three-quarters as strong." cost = 0 + custom_only = FALSE var_changes = list("alcohol_mod" = 0.75) // 75% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this! - + /datum/trait/alcohol_tolerance_advanced name = "Liver of Steel" desc = "Drinks tremble before your might! You can hold your alcohol twice as well as those blue-bellied barnacle boilers! Drinks are only half as strong." cost = 0 + custom_only = FALSE var_changes = list("alcohol_mod" = 0.5) // 50% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this! /datum/trait/alcohol_immunity name = "Liver of Durasteel" desc = "You've drunk so much that most booze doesn't even faze you. It takes something like a Pan-Galactic or a pint of Deathbell for you to even get slightly buzzed." cost = 0 + custom_only = FALSE var_changes = list("alcohol_mod" = 0.25) // 25% as effective if alcohol_mod is set to 1. If it's not 1 in species.dm, update this! // Alcohol Traits End Here. YW CHANGE STOP*/ \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm index 434fc8d846..605da7e569 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm @@ -5,7 +5,8 @@ var/cost = 0 // 0 is neutral, negative cost means negative, positive cost means positive. var/list/var_changes // A list to apply to the custom species vars. var/list/excludes // Store a list of paths of traits to exclude, but done automatically if they change the same vars. - var/not_for_synths = 0 // Can freaking synths use those. + var/not_for_synths = FALSE // Can freaking synths use those. + var/custom_only = TRUE // Trait only available for custom species //Proc can be overridden lower to include special changes, make sure to call up though for the vars changes /datum/trait/proc/apply(var/datum/species/S,var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index a8137a8a89..11158d89a1 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -181,7 +181,7 @@ ..() /mob/living/blob_act(var/obj/structure/blob/B) - if(stat == DEAD || faction == "blob") + if(stat == DEAD || faction == B.faction) return var/damage = rand(30, 40) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm index 7c6f22d6b9..fe39040432 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm @@ -37,6 +37,12 @@ src.modules += new /obj/item/weapon/pinpointer/shuttle/merc(src) src.modules += new /obj/item/weapon/melee/energy/sword(src) + var/datum/matter_synth/cloth = new /datum/matter_synth/cloth(40000) + synths += cloth + + var/obj/item/stack/sandbags/cyborg/SB = new /obj/item/stack/sandbags/cyborg(src) + SB.synths += list(cloth) + var/jetpack = new/obj/item/weapon/tank/jetpack/carbondioxide(src) src.modules += jetpack R.internals = jetpack diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index 141ef503bd..a7a36fcc96 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -141,6 +141,8 @@ to_chat(cleaned_human, "[src] cleans your face!") /mob/living/silicon/robot/proc/vr_sprite_check() + if(custom_sprite == TRUE) + return if(wideborg == TRUE) if(icontype== "Drake") // Why, Why can't we have normal nice things icon = 'icons/mob/drakeborg/drakeborg_vr.dmi' diff --git a/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm b/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm index 44ab4fdd09..752211812d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm +++ b/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm @@ -50,9 +50,13 @@ /mob/living/simple_mob/blob/blob_act(obj/structure/blob/B) if(!overmind && B.overmind) overmind = B.overmind + faction = B.overmind.blob_type.faction update_icon() - if(stat != DEAD && health < maxHealth) + if(faction != B.faction && B.overmind) + adjustBruteLoss(rand(B.overmind.blob_type.damage_lower, B.overmind.blob_type.damage_upper)) + + else if(stat != DEAD && health < maxHealth) adjustBruteLoss(-maxHealth*0.0125) adjustFireLoss(-maxHealth*0.0125) @@ -73,7 +77,7 @@ for(var/obj/item/I in items) if(istype(I, /obj/item/weapon/blobcore_chunk)) var/obj/item/weapon/blobcore_chunk/BC = I - if(!overmind || (BC.blob_type && overmind.blob_type.type == BC.blob_type.type)) + if(!overmind || (BC.blob_type && overmind.blob_type.type == BC.blob_type.type) || BC.blob_type.faction == faction) ally = TRUE break diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index bf8387ffc2..af2d00404e 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -81,6 +81,13 @@ max_n2 = 0 has_eye_glow = TRUE +/mob/living/simple_mob/otie/feral/chubby + name = "chubby mutated feral otie" + desc = "The classic bioengineered longdog. No pets. Only bite. This one has mutated from too much time out on the surface of Virgo-3B. What an absolute unit." + icon_state = "photiec" + icon_living = "photiec" + icon_rest = "photiec_rest" + /mob/living/simple_mob/otie/red name = "feral red otie" desc = "Seems this ominous looking longdog has been infused with wicked infernal forces." @@ -109,6 +116,15 @@ faction = "neutral" tamed = 1 +/mob/living/simple_mob/otie/red/chubby //gets the pet2tame feature and doesn't kill you right away + name = "chubby red otie" + desc = "Seems this ominous looking longdog has been infused with wicked infernal forces. What an absolute unit." + icon_state = "hotiec" + icon_living = "hotiec" + icon_rest = "hotiec_rest" + faction = "neutral" + tamed = 1 + /mob/living/simple_mob/otie/friendly //gets the pet2tame feature and doesn't kill you right away name = "otie" desc = "The classic bioengineered longdog. This one might even tolerate you!" @@ -158,7 +174,7 @@ /mob/living/simple_mob/otie/security //tame by default unless you're a marked crimester. can be befriended to follow with pets tho. name = "guard otie" - desc = "The VARMAcorp bioengineering division flagship product on trained optimal snowflake guard dogs." + desc = "The VARMAcorp bioengineering division flagship product on big mean guard dogs." icon_state = "sotie" icon_living = "sotie" icon_rest = "sotie_rest" @@ -176,7 +192,7 @@ /mob/living/simple_mob/otie/security/chubby name = "chubby guard otie" - desc = "The VARMAcorp bioengineering division flagship product on trained optimal snowflake guard dogs. What an absolute unit." + desc = "The VARMAcorp bioengineering division flagship product on big mean guard dogs. What an absolute unit." icon_state = "fsotie" icon_living = "fsotie" icon_rest = "fsotie_rest" @@ -184,7 +200,7 @@ /mob/living/simple_mob/otie/security/phoron name = "mutated guard otie" - desc = "An extra rare phoron resistant version of the VARMAcorp trained snowflake guard dogs for infernal environments." + desc = "An extra rare phoron resistant version of the VARMAcorp trained guard dogs adapted for hostile environments." tt_desc = "Otus phoronis" icon_state = "secphotie" icon_living = "secphotie" @@ -201,7 +217,7 @@ /mob/living/simple_mob/otie/security/phoron/red name = "red guard otie" - desc = "An ominous looking version of the VARMAcorp trained snowflake guard dogs." + desc = "An ominous looking version of the big mean VARMAcorp guard dogs." tt_desc = "Otus infernalis" icon_state = "sechotie" icon_living = "sechotie" @@ -209,6 +225,13 @@ icon_dead = "sechotie-dead" maxbodytemp = 1000 +/mob/living/simple_mob/otie/security/phoron/red/chubby + name = "chubby red guard otie" + desc = "An ominous looking version of the big mean VARMAcorp guard dogs. What an absolute unit." + icon_state = "hotiesc" + icon_living = "hotiesc" + icon_rest = "hotiesc_rest" + /mob/living/simple_mob/otie/attackby(var/obj/item/O, var/mob/user) // Trade donuts for bellybrig victims. if(istype(O, /obj/item/weapon/reagent_containers/food)) qdel(O) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm index b4c656ddc3..1b4a2e9ad8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm @@ -66,7 +66,6 @@ name = "dire wolf" desc = "The biggest and baddest wolf around." tt_desc = "Canis maxdirus" - icon = 'icons/mob/vore64x32.dmi' icon_dead = "direwolf-dead" icon_living = "direwolf" @@ -108,12 +107,27 @@ name = "large dog" desc = "The biggest and goodest dog around." tt_desc = "Canis maxdirus familiaris" - icon_dead = "diredog-dead" icon_living = "diredog" icon_state = "diredog" icon_rest = "diredog_rest" +/mob/living/simple_mob/animal/wolf/direwolf/dog/sec + name = "large guard dog" + desc = "The biggest and goodest guard dog around." + icon_dead = "diredogs-dead" + icon_living = "diredogs" + icon_state = "diredogs" + icon_rest = "diredogs_rest" + +/mob/living/simple_mob/animal/wolf/direwolf/sec + name = "dire guard wolf" + desc = "The biggest and baddest guard wolf around." + icon_dead = "direwolfs-dead" + icon_living = "direwolfs" + icon_state = "direwolfs" + icon_rest = "direwolfs_rest" + /mob/living/simple_mob/animal/wolf/direwolf/rykka name = "Rykka" desc = "This big canine looks like a GSD. It has a collar tagged, 'Bitch'" diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 75b2ccd07f..95732bad6a 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -289,7 +289,7 @@ // If we have a grab var/list/grablist = my_mob.ret_grab() - if(grablist.len) + if(LAZYLEN(grablist)) grablist -= my_mob // Just in case we're in a circular grab chain // It's just us and another person diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 4f48a4adf4..64f65adfbb 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -37,7 +37,7 @@ if(input) log_subtle(message,src) - message = "[src] [input]" + message = "[src] [input]" else return diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 30c539bbde..016e3fce3c 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -33,7 +33,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) if(!owner || owner.stat == DEAD) defib_timer = max(--defib_timer, 0) else - defib_timer = min(++defib_timer, (config.defib_timer MINUTES) / 2) + defib_timer = min(++defib_timer, (config.defib_timer MINUTES) / 20) // Time vars measure things in ticks. Life tick happens every ~2 seconds, therefore dividing by 20 /obj/item/organ/internal/brain/proc/can_assist() return can_assist @@ -81,7 +81,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) /obj/item/organ/internal/brain/New() ..() health = config.default_brain_health - defib_timer = (config.defib_timer MINUTES) / 2 + defib_timer = (config.defib_timer MINUTES) / 20 // Time vars measure things in ticks. Life tick happens every ~2 seconds, therefore dividing by 20 spawn(5) if(brainmob) butcherable = FALSE @@ -103,7 +103,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) if(istype(H)) brainmob.dna = H.dna.Clone() brainmob.timeofhostdeath = H.timeofdeath - brainmob.ooc_notes = H.ooc_notes //VOREStation Edit + brainmob.ooc_notes = H.ooc_notes //VOREStation Edit // Copy modifiers. for(var/datum/modifier/M in H.modifiers) diff --git a/code/modules/planet/virgo4_vr.dm b/code/modules/planet/virgo4_vr.dm new file mode 100644 index 0000000000..50c0b8426e --- /dev/null +++ b/code/modules/planet/virgo4_vr.dm @@ -0,0 +1,522 @@ +var/datum/planet/virgo4/planet_virgo4 = null + +/datum/time/virgo4 + seconds_in_day = 24 HOURS + +/datum/planet/virgo4 + name = "Virgo-4" + desc = "Zorren homeworld. Mostly dry and desolate, but ocean and fresh water are present, with scattered vegitation." //rewrite me + current_time = new /datum/time/virgo4() +// expected_z_levels = list(1) // This is defined elsewhere. + planetary_wall_type = /turf/unsimulated/wall/planetary/normal/virgo4 + +/datum/planet/virgo4/New() + ..() + planet_virgo4 = src + weather_holder = new /datum/weather_holder/virgo4(src) + +/datum/planet/virgo4/update_sun() + ..() + var/datum/time/time = current_time + var/length_of_day = time.seconds_in_day / 10 / 60 / 60 + var/noon = length_of_day / 2 + var/distance_from_noon = abs(text2num(time.show_time("hh")) - noon) + sun_position = distance_from_noon / noon + sun_position = abs(sun_position - 1) + + var/low_brightness = null + var/high_brightness = null + + var/low_color = null + var/high_color = null + var/min = 0 + + switch(sun_position) + if(0 to 0.30) // Night + low_brightness = 0.1 + low_color = "#000066" + + high_brightness = 0.2 + high_color = "#66004D" + min = 0 + + if(0.30 to 0.40) // Twilight + low_brightness = 0.4 + low_color = "#66004D" + + high_brightness = 0.6 + high_color = "#CC3300" + min = 0.40 + + if(0.40 to 0.50) // Sunrise/set + low_brightness = 0.7 + low_color = "#CC3300" + + high_brightness = 0.9 + high_color = "#FF9933" + min = 0.50 + + if(0.50 to 1.00) // Noon + low_brightness = 1 + low_color = "#DDDDDD" + + high_brightness = 2 + high_color = "#FFFFFF" + min = 0.70 + + var/interpolate_weight = (abs(min - sun_position)) * 4 + var/weather_light_modifier = 1 + if(weather_holder && weather_holder.current_weather) + weather_light_modifier = weather_holder.current_weather.light_modifier + + var/new_brightness = (LERP(low_brightness, high_brightness, interpolate_weight) ) * weather_light_modifier + + var/new_color = null + if(weather_holder && weather_holder.current_weather && weather_holder.current_weather.light_color) + new_color = weather_holder.current_weather.light_color + else + var/list/low_color_list = hex2rgb(low_color) + var/low_r = low_color_list[1] + var/low_g = low_color_list[2] + var/low_b = low_color_list[3] + + var/list/high_color_list = hex2rgb(high_color) + var/high_r = high_color_list[1] + var/high_g = high_color_list[2] + var/high_b = high_color_list[3] + + var/new_r = LERP(low_r, high_r, interpolate_weight) + var/new_g = LERP(low_g, high_g, interpolate_weight) + var/new_b = LERP(low_b, high_b, interpolate_weight) + + new_color = rgb(new_r, new_g, new_b) + + spawn(1) + update_sun_deferred(2, new_brightness, new_color) + + +/datum/weather_holder/virgo4 + temperature = T0C + allowed_weather_types = list( + WEATHER_CLEAR = new /datum/weather/virgo4/clear(), + WEATHER_OVERCAST = new /datum/weather/virgo4/overcast(), + WEATHER_LIGHT_SNOW = new /datum/weather/virgo4/light_snow(), + WEATHER_SNOW = new /datum/weather/virgo4/snow(), + WEATHER_BLIZZARD = new /datum/weather/virgo4/blizzard(), + WEATHER_RAIN = new /datum/weather/virgo4/rain(), + WEATHER_STORM = new /datum/weather/virgo4/storm(), + WEATHER_HAIL = new /datum/weather/virgo4/hail(), + WEATHER_BLOOD_MOON = new /datum/weather/virgo4/blood_moon(), + WEATHER_EMBERFALL = new /datum/weather/virgo4/emberfall(), + WEATHER_ASH_STORM = new /datum/weather/virgo4/ash_storm(), + WEATHER_FALLOUT = new /datum/weather/virgo4/fallout() + ) + roundstart_weather_chances = list( + WEATHER_CLEAR = 50, + WEATHER_OVERCAST = 10, + WEATHER_RAIN = 1 + ) + +/datum/weather/virgo4 + name = "virgo4" + temp_high = 303.15 // 30c + temp_low = 298.15 // 25c + +/datum/weather/virgo4/clear + name = "clear" + transition_chances = list( + WEATHER_CLEAR = 60, + WEATHER_OVERCAST = 20) + transition_messages = list( + "The sky clears up.", + "The sky is visible.", + "The weather is calm." + ) + sky_visible = TRUE + observed_message = "The sky is clear." + +/datum/weather/virgo4/overcast + name = "overcast" + temp_high = 293.15 // 20c + temp_low = 288.15 // 15c + light_modifier = 0.8 + transition_chances = list( + WEATHER_CLEAR = 25, + WEATHER_OVERCAST = 50, + WEATHER_RAIN = 5 + ) + observed_message = "It is overcast, all you can see are clouds." + transition_messages = list( + "All you can see above are clouds.", + "Clouds cut off your view of the sky.", + "It's very cloudy." + ) + +/datum/weather/virgo4/light_snow + name = "light snow" + icon_state = "snowfall_light" + temp_high = 268.15 // -5c + temp_low = 263.15 // -10c + light_modifier = 0.7 + transition_chances = list( + WEATHER_LIGHT_SNOW = 100 + ) + observed_message = "It is snowing lightly." + transition_messages = list( + "Small snowflakes begin to fall from above.", + "It begins to snow lightly.", + ) + +/datum/weather/virgo4/snow + name = "moderate snow" + icon_state = "snowfall_med" + temp_high = 268.15 // -5c + temp_low = 263.15 // -10c + wind_high = 2 + wind_low = 0 + light_modifier = 0.5 + flight_failure_modifier = 5 + transition_chances = list( + WEATHER_LIGHT_SNOW = 100 + ) + observed_message = "It is snowing." + transition_messages = list( + "It's starting to snow.", + "The air feels much colder as snowflakes fall from above." + ) + outdoor_sounds_type = /datum/looping_sound/weather/outside_snow + indoor_sounds_type = /datum/looping_sound/weather/inside_snow + +/datum/weather/virgo4/snow/process_effects() + ..() + for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either + if(S.z in holder.our_planet.expected_z_levels) + for(var/dir_checked in cardinal) + var/turf/simulated/floor/T = get_step(S, dir_checked) + if(istype(T)) + if(istype(T, /turf/simulated/floor/outdoors) && prob(33)) + T.chill() + +/datum/weather/virgo4/blizzard + name = "blizzard" + icon_state = "snowfall_heavy" + temp_high = 268.15 // -5c + temp_low = 263.15 // -10c + wind_high = 4 + wind_low = 2 + light_modifier = 0.3 + flight_failure_modifier = 10 + transition_chances = list( + WEATHER_BLIZZARD = 100 + ) + observed_message = "A blizzard blows snow everywhere." + transition_messages = list( + "Strong winds howl around you as a blizzard appears.", + "It starts snowing heavily, and it feels extremly cold now." + ) + outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard + indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard + +/datum/weather/virgo4/blizzard/process_effects() + ..() + for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either + if(S.z in holder.our_planet.expected_z_levels) + for(var/dir_checked in cardinal) + var/turf/simulated/floor/T = get_step(S, dir_checked) + if(istype(T)) + if(istype(T, /turf/simulated/floor/outdoors) && prob(50)) + T.chill() + +/datum/weather/virgo4/rain + name = "rain" + icon_state = "rain" + temp_high = 288.15 // 15c + temp_low = 283.15 // 10c + wind_high = 2 + wind_low = 1 + light_modifier = 0.5 + effect_message = "Rain falls on you." + + transition_chances = list( + WEATHER_OVERCAST = 25, + WEATHER_RAIN = 50 + ) + observed_message = "It is raining." + transition_messages = list( + "The sky is dark, and rain falls down upon you." + ) + +/datum/weather/virgo4/rain/process_effects() + ..() + for(var/mob/living/L in living_mob_list) + if(L.z in holder.our_planet.expected_z_levels) + var/turf/T = get_turf(L) + if(!T.outdoors) + continue // They're indoors, so no need to rain on them. + + // If they have an open umbrella, it'll guard from rain + if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella)) + var/obj/item/weapon/melee/umbrella/U = L.get_active_hand() + if(U.open) + if(show_message) + to_chat(L, "Rain patters softly onto your umbrella.") + continue + else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella)) + var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand() + if(U.open) + if(show_message) + to_chat(L, "Rain patters softly onto your umbrella.") + continue + + L.water_act(1) + if(show_message) + to_chat(L, effect_message) + +/datum/weather/virgo4/storm + name = "storm" + icon_state = "storm" + wind_high = 4 + wind_low = 2 + light_modifier = 0.3 + flight_failure_modifier = 10 + effect_message = "Rain falls on you, drenching you in water." + + var/next_lightning_strike = 0 // world.time when lightning will strike. + var/min_lightning_cooldown = 5 SECONDS + var/max_lightning_cooldown = 1 MINUTE + observed_message = "An intense storm pours down over the region." + transition_messages = list( + "You feel intense winds hit you as the weather takes a turn for the worst.", + "Loud thunder is heard in the distance.", + "A bright flash heralds the approach of a storm." + ) + + + transition_chances = list( + WEATHER_STORM = 100 + ) + +/datum/weather/virgo4/storm/process_effects() + ..() + for(var/mob/living/L in living_mob_list) + if(L.z in holder.our_planet.expected_z_levels) + var/turf/T = get_turf(L) + if(!T.outdoors) + continue // They're indoors, so no need to rain on them. + + // If they have an open umbrella, it'll guard from rain + if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella)) + var/obj/item/weapon/melee/umbrella/U = L.get_active_hand() + if(U.open) + if(show_message) + to_chat(L, "Rain showers loudly onto your umbrella!") + continue + else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella)) + var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand() + if(U.open) + if(show_message) + to_chat(L, "Rain showers loudly onto your umbrella!") + continue + + + L.water_act(2) + if(show_message) + to_chat(L, effect_message) + + handle_lightning() + +// This gets called to do lightning periodically. +// There is a seperate function to do the actual lightning strike, so that badmins can play with it. +/datum/weather/virgo4/storm/proc/handle_lightning() + if(world.time < next_lightning_strike) + return // It's too soon to strike again. + next_lightning_strike = world.time + rand(min_lightning_cooldown, max_lightning_cooldown) + var/turf/T = pick(holder.our_planet.planet_floors) // This has the chance to 'strike' the sky, but that might be a good thing, to scare reckless pilots. + lightning_strike(T) + +/datum/weather/virgo4/hail + name = "hail" + icon_state = "hail" + light_modifier = 0.3 + flight_failure_modifier = 15 + timer_low_bound = 2 + timer_high_bound = 5 + effect_message = "The hail smacks into you!" + + transition_chances = list( + WEATHER_HAIL = 100 + ) + observed_message = "Ice is falling from the sky." + transition_messages = list( + "Ice begins to fall from the sky.", + "It begins to hail.", + "An intense chill is felt, and chunks of ice start to fall from the sky, towards you." + ) + +/datum/weather/virgo4/hail/process_effects() + ..() + for(var/humie in human_mob_list) + var/mob/living/carbon/human/H = humie + if(H.z in holder.our_planet.expected_z_levels) + var/turf/T = get_turf(H) + if(!T.outdoors) + continue // They're indoors, so no need to pelt them with ice. + + // If they have an open umbrella, it'll guard from hail + var/obj/item/weapon/melee/umbrella/U + if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella)) + U = H.get_active_hand() + else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella)) + U = H.get_inactive_hand() + if(U && U.open) + if(show_message) + to_chat(H, "Hail patters onto your umbrella.") + continue + + var/target_zone = pick(BP_ALL) + var/amount_blocked = H.run_armor_check(target_zone, "melee") + var/amount_soaked = H.get_armor_soak(target_zone, "melee") + + var/damage = rand(1,3) + + if(amount_blocked >= 30) + continue // No need to apply damage. Hardhats are 30. They should probably protect you from hail on your head. + //Voidsuits are likewise 40, and riot, 80. Clothes are all less than 30. + + if(amount_soaked >= damage) + continue // No need to apply damage. + + H.apply_damage(damage, BRUTE, target_zone, amount_blocked, amount_soaked, used_weapon = "hail") + if(show_message) + to_chat(H, effect_message) + +/datum/weather/virgo4/blood_moon + name = "blood moon" + light_modifier = 0.5 + light_color = "#FF0000" + temp_high = 293.15 // 20c + temp_low = 283.15 // 10c + flight_failure_modifier = 25 + transition_chances = list( + WEATHER_BLOODMOON = 100 + ) + observed_message = "Everything is red. Something really ominous is going on." + transition_messages = list( + "The sky turns blood red!" + ) + outdoor_sounds_type = /datum/looping_sound/weather/wind + indoor_sounds_type = /datum/looping_sound/weather/wind/indoors + +// Ash and embers fall forever, such as from a volcano or something. +/datum/weather/virgo4/emberfall + name = "emberfall" + icon_state = "ashfall_light" + light_modifier = 0.7 + light_color = "#880000" + temp_high = 293.15 // 20c + temp_low = 283.15 // 10c + flight_failure_modifier = 20 + transition_chances = list( + WEATHER_EMBERFALL = 100 + ) + observed_message = "Soot, ash, and embers float down from above." + transition_messages = list( + "Gentle embers waft down around you like grotesque snow." + ) + outdoor_sounds_type = /datum/looping_sound/weather/wind + indoor_sounds_type = /datum/looping_sound/weather/wind/indoors + +// Like the above but a lot more harmful. +/datum/weather/virgo4/ash_storm + name = "ash storm" + icon_state = "ashfall_heavy" + light_modifier = 0.1 + light_color = "#FF0000" + temp_high = 323.15 // 50c + temp_low = 313.15 // 40c + wind_high = 6 + wind_low = 3 + flight_failure_modifier = 50 + transition_chances = list( + WEATHER_ASH_STORM = 100 + ) + observed_message = "All that can be seen is black smoldering ash." + transition_messages = list( + "Smoldering clouds of scorching ash billow down around you!" + ) + // Lets recycle. + outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard + indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard + +/datum/weather/virgo4/ash_storm/process_effects() + ..() + for(var/thing in living_mob_list) + var/mob/living/L = thing + if(L.z in holder.our_planet.expected_z_levels) + var/turf/T = get_turf(L) + if(!T.outdoors) + continue // They're indoors, so no need to burn them with ash. + + L.inflict_heat_damage(rand(1, 3)) + + +// Totally radical. +/datum/weather/virgo4/fallout + name = "fallout" + icon_state = "fallout" + light_modifier = 0.7 + light_color = "#CCFFCC" + flight_failure_modifier = 30 + transition_chances = list( + WEATHER_FALLOUT = 100 + ) + observed_message = "Radioactive soot and ash rains down from the heavens." + transition_messages = list( + "Radioactive soot and ash start to float down around you, contaminating whatever they touch." + ) + outdoor_sounds_type = /datum/looping_sound/weather/wind + indoor_sounds_type = /datum/looping_sound/weather/wind/indoors + + // How much radiation a mob gets while on an outside tile. + var/direct_rad_low = RAD_LEVEL_LOW + var/direct_rad_high = RAD_LEVEL_MODERATE + + // How much radiation is bursted onto a random tile near a mob. + var/fallout_rad_low = RAD_LEVEL_HIGH + var/fallout_rad_high = RAD_LEVEL_VERY_HIGH + +/datum/weather/virgo4/fallout/process_effects() + ..() + for(var/thing in living_mob_list) + var/mob/living/L = thing + if(L.z in holder.our_planet.expected_z_levels) + irradiate_nearby_turf(L) + var/turf/T = get_turf(L) + if(!T.outdoors) + continue // They're indoors, so no need to irradiate them with fallout. + + L.rad_act(rand(direct_rad_low, direct_rad_high)) + +// This makes random tiles near people radioactive for awhile. +// Tiles far away from people are left alone, for performance. +/datum/weather/virgo4/fallout/proc/irradiate_nearby_turf(mob/living/L) + if(!istype(L)) + return + var/list/turfs = RANGE_TURFS(world.view, L) + var/turf/T = pick(turfs) // We get one try per tick. + if(!istype(T)) + return + if(T.outdoors) + SSradiation.radiate(T, rand(fallout_rad_low, fallout_rad_high)) + +/turf/unsimulated/wall/planetary/normal/virgo4 + name = "deep ocean" + alpha = 0 + +/obj/machinery/power/smes/buildable/offmap_spawn/empty/New() + ..(1) + charge = 0 + RCon = TRUE + input_level = input_level_max + output_level = output_level_max + input_attempt = TRUE \ No newline at end of file diff --git a/code/modules/power/cells/esoteric_cells.dm b/code/modules/power/cells/esoteric_cells.dm new file mode 100644 index 0000000000..b45c19a783 --- /dev/null +++ b/code/modules/power/cells/esoteric_cells.dm @@ -0,0 +1,74 @@ + +/obj/item/weapon/cell/spike + name = "modified power cell" + desc = "A modified power cell sitting in a highly conductive chassis." + origin_tech = list(TECH_POWER = 2) + icon_state = "spikecell" + maxcharge = 10000 + matter = list(DEFAULT_WALL_MATERIAL = 1000, MAT_GLASS = 80, MAT_SILVER = 100) + self_recharge = TRUE + charge_amount = 150 + +/obj/item/weapon/cell/spike/process() + ..() + + var/turf/Center = get_turf(src) + + var/shock_count = 0 + for(var/turf/T in range(Center, 1)) + + if(prob(round(charge / 250)) && charge >= (maxcharge / 4)) + + if(locate(/obj/effect/temporary_effect/pulse/staticshock) in T) + continue + + var/conductive = FALSE + + if(istype(T, /turf/simulated/wall)) + var/turf/simulated/wall/WT = T + + if(WT.material.conductive) + conductive = TRUE + else if(WT.girder_material.conductive) + conductive = TRUE + else if(WT.reinf_material && WT.reinf_material.conductive) + conductive = TRUE + + if(istype(T, /turf/simulated/floor)) + var/turf/simulated/floor/F = T + if(istype(F.flooring, /decl/flooring/reinforced)) + conductive = TRUE + + if(conductive) + shock_count += 1 + new /obj/effect/temporary_effect/pulse/staticshock(T) + + if(shock_count) + while(shock_count) + use(200) + shock_count-- + +/obj/effect/temporary_effect/pulse/staticshock + name = "electric field" + desc = "Caution: Do not touch." + pulses_remaining = 10 + pulse_delay = 2 SECONDS + icon_state = "blue_static" + +/obj/effect/temporary_effect/pulse/staticshock/on_pulse() + ..() + + for(var/mob/living/L in view(1, src)) + if(!issilicon(L) && prob(L.mob_size)) + var/obj/item/projectile/beam/shock/weak/P = new (get_turf(src)) + P.launch_projectile_from_turf(L, BP_TORSO) + + var/obj/item/weapon/plastique/C4 = locate() in get_turf(src) + + if(C4) + C4.visible_message("The current fries \the [C4]!") + + if(prob(10)) + C4.explode(get_turf(src)) + else + qdel(C4) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 41430bea38..8c888fee3e 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -261,3 +261,7 @@ agony = 15 eyeblur = 2 hitsound = 'sound/weapons/zapbang.ogg' + +/obj/item/projectile/beam/shock/weak + damage = 5 + agony = 10 diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index 667fe7e0a0..ab75e1d67c 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -1,3 +1,4 @@ + /datum/tgui_module/appearance_changer name = "Appearance Editor" tgui_id = "AppearanceChanger" @@ -24,6 +25,10 @@ var/camera_diff_y = -1 var/camera_diff_z = -1 + var/list/valid_earstyles = list() + var/list/valid_tailstyles = list() + var/list/valid_wingstyles = list() + /datum/tgui_module/appearance_changer/New( var/host, mob/living/carbon/human/H, @@ -68,6 +73,7 @@ qdel(cam_screen) QDEL_LIST(cam_plane_masters) qdel(cam_background) + cut_data() return ..() /datum/tgui_module/appearance_changer/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) @@ -84,22 +90,28 @@ if("race") if(can_change(APPEARANCE_RACE) && (params["race"] in valid_species)) if(target.change_species(params["race"])) - cut_and_generate_data() + cut_data() + generate_data(usr) + changed_hook(APPEARANCECHANGER_CHANGED_RACE) return 1 if("gender") if(can_change(APPEARANCE_GENDER) && (params["gender"] in get_genders())) if(target.change_gender(params["gender"])) - cut_and_generate_data() + cut_data() + generate_data(usr) + changed_hook(APPEARANCECHANGER_CHANGED_GENDER) return 1 if("gender_id") if(can_change(APPEARANCE_GENDER) && (params["gender_id"] in all_genders_define_list)) target.identifying_gender = params["gender_id"] + changed_hook(APPEARANCECHANGER_CHANGED_GENDER_ID) return 1 if("skin_tone") if(can_change_skin_tone()) var/new_s_tone = input(usr, "Choose your character's skin-tone:\n(Light 1 - 220 Dark)", "Skin Tone", -target.s_tone + 35) as num|null if(isnum(new_s_tone) && can_still_topic(usr, state)) new_s_tone = 35 - max(min( round(new_s_tone), 220),1) + changed_hook(APPEARANCECHANGER_CHANGED_SKINTONE) return target.change_skin_tone(new_s_tone) if("skin_color") if(can_change_skin_color()) @@ -110,11 +122,13 @@ var/b_skin = hex2num(copytext(new_skin, 6, 8)) if(target.change_skin_color(r_skin, g_skin, b_skin)) update_dna() + changed_hook(APPEARANCECHANGER_CHANGED_SKINCOLOR) return 1 if("hair") if(can_change(APPEARANCE_HAIR) && (params["hair"] in valid_hairstyles)) if(target.change_hair(params["hair"])) update_dna() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) return 1 if("hair_color") if(can_change(APPEARANCE_HAIR_COLOR)) @@ -125,11 +139,13 @@ var/b_hair = hex2num(copytext(new_hair, 6, 8)) if(target.change_hair_color(r_hair, g_hair, b_hair)) update_dna() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) return 1 if("facial_hair") if(can_change(APPEARANCE_FACIAL_HAIR) && (params["facial_hair"] in valid_facial_hairstyles)) if(target.change_facial_hair(params["facial_hair"])) update_dna() + changed_hook(APPEARANCECHANGER_CHANGED_F_HAIRSTYLE) return 1 if("facial_hair_color") if(can_change(APPEARANCE_FACIAL_HAIR_COLOR)) @@ -140,6 +156,7 @@ var/b_facial = hex2num(copytext(new_facial, 6, 8)) if(target.change_facial_hair_color(r_facial, g_facial, b_facial)) update_dna() + changed_hook(APPEARANCECHANGER_CHANGED_F_HAIRCOLOR) return 1 if("eye_color") if(can_change(APPEARANCE_EYE_COLOR)) @@ -150,10 +167,115 @@ var/b_eyes = hex2num(copytext(new_eyes, 6, 8)) if(target.change_eye_color(r_eyes, g_eyes, b_eyes)) update_dna() + changed_hook(APPEARANCECHANGER_CHANGED_EYES) return 1 + // VOREStation Add - Ears/Tails/Wings + if("ear") + if(can_change(APPEARANCE_ALL_HAIR)) + var/datum/sprite_accessory/ears/instance = locate(params["ref"]) + if(params["clear"]) + instance = null + if(!istype(instance) && !params["clear"]) + return FALSE + owner.ear_style = instance + owner.update_hair() + update_dna() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) + return TRUE + if("ears_color") + if(can_change(APPEARANCE_HAIR_COLOR)) + var/new_hair = input("Please select ear color.", "Ear Color", rgb(target.r_ears, target.g_ears, target.b_ears)) as color|null + if(new_hair && can_still_topic(usr, state)) + target.r_ears = hex2num(copytext(new_hair, 2, 4)) + target.g_ears = hex2num(copytext(new_hair, 4, 6)) + target.b_ears = hex2num(copytext(new_hair, 6, 8)) + update_dna() + owner.update_hair() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) + return 1 + if("ears2_color") + if(can_change(APPEARANCE_HAIR_COLOR)) + var/new_hair = input("Please select secondary ear color.", "2nd Ear Color", rgb(target.r_ears2, target.g_ears2, target.b_ears2)) as color|null + if(new_hair && can_still_topic(usr, state)) + target.r_ears2 = hex2num(copytext(new_hair, 2, 4)) + target.g_ears2 = hex2num(copytext(new_hair, 4, 6)) + target.b_ears2 = hex2num(copytext(new_hair, 6, 8)) + update_dna() + owner.update_hair() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) + return 1 + if("tail") + if(can_change(APPEARANCE_ALL_HAIR)) + var/datum/sprite_accessory/tail/instance = locate(params["ref"]) + if(params["clear"]) + instance = null + if(!istype(instance) && !params["clear"]) + return FALSE + owner.tail_style = instance + owner.update_tail_showing() + update_dna() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) + return TRUE + if("tail_color") + if(can_change(APPEARANCE_HAIR_COLOR)) + var/new_hair = input("Please select tail color.", "Tail Color", rgb(target.r_tail, target.g_tail, target.b_tail)) as color|null + if(new_hair && can_still_topic(usr, state)) + target.r_tail = hex2num(copytext(new_hair, 2, 4)) + target.g_tail = hex2num(copytext(new_hair, 4, 6)) + target.b_tail = hex2num(copytext(new_hair, 6, 8)) + update_dna() + owner.update_tail_showing() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) + return 1 + if("tail2_color") + if(can_change(APPEARANCE_HAIR_COLOR)) + var/new_hair = input("Please select secondary tail color.", "2nd Tail Color", rgb(target.r_tail2, target.g_tail2, target.b_tail2)) as color|null + if(new_hair && can_still_topic(usr, state)) + target.r_tail2 = hex2num(copytext(new_hair, 2, 4)) + target.g_tail2 = hex2num(copytext(new_hair, 4, 6)) + target.b_tail2 = hex2num(copytext(new_hair, 6, 8)) + update_dna() + owner.update_tail_showing() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) + return 1 + if("wing") + if(can_change(APPEARANCE_ALL_HAIR)) + var/datum/sprite_accessory/wing/instance = locate(params["ref"]) + if(params["clear"]) + instance = null + if(!istype(instance) && !params["clear"]) + return FALSE + owner.wing_style = instance + owner.update_wing_showing() + update_dna() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRSTYLE) + return TRUE + if("wing_color") + if(can_change(APPEARANCE_HAIR_COLOR)) + var/new_hair = input("Please select wing color.", "Wing Color", rgb(target.r_wing, target.g_wing, target.b_wing)) as color|null + if(new_hair && can_still_topic(usr, state)) + target.r_wing = hex2num(copytext(new_hair, 2, 4)) + target.g_wing = hex2num(copytext(new_hair, 4, 6)) + target.b_wing = hex2num(copytext(new_hair, 6, 8)) + update_dna() + owner.update_wing_showing() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) + return 1 + if("wing2_color") + if(can_change(APPEARANCE_HAIR_COLOR)) + var/new_hair = input("Please select secondary wing color.", "2nd Wing Color", rgb(target.r_wing2, target.g_wing2, target.b_wing2)) as color|null + if(new_hair && can_still_topic(usr, state)) + target.r_wing2 = hex2num(copytext(new_hair, 2, 4)) + target.g_wing2 = hex2num(copytext(new_hair, 4, 6)) + target.b_wing2 = hex2num(copytext(new_hair, 6, 8)) + update_dna() + owner.update_wing_showing() + changed_hook(APPEARANCECHANGER_CHANGED_HAIRCOLOR) + return 1 + // VOREStation Add End return FALSE -/datum/tgui_module/appearance_changer/tgui_interact(mob/user, datum/tgui/ui = null, datum/tgui/parent_ui = null, datum/tgui_state/custom_state = GLOB.tgui_default_state) +/datum/tgui_module/appearance_changer/tgui_interact(mob/user, datum/tgui/ui = null, datum/tgui/parent_ui = null, datum/tgui_state/custom_state) var/mob/living/carbon/human/target = owner if(customize_usr) if(!ishuman(user)) @@ -177,10 +299,39 @@ if(custom_state) ui.set_state(custom_state) +/datum/tgui_module/appearance_changer/tgui_static_data(mob/user) + var/list/data = ..() + + generate_data(usr) + + if(can_change(APPEARANCE_RACE)) + var/species[0] + for(var/specimen in valid_species) + species[++species.len] = list("specimen" = specimen) + data["species"] = species + + if(can_change(APPEARANCE_HAIR)) + var/hair_styles[0] + for(var/hair_style in valid_hairstyles) + hair_styles[++hair_styles.len] = list("hairstyle" = hair_style) + data["hair_styles"] = hair_styles + // VOREStation Add - Ears/Tails/Wings + data["ear_styles"] = valid_earstyles + data["tail_styles"] = valid_tailstyles + data["wing_styles"] = valid_wingstyles + // VOREStation Add End + + if(can_change(APPEARANCE_FACIAL_HAIR)) + var/facial_hair_styles[0] + for(var/facial_hair_style in valid_facial_hairstyles) + facial_hair_styles[++facial_hair_styles.len] = list("facialhairstyle" = facial_hair_style) + data["facial_hair_styles"] = facial_hair_styles + + return data + /datum/tgui_module/appearance_changer/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state) var/list/data = ..() - generate_data(check_whitelist, whitelist, blacklist) differential_check() var/mob/living/carbon/human/target = owner @@ -194,11 +345,6 @@ data["gender"] = target.gender data["gender_id"] = target.identifying_gender data["change_race"] = can_change(APPEARANCE_RACE) - if(data["change_race"]) - var/species[0] - for(var/specimen in valid_species) - species[++species.len] = list("specimen" = specimen) - data["species"] = species data["change_gender"] = can_change(APPEARANCE_GENDER) if(data["change_gender"]) @@ -213,30 +359,39 @@ data["change_hair"] = can_change(APPEARANCE_HAIR) if(data["change_hair"]) - var/hair_styles[0] - for(var/hair_style in valid_hairstyles) - hair_styles[++hair_styles.len] = list("hairstyle" = hair_style) - data["hair_styles"] = hair_styles data["hair_style"] = target.h_style + // VOREStation Add - Ears/Tails/Wings + data["ear_style"] = target.ear_style + data["tail_style"] = target.tail_style + data["wing_style"] = target.wing_style + // VOREStation Add End + data["change_facial_hair"] = can_change(APPEARANCE_FACIAL_HAIR) if(data["change_facial_hair"]) - var/facial_hair_styles[0] - for(var/facial_hair_style in valid_facial_hairstyles) - facial_hair_styles[++facial_hair_styles.len] = list("facialhairstyle" = facial_hair_style) - data["facial_hair_styles"] = facial_hair_styles data["facial_hair_style"] = target.f_style data["change_skin_tone"] = can_change_skin_tone() data["change_skin_color"] = can_change_skin_color() if(data["change_skin_color"]) data["skin_color"] = rgb(target.r_skin, target.g_skin, target.b_skin) + data["change_eye_color"] = can_change(APPEARANCE_EYE_COLOR) if(data["change_eye_color"]) data["eye_color"] = rgb(target.r_eyes, target.g_eyes, target.b_eyes) + data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR) if(data["change_hair_color"]) data["hair_color"] = rgb(target.r_hair, target.g_hair, target.b_hair) + // VOREStation Add - Ears/Tails/Wings + data["ears_color"] = rgb(target.r_ears, target.g_ears, target.b_ears) + data["ears2_color"] = rgb(target.r_ears2, target.g_ears2, target.b_ears2) + data["tail_color"] = rgb(target.r_tail, target.g_tail, target.b_tail) + data["tail2_color"] = rgb(target.r_tail2, target.g_tail2, target.b_tail2) + data["wing_color"] = rgb(target.r_wing, target.g_wing, target.b_wing) + data["wing2_color"] = rgb(target.r_wing2, target.g_wing2, target.b_wing2) + // VOREStation Add End + data["change_facial_hair_color"] = can_change(APPEARANCE_FACIAL_HAIR_COLOR) if(data["change_facial_hair_color"]) data["facial_hair_color"] = rgb(target.r_facial, target.g_facial, target.b_facial) @@ -315,26 +470,67 @@ return target && (flags & APPEARANCE_SKIN) && target.species.appearance_flags & HAS_SKIN_COLOR -/datum/tgui_module/appearance_changer/proc/cut_and_generate_data() +/datum/tgui_module/appearance_changer/proc/cut_data() // Making the assumption that the available species remain constant + valid_hairstyles.Cut() valid_facial_hairstyles.Cut() - valid_facial_hairstyles.Cut() - generate_data() + // VOREStation Add - Ears/Tails/Wings + valid_earstyles.Cut() + valid_tailstyles.Cut() + valid_wingstyles.Cut() + // VOREStation Add End -/datum/tgui_module/appearance_changer/proc/generate_data() +/datum/tgui_module/appearance_changer/proc/generate_data(mob/user) var/mob/living/carbon/human/target = owner if(customize_usr) - if(!ishuman(usr)) + if(!ishuman(user)) return TRUE - target = usr + target = user if(!target) return - if(!valid_species.len) + + if(!LAZYLEN(valid_species)) valid_species = target.generate_valid_species(check_whitelist, whitelist, blacklist) - if(!valid_hairstyles.len || !valid_facial_hairstyles.len) + + if(!LAZYLEN(valid_hairstyles) || !LAZYLEN(valid_facial_hairstyles)) valid_hairstyles = target.generate_valid_hairstyles(check_gender = 0) valid_facial_hairstyles = target.generate_valid_facial_hairstyles() + // VOREStation Add - Ears/Tails/Wings + if(!LAZYLEN(valid_earstyles)) + for(var/path in ear_styles_list) + var/datum/sprite_accessory/ears/instance = ear_styles_list[path] + if(can_use_sprite(instance, target, user)) + valid_earstyles.Add(list(list( + "name" = instance.name, + "instance" = REF(instance), + "color" = !!instance.do_colouration, + "second_color" = !!instance.extra_overlay, + ))) + + if(!LAZYLEN(valid_tailstyles)) + for(var/path in tail_styles_list) + var/datum/sprite_accessory/tail/instance = tail_styles_list[path] + if(can_use_sprite(instance, target, user)) + valid_tailstyles.Add(list(list( + "name" = instance.name, + "instance" = REF(instance), + "color" = !!instance.do_colouration, + "second_color" = !!instance.extra_overlay, + ))) + + if(!LAZYLEN(valid_wingstyles)) + for(var/path in wing_styles_list) + var/datum/sprite_accessory/wing/instance = wing_styles_list[path] + if(can_use_sprite(instance, target, user)) + valid_wingstyles.Add(list(list( + "name" = instance.name, + "instance" = REF(instance), + "color" = !!instance.do_colouration, + "second_color" = !!instance.extra_overlay, + ))) + // VOREStation Add End + /datum/tgui_module/appearance_changer/proc/get_genders() var/mob/living/carbon/human/target = owner if(customize_usr) @@ -349,10 +545,25 @@ possible_genders |= NEUTER return possible_genders +// Used for subtypes to handle messaging or whatever. +/datum/tgui_module/appearance_changer/proc/changed_hook(flag) + return + +// VOREStation Add - Ears/Tails/Wings +/datum/tgui_module/appearance_changer/proc/can_use_sprite(datum/sprite_accessory/X, mob/living/carbon/human/target, mob/user) + if(X.apply_restrictions && !(target.species.name in X.species_allowed)) + return FALSE + + if(LAZYLEN(X.ckeys_allowed) && !(user?.ckey in X.ckeys_allowed) && !(target.ckey in X.ckeys_allowed)) + return FALSE + + return TRUE +// VOREStation Add End + /datum/tgui_module/appearance_changer/mirror name = "SalonPro Nano-Mirror™" flags = APPEARANCE_ALL_HAIR customize_usr = TRUE /datum/tgui_module/appearance_changer/mirror/coskit - name = "SalonPro Porta-Makeover Deluxe™" \ No newline at end of file + name = "SalonPro Porta-Makeover Deluxe™" diff --git a/code/modules/tgui/modules/appearance_changer_vr.dm b/code/modules/tgui/modules/appearance_changer_vr.dm new file mode 100644 index 0000000000..93ee4cfdf2 --- /dev/null +++ b/code/modules/tgui/modules/appearance_changer_vr.dm @@ -0,0 +1,45 @@ +/datum/tgui_module/appearance_changer/vore + name = "Appearance Editor (Vore)" + flags = APPEARANCE_ALL + +/datum/tgui_module/appearance_changer/vore/tgui_state(mob/user) + return GLOB.tgui_conscious_state + +/datum/tgui_module/appearance_changer/vore/tgui_status(mob/user, datum/tgui_state/state) + if(!isbelly(owner.loc)) + return STATUS_CLOSE + return ..() + +/datum/tgui_module/appearance_changer/vore/reload_cameraview() + cam_screen.vis_contents = list(owner) + cam_background.icon_state = "clear" + cam_background.fill_rect(1, 1, 1, 1) + local_skybox.cut_overlays() + +/datum/tgui_module/appearance_changer/vore/tgui_close(mob/user) + . = ..() + QDEL_IN(src, 1) + +/datum/tgui_module/appearance_changer/vore/changed_hook(flag) + var/mob/living/carbon/human/M = owner + var/mob/living/O = usr + + switch(flag) + if(APPEARANCECHANGER_CHANGED_RACE) + to_chat(M, "You lose sensation of your body, feeling only the warmth of everything around you... ") + to_chat(O, "Your body shifts as you make dramatic changes to your captive's body.") + if(APPEARANCECHANGER_CHANGED_GENDER) + to_chat(M, "Your body feels very strange...") + to_chat(O, "You feel strange as you alter your captive's gender.") + if(APPEARANCECHANGER_CHANGED_GENDER_ID) + to_chat(M, "You start to feel... [capitalize(M.gender)]?") + to_chat(O, "You feel strange as you alter your captive's gender identity.") + if(APPEARANCECHANGER_CHANGED_SKINTONE, APPEARANCECHANGER_CHANGED_SKINCOLOR) + to_chat(M, "Your body tingles all over...") + to_chat(O, "You tingle as you make noticeable changes to your captive's body.") + if(APPEARANCECHANGER_CHANGED_HAIRSTYLE, APPEARANCECHANGER_CHANGED_HAIRCOLOR, APPEARANCECHANGER_CHANGED_F_HAIRSTYLE, APPEARANCECHANGER_CHANGED_F_HAIRCOLOR) + to_chat(M, "Your body tingles all over...") + to_chat(O, "You tingle as you make noticeable changes to your captive's body.") + if(APPEARANCECHANGER_CHANGED_EYES) + to_chat(M, "You feel lightheaded and drowsy...") + to_chat(O, "You feel warm as you make subtle changes to your captive's body.") \ No newline at end of file diff --git a/code/modules/vchat/css/ss13styles.css b/code/modules/vchat/css/ss13styles.css index 2766aaf8e4..e5ff0b1ebd 100644 --- a/code/modules/vchat/css/ss13styles.css +++ b/code/modules/vchat/css/ss13styles.css @@ -173,6 +173,7 @@ h1.alert, h2.alert {color: #000000;} .terminus {font-family: "Times New Roman", Times, serif, sans-serif} .interface {color: #330033;} .spacer {color: #9c660b;} /* VOREStation Add */ +.blob {color: #ff950d; font-weight: bold; font-style: italic;} /* YW Edit start */ .psionic {color: #993399;} .wingdings {font-family: Wingdings, Webdings} diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm index f60dd8df15..adcb66c180 100644 --- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm @@ -201,6 +201,7 @@ name = "SynthWolf dual-color (Taur)" icon_state = "synthwolf_s" extra_overlay = "synthwolf_markings" + extra_overlay2 = "synthwolf_glow" //icon_sprite_tag = "synthwolf" /datum/sprite_accessory/tail/taur/skunk @@ -275,6 +276,7 @@ name = "SynthHorse dual-color (Taur)" icon_state = "synthhorse_s" extra_overlay = "synthhorse_markings" + extra_overlay2 = "synthhorse_glow" //icon_sprite_tag = "synthhorse" /datum/sprite_accessory/tail/taur/cow @@ -336,6 +338,7 @@ name = "SynthLizard dual-color (Taur)" icon_state = "synthlizard_s" extra_overlay = "synthlizard_markings" + extra_overlay2 = "synthlizard_glow" //icon_sprite_tag = "synthlizard" /datum/sprite_accessory/tail/taur/spider @@ -422,6 +425,7 @@ name = "SynthFeline dual-color (Taur)" icon_state = "synthfeline_s" extra_overlay = "synthfeline_markings" + extra_overlay2 = "synthfeline_glow" //icon_sprite_tag = "synthfeline" /datum/sprite_accessory/tail/taur/slug diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 02a51e72c7..e26adabc82 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -42,6 +42,13 @@ // Ears avaliable to anyone +/datum/sprite_accessory/ears/alt_ram_horns + name = "Solid ram horns" + desc = "" + icon_state = "ram_horns_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/ears/hyena name = "hyena ears, dual-color" desc = "" @@ -2008,4 +2015,4 @@ desc = "" icon_state = "verie_hair_glow" ignores_lighting = 1 - //ckeys_allowed = list("vitoras") // This probably won't come into play EVER but better safe than sorry \ No newline at end of file + //ckeys_allowed = list("vitoras") // This probably won't come into play EVER but better safe than sorry diff --git a/code/modules/vore/eating/belly_dat_vr.dm b/code/modules/vore/eating/belly_dat_vr.dm index 01bda55389..2beec27ad6 100644 --- a/code/modules/vore/eating/belly_dat_vr.dm +++ b/code/modules/vore/eating/belly_dat_vr.dm @@ -31,8 +31,7 @@ var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off. var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest. - var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) // Possible digest modes - var/tmp/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) + var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_EGG) // Possible digest modes var/tmp/mob/living/owner // The mob whose belly this is. var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly! var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 9b1cbfd574..83118392e8 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -41,11 +41,9 @@ //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. //Actual full digest modes - var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) + var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_EGG) //Digest mode addon flags var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS, "Muffles" = DM_FLAG_THICKBELLY) - //Transformation modes - var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) //Item related modes var/tmp/static/list/item_digest_modes = list(IM_HOLD,IM_DIGEST_FOOD,IM_DIGEST) diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm index ae60740248..30fe4fd33a 100644 --- a/code/modules/vore/eating/bellymodes_datum_vr.dm +++ b/code/modules/vore/eating/bellymodes_datum_vr.dm @@ -129,132 +129,11 @@ GLOBAL_LIST_INIT(digest_modes, list()) B.owner.adjust_nutrition(-1) L.adjust_nutrition(1) -// TRANSFORM MODES -/datum/digest_mode/transform - var/stabilize_nutrition = FALSE - var/changes_eyes = FALSE - var/changes_hair_solo = FALSE - var/changes_hairandskin = FALSE - var/changes_gender = FALSE - var/changes_gender_to = null - var/changes_species = FALSE - var/changes_ears_tail_wing_nocolor = FALSE - var/changes_ears_tail_wing_color = FALSE - var/eggs = FALSE - -/datum/digest_mode/transform/process_mob(obj/belly/B, mob/living/carbon/human/H) - if(!istype(H) || H.stat == DEAD) - return null - if(stabilize_nutrition) - if(B.owner.nutrition > 400 && H.nutrition < 400) - B.owner.adjust_nutrition(-2) - H.adjust_nutrition(1.5) - var/datum/species/target_species = H.species - if(!((target_species.spawn_flags & SPECIES_IS_WHITELISTED) || (target_species.spawn_flags & SPECIES_IS_RESTRICTED))) - if(changes_eyes && B.check_eyes(H)) - B.change_eyes(H, 1) - return null - if(changes_hair_solo && B.check_hair(H)) - B.change_hair(H) - return null - if(changes_hairandskin && (B.check_hair(H) || B.check_skin(H))) - B.change_hair(H) - B.change_skin(H, 1) - return null - if(changes_species) - if(changes_ears_tail_wing_nocolor && (B.check_ears(H) || B.check_tail_nocolor(H) || B.check_wing_nocolor(H) || B.check_species(H))) - B.change_ears(H) - B.change_tail_nocolor(H) - B.change_wing_nocolor(H) - B.change_species(H, 1, 1) // ,1) preserves coloring - H.species.create_organs(H) - H.sync_organ_dna() - return null - if(changes_ears_tail_wing_color && (B.check_ears(H) || B.check_tail(H) || B.check_wing(H) || B.check_species(H))) - B.change_ears(H) - B.change_tail(H) - B.change_wing(H) - B.change_species(H, 1, 2) // ,2) does not preserve coloring. - H.species.create_organs(H) - H.sync_organ_dna() - return null - if(changes_gender && B.check_gender(H, changes_gender_to)) - B.change_gender(H, changes_gender_to, 1) - return null - if(eggs && (!H.absorbed)) - B.put_in_egg(H, 1) - return null - -// Regular TF Modes -/datum/digest_mode/transform/hairandeyes - id = DM_TRANSFORM_HAIR_AND_EYES - stabilize_nutrition = TRUE - changes_eyes = TRUE - changes_hair_solo = TRUE - -/datum/digest_mode/transform/gender - id = DM_TRANSFORM_FEMALE - changes_eyes = TRUE - changes_hairandskin = TRUE - changes_gender = TRUE - changes_gender_to = FEMALE - stabilize_nutrition = TRUE - -/datum/digest_mode/transform/gender/male - id = DM_TRANSFORM_FEMALE - changes_gender_to = MALE - -/datum/digest_mode/transform/keepgender - id = DM_TRANSFORM_KEEP_GENDER - changes_eyes = TRUE - changes_hairandskin = TRUE - stabilize_nutrition = TRUE - -/datum/digest_mode/transform/speciesandtaur - id = DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR - changes_species = TRUE - changes_ears_tail_wing_nocolor = TRUE - stabilize_nutrition = TRUE - -/datum/digest_mode/transform/replica - id = DM_TRANSFORM_REPLICA - changes_eyes = TRUE - changes_hairandskin = TRUE - changes_species = TRUE - changes_ears_tail_wing_color = TRUE - // E G G -/datum/digest_mode/transform/egg +/datum/digest_mode/egg id = DM_EGG - eggs = TRUE -/datum/digest_mode/transform/egg/gender - id = DM_TRANSFORM_FEMALE_EGG - changes_eyes = TRUE - changes_hairandskin = TRUE - changes_gender = TRUE - changes_gender_to = FEMALE - stabilize_nutrition = TRUE - -/datum/digest_mode/transform/egg/gender/male - id = DM_TRANSFORM_MALE_EGG - changes_gender_to = MALE - -/datum/digest_mode/transform/egg/nogender - id = DM_TRANSFORM_KEEP_GENDER_EGG - changes_eyes = TRUE - changes_hairandskin = TRUE - stabilize_nutrition = TRUE - -/datum/digest_mode/transform/egg/speciesandtaur - id = DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG - changes_species = TRUE - changes_ears_tail_wing_nocolor = TRUE - stabilize_nutrition = TRUE - -/datum/digest_mode/transform/egg/replica - id = DM_TRANSFORM_REPLICA_EGG - changes_eyes = TRUE - changes_hairandskin = TRUE - changes_species = TRUE - changes_ears_tail_wing_color = TRUE \ No newline at end of file +/datum/digest_mode/egg/process_mob(obj/belly/B, mob/living/carbon/human/H) + if(!istype(H) || H.stat == DEAD || H.absorbed) + return null + B.put_in_egg(H, 1) diff --git a/code/modules/vore/eating/transforming_vr.dm b/code/modules/vore/eating/transforming_vr.dm index 8f9eea2371..e8de8d466b 100644 --- a/code/modules/vore/eating/transforming_vr.dm +++ b/code/modules/vore/eating/transforming_vr.dm @@ -1,250 +1,3 @@ -/obj/belly/proc/check_eyes(var/mob/living/carbon/human/M) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return 0 - return (M.r_eyes != O.r_eyes || M.g_eyes != O.g_eyes || M.b_eyes != O.b_eyes) - -/obj/belly/proc/change_eyes(var/mob/living/carbon/human/M, message=0) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return - - M.r_eyes = O.r_eyes - M.g_eyes = O.g_eyes - M.b_eyes = O.b_eyes - M.update_eyes() - M.update_icons_body() - if(message) - to_chat(M, "You feel lightheaded and drowsy...") - to_chat(O, "You feel warm as you make subtle changes to your captive's body.") - -/obj/belly/proc/check_hair(var/mob/living/carbon/human/M) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return 0 - - if(M.r_hair != O.r_hair || M.g_hair != O.g_hair || M.b_hair != O.b_hair) - return 1 - if(M.r_facial != O.r_facial || M.g_facial != O.g_facial || M.b_facial != O.b_facial) - return 1 - if(M.h_style != O.h_style || M.f_style != O.f_style) - return 1 - return 0 - -/obj/belly/proc/change_hair(var/mob/living/carbon/human/M, message=0) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return - - M.r_hair = O.r_hair - M.g_hair = O.g_hair - M.b_hair = O.b_hair - M.r_facial = O.r_facial - M.g_facial = O.g_facial - M.b_facial = O.b_facial - M.h_style = O.h_style - M.f_style = O.f_style - M.update_hair() - if(message) - to_chat(M, "Your body tingles all over...") - to_chat(O, "You tingle as you make noticeable changes to your captive's body.") - -/obj/belly/proc/check_skin(var/mob/living/carbon/human/M) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return 0 - - return (M.r_skin != O.r_skin || M.g_skin != O.g_skin || M.b_skin != O.b_skin) - -/obj/belly/proc/change_skin(var/mob/living/carbon/human/M, message=0) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return - - M.r_skin = O.r_skin - M.g_skin = O.g_skin - M.b_skin = O.b_skin - for(var/obj/item/organ/external/Z in M.organs) - Z.sync_colour_to_human(M) - M.update_icons_body() - if(message) - to_chat(M, "Your body tingles all over...") - to_chat(O, "You tingle as you make noticeable changes to your captive's body.") - -/obj/belly/proc/check_gender(var/mob/living/carbon/human/M, target_gender) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return 0 - - if(!target_gender) - target_gender = O.gender - - return (M.gender != target_gender || M.identifying_gender != target_gender) - -/obj/belly/proc/change_gender(var/mob/living/carbon/human/M, target_gender, message=0) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return - - if(!target_gender) - target_gender = O.gender - - M.gender = target_gender - M.identifying_gender = target_gender - if(target_gender == FEMALE) - M.f_style = "Shaved" - M.dna.SetUIState(DNA_UI_GENDER,M.gender!=MALE,1) - M.sync_organ_dna() - M.update_icons_body() - if(message) - to_chat(M, "Your body feels very strange...") - to_chat(O, "You feel strange as you alter your captive's gender.") - -/obj/belly/proc/check_tail(var/mob/living/carbon/human/M) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return 0 - - if(M.tail_style != O.tail_style) - return 1 - if(M.r_tail != O.r_tail || M.g_tail != O.g_tail || M.b_tail != O.b_tail) - return 1 - return 0 - -/obj/belly/proc/change_tail(var/mob/living/carbon/human/M, message=0) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return - - M.r_tail = O.r_tail - M.g_tail = O.g_tail - M.b_tail = O.b_tail - M.tail_style = O.tail_style - M.update_tail_showing() - if(message) - to_chat(M, "Your body tingles all over...") - to_chat(O, "You tingle as you make noticeable changes to your captive's body.") - -/obj/belly/proc/check_tail_nocolor(var/mob/living/carbon/human/M) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return 0 - - return (M.tail_style != O.tail_style) - -/obj/belly/proc/change_tail_nocolor(var/mob/living/carbon/human/M, message=0) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return - - M.tail_style = O.tail_style - M.update_tail_showing() - if(message) - to_chat(M, "Your body tingles all over...") - to_chat(O, "You tingle as you make noticeable changes to your captive's body.") - -/obj/belly/proc/check_wing(var/mob/living/carbon/human/M) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return 0 - - if(M.wing_style != O.wing_style) - return 1 - if(M.r_wing != O.r_wing || M.g_wing != O.g_wing || M.b_wing != O.b_wing) - return 1 - return 0 - -/obj/belly/proc/change_wing(var/mob/living/carbon/human/M, message=0) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return - - M.r_wing = O.r_wing - M.g_wing = O.g_wing - M.b_wing = O.b_wing - M.wing_style = O.wing_style - M.update_wing_showing() - if(message) - to_chat(M, "Your body tingles all over...") - to_chat(O, "You tingle as you make noticeable changes to your captive's body.") - -/obj/belly/proc/check_wing_nocolor(var/mob/living/carbon/human/M) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return 0 - - return (M.wing_style != O.wing_style) - -/obj/belly/proc/change_wing_nocolor(var/mob/living/carbon/human/M, message=0) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return - - M.wing_style = O.wing_style - M.update_wing_showing() - if(message) - to_chat(M, "Your body tingles all over...") - to_chat(O, "You tingle as you make noticeable changes to your captive's body.") - -/obj/belly/proc/check_ears(var/mob/living/carbon/human/M) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return 0 - - return (M.ear_style != O.ear_style) - -/obj/belly/proc/change_ears(var/mob/living/carbon/human/M, message=0) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return - - M.ear_style = O.ear_style - M.update_hair() - -/obj/belly/proc/check_species(var/mob/living/carbon/human/M) - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return 0 - - if(M.species.name != O.species.name || M.custom_species != O.custom_species) - return 1 - return 0 - -/obj/belly/proc/change_species(var/mob/living/carbon/human/M, message=0, color_action = 0) //color_action: 0 for default species, 1 to preserve, 2 to transfer from pred - var/mob/living/carbon/human/O = owner - if(!istype(M) || !istype(O)) - return - - M.verbs -= M.species.inherent_verbs //Take away their unique stuff - - var/list/backup_implants = list() - for(var/obj/item/organ/I in M.organs) - for(var/obj/item/weapon/implant/backup/BI in I.contents) - backup_implants += BI - if(backup_implants.len) - for(var/obj/item/weapon/implant/backup/BI in backup_implants) - BI.forceMove(src) - if(color_action == 1) - M.set_species(O.species.name,0,1,M) - else if(color_action == 2) - M.species = O.species - else - M.set_species(O.species.name) - M.custom_species = O.custom_species - - M.update_icons_body() - M.update_tail_showing() - - if(backup_implants.len) - var/obj/item/organ/external/torso = M.get_organ(BP_TORSO) - for(var/obj/item/weapon/implant/backup/BI in backup_implants) - BI.forceMove(torso) - torso.implants += BI - - if(message) - to_chat(M, "You lose sensation of your body, feeling only the warmth of everything around you... ") - to_chat(O, "Your body shifts as you make dramatic changes to your captive's body.") - /obj/belly/proc/put_in_egg(var/atom/movable/M, message=0) var/mob/living/carbon/human/O = owner var/egg_path = /obj/structure/closet/secure_closet/egg diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 00b4ac3c87..f654009726 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -509,8 +509,10 @@ var/atom/movable/target = locate(params["pick"]) if(!(target in host.vore_selected)) return TRUE // Not in our X anymore, update UI - intent = "Examine" - intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move") + var/list/available_options = list("Examine", "Eject", "Move") + if(ishuman(target)) + available_options += "Transform" + intent = input(user, "What would you like to do with [target]?", "Vore Pick", "Examine") as null|anything in available_options switch(intent) if("Examine") var/list/results = target.examine(host) @@ -525,6 +527,7 @@ return TRUE host.vore_selected.release_specific_contents(target) + return TRUE if("Move") if(host.stat) @@ -537,6 +540,20 @@ to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to their [lowertext(choice.name)]!") host.vore_selected.transfer_contents(target, choice) + return TRUE + + if("Transform") + if(host.stat) + to_chat(user,"You can't do that in your state!") + return TRUE + + var/mob/living/carbon/human/H = target + if(!istype(H)) + return + + var/datum/tgui_module/appearance_changer/vore/V = new(host, H) + V.tgui_interact(user) + return TRUE /datum/vore_look/proc/set_attr(mob/user, params) if(!host.vore_selected) @@ -573,21 +590,10 @@ . = TRUE if("b_mode") var/list/menu_list = host.vore_selected.digest_modes.Copy() - if(istype(usr,/mob/living/carbon/human)) - menu_list += DM_TRANSFORM - var/new_mode = input("Choose Mode (currently [host.vore_selected.digest_mode])") as null|anything in menu_list if(!new_mode) return FALSE - if(new_mode == DM_TRANSFORM) //Snowflek submenu - var/list/tf_list = host.vore_selected.transform_modes - var/new_tf_mode = input("Choose TF Mode (currently [host.vore_selected.digest_mode])") as null|anything in tf_list - if(!new_tf_mode) - return FALSE - host.vore_selected.digest_mode = new_tf_mode - return - host.vore_selected.digest_mode = new_mode . = TRUE if("b_addons") diff --git a/code/stylesheet.dm b/code/stylesheet.dm index fdd63290e7..5c88b8c7cc 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -67,7 +67,11 @@ em {font-style: normal;font-weight: bold;} h1.alert, h2.alert {color: #000000;} .ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} -.emote {font-style: italic;} + +// VOREStation Edit Start +.emote {} +.emote_subtle {font-style: italic;} +// VOREStation Edit End /* Game Messages */ @@ -111,7 +115,8 @@ h1.alert, h2.alert {color: #000000;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .terminus {font-family: "Times New Roman", Times, serif, sans-serif} .interface {color: #330033;} -.spacer {color: #9c660b;} +.spacer {color: #9c660b;} /* VOREStation Add */ +.blob {color: #ff950d; font-weight: bold; font-style: italic;} .psionic {color: #993399;} /*YWedit*/ BIG IMG.icon {width: 32px; height: 32px;} diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index 881927aa78..7562e69c56 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -23,6 +23,7 @@ flurriee - Protean funnyman2003 - Xenochimera hawkerthegreat - Vox hollifex - Diona +h0lysquirr3l - Protean inuzari - Diona jademanique - Xenochimera khanivore - Protean @@ -80,4 +81,3 @@ xioen - Xenochimera xonkon - Protean zalvine - Shadekin Empathy zammyman215 - Vox - diff --git a/html/changelogs/Cerebulon - machinesounds.yml b/html/changelogs/Cerebulon - machinesounds.yml index c6bfbfeaa3..fee9629a4f 100644 --- a/html/changelogs/Cerebulon - machinesounds.yml +++ b/html/changelogs/Cerebulon - machinesounds.yml @@ -1,36 +1,4 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. author: Cerebulon - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - soundadd: "Added button sounds to various machines." diff --git a/html/changelogs/KasparoVy - PR - 7760.yml b/html/changelogs/KasparoVy - PR - 7760.yml index c4569eead3..44df74a4a5 100644 --- a/html/changelogs/KasparoVy - PR - 7760.yml +++ b/html/changelogs/KasparoVy - PR - 7760.yml @@ -1,37 +1,5 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. author: KasparoVy - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - imageadd: Adds orange Teshari goggles, selectable in the loadout. - imageadd: Adds blindfold & new white (recolorable) blindfold to loadout. @@ -42,4 +10,4 @@ changes: - rscadd: Adds a bunch of Teshari worksuits (sprites already existed). - imageadd: Adds some species-fitted Teshari jacket accessories (tan, charcoal, navy, burgundy, checkered). - tweak: Updates all Teshari undercoats and cloaks with new sprites from downstreams. - - fix: Fixes Teshari captain glove sprites. + - bugfix: Fixes Teshari captain glove sprites. diff --git a/html/changelogs/Mechoid - Encumbrance.yml b/html/changelogs/Mechoid - Encumbrance.yml index f013a3bcad..4c735bd9de 100644 --- a/html/changelogs/Mechoid - Encumbrance.yml +++ b/html/changelogs/Mechoid - Encumbrance.yml @@ -1,36 +1,4 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. author: Mechoid - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - rscadd: "Added system for exosuit over-encumbrance. Combat mechs and Ripleys have higher than default." diff --git a/html/changelogs/Meghan Rossi - the_teslagen.yml b/html/changelogs/Meghan Rossi - the_teslagen.yml index ee59d5663e..efa9d81ba4 100644 --- a/html/changelogs/Meghan Rossi - the_teslagen.yml +++ b/html/changelogs/Meghan Rossi - the_teslagen.yml @@ -1,4 +1,4 @@ author: Meghan-Rossi delete-after: True changes: - - rscadd: "The Tesla Generator is now available from cargo. Coils and grounding rods for it may be printed on the protolathe and autolathe, respectively." \ No newline at end of file + - rscadd: "The Tesla Generator is now available from cargo. Coils and grounding rods for it may be printed on the protolathe and autolathe, respectively." \ No newline at end of file diff --git a/html/changelogs/Runa Dacino - Exosuit gripper tweak.yml b/html/changelogs/Runa Dacino - Exosuit gripper tweak.yml index fc17d241d0..7a8539afce 100644 --- a/html/changelogs/Runa Dacino - Exosuit gripper tweak.yml +++ b/html/changelogs/Runa Dacino - Exosuit gripper tweak.yml @@ -1,37 +1,5 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: N3X15 - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +author: RunaDacino delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - rscadd: "Enabled research borgs equipped with 'exosuit gripper' to be able to replace internal exosuit parts like actuators, to upgrade or to repair" diff --git a/html/changelogs/SubberTheFabulous-PR-7642.yml b/html/changelogs/SubberTheFabulous-PR-7642.yml index 23864c64b0..a816794d44 100644 --- a/html/changelogs/SubberTheFabulous-PR-7642.yml +++ b/html/changelogs/SubberTheFabulous-PR-7642.yml @@ -1,36 +1,4 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. author: Subber - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - rscadd: "Added two new antag augments to traitor uplink: armblade and handblade." diff --git a/html/changelogs/Woodrat - Vote.yml b/html/changelogs/Woodrat - Vote.yml index 78317ec750..872c80edfa 100644 --- a/html/changelogs/Woodrat - Vote.yml +++ b/html/changelogs/Woodrat - Vote.yml @@ -1,36 +1,4 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. author: Woodrat - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - tweak: "Changes vote notification sound to that of World Server in order to help people realize there is a vote occurring." diff --git a/html/changelogs/mechoid - butchery.yml b/html/changelogs/mechoid - butchery.yml index 433bf787e7..598b574356 100644 --- a/html/changelogs/mechoid - butchery.yml +++ b/html/changelogs/mechoid - butchery.yml @@ -34,4 +34,4 @@ delete-after: True # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - rscadd: "Animals can be butchered for organs and hide. Requires scraping (sharp), washing (water or washing machine), and then drying (bonfire or drying rack)." - - rscadd: "Organs can be butchered for meat, named "[organ] meat". Heart meat, liver meat, etc. Brains from player mobs cannot be butchered." + - rscadd: "Organs can be butchered for meat, named \"[organ] meat\". Heart meat, liver meat, etc. Brains from player mobs cannot be butchered." diff --git a/html/changelogs/mechoid - hydroupkeep.yml b/html/changelogs/mechoid - hydroupkeep.yml index 66b4cea214..023ba1495e 100644 --- a/html/changelogs/mechoid - hydroupkeep.yml +++ b/html/changelogs/mechoid - hydroupkeep.yml @@ -1,37 +1,5 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. author: Mechoid - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - rscadd: "Adds Wurmwoad, a suspiciously worm-like plant that produces pods of spice." - rscadd: "Adds Wurmwoad to the service borg synthesizer." diff --git a/icons/_nanomaps/tether_nanomap_z7.png b/icons/_nanomaps/tether_nanomap_z7.png index 0f5d0d3a8e..c404e1da35 100644 Binary files a/icons/_nanomaps/tether_nanomap_z7.png and b/icons/_nanomaps/tether_nanomap_z7.png differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index e8905467f6..f578e1f9ac 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mob/head_vr.dmi b/icons/mob/head_vr.dmi index 8823243859..7de7448cc3 100644 Binary files a/icons/mob/head_vr.dmi and b/icons/mob/head_vr.dmi differ diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 2071c634d1..75ba00f026 100644 Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ diff --git a/icons/mob/vore/ears_vr.dmi b/icons/mob/vore/ears_vr.dmi index 14f46e0926..6c259ad558 100644 Binary files a/icons/mob/vore/ears_vr.dmi and b/icons/mob/vore/ears_vr.dmi differ diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi index 7bc343655a..a724ddd57d 100644 Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ diff --git a/icons/mob/vore64x32.dmi b/icons/mob/vore64x32.dmi index 2dde6000ff..62fe533917 100644 Binary files a/icons/mob/vore64x32.dmi and b/icons/mob/vore64x32.dmi differ diff --git a/icons/mob/widerobot_vr.dmi b/icons/mob/widerobot_vr.dmi index da8c07762b..953a3cc630 100644 Binary files a/icons/mob/widerobot_vr.dmi and b/icons/mob/widerobot_vr.dmi differ diff --git a/icons/mob/wolfpelt_vr.dmi b/icons/mob/wolfpelt_vr.dmi new file mode 100644 index 0000000000..263c7ec018 Binary files /dev/null and b/icons/mob/wolfpelt_vr.dmi differ diff --git a/icons/obj/clothing/hats_vr.dmi b/icons/obj/clothing/hats_vr.dmi index 5f8969553e..0ba51d18e7 100644 Binary files a/icons/obj/clothing/hats_vr.dmi and b/icons/obj/clothing/hats_vr.dmi differ diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index c7b1fe5787..3f1fd1b792 100644 Binary files a/icons/obj/decals.dmi and b/icons/obj/decals.dmi differ diff --git a/icons/obj/decals_directions.dmi b/icons/obj/decals_directions.dmi new file mode 100644 index 0000000000..6b6ddf5283 Binary files /dev/null and b/icons/obj/decals_directions.dmi differ diff --git a/icons/obj/food_custom.dmi b/icons/obj/food_custom.dmi index ee26eb7777..e8be40f76d 100644 Binary files a/icons/obj/food_custom.dmi and b/icons/obj/food_custom.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 732bb44e00..c806ec99be 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/sandbags.dmi b/icons/obj/sandbags.dmi new file mode 100644 index 0000000000..0a5c24598a Binary files /dev/null and b/icons/obj/sandbags.dmi differ diff --git a/icons/obj/trap.dmi b/icons/obj/trap.dmi new file mode 100644 index 0000000000..108bc46726 Binary files /dev/null and b/icons/obj/trap.dmi differ diff --git a/maps/expedition_vr/beach/_beach.dm b/maps/expedition_vr/beach/_beach.dm index c82f8d2c29..fdd52402d9 100644 --- a/maps/expedition_vr/beach/_beach.dm +++ b/maps/expedition_vr/beach/_beach.dm @@ -139,16 +139,14 @@ /area/tether_away/beach name = "\improper Away Mission - Virgo 4 Beach" icon_state = "away" - base_turf = /turf/simulated/floor/beach/sand //This is what the ground turns into if destroyed/bombed/etc - //Not going to do sunlight simulations here like virgo3b - //So we just make the whole beach fullbright all the time - dynamic_lighting = 0 - requires_power = 0 + base_turf = /turf/simulated/floor/beach/sand/outdoors //This is what the ground turns into if destroyed/bombed/etc + dynamic_lighting = 1 + requires_power = 1 /area/tether_away/beach/powershed name = "\improper Away Mission - Virgo 4 Coast PS" icon_state = "blue2" - base_turf = /turf/simulated/floor/beach/sand + base_turf = /turf/simulated/floor/beach/sand/outdoors /area/tether_away/beach/coast name = "\improper Away Mission - Virgo 4 Coast" @@ -163,7 +161,47 @@ /area/tether_away/beach/jungle name = "\improper Away Mission - Virgo 4 Desert" icon_state = "green" - base_turf = /turf/simulated/floor/beach/sand/desert + base_turf = /turf/simulated/floor/beach/sand/desert/outdoors + +/area/tether_away/beach/resort + icon = 'icons/turf/areas_vr.dmi' + icon_state = "yellow" + base_turf = /turf/simulated/floor/beach/sand/outdoors + +/area/tether_away/beach/resort/kitchen + name = "\improper Away Mission - Virgo 4 Kitchen" + icon_state = "grewhicir" + +/area/tether_away/beach/resort/lockermed + name = "\improper Away Mission - Virgo 4 Utility Pavilion" + icon_state = "cyawhicir" + +/area/tether_away/beach/resort/janibar + name = "\improper Away Mission - Virgo 4 Bar" + icon_state = "purwhicir" + +/area/tether_away/beach/resort/dorm1 + name = "\improper Away Mission - Virgo 4 Private Room 1" + icon_state = "bluwhicir" + flags = RAD_SHIELDED +/area/tether_away/beach/resort/dorm2 + name = "\improper Away Mission - Virgo 4 Private Room 2" + icon_state = "bluwhicir" + flags = RAD_SHIELDED +/area/tether_away/beach/resort/dorm3 + name = "\improper Away Mission - Virgo 4 Private Room 3" + icon_state = "bluwhicir" + flags = RAD_SHIELDED +/area/tether_away/beach/resort/dorm4 + name = "\improper Away Mission - Virgo 4 Private Room 4" + icon_state = "bluwhicir" + flags = RAD_SHIELDED + +/area/tether_away/beach/cavebase + name = "\improper Away Mission - Virgo 4 Mysterious Cave" + icon = 'icons/turf/areas_vr.dmi' + icon_state = "orawhicir" + flags = RAD_SHIELDED //Some areas for the cave, which are referenced by our init object to seed submaps and ores /area/tether_away/cave diff --git a/maps/expedition_vr/beach/beach.dmm b/maps/expedition_vr/beach/beach.dmm index 3d3f03a476..3efcfc0c10 100644 --- a/maps/expedition_vr/beach/beach.dmm +++ b/maps/expedition_vr/beach/beach.dmm @@ -1,39 +1,44 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "aa" = ( -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach/jungle) "ab" = ( /obj/effect/overlay/palmtree_r, -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach/jungle) "ac" = ( /obj/effect/overlay/palmtree_l, -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach/jungle) "ad" = ( -/turf/simulated/floor/beach/sand, -/area/tether_away/beach) +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/kitchen) "ae" = ( -/obj/structure/frame, -/turf/simulated/floor/tiled/asteroid_steel, -/area/tether_away/beach) +/turf/simulated/floor/outdoors/grass, +/area/tether_away/beach/jungle) "af" = ( -/obj/item/frame/apc, -/turf/simulated/floor/tiled/asteroid_steel, -/area/tether_away/beach) +/obj/structure/grille, +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor, +/area/tether_away/beach/powershed) "ag" = ( /obj/structure/table/woodentable, /obj/item/weapon/cell/apc, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "ah" = ( -/obj/item/stack/cable_coil, -/turf/simulated/floor/beach/sand, -/area/tether_away/beach) +/obj/structure/grille, +/obj/structure/window/reinforced/full, +/turf/simulated/floor, +/area/tether_away/beach/resort/kitchen) "ai" = ( -/obj/machinery/power/port_gen/pacman/mrs, -/turf/simulated/floor/beach/sand, -/area/tether_away/beach) +/obj/effect/overlay/palmtree_r, +/turf/simulated/floor/outdoors/grass, +/area/tether_away/beach/jungle) "aj" = ( /turf/simulated/floor/water/beach, /area/tether_away/beach) @@ -42,281 +47,250 @@ /area/tether_away/beach/coast) "al" = ( /turf/simulated/floor/tiled/asteroid_steel, -/area/tether_away/beach) +/area/tether_away/beach/resort/lockermed) "am" = ( /turf/simulated/floor/water/deep/ocean, /area/tether_away/beach/water) "an" = ( -/obj/effect/overlay/palmtree_r, -/turf/simulated/floor/beach/sand, -/area/tether_away/beach) +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/jungle) "ao" = ( -/obj/effect/overlay/coconut, -/turf/simulated/floor/beach/sand, -/area/tether_away/beach) +/obj/structure/simple_door/wood, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/janibar) "ap" = ( /obj/effect/overlay/palmtree_r, /turf/simulated/floor/water/beach/corner{ - icon_state = "beachcorner"; - dir = 8 + dir = 8; + icon_state = "beachcorner" }, /area/tether_away/beach/jungle) "aq" = ( /turf/simulated/wall/wood, /area/tether_away/beach) "ar" = ( -/turf/simulated/wall/sandstone, -/area/tether_away/beach) +/turf/simulated/floor/wood{ + outdoors = 1 + }, +/area/tether_away/beach/resort) "as" = ( -/obj/structure/undies_wardrobe{ - density = 0; - pixel_x = 0; - pixel_y = 18 - }, +/obj/structure/table/bench/sifwooden/padded, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/kitchen) "at" = ( -/obj/structure/closet/cabinet{ - density = 0; - pixel_y = 20; - wall_mounted = 1 +/obj/machinery/light/small{ + dir = 8 }, -/turf/simulated/floor/wood, -/area/tether_away/beach) +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) "au" = ( -/obj/machinery/computer/security/telescreen/entertainment{ - pixel_y = 32 - }, -/turf/simulated/floor/wood, -/area/tether_away/beach) +/turf/simulated/floor/outdoors/grass/forest, +/area/tether_away/beach/jungle) "av" = ( -/obj/item/weapon/reagent_containers/food/drinks/bottle/wine, -/obj/item/weapon/reagent_containers/food/drinks/bottle/rum, -/obj/structure/table/woodentable, -/turf/simulated/floor/wood, -/area/tether_away/beach) +/turf/simulated/floor/outdoors/grass{ + outdoors = 0 + }, +/area/tether_away/beach/jungle) "aw" = ( /turf/simulated/floor/wood, /area/tether_away/beach) "ax" = ( -/obj/machinery/button/remote/airlock{ - id = "BaristoLoveShack"; - name = "Door Bolt Control"; - pixel_x = 25; - pixel_y = 0; - specialfunctions = 4 +/turf/simulated/mineral/floor/cave{ + name = "dirt"; + outdoors = 1 }, -/obj/item/weapon/bedsheet/rainbow, -/obj/structure/bed, -/turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/jungle) "ay" = ( -/obj/structure/toilet{ - pixel_y = 8 - }, -/turf/simulated/floor/wood, -/area/tether_away/beach) -"az" = ( -/obj/structure/mirror{ - pixel_y = 28 - }, -/turf/simulated/floor/wood, -/area/tether_away/beach) +/obj/structure/table/glass, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) "aA" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "BaristoLoveShack"; - name = "Baristo's Love Shack" - }, -/turf/simulated/floor/wood, -/area/tether_away/beach) +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/under/swimsuit/earth, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) "aB" = ( /obj/structure/simple_door/wood, /turf/simulated/floor/wood, /area/tether_away/beach) "aC" = ( -/obj/machinery/button/remote/airlock{ - id = "Changing1"; - name = "Door Bolt Control"; - pixel_x = 25; - pixel_y = 0; - specialfunctions = 4 - }, -/turf/simulated/floor/wood, -/area/tether_away/beach) +/obj/effect/overlay/palmtree_l, +/turf/simulated/floor/outdoors/grass, +/area/tether_away/beach/jungle) "aD" = ( -/obj/machinery/button/remote/airlock{ - id = "Changing2"; - name = "Door Bolt Control"; - pixel_x = 25; - pixel_y = 0; - specialfunctions = 4 - }, -/turf/simulated/floor/wood, -/area/tether_away/beach) +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) "aE" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "Changing1"; - name = "Changing Room 1" - }, +/obj/machinery/media/jukebox, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/kitchen) "aF" = ( -/obj/machinery/door/airlock/sandstone{ - id_tag = "Changing2"; - name = "Changing Room 2" - }, -/turf/simulated/floor/wood, -/area/tether_away/beach) +/obj/machinery/portable_atmospherics/hydroponics, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) "aG" = ( /obj/structure/bedsheetbin{ pixel_y = -6 }, -/turf/simulated/floor/tiled/asteroid_steel, -/area/tether_away/beach) +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) "aH" = ( /obj/item/clothing/shoes/sandal, /obj/item/clothing/shoes/sandal, /obj/item/clothing/shoes/sandal, /obj/structure/closet/crate, -/turf/simulated/floor/tiled/asteroid_steel, -/area/tether_away/beach) +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) "aI" = ( /obj/structure/closet/athletic_mixed, -/turf/simulated/floor/tiled/asteroid_steel, -/area/tether_away/beach) +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) "aJ" = ( /obj/structure/sign/double/barsign, /turf/simulated/wall/sandstone, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aK" = ( /obj/structure/closet/gmcloset{ name = "formal wardrobe" }, +/obj/machinery/light{ + dir = 8 + }, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aL" = ( /obj/structure/closet/secure_closet/bar, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aM" = ( /obj/structure/table/woodentable, /obj/item/weapon/book/manual/barman_recipes, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aN" = ( /obj/structure/table/woodentable, -/obj/item/weapon/reagent_containers/food/drinks/shaker, +/obj/machinery/chemical_dispenser/bar_soft/full, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aO" = ( /obj/structure/table/woodentable, -/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer, +/obj/machinery/chemical_dispenser/bar_coffee/full, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aP" = ( /obj/structure/table/woodentable, -/obj/item/clothing/glasses/sunglasses, -/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer, +/obj/machinery/chemical_dispenser/bar_alc/full, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aQ" = ( /obj/machinery/vending/boozeomat{ emagged = 1; req_access = newlist() }, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aR" = ( /obj/machinery/vending/cigarette, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aS" = ( /obj/machinery/vending/cola, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aT" = ( /obj/machinery/vending/snack, +/obj/machinery/light{ + dir = 4 + }, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aU" = ( /obj/structure/table/woodentable, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aV" = ( /obj/structure/table/woodentable, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aW" = ( /obj/structure/table/woodentable, /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle, /turf/simulated/floor/wood, -/area/tether_away/beach) +/area/tether_away/beach/resort/janibar) "aX" = ( /obj/item/weapon/stool/padded, -/turf/simulated/floor/tiled/asteroid_steel, -/area/tether_away/beach) +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) "aY" = ( /obj/structure/bed/double/padded, /obj/item/weapon/bedsheet/greendouble, /turf/simulated/floor/wood, /area/tether_away/beach) -"aZ" = ( -/obj/effect/overlay/palmtree_l, -/turf/simulated/floor/beach/sand, -/area/tether_away/beach) "ba" = ( -/turf/unsimulated/wall/planetary/normal, +/turf/simulated/mineral/ignore_mapgen, /area/tether_away/beach) "bb" = ( /obj/structure/bed/chair, -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach) "bc" = ( /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle, -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach) "bd" = ( /obj/item/weapon/beach_ball, -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach) "be" = ( /obj/item/clothing/head/collectable/paper, -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach) "bf" = ( /turf/simulated/floor/water/ocean, /area/tether_away/beach/water) "bg" = ( -/turf/unsimulated/wall/planetary/normal, +/turf/simulated/mineral/ignore_mapgen, /area/tether_away/beach/coast) "bh" = ( /obj/effect/overlay/coconut, -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach/jungle) "bi" = ( -/turf/unsimulated/wall/planetary/normal, +/turf/unsimulated/wall/planetary/normal/virgo4, /area/tether_away/beach/water) "bj" = ( /turf/simulated/floor/water/ocean, /area/tether_away/beach/jungle) "bk" = ( /turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 1 + dir = 1; + icon_state = "beach" }, /area/tether_away/beach/water) "bl" = ( -/turf/unsimulated/wall/planetary/normal, +/obj/tether_away_spawner/beach_outside, +/turf/simulated/floor/outdoors/grass, /area/tether_away/beach/jungle) "bm" = ( /obj/effect/shuttle_landmark{ base_area = /area/tether_away/beach/jungle; - base_turf = /turf/simulated/floor/beach/sand/desert; + base_turf = /turf/simulated/floor/beach/sand/desert/outdoors; landmark_tag = "beach_c"; name = "Virgo 4 Beach (Center)" }, -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach/jungle) "bn" = ( /mob/living/simple_mob/animal/passive/fish/measelshark, @@ -327,319 +301,2064 @@ name = "V4_Cave_Entrance"; portal_id = "V4_cave_step" }, -/turf/simulated/floor/beach/sand, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, /area/tether_away/beach/jungle) "bp" = ( -/turf/simulated/floor/beach/sand, +/turf/simulated/floor/beach/sand/outdoors, /area/tether_away/beach/jungle) "bq" = ( /turf/simulated/mineral/ignore_mapgen, /area/tether_away/beach/jungle) "br" = ( /obj/effect/map_effect/portal/line/side_a, -/turf/simulated/floor/beach/sand, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, /area/tether_away/beach/jungle) "bs" = ( -/obj/effect/step_trigger/zlevel_fall/beach, -/turf/simulated/floor/beach/sand/desert, +/obj/effect/overlay/coconut, +/turf/simulated/floor/outdoors/grass, /area/tether_away/beach/jungle) +"bT" = ( +/obj/structure/cable/cyan{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"cf" = ( +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/janibar) +"cy" = ( +/obj/structure/bed/chair/bay/chair/padded/red/bignest, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) "cA" = ( /turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 10 + dir = 10; + icon_state = "beach" }, /area/tether_away/beach/water) +"cN" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/janibar) "cS" = ( /turf/simulated/floor/water/beach/corner, /area/tether_away/beach/water) +"dd" = ( +/obj/effect/floor_decal/spline/plain{ + dir = 5 + }, +/turf/simulated/floor/water/deep/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"dm" = ( +/obj/machinery/vending/loadout/accessory, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"dt" = ( +/obj/item/weapon/bedsheet/pirate, +/obj/machinery/button/remote/airlock{ + id = "LoveShack4"; + name = "Door Bolt Control"; + pixel_x = -25; + specialfunctions = 4 + }, +/obj/structure/bed/padded, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm4) +"dP" = ( +/obj/structure/bed/padded, +/obj/item/weapon/bedsheet/medical, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) "dY" = ( /turf/simulated/floor/water/beach/corner{ - icon_state = "beachcorner"; - dir = 8 + dir = 8; + icon_state = "beachcorner" }, /area/tether_away/beach) +"et" = ( +/obj/machinery/shower{ + dir = 8; + pixel_x = -2 + }, +/obj/effect/floor_decal/steeldecal/steel_decals10{ + dir = 1 + }, +/obj/effect/floor_decal/steeldecal/steel_decals10{ + dir = 8 + }, +/obj/structure/curtain/open/shower, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled{ + icon_state = "techmaint" + }, +/area/tether_away/beach/resort/janibar) +"ez" = ( +/obj/machinery/vending/fishing, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/janibar) +"eF" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/under/swimsuit/black, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"eV" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"eW" = ( +/obj/structure/table/glass, +/obj/item/weapon/backup_implanter{ + pixel_y = 9 + }, +/obj/item/weapon/backup_implanter{ + pixel_y = 2 + }, +/obj/item/weapon/backup_implanter{ + pixel_y = -5 + }, +/obj/item/weapon/backup_implanter{ + pixel_y = -12 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) +"fl" = ( +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/obj/random/meat, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"fJ" = ( +/obj/item/weapon/bedsheet/ian, +/obj/machinery/button/remote/airlock{ + id = "LoveShack3"; + name = "Door Bolt Control"; + pixel_x = -25; + specialfunctions = 4 + }, +/obj/structure/bed/padded, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm3) "fQ" = ( /turf/simulated/floor/water/beach, /area/tether_away/beach/water) +"gd" = ( +/obj/structure/simple_door/sandstone, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/janibar) +"gw" = ( +/obj/structure/bonfire, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) "gA" = ( /turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 6 + dir = 6; + icon_state = "beach" }, /area/tether_away/beach/water) +"gU" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/janibar) +"hg" = ( +/obj/effect/overlay/palmtree_r, +/turf/simulated/floor/beach/sand/desert/outdoors, +/area/tether_away/beach/resort) +"hj" = ( +/turf/simulated/wall/sandstone, +/area/tether_away/beach/resort/lockermed) +"hl" = ( +/obj/effect/floor_decal/spline/plain{ + dir = 1 + }, +/turf/simulated/floor/water/deep/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"hq" = ( +/obj/item/weapon/stool/padded, +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"hr" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/under/swimsuit/red, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) "hx" = ( /obj/effect/overmap/visitable/sector/virgo4, /turf/simulated/floor/water/deep/ocean, /area/tether_away/beach/water) +"hL" = ( +/obj/structure/table/steel_reinforced, +/obj/machinery/reagentgrinder, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) "hN" = ( /turf/simulated/floor/holofloor/beach/sand, /area/tether_away/beach/jungle) -"le" = ( -/turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 5 +"hQ" = ( +/obj/structure/flora/sif/subterranean, +/turf/simulated/floor/outdoors/grass{ + outdoors = 0 }, -/area/tether_away/beach/jungle) -"mC" = ( -/turf/simulated/floor/beach/sand/desert, -/area/tether_away/beach/water) -"oC" = ( -/turf/simulated/floor/water/beach{ - icon_state = "beach"; +/area/tether_away/beach/cavebase) +"hR" = ( +/obj/machinery/power/terminal{ + dir = 8; + icon_state = "term" + }, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2"; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/powershed) +"hS" = ( +/obj/structure/table/woodentable, +/obj/random/drinkbottle, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm2) +"hV" = ( +/obj/structure/undies_wardrobe{ + density = 0; + pixel_x = 0; + pixel_y = 18 + }, +/obj/structure/cable/cyan{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm3) +"il" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/under/swimsuit/white, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"io" = ( +/turf/simulated/floor/lino, +/area/tether_away/beach/resort/kitchen) +"iO" = ( +/obj/structure/mopbucket, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/janibar) +"jc" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"jH" = ( +/obj/effect/floor_decal/spline/plain, +/turf/simulated/floor/water/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"jN" = ( +/obj/tether_away_spawner/beach_outside, +/turf/simulated/floor/beach/sand/outdoors, +/area/tether_away/beach/resort) +"jQ" = ( +/obj/structure/cable/cyan{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"kd" = ( +/obj/machinery/light/small, +/turf/simulated/floor/outdoors/grass, +/area/tether_away/beach/resort/kitchen) +"kg" = ( +/obj/machinery/vending/loadout/clothing, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"kk" = ( +/obj/machinery/power/apc/alarms_hidden{ + dir = 8; + pixel_x = -27 + }, +/obj/structure/cable/cyan{ + d2 = 4; + icon_state = "0-4" + }, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) +"ku" = ( +/obj/structure/cable/cyan{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/smes/buildable/offmap_spawn/empty, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/powershed) +"kK" = ( +/obj/effect/floor_decal/spline/plain{ dir = 4 }, +/turf/simulated/floor/water/deep/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"kO" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/powershed) +"kP" = ( +/obj/structure/table/woodentable, +/obj/random/drinkbottle, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm3) +"kR" = ( +/obj/structure/undies_wardrobe{ + density = 0; + pixel_x = 0; + pixel_y = 18 + }, +/obj/structure/cable/cyan{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm2) +"kT" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"kW" = ( +/obj/structure/closet/cabinet{ + density = 0; + pixel_y = 20; + wall_mounted = 1 + }, +/obj/structure/cable/cyan{ + d2 = 4; + icon_state = "0-4" + }, +/obj/machinery/power/apc/alarms_hidden{ + dir = 8; + pixel_x = -27 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm2) +"la" = ( +/obj/structure/table/rack, +/obj/item/weapon/material/fishing_net, +/obj/item/weapon/material/fishing_net, +/obj/item/weapon/material/fishing_net, +/obj/item/weapon/material/fishing_net, +/obj/item/stack/cable_coil/pink, +/obj/item/stack/cable_coil/pink, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/janibar) +"le" = ( +/turf/simulated/floor/water/beach{ + dir = 5; + icon_state = "beach" + }, /area/tether_away/beach/jungle) +"lh" = ( +/obj/structure/closet/cabinet{ + density = 0; + pixel_y = 20; + wall_mounted = 1 + }, +/obj/machinery/power/apc/alarms_hidden{ + dir = 8; + pixel_x = -27 + }, +/obj/structure/cable/cyan{ + d2 = 4; + icon_state = "0-4" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm1) +"li" = ( +/obj/effect/overlay/palmtree_r, +/turf/simulated/floor/beach/sand, +/area/tether_away/beach/resort) +"lI" = ( +/turf/simulated/floor/beach/sand/desert/outdoors, +/area/tether_away/beach/resort) +"mb" = ( +/obj/machinery/power/apc/alarms_hidden{ + dir = 1; + pixel_y = 26 + }, +/obj/structure/cable/cyan{ + d2 = 2; + icon_state = "0-2" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/kitchen) +"me" = ( +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/janibar) +"mi" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/powershed) +"mu" = ( +/obj/structure/table/steel_reinforced, +/obj/machinery/chemical_dispenser/bar_soft/full{ + dir = 8 + }, +/turf/simulated/floor/lino, +/area/tether_away/beach/resort/kitchen) +"mC" = ( +/turf/simulated/floor/beach/sand/desert/outdoors, +/area/tether_away/beach/water) +"mF" = ( +/obj/structure/sink{ + dir = 4; + icon_state = "sink"; + pixel_x = 11; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"mM" = ( +/obj/machinery/power/solar_control, +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2"; + pixel_y = 0 + }, +/obj/machinery/light/small{ + dir = 4; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/powershed) +"mS" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"mW" = ( +/obj/structure/mirror{ + pixel_x = 27 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm4) +"nm" = ( +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2"; + pixel_y = 0 + }, +/obj/machinery/power/tracker, +/turf/simulated/floor{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"nD" = ( +/turf/simulated/mineral/ignore_mapgen, +/area/tether_away/beach/water) +"of" = ( +/obj/structure/table/woodentable, +/obj/random/drinkbottle, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm1) +"oq" = ( +/obj/item/weapon/bedsheet/rainbow, +/obj/machinery/button/remote/airlock{ + id = "LoveShack1"; + name = "Door Bolt Control"; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/structure/bed/padded, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm1) +"oC" = ( +/turf/simulated/floor/water/beach{ + dir = 4; + icon_state = "beach" + }, +/area/tether_away/beach/jungle) +"oF" = ( +/obj/item/weapon/stool/padded, +/obj/structure/cable/cyan{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"pd" = ( +/obj/structure/table/rack, +/obj/item/weapon/material/fishing_rod/modern/cheap, +/obj/item/weapon/material/fishing_rod/modern/cheap, +/obj/item/weapon/material/fishing_rod/modern/cheap, +/obj/item/weapon/material/fishing_rod/modern/cheap, +/obj/item/stack/cable_coil/pink, +/obj/item/stack/cable_coil/pink, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/janibar) "pq" = ( /turf/simulated/floor/water/beach/corner, /area/tether_away/beach/jungle) +"pw" = ( +/turf/simulated/floor/water/ocean, +/area/tether_away/beach/cavebase) +"py" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/powershed) +"pA" = ( +/obj/effect/floor_decal/spline/plain{ + dir = 4 + }, +/turf/simulated/floor/water/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"pC" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/light_switch{ + dir = 4; + on = 0; + pixel_x = -29; + pixel_y = 28 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm4) +"pF" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"pP" = ( +/obj/effect/overlay/palmtree_l, +/turf/simulated/floor/beach/sand/desert/outdoors, +/area/tether_away/beach/resort) "pS" = ( /turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 1 + dir = 1; + icon_state = "beach" }, /area/tether_away/beach/jungle) -"tj" = ( -/turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 5 +"qi" = ( +/obj/structure/cable/cyan{ + d1 = 4; + d2 = 8; + icon_state = "4-8" }, -/area/tether_away/beach/water) -"tr" = ( -/turf/simulated/floor/beach/sand/desert, -/area/tether_away/beach) -"xW" = ( -/obj/tether_away_spawner/beach_outside_friendly, -/turf/simulated/floor/beach/sand/desert, -/area/tether_away/beach/jungle) -"Ar" = ( -/obj/effect/shuttle_landmark{ - base_area = /area/tether_away/beach/jungle; - base_turf = /turf/simulated/floor/beach/sand/desert; - landmark_tag = "beach_nw"; - name = "Virgo 4 Beach (NW)" +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 8; + icon_state = "1-8" }, -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"qI" = ( +/obj/machinery/power/port_gen/pacman/mrs, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/powershed) +"rm" = ( +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'DANGER: MONSTERS'."; + name = "\improper DANGER: MONSTERS" + }, +/turf/simulated/wall, /area/tether_away/beach/jungle) -"BG" = ( -/turf/simulated/floor/water/beach/corner{ - icon_state = "beachcorner"; +"rp" = ( +/obj/structure/table/woodentable, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) +"rJ" = ( +/obj/structure/undies_wardrobe{ + density = 0; + pixel_x = 0; + pixel_y = 18 + }, +/obj/structure/cable/cyan{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm1) +"rQ" = ( +/obj/machinery/light/small{ dir = 8 }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort/kitchen) +"ss" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/beach/sand/outdoors, +/area/tether_away/beach/resort/lockermed) +"sD" = ( +/turf/simulated/wall/wood, +/area/tether_away/beach/resort/janibar) +"sT" = ( +/obj/effect/overlay/coconut, +/turf/simulated/floor/beach/sand/outdoors, +/area/tether_away/beach/resort) +"tj" = ( +/turf/simulated/floor/water/beach{ + dir = 5; + icon_state = "beach" + }, +/area/tether_away/beach/water) +"tl" = ( +/obj/machinery/shower{ + dir = 4; + icon_state = "shower"; + pixel_x = 2; + pixel_y = 0 + }, +/obj/effect/floor_decal/steeldecal/steel_decals10, +/obj/effect/floor_decal/steeldecal/steel_decals10{ + dir = 4 + }, +/obj/structure/curtain/open/shower, +/turf/simulated/floor/tiled{ + icon_state = "techmaint" + }, +/area/tether_away/beach/resort/janibar) +"to" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + dir = 1; + pixel_x = -28; + pixel_y = -29 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm1) +"tr" = ( +/turf/simulated/floor/beach/sand/desert/outdoors, +/area/tether_away/beach) +"ts" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"tG" = ( +/obj/machinery/appliance/cooker/fryer, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"uh" = ( +/obj/effect/floor_decal/spline/plain{ + dir = 6 + }, +/turf/simulated/floor/water/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"uk" = ( +/obj/structure/table/steel_reinforced, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"ul" = ( +/turf/simulated/wall/wood, +/area/tether_away/beach/water) +"us" = ( +/obj/effect/overlay/coconut, +/turf/simulated/floor/beach/sand/desert/outdoors, +/area/tether_away/beach/resort) +"uL" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/machinery/light_switch{ + dir = 4; + on = 0; + pixel_x = -29; + pixel_y = 28 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm3) +"uO" = ( +/turf/simulated/floor/water/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"uQ" = ( +/obj/machinery/chem_master/condimaster, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"uT" = ( +/obj/structure/mirror{ + pixel_x = -27 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm1) +"vg" = ( +/obj/structure/flora/sif/subterranean, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) +"vU" = ( +/obj/structure/table/woodentable, +/obj/item/device/flashlight/lamp/green, +/turf/simulated/floor/wood, +/area/tether_away/beach) +"wv" = ( +/obj/effect/overlay/coconut, +/turf/simulated/mineral/ignore_mapgen, /area/tether_away/beach/jungle) +"wM" = ( +/obj/structure/cable/cyan{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort/lockermed) +"wT" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort/kitchen) +"xb" = ( +/obj/structure/flora/ausbushes/fernybush, +/turf/simulated/floor/water/ocean, +/area/tether_away/beach/cavebase) +"xi" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/beach/sand/outdoors, +/area/tether_away/beach/resort/janibar) +"xy" = ( +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) +"xT" = ( +/obj/tether_away_spawner/beach_outside_friendly, +/turf/simulated/floor/beach/sand/desert/outdoors, +/area/tether_away/beach/resort) +"xW" = ( +/obj/tether_away_spawner/beach_outside_friendly, +/turf/simulated/floor/beach/sand/desert/outdoors, +/area/tether_away/beach/jungle) +"yf" = ( +/obj/structure/table/reinforced, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/kitchen) +"yg" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/outdoors/grass, +/area/tether_away/beach/resort/janibar) +"yF" = ( +/obj/structure/barricade, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) +"zb" = ( +/obj/structure/table/woodentable, +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/janibar) +"zs" = ( +/turf/simulated/wall/sandstone, +/area/tether_away/beach/resort/dorm2) +"zw" = ( +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"zD" = ( +/obj/structure/grille, +/turf/simulated/floor, +/area/tether_away/beach/powershed) +"zP" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/crate, +/obj/fiftyspawner/glass, +/obj/fiftyspawner/glass, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/powershed) +"zV" = ( +/obj/structure/table/bench/sifwooden/padded, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/kitchen) +"zZ" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/powershed) +"Ar" = ( +/obj/structure/flora/tree/jungle_small, +/turf/simulated/floor/outdoors/grass/forest, +/area/tether_away/beach/jungle) +"Aw" = ( +/obj/item/weapon/stool/padded, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) +"AE" = ( +/obj/machinery/cryopod, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) +"AS" = ( +/obj/machinery/door/airlock/sandstone, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/kitchen) +"Bk" = ( +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/small/sugar, +/obj/item/weapon/reagent_containers/food/condiment/small/sugar, +/obj/item/weapon/reagent_containers/food/condiment/small/sugar, +/obj/item/weapon/reagent_containers/food/condiment/small/sugar, +/obj/item/weapon/reagent_containers/food/condiment/spacespice, +/obj/item/weapon/reagent_containers/food/condiment/spacespice, +/obj/item/weapon/reagent_containers/food/condiment/spacespice, +/obj/item/weapon/reagent_containers/food/condiment/spacespice, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/reagent_containers/food/condiment/flour, +/obj/item/weapon/material/knife/butch, +/obj/item/weapon/material/minihoe, +/obj/item/weapon/material/knife/machete/hatchet, +/obj/random/drinkbottle, +/obj/random/drinkbottle, +/obj/random/drinkbottle, +/obj/structure/closet, +/obj/item/weapon/reagent_containers/glass/bucket, +/obj/item/device/analyzer/plant_analyzer, +/obj/item/device/analyzer/plant_analyzer, +/obj/item/weapon/reagent_containers/food/condiment/small/peppermill{ + pixel_x = 3 + }, +/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{ + pixel_x = -3 + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"By" = ( +/obj/item/weapon/stool/baystool/padded, +/turf/simulated/floor/lino, +/area/tether_away/beach/resort/kitchen) +"BF" = ( +/turf/simulated/wall/sandstone, +/area/tether_away/beach/resort/dorm3) +"BG" = ( +/turf/simulated/floor/water/beach/corner{ + dir = 8; + icon_state = "beachcorner" + }, +/area/tether_away/beach/jungle) +"BP" = ( +/obj/structure/closet/crate/medical, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) +"BR" = ( +/obj/structure/table/rack/shelf/steel, +/obj/machinery/light, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/kitchen) +"Ce" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/beach/sand/outdoors, +/area/tether_away/beach/resort) +"Cr" = ( +/obj/structure/cable/cyan{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"CC" = ( +/obj/effect/floor_decal/spline/plain{ + dir = 8 + }, +/turf/simulated/floor/water/deep/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"CM" = ( +/obj/structure/table/rack/shelf/steel, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/kitchen) "CP" = ( /turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 10 + dir = 10; + icon_state = "beach" }, /area/tether_away/beach/jungle) +"Dq" = ( +/obj/tether_away_spawner/beach_outside_friendly, +/turf/simulated/floor/outdoors/grass, +/area/tether_away/beach/jungle) "Dr" = ( /obj/effect/shuttle_landmark{ base_area = /area/tether_away/beach/jungle; - base_turf = /turf/simulated/floor/beach/sand/desert; + base_turf = /turf/simulated/floor/beach/sand/desert/outdoors; landmark_tag = "beach_e"; name = "Virgo 4 Beach (E)" }, -/turf/simulated/floor/beach/sand/desert, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach/jungle) +"DA" = ( +/obj/structure/cable{ + d2 = 2; + icon_state = "0-2"; + pixel_y = 0 + }, +/obj/item/solar_assembly, +/turf/simulated/floor{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"DB" = ( +/turf/simulated/floor/water/deep/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"DK" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "LoveShack2"; + name = "Love Shack 2" + }, +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/dorm2) "DL" = ( /turf/simulated/floor/water/beach/corner{ - icon_state = "beachcorner"; - dir = 8 + dir = 8; + icon_state = "beachcorner" }, /area/tether_away/beach/water) +"Ed" = ( +/obj/structure/bed, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) "Ee" = ( /turf/simulated/floor/water/beach/corner{ - icon_state = "beachcorner"; - dir = 4 + dir = 4; + icon_state = "beachcorner" }, /area/tether_away/beach/jungle) +"Eh" = ( +/turf/simulated/wall/sandstone, +/area/tether_away/beach/resort/dorm1) +"Ew" = ( +/obj/structure/closet/cabinet{ + density = 0; + pixel_y = 20; + wall_mounted = 1 + }, +/obj/machinery/power/apc/alarms_hidden{ + dir = 4; + pixel_x = 22 + }, +/obj/structure/cable/cyan{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm4) "Ey" = ( /turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 6 + dir = 6; + icon_state = "beach" }, /area/tether_away/beach/jungle) +"EG" = ( +/obj/machinery/vending/loadout/costume, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"Fm" = ( +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"Gi" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "LoveShack3"; + name = "Love Shack 3" + }, +/obj/structure/cable/cyan{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/dorm3) +"Gr" = ( +/obj/structure/cable/cyan{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) +"GS" = ( +/obj/effect/overlay/coconut, +/turf/simulated/floor/beach/sand/outdoors, +/area/tether_away/beach/jungle) +"Hv" = ( +/obj/structure/table/steel_reinforced, +/obj/item/weapon/material/kitchen/rollingpin, +/obj/item/weapon/book/manual/chef_recipes, +/obj/item/weapon/reagent_containers/food/condiment/enzyme{ + layer = 5 + }, +/obj/item/weapon/reagent_containers/glass/bucket, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"HO" = ( +/obj/structure/mirror{ + pixel_x = 27 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm3) "Ij" = ( /turf/simulated/floor/water/beach/corner{ - icon_state = "beachcorner"; + dir = 4; + icon_state = "beachcorner" + }, +/area/tether_away/beach/water) +"IA" = ( +/obj/structure/flora/tree/jungle, +/turf/simulated/floor/outdoors/grass/forest, +/area/tether_away/beach/jungle) +"IB" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/under/swimsuit/striped, +/obj/machinery/light/small{ dir = 4 }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"IY" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "LoveShack1"; + name = "Love Shack 1" + }, +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/dorm1) +"IZ" = ( +/obj/effect/overlay/palmtree_r, +/turf/simulated/floor/beach/sand/outdoors, +/area/tether_away/beach/resort) +"Ja" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/kitchen) +"Je" = ( +/obj/machinery/recharge_station, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) +"Jm" = ( +/obj/machinery/biogenerator, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"Jn" = ( +/obj/machinery/door/airlock/sandstone, +/obj/structure/cable/cyan{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/kitchen) +"JG" = ( +/obj/effect/step_trigger/zlevel_fall/beach, +/turf/simulated/floor/beach/sand/desert/outdoors, /area/tether_away/beach/water) +"JU" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"JX" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"Kq" = ( +/obj/structure/table/steel_reinforced, +/turf/simulated/floor/lino, +/area/tether_away/beach/resort/kitchen) "Kw" = ( /turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 8 + dir = 8; + icon_state = "beach" }, /area/tether_away/beach/jungle) +"KN" = ( +/turf/simulated/wall/wood, +/area/tether_away/beach/coast) +"KU" = ( +/turf/simulated/mineral/ignore_mapgen, +/area/tether_away/beach/resort) +"Le" = ( +/obj/structure/bookcase, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) +"Lp" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/under/swimsuit/purple, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"Lw" = ( +/obj/machinery/door/airlock/sandstone{ + id_tag = "LoveShack4"; + name = "Love Shack 4" + }, +/obj/structure/cable/cyan{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/dorm4) +"LB" = ( +/turf/simulated/wall/sandstone, +/area/tether_away/beach/resort/kitchen) +"LJ" = ( +/turf/simulated/floor/water/ocean, +/area/tether_away/beach/resort) +"LO" = ( +/obj/machinery/shower{ + dir = 4; + icon_state = "shower"; + pixel_x = 2; + pixel_y = 0 + }, +/obj/effect/floor_decal/steeldecal/steel_decals10, +/obj/effect/floor_decal/steeldecal/steel_decals10{ + dir = 4 + }, +/obj/structure/curtain/open/shower, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/simulated/floor/tiled{ + icon_state = "techmaint" + }, +/area/tether_away/beach/resort/janibar) +"LQ" = ( +/turf/simulated/floor/outdoors/grass, +/area/tether_away/beach/cavebase) +"LT" = ( +/obj/machinery/seed_extractor, +/obj/machinery/light, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"LZ" = ( +/turf/simulated/floor/wood{ + outdoors = 1 + }, +/area/tether_away/beach/water) +"Mp" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"ME" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"MZ" = ( +/obj/item/weapon/bedsheet/brown, +/obj/machinery/button/remote/airlock{ + id = "LoveShack2"; + name = "Door Bolt Control"; + pixel_x = 25; + specialfunctions = 4 + }, +/obj/structure/bed/padded, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm2) +"Nt" = ( +/obj/structure/cable{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"Nv" = ( +/turf/simulated/floor/beach/sand/outdoors, +/area/tether_away/beach/resort) +"ND" = ( +/obj/structure/table/glass, +/obj/machinery/vending/wallmed1/public{ + pixel_x = -28 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) +"Of" = ( +/obj/machinery/vending/dinnerware{ + dir = 8 + }, +/turf/simulated/floor/lino, +/area/tether_away/beach/resort/kitchen) +"OK" = ( +/obj/effect/overlay/palmtree_l, +/turf/simulated/floor/beach/sand/outdoors, +/area/tether_away/beach/resort) +"PG" = ( +/obj/machinery/shower{ + dir = 8; + pixel_x = -2 + }, +/obj/effect/floor_decal/steeldecal/steel_decals10{ + dir = 1 + }, +/obj/effect/floor_decal/steeldecal/steel_decals10{ + dir = 8 + }, +/obj/structure/curtain/open/shower, +/turf/simulated/floor/tiled{ + icon_state = "techmaint" + }, +/area/tether_away/beach/resort/janibar) +"PK" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"PV" = ( +/obj/effect/floor_decal/spline/plain{ + dir = 8 + }, +/turf/simulated/floor/water/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"Qm" = ( +/obj/structure/table, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) +"Qr" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/under/swimsuit/blue, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"QL" = ( +/obj/structure/table/rack/steel, +/obj/item/weapon/mop, +/obj/random/soap, +/obj/item/weapon/reagent_containers/glass/bucket, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/janibar) +"QY" = ( +/obj/structure/mirror{ + pixel_x = -27 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm2) +"Rh" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"Rm" = ( +/obj/structure/cable/cyan{ + d2 = 2; + icon_state = "0-2" + }, +/obj/machinery/power/apc/alarms_hidden{ + dir = 1; + pixel_y = 26 + }, +/obj/structure/table/woodentable, +/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer, +/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer, +/obj/item/weapon/reagent_containers/food/drinks/shaker, +/obj/item/clothing/glasses/sunglasses, +/obj/item/weapon/reagent_containers/glass/rag, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/janibar) +"Rv" = ( +/obj/structure/table/woodentable, +/obj/random/drinkbottle, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm4) +"Rx" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"RA" = ( +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) +"RD" = ( +/obj/tether_away_spawner/beach_outside_friendly, +/turf/simulated/floor/beach/sand/outdoors, +/area/tether_away/beach/resort) +"RH" = ( +/obj/structure/closet/cabinet{ + density = 0; + pixel_y = 20; + wall_mounted = 1 + }, +/obj/machinery/power/apc/alarms_hidden{ + dir = 4; + pixel_x = 22 + }, +/obj/structure/cable/cyan{ + d2 = 8; + icon_state = "0-8" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm3) "RQ" = ( /turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 8 + dir = 8; + icon_state = "beach" }, /area/tether_away/beach/water) +"RX" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) "Sv" = ( /turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 9 + dir = 9; + icon_state = "beach" }, /area/tether_away/beach/jungle) +"Sz" = ( +/obj/structure/sink{ + dir = 4; + icon_state = "sink"; + pixel_x = 11; + pixel_y = 0 + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/janibar) +"SG" = ( +/obj/machinery/appliance/cooker/oven, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"SK" = ( +/obj/item/weapon/reagent_containers/spray/cleaner, +/obj/item/weapon/reagent_containers/spray/cleaner, +/obj/structure/table/rack/steel, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/janibar) +"SQ" = ( +/obj/structure/flora/ausbushes/fernybush, +/turf/simulated/floor/outdoors/grass, +/area/tether_away/beach/cavebase) +"ST" = ( +/obj/machinery/door/airlock/glass_medical{ + name = "First Aid Staton"; + req_one_access = list() + }, +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"Tg" = ( +/mob/living/simple_mob/animal/passive/fish/solarfish, +/turf/simulated/floor/water/ocean, +/area/tether_away/beach/cavebase) +"Tp" = ( +/obj/machinery/power/apc/alarms_hidden{ + dir = 4; + pixel_x = 22 + }, +/obj/structure/cable, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/powershed) +"TH" = ( +/obj/structure/table/glass, +/obj/machinery/vending/wallmed1/public{ + pixel_x = -28 + }, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) "TU" = ( /obj/tether_away_spawner/beach_outside, -/turf/simulated/floor/beach/sand/desert, -/area/tether_away/beach/jungle) -"UZ" = ( -/obj/tether_away_spawner/beach_outside_friendly, -/turf/simulated/floor/beach/sand, -/area/tether_away/beach) +/turf/simulated/floor/beach/sand/desert/outdoors, +/area/tether_away/beach/resort) +"Ue" = ( +/obj/effect/floor_decal/spline/plain{ + dir = 10 + }, +/turf/simulated/floor/water/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"Uk" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/powershed) +"Um" = ( +/turf/simulated/wall/sandstone, +/area/tether_away/beach/powershed) +"Uo" = ( +/obj/structure/cable, +/obj/item/solar_assembly, +/turf/simulated/floor{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"UN" = ( +/turf/simulated/wall/sandstone, +/area/tether_away/beach/resort/janibar) +"UQ" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort/lockermed) "Va" = ( /turf/simulated/floor/water/beach/corner{ - icon_state = "beachcorner"; - dir = 1 + dir = 1; + icon_state = "beachcorner" }, /area/tether_away/beach/water) +"Vo" = ( +/obj/structure/table/rack/steel, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) +"VJ" = ( +/obj/structure/sink/puddle, +/turf/simulated/floor/outdoors/grass/forest, +/area/tether_away/beach/jungle) "VS" = ( /turf/simulated/floor/water/beach/corner{ - icon_state = "beachcorner"; - dir = 1 + dir = 1; + icon_state = "beachcorner" }, /area/tether_away/beach/jungle) +"Wc" = ( +/turf/simulated/floor/wood{ + outdoors = 1 + }, +/area/tether_away/beach/coast) +"Wd" = ( +/obj/machinery/appliance/cooker/grill, +/obj/machinery/light{ + dir = 1 + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"Wf" = ( +/turf/simulated/floor/outdoors/grass, +/area/tether_away/beach/resort) +"Wj" = ( +/obj/structure/simple_door/wood, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"Wu" = ( +/turf/simulated/floor/wood{ + outdoors = 1 + }, +/area/tether_away/beach) +"WH" = ( +/obj/machinery/computer/cryopod{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/kafel_full/white, +/area/tether_away/beach/resort/lockermed) +"WS" = ( +/obj/structure/undies_wardrobe{ + density = 0; + pixel_x = 0; + pixel_y = 18 + }, +/obj/structure/cable/cyan{ + d1 = 2; + d2 = 4; + icon_state = "2-4" + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm4) +"WU" = ( +/obj/machinery/vending/loadout, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) "WX" = ( /turf/simulated/floor/water/beach{ - icon_state = "beach"; - dir = 9 + dir = 9; + icon_state = "beach" }, /area/tether_away/beach/water) +"Xd" = ( +/turf/simulated/floor/outdoors/grass{ + outdoors = 0 + }, +/area/tether_away/beach/cavebase) +"XB" = ( +/obj/machinery/seed_storage/garden{ + dir = 1 + }, +/turf/simulated/floor/tiled/eris/cafe, +/area/tether_away/beach/resort/kitchen) +"XZ" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 2; + icon_state = "1-2"; + pixel_y = 0 + }, +/turf/simulated/floor{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"Ya" = ( +/obj/structure/closet/secure_closet/personal, +/obj/item/clothing/shoes/sandal, +/obj/item/clothing/under/swimsuit/stripper/mankini, +/turf/simulated/floor/tiled/asteroid_steel, +/area/tether_away/beach/resort/lockermed) +"Yi" = ( +/obj/effect/floor_decal/spline/plain{ + dir = 9 + }, +/turf/simulated/floor/water/deep/pool{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"Yq" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) "Yv" = ( /turf/simulated/floor/water/beach, /area/tether_away/beach/jungle) +"YE" = ( +/turf/simulated/wall/sandstone, +/area/tether_away/beach/resort/dorm4) +"YO" = ( +/obj/effect/shuttle_landmark{ + base_area = /area/tether_away/beach/jungle; + base_turf = /turf/simulated/floor/beach/sand/desert/outdoors; + landmark_tag = "beach_nw"; + name = "Virgo 4 Beach (NW)" + }, +/turf/simulated/floor/beach/sand/desert/outdoors, +/area/tether_away/beach/jungle) +"YR" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 2; + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + dir = 1; + pixel_x = -28; + pixel_y = -29 + }, +/turf/simulated/floor/wood, +/area/tether_away/beach/resort/dorm2) +"YY" = ( +/obj/structure/table/woodentable, +/obj/item/device/flashlight/lamp/green, +/turf/simulated/mineral/floor/cave{ + name = "dirt" + }, +/area/tether_away/beach/cavebase) +"ZA" = ( +/obj/structure/cable{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable{ + d1 = 2; + d2 = 8; + icon_state = "2-8" + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) +"ZC" = ( +/turf/simulated/mineral/ignore_mapgen, +/area/tether_away/beach/cavebase) +"ZX" = ( +/obj/structure/cable/cyan{ + d1 = 1; + d2 = 8; + icon_state = "1-8" + }, +/obj/structure/cable/cyan{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/tiled/asteroid_steel{ + outdoors = 1 + }, +/area/tether_away/beach/resort) (1,1,1) = {" -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq ba ba bg -bi -bi -bi -bi -bi -bi -bi -bi -bi -bi -bi -bi -bi +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD bi bi bi @@ -656,133 +2375,133 @@ bi bi "} (2,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am -am -am -am -am -am -am -am -am -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD am am am @@ -798,132 +2517,132 @@ hx bi "} (3,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am -am -am -am -am -am -am -am -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD am am am @@ -940,128 +2659,128 @@ am bi "} (4,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am -am -am -am -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD +nD +nD +nD am am am @@ -1082,128 +2801,128 @@ am bi "} (5,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am -am -am -am -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD +nD +nD +nD am am am @@ -1224,127 +2943,127 @@ am bi "} (6,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am -am -am -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ae +ae +bq +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD +nD +nD am am am @@ -1366,127 +3085,127 @@ am bi "} (7,1,1) = {" -bl -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am -am -am -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD +nD +nD am am am @@ -1508,126 +3227,126 @@ am bi "} (8,1,1) = {" +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +au +ae +ae bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am -am -am -am -am -am -am +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +bq +bq +bq +bq +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD +nD am am am @@ -1650,125 +3369,125 @@ am bi "} (9,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +au +ae +ae +ae +ae +au +au +au +au +au +au +au +au +ae +ae +ae +Dq +ae +ae +bq +bq +bq +bq +ZC +ZC +ZC +ZC +yF +yF +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD am am am @@ -1792,124 +3511,124 @@ am bi "} (10,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +au +Ar +au +ae +ae +au +au +au +au +au +au +au +au +au +au +ae +ae +ae +ae +ae +ae +bq +bq +bq +ZC +ZC +xy +xy +xy +xy +xy +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +bq +bq +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD am am am @@ -1934,122 +3653,122 @@ am bi "} (11,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +au +au +au +ae +au +au +au +au +au +IA +au +au +au +au +au +ae +ae +ae +ae +ae +ae +ae +bq +bq +ZC +Le +xy +xy +xy +Aw +xy +xy +Xd +xy +xy +xy +xy +ZC +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ai +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD am am am @@ -2076,120 +3795,120 @@ am bi "} (12,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +au +ae +ae +ae +ae +ae +bq +bq +bq +bq +ZC +Vo +xy +xy +Aw +gw +Aw +Xd +Xd +Xd +Xd +Xd +Xd +xy +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD am am am @@ -2218,119 +3937,119 @@ am bi "} (13,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +au +au +au +au +au +au +au +ae +ae +au +au +au +au +VJ +au +au +au +ae +ae +ae +bq +bq +bq +bq +bq +bq +ZC +ZC +xy +vg +xy +Aw +xy +Xd +Xd +Xd +Xd +hQ +Xd +xy +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +au +ae +au +ae +ae +au +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg am am am @@ -2350,7 +4069,7 @@ aq aq aq aq -aw +Wu tr aa Yv @@ -2360,117 +4079,117 @@ am bi "} (14,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -bh -aa -aa -aa -tr +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +au +Ar +au +au +ae +ae +ae +ae +ae +ae +au +au +au +au +au +au +au +au +ae +ae +bq +bq +bq +bq +bq +bq +ZC +rp +xy +xy +xy +xy +Xd +Xd +SQ +LQ +LQ +Xd +Xd +xy +xy +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +Dq +ae +au +ae +ae +ae +ae +ae +au +au +au +Dq +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +wv +bq +bq +bq +ba aj ak am @@ -2492,7 +4211,7 @@ aq aY aw aB -aw +Wu tr aa Yv @@ -2502,116 +4221,116 @@ am bi "} (15,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +au +au +au +au +ae +ae +ae +ae +ae +ae +ae +ae +au +au +au +au +au +au +au +ae +ae +bq +bq +bq +bq +bq +bq +ZC +rp +xy +xy +Xd +Xd +LQ +LQ +LQ +pw +LQ +LQ +Xd +Xd +xy +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +au +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq tr aj ak @@ -2631,10 +4350,10 @@ pS aa tr aq -aw +vU aw aq -aw +Wu tr aa Yv @@ -2644,116 +4363,116 @@ am bi "} (16,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +au +au +au +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +au +au +Ar +au +au +au +ae +ae +bq +bq +bq +bq +bq +bq +ZC +rp +xy +Xd +Xd +LQ +LQ +xb +pw +pw +pw +LQ +LQ +Xd +xy +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +au +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +ae +ae +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq tr aj ak @@ -2776,7 +4495,7 @@ aq aq aq aq -aw +Wu tr aa Yv @@ -2786,115 +4505,115 @@ am bi "} (17,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +au +au +au +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +au +au +au +au +au +ae +ae +bq +bq +bq +bq +bq +bq +bq +ZC +ZC +Xd +Xd +LQ +LQ +pw +pw +pw +pw +pw +LQ +LQ +Xd +Xd +Xd +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ae +ae +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq aa tr aj @@ -2928,114 +4647,114 @@ am bi "} (18,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +au +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +bp +bp +ae +ae +ae +ae +ae +au +au +au +au +ae +ae +bq +bq +bq +bq +bq +bq +bq +ZC +ZC +Xd +xy +SQ +LQ +pw +pw +Tg +pw +pw +pw +LQ +Xd +Xd +xy +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aC +ae +ae +ae +bq +bq +bq +bq +bq +bq aa aa tr @@ -3070,87 +4789,87 @@ am bi "} (19,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +au +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +bp +bp +bp +bp +bp +ae +ae +ae +ae +ae +ae +au +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +ZC +ZC +Xd +Xd +LQ +pw +pw +pw +pw +pw +pw +LQ +LQ +Xd +Xd +xy +xy +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -3173,11 +4892,11 @@ aa aa aa aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq aa aa tr @@ -3212,88 +4931,85 @@ am bi "} (20,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +bq +bq +bq +bq +bq +ae +ae +au +au +au +ae +ae +ae +ae +ae +bp +ae +ae +bp +bp +bp +bp +bp +bp +bp +bp +ae +ae +ae +ae +ae +ae +ae +ae +ae +bq +bq +bq +ZC +ZC +ZC +ZC +ZC +Xd +xy +xy +LQ +pw +pw +pw +pw +pw +SQ +LQ +Xd +xy +xy +xy +ZC +ZC +bq +bq +bq +bq +bq +bq aa +bq +bq +bq +bq +ae +ae aa aa aa @@ -3320,6 +5036,9 @@ aa aa aa aa +bq +bq +bq aa aa tr @@ -3354,84 +5073,84 @@ am bi "} (21,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae +bq +bq +bq +ae +ae +au +au +ae +ae +ae +ae +ae +ae +bp +bp +bp +bp +bp +bp +bp aa ac aa +bp +bp +bp +ae +ae +ae +bp +ae +ae +ae +ae +bq +bq +bq +ZC +ZC +ZC +ZC +Xd +Xd +xy +Xd +LQ +LQ +pw +xb +LQ +LQ +LQ +Xd +ZC +ZC +Ed +Ed +ZC +ZC +bq +bq +bq +bq +bq aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bh -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +ae aa aa aa @@ -3496,82 +5215,82 @@ am bi "} (22,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae +ae +ae +ai +ae +ae +ae +ae +ae +ae aa aa +bp +bp +bp aa aa ac aa +bp +aa +aa +aa +aa +bp +bp +bp +bp +ae +ae +bp +bp +ae +ae +ae +bq +bq +bq +ZC +ZC +Xd +Xd +Xd +Xd +Xd +Xd +xy +LQ +LQ +LQ +LQ +Xd +Xd +xy +ZC +ZC +ZC +ZC +ZC +ZC +bq +bq +bq +bq aa aa aa aa aa -aa -aa -aa +bq aa aa aa @@ -3638,55 +5357,17 @@ am bi "} (23,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae aa aa aa @@ -3708,6 +5389,44 @@ aa aa aa aa +bp +bp +bp +bp +bp +bp +bp +ae +ae +ae +bq +bq +ZC +Xd +xy +Xd +xy +xy +Xd +Xd +Xd +Xd +Xd +LQ +Xd +Xd +xy +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -3780,7 +5499,16 @@ am bi "} (24,1,1) = {" -bl +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae aa aa aa @@ -3804,52 +5532,43 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -TU -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bp +bp +bp +bp +bp +bp +bp +ae +ae +bq +av +Xd +Xd +Xd +Xd +ZC +xy +xy +xy +Xd +Xd +Xd +xy +Xd +xy +xy +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -3922,52 +5641,16 @@ am bi "} (25,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae aa aa aa @@ -3991,8 +5674,44 @@ aa aa aa aa +bp +bp +bp aa aa +bp +bp +bp +ae +ae +ax +xy +Xd +ZC +ZC +ZC +ZC +xy +xy +xy +xy +xy +vg +xy +xy +xy +xy +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -4064,48 +5783,15 @@ am bi "} (26,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -4135,6 +5821,39 @@ aa aa aa aa +bp +bp +bp +bp +ae +ax +Xd +ZC +ZC +ZC +ZC +ZC +ZC +xy +xy +xy +xy +xy +xy +xy +xy +cy +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -4206,47 +5925,14 @@ am bi "} (27,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +ae +ae aa aa aa @@ -4257,6 +5943,7 @@ aa aa aa aa +ab aa aa aa @@ -4271,11 +5958,43 @@ aa aa aa aa +ab aa aa aa aa aa +bp +bp +bp +ae +ae +ZC +ZC +ZC +ZC +ZC +ZC +ZC +xy +xy +xy +xy +xy +xy +xy +xy +ZC +ZC +bq +bq +bq +bq +bq +bq +bq +bq +bq xW aa aa @@ -4348,7 +6067,14 @@ am bi "} (28,1,1) = {" -bl +bq +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -4370,51 +6096,44 @@ aa aa aa aa +ab +bh aa aa aa aa +xW aa aa aa aa +bp +bp +bp +ae +bq +bq +bq +bq +bq +bq +ZC +ZC +xy +vg +xy +xy +xy +xy +ZC +bq +bq +bq +bq +bq aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq aa aa aa @@ -4490,53 +6209,29 @@ am bi "} (29,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab aa aa aa @@ -4554,6 +6249,30 @@ aa aa aa aa +bp +bp +bp +ae +bq +bq +bq +bq +bq +bq +ZC +ZC +xy +xy +xy +Aw +xy +ZC +ZC +bq +bq +bq +bq +bq aa aa aa @@ -4632,40 +6351,14 @@ am bi "} (30,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -Ar -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -4698,6 +6391,31 @@ aa aa aa aa +bp +bp +bp +bp +bq +bq +bq +bq +bq +bq +ZC +ZC +ZC +Qm +Qm +YY +rp +ZC +ZC +bq +bq +bq +bq +bq +bq aa aa aa @@ -4719,6 +6437,7 @@ aa aa aa aa +xW aa aa aa @@ -4774,36 +6493,14 @@ am bi "} (31,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -4836,7 +6533,29 @@ aa aa aa aa +bp aa +GS +bp +bq +bq +bq +bq +bq +bq +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +ZC +bq +bq +bq +bq aa aa aa @@ -4916,26 +6635,14 @@ am bi "} (32,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -4967,18 +6674,30 @@ aa aa aa aa +bp +bp aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ab +bp +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -5058,37 +6777,14 @@ am bi "} (33,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +ae +ae aa aa aa @@ -5100,6 +6796,8 @@ aa aa aa aa +ab +bh aa aa aa @@ -5118,10 +6816,30 @@ aa aa aa aa +bp aa aa aa aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -5134,6 +6852,7 @@ aa aa aa aa +ab aa aa aa @@ -5200,30 +6919,13 @@ am bi "} (34,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +ae aa aa aa @@ -5249,6 +6951,7 @@ aa aa aa aa +ab aa aa aa @@ -5260,6 +6963,22 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -5342,42 +7061,19 @@ am bi "} (35,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae aa aa aa aa aa +ab aa aa aa @@ -5409,6 +7105,22 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -5418,6 +7130,7 @@ aa aa aa aa +bh aa aa aa @@ -5452,6 +7165,12 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI tr aj ak @@ -5484,25 +7203,12 @@ am bi "} (36,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +ae +ae aa aa aa @@ -5542,7 +7248,20 @@ aa aa aa aa +bq +bq aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -5574,14 +7293,6 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa ab aa aa @@ -5590,10 +7301,18 @@ aa aa aa aa +ab aa aa aa -aa +lI +lI +lI +lI +lI +lI +lI +lI bb aj ak @@ -5626,11 +7345,17 @@ am bi "} (37,1,1) = {" -bl +bq +bq +bq +bq +ae +ae aa aa aa aa +ab aa aa aa @@ -5665,34 +7390,20 @@ aa aa aa aa +bq +bq aa aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -5736,6 +7447,14 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +lI +lI bc aj ak @@ -5768,7 +7487,12 @@ am bi "} (38,1,1) = {" -bl +bq +bq +bq +ae +ae +ae aa aa aa @@ -5809,24 +7533,19 @@ aa aa aa aa -TU -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa aa aa aa aa +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -5868,16 +7587,16 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI tr aj ak @@ -5910,30 +7629,12 @@ am bi "} (39,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +ae +ae +ae aa aa aa @@ -5980,6 +7681,13 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -6020,6 +7728,17 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI tr aj ak @@ -6052,26 +7771,19 @@ am bi "} (40,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +ae +ae +ae +aa +aa +aa +aa +aa +aa +bh aa aa aa @@ -6111,6 +7823,13 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -6150,18 +7869,18 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI tr aj ak @@ -6194,7 +7913,14 @@ am bi "} (41,1,1) = {" -bl +bq +bq +ae +ae +ae +ai +ae +aa aa aa aa @@ -6233,11 +7959,19 @@ aa aa aa aa +ab aa aa aa aa aa +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -6276,34 +8010,19 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI tr aj ak @@ -6336,37 +8055,13 @@ am bi "} (42,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +ae +ae +ae +ae aa aa aa @@ -6401,6 +8096,7 @@ aa aa aa aa +ab aa aa aa @@ -6411,6 +8107,13 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -6421,6 +8124,7 @@ aa aa aa aa +xW aa aa aa @@ -6446,6 +8150,21 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +xT +lI +lI +lI tr aj ak @@ -6478,34 +8197,12 @@ am bi "} (43,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +ae +ae +ae aa aa aa @@ -6552,6 +8249,12 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq aa aa aa @@ -6588,6 +8291,22 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI tr aj ak @@ -6620,7 +8339,12 @@ am bi "} (44,1,1) = {" -bl +bq +bq +bq +ae +ae +ae aa aa aa @@ -6667,6 +8391,12 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq aa aa aa @@ -6702,34 +8432,23 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa +pP +lI +lI +lI +lI +lI +lI +lI +lI +pP +lI +lI +lI +lI +lI +lI +lI tr aj ak @@ -6762,36 +8481,12 @@ am bi "} (45,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +ae +ae +ae aa aa aa @@ -6831,6 +8526,7 @@ aa aa aa aa +xW aa aa aa @@ -6838,6 +8534,9 @@ aa aa aa aa +bq +bq +bq aa aa aa @@ -6862,9 +8561,11 @@ aa aa aa aa +xW aa aa aa +ab aa aa aa @@ -6872,6 +8573,24 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI bb aj ak @@ -6904,11 +8623,11 @@ am bi "} (46,1,1) = {" -bl -aa -aa -aa -aa +bq +bq +bq +ae +ae aa aa aa @@ -6994,26 +8713,26 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI bc aj ak @@ -7046,32 +8765,11 @@ am bi "} (47,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +ae +ae aa aa aa @@ -7156,6 +8854,27 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI bb aj ak @@ -7188,11 +8907,11 @@ am bi "} (48,1,1) = {" -bl -aa -aa -aa -aa +bq +bq +bq +bq +ae aa aa aa @@ -7274,30 +8993,30 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +hg +lI +lI +lI +lI +lI +lI bc aj ak @@ -7330,12 +9049,12 @@ am bi "} (49,1,1) = {" -bl -aa -aa -aa -aa -aa +bq +bq +bq +bq +ae +ae aa aa aa @@ -7414,32 +9133,32 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +lI +lI +lI +lI +lI +lI +lI bd aj ak @@ -7472,13 +9191,13 @@ am bi "} (50,1,1) = {" -bl -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -7555,44 +9274,44 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +Nv +Nv +lI +lI +lI +lI +Nv tr aj ak bf bf bf +bf am am am -am -am +bf am am am @@ -7614,7 +9333,13 @@ am bi "} (51,1,1) = {" -bl +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -7690,52 +9415,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad +lI +lI +lI +lI +lI +lI +lI +lI +hg +lI +lI +hg +lI +lI +lI +lI +hg +Nv +Nv +sD +sD +xi +Nv +Nv +Nv +Nv +Nv +Nv tr aj -ak +KN bf bf bf +ul +bf am -am -am -am -am -am +bf +ul +bf am am am @@ -7756,7 +9475,13 @@ am bi "} (52,1,1) = {" -bl +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -7782,6 +9507,7 @@ aa aa aa aa +YO aa aa aa @@ -7830,55 +9556,48 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -an -ad -ad -ad -tr -aj -ak -bf -bf -bf -am -am -am -am -am -am -am +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +sD +pd +zw +Nv +Nv +li +Nv +Nv +ar +Wu +Wu +Wc +LZ +LZ +LZ +LZ +LZ +LZ +LZ +LZ +LZ +LZ am am am @@ -7898,7 +9617,12 @@ am bi "} (53,1,1) = {" -bl +bq +bq +bq +ae +ae +ae aa aa aa @@ -7973,54 +9697,49 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ao -ad -ad -ad -tr -aj -ak -bf -bf -bf -am -am -am -am -am -am -am +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +hg +lI +lI +lI +lI +Nv +Nv +Nv +Nv +Nv +sD +ez +zw +Nv +Nv +sT +Nv +Nv +ar +Wu +Wu +Wc +LZ +LZ +LZ +LZ +LZ +LZ +LZ +LZ +LZ +LZ am am am @@ -8040,7 +9759,12 @@ am bi "} (54,1,1) = {" -bl +bq +bq +bq +ae +ae +ae aa aa aa @@ -8114,54 +9838,49 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +lI +lI +lI +lI +lI +lI +lI +hg +lI +lI +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +li +Nv +sD +la +zw +Nv +Nv +Nv +Nv +Nv +Nv tr aj -ak +KN bf bf bf +ul +bf am -am -am -am -am -am +bf +ul +bf am am am @@ -8182,12 +9901,12 @@ am bi "} (55,1,1) = {" -bl -aa -aa -aa -aa -aa +bq +bq +bq +ae +ae +ae aa aa aa @@ -8260,49 +9979,49 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +sD +sD +xi +Nv +Nv +Nv +Nv +Nv +Nv tr aj ak bf bf bf +bf am am am -am -am +bf am am am @@ -8324,12 +10043,12 @@ am bi "} (56,1,1) = {" -bl -aa -aa -aa -aa -aa +bq +bq +bq +bq +ae +ae aa aa aa @@ -8401,39 +10120,39 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -UZ -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +li +Nv tr aj ak @@ -8466,7 +10185,12 @@ am bi "} (57,1,1) = {" -bl +bq +bq +bq +bq +ae +ae aa aa aa @@ -8537,45 +10261,40 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -an -ad -ad -ad -ad -ad -ad -ad -ad -al -al -al -al -al -al -al -al -al -ad -ad -ad -ad +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +Nv +Nv +Nv +Nv tr aj ak @@ -8608,13 +10327,13 @@ am bi "} (58,1,1) = {" -bl -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -8684,40 +10403,40 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ao -ad -ad -ad -ad -ad -ad -ad -ad -al +lI +lI +lI +lI +lI +Nv +OK +Nv +Wf +zw +LB +LB +ah +ah +ah +ah +ah +LB +AS +LB +LB +zw aG -ar -ar -ar -aB -ar -al -al -ad -ad -ad -ad +UN +UN +UN +ao +UN +zw +zw +Nv +Nv +Nv +Nv tr aj ak @@ -8750,19 +10469,14 @@ am bi "} (59,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -8831,35 +10545,40 @@ aa aa aa aa +lI +lI +lI +lI +Nv +Nv +Nv +Wf +Wf +kd +LB +zV +yf +as ad +as +yf +as ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ar -ar -ar -ar -ad -al +CM +LB +wT aH -ar +UN aK -aw -aw +me +me aU aX -al -ad -ad -ad -ad +zw +Nv +Nv +Nv +Nv bb aj ak @@ -8892,15 +10611,15 @@ am bi "} (60,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae +ae +ae aa aa aa @@ -8968,40 +10687,40 @@ aa aa aa aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ar +lI +lI +lI +Nv +Nv +Wf +Wf +Wf +Wf +Wf +ah +as +yf as -aw -ar ad -al +as +yf +as +ad +BR +LB +zw aI -ar +UN aL -aw -aw +me +me aU aX -al -ad -ad -ad -ad +zw +Nv +Nv +Nv +Nv bc aj ak @@ -9034,15 +10753,15 @@ am bi "} (61,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +ae +ae aa aa aa @@ -9110,11 +10829,17 @@ aa aa aa aa -aa -aa -aa -aa -aa +lI +lI +Nv +Nv +Nv +Wf +Wf +LJ +Wf +Wf +ah ad ad ad @@ -9123,27 +10848,21 @@ ad ad ad ad -ad -ad -ad -ar -az -aC aE -al -al +LB +zw aH -ar +UN aM -aw -aw +me +me aV aX -al -ad -ad -ad -ad +zw +Nv +Nv +Nv +Nv bb aj ak @@ -9176,15 +10895,15 @@ am bi "} (62,1,1) = {" -bl -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +bq +ae aa aa aa @@ -9252,11 +10971,17 @@ aa aa aa aa -aa -aa -aa -aa -aa +lI +lI +Nv +OK +Wf +Wf +LJ +LJ +LJ +Wf +ah ad ad ad @@ -9266,26 +10991,20 @@ ad ad ad ad -ad -ad -ar -ar -ar -ar -ad -al +AS +zw aI aJ aN -aw -aw +me +me aW aX -al -ad -ad -ad -ad +zw +Nv +Nv +Nv +Nv bc aj ak @@ -9318,16 +11037,16 @@ am bi "} (63,1,1) = {" -bl bq -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +ae +ae aa aa aa @@ -9393,41 +11112,41 @@ aa aa aa aa -bs -aa -aa -aa -aa aa +lI +lI +Nv +Nv +Wf +Wf +LJ +LJ +LJ +Wf +ah ad ad -ad -ad -ad -ad -al -ad -ad -ad -ad -ad -ad -ad -ad -ad -al +By +By +By +By +By +io +Of +LB +zw aH -ar +UN aO -aw -aw +me +me aW aX -al -ad -ad -ad -ad +zw +Nv +Nv +Nv +Nv bb aj ak @@ -9460,17 +11179,17 @@ am bi "} (64,1,1) = {" -bl bq bq bq -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +ae +ae aa aa aa @@ -9536,40 +11255,40 @@ aa aa aa aa -aa -aa -aa -aa -aa +lI +lI +Nv +Nv +Nv +Wf +Wf +LJ +Wf +Wf +ah ad ad -ad -ad -ad -ad -al -al -al -al -al -al -al -al -al -al -al +Kq +Kq +Kq +Kq +Kq +io +Kq +LB +zw aI -ar +UN aP -aw -aw +me +me aV aX -al -ad -ad -ad -ad +zw +Nv +Nv +Nv +Nv bc aj ak @@ -9602,18 +11321,18 @@ am bi "} (65,1,1) = {" -bl bq bq bq bq bq -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +ae +ae aa aa aa @@ -9678,40 +11397,40 @@ aa aa aa aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -al -ad -ad -al -ad -ad -ad -ad -ad -ad -al +lI +lI +lI +Nv +Nv +Nv +Wf +Wf +Wf +Wf +LB +mb +Ja +mu +aD +aD +aD +aD +aD +Bk +LB +zw aH -ar -aw -aw -aw -aV -aX -al -ad -ad -ad -ad +UN +Rm +gU +gU +zb +hq +zw +Nv +Nv +Nv +Nv bb aj ak @@ -9744,7 +11463,6 @@ am bi "} (66,1,1) = {" -bl bq bq bq @@ -9752,6 +11470,17 @@ bq bq bq bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -9810,50 +11539,40 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -al -ad -ar -ar -ar -ar -ad -al +lI +lI +lI +lI +Nv +Nv +Nv +Wf +Wf +zw +LB +LB +Jn +LB +fl +aD +uk +uk +aD +XB +LB +zw aI -ar +UN aQ -aw -aw +me +me ag -aX -al -ad -ad -ad -ad +oF +zw +Nv +Nv +Nv +Nv bc aj ak @@ -9893,6 +11612,18 @@ bq bq bq bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -9950,52 +11681,40 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -al -ad -ar -as -aw -ar -ad -al +lI +lI +lI +lI +lI +OK +Nv +Nv +Wf +zw +zw +rQ +jQ +LB +Wd +aD +uQ +Jm +aD +LT +LB +zw aH -ar +UN aR -aw -aw +me +me aV -aX -al -ad -ad -UZ -ad +oF +zw +Nv +Nv +Nv +Nv bb aj ak @@ -10041,12 +11760,12 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae aa aa aa @@ -10104,40 +11823,40 @@ aa aa aa aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ar -ar -ar -ad -ad -al -ad -ar -az +lI +lI +lI +lI +lI +Nv +Nv +Nv +zw +zw +zw +zw +jQ +ah +tG +aD +aD +aD aD aF -al -al +ah +zw aI -ar +UN aS -aw -aw +me +me aV -aX -al -ad -ad -ad -ad +oF +zw +Nv +Nv +Nv +Nv bc aj ak @@ -10185,10 +11904,10 @@ bq bq bq bq -aa +ae bq -aa -aa +ae +ae aa aa aa @@ -10246,40 +11965,40 @@ aa aa aa aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ar -ae -al -ad -ad -al -ad -ar -ar -ar -ar -ad -al +lI +lI +lI +lI +lI +Nv +Um +Um +zD +Um +Um +zw +jQ +LB +SG +aD +hL +Hv +mF +aF +LB +zw aH -ar +UN aT -aw -aw +me +me aV -aX -al -ad -ad -ad -ad +oF +zw +Nv +Nv +Nv +Nv bb aj ak @@ -10329,8 +12048,8 @@ bq bq bq bq -aa -aa +ae +ae aa aa aa @@ -10387,41 +12106,41 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ar +lI +lI +lI +lI +lI +lI +Nv +zD +ku +zZ +zP af -al -al -al -al -ad +Yq +jQ +LB +LB +LB ah -ad -ad -ad -ad -al +ah +LB +LB +LB +zw aI -ar -ar -ar -ar -ar -al -al -ad -ad -ad -ad +UN +UN +UN +ao +UN +jQ +zw +Nv +Nv +Nv +Nv bc aj ak @@ -10470,6 +12189,9 @@ bq bq bq bq +ae +ae +ae aa aa aa @@ -10526,44 +12248,41 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ar -al -al -ad -ad -al -al -al -al -al -al -al -al -al -al -al -al -al -al -al -al -ad -ad -ad -ad +lI +lI +lI +hg +lI +lI +Nv +zD +hR +Uk +qI +zD +bT +eV +kT +kT +kT +kT +kT +kT +kT +kT +Rx +kT +kT +kT +kT +kT +kT +JU +zw +Nv +Nv +Nv +Nv tr aj ak @@ -10612,6 +12331,10 @@ bq bq bq bq +ae +ae +ae +ae aa aa aa @@ -10667,45 +12390,41 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ar -ar -ar -ad -ad -ad -ad -ad -ad -ad -al -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +lI +lI +lI +lI +lI +lI +Nv +zD +mM +py +Tp +zD +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +jQ +zw +zw +zw +zw +zw +zw +zw +Nv +Nv +Nv +Nv +Nv tr aj ak @@ -10753,6 +12472,11 @@ bq bq bq bq +ae +ae +ae +ae +ae aa aa aa @@ -10807,47 +12531,42 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bp -bp -bp -bp -bp -ad -ad -ad -ad -ad -ad -ad -ar -ar -ar -ar -ad -al -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad +lI +lI +lI +lI +lI +lI +lI +Nv +Um +Um +kO +Um +Um +zw +zw +Nv +Wf +Wf +Wf +Wf +Wf +Nv +Nv +jQ +zw +UN +UN +UN +UN +zw +Nv +Nv +Nv +Nv +Nv +Nv tr aj ak @@ -10897,6 +12616,33 @@ bq bq bq bq +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab aa aa aa @@ -10927,69 +12673,42 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bp -bp -bp -bp -bp -bp -bp -ad -ad -ad -ad -ad -ad -ad -ar -as -av -ar -ad -al -ad -ad -ad -ad -ad -aa -aa -aa -ad -ad -ad -ad -ad -ai +lI +lI +lI +lI +Nv +lI +lI +Nv +zw +zw +Fm +mi +zw +zw +zw +hj +hj +hj +hj +hj +hj +hj +hj +wM +zw +UN +SK +QL +UN +zw +Nv +Nv +Nv +Nv +Nv +Nv tr aj ak @@ -11041,8 +12760,8 @@ bq bq bq bq -aa -aa +ae +ae aa aa aa @@ -11096,42 +12815,42 @@ aa aa aa aa -aa -aa -bp -bp -bp -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ar +lI +lI +Nv +Nv +lI +Nv +lI +lI +Nv +Nv +Fm +Nv +Nv +Nv +Nv +hj +kg at -aw +Ya aA -al -al -ad -ad -ad -ad -aa -aa -aa -aa -aa -ad -ad -ad -ad -aZ +Qr +il +hj +jQ +zw +UN +cN +cf +gd +zw +Nv +Nv +Nv +Nv +Nv +OK tr aj ak @@ -11182,14 +12901,11 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae aa aa aa @@ -11241,39 +12957,42 @@ aa aa aa bp -bp -bp -aa -aa -aa -aa -aa -ad -ad -ad -UZ -ad -ad -ar -au -ax -ar -ad +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Fm +Nv +pP +lI +Nv +hj +WU al -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad +al +al +al +al +al +jQ +zw +UN +iO +Sz +UN +Nv +Nv +Nv +Nv +Nv +Nv +Nv tr aj ak @@ -11324,11 +13043,15 @@ bq bq bq bq +ae +ae +ae +aC +bs +ae aa aa aa -ac -bh aa aa aa @@ -11375,47 +13098,43 @@ aa aa bp bp -bp -bp -bp -bp -bp -bp -bp -bp aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ar -ar -ar -ar -ad +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Fm +Nv +lI +lI +Nv +hj +dm al -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad +al +al +al +al +al +jQ +zw +UN +UN +UN +UN +lI +Nv +Nv +Nv +Nv +Nv +Nv tr aj ak @@ -11465,15 +13184,15 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -11515,49 +13234,49 @@ ac aa bp bp -bp -bp -bp -bp -bp -bp -bp -bp -bp +aa +aa bp aa aa aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -al -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad +lI +lI +lI +lI +lI +hg +lI +lI +lI +lI +Nv +Fm +Nv +lI +lI +Nv +hj +EG +PK +Lp +hr +IB +eF +hj +jQ +zw +UN +LO +tl +UN +Nv +Nv +Nv +Nv +Nv +Nv +Nv tr aj ak @@ -11607,16 +13326,16 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +au +ae +ae +ae +ae +ae +ae aa aa aa @@ -11663,43 +13382,43 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ar -ar -ar -ad -al -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Fm +Nv +lI +lI +Nv +hj +hj +hj +hj +hj +hj +hj +hj +jQ +zw +cf +cf +cf +cf +Nv +Nv +Nv +Nv +Nv +Nv +Nv tr aj ak @@ -11750,6 +13469,15 @@ bq bq bq bq +ae +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -11795,53 +13523,44 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ar +ab +lI +lI +lI +lI +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Fm +Nv +lI +lI +Nv +hj +BP +eW ay -aB -al -al -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad +TH +ND +kk +hj +jQ +zw +UN +et +PG +UN +Nv +Nv +Nv +lI +Nv +Nv +Nv bb aj ak @@ -11890,18 +13609,18 @@ bq bq bq bq -aa bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +ae +ae +ae +au +ae +ae +ae +ae +ae +ae aa aa aa @@ -11946,44 +13665,44 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ar -ar -ar -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad +lI +lI +lI +lI +Nv +Nt +RX +RX +RX +RX +RX +RX +Rh +Nv +lI +pP +Nv +hj +WH +RA +RA +RA +RA +Gr +ST +ZX +zw +UN +UN +UN +UN +Nv +Nv +lI +lI +Nv +Nv +Nv bc aj ak @@ -12032,17 +13751,17 @@ bq bq bq bq -aa bq -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +ae +ae +ae +au +au +ae +ae +ae +ae aa aa aa @@ -12088,44 +13807,44 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad +lI +lI +lI +lI +Nv +Fm +Nv +Nv +Nv +Nv +Nv +Nv +Nv +lI +pP +lI +Nv +hj +AE +AE +dP +dP +dP +Je +hj +jQ +zw +yg +Wf +Wf +Nv +Nv +Nv +lI +lI +hg +Nv +Nv bb aj ak @@ -12177,14 +13896,14 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +au +au +ae +ae +ae aa aa aa @@ -12230,44 +13949,44 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad +lI +lI +lI +lI +Nv +Fm +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +hj +hj +hj +hj +hj +hj +hj +hj +jQ +zw +Wf +Wf +Nv +Nv +Nv +lI +lI +lI +lI +Nv +Nv bc aj ak @@ -12319,6 +14038,14 @@ bq bq bq bq +ae +ae +au +au +au +ae +ae +ae aa aa aa @@ -12347,15 +14074,7 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ab aa aa aa @@ -12371,45 +14090,45 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad -ad -ad -ad -ad -ad -ad -ad -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad -ad +lI +lI +lI +pP +lI +Nv +Fm +Nv +pP +lI +lI +lI +pP +lI +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +jQ +zw +Nv +Nv +Nv +Nv +lI +lI +lI +lI +lI +Nv +Nv tr aj ak @@ -12461,14 +14180,14 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +au +ae +ae +ae aa aa aa @@ -12512,46 +14231,46 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -bh -aa -aa -aa -aa -aa -aa -aa -ad +lI +lI +lI +lI +lI +lI +Nv +Fm +Nv +lI +pP +us +lI +lI +Nv +Eh +Eh +Eh +Eh +Nv +Cr +kT +kT +kT +kT +kT +kT +JU +zw +zw +zw +zw +zw +Nv +hg +us +lI +lI +lI +Nv tr aj ak @@ -12603,15 +14322,15 @@ bq bq bq bq -aa -aa -aa -aa -ac -aa -aa -aa -aa +ae +ae +ae +ae +aC +ae +ae +ae +ae aa aa aa @@ -12652,48 +14371,48 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Fm +Nv +lI +lI +lI +lI +lI +Nv +Eh +lh +uT +Eh +Nv +jQ +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +Nv +lI +lI +lI +lI +lI +Nv tr aj ak @@ -12744,16 +14463,16 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -12788,54 +14507,54 @@ aa aa aa aa +ac aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad +lI +lI +lI +lI +lI +pP +lI +lI +lI +Nv +Fm +Nv +lI +lI +lI +lI +lI +Nv +Eh +rJ +to +IY +kT +qi +zw +Yi +CC +CC +CC +PV +PV +PV +PV +Ue +zw +zw +Nv +lI +lI +lI +lI +lI +Nv tr aj ak @@ -12888,14 +14607,14 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -12933,51 +14652,51 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Fm +Nv +lI +lI +lI +lI +lI +Nv +Eh +of +oq +Eh +Nv +jQ +zw +hl +DB +DB +DB +uO +uO +uO +uO +jH +zw +zw +Nv +lI +lI +hg +lI +lI +Nv tr aj ak @@ -13030,14 +14749,14 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa +ae +au +ae +ae +ae +ae +ae +ae aa aa aa @@ -13069,57 +14788,57 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa ac aa +lI +lI aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ad +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Fm +Nv +lI +lI +lI +pP +lI +Nv +Eh +Eh +Eh +Eh +ss +jQ +zw +hl +DB +DB +DB +uO +uO +uO +uO +jH +zw +zw +Nv +lI +lI +lI +lI +lI +Nv tr aj ak @@ -13171,97 +14890,97 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -xW -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +au +au +au +au +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +pP +lI +lI +lI +lI +lI +lI +Nv +Fm +Nv +lI +lI +lI +lI +lI +Nv +zs +kW +QY +zs +Nv +jQ +zw +hl +DB +DB +DB +uO +uO +uO +uO +jH +zw +zw +Nv +lI +lI +lI +lI +lI +lI tr aj ak @@ -13314,96 +15033,96 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -bp -xW -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +au +au +au +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +lI +lI +lI +lI +lI +RD +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Fm +Nv +lI +lI +lI +lI +lI +Nv +zs +kR +YR +DK +kT +qi +zw +dd +kK +kK +kK +pA +pA +pA +pA +uh +zw +zw +Nv +lI +lI +lI +lI +lI +lI be aj ak @@ -13456,96 +15175,96 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +au +ae +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +lI +lI +lI +lI +Nv +Nv +Nt +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +RX +Rh +Nv +lI +lI +lI +lI +lI +Nv +zs +hS +MZ +zs +Nv +jQ +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +zw +Nv +lI +hg +lI +lI +hg +lI tr aj ak @@ -13597,97 +15316,97 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +au +ae +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +lI +Nv +lI +Nv +Nv +Nv +Fm +Nv +Nv +sT +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +lI +pP +lI +lI +lI +lI +Nv +zs +zs +zs +zs +Nv +bT +Rx +kT +kT +kT +UQ +kT +kT +kT +Yq +zw +zw +zw +Nv +lI +lI +lI +lI +lI +lI bb aj ak @@ -13739,97 +15458,97 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bp +lI +lI +lI +lI +lI +lI +Nv +Fm +Nv +lI +pP +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +pP +lI +lI +lI +lI +lI +lI +lI +lI +lI +pP +lI +lI +lI +Nv +Nv +Nv +Nv +Nv +Nv +jQ +Nv +BF +Wj +hj +Wj +YE +Nv +jQ +Nv +Ce +Nv +lI +lI +lI +lI +lI +lI +lI bc aj ak @@ -13881,12 +15600,12 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae aa aa aa @@ -13898,80 +15617,80 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa +bp +bp +aa +aa +aa +aa +lI +lI +lI +lI +lI +lI +Nv +Fm +Nv +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +pP +lI +lI +lI +pP +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +Nv +BF +BF +Gi +BF +BF +JX +hj +JX +YE +YE +Lw +YE +YE +Nv +lI +lI +lI +pP +lI +lI +lI bb aj ak @@ -14022,12 +15741,12 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae aa aa aa @@ -14046,74 +15765,74 @@ aa aa ac aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +Nv +Nt +RX +ts +RX +jc +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +pP +lI +lI +lI +lI +lI +lI +hg +us +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +Nv +Nv +BF +hV +uL +fJ +BF +BF +BF +YE +YE +WS +pC +dt +YE +Nv +lI +lI +lI +us +lI +lI +lI bc aj ak @@ -14155,107 +15874,107 @@ bq bq bq bq -bp +an bq bq -bp +an bq bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +lI +lI +lI +Nv +DA +pF +Uo +Nv +DA +pF +Uo +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +KU +KU +Nv +Nv +Nv +BF +RH +HO +kP +BF +Nv +Nv +Nv +YE +Ew +mW +Rv +YE +Nv +lI +lI +lI +lI +lI +lI +lI bb aj ak @@ -14297,21 +16016,21 @@ bq bq bq bq -bp +an bq -bp -bp +an +an bq bq bq bq bq bq -aa -aa -aa -aa -ab +ae +ae +ae +ae +ai aa aa aa @@ -14329,75 +16048,75 @@ aa aa aa aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +pP +Nv +DA +pF +Uo +Nv +DA +pF +Uo +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +KU +KU +KU +Nv +Nv +Nv +Nv +BF +BF +BF +BF +BF +Nv +lI +Nv +YE +YE +YE +YE +YE +Nv +hg +lI +lI +lI +lI +lI +lI bc aj ak @@ -14438,23 +16157,23 @@ bq bq bq bq -bp -bp -bp -bp -bp +an +an +an +an +an bq bq bq bq bq -bq -aa -aa -aa -aa -bh -aa +ae +ae +ae +ae +ae +bs +ae aa aa bp @@ -14471,75 +16190,75 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +Nv +DA +pF +Uo +Nv +DA +pF +Uo +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +lI +lI +lI +Nv +Nv +Nv +Nv +Nv +lI +lI +lI +lI +lI +lI +lI +lI tr aj ak @@ -14580,23 +16299,23 @@ bq bq bq bq -bp -bp -bp -bp -bp +an +an +an +an +an bq bq bq bq bq -bq -bp -aa -bp -bp -aa -aa +ae +ax +ae +ax +ax +ae +ae aa bp aa @@ -14613,75 +16332,75 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +Nv +nm +mS +XZ +XZ +XZ +Mp +Uo +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +hg +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +Nv +KU +KU +Nv +Nv +Nv +lI +lI +lI +lI +lI +lI +hg +lI +lI +lI +lI +lI +lI +lI +lI tr aj ak @@ -14717,113 +16436,113 @@ bi bq bq bq -bp +an bq bq -bp +an bq -bp -bp -bp -bp -bp +an +an +an +an +av bq bq bq bq -bq -bq -bp -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ax +ae +ae +ae +ae +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +lI +lI +lI +lI +Nv +DA +ZA +Uo +Nv +DA +ZA +Uo +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +Nv +KU +KU +KU +KU +Nv +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI tr aj ak @@ -14858,27 +16577,27 @@ bi (102,1,1) = {" bq bq -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bq -bq -bq -aa -aa -aa -aa +an +an +an +an +an +an +an +an +an +an +av +av +rm +ae +ae +ae +ae +ae +ae +ae +ae bp bp aa @@ -14897,75 +16616,75 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +Nv +DA +ZA +Uo +Nv +DA +ZA +Uo +Nv +lI +lI +lI +lI +lI +lI +lI +lI TU -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +jN +Nv +Nv +Nv +KU +KU +KU +Nv +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI tr aj ak @@ -14999,114 +16718,114 @@ bi "} (103,1,1) = {" bo -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -aa -bp -bp -bp -bp -bp -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +an +an +an +an +an +an +an +an +an +an +an +an +an +an +ae +ae +ae +ax +ax +ax +ax +ax +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +lI +lI +lI +lI +Nv +DA +ME +Uo +Nv +DA +ME +Uo +Nv +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +aa +aa +aa +lI +lI +lI +lI +lI +lI +lI +lI +Nv +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +KU +KU +KU +Nv +Nv +lI +lI +lI +lI +lI +lI +lI +lI +hg +lI +lI +lI aa tr aj @@ -15141,111 +16860,111 @@ bi "} (104,1,1) = {" br -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -aa -bp -bp -aa -bp -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +an +an +an +an +an +an +an +an +an +an +an +an +an +av +ae +ax +ae +ae +ax +ax +ae +ax +ae +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +lI +lI +lI +lI +Nv +Nv +Nv +Nv +Nv +Nv +Nv +lI +lI +lI +lI +hg +lI +lI +lI +lI +lI +lI +lI +aa +aa +aa +aa +aa +lI +lI +lI +pP +lI +lI +Nv +Nv +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +IZ +Nv +Nv +KU +KU +KU +Nv +Nv +lI +lI +lI +lI +lI +lI +lI +lI aa aa aa @@ -15283,84 +17002,29 @@ bi "} (105,1,1) = {" br -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bq -bp -bp -bp -bp -bp -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +an +an +an +an +an +an +an +an +an +an +an +av +av +rm +ae +ae +ae +ae +ax +ae +ae +ae +ae aa aa aa @@ -15379,6 +17043,28 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI aa aa aa @@ -15387,6 +17073,39 @@ aa aa aa aa +lI +lI +lI +lI +Nv +Nv +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +KU +KU +KU +Nv +lI +lI +lI +lI +lI +lI +lI aa aa aa @@ -15425,81 +17144,29 @@ bi "} (106,1,1) = {" br -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp +an +an +an +an +an +an +an +an +an +an +an +av +av bq -bp -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -15519,6 +17186,27 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +pP +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI aa aa aa @@ -15527,6 +17215,37 @@ aa aa aa aa +lI +lI +lI +lI +Nv +Nv +Nv +KU +KU +Nv +jN +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +KU +KU +KU +Nv +lI +lI +lI +lI +lI aa aa aa @@ -15567,29 +17286,29 @@ bi "} (107,1,1) = {" br -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp +an +an +an +an +an +an +an +an +an +an +an +an +av bq bq -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -15610,6 +17329,25 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI aa aa aa @@ -15619,31 +17357,36 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +Nv +Nv +KU +Nv +Nv +KU +Nv +Nv +Nv +IZ +sT +Nv +Nv +Nv +Nv +Nv +jN +Nv +Nv +KU +KU +KU +Nv +xT +lI +lI +lI aa aa aa @@ -15652,30 +17395,6 @@ aa aa ab bh -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -xW -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa tr aj ak @@ -15709,29 +17428,29 @@ bi "} (108,1,1) = {" br -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp -bp +an +an +an +an +an +an +an +an +an +an +an +an bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -15753,6 +17472,22 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI aa aa aa @@ -15765,51 +17500,35 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +Nv +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +KU +KU +KU +Nv +lI +lI +lI +lI aa aa aa @@ -15852,20 +17571,29 @@ bi (109,1,1) = {" bq bq -bp -bp -bp -bp -bp -bp -bp -bp -bp +an +an +an +an +an +an +an +an +an bq bq bq bq bq +ae +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -15887,6 +17615,21 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI aa aa aa @@ -15896,61 +17639,37 @@ aa aa aa aa +ab aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +Nv +KU +KU +KU +Nv +Nv +Nv +KU +KU +KU +KU +KU +Nv +jN +Nv +Nv +Nv +Nv +Nv +KU +KU +Nv +Nv +lI +lI +lI aa aa aa @@ -15994,19 +17713,33 @@ bi (110,1,1) = {" bq bq -bp -bp -bp -bp -bp -bp -bp -bp -bp +an +an +an +an +an +an +an +an +an bq bq bq bq +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +aa +ae +ae aa aa aa @@ -16026,32 +17759,18 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI aa aa aa @@ -16060,39 +17779,39 @@ aa aa aa ab +bh aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa +lI +lI +Nv +Nv +KU +KU +Nv +Nv +Nv +Nv +KU +KU +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +Nv +KU +Nv +OK +lI +lI +lI aa aa aa @@ -16137,18 +17856,33 @@ bi bq bq bq -bp -bp -bp +an +an +an bq bq bq bq -bp +an bq bq bq bq +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -16172,6 +17906,12 @@ aa aa aa aa +lI +lI +lI +lI +lI +lI aa aa aa @@ -16187,54 +17927,33 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +Nv +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +KU +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +KU +Nv +lI +lI +lI +lI aa aa aa @@ -16280,7 +17999,7 @@ bq bq bq bq -bp +an bq bq bq @@ -16290,48 +18009,22 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +au +ae +ae +Dq +ae +ae +aC +ae +ae +ae +ae +ae aa aa aa @@ -16376,6 +18069,32 @@ aa aa aa aa +hg +us +Nv +KU +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +KU +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +Nv +lI +lI +lI aa aa aa @@ -16434,21 +18153,21 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +au +au +au +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -16493,38 +18212,38 @@ aa aa aa aa +lI +Nv +Nv +KU +KU +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +KU +KU +KU +KU +Nv +Nv +Nv +Nv +lI +lI +lI +lI aa aa aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ab aa aa aa @@ -16576,20 +18295,20 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +au +au +au +au +ae +ae +ae +au +ae +ae +ae +ae aa aa aa @@ -16636,29 +18355,29 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +Nv +Nv +KU +KU +KU +KU +KU +Nv +Nv +Nv +Nv +Nv +KU +KU +KU +KU +KU +KU +Nv +Nv +lI +lI aa aa aa @@ -16718,9 +18437,24 @@ bq bq bq bq +ae +ae +ae +au +au +au +ae +ae +ae +au +au +ae +ae +ae aa aa aa +xW aa aa aa @@ -16763,43 +18497,28 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +Nv +Nv +Nv +Nv +Nv +Nv +Nv +Nv +lI +Nv +Nv +Nv +KU +KU +KU +KU +Nv +Nv +Nv +lI aa aa aa @@ -16860,6 +18579,19 @@ bq bq bq bq +ae +ae +ae +au +au +au +au +ae +ae +ae +ae +ae +ae aa aa aa @@ -16875,19 +18607,6 @@ aa aa aa aa -TU -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa aa aa aa @@ -16921,26 +18640,26 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +Nv +Nv +Nv +Nv +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +Nv +Nv +Nv +Nv +lI aa aa aa @@ -16968,7 +18687,7 @@ bf bk mC mC -mC +JG mC fQ bf @@ -17002,19 +18721,19 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +au +au +au +au +au +ae +ae +ae +ae +ae aa aa aa @@ -17063,26 +18782,26 @@ xW aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +Nv +Nv +Nv +Nv +lI +lI aa aa aa @@ -17144,18 +18863,18 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +au +au +au +au +au +ae +ae +ae +ae aa aa aa @@ -17207,23 +18926,23 @@ aa aa aa aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +pP +lI aa +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI +lI aa aa aa @@ -17284,6 +19003,21 @@ bq bq bq bq +ae +ae +ae +ae +ae +au +au +au +au +au +ae +ae +ae +ae +ae aa aa aa @@ -17339,27 +19073,12 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +lI +lI +lI +hg +lI +lI aa aa aa @@ -17427,20 +19146,20 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +au +au +au +au +au +au +ae +ae +ae +ae aa aa aa @@ -17569,21 +19288,21 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +au +au +au +au +au +au +ae +ae +ae +ae +ae aa aa aa @@ -17711,35 +19430,22 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +ae +au +au +au +au +au +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -17793,6 +19499,19 @@ aa aa ab aa +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ab +bh aa aa aa @@ -17852,27 +19571,27 @@ bq bq bq bq +ae +ae +ae +aC +ae +ae +au +au +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae aa -aa -aa -ac -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae aa aa aa @@ -17994,28 +19713,28 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ae +ae +ae +au +ae +ae +au +au +ae +ae +ae +ae +au +au +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -18136,6 +19855,29 @@ bq bq bq bq +ae +ae +ae +au +au +ae +ae +ae +ae +ae +ae +au +au +au +ae +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -18191,30 +19933,7 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +ab aa aa aa @@ -18278,29 +19997,29 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +ae +ae +ae +Dq +ae +ae +ae +ae +ae +ae +au +ae +ae +au +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -18420,6 +20139,31 @@ bq bq bq bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +au +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq aa aa aa @@ -18461,6 +20205,7 @@ aa aa aa aa +ab aa aa aa @@ -18470,36 +20215,10 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq aa aa aa @@ -18564,6 +20283,31 @@ bq bq bq bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -18611,42 +20355,17 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -18709,6 +20428,29 @@ bq bq bq bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -18755,41 +20497,18 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -18851,31 +20570,31 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae aa aa aa @@ -18910,6 +20629,7 @@ aa aa aa aa +ab aa aa aa @@ -18918,6 +20638,20 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa @@ -18926,23 +20660,8 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr +bq +ba aj ak bf @@ -18993,6 +20712,32 @@ bq bq bq bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae aa aa aa @@ -19033,58 +20778,32 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr +bq +bq +ba aj ak bf @@ -19136,6 +20855,33 @@ bq bq bq bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -19173,61 +20919,34 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj +bq +bq +ba +ba ak bf bf @@ -19278,6 +20997,34 @@ bq bq bq bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -19310,66 +21057,38 @@ aa aa aa aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj +bq +bq +bq +ba +ba ak bf bf @@ -19421,6 +21140,37 @@ bq bq bq bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +au +au +au +au +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -19447,72 +21197,41 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg bf bf am @@ -19563,6 +21282,38 @@ bq bq bq bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +au +au +au +au +au +ae +ae +ae +ae +ae +ae +ae aa aa aa @@ -19587,75 +21338,43 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -bf +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD bf am am @@ -19706,101 +21425,101 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -bf -bf -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +au +ae +ae +ae +ae +ae +ae +ae +ae +ae +bq +bq +bq +bq +bq +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD am am am @@ -19848,110 +21567,110 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -bf -bf -am -am -am -am -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ae +ae +ae +ae +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD am am +nD +nD +nD +nD +nD am am am @@ -19990,112 +21709,112 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -bf -am -am -am -am -am -am -am -am -am -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +aa +aa +aa +aa +aa +bq +bq +bq +bq +bq +aa +aa +aa +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD am am am @@ -20131,114 +21850,114 @@ bq bq bq bq -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -tr -aj -ak -bf -am -am -am -am -am -am -am -am -am -am -am -am -am -am -am +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +ba +ba +bg +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD am am am @@ -20272,114 +21991,114 @@ bq bq bq bq -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl -bl +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq +bq ba ba bg -bi -bi -bi -bi -bi -bi -bi -bi -bi -bi -bi -bi -bi -bi -bi +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD +nD bi bi bi diff --git a/maps/southern_cross/items/encryptionkey_sc.dm b/maps/southern_cross/items/encryptionkey_sc.dm index c84fe0f0ca..3e02f2fc08 100644 --- a/maps/southern_cross/items/encryptionkey_sc.dm +++ b/maps/southern_cross/items/encryptionkey_sc.dm @@ -6,7 +6,7 @@ /obj/item/device/encryptionkey/explorer name = "explorer radio encryption key" icon_state = "com_cypherkey" - channels = list("Explorer" = 1) + channels = list("Explorer" = 1, "Science" = 1) /obj/item/device/encryptionkey/sar name = "sar's encryption key" diff --git a/maps/southern_cross/southern_cross_jobs.dm b/maps/southern_cross/southern_cross_jobs.dm index 9d7988dd22..0903a3ac3d 100644 --- a/maps/southern_cross/southern_cross_jobs.dm +++ b/maps/southern_cross/southern_cross_jobs.dm @@ -75,16 +75,16 @@ var/const/access_explorer = 43 /datum/job/explorer title = "Explorer" flag = EXPLORER - departments = list(DEPARTMENT_PLANET) - department_flag = CIVILIAN + departments = list(DEPARTMENT_RESEARCH, DEPARTMENT_PLANET) + department_flag = MEDSCI faction = "Station" total_positions = 4 spawn_positions = 4 - supervisors = "the Head of Personnel" - selection_color = "#515151" + supervisors = "the Research Director" + selection_color = "#633D63" economic_modifier = 4 - access = list(access_explorer) - minimal_access = list(access_explorer) + access = list(access_explorer, access_research) + minimal_access = list(access_explorer, access_research) outfit_type = /decl/hierarchy/outfit/job/explorer2 job_description = "An Explorer searches for interesting things on the surface of Sif, and returns them to the station." diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index 7b1f4e67c7..f30a7570b2 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -31268,15 +31268,15 @@ "bcf" = ( /obj/effect/floor_decal/corner/grey/diagonal, /obj/structure/table/standard, -/obj/item/frame/noticeboard{ - pixel_x = 32 - }, /obj/item/weapon/paper{ desc = ""; info = "Yes hello, the goat in the freezer is named 'Spike'. Please do not fuck with Spike. He doesn't have the best temper."; name = "Important notice from Rancher Jim" }, /obj/item/weapon/book/manual/chef_recipes, +/obj/structure/noticeboard{ + pixel_x = 32 + }, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) "bcg" = ( @@ -33396,8 +33396,8 @@ /turf/simulated/floor/tiled, /area/tether/surfacebase/servicebackroom) "bgf" = ( -/obj/item/frame/noticeboard{ - pixel_y = 26 +/obj/structure/noticeboard{ + pixel_y = 29 }, /turf/simulated/floor/tiled/white, /area/crew_quarters/kitchen) @@ -38722,7 +38722,9 @@ "hCz" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/door/airlock/hatch, +/obj/machinery/door/airlock/hatch{ + req_one_access = list() + }, /obj/machinery/door/firedoor, /turf/simulated/floor/tiled/techfloor, /area/tether/surfacebase/shuttle_pad) diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm index b862df5b96..849c92f6ae 100644 --- a/maps/tether/tether-07-station3.dmm +++ b/maps/tether/tether-07-station3.dmm @@ -15572,7 +15572,7 @@ dir = 4; id = "QMLoad" }, -/turf/simulated/floor, +/turf/simulated/floor/tiled, /area/quartermaster/storage) "aIY" = ( /obj/machinery/conveyor{ @@ -22662,6 +22662,13 @@ }, /turf/simulated/floor/tiled, /area/hallway/station/upper) +"hai" = ( +/obj/machinery/conveyor{ + dir = 4; + id = "QMLoad" + }, +/turf/simulated/floor/tiled, +/area/quartermaster/storage) "hid" = ( /obj/effect/floor_decal/borderfloor{ dir = 1 @@ -22923,7 +22930,7 @@ id = "QMLoad" }, /obj/structure/disposalpipe/segment, -/turf/simulated/floor, +/turf/simulated/floor/tiled, /area/quartermaster/storage) "iJT" = ( /obj/structure/shuttle/engine/heater, @@ -39445,7 +39452,7 @@ aCN aGO aGO aIv -aGR +hai azO tVq aab diff --git a/maps/tether/tether_defines.dm b/maps/tether/tether_defines.dm index 9753e1d717..6005927002 100644 --- a/maps/tether/tether_defines.dm +++ b/maps/tether/tether_defines.dm @@ -203,7 +203,8 @@ lateload_single_pick = null //Nothing right now. - planet_datums_to_make = list(/datum/planet/virgo3b) + planet_datums_to_make = list(/datum/planet/virgo3b, + /datum/planet/virgo4) /datum/map/tether/perform_map_generation() @@ -227,6 +228,10 @@ Z_LEVEL_SURFACE_MINE, Z_LEVEL_SOLARS, Z_LEVEL_PLAINS + ) +/datum/planet/virgo4 + expected_z_levels = list( + Z_LEVEL_BEACH ) // Overmap represetation of tether diff --git a/tgui/packages/tgui/interfaces/AppearanceChanger.js b/tgui/packages/tgui/interfaces/AppearanceChanger.js index ca2d7b4952..647e6f66ff 100644 --- a/tgui/packages/tgui/interfaces/AppearanceChanger.js +++ b/tgui/packages/tgui/interfaces/AppearanceChanger.js @@ -15,6 +15,9 @@ export const AppearanceChanger = (props, context) => { gender_id, hair_style, facial_hair_style, + ear_style, + tail_style, + wing_style, change_race, change_gender, change_eye_color, @@ -77,6 +80,15 @@ export const AppearanceChanger = (props, context) => { {facial_hair_style ? capitalize(facial_hair_style) : "Not Set"} + + {ear_style ? capitalize(ear_style) : "Not Set"} + + + {tail_style ? capitalize(tail_style) : "Not Set"} + + + {wing_style ? capitalize(wing_style) : "Not Set"} + @@ -115,11 +127,28 @@ export const AppearanceChanger = (props, context) => { ) : null} {change_hair ? ( - setTabIndex(3)}> - Hair - + + setTabIndex(3)}> + Hair + + setTabIndex(5)}> + Ear + + setTabIndex(6)}> + Tail + + setTabIndex(7)}> + Wing + + ) : null} {change_facial_hair ? ( { {(change_color && tabIndex === 2) ? : null} {(change_hair && tabIndex === 3) ? : null} {(change_facial_hair && tabIndex === 4) ? : null} + {(change_hair && tabIndex === 5) ? : null} + {(change_hair && tabIndex === 6) ? : null} + {(change_hair && tabIndex === 7) ? : null} @@ -212,6 +244,12 @@ const AppearanceChangerColors = (props, context) => { skin_color, hair_color, facial_hair_color, + ears_color, + ears2_color, + tail_color, + tail2_color, + wing_color, + wing2_color, } = data; return ( @@ -234,10 +272,36 @@ const AppearanceChangerColors = (props, context) => { ) : null} {change_hair_color ? ( - - -