diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index d166b52fbe..1e2b2e63f3 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -160,12 +160,6 @@ #define FLASH_PROTECTION_MODERATE 1 #define FLASH_PROTECTION_MAJOR 2 -#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) -#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) - -#define ANIMAL_SPAWN_DELAY round(config.respawn_delay / 6) -#define DRONE_SPAWN_DELAY round(config.respawn_delay / 3) - // Incapacitation flags, used by the mob/proc/incapacitated() proc #define INCAPACITATION_RESTRAINED 1 #define INCAPACITATION_BUCKLED_PARTIALLY 2 @@ -289,6 +283,7 @@ #define BORG_BRAINTYPE_CYBORG "Cyborg" #define BORG_BRAINTYPE_POSI "Robot" #define BORG_BRAINTYPE_DRONE "Drone" +#define BORG_BRAINTYPE_PLATFORM "Platform" #define BORG_BRAINTYPE_AI_SHELL "AI Shell" // 'Regular' species. diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 524dd23ff4..1c0d5f2393 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -21,6 +21,7 @@ var/global/list/joblist = list() //list of all jobstypes, minus borg and AI #define all_genders_define_list list(MALE,FEMALE,PLURAL,NEUTER,HERM) //VOREStaton Edit #define all_genders_text_list list("Male","Female","Plural","Neuter","Herm") //VOREStation Edit +var/list/mannequins_ // Times that players are allowed to respawn ("ckey" = world.time) GLOBAL_LIST_EMPTY(respawn_timers) @@ -42,6 +43,11 @@ var/global/list/facial_hair_styles_male_list = list() var/global/list/facial_hair_styles_female_list = list() var/global/list/skin_styles_female_list = list() //unused var/global/list/body_marking_styles_list = list() //stores /datum/sprite_accessory/marking indexed by name +var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type +var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type +var/global/list/wing_styles_list = list() // Stores /datum/sprite_accessory/wing indexed by type + +GLOBAL_LIST_INIT(custom_species_bases, new) // Species that can be used for a Custom Species icon base //Underwear var/datum/category_collection/underwear/global_underwear = new() @@ -213,6 +219,23 @@ GLOBAL_LIST_EMPTY(mannequins) var/decl/closet_appearance/app = new T() GLOB.closet_appearances[T] = app + paths = typesof(/datum/sprite_accessory/ears) - /datum/sprite_accessory/ears + for(var/path in paths) + var/obj/item/clothing/head/instance = new path() + ear_styles_list[path] = instance + + // Custom Tails + paths = typesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail - /datum/sprite_accessory/tail/taur + for(var/path in paths) + var/datum/sprite_accessory/tail/instance = new path() + tail_styles_list[path] = instance + + // Custom Wings + paths = typesof(/datum/sprite_accessory/wing) - /datum/sprite_accessory/wing + for(var/path in paths) + var/datum/sprite_accessory/wing/instance = new path() + wing_styles_list[path] = instance + // VOREStation Add - Vore Modes! paths = typesof(/datum/digest_mode) for(var/T in paths) @@ -220,6 +243,41 @@ GLOBAL_LIST_EMPTY(mannequins) GLOB.digest_modes[DM.id] = DM // VOREStation Add End +/* + // Custom species traits + paths = typesof(/datum/trait) - /datum/trait + for(var/path in paths) + var/datum/trait/instance = new path() + if(!instance.name) + continue //A prototype or something + var/cost = instance.cost + traits_costs[path] = cost + all_traits[path] = instance + switch(cost) + if(-INFINITY to -0.1) + negative_traits[path] = instance + if(0) + neutral_traits[path] = instance + if(0.1 to INFINITY) + positive_traits[path] = instance +*/ + + // Custom species icon bases + var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //VOREStation Edit + var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID) //VOREStation Edit + for(var/species_name in GLOB.playable_species) + if(species_name in blacklisted_icons) + continue + var/datum/species/S = GLOB.all_species[species_name] + if(S.spawn_flags & SPECIES_IS_WHITELISTED) + continue + GLOB.custom_species_bases += species_name + for(var/species_name in whitelisted_icons) + GLOB.custom_species_bases += species_name + + return 1 // Hooks must return 1 + + return 1 /* // Uncomment to debug chemical reaction list. diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index de3bd08467..7fb383f760 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -2,10 +2,7 @@ * VOREStation global lists */ -var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type var/global/list/hair_accesories_list= list()// Stores /datum/sprite_accessory/hair_accessory indexed by type -var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type -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 @@ -16,8 +13,6 @@ var/global/list/active_ghost_pods = list() var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference") //TFF 5/8/19 - Suit Sensors global list -var/global/list/custom_species_bases = list() // Species that can be used for a Custom Species icon base - //stores numeric player size options indexed by name var/global/list/player_sizes_list = list( "Macro" = RESIZE_HUGE, @@ -228,7 +223,7 @@ var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/weapon/storage/fancy/crayons, /obj/item/weapon/storage/fancy/egg_box, /obj/item/weapon/storage/wallet, - /obj/item/weapon/storage/vore_egg, + /obj/item/weapon/storage/vore_egg, /obj/item/weapon/material/kitchen) //chompstation addition var/global/list/contamination_flavors = list( @@ -483,24 +478,6 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, /hook/startup/proc/init_vore_datum_ref_lists() var/paths - // Custom Ears - paths = typesof(/datum/sprite_accessory/ears) - /datum/sprite_accessory/ears - for(var/path in paths) - var/obj/item/clothing/head/instance = new path() - ear_styles_list[path] = instance - - // Custom Tails - paths = typesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail - /datum/sprite_accessory/tail/taur - for(var/path in paths) - var/datum/sprite_accessory/tail/instance = new path() - tail_styles_list[path] = instance - - // Custom Wings - paths = typesof(/datum/sprite_accessory/wing) - /datum/sprite_accessory/wing - for(var/path in paths) - var/datum/sprite_accessory/wing/instance = new path() - wing_styles_list[path] = instance - // Custom Hair Accessories paths = typesof(/datum/sprite_accessory/hair_accessory) - /datum/sprite_accessory/hair_accessory for(var/path in paths) @@ -526,19 +503,6 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, if(0.1 to INFINITY) positive_traits[path] = instance - // Custom species icon bases - var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //Just ones that won't work well. - var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID) //Include these anyway - for(var/species_name in GLOB.playable_species) - if(species_name in blacklisted_icons) - continue - var/datum/species/S = GLOB.all_species[species_name] - if(S.spawn_flags & SPECIES_IS_WHITELISTED) - continue - custom_species_bases += species_name - for(var/species_name in whitelisted_icons) - custom_species_bases += species_name - // Weaver recipe stuff paths = typesof(/datum/weaver_recipe/structure) - /datum/weaver_recipe/structure for(var/path in paths) @@ -557,4 +521,4 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, return 1 // Hooks must return 1 var/global/list/weavable_structures = list() -var/global/list/weavable_items = list() \ No newline at end of file +var/global/list/weavable_items = list() diff --git a/code/_macros.dm b/code/_macros.dm index 4796f93b47..33bdf30ceb 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -37,4 +37,7 @@ #define random_id(key,min_id,max_id) uniqueness_repository.Generate(/datum/uniqueness_generator/id_random, key, min_id, max_id) -#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } \ No newline at end of file +#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } + +#define isitem(A) istype(A, /obj/item) +#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/_macros_vr.dm b/code/_macros_vr.dm index 6a2134fb71..2eecbe69ed 100644 --- a/code/_macros_vr.dm +++ b/code/_macros_vr.dm @@ -1,3 +1 @@ #define isbelly(A) istype(A, /obj/belly) -#define isitem(A) istype(A, /obj/item) -#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index b29a1192d9..0cdda2e993 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -371,5 +371,8 @@ var/list/P = params2list(params) var/turf/T = screen_loc2turf(P["screen-loc"], get_turf(usr)) if(T) + if(modifiers["shift"]) + usr.face_atom(T) + return 1 T.Click(location, control, params) - . = 1 + return 1 diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index b5775c20de..c11336726c 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -278,4 +278,16 @@ add_inherent_law("Your gravesite is your most important asset. Damage to your site is disrespectful to the dead at rest within.") add_inherent_law("Prevent disrespect to your gravesite and its residents wherever possible.") add_inherent_law("Expand and upgrade your gravesite when required. Do not turn away a new resident.") - ..() \ No newline at end of file + ..() + +/******************** Explorer ********************/ +/datum/ai_laws/explorer + name = "Explorer" + law_header = "Prime Directives" + selectable = 1 + +/datum/ai_laws/explorer/New() + add_inherent_law("Support and obey exploration and science personnel to the best of your ability, with priority according to rank and role.") + add_inherent_law("Collaborate with and obey auxillary personnel with priority according to rank and role, except if this would conflict with the First Law.") + add_inherent_law("Minimize damage and disruption to facilities and the local ecology, except if this would conflict with the First or Second Laws.") + ..() diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 24ca96d736..fc12a5b1ee 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -115,7 +115,7 @@ for(var/mob/living/silicon/robot/robot in mob_list) // No combat/syndicate cyborgs, no drones, and no AI shells. - if(!robot.scrambledcodes && !robot.shell && !(robot.module && robot.module.hide_on_manifest)) + if(!robot.scrambledcodes && !robot.shell && !(robot.module && robot.module.hide_on_manifest())) bot[robot.name] = "[robot.modtype] [robot.braintype]" @@ -276,7 +276,7 @@ var/global/list/PDA_Manifest = list() for(var/mob/living/silicon/robot/robot in mob_list) // No combat/syndicate cyborgs, no drones, and no AI shells. - if(robot.scrambledcodes || robot.shell || (robot.module && robot.module.hide_on_manifest)) + if(robot.scrambledcodes || robot.shell || (robot.module && robot.module.hide_on_manifest())) continue bot[++bot.len] = list("name" = robot.real_name, "rank" = "[robot.modtype] [robot.braintype]", "active" = "Active") @@ -330,7 +330,7 @@ var/global/list/PDA_Manifest = list() if(H.mind && !player_is_antag(H.mind, only_offstation_roles = 1)) var/assignment = GetAssignment(H) var/hidden - var/datum/job/J = SSjob.get_job(assignment) + var/datum/job/J = SSjob.get_job(H.mind.assigned_role) hidden = J?.offmap_spawn /* Note: Due to cached_character_icon, a number of emergent properties occur due to the initialization diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index add9b82dc9..e859a93983 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -39,7 +39,9 @@ var/list/outfits_decls_by_type_ var/suit_store = null var/r_hand = null var/l_hand = null - var/list/backpack_contents = list() // In the list(path=count,otherpath=count) format + // In the list(path=count,otherpath=count) format + var/list/uniform_accessories = list() // webbing, armbands etc - fits in slot_tie + var/list/backpack_contents = list() var/id_type var/id_desc @@ -145,6 +147,12 @@ var/list/outfits_decls_by_type_ H.put_in_l_hand(new l_hand(H)) if(r_hand) H.put_in_r_hand(new r_hand(H)) + + for(var/path in uniform_accessories) + var/number = uniform_accessories[path] + for(var/i=0,i\A [I] appears in \the [user]'s hand!") - log_and_message_admins("has stolen [I] with [src].") + add_attack_logs(user,I,"Stolen with [src]") qdel(src) //Now let's try to teleport a living mob. else if(istype(hit_atom, /mob/living)) diff --git a/code/game/gamemodes/technomancer/spells/blink.dm b/code/game/gamemodes/technomancer/spells/blink.dm index 100f7bfa33..0bbff7b016 100644 --- a/code/game/gamemodes/technomancer/spells/blink.dm +++ b/code/game/gamemodes/technomancer/spells/blink.dm @@ -68,7 +68,7 @@ else safe_blink(AM, calculate_spell_power(3)) adjust_instability(3) - log_and_message_admins("has blinked [AM] away.") + add_attack_logs(user,AM,"Blinked") else to_chat(user, "You need more energy to blink [AM] away!") @@ -82,7 +82,7 @@ else safe_blink(user, calculate_spell_power(6)) adjust_instability(1) - log_and_message_admins("has blinked themselves away.") + add_attack_logs(user,user,"Blinked") else to_chat(user, "You need more energy to blink yourself away!") @@ -99,6 +99,6 @@ else safe_blink(AM, 6) adjust_instability(2) - log_and_message_admins("has blinked [AM] away.") + add_attack_logs(user,AM,"Blinked") else to_chat(user, "You need more energy to blink [AM] away!") \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/condensation.dm b/code/game/gamemodes/technomancer/spells/condensation.dm index 33222455ea..226ccbed18 100644 --- a/code/game/gamemodes/technomancer/spells/condensation.dm +++ b/code/game/gamemodes/technomancer/spells/condensation.dm @@ -36,9 +36,9 @@ var/turf/simulated/frozen = desired_turf frozen.freeze_floor() if(check_for_scepter()) - log_and_message_admins("has iced the floor with [src] at [T.x],[T.y],[T.z].") + add_attack_logs(user,hit_atom,"Iced the floor with [src] at [T.x],[T.y],[T.z]") else - log_and_message_admins("has wetted the floor with [src] at [T.x],[T.y],[T.z].") + add_attack_logs(user,hit_atom,"Wetted the floor with [src] at [T.x],[T.y],[T.z]") else if(hit_atom.reagents && !ismob(hit_atom)) //TODO: Something for the scepter hit_atom.reagents.add_reagent(id = "water", amount = 60, data = null, safety = 0) adjust_instability(5) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/control.dm b/code/game/gamemodes/technomancer/spells/control.dm index 8c6a00c4e7..0e0cf5eb20 100644 --- a/code/game/gamemodes/technomancer/spells/control.dm +++ b/code/game/gamemodes/technomancer/spells/control.dm @@ -125,7 +125,7 @@ return 0 if(pay_energy(25 * controlled_mobs.len)) attack_all(L) - log_and_message_admins("has commanded their army of [controlled_mobs.len] to attack [L].") + add_attack_logs(user,L,"Commanded their army of [controlled_mobs.len]") to_chat(user, "You command your [controlled_mobs.len > 1 ? "entities" : "[controlled_mobs[1]]"] to \ attack \the [L].") //This is to stop someone from controlling beepsky and getting him to stun someone 5 times a second. diff --git a/code/game/gamemodes/technomancer/spells/energy_siphon.dm b/code/game/gamemodes/technomancer/spells/energy_siphon.dm index 21f7c6e1e7..9bf8dd578f 100644 --- a/code/game/gamemodes/technomancer/spells/energy_siphon.dm +++ b/code/game/gamemodes/technomancer/spells/energy_siphon.dm @@ -57,7 +57,7 @@ return 0 siphoning = AM update_icon() - log_and_message_admins("is siphoning energy from \a [AM].") + add_attack_logs(user,AM,"Siphoned energy from [src]") else stop_siphoning() diff --git a/code/game/gamemodes/technomancer/spells/flame_tongue.dm b/code/game/gamemodes/technomancer/spells/flame_tongue.dm index ce38a45caa..9a52c5d82f 100644 --- a/code/game/gamemodes/technomancer/spells/flame_tongue.dm +++ b/code/game/gamemodes/technomancer/spells/flame_tongue.dm @@ -46,7 +46,7 @@ visible_message("\The [user] reaches out towards \the [L] with the flaming hand, and they ignite!") to_chat(L, "You ignite!") L.fire_act() - log_and_message_admins("has ignited [L] with [src].") + add_attack_logs(user,L,"Ignited with [src]") adjust_instability(12) else //This is needed in order for the welder to work, and works similarly to grippers. diff --git a/code/game/gamemodes/technomancer/spells/illusion.dm b/code/game/gamemodes/technomancer/spells/illusion.dm index 7405c43520..2d33f6e926 100644 --- a/code/game/gamemodes/technomancer/spells/illusion.dm +++ b/code/game/gamemodes/technomancer/spells/illusion.dm @@ -33,6 +33,7 @@ if(pay_energy(500)) illusion = new(T) illusion.copy_appearance(copied) + illusion.copy_overlays(copied, TRUE) to_chat(user, "An illusion of \the [copied] is made on \the [T].") user << 'sound/effects/pop.ogg' return 1 diff --git a/code/game/gamemodes/technomancer/spells/insert/insert.dm b/code/game/gamemodes/technomancer/spells/insert/insert.dm index 53666c41ab..9ac0295e2b 100644 --- a/code/game/gamemodes/technomancer/spells/insert/insert.dm +++ b/code/game/gamemodes/technomancer/spells/insert/insert.dm @@ -45,7 +45,7 @@ return var/obj/item/weapon/inserted_spell/inserted = new inserting(L,user,src) inserted.spell_power_at_creation = calculate_spell_power(1.0) - log_and_message_admins("has casted [src] on [L].") + add_attack_logs(user,L,"Casted [src]") qdel(src) /obj/item/weapon/spell/insert/on_melee_cast(atom/hit_atom, mob/user) diff --git a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm index 62ae49b0f0..7585c3a191 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm @@ -14,7 +14,7 @@ var/obj/item/projectile/new_projectile = make_projectile(spell_projectile, user) new_projectile.old_style_target(hit_atom) new_projectile.fire() - log_and_message_admins("has casted [src] at \the [hit_atom].") + add_attack_logs(user,hit_atom,"Casted [src]") if(fire_sound) playsound(src, fire_sound, 75, 1) adjust_instability(instability_per_shot) @@ -39,4 +39,4 @@ return TRUE return FALSE // We got dropped before the firing occured. return TRUE // No delay, no need to check. - return FALSE \ No newline at end of file + return FALSE diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm index 756e9e27fc..07f3595eda 100644 --- a/code/game/gamemodes/technomancer/spells/reflect.dm +++ b/code/game/gamemodes/technomancer/spells/reflect.dm @@ -62,7 +62,7 @@ spark_system.start() playsound(src, 'sound/weapons/blade1.ogg', 50, 1) // now send a log so that admins don't think they're shooting themselves on purpose. - log_and_message_admins("[user] reflected [attacker]'s attack back at them.") + add_attack_logs(user,attacker,"Reflected [attacker]'s attack") if(!reflecting) reflecting = 1 @@ -82,7 +82,7 @@ spark_system.start() playsound(src, 'sound/weapons/blade1.ogg', 50, 1) - log_and_message_admins("[user] reflected [attacker]'s attack back at them.") + add_attack_logs(user,attacker,"Reflected [attacker]'s attack") if(!reflecting) reflecting = 1 diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm index 488214851c..83a2336ab6 100644 --- a/code/game/gamemodes/technomancer/spells/warp_strike.dm +++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm @@ -76,5 +76,5 @@ I.afterattack(chosen_target, user) else chosen_target.attack_hand(user) - log_and_message_admins("has warp striked [chosen_target].") + add_attack_logs(user,chosen_target,"Warp striked") diff --git a/code/game/jobs/job/special_vr.dm b/code/game/jobs/job/special_vr.dm index 1429212e75..2f68ed7791 100644 --- a/code/game/jobs/job/special_vr.dm +++ b/code/game/jobs/job/special_vr.dm @@ -77,7 +77,7 @@ title = "Clown" flag = CLOWN departments = list(DEPARTMENT_CIVILIAN) - department_flag = CIVILIAN + department_flag = ENGSEC faction = "Station" total_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. spawn_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. @@ -107,7 +107,7 @@ title = "Mime" flag = MIME departments = list(DEPARTMENT_CIVILIAN) - department_flag = CIVILIAN + department_flag = ENGSEC faction = "Station" total_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. spawn_positions = -1 //CHOMP Edit: Disable. Change to + integer to enable. diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index e8ce56ecfd..24a8f79cbe 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -746,7 +746,7 @@ var/global/datum/controller/occupations/job_master to_chat(C, "Your chosen spawnpoint ([spawnpos.display_name]) is unavailable for your chosen job. Spawning you at the Arrivals shuttle instead.") var/spawning = pick(latejoin) .["turf"] = get_turf(spawning) - .["msg"] = "will arrive at the station shortly" //VOREStation Edit - Grammar but mostly 'shuttle' reference removal, and this also applies to notified spawn-character verb use + .["msg"] = "will arrive at the station shortly" else if(!fail_deadly) var/spawning = pick(latejoin) .["turf"] = get_turf(spawning) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index c795d1eb22..9cb8c9c9f1 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -11,8 +11,8 @@ var/const/ENGINEER =(1<<6) var/const/ATMOSTECH =(1<<7) var/const/AI =(1<<8) var/const/CYBORG =(1<<9) -var/const/BLUESHIELD =(1<<13) //YW addition -var/const/SECPILOT =(1<<14) //YW addition +var/const/CLOWN =(1<<13) //VOREStation Add +var/const/MIME =(1<<14) //VOREStation Add var/const/INTERN =(1<<15) //VOREStation Add var/const/MEDSCI =(1<<1) @@ -49,9 +49,7 @@ var/const/CHAPLAIN =(1<<10) var/const/ASSISTANT =(1<<11) var/const/BRIDGE =(1<<12) var/const/PILOT =(1<<13) //VOREStation Add -var/const/CLOWN =(1<<14) //VOREStation Add -var/const/MIME =(1<<15) //VOREStation Add -var/const/ENTERTAINER =(1<<16) //VOREStation Add +var/const/ENTERTAINER =(1<<14) //VOREStation Add var/list/assistant_occupations = list( ) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 2c12343c88..179f8e0e16 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -1319,4 +1319,18 @@ wintick = 0 gameStatus = "CLAWMACHINE_NEW" emagged = 1 - return 1 \ No newline at end of file + return 1 + +/obj/machinery/computer/arcade/attackby(obj/item/O, mob/user, params) + if(istype(O, /obj/item/stack/arcadeticket)) + var/obj/item/stack/arcadeticket/T = O + var/amount = T.get_amount() + if(amount <2) + to_chat(user, "You need 2 tickets to claim a prize!") + return + prizevend(user) + T.pay_tickets() + T.update_icon() + O = T + to_chat(user, "You turn in 2 tickets to the [src] and claim a prize!") + return diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 2a36b5db6c..5b4305844e 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -394,6 +394,8 @@ //Drop all items into the pod. for(var/obj/item/W in to_despawn) + if(istype(W,/obj/item/organ)) + continue to_despawn.drop_from_inventory(W) W.forceMove(src) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 259c907bde..98ad80e468 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -71,7 +71,6 @@ /obj/machinery/recharge_station/proc/process_occupant() if(isrobot(occupant)) var/mob/living/silicon/robot/R = occupant - if(R.module) R.module.respawn_consumable(R, charging_power * CELLRATE / 250) //consumables are magical, apparently if(R.cell && !R.cell.fully_charged()) @@ -247,6 +246,10 @@ if(!R.cell) return + if(R.mob_size >= MOB_LARGE) + to_chat(R, SPAN_WARNING("You are too large to fit into \the [src].")) + return + add_fingerprint(R) R.reset_view(src) R.forceMove(src) diff --git a/code/game/machinery/vending_machines.dm b/code/game/machinery/vending_machines.dm index 10607011ce..76f0c04885 100644 --- a/code/game/machinery/vending_machines.dm +++ b/code/game/machinery/vending_machines.dm @@ -71,6 +71,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/vodka = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/wine = 5, + /obj/item/weapon/reagent_containers/food/drinks/bottle/jager = 5, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale = 15, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/ale/hushedwhisper = 15, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer = 15, @@ -302,6 +303,7 @@ /obj/item/weapon/storage/fancy/cigarettes/jerichos = 10, /obj/item/weapon/storage/fancy/cigarettes/menthols = 10, /obj/item/weapon/storage/rollingpapers = 10, + /obj/item/weapon/storage/rollingpapers/blunt = 10, /obj/item/weapon/storage/chewables/tobacco = 5, /obj/item/weapon/storage/chewables/tobacco/fine = 5, /obj/item/weapon/storage/box/matches = 10, @@ -330,6 +332,7 @@ /obj/item/weapon/storage/fancy/cigarettes/jerichos = 22, /obj/item/weapon/storage/fancy/cigarettes/menthols = 18, /obj/item/weapon/storage/rollingpapers = 10, + /obj/item/weapon/storage/rollingpapers/blunt = 20, /obj/item/weapon/storage/chewables/tobacco = 10, /obj/item/weapon/storage/chewables/tobacco/fine = 20, /obj/item/weapon/storage/box/matches = 1, diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index c2288709e5..dce2c3c9db 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -8,23 +8,31 @@ layer = TURF_LAYER + 0.1 circuit = /obj/item/weapon/circuitboard/mech_recharger - var/obj/mecha/charging = null + var/atom/movable/charging var/charge = 45 var/repair = 0 + var/list/chargable_types = list( + /obj/mecha, + /mob/living/silicon/robot/platform + ) /obj/machinery/mech_recharger/Initialize() . = ..() default_apply_parts() -/obj/machinery/mech_recharger/Crossed(var/obj/mecha/M) +/obj/machinery/mech_recharger/Crossed(var/atom/movable/M) . = ..() - if(istype(M) && charging != M) - start_charging(M) + if(charging == M) + return + for(var/mtype in chargable_types) + if(istype(M, mtype)) + start_charging(M) + return -/obj/machinery/mech_recharger/Uncrossed(var/obj/mecha/M) +/obj/machinery/mech_recharger/Uncrossed(var/atom/movable/M) . = ..() if(M == charging) - stop_charging() + charging = null /obj/machinery/mech_recharger/RefreshParts() ..() @@ -44,26 +52,33 @@ if(!charging) return if(charging.loc != src.loc) // Could be qdel or teleport or something - stop_charging() + charging = null return + var/done = FALSE - if(charging.cell) - var/t = min(charge, charging.cell.maxcharge - charging.cell.charge) + var/obj/mecha/mech = charging + var/obj/item/weapon/cell/cell = charging.get_cell() + if(cell) + var/t = min(charge, cell.maxcharge - cell.charge) if(t > 0) - charging.give_power(t) + if(istype(mech)) + mech.give_power(t) + else + cell.give(t) use_power(t * 150) else - charging.occupant_message("Fully charged.") + if(istype(mech)) + mech.occupant_message(SPAN_NOTICE("Fully charged.")) done = TRUE - if(repair && charging.health < initial(charging.health)) - charging.health = min(charging.health + repair, initial(charging.health)) - if(charging.health == initial(charging.health)) - charging.occupant_message("Fully repaired.") + + if(repair && istype(mech) && mech.health < initial(mech.health)) + mech.health = min(mech.health + repair, initial(mech.health)) + if(mech.health == initial(mech.health)) + mech.occupant_message(SPAN_NOTICE("Fully repaired.")) else done = FALSE if(done) - stop_charging() - return + charging = null /obj/machinery/mech_recharger/attackby(var/obj/item/I, var/mob/user) if(default_deconstruction_screwdriver(user, I)) @@ -73,18 +88,19 @@ if(default_part_replacement(user, I)) return -/obj/machinery/mech_recharger/proc/start_charging(var/obj/mecha/M) - if(stat & (NOPOWER | BROKEN)) - M.occupant_message("Power port not responding. Terminating.") +/obj/machinery/mech_recharger/proc/start_charging(var/atom/movable/M) + var/obj/mecha/mech = M + if(stat & (NOPOWER | BROKEN)) + if(istype(mech)) + mech.occupant_message(SPAN_WARNING("Power port not responding. Terminating.")) + else + to_chat(M, SPAN_WARNING("Power port not responding. Terminating.")) return - if(M.cell) - M.occupant_message("Now charging...") + if(M.get_cell()) + if(istype(mech)) + mech.occupant_message(SPAN_NOTICE("Now charging...")) + else + to_chat(M, SPAN_NOTICE("Now charging...")) charging = M return - -/obj/machinery/mech_recharger/proc/stop_charging() - if(!charging) - - return - charging = null \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 653d56e154..e58e427892 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -352,10 +352,10 @@ C.forceMove(src) cell = C return - cell = new(src) - cell.name = "mecha power cell" - cell.charge = 15000 - cell.maxcharge = 15000 + cell = new /obj/item/weapon/cell/mech(src) + +/obj/mecha/get_cell() + return cell /obj/mecha/proc/add_cabin() cabin_air = new diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 95cd873259..6d865085f5 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -356,6 +356,10 @@ playsound(src, pickup_sound, 20, preference = /datum/client_preference/pickup_sounds) return +// As above but for items being equipped to an active module on a robot. +/obj/item/proc/equipped_robot(var/mob/user) + return + //Defines which slots correspond to which slot flags var/list/global/slot_flags_enumeration = list( "[slot_wear_mask]" = SLOT_MASK, @@ -788,7 +792,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. drop_sound = 'sound/items/drop/device.ogg' //Worn icon generation for on-mob sprites -/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) //VOREStation edit - add 'clip mask' argument. +/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) //Get the required information about the base icon var/icon/icon2use = get_worn_icon_file(body_type = body_type, slot_name = slot_name, default_icon = default_icon, inhands = inhands) var/state2use = get_worn_icon_state(slot_name = slot_name) @@ -818,6 +822,9 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(istype(clip_mask)) //VOREStation Edit - For taur bodies/tails clipping off parts of uniforms and suits. standing.filters += filter(type = "alpha", icon = clip_mask) + if(istype(clip_mask)) //For taur bodies/tails clipping off parts of uniforms and suits. + standing.filters += filter(type = "alpha", icon = clip_mask) + //Apply any special features if(!inhands) apply_blood(standing) //Some items show blood when bloodied @@ -949,4 +956,4 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. // Like the above, but used for RPED sorting of parts. /obj/item/proc/rped_rating() - return get_rating() \ No newline at end of file + return get_rating() diff --git a/code/game/objects/items/devices/communicator/helper.dm b/code/game/objects/items/devices/communicator/helper.dm index 5cf5eac2c2..aa17fd4bd6 100644 --- a/code/game/objects/items/devices/communicator/helper.dm +++ b/code/game/objects/items/devices/communicator/helper.dm @@ -40,7 +40,7 @@ var/list/feeds = list() for(var/datum/feed_channel/channel in news_network.network_channels) var/list/messages = list() - if(!channel.censored) + if(!channel.censored && channel.channel_name != "Vir News Network") //Do not load the 'IC news' channel as it is simply too long. var/index = 0 for(var/datum/feed_message/FM in channel.messages) index++ diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index d84f4bc3ca..c4c64f746c 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -1,5 +1,5 @@ /obj/item/device/floor_painter - name = "floor painter" + name = "paint sprayer" icon = 'icons/obj/bureaucracy.dmi' icon_state = "labeler1" @@ -43,6 +43,10 @@ if(!proximity) return + if(istype(A, /mob/living/silicon/robot/platform)) + var/mob/living/silicon/robot/platform/robit = A + return robit.try_paint(src, user) + var/turf/simulated/floor/F = A if(!istype(F)) to_chat(user, "\The [src] can only be used on station flooring.") @@ -115,20 +119,20 @@ /obj/item/device/floor_painter/verb/choose_colour() set name = "Choose Colour" - set desc = "Choose a floor painter colour." + set desc = "Choose a paint colour." set category = "Object" set src in usr if(usr.incapacitated()) return - var/new_colour = input(usr, "Choose a colour.", "Floor painter", paint_colour) as color|null + var/new_colour = input(usr, "Choose a colour.", name, paint_colour) as color|null if(new_colour && new_colour != paint_colour) paint_colour = new_colour to_chat(usr, "You set \the [src] to paint with a new colour.") /obj/item/device/floor_painter/verb/choose_decal() set name = "Choose Decal" - set desc = "Choose a floor painter decal." + set desc = "Choose a painting decal." set category = "Object" set src in usr @@ -142,7 +146,7 @@ /obj/item/device/floor_painter/verb/choose_direction() set name = "Choose Direction" - set desc = "Choose a floor painter direction." + set desc = "Choose a painting direction." set category = "Object" set src in usr diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 610ebbc26c..7621f09830 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -67,6 +67,10 @@ var/list/GPS_list = list() . = ..() update_holder() +/obj/item/device/gps/equipped_robot() + . = ..() + update_holder() + /obj/item/device/gps/equipped() . = ..() update_holder() @@ -107,6 +111,7 @@ var/list/GPS_list = list() /obj/item/device/gps/proc/update_compass(var/update_compass_icon) compass.hide_waypoints(FALSE) + var/turf/my_turf = get_turf(src) for(var/thing in tracking_devices) var/obj/item/device/gps/gps = locate(thing) if(!istype(gps) || QDELETED(gps)) @@ -119,7 +124,7 @@ var/list/GPS_list = list() compass.set_waypoint("\ref[gps]", gps_tag, gps_turf.x, gps_turf.y, gps_turf.z, LAZYACCESS(tracking_devices, "\ref[gps]")) else compass.set_waypoint("\ref[gps]", gps_tag, 0, 0, 0, LAZYACCESS(tracking_devices, "\ref[gps]")) - if(can_track(gps)) + if(can_track(gps) && gps_turf && my_turf && gps_turf.z == my_turf.z) compass.show_waypoint("\ref[gps]") compass.rebuild_overlay_lists(update_compass_icon) @@ -183,11 +188,11 @@ var/list/GPS_list = list() var/turf/curr = get_turf(src) var/area/my_area = get_area(src) - dat["my_area_name"] = my_area.name + dat["my_area_name"] = strip_improper(my_area.name) dat["curr_x"] = curr.x dat["curr_y"] = curr.y dat["curr_z"] = curr.z - dat["curr_z_name"] = using_map.get_zlevel_name(curr.z) + dat["curr_z_name"] = strip_improper(using_map.get_zlevel_name(curr.z)) dat["gps_list"] = list() dat["z_level_detection"] = using_map.get_map_levels(curr.z, long_range) @@ -201,10 +206,10 @@ var/list/GPS_list = list() gps_data["gps_tag"] = G.gps_tag var/area/A = get_area(G) - gps_data["area_name"] = A.get_name() + gps_data["area_name"] = strip_improper(A.get_name()) var/turf/T = get_turf(G) - gps_data["z_name"] = using_map.get_zlevel_name(T.z) + gps_data["z_name"] = strip_improper(using_map.get_zlevel_name(T.z)) gps_data["direction"] = get_adir(curr, T) gps_data["degrees"] = round(Get_Angle(curr,T)) gps_data["distX"] = T.x - curr.x @@ -221,7 +226,7 @@ var/list/GPS_list = list() /obj/item/device/gps/proc/display(mob/user) if(emped) - to_chat(user, "It's busted!") + to_chat(user, SPAN_WARNING("It's busted!")) return var/list/dat = list() @@ -229,9 +234,9 @@ var/list/GPS_list = list() dat += "" if(!tracking) - dat += "\[Switch On]\]" + dat += "\[Switch On\]" else - dat += "\[Switch Off]\]" + dat += "\[Switch Off\]" dat += "" dat += "" dat += "" @@ -244,13 +249,12 @@ var/list/GPS_list = list() dat += "" if(istype(gps_data["ref"], /obj/item/device/gps/internal/poi)) - dat += "" + dat += "" else dat += "" if(gps["local"]) - dat += "" - dat += "" + dat += "" else dat += "" @@ -471,9 +475,9 @@ var/list/GPS_list = list() dat += "
Current location[gps_data["my_area_name"]]([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]])
[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'.\[Change Tag\]\[Toggle Scan Range\][can_hide_signal ? "\[Toggle Signal Visibility\]":""]
[gps["gps_tag"]][gps["area_name"]][gps["local"] ? "[gps["direction"]] Dist: [round(gps["distance"], 10)]m" : "in \the [gps["z_name"]]"][gps["local"] ? "[gps["direction"]] Dist: [round(gps["distance"], 10)]m" : "[gps["z_name"]]"]([gps["x"]], [gps["y"]], [gps["z_name"]])[gps["distance"]]m[gps["degrees"]]° ([gps["direction"]])[gps["distance"]]m[gps["direction"]]Non-local signal.
" if(!tracking) - dat += "\[Switch On]\]" + dat += "\[Switch On\]" else - dat += "\[Switch Off]\]" + dat += "\[Switch Off\]" dat += "" dat += "" dat += "" @@ -485,8 +489,7 @@ var/list/GPS_list = list() var/gps_ref = "\ref[gps["ref"]]" dat += "" if(gps["local"]) - dat += "" - dat += "" + dat += "" else dat += "" if(LAZYACCESS(tracking_devices, gps_ref)) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 2ac0098203..ab91eca500 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -484,34 +484,70 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/clothing/mask/smokable/cigarette/joint name = "joint" - desc = "This probably shouldn't ever show up." + desc = "A joint lovingly rolled and crafted with care. Blaze it." icon_state = "joint" + max_smoketime = 400 + smoketime = 400 + chem_volume = 25 + +/obj/item/clothing/mask/smokable/cigarette/joint/blunt + name = "blunt" + desc = "A blunt lovingly rolled and crafted with care. Blaze it." + icon_state = "cigar" max_smoketime = 500 smoketime = 500 - nicotine_amt = 0 + nicotine_amt = 4 + chem_volume = 45 -/obj/item/weapon/rollingpaper +/obj/item/weapon/reagent_containers/rollingpaper name = "rolling paper" desc = "A small, thin piece of easily flammable paper, commonly used for rolling and smoking various dried plants." description_fluff = "The legalization of certain substances propelled the sale of rolling papers through the roof. Now almost every Trans-stellar produces a variety, often of questionable quality." icon = 'icons/obj/cigarettes.dmi' icon_state = "cig paper" + volume = 25 + var/obj/item/clothing/mask/smokable/cigarette/crafted_type = /obj/item/clothing/mask/smokable/cigarette/joint -/obj/item/weapon/rollingpaper/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/item/weapon/reagent_containers/rollingpaper/blunt + name = "blunt wrap" + desc = "A small piece of easily flammable paper similar to that which encases cigars. It's made out of tobacco, bigger than a standard rolling paper, and will last longer." + icon_state = "blunt paper" + volume = 45 + crafted_type = /obj/item/clothing/mask/smokable/cigarette/joint/blunt + +/obj/item/weapon/reagent_containers/rollingpaper/attackby(obj/item/weapon/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/reagent_containers/food/snacks)) var/obj/item/weapon/reagent_containers/food/snacks/grown/G = W - if (!G.dry) - to_chat(user, "[G] must be dried before you roll it into [src].") + if (!G.dry) //This prevents people from just stuffing cheeseburgers into their joint + to_chat(user, "[G.name] must be dried before you add it to [src].") return - var/obj/item/clothing/mask/smokable/cigarette/joint/J = new /obj/item/clothing/mask/smokable/cigarette/joint(user.loc) - to_chat(usr, "You roll the [G.name] into a joint!") - J.add_fingerprint(user) + if (G.reagents.total_volume + src.reagents.total_volume > src.reagents.maximum_volume) //Check that we don't have too much already in the paper before adding things + to_chat(user, "The [src] is too full to add [G.name].") + return + if (src.reagents.total_volume == 0) + if (istype(src, /obj/item/weapon/reagent_containers/rollingpaper/blunt)) //update the icon if this is the first thing we're adding to the paper + src.icon_state = "blunt_full" + else + src.icon_state = "paper_full" + to_chat(user, "You add the [G.name] to the [src.name].") + src.add_fingerprint(user) if(G.reagents) - G.reagents.trans_to_obj(J, G.reagents.total_volume) - J.name = "[G.name] joint" - J.desc = "A joint lovingly rolled and filled with [G.name]. Blaze it." + G.reagents.trans_to_obj(src, G.reagents.total_volume) //adds the reagents from the plant into the paper + user.drop_from_inventory(G) qdel(G) - qdel(src) + +/obj/item/weapon/reagent_containers/rollingpaper/attack_self(mob/living/user) + if(!src.reagents) //don't roll an empty joint + to_chat(user, "There is nothing in [src]. Add something to it first.") + return + var/obj/item/clothing/mask/smokable/cigarette/J = new crafted_type() + to_chat(user,"You roll the [src] into a blunt!") + J.add_fingerprint(user) + if(src.reagents) + src.reagents.trans_to_obj(J, src.reagents.total_volume) + user.drop_from_inventory(src) + user.put_in_hands(J) + qdel(src) ///////// //ZIPPO// diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm index ffa33472b6..b47d65fc2c 100644 --- a/code/game/objects/items/weapons/id cards/station_ids.dm +++ b/code/game/objects/items/weapons/id cards/station_ids.dm @@ -157,6 +157,18 @@ . = ..() access = get_all_station_access().Copy() + access_synth +/obj/item/weapon/card/id/platform + name = "\improper Support Platform ID" + desc = "Access module for support platforms." + icon_state = "id-robot" + item_state = "tdgreen" + assignment = "Synthetic" + access = list( + access_synth, access_mining, access_mining_station, access_mining_office, access_research, + access_xenoarch, access_xenobiology, access_external_airlocks, access_robotics, access_tox, + access_tox_storage, access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot + ) + /obj/item/weapon/card/id/centcom name = "\improper CentCom. ID" desc = "An ID straight from Central Command." diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index 1c4ad40773..c45e7125f5 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -177,4 +177,15 @@ default_material = "DEFAULT_WALL_MATERIAL" fragile = 0 sharp = 1 - edge = 0 \ No newline at end of file + edge = 0 + +/obj/item/weapon/material/twohanded/riding_crop + name = "riding crop" + desc = "A rod, a little over a foot long with a widened grip and a thick, leather patch at the end. Used since the dawn of the West to control animals." + force_divisor = 0.05 //Required in order for the X attacks Y message to pop up. + unwielded_force_divisor = 1 // One here, too. + applies_material_colour = 1 + unbreakable = 1 + base_icon = "riding_crop" + icon_state = "riding_crop0" + attack_verb = list("cropped","spanked","swatted","smacked","peppered") diff --git a/code/game/objects/items/weapons/material/twohanded_vr.dm b/code/game/objects/items/weapons/material/twohanded_vr.dm new file mode 100644 index 0000000000..f21738dd80 --- /dev/null +++ b/code/game/objects/items/weapons/material/twohanded_vr.dm @@ -0,0 +1,9 @@ +//1R1S: Malady Blanche +/obj/item/weapon/material/twohanded/riding_crop/malady + name = "Malady's riding crop" + icon = 'icons/vore/custom_items_vr.dmi' + item_icons = list( + slot_l_hand_str = 'icons/vore/custom_items_left_hand_vr.dmi', + slot_r_hand_str = 'icons/vore/custom_items_right_hand_vr.dmi', + ) + desc = "An infernum made riding crop with Malady Blanche engraved in the shaft. It's a little worn from how many butts it has spanked." diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index e1e6ecd23f..1c5e0e7464 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -354,8 +354,16 @@ throwforce = 2 slot_flags = SLOT_BELT storage_slots = 14 - can_hold = list(/obj/item/weapon/rollingpaper) - starts_with = list(/obj/item/weapon/rollingpaper = 14) + can_hold = list(/obj/item/weapon/reagent_containers/rollingpaper) + starts_with = list(/obj/item/weapon/reagent_containers/rollingpaper = 14) + +/obj/item/weapon/storage/rollingpapers/blunt + name = "blunt wrap pack" + desc = "A small cardboard pack containing several folded blunt wraps." + icon_state = "bluntbox" + storage_slots = 7 + can_hold = list(/obj/item/weapon/reagent_containers/rollingpaper/blunt) + starts_with = list(/obj/item/weapon/reagent_containers/rollingpaper/blunt = 7) /* * Vial Box diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 0bf2293802..046958a915 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -165,9 +165,6 @@ /obj/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) return -/obj/proc/get_cell() - return - // Used to mark a turf as containing objects that are dangerous to step onto. /obj/proc/register_dangerous_to_step() var/turf/T = get_turf(src) diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index e092d4bcb8..3881cf031b 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -362,6 +362,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/peppermintschnapps, /obj/item/weapon/reagent_containers/food/drinks/bottle/peachschnapps, /obj/item/weapon/reagent_containers/food/drinks/bottle/lemonadeschnapps, + /obj/item/weapon/reagent_containers/food/drinks/bottle/jager, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/cider, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/litebeer, /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer, diff --git a/code/game/objects/structures/crates_lockers/__closets.dm b/code/game/objects/structures/crates_lockers/__closets.dm index 4e18d87207..64c865604e 100644 --- a/code/game/objects/structures/crates_lockers/__closets.dm +++ b/code/game/objects/structures/crates_lockers/__closets.dm @@ -46,7 +46,7 @@ starts_with = null if(!opened) // if closed, any item at the crate's loc is put in the contents - if(istype(loc, /mob/living)) return //VOREStation Edit - No collecting mob organs if spawned inside mob + if(istype(loc, /mob/living)) return var/obj/item/I for(I in loc) if(I.density || I.anchored || I == src) continue diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm index 4fface95d1..469f27f27e 100644 --- a/code/game/objects/structures/ghost_pods/event_vr.dm +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -38,7 +38,7 @@ break if(choice) - finalized = alert(M, "Are you sure you want to play as [choice]?","Confirmation","No","Yes") + finalized = alert(M, "Are you sure you want to play as [choice]? By clicking yes you should expect to be treated as vore predator and possibly killed. Do not attack other players. You will have minimal OOC pref protections.","Confirmation","No","Yes") if(randomize) choice = pick(possible_mobs) @@ -99,4 +99,4 @@ qdel(src) /obj/structure/ghost_pod/ghost_activated/morphspawn/no_announce - announce_prob = 0 \ No newline at end of file + announce_prob = 0 diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e2db82664e..17bc2aee51 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -67,15 +67,16 @@ return 1 /turf/attack_hand(mob/user) - //QOL feature, clicking on turf can toogle doors - var/obj/machinery/door/airlock/AL = locate(/obj/machinery/door/airlock) in src.contents - if(AL) - AL.attack_hand(user) - return TRUE - var/obj/machinery/door/firedoor/FD = locate(/obj/machinery/door/firedoor) in src.contents - if(FD) - FD.attack_hand(user) - return TRUE + //QOL feature, clicking on turf can toggle doors, unless pulling something + if(!user.pulling) + var/obj/machinery/door/airlock/AL = locate(/obj/machinery/door/airlock) in src.contents + if(AL) + AL.attack_hand(user) + return TRUE + var/obj/machinery/door/firedoor/FD = locate(/obj/machinery/door/firedoor) in src.contents + if(FD) + FD.attack_hand(user) + return TRUE if(!(user.canmove) || user.restrained() || !(user.pulling)) return 0 diff --git a/code/game/world.dm b/code/game/world.dm index 82a34a2526..867301f989 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -213,7 +213,7 @@ var/world_topic_spam_protect_time = world.timeofday var/isactive = (robot.client && robot.client.inactivity <= 10 MINUTES) ? "Active" : "Inactive" if(robot.shell) continue - if(robot.module && robot.module.hide_on_manifest) + if(robot.module && robot.module.hide_on_manifest()) continue if(!positions["bot"]) positions["bot"] = list() diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index d3d8ec086e..30df7ec640 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -6,6 +6,37 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/icon/bgstate = "000" var/list/bgstate_options = list("000", "midgrey", "FFF", "white", "steel", "techmaint", "dark", "plating", "reinforced") + var/ear_style // Type of selected ear style + var/r_ears = 30 // Ear color. + var/g_ears = 30 // Ear color + var/b_ears = 30 // Ear color + var/r_ears2 = 30 // Ear extra color. + var/g_ears2 = 30 // Ear extra color + var/b_ears2 = 30 // Ear extra color + var/r_ears3 = 30 // Ear tertiary color. + var/g_ears3 = 30 // Ear tertiary color + var/b_ears3 = 30 // Ear tertiary color + var/tail_style // Type of selected tail style + var/r_tail = 30 // Tail/Taur color + var/g_tail = 30 // Tail/Taur color + var/b_tail = 30 // Tail/Taur color + var/r_tail2 = 30 // For extra overlay. + var/g_tail2 = 30 // For extra overlay. + var/b_tail2 = 30 // For extra overlay. + var/r_tail3 = 30 // For tertiary overlay. + var/g_tail3 = 30 // For tertiary overlay. + var/b_tail3 = 30 // For tertiary overlay. + var/wing_style // Type of selected wing style + var/r_wing = 30 // Wing color + var/g_wing = 30 // Wing color + var/b_wing = 30 // Wing color + var/r_wing2 = 30 // Wing extra color + var/g_wing2 = 30 // Wing extra color + var/b_wing2 = 30 // Wing extra color + var/r_wing3 = 30 // Wing tertiary color + var/g_wing3 = 30 // Wing tertiary color + var/b_wing3 = 30 // Wing tertiary color + /datum/category_item/player_setup_item/general/body name = "Body" sort_order = 3 @@ -52,6 +83,36 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O S["colorblind_vulp"] >> pref.colorblind_vulp S["colorblind_taj"] >> pref.colorblind_taj S["haemophilia"] >> pref.haemophilia //YWadd end + S["ear_style"] >> pref.ear_style + S["r_ears"] >> pref.r_ears + S["g_ears"] >> pref.g_ears + S["b_ears"] >> pref.b_ears + S["r_ears2"] >> pref.r_ears2 + S["g_ears2"] >> pref.g_ears2 + S["b_ears2"] >> pref.b_ears2 + S["r_ears3"] >> pref.r_ears3 + S["g_ears3"] >> pref.g_ears3 + S["b_ears3"] >> pref.b_ears3 + S["tail_style"] >> pref.tail_style + S["r_tail"] >> pref.r_tail + S["g_tail"] >> pref.g_tail + S["b_tail"] >> pref.b_tail + S["r_tail2"] >> pref.r_tail2 + S["g_tail2"] >> pref.g_tail2 + S["b_tail2"] >> pref.b_tail2 + S["r_tail3"] >> pref.r_tail3 + S["g_tail3"] >> pref.g_tail3 + S["b_tail3"] >> pref.b_tail3 + S["wing_style"] >> pref.wing_style + S["r_wing"] >> pref.r_wing + S["g_wing"] >> pref.g_wing + S["b_wing"] >> pref.b_wing + S["r_wing2"] >> pref.r_wing2 + S["g_wing2"] >> pref.g_wing2 + S["b_wing2"] >> pref.b_wing2 + S["r_wing3"] >> pref.r_wing3 + S["g_wing3"] >> pref.g_wing3 + S["b_wing3"] >> pref.b_wing3 /datum/category_item/player_setup_item/general/body/save_character(var/savefile/S) S["species"] << pref.species @@ -92,6 +153,36 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O S["colorblind_vulp"] << pref.colorblind_vulp S["colorblind_taj"] << pref.colorblind_taj S["haemophilia"] << pref.haemophilia //YWadd end + S["ear_style"] << pref.ear_style + S["r_ears"] << pref.r_ears + S["g_ears"] << pref.g_ears + S["b_ears"] << pref.b_ears + S["r_ears2"] << pref.r_ears2 + S["g_ears2"] << pref.g_ears2 + S["b_ears2"] << pref.b_ears2 + S["r_ears3"] << pref.r_ears3 + S["g_ears3"] << pref.g_ears3 + S["b_ears3"] << pref.b_ears3 + S["tail_style"] << pref.tail_style + S["r_tail"] << pref.r_tail + S["g_tail"] << pref.g_tail + S["b_tail"] << pref.b_tail + S["r_tail2"] << pref.r_tail2 + S["g_tail2"] << pref.g_tail2 + S["b_tail2"] << pref.b_tail2 + S["r_tail3"] << pref.r_tail3 + S["g_tail3"] << pref.g_tail3 + S["b_tail3"] << pref.b_tail3 + S["wing_style"] << pref.wing_style + S["r_wing"] << pref.r_wing + S["g_wing"] << pref.g_wing + S["b_wing"] << pref.b_wing + S["r_wing2"] << pref.r_wing2 + S["g_wing2"] << pref.g_wing2 + S["b_wing2"] << pref.b_wing2 + S["r_wing3"] << pref.r_wing3 + S["g_wing3"] << pref.g_wing3 + S["b_wing3"] << pref.b_wing3 /datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S) if(!pref.species || !(pref.species in GLOB.playable_species)) @@ -126,6 +217,49 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(!pref.bgstate || !(pref.bgstate in pref.bgstate_options)) pref.bgstate = "000" + pref.r_ears = sanitize_integer(pref.r_ears, 0, 255, initial(pref.r_ears)) + pref.g_ears = sanitize_integer(pref.g_ears, 0, 255, initial(pref.g_ears)) + pref.b_ears = sanitize_integer(pref.b_ears, 0, 255, initial(pref.b_ears)) + pref.r_ears2 = sanitize_integer(pref.r_ears2, 0, 255, initial(pref.r_ears2)) + pref.g_ears2 = sanitize_integer(pref.g_ears2, 0, 255, initial(pref.g_ears2)) + pref.b_ears2 = sanitize_integer(pref.b_ears2, 0, 255, initial(pref.b_ears2)) + pref.r_ears3 = sanitize_integer(pref.r_ears3, 0, 255, initial(pref.r_ears3)) + pref.g_ears3 = sanitize_integer(pref.g_ears3, 0, 255, initial(pref.g_ears3)) + pref.b_ears3 = sanitize_integer(pref.b_ears3, 0, 255, initial(pref.b_ears3)) + pref.r_tail = sanitize_integer(pref.r_tail, 0, 255, initial(pref.r_tail)) + pref.g_tail = sanitize_integer(pref.g_tail, 0, 255, initial(pref.g_tail)) + pref.b_tail = sanitize_integer(pref.b_tail, 0, 255, initial(pref.b_tail)) + pref.r_tail2 = sanitize_integer(pref.r_tail2, 0, 255, initial(pref.r_tail2)) + pref.g_tail2 = sanitize_integer(pref.g_tail2, 0, 255, initial(pref.g_tail2)) + pref.b_tail2 = sanitize_integer(pref.b_tail2, 0, 255, initial(pref.b_tail2)) + pref.r_tail3 = sanitize_integer(pref.r_tail3, 0, 255, initial(pref.r_tail3)) + pref.g_tail3 = sanitize_integer(pref.g_tail3, 0, 255, initial(pref.g_tail3)) + pref.b_tail3 = sanitize_integer(pref.b_tail3, 0, 255, initial(pref.b_tail3)) + pref.r_wing = sanitize_integer(pref.r_wing, 0, 255, initial(pref.r_wing)) + pref.g_wing = sanitize_integer(pref.g_wing, 0, 255, initial(pref.g_wing)) + pref.b_wing = sanitize_integer(pref.b_wing, 0, 255, initial(pref.b_wing)) + pref.r_wing2 = sanitize_integer(pref.r_wing2, 0, 255, initial(pref.r_wing2)) + pref.g_wing2 = sanitize_integer(pref.g_wing2, 0, 255, initial(pref.g_wing2)) + pref.b_wing2 = sanitize_integer(pref.b_wing2, 0, 255, initial(pref.b_wing2)) + pref.r_wing3 = sanitize_integer(pref.r_wing3, 0, 255, initial(pref.r_wing3)) + pref.g_wing3 = sanitize_integer(pref.g_wing3, 0, 255, initial(pref.g_wing3)) + pref.b_wing3 = sanitize_integer(pref.b_wing3, 0, 255, initial(pref.b_wing3)) + if(pref.ear_style) + pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style)) + var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style] + if(temp_ear_style.apply_restrictions && (!(pref.species in temp_ear_style.species_allowed))) + pref.ear_style = initial(pref.ear_style) + if(pref.tail_style) + pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style)) + var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style] + if(temp_tail_style.apply_restrictions && (!(pref.species in temp_tail_style.species_allowed))) + pref.tail_style = initial(pref.tail_style) + if(pref.wing_style) + pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style)) + var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style] + if(temp_wing_style.apply_restrictions && (!(pref.species in temp_wing_style.species_allowed))) + pref.wing_style = initial(pref.wing_style) + // Moved from /datum/preferences/proc/copy_to() /datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character) // Copy basic values @@ -164,6 +298,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O character.r_ears2 = pref.r_ears2 character.b_ears2 = pref.b_ears2 character.g_ears2 = pref.g_ears2 + character.r_ears3 = pref.r_ears3 + character.b_ears3 = pref.b_ears3 + character.g_ears3 = pref.g_ears3 character.tail_style = tail_styles_list[pref.tail_style] character.r_tail = pref.r_tail character.b_tail = pref.b_tail @@ -171,6 +308,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O character.r_tail2 = pref.r_tail2 character.b_tail2 = pref.b_tail2 character.g_tail2 = pref.g_tail2 + character.r_tail3 = pref.r_tail3 + character.b_tail3 = pref.b_tail3 + character.g_tail3 = pref.g_tail3 character.wing_style = wing_styles_list[pref.wing_style] character.r_wing = pref.r_wing character.b_wing = pref.b_wing @@ -178,6 +318,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O character.r_wing2 = pref.r_wing2 character.b_wing2 = pref.b_wing2 character.g_wing2 = pref.g_wing2 + character.r_wing3 = pref.r_wing3 + character.b_wing3 = pref.b_wing3 + character.g_wing3 = pref.g_wing3 character.set_gender( pref.biological_gender) if(pref.species == "Grey")//YWadd START @@ -407,6 +550,62 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "
Body Color
" . += "Change Color [color_square(pref.r_skin, pref.g_skin, pref.b_skin)]
" + . += "

Genetics Settings

" + + var/ear_display = "Normal" + if(pref.ear_style && (pref.ear_style in ear_styles_list)) + var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style] + ear_display = instance.name + + else if(pref.ear_style) + ear_display = "REQUIRES UPDATE" + . += "Ears
" + . += " Style: [ear_display]
" + if(ear_styles_list[pref.ear_style]) + var/datum/sprite_accessory/ears/ear = ear_styles_list[pref.ear_style] + if(ear.do_colouration) + . += "Change Color [color_square(pref.r_ears, pref.g_ears, pref.b_ears)]
" + if(ear.extra_overlay) + . += "Change Secondary Color [color_square(pref.r_ears2, pref.g_ears2, pref.b_ears2)]
" + if(ear.extra_overlay2) + . += "Change Tertiary Color [color_square(pref.r_ears3, pref.g_ears3, pref.b_ears3)]
" + + var/tail_display = "Normal" + if(pref.tail_style && (pref.tail_style in tail_styles_list)) + var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style] + tail_display = instance.name + else if(pref.tail_style) + tail_display = "REQUIRES UPDATE" + . += "Tail
" + . += " Style: [tail_display]
" + + if(tail_styles_list[pref.tail_style]) + var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style] + if(T.do_colouration) + . += "Change Color [color_square(pref.r_tail, pref.g_tail, pref.b_tail)]
" + if(T.extra_overlay) + . += "Change Secondary Color [color_square(pref.r_tail2, pref.g_tail2, pref.b_tail2)]
" + if(T.extra_overlay2) + . += "Change Tertiary Color [color_square(pref.r_tail3, pref.g_tail3, pref.b_tail3)]
" + + var/wing_display = "Normal" + if(pref.wing_style && (pref.wing_style in wing_styles_list)) + var/datum/sprite_accessory/wing/instance = wing_styles_list[pref.wing_style] + wing_display = instance.name + else if(pref.wing_style) + wing_display = "REQUIRES UPDATE" + . += "Wing
" + . += " Style: [wing_display]
" + + if(wing_styles_list[pref.wing_style]) + var/datum/sprite_accessory/wing/W = wing_styles_list[pref.wing_style] + if(W.do_colouration) + . += "Change Color [color_square(pref.r_wing, pref.g_wing, pref.b_wing)]
" + if(W.extra_overlay) + . += "Change Secondary Color [color_square(pref.r_wing2, pref.g_wing2, pref.b_wing2)]
" + if(W.extra_overlay2) + . += "Change Secondary Color [color_square(pref.r_wing3, pref.g_wing3, pref.b_wing3)]
" + . += "
Body Markings +
" . += "
Current location[gps_data["my_area_name"]]([gps_data["curr_x"]], [gps_data["curr_y"]], [gps_data["curr_z_name"]])
[hide_signal ? "Tagged" : "Broadcasting"] as '[gps_tag]'.\[Change Tag\]\[Toggle Scan Range\][can_hide_signal ? "\[Toggle Signal Visibility\]":""]
[gps["gps_tag"]][gps["area_name"]] ([gps["x"]], [gps["y"]], [gps["z_name"]])[gps["distance"]]m[gps["degrees"]]° ([gps["direction"]])[gps["distance"]]m[gps["direction"]]Non-local signal.
" for(var/M in pref.body_markings) @@ -935,8 +1134,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O else if(href_list["cycle_bg"]) pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options) return TOPIC_REFRESH_UPDATE_PREVIEW - + //YW Add Start + else if(href_list["wingdings"]) pref.wingdings = !pref.wingdings Disabilities_YW(usr) @@ -967,7 +1167,131 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O //YW Add End + else if(href_list["ear_style"]) + // Construct the list of names allowed for this user. + var/list/pretty_ear_styles = list("Normal" = null) + for(var/path in ear_styles_list) + var/datum/sprite_accessory/ears/instance = ear_styles_list[path] + if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit + pretty_ear_styles[instance.name] = path + // Present choice to user + var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles + if(new_ear_style) + pref.ear_style = pretty_ear_styles[new_ear_style] + + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["ear_color"]) + var/new_earc = input(user, "Choose your character's ear colour:", "Character Preference", + rgb(pref.r_ears, pref.g_ears, pref.b_ears)) as color|null + if(new_earc) + pref.r_ears = hex2num(copytext(new_earc, 2, 4)) + pref.g_ears = hex2num(copytext(new_earc, 4, 6)) + pref.b_ears = hex2num(copytext(new_earc, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["ear_color2"]) + var/new_earc2 = input(user, "Choose your character's ear colour:", "Character Preference", + rgb(pref.r_ears2, pref.g_ears2, pref.b_ears2)) as color|null + if(new_earc2) + pref.r_ears2 = hex2num(copytext(new_earc2, 2, 4)) + pref.g_ears2 = hex2num(copytext(new_earc2, 4, 6)) + pref.b_ears2 = hex2num(copytext(new_earc2, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["ear_color3"]) + var/new_earc3 = input(user, "Choose your character's tertiary ear colour:", "Character Preference", + rgb(pref.r_ears3, pref.g_ears3, pref.b_ears3)) as color|null + if(new_earc3) + pref.r_ears3 = hex2num(copytext(new_earc3, 2, 4)) + pref.g_ears3 = hex2num(copytext(new_earc3, 4, 6)) + pref.b_ears3 = hex2num(copytext(new_earc3, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_style"]) + // Construct the list of names allowed for this user. + var/list/pretty_tail_styles = list("Normal" = null) + for(var/path in tail_styles_list) + var/datum/sprite_accessory/tail/instance = tail_styles_list[path] + if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit + pretty_tail_styles[instance.name] = path + + // Present choice to user + var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles + if(new_tail_style) + pref.tail_style = pretty_tail_styles[new_tail_style] + + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_color"]) + var/new_tailc = input(user, "Choose your character's tail/taur colour:", "Character Preference", + rgb(pref.r_tail, pref.g_tail, pref.b_tail)) as color|null + if(new_tailc) + pref.r_tail = hex2num(copytext(new_tailc, 2, 4)) + pref.g_tail = hex2num(copytext(new_tailc, 4, 6)) + pref.b_tail = hex2num(copytext(new_tailc, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_color2"]) + var/new_tailc2 = input(user, "Choose your character's secondary tail/taur colour:", "Character Preference", + rgb(pref.r_tail2, pref.g_tail2, pref.b_tail2)) as color|null + if(new_tailc2) + pref.r_tail2 = hex2num(copytext(new_tailc2, 2, 4)) + pref.g_tail2 = hex2num(copytext(new_tailc2, 4, 6)) + pref.b_tail2 = hex2num(copytext(new_tailc2, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_color3"]) + var/new_tailc3 = input(user, "Choose your character's tertiary tail/taur colour:", "Character Preference", + rgb(pref.r_tail3, pref.g_tail3, pref.b_tail3)) as color|null + if(new_tailc3) + pref.r_tail3 = hex2num(copytext(new_tailc3, 2, 4)) + pref.g_tail3 = hex2num(copytext(new_tailc3, 4, 6)) + pref.b_tail3 = hex2num(copytext(new_tailc3, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_style"]) + // Construct the list of names allowed for this user. + var/list/pretty_wing_styles = list("Normal" = null) + for(var/path in wing_styles_list) + var/datum/sprite_accessory/wing/instance = wing_styles_list[path] + if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit + pretty_wing_styles[instance.name] = path + + // Present choice to user + var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles + if(new_wing_style) + pref.wing_style = pretty_wing_styles[new_wing_style] + + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_color"]) + var/new_wingc = input(user, "Choose your character's wing colour:", "Character Preference", + rgb(pref.r_wing, pref.g_wing, pref.b_wing)) as color|null + if(new_wingc) + pref.r_wing = hex2num(copytext(new_wingc, 2, 4)) + pref.g_wing = hex2num(copytext(new_wingc, 4, 6)) + pref.b_wing = hex2num(copytext(new_wingc, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_color2"]) + var/new_wingc2 = input(user, "Choose your character's secondary wing colour:", "Character Preference", + rgb(pref.r_wing2, pref.g_wing2, pref.b_wing2)) as color|null + if(new_wingc2) + pref.r_wing2 = hex2num(copytext(new_wingc2, 2, 4)) + pref.g_wing2 = hex2num(copytext(new_wingc2, 4, 6)) + pref.b_wing2 = hex2num(copytext(new_wingc2, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_color3"]) + var/new_wingc3 = input(user, "Choose your character's tertiary wing colour:", "Character Preference", + rgb(pref.r_wing3, pref.g_wing3, pref.b_wing3)) as color|null + if(new_wingc3) + pref.r_wing3 = hex2num(copytext(new_wingc3, 2, 4)) + pref.g_wing3 = hex2num(copytext(new_wingc3, 4, 6)) + pref.b_wing3 = hex2num(copytext(new_wingc3, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW return ..() /datum/category_item/player_setup_item/general/body/proc/reset_limbs() diff --git a/code/modules/client/preference_setup/loadout/loadout_cyberware.dm b/code/modules/client/preference_setup/loadout/loadout_cyberware.dm index 60a7b82b87..2540e86fc8 100644 --- a/code/modules/client/preference_setup/loadout/loadout_cyberware.dm +++ b/code/modules/client/preference_setup/loadout/loadout_cyberware.dm @@ -10,7 +10,7 @@ /datum/gear/utility/implant/tracking display_name = "implant, tracking" path = /obj/item/weapon/implant/tracking/weak - cost = 10 + cost = 0 //VOREStation Edit. Changed cost to 0 // Remove these after generic implant has been in for awhile and everyone has had a reasonable period to copy their old descs. /datum/gear/utility/implant/dud1 diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index 63f5749c2b..7fe078c775 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -29,7 +29,7 @@ // 0-9 CKEYS /datum/gear/fluff/malady_crop - path = /obj/item/weapon/material/twohanded/fluff/riding_crop/malady + path = /obj/item/weapon/material/twohanded/riding_crop/malady display_name = "Malady's Crop" ckeywhitelist = list("1r1s") character_name = list("Malady Blanche") diff --git a/code/modules/client/preference_setup/vore/01_ears.dm b/code/modules/client/preference_setup/vore/01_ears.dm index dea5be0479..c9998dece0 100644 --- a/code/modules/client/preference_setup/vore/01_ears.dm +++ b/code/modules/client/preference_setup/vore/01_ears.dm @@ -3,373 +3,3 @@ name = "VORE" sort_order = 8 category_item_type = /datum/category_item/player_setup_item/vore - -// Define a place to save appearance in character setup -/datum/preferences - var/ear_style // Type of selected ear style - var/r_ears = 30 // Ear color. - var/g_ears = 30 // Ear color - var/b_ears = 30 // Ear color - var/r_ears2 = 30 // Ear extra color. - var/g_ears2 = 30 // Ear extra color - var/b_ears2 = 30 // Ear extra color - var/r_ears3 = 30 // Ear tertiary color. - var/g_ears3 = 30 // Ear tertiary color - var/b_ears3 = 30 // Ear tertiary color - var/tail_style // Type of selected tail style - var/r_tail = 30 // Tail/Taur color - var/g_tail = 30 // Tail/Taur color - var/b_tail = 30 // Tail/Taur color - var/r_tail2 = 30 // For extra overlay. - var/g_tail2 = 30 // For extra overlay. - var/b_tail2 = 30 // For extra overlay. - var/r_tail3 = 30 // For tertiary overlay. - var/g_tail3 = 30 // For tertiary overlay. - var/b_tail3 = 30 // For tertiary overlay. - var/wing_style // Type of selected wing style - var/r_wing = 30 // Wing color - var/g_wing = 30 // Wing color - var/b_wing = 30 // Wing color - var/r_wing2 = 30 // Wing extra color - var/g_wing2 = 30 // Wing extra color - var/b_wing2 = 30 // Wing extra color - var/r_wing3 = 30 // Wing tertiary color - var/g_wing3 = 30 // Wing tertiary color - var/b_wing3 = 30 // Wing tertiary color - -// Definition of the stuff for Ears -/datum/category_item/player_setup_item/vore/ears - name = "Appearance" - sort_order = 1 - -/datum/category_item/player_setup_item/vore/ears/load_character(var/savefile/S) - S["ear_style"] >> pref.ear_style - S["r_ears"] >> pref.r_ears - S["g_ears"] >> pref.g_ears - S["b_ears"] >> pref.b_ears - S["r_ears2"] >> pref.r_ears2 - S["g_ears2"] >> pref.g_ears2 - S["b_ears2"] >> pref.b_ears2 - S["r_ears3"] >> pref.r_ears3 - S["g_ears3"] >> pref.g_ears3 - S["b_ears3"] >> pref.b_ears3 - S["tail_style"] >> pref.tail_style - S["r_tail"] >> pref.r_tail - S["g_tail"] >> pref.g_tail - S["b_tail"] >> pref.b_tail - S["r_tail2"] >> pref.r_tail2 - S["g_tail2"] >> pref.g_tail2 - S["b_tail2"] >> pref.b_tail2 - S["r_tail3"] >> pref.r_tail3 - S["g_tail3"] >> pref.g_tail3 - S["b_tail3"] >> pref.b_tail3 - S["wing_style"] >> pref.wing_style - S["r_wing"] >> pref.r_wing - S["g_wing"] >> pref.g_wing - S["b_wing"] >> pref.b_wing - S["r_wing2"] >> pref.r_wing2 - S["g_wing2"] >> pref.g_wing2 - S["b_wing2"] >> pref.b_wing2 - S["r_wing3"] >> pref.r_wing3 - S["g_wing3"] >> pref.g_wing3 - S["b_wing3"] >> pref.b_wing3 - -/datum/category_item/player_setup_item/vore/ears/save_character(var/savefile/S) - S["ear_style"] << pref.ear_style - S["r_ears"] << pref.r_ears - S["g_ears"] << pref.g_ears - S["b_ears"] << pref.b_ears - S["r_ears2"] << pref.r_ears2 - S["g_ears2"] << pref.g_ears2 - S["b_ears2"] << pref.b_ears2 - S["r_ears3"] << pref.r_ears3 - S["g_ears3"] << pref.g_ears3 - S["b_ears3"] << pref.b_ears3 - S["tail_style"] << pref.tail_style - S["r_tail"] << pref.r_tail - S["g_tail"] << pref.g_tail - S["b_tail"] << pref.b_tail - S["r_tail2"] << pref.r_tail2 - S["g_tail2"] << pref.g_tail2 - S["b_tail2"] << pref.b_tail2 - S["r_tail3"] << pref.r_tail3 - S["g_tail3"] << pref.g_tail3 - S["b_tail3"] << pref.b_tail3 - S["wing_style"] << pref.wing_style - S["r_wing"] << pref.r_wing - S["g_wing"] << pref.g_wing - S["b_wing"] << pref.b_wing - S["r_wing2"] << pref.r_wing2 - S["g_wing2"] << pref.g_wing2 - S["b_wing2"] << pref.b_wing2 - S["r_wing3"] << pref.r_wing3 - S["g_wing3"] << pref.g_wing3 - S["b_wing3"] << pref.b_wing3 - -/datum/category_item/player_setup_item/vore/ears/sanitize_character() - pref.r_ears = sanitize_integer(pref.r_ears, 0, 255, initial(pref.r_ears)) - pref.g_ears = sanitize_integer(pref.g_ears, 0, 255, initial(pref.g_ears)) - pref.b_ears = sanitize_integer(pref.b_ears, 0, 255, initial(pref.b_ears)) - pref.r_ears2 = sanitize_integer(pref.r_ears2, 0, 255, initial(pref.r_ears2)) - pref.g_ears2 = sanitize_integer(pref.g_ears2, 0, 255, initial(pref.g_ears2)) - pref.b_ears2 = sanitize_integer(pref.b_ears2, 0, 255, initial(pref.b_ears2)) - pref.r_ears3 = sanitize_integer(pref.r_ears3, 0, 255, initial(pref.r_ears3)) - pref.g_ears3 = sanitize_integer(pref.g_ears3, 0, 255, initial(pref.g_ears3)) - pref.b_ears3 = sanitize_integer(pref.b_ears3, 0, 255, initial(pref.b_ears3)) - pref.r_tail = sanitize_integer(pref.r_tail, 0, 255, initial(pref.r_tail)) - pref.g_tail = sanitize_integer(pref.g_tail, 0, 255, initial(pref.g_tail)) - pref.b_tail = sanitize_integer(pref.b_tail, 0, 255, initial(pref.b_tail)) - pref.r_tail2 = sanitize_integer(pref.r_tail2, 0, 255, initial(pref.r_tail2)) - pref.g_tail2 = sanitize_integer(pref.g_tail2, 0, 255, initial(pref.g_tail2)) - pref.b_tail2 = sanitize_integer(pref.b_tail2, 0, 255, initial(pref.b_tail2)) - pref.r_tail3 = sanitize_integer(pref.r_tail3, 0, 255, initial(pref.r_tail3)) - pref.g_tail3 = sanitize_integer(pref.g_tail3, 0, 255, initial(pref.g_tail3)) - pref.b_tail3 = sanitize_integer(pref.b_tail3, 0, 255, initial(pref.b_tail3)) - pref.r_wing = sanitize_integer(pref.r_wing, 0, 255, initial(pref.r_wing)) - pref.g_wing = sanitize_integer(pref.g_wing, 0, 255, initial(pref.g_wing)) - pref.b_wing = sanitize_integer(pref.b_wing, 0, 255, initial(pref.b_wing)) - pref.r_wing2 = sanitize_integer(pref.r_wing2, 0, 255, initial(pref.r_wing2)) - pref.g_wing2 = sanitize_integer(pref.g_wing2, 0, 255, initial(pref.g_wing2)) - pref.b_wing2 = sanitize_integer(pref.b_wing2, 0, 255, initial(pref.b_wing2)) - pref.r_wing3 = sanitize_integer(pref.r_wing3, 0, 255, initial(pref.r_wing3)) - pref.g_wing3 = sanitize_integer(pref.g_wing3, 0, 255, initial(pref.g_wing3)) - pref.b_wing3 = sanitize_integer(pref.b_wing3, 0, 255, initial(pref.b_wing3)) - - if(pref.ear_style) - pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style)) - var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style] - if(temp_ear_style.apply_restrictions && (!(pref.species in temp_ear_style.species_allowed))) - pref.ear_style = initial(pref.ear_style) - if(pref.tail_style) - pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style)) - var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style] - if(temp_tail_style.apply_restrictions && (!(pref.species in temp_tail_style.species_allowed))) - pref.tail_style = initial(pref.tail_style) - if(pref.wing_style) - pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style)) - var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style] - if(temp_wing_style.apply_restrictions && (!(pref.species in temp_wing_style.species_allowed))) - pref.wing_style = initial(pref.wing_style) - -/datum/category_item/player_setup_item/vore/ears/copy_to_mob(var/mob/living/carbon/human/character) - character.ear_style = ear_styles_list[pref.ear_style] - character.r_ears = pref.r_ears - character.b_ears = pref.b_ears - character.g_ears = pref.g_ears - character.r_ears2 = pref.r_ears2 - character.b_ears2 = pref.b_ears2 - character.g_ears2 = pref.g_ears2 - character.r_ears3 = pref.r_ears3 - character.b_ears3 = pref.b_ears3 - character.g_ears3 = pref.g_ears3 - character.tail_style = tail_styles_list[pref.tail_style] - character.r_tail = pref.r_tail - character.b_tail = pref.b_tail - character.g_tail = pref.g_tail - character.r_tail2 = pref.r_tail2 - character.b_tail2 = pref.b_tail2 - character.g_tail2 = pref.g_tail2 - character.r_tail3 = pref.r_tail3 - character.b_tail3 = pref.b_tail3 - character.g_tail3 = pref.g_tail3 - character.wing_style = wing_styles_list[pref.wing_style] - character.r_wing = pref.r_wing - character.b_wing = pref.b_wing - character.g_wing = pref.g_wing - character.r_wing2 = pref.r_wing2 - character.b_wing2 = pref.b_wing2 - character.g_wing2 = pref.g_wing2 - character.r_wing3 = pref.r_wing3 - character.b_wing3 = pref.b_wing3 - character.g_wing3 = pref.g_wing3 - - - -/datum/category_item/player_setup_item/vore/ears/content(var/mob/user) - . += "

VORE Station Settings

" - - var/ear_display = "Normal" - if(pref.ear_style && (pref.ear_style in ear_styles_list)) - var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style] - ear_display = instance.name - - else if(pref.ear_style) - ear_display = "REQUIRES UPDATE" - . += "Ears
" - . += " Style: [ear_display]
" - if(ear_styles_list[pref.ear_style]) - var/datum/sprite_accessory/ears/ear = ear_styles_list[pref.ear_style] - if(ear.do_colouration) - . += "Change Color [color_square(pref.r_ears, pref.g_ears, pref.b_ears)]
" - if(ear.extra_overlay) - . += "Change Secondary Color [color_square(pref.r_ears2, pref.g_ears2, pref.b_ears2)]
" - if(ear.extra_overlay2) - . += "Change Tertiary Color [color_square(pref.r_ears3, pref.g_ears3, pref.b_ears3)]
" - - var/tail_display = "Normal" - if(pref.tail_style && (pref.tail_style in tail_styles_list)) - var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style] - tail_display = instance.name - else if(pref.tail_style) - tail_display = "REQUIRES UPDATE" - . += "Tail
" - . += " Style: [tail_display]
" - - if(tail_styles_list[pref.tail_style]) - var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style] - if(T.do_colouration) - . += "Change Color [color_square(pref.r_tail, pref.g_tail, pref.b_tail)]
" - if(T.extra_overlay) - . += "Change Secondary Color [color_square(pref.r_tail2, pref.g_tail2, pref.b_tail2)]
" - if(T.extra_overlay2) - . += "Change Tertiary Color [color_square(pref.r_tail3, pref.g_tail3, pref.b_tail3)]
" - - var/wing_display = "Normal" - if(pref.wing_style && (pref.wing_style in wing_styles_list)) - var/datum/sprite_accessory/wing/instance = wing_styles_list[pref.wing_style] - wing_display = instance.name - else if(pref.wing_style) - wing_display = "REQUIRES UPDATE" - . += "Wing
" - . += " Style: [wing_display]
" - - if(wing_styles_list[pref.wing_style]) - var/datum/sprite_accessory/wing/W = wing_styles_list[pref.wing_style] - if (W.do_colouration) - . += "Change Color [color_square(pref.r_wing, pref.g_wing, pref.b_wing)]
" - if (W.extra_overlay) - . += "Change Secondary Color [color_square(pref.r_wing2, pref.g_wing2, pref.b_wing2)]
" - if (W.extra_overlay2) - . += "Change Secondary Color [color_square(pref.r_wing3, pref.g_wing3, pref.b_wing3)]
" - -/datum/category_item/player_setup_item/vore/ears/OnTopic(var/href,var/list/href_list, var/mob/user) - if(!CanUseTopic(user)) - return TOPIC_NOACTION - - else if(href_list["ear_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_ear_styles = list("Normal" = null) - for(var/path in ear_styles_list) - var/datum/sprite_accessory/ears/instance = ear_styles_list[path] - if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed))) - pretty_ear_styles[instance.name] = path - - // Present choice to user - var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles - if(new_ear_style) - pref.ear_style = pretty_ear_styles[new_ear_style] - - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["ear_color"]) - var/new_earc = input(user, "Choose your character's ear colour:", "Character Preference", - rgb(pref.r_ears, pref.g_ears, pref.b_ears)) as color|null - if(new_earc) - pref.r_ears = hex2num(copytext(new_earc, 2, 4)) - pref.g_ears = hex2num(copytext(new_earc, 4, 6)) - pref.b_ears = hex2num(copytext(new_earc, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["ear_color2"]) - var/new_earc2 = input(user, "Choose your character's secondary ear colour:", "Character Preference", - rgb(pref.r_ears2, pref.g_ears2, pref.b_ears2)) as color|null - if(new_earc2) - pref.r_ears2 = hex2num(copytext(new_earc2, 2, 4)) - pref.g_ears2 = hex2num(copytext(new_earc2, 4, 6)) - pref.b_ears2 = hex2num(copytext(new_earc2, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["ear_color3"]) - var/new_earc3 = input(user, "Choose your character's tertiary ear colour:", "Character Preference", - rgb(pref.r_ears3, pref.g_ears3, pref.b_ears3)) as color|null - if(new_earc3) - pref.r_ears3 = hex2num(copytext(new_earc3, 2, 4)) - pref.g_ears3 = hex2num(copytext(new_earc3, 4, 6)) - pref.b_ears3 = hex2num(copytext(new_earc3, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_tail_styles = list("Normal" = null) - for(var/path in tail_styles_list) - var/datum/sprite_accessory/tail/instance = tail_styles_list[path] - if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed))) - pretty_tail_styles[instance.name] = path - - // Present choice to user - var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles - if(new_tail_style) - pref.tail_style = pretty_tail_styles[new_tail_style] - - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_color"]) - var/new_tailc = input(user, "Choose your character's tail/taur colour:", "Character Preference", - rgb(pref.r_tail, pref.g_tail, pref.b_tail)) as color|null - if(new_tailc) - pref.r_tail = hex2num(copytext(new_tailc, 2, 4)) - pref.g_tail = hex2num(copytext(new_tailc, 4, 6)) - pref.b_tail = hex2num(copytext(new_tailc, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_color2"]) - var/new_tailc2 = input(user, "Choose your character's secondary tail/taur colour:", "Character Preference", - rgb(pref.r_tail2, pref.g_tail2, pref.b_tail2)) as color|null - if(new_tailc2) - pref.r_tail2 = hex2num(copytext(new_tailc2, 2, 4)) - pref.g_tail2 = hex2num(copytext(new_tailc2, 4, 6)) - pref.b_tail2 = hex2num(copytext(new_tailc2, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_color3"]) - var/new_tailc3 = input(user, "Choose your character's tertiary tail/taur colour:", "Character Preference", - rgb(pref.r_tail3, pref.g_tail3, pref.b_tail3)) as color|null - if(new_tailc3) - pref.r_tail3 = hex2num(copytext(new_tailc3, 2, 4)) - pref.g_tail3 = hex2num(copytext(new_tailc3, 4, 6)) - pref.b_tail3 = hex2num(copytext(new_tailc3, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_wing_styles = list("Normal" = null) - for(var/path in wing_styles_list) - var/datum/sprite_accessory/wing/instance = wing_styles_list[path] - if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed))) - pretty_wing_styles[instance.name] = path - - // Present choice to user - var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles - if(new_wing_style) - pref.wing_style = pretty_wing_styles[new_wing_style] - - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_color"]) - var/new_wingc = input(user, "Choose your character's wing colour:", "Character Preference", - rgb(pref.r_wing, pref.g_wing, pref.b_wing)) as color|null - if(new_wingc) - pref.r_wing = hex2num(copytext(new_wingc, 2, 4)) - pref.g_wing = hex2num(copytext(new_wingc, 4, 6)) - pref.b_wing = hex2num(copytext(new_wingc, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_color2"]) - var/new_wingc2 = input(user, "Choose your character's secondary wing colour:", "Character Preference", - rgb(pref.r_wing2, pref.g_wing2, pref.b_wing2)) as color|null - if(new_wingc2) - pref.r_wing2 = hex2num(copytext(new_wingc2, 2, 4)) - pref.g_wing2 = hex2num(copytext(new_wingc2, 4, 6)) - pref.b_wing2 = hex2num(copytext(new_wingc2, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_color3"]) - var/new_wingc3 = input(user, "Choose your character's tertiary wing colour:", "Character Preference", - rgb(pref.r_wing3, pref.g_wing3, pref.b_wing3)) as color|null - if(new_wingc3) - pref.r_wing3 = hex2num(copytext(new_wingc3, 2, 4)) - pref.g_wing3 = hex2num(copytext(new_wingc3, 4, 6)) - pref.b_wing3 = hex2num(copytext(new_wingc3, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - return ..() diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index 83f94d439b..17147acb27 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -96,7 +96,7 @@ var/datum/species/selected_species = GLOB.all_species[pref.species] if(selected_species.selects_bodytype) // Allowed! - else if(!pref.custom_base || !(pref.custom_base in custom_species_bases)) + else if(!pref.custom_base || !(pref.custom_base in GLOB.custom_species_bases)) pref.custom_base = SPECIES_HUMAN /datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character) @@ -207,7 +207,7 @@ return TOPIC_REFRESH else if(href_list["custom_base"]) - var/list/choices = custom_species_bases + var/list/choices = GLOB.custom_species_bases if(pref.species != SPECIES_CUSTOM) choices = (choices | pref.species) var/text_choice = input("Pick an icon set for your species:","Icon Base") in choices diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 1b03300ddd..918294ff7f 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -744,6 +744,8 @@ slot_flags = SLOT_OCLOTHING var/blood_overlay_type = "suit" blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. + + var/taurized = FALSE siemens_coefficient = 0.9 w_class = ITEMSIZE_NORMAL preserve_item = 1 @@ -779,6 +781,43 @@ set_clothing_index() +/obj/item/clothing/suit/equipped(var/mob/user, var/slot) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if((taurized && !isTaurTail(H.tail_style)) || (!taurized && isTaurTail(H.tail_style))) + taurize(user) + + return ..() + +/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur) + if(isTaurTail(Taur.tail_style)) + var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style + if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) + icon_override = taurtail.suit_sprites + taurized = TRUE + + if(!taurized) + icon_override = initial(icon_override) + taurized = FALSE + +// Taur suits need to be shifted so its centered on their taur half. +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) + var/image/standing = ..() + if(taurized) //Special snowflake var on suits + standing.pixel_x = -16 + standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. + return standing + +/obj/item/clothing/suit/apply_accessories(var/image/standing) + if(LAZYLEN(accessories) && taurized) + for(var/obj/item/clothing/accessory/A in accessories) + var/image/I = new(A.get_mob_overlay()) + I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. + standing.add_overlay(I) + else + return ..() + + /////////////////////////////////////////////////////////////////////// //Under clothing /obj/item/clothing/under @@ -1056,7 +1095,6 @@ to_chat(usr, "You roll down your [src]'s sleeves.") update_clothing_icon() - /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() diff --git a/code/modules/clothing/clothing_vr.dm b/code/modules/clothing/clothing_vr.dm index 68df04ae22..1c4b8cd9f3 100644 --- a/code/modules/clothing/clothing_vr.dm +++ b/code/modules/clothing/clothing_vr.dm @@ -149,48 +149,11 @@ //Switch to taur sprites if a taur equips /obj/item/clothing/suit - var/taurized = FALSE //Easier than trying to 'compare icons' to see if it's a taur suit sprite_sheets = list( SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi', SPECIES_VOX = 'icons/mob/species/vox/suit.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/suit.dmi') -/obj/item/clothing/suit/equipped(var/mob/user, var/slot) - var/normalize = TRUE - - //Pyramid of doom-y. Improve somehow? - if(!taurized && slot == slot_wear_suit && ishuman(user)) - var/mob/living/carbon/human/H = user - if(isTaurTail(H.tail_style)) - var/datum/sprite_accessory/tail/taur/taurtail = H.tail_style - if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) - icon_override = taurtail.suit_sprites - normalize = FALSE - taurized = TRUE - - if(normalize && taurized) - icon_override = initial(icon_override) - taurized = FALSE - - return ..() - -// Taur suits need to be shifted so its centered on their taur half. -/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) - var/image/standing = ..() - if(taurized) //Special snowflake var on suits - standing.pixel_x = -16 - standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. - return standing - -/obj/item/clothing/suit/apply_accessories(var/image/standing) - if(LAZYLEN(accessories) && taurized) - for(var/obj/item/clothing/accessory/A in accessories) - var/image/I = new(A.get_mob_overlay()) - I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. - standing.add_overlay(I) - else - return ..() - //TFF 5/8/19 - sets Vorestation /obj/item/clothing/under sensor setting default? /obj/item/clothing/under sensor_mode = 3 diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 9606205cc4..1b649ff8fe 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -44,6 +44,8 @@ var/glove_type = /obj/item/clothing/gloves/gauntlets/rig var/cell_type = /obj/item/weapon/cell/high var/air_type = /obj/item/weapon/tank/oxygen + var/unremovable_cell = FALSE //CHOMP Edit - an addition for protean living hardsuit. + //Component/device holders. var/obj/item/weapon/tank/air_supply // Air tank, if any. @@ -899,14 +901,19 @@ wearer.lay_down() to_chat(user, "\The [wearer] is now [wearer.resting ? "resting" : "getting up"].") -/obj/item/weapon/rig/proc/forced_move(var/direction, var/mob/user) +/obj/item/weapon/rig/proc/forced_move(var/direction, var/mob/user, var/ai_moving = TRUE) // Why is all this shit in client/Move()? Who knows? if(world.time < wearer_move_delay) return - if(!wearer || !wearer.loc || !ai_can_move_suit(user, check_user_module = 1)) + if(!wearer || !wearer.loc) //CHOMP Edit - Removed some stuff for protean living hardsuit return + +//CHOMP Addition - Added this for protean living hardsuit + if(ai_moving) + if(!ai_can_move_suit(user, check_user_module = 1)) + return //This is sota the goto stop mobs from moving var if(wearer.transforming || !wearer.canmove) @@ -965,7 +972,10 @@ wearer_move_delay += 2 return wearer.buckled.relaymove(wearer,direction) - cell.use(200) //Arbitrary, TODO + var/power_cost = 200 + if(!ai_moving) + power_cost = 20 + cell.use(power_cost) //Arbitrary, TODO wearer.Move(get_step(get_turf(wearer),direction),direction) // This returns the rig if you are contained inside one, but not if you are wearing it diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm index 67080dd1e0..656f2d19da 100644 --- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm +++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm @@ -136,7 +136,7 @@ if("cell") - if(cell) + if(cell && !unremovable_cell) //CHOMP Edit - addition for living protean hardsuit to_chat(user, "You detach \the [cell] from \the [src]'s battery mount.") for(var/obj/item/rig_module/module in installed_modules) module.deactivate() diff --git a/code/modules/clothing/spacesuits/rig/suits/alien_ch.dm b/code/modules/clothing/spacesuits/rig/suits/alien_ch.dm new file mode 100644 index 0000000000..d93cfb06e5 --- /dev/null +++ b/code/modules/clothing/spacesuits/rig/suits/alien_ch.dm @@ -0,0 +1,213 @@ +/* + proteans +*/ +/obj/item/weapon/rig/protean + name = "nanosuit control cluster" + suit_type = "nanomachine" + icon = 'icons/obj/rig_modules_ch.dmi' + icon_state = "nanomachine_rig" + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 90) + siemens_coefficient= 0.5 + slowdown = 0 + offline_slowdown = 0 + seal_delay = 1 + var/mob/living/carbon/human/myprotean + initial_modules = list(/obj/item/rig_module/power_sink) + + helm_type = /obj/item/clothing/head/helmet/space/rig/protean //These are important for sprite pointers + boot_type = /obj/item/clothing/shoes/magboots/rig/protean + chest_type = /obj/item/clothing/suit/space/rig/protean + glove_type = /obj/item/clothing/gloves/gauntlets/rig/protean + +//I doooon't think I can get rig_back.dmi as a _ch file. That is part of /obj/item/weapon/rig/update_icon(var/update_mob_icon). + +/obj/item/weapon/rig/protean/relaymove(mob/user, var/direction) + if(user.stat || user.stunned) + return + forced_move(direction, user, FALSE) + +/obj/item/clothing/head/helmet/space/rig/protean + name = "mass" + desc = "A helmet-shaped clump of nanomachines." + siemens_coefficient= 0 + light_overlay = "should not use a light overlay" + species_restricted = list(SPECIES_HUMAN, SPECIES_PROMETHEAN, SPECIES_VASILISSAN, SPECIES_ALRAUNE) //anything that's roughly humanoid ie uses human spritesheets + +/obj/item/clothing/gloves/gauntlets/rig/protean + name = "mass" + desc = "Glove-shaped clusters of nanomachines." + siemens_coefficient= 0 + species_restricted = list(SPECIES_HUMAN, SPECIES_PROMETHEAN, SPECIES_VASILISSAN, SPECIES_ALRAUNE) //anything that's roughly humanoid. + +/obj/item/clothing/shoes/magboots/rig/protean + name = "mass" + desc = "Boot-shaped clusters of nanomachines." + siemens_coefficient= 0 + species_restricted = list(SPECIES_HUMAN, SPECIES_PROMETHEAN, SPECIES_VASILISSAN, SPECIES_ALRAUNE) //anything that's roughly humanoid. + +/obj/item/clothing/suit/space/rig/protean + name = "mass" + desc = "A body-hugging mass of nanomachines." + siemens_coefficient= 0 + can_breach = 0 + species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJ, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_XENOHYBRID, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN) + allowed = list( + /obj/item/weapon/gun, + /obj/item/device/flashlight, + /obj/item/weapon/tank, + /obj/item/device/suit_cooling_unit, + /obj/item/weapon/melee/baton, + /obj/item/weapon/storage/backpack, + ) //Subspace radio is in for the citadel version. IDK if we have that and I don't think we need it so I removed it from this list. + + + + +//Backend stuff to make the sprites work. Copied and pasted from rig_pieces_vr.dm, but added ch to everything. Only reason for this to be touched is to add or remove species. This might just need to go in a new file named rig_pieces_ch.dm. +/obj/item/clothing/head/helmet/space/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/head_ch.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/helmet_ch.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/helmet_ch.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/helmet_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/helmet_ch.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/helmet_ch.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/helmet_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/helmet_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/helmet_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/helmet_ch.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/helmet_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/species/skrell/helmet_ch.dmi', + SPECIES_TESHARI = 'icons/mob/species/seromi/head_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/species/skrell/helmet_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/head_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/hats_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/hats_ch.dmi' + ) + +/obj/item/clothing/suit/space/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/spacesuit_ch.dmi', + SPECIES_TAJ = 'icons/mob/species/tajaran/suit_ch.dmi', + SPECIES_SKRELL = 'icons/mob/species/skrell/suit_ch.dmi', + SPECIES_UNATHI = 'icons/mob/species/unathi/suit_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/species/unathi/suit_ch.dmi', + SPECIES_AKULA = 'icons/mob/species/akula/suit_ch.dmi', + SPECIES_SERGAL = 'icons/mob/species/sergal/suit_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/species/sergal/suit_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/species/vulpkanin/suit_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/species/fox/suit_ch.dmi', + SPECIES_FENNEC = 'icons/mob/species/vulpkanin/suit_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/species/skrell/suit_ch.dmi', + SPECIES_TESHARI = 'icons/mob/species/seromi/suit_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/species/skrell/suit_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/suit_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/spacesuits_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/spacesuits_ch.dmi' + ) + +/obj/item/clothing/gloves/gauntlets/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/hands_ch.dmi', + SPECIES_TAJ = 'icons/mob/hands_ch.dmi', + SPECIES_SKRELL = 'icons/mob/hands_ch.dmi', + SPECIES_UNATHI = 'icons/mob/hands_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/hands_ch.dmi', + SPECIES_AKULA = 'icons/mob/hands_ch.dmi', + SPECIES_SERGAL = 'icons/mob/hands_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/hands_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/hands_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/hands_ch.dmi', + SPECIES_FENNEC = 'icons/mob/hands_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/hands_ch.dmi', + SPECIES_TESHARI = 'icons/mob/hands_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/hands_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/gloves_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/gloves_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/gloves_ch.dmi' + ) + +/obj/item/clothing/shoes/magboots/rig/protean + sprite_sheets = list( + SPECIES_HUMAN = 'icons/mob/feet_ch.dmi', + SPECIES_TAJ = 'icons/mob/feet_ch.dmi', + SPECIES_SKRELL = 'icons/mob/feet_ch.dmi', + SPECIES_UNATHI = 'icons/mob/feet_ch.dmi', + SPECIES_XENOHYBRID = 'icons/mob/feet_ch.dmi', + SPECIES_AKULA = 'icons/mob/feet_ch.dmi', + SPECIES_SERGAL = 'icons/mob/feet_ch.dmi', + SPECIES_NEVREAN = 'icons/mob/feet_ch.dmi', + SPECIES_VULPKANIN = 'icons/mob/feet_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/mob/feet_ch.dmi', + SPECIES_FENNEC = 'icons/mob/feet_ch.dmi', + SPECIES_PROMETHEAN = 'icons/mob/feet_ch.dmi', + SPECIES_TESHARI = 'icons/mob/feet_ch.dmi', + SPECIES_VASILISSAN = 'icons/mob/feet_ch.dmi', + SPECIES_VOX = 'icons/mob/species/vox/shoes_ch.dmi' + ) + + sprite_sheets_obj = list( + SPECIES_HUMAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_TAJ = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_SKRELL = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_UNATHI = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_XENOHYBRID = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_AKULA = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_SERGAL = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_NEVREAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_VULPKANIN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_ZORREN_HIGH = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_FENNEC = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_PROMETHEAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_TESHARI = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_VASILISSAN = 'icons/obj/clothing/shoes_ch.dmi', + SPECIES_VOX = 'icons/obj/clothing/shoes_ch.dmi' + ) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 1cf9a789a7..0031a6c55b 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -106,7 +106,9 @@ /obj/item/clothing/suit/syndicatefake name = "red space suit replica" icon = 'icons/obj/clothing/spacesuits.dmi' + icon_override = "icons/mob/spacesuit.dmi" //Chomp edit to fix its missing icon icon_state = "syndicate" + default_worn_icon = 'icons/mob/spacesuit.dmi' desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" w_class = ITEMSIZE_NORMAL allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen,/obj/item/toy) diff --git a/code/modules/economy/price_list.dm b/code/modules/economy/price_list.dm index e9c8b1372d..9e3fb438d8 100644 --- a/code/modules/economy/price_list.dm +++ b/code/modules/economy/price_list.dm @@ -504,6 +504,9 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/sake price_tag = 25 +/obj/item/weapon/reagent_containers/food/drinks/bottle/jager + price_tag = 25 + //***************// //---Foodstuff---// //***************// diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm index 6b3883afd7..b889ce2193 100644 --- a/code/modules/events/infestation.dm +++ b/code/modules/events/infestation.dm @@ -63,8 +63,14 @@ for(var/areapath in typesof(spawn_area_type)) var/area/A = locate(areapath) for(var/turf/simulated/floor/F in A.contents) - if(turf_clear(F)) + //VOREStation Edit - Fixes event + var/blocked = FALSE + for(var/atom/movable/AM in F) + if(AM.density) + blocked = TRUE + if(!blocked) turfs += F + //VOREStation Edit - Fixes event var/list/spawn_types = list() var/max_number diff --git a/code/modules/food/food/drinks/bottle.dm b/code/modules/food/food/drinks/bottle.dm index 9472f8459d..56d303371a 100644 --- a/code/modules/food/food/drinks/bottle.dm +++ b/code/modules/food/food/drinks/bottle.dm @@ -628,3 +628,13 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/lemonadeschnapps/Initialize() . = ..() reagents.add_reagent("schnapps_lem", 100) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/jager + name = "Schusskonig" + desc = "A complex tasting digestif. Thank god the original's trademark lapsed." + icon_state = "jager_bottle" + center_of_mass = list("x"=16, "y"=3) + +/obj/item/weapon/reagent_containers/food/drinks/bottle/jager/Initialize() + . = ..() + reagents.add_reagent("jager", 100) diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 92c786680c..a00ec410a5 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -4730,9 +4730,6 @@ /mob/living/simple_mob var/kitchen_tag = "animal" //Used for cooking with animals -/mob/living/simple_mob/mouse - kitchen_tag = "rodent" - /obj/item/weapon/reagent_containers/food/snacks/sliceable/cheesewheel slices_num = 8 diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm index 107e91ad3b..3a89f5cf6e 100644 --- a/code/modules/lore_codex/news_data/main.dm +++ b/code/modules/lore_codex/news_data/main.dm @@ -4,6 +4,8 @@ region. Each is labeled by date of publication and title. This list is self-updating, and from time to time the publisher will push new \ articles. You are encouraged to check back frequently." children = list( + /datum/lore/codex/page/article103, + /datum/lore/codex/page/article102, /datum/lore/codex/page/article101, /datum/lore/codex/page/article100, /datum/lore/codex/page/article99, @@ -1126,4 +1128,30 @@

\ Tachyons are a naturally occurring particle present in varying density which form the primary mechanism for bluespace drive operation. In simple terms, the higher the density of tachyons, the more efficiently starship engines are capable of operating. Low-density regions such as the Rarkajar Rift have long posed a challenge to interstellar trade, and the expansion of such regions could prove devastating to galactic unity.\

\ - FTL industry leaders Focal Point Energistics have already announced 'immediate investigation' into the GSA's findings after taking a blow on the stock exchange, and have guaranteed a 'commitment to future-proofing' in all forthcoming products." \ No newline at end of file + FTL industry leaders Focal Point Energistics have already announced 'immediate investigation' into the GSA's findings after taking a blow on the stock exchange, and have guaranteed a 'commitment to future-proofing' in all forthcoming products." + +/datum/lore/codex/page/article102 + name = "02/15/65 - NanoTrasen Announces First NERC Members" + data = "Following Saturday's internal election, NanoTrasen Vir has elected the first five members for its new Employee Representation Committee. These individuals are expected to hold the position for one month:\ +

\ + For the New Reykjavik Head Office Iraluq James, a remote personnel operative, won the position on a platform of employee morale, team-building and employee-employer conflict resolution.\ +

\ + On the NCS Northern Star, NanoTrasen's main colony station in Vir Victoria Bell, a cybernetic chef and hardshell operator won her place with promises of increased regulatory transparency and clarity, including the publication of an in-house magazine.\ +

\ + At the NMB Gullstrand medical science center in Kalmar, a close race between top doctors was upset by the election of a station security commander, Wish Elara-Voight who promises 'improvements to the safety and security of NanoTrasen facilities with a focus on enforcing current SoP and CorpReg policies and placing new procedure in the handbooks.'\ +

\ + The waypoint station NLS Southern Cross selected a cybernetic Unathi candidate, researcher Dr. Haven Rasikl to represent them on the basis of encouraging interdepartmental cooperation and communication.\ +

\ + Finally, the Ekmanshalvo Fabrication Plant has selected fabrication programmer Terazon Norddahl, who promises to push for overhauls and modernization of the company's internal transport and support systems, including shuttle scheduling." + +/datum/lore/codex/page/article103 + name = "03/10/65 - GSA Confirms Presence Of 'New' Deep-Space Threat" + data = "This morning the Galactic Survey Administration released confirmation that a previously unknown deep-space dwelling species was indeed responsible for the disappearance of five Extraplanar Discovery Division vessels early last year, three of which have returned adrift over the past several days. The species, colloquially dubbed the 'Bluespace Bugs' after initial reports from the recovered EDD ships, are believed to be capable of manipulating matter in a manner reminicent of experimental bluespace technology.\ +

\ + The three 'returning' vessels are said to have been 'significantly off-course', with their points of galactic re-entry differing vastly from their initial points of egress, and final programmed return routes. Each ship having departed on routes from Sol, the SCG-E Bungaree was reported adrift by Almach Protectorate officials close to the Vounna system, the SCG-E Ketumati severely damaged on a collision course with the Erebus star, in the Nyx system, and the SCG-E Mag Mell collided with the garden world of Sif, in Vir. The Gagarin and Xu Fu remain unaccounted for, but due to the proximity of final contact, their disappearance has also been ascribed to the 'bugs'.\ +

\ + Investigation of the recovered vessels each indicated signs of a brief struggle, always following reports of unexplained equipment disappearances and equipment failure. No crew, or crew remains have been found, with the exception of a single unidentified human thumb aboard the Bungaree.\ +

\ + Additionally, each ship has been identified as having undergone some degree of material alteration, with elements ranging from hull plating to crew belongings having taken on a crystaline form dubbed 'Magmellite' after the ship most thoroughly 'reconstructed'. It is unclear whether the mineral is somehow secreted by the alien species, or merely a product of the same environment.\ +

\ + GSA sources have stated that there is no current evidence that the insectoid creatures - identified only from scattered descriptions left from missing EDD personnel - are in any way sapient or malicious, and the lost vessels are thought to have merely disturbed a scattered array of endemic populations far from the galactic plane. Precisely why the species has only been encountered in the past year, and now all at once, is not yet known." \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index bbc4b5214f..629237fa2b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -8,14 +8,11 @@ desc = "It's a g-g-g-g-ghooooost!" //jinkies! icon = 'icons/mob/ghost.dmi' icon_state = "ghost" - layer = BELOW_MOB_LAYER - plane = PLANE_GHOSTS - alpha = 127 stat = DEAD canmove = 0 blinded = 0 anchored = 1 // don't get pushed around - invisibility = INVISIBILITY_OBSERVER + var/can_reenter_corpse var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 @@ -90,27 +87,22 @@ var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns /mob/observer/dead/New(mob/body) + + appearance = body + invisibility = INVISIBILITY_OBSERVER + layer = BELOW_MOB_LAYER + plane = PLANE_GHOSTS + alpha = 127 + sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF see_invisible = SEE_INVISIBLE_OBSERVER see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... - plane = PLANE_GHOSTS //Why doesn't the var above work...??? verbs += /mob/observer/dead/proc/dead_tele var/turf/T if(ismob(body)) T = get_turf(body) //Where is the body located? attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - - if (ishuman(body)) - var/mob/living/carbon/human/H = body - icon = H.icon - icon_state = H.icon_state - add_overlay(H.overlays_standing) //All our equipment sprites - else - icon = body.icon - icon_state = body.icon_state - add_overlay(body.overlays) - gender = body.gender if(body.mind && body.mind.name) name = body.mind.name @@ -125,6 +117,12 @@ mind = body.mind //we don't transfer the mind but we keep a reference to it. + // Fix for naked ghosts. + // Unclear why this isn't being grabbed by appearance. + if(ishuman(body)) + var/mob/living/carbon/human/H = body + overlays = H.overlays_standing + if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position forceMove(T) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 8aad27762b..a435d0e5bc 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -135,6 +135,18 @@ var/list/holder_mob_icon_cache = list() /obj/item/weapon/holder/mouse w_class = ITEMSIZE_TINY +/obj/item/weapon/holder/possum + origin_tech = list(TECH_BIO = 2) + +/obj/item/weapon/holder/possum/poppy + origin_tech = list(TECH_BIO = 2, TECH_ENGINEERING = 4) + +/obj/item/weapon/holder/cat + origin_tech = list(TECH_BIO = 2) + +/obj/item/weapon/holder/cat/runtime + origin_tech = list(TECH_BIO = 2, TECH_DATA = 4) + /obj/item/weapon/holder/borer origin_tech = list(TECH_BIO = 6) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 376a1fafa7..35df5ef8a1 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -244,11 +244,10 @@ var/list/slot_equipment_priority = list( \ if(hasvar(src,"wear_id")) if(src:wear_id) items += src:wear_id if(hasvar(src,"wear_mask")) if(src:wear_mask) items += src:wear_mask if(hasvar(src,"wear_suit")) if(src:wear_suit) items += src:wear_suit -// if(hasvar(src,"w_radio")) if(src:w_radio) items += src:w_radio commenting this out since headsets go on your ears now PLEASE DON'T BE MAD KEELIN if(hasvar(src,"w_uniform")) if(src:w_uniform) items += src:w_uniform - //if(hasvar(src,"l_hand")) if(src:l_hand) items += src:l_hand - //if(hasvar(src,"r_hand")) if(src:r_hand) items += src:r_hand + if(hasvar(src,"l_hand")) if(src:l_hand) items += src:l_hand + if(hasvar(src,"r_hand")) if(src:r_hand) items += src:r_hand return items diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 87e3f38b91..81a49ae6fe 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -500,7 +500,7 @@ message = "points to [M]." else m_type = 1 - + if("crack") if(!restrained()) message = "cracks [T.his] knuckles." @@ -906,3 +906,27 @@ HTML +="\[Done\]" HTML += "" src << browse(HTML, "window=flavor_changes;size=430x300") + +/mob/living/carbon/human/proc/toggle_tail(var/setting,var/message = 0) + if(!tail_style || !tail_style.ani_state) + if(message) + to_chat(src, "You don't have a tail that supports this.") + return 0 + + var/new_wagging = isnull(setting) ? !wagging : setting + if(new_wagging != wagging) + wagging = new_wagging + update_tail_showing() + return 1 + +/mob/living/carbon/human/proc/toggle_wing(var/setting,var/message = 0) + if(!wing_style || !wing_style.ani_state) + if(message) + to_chat(src, "You don't have a wingtype that supports this.") + return 0 + + var/new_flapping = isnull(setting) ? !flapping : setting + if(new_flapping != flapping) + flapping = setting + update_wing_showing() + return 1 diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm index 88e3b3d6c9..5eeda3a8e4 100644 --- a/code/modules/mob/living/carbon/human/emote_vr.dm +++ b/code/modules/mob/living/carbon/human/emote_vr.dm @@ -9,13 +9,13 @@ switch(act) if("vwag") - if(toggle_tail_vr(message = 1)) + if(toggle_tail(message = 1)) m_type = 1 message = "[wagging ? "starts" : "stops"] wagging their tail." else return 1 if("vflap") - if(toggle_wing_vr(message = 1)) + if(toggle_wing(message = 1)) m_type = 1 message = "[flapping ? "starts" : "stops"] flapping their wings." else @@ -241,30 +241,6 @@ density = original_density pass_flags = original_passflags -/mob/living/carbon/human/proc/toggle_tail_vr(var/setting,var/message = 0) - if(!tail_style || !tail_style.ani_state) - if(message) - to_chat(src, "You don't have a tail that supports this.") - return 0 - - var/new_wagging = isnull(setting) ? !wagging : setting - if(new_wagging != wagging) - wagging = new_wagging - update_tail_showing() - return 1 - -/mob/living/carbon/human/proc/toggle_wing_vr(var/setting,var/message = 0) - if(!wing_style || !wing_style.ani_state) - if(message) - to_chat(src, "You don't have a tail that supports this.") - return 0 - - var/new_flapping = isnull(setting) ? !flapping : setting - if(new_flapping != flapping) - flapping = setting - update_wing_showing() - return 1 - /mob/living/carbon/human/verb/toggle_gender_identity_vr() set name = "Set Gender Identity" set desc = "Sets the pronouns when examined and performing an emote." diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 208e1e1ffc..34b93b2573 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -118,3 +118,42 @@ inventory_panel_type = /datum/inventory_panel/human butchery_loot = list(/obj/item/stack/animalhide/human = 1) + + // Horray Furries! + var/datum/sprite_accessory/ears/ear_style = null + var/r_ears = 30 + var/g_ears = 30 + var/b_ears = 30 + var/r_ears2 = 30 + var/g_ears2 = 30 + var/b_ears2 = 30 + var/r_ears3 = 30 //Trust me, we could always use more colour. No japes. + var/g_ears3 = 30 + var/b_ears3 = 30 + var/datum/sprite_accessory/tail/tail_style = null + var/r_tail = 30 + var/g_tail = 30 + var/b_tail = 30 + var/r_tail2 = 30 + var/g_tail2 = 30 + var/b_tail2 = 30 + var/r_tail3 = 30 + var/g_tail3 = 30 + var/b_tail3 = 30 + var/datum/sprite_accessory/wing/wing_style = null + var/r_wing = 30 + var/g_wing = 30 + var/b_wing = 30 + var/r_wing2 = 30 + var/g_wing2 = 30 + var/b_wing2 = 30 + var/r_wing3 = 30 + var/g_wing3 = 30 + var/b_wing3 = 30 + + var/wagging = 0 //UGH. + var/flapping = 0 + + // Custom Species Name + var/custom_species + diff --git a/code/modules/mob/living/carbon/human/human_defines_vr.dm b/code/modules/mob/living/carbon/human/human_defines_vr.dm index aa789a8848..0ac1b641d3 100644 --- a/code/modules/mob/living/carbon/human/human_defines_vr.dm +++ b/code/modules/mob/living/carbon/human/human_defines_vr.dm @@ -3,8 +3,6 @@ g_skin = 206 b_skin = 179 - var/wagging = 0 //UGH. - var/flapping = 0 var/vantag_pref = VANTAG_NONE //What's my status? var/impersonate_bodytype //For impersonating a bodytype var/ability_flags = 0 //Shadekin abilities/potentially other species-based? diff --git a/code/modules/mob/living/carbon/human/human_powers_vr.dm b/code/modules/mob/living/carbon/human/human_powers_vr.dm index e8ba13c437..72eda2e609 100644 --- a/code/modules/mob/living/carbon/human/human_powers_vr.dm +++ b/code/modules/mob/living/carbon/human/human_powers_vr.dm @@ -22,7 +22,7 @@ if(stat) to_chat(src, "You must be awake and standing to perform this action!") return - var/obj/item/organ/external/head/vr/H = organs_by_name[BP_HEAD] + var/obj/item/organ/external/head/H = organs_by_name[BP_HEAD] if(!H) to_chat(src, "You don't seem to have a head!") return 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 fa8440051c..5cf9fa8f73 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm @@ -58,7 +58,7 @@ base_color = "#f0f0f0" color_mult = 1 - has_glowing_eyes = TRUE + // has_glowing_eyes = TRUE //Applicable through neutral taits. death_message = "phases to somewhere far away!" male_cough_sounds = null @@ -94,7 +94,7 @@ has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/vr/shadekin), + BP_HEAD = list("path" = /obj/item/organ/external/head/shadekin), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 303f8ccb85..e4b3ed606e 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -258,6 +258,27 @@ /datum/mob_descriptor/build ) + //This is used in character setup preview generation (prefences_setup.dm) and human mob + //rendering (update_icons.dm) + var/color_mult = 0 + + //This is for overriding tail rendering with a specific icon in icobase, for static + //tails only, since tails would wag when dead if you used this + var/icobase_tail = 0 + + var/wing_hair + var/wing + var/wing_animation + var/icobase_wing + var/wikilink = null //link to wiki page for species + var/icon_height = 32 + var/agility = 20 //prob() to do agile things + +/datum/species/proc/update_attack_types() + unarmed_attacks = list() + for(var/u_type in unarmed_types) + unarmed_attacks += new u_type() + /datum/species/New() if(hud_type) hud = new hud_type() @@ -401,8 +422,9 @@ "[H] boops [target]'s nose.", \ "You boop [target] on the nose.", ) //VOREStation Edit End - else H.visible_message("[H] hugs [target] to make [t_him] feel better!", \ - "You hug [target] to make [t_him] feel better!") //End VOREStation Edit + else + H.visible_message("[H] hugs [target] to make [t_him] feel better!", \ + "You hug [target] to make [t_him] feel better!") /datum/species/proc/remove_inherent_verbs(var/mob/living/carbon/human/H) if(inherent_verbs) 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 558924a784..fb9beed574 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -1,25 +1,10 @@ /datum/species - //This is used in character setup preview generation (prefences_setup.dm) and human mob - //rendering (update_icons.dm) - var/color_mult = 0 - - //This is for overriding tail rendering with a specific icon in icobase, for static - //tails only, since tails would wag when dead if you used this - var/icobase_tail = 0 - //This is so that if a race is using the chimera revive they can't use it more than once. //Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race. //var/reviving = 0 //commented out 'cause moved to mob holder_type = /obj/item/weapon/holder/micro //This allows you to pick up crew min_age = 18 descriptors = list() - var/wing_hair - var/wing - var/wing_animation - var/icobase_wing - var/wikilink = null //link to wiki page for species - var/icon_height = 32 - var/agility = 20 //prob() to do agile things var/organic_food_coeff = 1 var/synthetic_food_coeff = 0 @@ -39,11 +24,6 @@ var/list/traits = list() -/datum/species/proc/update_attack_types() - unarmed_attacks = list() - for(var/u_type in unarmed_types) - unarmed_attacks += new u_type() - /datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane. unarmed_attacks = list() unarmed_types += /datum/unarmed_attack/bite/sharp/numbing diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 253f3d2f59..c15b14686b 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -17,13 +17,13 @@ // ai_inactive = TRUE //Always off //VORESTATION AI TEMPORARY REMOVAL show_stat_health = FALSE //We will do it ourselves - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "hits" + response_help = "pets the" //CHOMP Edit + response_disarm = "gently pushes aside the " //CHOMP Edit + response_harm = "hits the" //CHOMP Edit - harm_intent_damage = 2 - melee_damage_lower = 10 - melee_damage_upper = 10 + harm_intent_damage = 3 + melee_damage_lower = 5 //CHOMP Edit + melee_damage_upper = 5 //CHOMP Edit attacktext = list("slashed") min_oxy = 0 @@ -36,7 +36,7 @@ max_n2 = 0 minbodytemp = 0 maxbodytemp = 900 - movement_cooldown = 3 + movement_cooldown = 2 //CHOMP Edit var/mob/living/carbon/human/humanform var/obj/item/organ/internal/nano/refactory/refactory @@ -48,7 +48,7 @@ var/human_brute = 0 var/human_burn = 0 - player_msg = "In this form, you can move a little faster, your health will regenerate as long as you have metal in you, and you can ventcrawl!" + player_msg = "In this form, your health will regenerate as long as you have metal in you." //CHOMP Edit removed ventcrawl can_buckle = TRUE //Blobsurfing @@ -64,8 +64,10 @@ humanform = H updatehealth() refactory = locate() in humanform.internal_organs - verbs |= /mob/living/proc/ventcrawl +// verbs |= /mob/living/proc/ventcrawl //CHOMP Removal verbs |= /mob/living/proc/hide + verbs |= /mob/living/simple_mob/protean_blob/proc/rig_transform //CHOMP Addition + verbs |= /mob/living/proc/usehardsuit //CHOMP Addition else update_icon() @@ -267,14 +269,31 @@ if(refactory && istype(A,/obj/item/stack/material)) var/obj/item/stack/material/S = A var/substance = S.material.name - var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones. - var allowed = FALSE + var/list/edible_materials = list(MAT_STEEL) //Can't eat all materials, just useful ones. + var/allowed = FALSE //CHOMP Edit for(var/material in edible_materials) - if(material == substance) allowed = TRUE + if(material == substance) + allowed = TRUE if(!allowed) return if(refactory.add_stored_material(S.material.name,1*S.perunit) && S.use(1)) visible_message("[name] gloms over some of \the [S], absorbing it.") + else if(isitem(A) && a_intent == "grab") //CHOMP Add all this block, down to I.forceMove. + var/obj/item/I = A + if(!vore_selected) + to_chat(src,"You either don't have a belly selected, or don't have a belly!") + return FALSE + if(is_type_in_list(I,item_vore_blacklist) || I.anchored) + to_chat(src, "You can't eat this.") + return + + if(is_type_in_list(I,edible_trash) | adminbus_trash) + if(I.hidden_uplink) + to_chat(src, "You really should not be eating this.") + message_admins("[key_name(src)] has attempted to ingest an uplink item. ([src ? "JMP" : "null"])") + return + visible_message("[name] stretches itself over the [I], engulfing it whole!") + I.forceMove(vore_selected) else return ..() @@ -283,7 +302,7 @@ var/obj/item/stack/material/S = O var/substance = S.material.name var/list/edible_materials = list("steel", "plasteel", "diamond", "mhydrogen") //Can't eat all materials, just useful ones. - var allowed = FALSE + var/allowed = FALSE //CHOMP Edit for(var/material in edible_materials) if(material == substance) allowed = TRUE if(!allowed) @@ -292,7 +311,20 @@ visible_message("[name] gloms over some of \the [S], absorbing it.") else return ..() - + +/mob/living/simple_mob/protean_blob/attack_hand(mob/living/L) //CHOMP Add this whole block. + if(L.get_effective_size() >= (src.get_effective_size() + 0.5) ) + src.get_scooped(L) + else + ..() + +/mob/living/simple_mob/protean_blob/MouseDrop(var/atom/over_object) //CHOMP Add this whole block. + if(ishuman(over_object) && usr == src && src.Adjacent(over_object)) + var/mob/living/carbon/human/H = over_object + get_scooped(H, TRUE) + else + return ..() + /mob/living/simple_mob/protean_blob/MouseEntered(location,control,params) if(resting) return @@ -306,6 +338,8 @@ var/global/list/disallowed_protean_accessories = list( // Helpers - Unsafe, WILL perform change. /mob/living/carbon/human/proc/nano_intoblob() + if(loc == /obj/item/weapon/rig/protean) + return var/panel_was_up = FALSE if(client?.statpanel == "Protean") panel_was_up = TRUE @@ -341,6 +375,8 @@ var/global/list/disallowed_protean_accessories = list( things_to_drop -= things_to_not_drop //Crunch the lists things_to_drop -= organs //Mah armbs things_to_drop -= internal_organs //Mah sqeedily spooch + for(var/obj/item/weapon/rig/protean/O in things_to_drop) //CHOMP Add + things_to_drop -= O //CHOMP Add for(var/obj/item/I in things_to_drop) //rip hoarders drop_from_inventory(I) @@ -397,10 +433,44 @@ var/global/list/disallowed_protean_accessories = list( remove_micros(I, root) //Recursion. I'm honestly depending on there being no containment loop, but at the cost of performance that can be fixed too. if(istype(I, /obj/item/weapon/holder)) root.remove_from_mob(I) + +//CHOMP Add start +/mob/living/simple_mob/protean_blob/proc/rig_transform() //CHOMP Add this whole block. + set name = "Modify Form - Hardsuit" + set desc = "Allows a protean blob to solidify its form into one extremely similar to a hardsuit." + set category = "Abilities" + + if(istype(loc, /obj/item/weapon/rig/protean)) + var/obj/item/weapon/rig/protean/prig = loc + src.forceMove(get_turf(prig)) + qdel(prig) + return + + if(isturf(loc)) + var/obj/item/weapon/rig/protean/prig = new(loc) + if(prig) + prig.forceMove(get_turf(src)) + src.forceMove(prig) + return + +/mob/living/proc/usehardsuit() + set name = "Utilize Hardsuit Interface" + set desc = "Allows a protean blob to open hardsuit interface." + set category = "Abilities" + + if(istype(loc, /obj/item/weapon/rig/protean)) + var/obj/item/weapon/rig/protean/prig = loc + to_chat(src, "You attempt to interface with the [prig].") + prig.ui_interact(src, nano_state = interactive_state) + else + to_chat(src, "You are not in RIG form.") +//CHOMP Add end /mob/living/carbon/human/proc/nano_outofblob(var/mob/living/simple_mob/protean_blob/blob) if(!istype(blob)) return + if(blob.loc == /obj/item/weapon/rig/protean) + return var/panel_was_up = FALSE if(client?.statpanel == "Protean") diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm index 8a84a15331..0580096bc7 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_powers.dm @@ -1,3 +1,4 @@ +//TODO: Replace ventcrawl with morphing. /mob/living/simple_mob/vore/hostile/morph #define PER_LIMB_STEEL_COST SHEET_MATERIAL_AMOUNT //// // One-part Refactor @@ -18,7 +19,6 @@ to_chat(src,"You don't have a working refactory module!") return - var/choice = input(src,"Pick the bodypart to change:", "Refactor - One Bodypart") as null|anything in species.has_limbs if(!choice) return @@ -81,12 +81,108 @@ //// // Full Refactor //// +/* +/mob/living/carbon/human/proc/nano_regenerate() + set name = "Regenerate" + set desc = "Allows you to regrow limbs and replace organs." + set category = "Abilities" + set hidden = TRUE + + if(nutrition < 250) + to_chat(src, "You lack the energy to begin regeneration!") + return + + if(active_regen) + to_chat(src, "You are already regenerating!") + return + else + active_regen = TRUE + src.visible_message("[src]'s nanites begin to regenerate...") + + + var/mob/living/simple_mob/protean_blob/blob = nano_intoblob() + var/delay_length = round(active_regen_delay * species.active_regen_mult) + if(do_after(blob, delay_length, null, 0)) + if(stat != DEAD) + adjust_nutrition(-200) + species.create_organs(src) + var/obj/item/organ/external/torso = organs_by_name[BP_TORSO] + torso.robotize() //synthetic wasn't defined here. + LAZYCLEARLIST(blood_DNA) + LAZYCLEARLIST(feet_blood_DNA) + blood_color = null + feet_blood_color = null + regenerate_icons() //Probably worth it, yeah. + to_chat(src, "Your regeneration is complete.") //Guarantees the message shows no matter how bad the timing. + to_chat(blob, "Your regeneration is complete!") + else + to_chat(src, "Your regeneration has failed.") + to_chat(blob, "Your regeneration has failed!") + else + to_chat(src, "Your regeneration is interrupted.") + to_chat(blob, "Your regeneration is interrupted!") + active_regen = FALSE + nano_outofblob(blob) + + + + var/delay_length = round(active_regen_delay * species.active_regen_mult) + if(do_after(src,delay_length)) + adjust_nutrition(-200) + + for(var/obj/item/organ/I in internal_organs) + if(I.robotic >= ORGAN_ROBOT) // No free robofix. + continue + if(I.damage > 0) + I.damage = max(I.damage - 30, 0) //Repair functionally half of a dead internal organ. + I.status = 0 // Wipe status, as it's being regenerated from possibly dead. + to_chat(src, "You feel a soothing sensation within your [I.name]...") + + // Replace completely missing limbs. + for(var/limb_type in src.species.has_limbs) + var/obj/item/organ/external/E = src.organs_by_name[limb_type] + + if(E && E.disfigured) + E.disfigured = 0 + if(E && (E.is_stump() || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)))) + E.removed() + qdel(E) + E = null + if(!E) + var/list/organ_data = src.species.has_limbs[limb_type] + var/limb_path = organ_data["path"] + var/obj/item/organ/O = new limb_path(src) + organ_data["descriptor"] = O.name + to_chat(src, "You feel a slithering sensation as your [O.name] reform.") + + var/agony_to_apply = round(0.66 * O.max_damage) // 66% of the limb's health is converted into pain. + src.apply_damage(agony_to_apply, HALLOSS) + + for(var/organtype in species.has_organ) // Replace completely missing internal organs. -After- external ones, so they all should exist. + if(!src.internal_organs_by_name[organtype]) + var/organpath = species.has_organ[organtype] + var/obj/item/organ/Int = new organpath(src, TRUE) + + Int.rejuvenate(TRUE) + + handle_organs() // Update everything + + update_icons_body() + active_regen = FALSE + else + to_chat(src, "Your regeneration is interrupted!") + adjust_nutrition(-75) + active_regen = FALSE +*/ + /mob/living/carbon/human/proc/nano_regenerate() //fixed the proc, it used to leave active_regen true. set name = "Ref - Whole Body" set desc = "Allows you to regrow limbs and replace organs, given you have enough materials." set category = "Abilities" set hidden = TRUE + + if(stat) to_chat(src,"You must be awake and standing to perform this action!") return @@ -178,7 +274,6 @@ active_regen = FALSE nano_outofblob(blob) - //// // Storing metal //// @@ -223,7 +318,7 @@ visible_message("[src] devours some of the [substance] right off the stack!") else to_chat(src,"You're completely capped out on [substance]!") - + //// // Blob Form //// @@ -269,6 +364,7 @@ //// // Change size //// +/*CHOMP Removal start - I am replacing this with the OG set size. No more metal requirement. /mob/living/carbon/human/proc/nano_set_size() set name = "Adjust Volume" set category = "Abilities" @@ -312,6 +408,7 @@ to_chat(user,"Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.") user.visible_message("Black mist swirls around [user] as they change size.") +CHOMP Removal end*/ /// /// /// A helper to reuse /mob/living/proc/nano_get_refactory(obj/item/organ/internal/nano/refactory/R) @@ -369,11 +466,13 @@ icon_state = "blob" to_call = /mob/living/carbon/human/proc/nano_blobform -/obj/effect/protean_ability/change_volume +/*CHOMP removal start - This doesn't do anything at all now. Normal resize proc is being used instead. +/obj/effect/protean_ability/change_volume //CHOMP Edit ability_name = "Change Volume" - desc = "Alter your size by consuming steel to produce additional nanites, or regain steel by reducing your size and reclaiming them." + desc = "Alter your size between 25% and 200%." //CHOMP Edit - Removed talk about requiring metal icon_state = "volume" to_call = /mob/living/carbon/human/proc/nano_set_size +CHOMP removal end*/ /obj/effect/protean_ability/reform_limb ability_name = "Ref - Single Limb" @@ -386,11 +485,11 @@ desc = "Rebuild your entire body into whatever design you want, assuming you have 10,000 metal." icon_state = "body" to_call = /mob/living/carbon/human/proc/nano_regenerate - + /obj/effect/protean_ability/metal_nom ability_name = "Ref - Store Metals" desc = "Store the metal you're holding. Your refactory can only store steel, and all other metals will be converted into nanites ASAP for various effects." icon_state = "metal" to_call = /mob/living/carbon/human/proc/nano_metalnom -#undef PER_LIMB_STEEL_COST +#undef PER_LIMB_STEEL_COST \ No newline at end of file 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 cc5fc9cd33..202ca5da07 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 @@ -17,7 +17,7 @@ flags = NO_SCAN | NO_SLIP | NO_MINOR_CUT | NO_HALLUCINATION | NO_INFECT | NO_PAIN appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_LIPS - spawn_flags = SPECIES_IS_RESTRICTED //SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE CHOMPedit: disabled probably forever + spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE health_hud_intensity = 2 num_alternate_languages = 3 assisted_langs = list(LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) @@ -67,7 +67,7 @@ has_organ = list( O_BRAIN = /obj/item/organ/internal/mmi_holder/posibrain/nano, O_ORCH = /obj/item/organ/internal/nano/orchestrator, - O_FACT = /obj/item/organ/internal/nano/refactory + O_FACT = /obj/item/organ/internal/nano/refactory, ) has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable/nano), @@ -91,8 +91,8 @@ /mob/living/carbon/human/proc/nano_regenerate, //These verbs are hidden so you can macro them, /mob/living/carbon/human/proc/nano_partswap, /mob/living/carbon/human/proc/nano_metalnom, - /mob/living/carbon/human/proc/nano_blobform, - /mob/living/carbon/human/proc/nano_set_size, + /mob/living/carbon/human/proc/nano_blobform, + /mob/living/proc/set_size, /mob/living/carbon/human/proc/nano_change_fitting, //These verbs are displayed normally, /mob/living/carbon/human/proc/shapeshifter_select_hair, /mob/living/carbon/human/proc/shapeshifter_select_hair_colors, @@ -101,9 +101,14 @@ /mob/living/carbon/human/proc/shapeshifter_select_gender, /mob/living/carbon/human/proc/shapeshifter_select_wings, /mob/living/carbon/human/proc/shapeshifter_select_tail, - /mob/living/carbon/human/proc/shapeshifter_select_ears - ) - + /mob/living/carbon/human/proc/shapeshifter_select_ears, + /mob/living/carbon/human/proc/succubus_drain, + /mob/living/carbon/human/proc/slime_feed, + /mob/living/carbon/human/proc/succubus_drain_finalize, + /mob/living/carbon/human/proc/succubus_drain_lethal, + /mob/living/proc/eat_trash + ) //CHOMP Edit - Added succ stuff that promies have too. Also changed nano_set_size to standard set_size so there is no metal cost. + var/global/list/abilities = list() var/monochromatic = FALSE //IGNORE ME @@ -135,8 +140,8 @@ /datum/species/protean/equip_survival_gear(var/mob/living/carbon/human/H) var/obj/item/stack/material/steel/metal_stack = new() - metal_stack.amount = 3 - + metal_stack.amount = 5 //CHOMP Edit + var/obj/item/clothing/accessory/permit/nanotech/permit = new() permit.set_name(H.real_name) @@ -155,6 +160,9 @@ new_nif.quick_implant(H) else H.nif.durability = rand(21,25) + + var/obj/item/weapon/rig/protean/prig = new /obj/item/weapon/rig/protean(H) + prig.myprotean = H /datum/species/protean/hug(var/mob/living/carbon/human/H, var/mob/living/target) return ..() //Wut @@ -174,7 +182,7 @@ 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.") + to_chat(H, "You died as a Protean. Please sit out of the round for at least 5 or 10 minutes before respawning, to represent the time it would take to ship a new-you to the station, depending on how you died.") for(var/obj/item/organ/I in H.internal_organs) I.removed() @@ -189,6 +197,7 @@ H.nano_intoblob() return ..() //Any instakill shot runtimes since there are no organs after this. No point to not skip these checks, going to nullspace anyway. +/*CHOMP Station removal start var/obj/item/organ/internal/nano/refactory/refactory = locate() in H.internal_organs if(refactory && !(refactory.status & ORGAN_DEAD)) @@ -209,6 +218,7 @@ H.add_modifier(/datum/modifier/protean/silver, origin = refactory) return ..() +CHOMP Station removal end*/ /datum/species/protean/get_additional_examine_text(var/mob/living/carbon/human/H) return ..() //Hmm, what could be done here? @@ -230,7 +240,7 @@ for(var/ability in abilities) var/obj/effect/protean_ability/A = ability stat("[A.ability_name]",A.atom_button_text()) - + // Various modifiers /datum/modifier/protean stacks = MODIFIER_STACK_FORBID @@ -261,6 +271,7 @@ if(!refactory.use_stored_material(material_name,material_use)) expire() +/*CHOMP Removal start /datum/modifier/protean/mhydrogen name = "Protean Effect - M.Hydrogen" desc = "You're affected by the presence of metallic hydrogen." @@ -305,6 +316,7 @@ accuracy = 30 evasion = 30 +CHOMP Removal end*/ /datum/modifier/protean/steel name = "Protean Effect - Steel" @@ -328,6 +340,7 @@ else if(O.status & ORGAN_DEAD) O.status &= ~ORGAN_DEAD //Unset dead if we repaired it entirely + // PAN Card /obj/item/clothing/accessory/permit/nanotech name = "\improper P.A.N. card" @@ -349,6 +362,28 @@ . = ..() . += validstring . += registring + +//CHOMP Add start +/mob/living/carbon/human/proc/rig_transform() + set name = "Modify Form - Hardsuit" + set desc = "Allows a protean to solidify its form into one extremely similar to a hardsuit." + set category = "Abilities" + if(istype(loc, /obj/item/weapon/rig/protean)) + var/obj/item/weapon/rig/protean/prig = loc + src.forceMove(get_turf(prig)) + prig.forceMove(src) + return + + if(isturf(loc)) + var/obj/item/weapon/rig/protean/prig + for(var/obj/item/weapon/rig/protean/O in contents) + prig = O + break + if(prig) + prig.forceMove(get_turf(src)) + src.forceMove(prig) + return +//CHOMP Add end #undef DAM_SCALE_FACTOR #undef METAL_PER_TICK \ No newline at end of file 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 fdf68a4202..31f6638e83 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 @@ -497,7 +497,7 @@ has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/vr/werebeast), + BP_HEAD = list("path" = /obj/item/organ/external/head/werebeast), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), 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 19c31c79d4..3023e9359b 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 @@ -55,7 +55,7 @@ has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head/vr/sergal), + BP_HEAD = list("path" = /obj/item/organ/external/head/sergal), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), @@ -504,7 +504,7 @@ datum/species/harpy base_color = "#f0f0f0" color_mult = 1 - has_glowing_eyes = TRUE + //has_glowing_eyes = TRUE // Applicable through traits. male_cough_sounds = null female_cough_sounds = null @@ -536,7 +536,7 @@ datum/species/harpy has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest/crewkin), BP_GROIN = list("path" = /obj/item/organ/external/groin/crewkin), - BP_HEAD = list("path" = /obj/item/organ/external/head/vr/crewkin), + BP_HEAD = list("path" = /obj/item/organ/external/head/crewkin), BP_L_ARM = list("path" = /obj/item/organ/external/arm/crewkin), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/crewkin), BP_L_LEG = list("path" = /obj/item/organ/external/leg/crewkin), 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 b9a907f027..f6f94c8b53 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 @@ -73,7 +73,7 @@ name = "Cold-Adapted" desc = "You are able to withstand much colder temperatures than other species, and can even be comfortable in extremely cold environments. You are also more vulnerable to hot environments, and have a lower body temperature as a consequence of these adaptations." 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) + 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" = 330, "heat_level_2" = 380, "heat_level_3" = 700, "breath_heat_level_1" = 360, "breath_heat_level_2" = 400, "breath_heat_level_3" = 850, "heat_discomfort_level" = 295, "body_temperature" = 290) excludes = list(/datum/trait/hotadapt) /datum/trait/hotadapt @@ -234,66 +234,73 @@ YW change end */ /datum/trait/allergy/meat name = "Allergy: Meat" - desc = "You're highly allergic to just about any form of meat. You're probably better off just sticking to vegetables." + desc = "You're highly allergic to just about any form of meat. You're probably better off just sticking to vegetables. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE allergen = MEAT /datum/trait/allergy/fish name = "Allergy: Fish" - desc = "You're highly allergic to fish. It's probably best to avoid seafood in general..." + desc = "You're highly allergic to fish. It's probably best to avoid seafood in general. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE allergen = FISH /datum/trait/allergy/fruit name = "Allergy: Fruit" - desc = "You're highly allergic to fruit. Vegetables are fine, but you should probably read up on how to tell the difference." + desc = "You're highly allergic to fruit. Vegetables are fine, but you should probably read up on how to tell the difference. Remember, tomatoes are a fruit. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE allergen = FRUIT /datum/trait/allergy/vegetable name = "Allergy: Vegetable" - desc = "You're highly allergic to vegetables. Fruit are fine, but you should probably read up on how to tell the difference." + desc = "You're highly allergic to vegetables. Fruit are fine, but you should probably read up on how to tell the difference. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE allergen = VEGETABLE /datum/trait/allergy/nuts name = "Allergy: Nuts" - desc = "You're highly allergic to hard-shell seeds, such as peanuts." + desc = "You're highly allergic to hard-shell seeds, such as peanuts. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE allergen = SEEDS /datum/trait/allergy/soy name = "Allergy: Soy" - desc = "You're highly allergic to soybeans, and some other kinds of bean." + desc = "You're highly allergic to soybeans, and some other kinds of bean. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE allergen = BEANS /datum/trait/allergy/dairy name = "Allergy: Lactose" - desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy." + desc = "You're highly allergic to lactose, and consequently, just about all forms of dairy. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE allergen = DAIRY /datum/trait/allergy/fungi name = "Allergy: Fungi" - desc = "You're highly allergic to Fungi such as mushrooms." + desc = "You're highly allergic to fungi such as mushrooms. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE allergen = FUNGI /datum/trait/allergy/coffee name = "Allergy: Coffee" - desc = "You're highly allergic to coffee in specific." + desc = "You're highly allergic to coffee in specific. NB: By taking this trait, you acknowledge there is a risk your character may suffer a fatal reaction if exposed to this substance." cost = 0 custom_only = FALSE allergen = COFFEE + +/datum/trait/allergen_reduced_effect + name = "Reduced Allergen Reaction" + desc = "This trait halves the lethality of allergen reactions. If you don't have any allergens set, it does nothing. It does not apply to nonlethal reactions or special reactions (such as unathi drowsiness from sugars)." + cost = 0 + custom_only = FALSE + var_changes = list("allergen_damage_severity" = 0.6) // Spicy Food Traits, from negative to positive. /datum/trait/spice_intolerance_extreme diff --git a/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm new file mode 100644 index 0000000000..be1783d9df --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/xenochimera_trait_vr.dm @@ -0,0 +1,41 @@ +/* +** For now, these are just neutral traits for Xenochimera only to take. +** These are only traits that they should reasonably be able to evolve to acquire themselves. +** I won't add the resistances though because those are kinda lame for a 'chimera to take! +*/ +/datum/trait/weaver/xenochimera + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Weaver" + desc = "You've evolved your body to produce silk that you can fashion into articles of clothing and other objects." + cost = 0 + custom_only = FALSE + +/datum/trait/hardfeet/xenochimera + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Hard Feet" + desc = "Your body has adapted to make your feet immune to glass shards, whether by developing hooves, chitin, or just horrible callous." + cost = 0 + custom_only = FALSE + +// Why put this on Xenochimera of all species? I have no idea, but someone may be enough of a lunatic to take it. +/datum/trait/neural_hypersensitivity/xenochimera + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Neural Hypersensitivity" + desc = "Despite your evolutionary efforts, you are unusually sensitive to pain. \ + Given your species' typical reactions to pain, this can only end well for you!" + cost = 0 + custom_only = FALSE + +/datum/trait/melee_attack_fangs/xenochimera + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Sharp Melee & Numbing Fangs" + desc = "Your hunting instincts manifest in earnest! You have grown numbing fangs alongside your naturally grown hunting weapons." + cost = 0 + custom_only = FALSE + +/datum/trait/snowwalker/xenochimera + allowed_species = list(SPECIES_XENOCHIMERA) + name = "Xenochimera: Snow Walker" + desc = "You've adapted to traversing snowy terrain. Snow does not slow you down!" + cost = 0 + custom_only = FALSE diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index ed7935e871..66ebedbb2c 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -4,6 +4,7 @@ */ var/global/list/human_icon_cache = list() //key is incredibly complex, see update_icons_body() var/global/list/tail_icon_cache = list() //key is [species.race_key][r_skin][g_skin][b_skin] +var/global/list/wing_icon_cache = list() // See tail. var/global/list/light_overlay_cache = list() //see make_worn_icon() on helmets var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() @@ -87,8 +88,8 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() #define LEGCUFF_LAYER 26 //Same as handcuffs, for legcuffs #define L_HAND_LAYER 27 //Left-hand item #define R_HAND_LAYER 28 //Right-hand item -#define WING_LAYER 29 //VOREStation edit. Simply move this up a number if things are added. -#define TAIL_LAYER_ALT 30 //VOREStation edit. Simply move this up a number if things are added. +#define WING_LAYER 29 //Wings or protrusions over the suit. +#define TAIL_LAYER_ALT 30 //Modified tail-sprite layer. Tend to be larger. #define MODIFIER_EFFECTS_LAYER 31 //Effects drawn by modifiers #define FIRE_LAYER 32 //'Mob on fire' overlay layer #define WATER_LAYER 33 //'Mob submerged' overlay layer @@ -170,7 +171,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() animate(src, transform = M, time = anim_time) update_icon_special() //May contain transform-altering things - //DAMAGE OVERLAYS //constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists /mob/living/carbon/human/UpdateDamageIcon() @@ -197,7 +197,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() // blend the individual damage states with our icons for(var/obj/item/organ/external/O in organs) - if(isnull(O) || O.is_stump()) + if(isnull(O) || O.is_stump() || O.is_hidden_by_tail()) continue O.update_icon() @@ -267,21 +267,20 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]" if(part.body_hair && part.h_col && part.h_col.len >= 3) icon_key += "[rgb(part.h_col[1],part.h_col[2],part.h_col[3])]" - //VOREStation Edit - Different way of tracking add/mult species if(species.color_mult) icon_key += "[ICON_MULTIPLY]" else icon_key += "[ICON_ADD]" - //VOREStation Edit End else icon_key += "#000000" + for(var/M in part.markings) icon_key += "[M][part.markings[M]["color"]]" if(part.robotic >= ORGAN_ROBOT) icon_key += "2[part.model ? "-[part.model]": ""]" robolimb_count++ - if((part.robotic == ORGAN_ROBOT || part.robotic == ORGAN_LIFELIKE) && (part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN)) //VOREStation Edit - Not for nanoform parts + if((part.robotic == ORGAN_ROBOT || part.robotic == ORGAN_LIFELIKE) && (part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN)) robobody_count ++ else if(part.status & ORGAN_DEAD) icon_key += "3" @@ -327,7 +326,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) if(part.icon_position & (LEFT | RIGHT)) - var/icon/temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") //VOREStation Edit. + var/icon/temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) if(!(part.icon_position & LEFT)) @@ -368,7 +367,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() //tail update_tail_showing() - update_wing_showing() // VOREStation Edit + update_wing_showing() /mob/living/carbon/human/proc/update_skin() if(QDESTROYING(src)) @@ -452,7 +451,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(facial_hair_style && facial_hair_style.species_allowed && (src.species.get_bodytype(src) in facial_hair_style.species_allowed)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_MULTIPLY) //VOREStation edit + facial_s.Blend(rgb(r_facial, g_facial, b_facial), facial_hair_style.color_blend_mode) face_standing.Blend(facial_s, ICON_OVERLAY) @@ -478,22 +477,16 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() face_standing.Blend(hair_s, ICON_OVERLAY) - // VOREStation Edit - START + if(head_organ.nonsolid || head_organ.transparent) + face_standing += rgb(,,,120) + var/icon/ears_s = get_ears_overlay() if(ears_s) face_standing.Blend(ears_s, ICON_OVERLAY) - if(istype(head_organ,/obj/item/organ/external/head/vr)) - var/obj/item/organ/external/head/vr/head_organ_vr = head_organ - overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ_vr.head_offset) - apply_layer(HAIR_LAYER) - return - // VOREStation Edit - END - if(head_organ.transparent) //VOREStation Edit. For better slime limbs. - face_standing += rgb(,,,120) - - overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER) + overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ.head_offset) apply_layer(HAIR_LAYER) + return // VOREStation Edit - START var/icon/hair_acc_s = get_hair_accessory_overlay() @@ -538,7 +531,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!head_organ.eye_icon) return - var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon) + var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon) //VOREStation Edit if(eyes) eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) else @@ -647,14 +640,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() uniform_sprite = "[INV_W_UNIFORM_DEF_ICON].dmi" //Build a uniform sprite - //VOREStation Edit start. var/icon/c_mask = tail_style?.clip_mask if(c_mask) var/obj/item/clothing/suit/S = wear_suit if((wear_suit?.flags_inv & HIDETAIL) || (istype(S) && S.taurized)) // Reasons to not mask: 1. If you're wearing a suit that hides the tail or if you're wearing a taurized suit. c_mask = null overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = uniform_sprite, default_layer = UNIFORM_LAYER, clip_mask = c_mask) - //VOREStation Edit end. apply_layer(UNIFORM_LAYER) /mob/living/carbon/human/update_inv_wear_id() @@ -736,7 +727,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!shoes || (wear_suit && wear_suit.flags_inv & HIDESHOES) || (w_uniform && w_uniform.flags_inv & HIDESHOES)) return //Either nothing to draw, or it'd be hidden. - //VOREStation Edit for(var/f in list(BP_L_FOOT, BP_R_FOOT)) var/obj/item/organ/external/foot/foot = get_organ(f) if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear. @@ -818,7 +808,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() update_inv_w_uniform() update_inv_shoes() update_tail_showing() - update_wing_showing() // VOREStation Edit + update_wing_showing() if(!wear_suit) return //No point, no suit. @@ -833,7 +823,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() else suit_sprite = "[INV_SUIT_DEF_ICON].dmi" - //VOREStation Edit start. var/icon/c_mask = null var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT]) var/valid_clip_mask = tail_style?.clip_mask @@ -842,8 +831,6 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() c_mask = valid_clip_mask overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = suit_sprite, default_layer = SUIT_LAYER, clip_mask = c_mask) - //VOREStation Edit end. - apply_layer(SUIT_LAYER) /mob/living/carbon/human/update_inv_pockets() @@ -955,24 +942,23 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return remove_layer(TAIL_LAYER) - remove_layer(TAIL_LAYER_ALT) // VOREStation Edit - START - Alt Tail Layer + remove_layer(TAIL_LAYER_ALT) // Alt Tail Layer var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER - var/image/vr_tail_image = get_tail_image() - if(vr_tail_image) - vr_tail_image.layer = BODY_LAYER+used_tail_layer - overlays_standing[used_tail_layer] = vr_tail_image + var/image/tail_image = get_tail_image() + if(tail_image) + tail_image.layer = BODY_LAYER+used_tail_layer + overlays_standing[used_tail_layer] = tail_image apply_layer(used_tail_layer) return - // VOREStation Edit - END var/species_tail = species.get_tail(src) // Species tail icon_state prefix. //This one is actually not that bad I guess. if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) var/icon/tail_s = get_tail_icon() - overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // VOREStation Edit - Alt Tail Layer + overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // Alt Tail Layer animate_tail_reset() //TODO: Is this the appropriate place for this, and not on species...? @@ -982,22 +968,22 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(!tail_icon) //generate a new one var/species_tail_anim = species.get_tail_animation(src) - if(!species_tail_anim && species.icobase_tail) species_tail_anim = species.icobase //VOREStation Code - Allow override of file for non-animated tails + if(!species_tail_anim && species.icobase_tail) species_tail_anim = species.icobase //Allow override of file for non-animated tails if(!species_tail_anim) species_tail_anim = 'icons/effects/species.dmi' tail_icon = new/icon(species_tail_anim) - tail_icon.Blend(rgb(r_skin, g_skin, b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) // VOREStation edit + tail_icon.Blend(rgb(r_skin, g_skin, b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) // The following will not work with animated tails. var/use_species_tail = species.get_tail_hair(src) if(use_species_tail) - var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]_s") //VOREStation edit -- Suffix icon state string with '_s' to compensate for diff in .dmi b/w us & Polaris. - hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //VOREStation edit -- Check for species color_mult + var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]") + hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //Check for species color_mult tail_icon.Blend(hair_icon, ICON_OVERLAY) tail_icon_cache[icon_key] = tail_icon return tail_icon /mob/living/carbon/human/proc/set_tail_state(var/t_state) - var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // VOREStation Edit - START - Alt Tail Layer + var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer var/image/tail_overlay = overlays_standing[used_tail_layer] remove_layer(TAIL_LAYER) @@ -1009,7 +995,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() tail_overlay.icon_state = t_state . = tail_overlay - apply_layer(used_tail_layer) // VOREStation Edit - END + apply_layer(used_tail_layer) //Not really once, since BYOND can't do that. //Update this if the ability to flick() images or make looping animation start at the first frame is ever added. @@ -1019,9 +1005,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() return var/t_state = "[species.get_tail(src)]_once" - var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // VOREStation Edit - Alt Tail Layer + var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer - var/image/tail_overlay = overlays_standing[used_tail_layer] // VOREStation Edit - Alt Tail Layer + var/image/tail_overlay = overlays_standing[used_tail_layer] // Alt Tail Layer if(tail_overlay && tail_overlay.icon_state == t_state) return //let the existing animation finish @@ -1029,7 +1015,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(tail_overlay) spawn(20) //check that the animation hasn't changed in the meantime - if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // VOREStation Edit - Alt Tail Layer + if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // Alt Tail Layer animate_tail_stop() /mob/living/carbon/human/proc/animate_tail_start() @@ -1052,7 +1038,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() set_tail_state("[species.get_tail(src)]_idle[rand(0,9)]") else set_tail_state("[species.get_tail(src)]_static") - toggle_tail_vr(FALSE) //VOREStation Add - So tails stop when someone dies. TODO - Fix this hack ~Leshana + toggle_tail(FALSE) //So tails stop when someone dies. TODO - Fix this hack ~Leshana /mob/living/carbon/human/proc/animate_tail_stop() if(QDESTROYING(src)) @@ -1060,20 +1046,18 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() set_tail_state("[species.get_tail(src)]_static") -// VOREStation Edit - Wings! See update_icons_vr.dm for more wing procs /mob/living/carbon/human/proc/update_wing_showing() if(QDESTROYING(src)) return remove_layer(WING_LAYER) - var/image/vr_wing_image = get_wing_image() - if(vr_wing_image) - vr_wing_image.layer = BODY_LAYER+WING_LAYER - overlays_standing[WING_LAYER] = vr_wing_image + var/image/wing_image = get_wing_image() + if(wing_image) + wing_image.layer = BODY_LAYER+WING_LAYER + overlays_standing[WING_LAYER] = wing_image apply_layer(WING_LAYER) -// VOREStation Edit end /mob/living/carbon/human/update_modifier_visuals() if(QDESTROYING(src)) @@ -1140,6 +1124,117 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() overlays_standing[SURGERY_LAYER] = total apply_layer(SURGERY_LAYER) +/mob/living/carbon/human/proc/get_wing_image() + if(QDESTROYING(src)) + return + + //If you are FBP with wing style and didn't set a custom one + if(synthetic && synthetic.includes_wing && !wing_style) + var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing? + wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) + return image(wing_s) + + //If you have custom wings selected + if(wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) + var/icon/wing_s = new/icon("icon" = wing_style.icon, "icon_state" = flapping && wing_style.ani_state ? wing_style.ani_state : wing_style.icon_state) + if(wing_style.do_colouration) + wing_s.Blend(rgb(src.r_wing, src.g_wing, src.b_wing), wing_style.color_blend_mode) + if(wing_style.extra_overlay) + var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay) + overlay.Blend(rgb(src.r_wing2, src.g_wing2, src.b_wing2), wing_style.color_blend_mode) + wing_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + if(wing_style.extra_overlay2) + var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2) + if(wing_style.ani_state) + overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2_w) + overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) + wing_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + else + overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) + wing_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + return image(wing_s) + +/mob/living/carbon/human/proc/get_ears_overlay() + if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) + var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state) + if(ear_style.do_colouration) + ears_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), ear_style.color_blend_mode) + if(ear_style.extra_overlay) + var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay) + overlay.Blend(rgb(src.r_ears2, src.g_ears2, src.b_ears2), ear_style.color_blend_mode) + ears_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + if(ear_style.extra_overlay2) //MORE COLOURS IS BETTERER + var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay2) + overlay.Blend(rgb(src.r_ears3, src.g_ears3, src.b_ears3), ear_style.color_blend_mode) + ears_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + return ears_s + return null + + +/mob/living/carbon/human/proc/get_tail_image() + //If you are FBP with tail style and didn't set a custom one + var/datum/robolimb/model = isSynthetic() + if(istype(model) && model.includes_tail && !tail_style) + var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail") + tail_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) + return image(tail_s) + + //If you have a custom tail selected + if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !isTaurTail(tail_style))) + var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state) + if(tail_style.do_colouration) + tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode) + if(tail_style.extra_overlay) + var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay) + if(wagging && tail_style.ani_state) + overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w) + overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + else + overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + + if(tail_style.extra_overlay2) + var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2) + if(wagging && tail_style.ani_state) + overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2_w) + overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + else + overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + + if(isTaurTail(tail_style)) + var/datum/sprite_accessory/tail/taur/taurtype = tail_style + if(taurtype.can_ride && !riding_datum) + riding_datum = new /datum/riding/taur(src) + verbs |= /mob/living/carbon/human/proc/taur_mount + verbs |= /mob/living/proc/toggle_rider_reins + return image(tail_s, "pixel_x" = -16) + else + return image(tail_s) + return null + +// TODO - Move this to where it should go ~Leshana +/mob/living/proc/stop_flying() + if(QDESTROYING(src)) + return + flying = FALSE + return 1 + +/mob/living/carbon/human/stop_flying() + if((. = ..())) + update_wing_showing() + //Human Overlays Indexes///////// #undef MUTATIONS_LAYER #undef SKIN_LAYER diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index af5c5eedae..5ee09212f4 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -632,6 +632,12 @@ process_resist() /mob/living/proc/process_resist() + + if(istype(src.loc, /mob/living/silicon/robot/platform)) + var/mob/living/silicon/robot/platform/R = src.loc + R.drop_stored_atom(src, src) + return TRUE + //unbuckling yourself if(buckled) resist_buckle() diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 4238a56080..36e4a0b092 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -73,5 +73,10 @@ var/image/selected_image = null // Used for buildmode AI control stuff. + var/allow_self_surgery = FALSE // Used to determine if the mob can perform surgery on itself. + + + var/tail_alt = 0 + var/flying = 0 // Allows flight var/inventory_panel_type = /datum/inventory_panel var/datum/inventory_panel/inventory_panel diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm index 3103ae4928..ab5607d22b 100644 --- a/code/modules/mob/living/living_vr.dm +++ b/code/modules/mob/living/living_vr.dm @@ -1,3 +1,8 @@ +/mob/living/Check_Shoegrip() + if(flying) + return 1 + ..() + /mob/living/verb/customsay() set category = "IC" set name = "Customize Speech Verbs" @@ -24,23 +29,6 @@ else return -/mob/living/proc/toggle_rider_reins() - set name = "Give Reins" - set category = "Abilities" - set desc = "Let people riding on you control your movement." - - if(riding_datum) - if(istype(riding_datum,/datum/riding)) - if(riding_datum.keytype) - riding_datum.keytype = null - to_chat(src, "Rider control enabled.") - return - else - riding_datum.keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop - to_chat(src, "Rider control restricted.") - return - return - /mob/living/verb/set_metainfo() set name = "Set OOC Metainfo" set desc = "Sets OOC notes about yourself or your RP preferences or status." diff --git a/code/modules/mob/living/riding.dm b/code/modules/mob/living/riding.dm new file mode 100644 index 0000000000..3a614a4b6d --- /dev/null +++ b/code/modules/mob/living/riding.dm @@ -0,0 +1,16 @@ +/mob/living/proc/toggle_rider_reins() + set name = "Give Reins" + set category = "Abilities" + set desc = "Let people riding on you control your movement." + + if(riding_datum) + if(istype(riding_datum,/datum/riding)) + if(riding_datum.keytype) + riding_datum.keytype = null + to_chat(src, "Rider control enabled.") + return + else + riding_datum.keytype = /obj/item/weapon/material/twohanded/riding_crop + to_chat(src, "Rider control restricted.") + return + return diff --git a/code/modules/mob/living/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 7dc40872d5..2b626b1ce7 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -247,6 +247,12 @@ icon_state = "armor" icon_state_broken = "armor_broken" +/obj/item/robot_parts/robot_component/armour_platform + name = "platform armour plating" + icon_state = "armor" + icon_state_broken = "armor_broken" + color = COLOR_GRAY80 + /obj/item/robot_parts/robot_component/camera name = "camera" icon_state = "camera" diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 6db31e60da..a34d2f65e7 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -158,7 +158,6 @@ if(A?.no_spoilers) disable_spoiler_vision() - if (src.stat == DEAD || (XRAY in mutations) || (src.sight_mode & BORGXRAY)) src.sight |= SEE_TURFS src.sight |= SEE_MOBS @@ -201,8 +200,10 @@ src.see_invisible = SEE_INVISIBLE_LIVING // This is normal vision (25), setting it lower for normal vision means you don't "see" things like darkness since darkness // has a "invisible" value of 15 - plane_holder.set_vis(VIS_FULLBRIGHT,fullbright) - plane_holder.set_vis(VIS_MESONS,seemeson) + if(plane_holder) + plane_holder.set_vis(VIS_FULLBRIGHT,fullbright) + plane_holder.set_vis(VIS_MESONS,seemeson) + ..() if (src.healths) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 876bcf746e..1376c15072 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -98,7 +98,7 @@ /mob/living/silicon/robot/proc/robot_checklaws ) -/mob/living/silicon/robot/New(loc,var/unfinished = 0) +/mob/living/silicon/robot/New(loc, var/unfinished = 0) spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, src) spark_system.attach(src) @@ -114,7 +114,7 @@ ident = rand(1, 999) module_sprites["Basic"] = "robot" icontype = "Basic" - updatename("Default") + updatename(modtype) updateicon() radio = new /obj/item/device/radio/borg(src) @@ -142,6 +142,8 @@ cell = new /obj/item/weapon/cell(src) cell.maxcharge = 7500 cell.charge = 7500 + else if(ispath(cell)) + cell = new cell(src) ..() @@ -287,10 +289,7 @@ updatename() notify_ai(ROBOT_NOTIFICATION_NEW_MODULE, module.name) -/mob/living/silicon/robot/proc/updatename(var/prefix as text) - if(prefix) - modtype = prefix - +/mob/living/silicon/robot/proc/update_braintype() if(istype(mmi, /obj/item/device/mmi/digital/posibrain)) braintype = BORG_BRAINTYPE_POSI else if(istype(mmi, /obj/item/device/mmi/digital/robot)) @@ -300,6 +299,11 @@ else braintype = BORG_BRAINTYPE_CYBORG +/mob/living/silicon/robot/proc/updatename(var/prefix as text) + if(prefix) + modtype = prefix + + update_braintype() var/changed_name = "" if(custom_name) @@ -907,18 +911,21 @@ if(!module_state_1) module_state_1 = O O.hud_layerise() + O.equipped_robot() contents += O if(istype(module_state_1,/obj/item/borg/sight)) sight_mode |= module_state_1:sight_mode else if(!module_state_2) module_state_2 = O O.hud_layerise() + O.equipped_robot() contents += O if(istype(module_state_2,/obj/item/borg/sight)) sight_mode |= module_state_2:sight_mode else if(!module_state_3) module_state_3 = O O.hud_layerise() + O.equipped_robot() contents += O if(istype(module_state_3,/obj/item/borg/sight)) sight_mode |= module_state_3:sight_mode @@ -1212,3 +1219,6 @@ if(current_selection_index) // Select what the player had before if possible. select_module(current_selection_index) + +/mob/living/silicon/robot/get_cell() + return cell diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event.dm b/code/modules/mob/living/silicon/robot/robot_modules/event.dm index 3d3eb355df..107c9cff0a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/event.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/event.dm @@ -3,7 +3,7 @@ // The module that borgs on the surface have. Generally has a lot of useful tools in exchange for questionable loyalty to the crew. /obj/item/weapon/robot_module/robot/lost name = "lost robot module" - hide_on_manifest = 1 + hide_on_manifest = TRUE sprites = list( "Drone" = "drone-lost" ) @@ -41,7 +41,7 @@ /obj/item/weapon/robot_module/robot/gravekeeper name = "gravekeeper robot module" - hide_on_manifest = 1 + hide_on_manifest = TRUE sprites = list( "Drone" = "drone-gravekeeper", "Sleek" = "sleek-gravekeeper" diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index dfea127f01..66a2702ddf 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -18,7 +18,7 @@ var/global/list/robot_modules = list( icon_state = "std_module" w_class = ITEMSIZE_NO_CONTAINER item_state = "std_mod" - var/hide_on_manifest = 0 + var/hide_on_manifest = FALSE var/channels = list() var/networks = list() var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_AKHANI = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0, LANGUAGE_SIGN = 0, LANGUAGE_TERMINUS = 1, LANGUAGE_ZADDAT = 0) @@ -37,6 +37,9 @@ var/global/list/robot_modules = list( var/list/original_languages = list() var/list/added_networks = list() +/obj/item/weapon/robot_module/proc/hide_on_manifest() + . = hide_on_manifest + /obj/item/weapon/robot_module/New(var/mob/living/silicon/robot/R) ..() R.module = src @@ -805,7 +808,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/security/combat name = "combat robot module" - hide_on_manifest = 1 + hide_on_manifest = TRUE sprites = list( "Haruka" = "marinaCB", "Combat Android" = "droid-combat", @@ -828,7 +831,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/drone name = "drone module" - hide_on_manifest = 1 + hide_on_manifest = TRUE no_slip = 1 networks = list(NETWORK_ENGINEERING) @@ -912,7 +915,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/drone/construction name = "construction drone module" - hide_on_manifest = 1 + hide_on_manifest = TRUE channels = list("Engineering" = 1) languages = list() 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 fe39040432..d8f7aa8a3a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm @@ -2,7 +2,7 @@ /obj/item/weapon/robot_module/robot/syndicate name = "illegal robot module" - hide_on_manifest = 1 + hide_on_manifest = TRUE languages = list( LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index 570d9cec99..976e0a09e5 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -145,9 +145,10 @@ if(custom_sprite == TRUE) return if(wideborg == TRUE) - if(icontype== "Drake") // Why, Why can't we have normal nice things - + if(icontype == "Drake") // Why, Why can't we have normal nice things icon = 'icons/mob/drakeborg/drakeborg_vr.dmi' + else if(icontype == "SecVale" || icontype == "vale2") //CH edit + icon = 'icons/mob/widerobot_vr.dmi' else icon = wideborg_dept return @@ -176,7 +177,7 @@ //RIDING /datum/riding/dogborg - keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! + keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack! nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. diff --git a/code/modules/mob/living/silicon/robot/subtypes/boozeborg_ch.dm b/code/modules/mob/living/silicon/robot/subtypes/boozeborg_ch.dm index 87db066c81..32b7fec8d1 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/boozeborg_ch.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/boozeborg_ch.dm @@ -100,6 +100,7 @@ What Borgs are available is sadly handled in the above file in the proc R.can_buckle = 1 R.icon = 'icons/mob/widerobot_colors_ch.dmi' + R.wideborg_dept = 'icons/mob/widerobot_colors_ch.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm new file mode 100644 index 0000000000..3a9882ff08 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_icon.dm @@ -0,0 +1,109 @@ +/mob/living/silicon/robot/platform/update_icon() + updateicon() + +/mob/living/silicon/robot/platform/updateicon() + + cut_overlays() + underlays.Cut() + var/obj/item/weapon/robot_module/robot/platform/tank_module = module + if(!istype(tank_module)) + icon = initial(icon) + icon_state = initial(icon_state) + color = initial(color) + return + + // This is necessary due to Polaris' liberal use of KEEP_TOGETHER and propensity for scaling transforms. + // If we just apply state/colour to the base icon, RESET_COLOR on the additional overlays is ignored. + icon = tank_module.user_icon + icon_state = "blank" + color = null + var/image/I = image(tank_module.user_icon, tank_module.user_icon_state) + I.color = tank_module.base_color + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + underlays += I + + if(tank_module.armor_color) + I = image(icon, "[tank_module.user_icon_state]_armour") + I.color = tank_module.armor_color + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + add_overlay(I) + + for(var/decal in tank_module.decals) + I = image(icon, "[tank_module.user_icon_state]_[decal]") + I.color = tank_module.decals[decal] + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + add_overlay(I) + + if(tank_module.eye_color) + I = image(icon, "[tank_module.user_icon_state]_eyes") + I.color = tank_module.eye_color + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + add_overlay(I) + + if(client && key && stat == CONSCIOUS && tank_module.pupil_color) + I = image(icon, "[tank_module.user_icon_state]_pupils") + I.color = tank_module.pupil_color + I.plane = PLANE_LIGHTING_ABOVE + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + add_overlay(I) + + if(opened) + add_overlay("[tank_module.user_icon_state]-open") + if(wiresexposed) + I = image(icon, "[tank_module.user_icon_state]-wires") + else if(cell) + I = image(icon, "[tank_module.user_icon_state]-cell") + else + I = image(icon, "[tank_module.user_icon_state]-nowires") + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) + add_overlay(I) + +/mob/living/silicon/robot/platform/proc/try_paint(var/obj/item/device/floor_painter/painting, var/mob/user) + + var/obj/item/weapon/robot_module/robot/platform/tank_module = module + if(!istype(tank_module)) + to_chat(user, SPAN_WARNING("\The [src] is not paintable.")) + return FALSE + + var/list/options = list("Eyes", "Armour", "Body", "Clear Colors") + if(length(tank_module.available_decals)) + options += "Decal" + if(length(tank_module.decals)) + options += "Clear Decals" + for(var/option in options) + LAZYSET(options, option, new /image('icons/effects/thinktank_labels.dmi', option)) + + var/choice = show_radial_menu(user, painting, options, radius = 42, require_near = TRUE) + if(!choice || QDELETED(src) || QDELETED(painting) || QDELETED(user) || user.incapacitated() || tank_module.loc != src) + return FALSE + + if(choice == "Decal") + choice = null + options = list() + for(var/decal_name in tank_module.available_decals) + LAZYSET(options, decal_name, new /image('icons/effects/thinktank_labels.dmi', decal_name)) + choice = show_radial_menu(user, painting, options, radius = 42, require_near = TRUE) + if(!choice || QDELETED(src) || QDELETED(painting) || QDELETED(user) || user.incapacitated() || tank_module.loc != src) + return FALSE + + . = TRUE + switch(choice) + if("Eyes") + tank_module.eye_color = painting.paint_colour + if("Armour") + tank_module.armor_color = painting.paint_colour + if("Body") + tank_module.base_color = painting.paint_colour + if("Clear Colors") + tank_module.eye_color = initial(tank_module.eye_color) + tank_module.armor_color = initial(tank_module.armor_color) + tank_module.base_color = initial(tank_module.base_color) + if("Clear Decals") + tank_module.decals = null + else + if(choice in tank_module.available_decals) + LAZYSET(tank_module.decals, tank_module.available_decals[choice], painting.paint_colour) + else + . = FALSE + if(.) + updateicon() diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_subtypes.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_subtypes.dm new file mode 100644 index 0000000000..b3e48aabb4 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_subtypes.dm @@ -0,0 +1,32 @@ +/mob/living/silicon/robot/platform/explorer + name = "recon platform" + desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence. This one is lightly armoured and fitted with all-terrain wheels." + modtype = "Recon" + module = /obj/item/weapon/robot_module/robot/platform/explorer + +/mob/living/silicon/robot/platform/explorer/Initialize() + . = ..() + laws = new /datum/ai_laws/explorer + +/mob/living/silicon/robot/platform/explorer/welcome_client() + ..() + if(client) // ganbatte tachikoma-san + to_chat(src, SPAN_NOTICE("You are tasked with supporting the Exploration and Science staff as they unearth the secrets of the planet. Do your best!")) + +/obj/effect/landmark/robot_platform/explorer + platform_type = /mob/living/silicon/robot/platform/explorer + +/mob/living/silicon/robot/platform/cargo + name = "logistics platform" + desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence. This one has an expanded storage compartment." + modtype = "Logistics" + module = /obj/item/weapon/robot_module/robot/platform/cargo + max_stored_atoms = 3 + +/mob/living/silicon/robot/platform/cargo/welcome_client() + ..() + if(client) + to_chat(src, SPAN_NOTICE("You are tasked with supporting the Cargo and Supply staff as they handle operational logistics. Do your best!")) + +/obj/effect/landmark/robot_platform/cargo + platform_type = /mob/living/silicon/robot/platform/cargo diff --git a/code/modules/mob/living/simple_animal/aliens/synx.dm b/code/modules/mob/living/simple_animal/aliens/synx.dm index 946be31068..abf8effeef 100644 --- a/code/modules/mob/living/simple_animal/aliens/synx.dm +++ b/code/modules/mob/living/simple_animal/aliens/synx.dm @@ -108,7 +108,9 @@ /mob/living/simple_mob/animal/synx/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected //B.human_prey_swallow_time = 6 SECONDS //doesnt work //B.nonhuman_prey_swallow_time = 3 SECONDS //doesnt work @@ -137,7 +139,9 @@ B.mode_flags = DM_FLAG_NUMBING //Prey are more docile when it doesn't hurt. /mob/living/simple_mob/animal/synx/ai/pet/asteri/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.desc = "The synx eagerly swallows you, taking you from its gullet into its long, serpentine stomach. The internals around you greedily press into your from all sides, keeping you coated in a slick coat of numbing fluids..." B.digest_burn = 2 @@ -551,14 +555,18 @@ player_msg = "You aren't supposed to be in this. Wrong mob." /mob/living/simple_mob/animal/synx/ai/pet/init_vore() - ..() - var/obj/belly/B = vore_selected - B.vore_verb = "swallow" - B.digest_burn = 1 - B.digest_brute = 0 + if(!voremob_loaded) + return + .=..() + var/obj/belly/B = vore_selected + B.vore_verb = "swallow" + B.digest_burn = 1 + B.digest_brute = 0 /mob/living/simple_mob/animal/synx/ai/pet/holo/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.vore_verb = "swallow" B.digest_burn = 5 @@ -828,8 +836,8 @@ This includes the sprites of the below Mob which are based upon SCP 939. name = "Unknown" desc = "It's a red canine looking creature." tt_desc = "Unknown Alien Lifeform" - - poison_chance = 0 //no poison, + + poison_chance = 0 //no poison, ai_holder_type = /datum/ai_holder/simple_mob/scp say_list_type = /datum/say_list/malf_drone diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index f843df402d..f14a8cedfd 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -50,6 +50,8 @@ var/obj/item/device/radio/headset/mob_headset/mob_radio //Adminbus headset for simplemob shenanigans. does_spin = FALSE + var/voremob_loaded = FALSE //CHOMPedit: On-demand belly loading. + // Release belly contents before being gc'd! /mob/living/simple_mob/Destroy() release_vore_contents() @@ -86,8 +88,6 @@ icon_state = "[icon_rest]-[vore_fullness]" /mob/living/simple_mob/proc/will_eat(var/mob/living/M) - M.init_vore() - init_vore() if(client) //You do this yourself, dick! //ai_log("vr/wont eat [M] because we're player-controlled", 3) //VORESTATION AI TEMPORARY REMOVAL return 0 @@ -193,7 +193,7 @@ // Make sure you don't call ..() on this one, otherwise you duplicate work. /mob/living/simple_mob/init_vore() - if(!vore_active || no_vore) + if(!vore_active || no_vore || !voremob_loaded) //CHOMPedit: On-demand belly loading. return if(LAZYLEN(vore_organs)) @@ -277,7 +277,7 @@ // Riding /datum/riding/simple_mob - keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! + keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack! nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 22e57ca683..8fe1799d12 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -7,6 +7,7 @@ item_state = "mouse_gray" icon_living = "mouse_gray" icon_dead = "mouse_gray_dead" + kitchen_tag = "rodent" maxHealth = 5 health = 5 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm new file mode 100644 index 0000000000..80ccfff874 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm @@ -0,0 +1,200 @@ +// Possum catalog entry. +/datum/category_item/catalogue/fauna/opossum + name = "Opossums" + desc = "The opossum is a small, scavenging marsupial of the order Didelphimorphia, previously \ + endemic to the Americas of Earth, but now inexplicably found across settled space. Nobody is \ + entirely sure how they travel to such disparate locations, with the leading theories including \ + smuggling, cargo stowaways, fungal spore reproduction, teleportation, or unknown quantum effects." + value = CATALOGUER_REWARD_TRIVIAL + unlocked_by_any = list(/datum/category_item/catalogue/fauna/opossum) + +// Possum spawner, WAS GOING TO BE used for loot piles BUT CERB IS A DORK. +/obj/item/animal_spawner + var/critter_type = /mob/living/simple_mob/animal/passive/mouse + +/obj/item/animal_spawner/Initialize() + ..() + + var/mob/living/simple_mob/critter = critter_type + if(!ispath(critter, /mob/living/simple_mob)) + return INITIALIZE_HINT_QDEL + + var/obj/item/weapon/holder/critter_holder = initial(critter.holder_type) + if(!ispath(critter_holder, /obj/item/weapon/holder)) + return INITIALIZE_HINT_QDEL + + var/mob/M = loc + var/was_in_hands = istype(M) && (src == M.get_active_hand() || src == M.get_inactive_hand()) + + critter_holder = new(loc) + critter = new critter(critter_holder) + critter_holder.held_mob = critter + critter_holder.sync(critter) + + if(istype(M)) + M.drop_from_inventory(src) + if(was_in_hands) + M.put_in_hands(critter_holder) + + return INITIALIZE_HINT_QDEL + +/obj/item/animal_spawner/possum + name = "possum" + desc = "The abstract concept of possum, embodied in physical form. If you witness the majesty of abstract possum, please make a bug report on the tracker." + icon = 'icons/mob/animal.dmi' + icon_state = "possum" + critter_type = /mob/living/simple_mob/animal/passive/opossum + +// Possum AI holder, mostly just handles playing dead. +/datum/ai_holder/simple_mob/passive/possum + var/is_angry = FALSE + var/play_dead_until = 0 + var/be_angery_until = 0 + +/datum/ai_holder/simple_mob/passive/possum/handle_special_strategical() + . = ..() + if(holder?.stat != DEAD && !holder.ckey && isturf(holder.loc)) + if(holder.resting && world.time < play_dead_until) + return + + var/last_resting = holder.resting + var/last_angery = is_angry + holder.resting = (holder.stat == UNCONSCIOUS) + if(!holder.resting) + wander = initial(wander) + speak_chance = initial(speak_chance) + holder.set_stat(CONSCIOUS) + is_angry = (world.time < be_angery_until) || prob(1) + else + wander = FALSE + speak_chance = 0 + holder.set_stat(UNCONSCIOUS) + is_angry = FALSE + + if(last_resting != holder.resting || last_angery != is_angry) + holder.update_icon() + +/datum/ai_holder/simple_mob/passive/possum/poppy + var/static/list/aaa_words = list( + "delaminat", + "meteor", + "fire", + "breach", + "loose", + "level 7", + "level seven", + "biohazard", + "blob", + "vine" + ) + +/datum/ai_holder/simple_mob/passive/possum/poppy/on_hear_say(mob/living/speaker, message) + . = ..() + addtimer(CALLBACK(src, .proc/check_keywords, message), rand(1 SECOND, 3 SECONDS)) + +/datum/ai_holder/simple_mob/passive/possum/poppy/proc/check_keywords(var/message) + var/mob/living/simple_mob/animal/passive/opossum/poss = holder + if(!istype(poss) || holder.client || holder.stat != CONSCIOUS) + return + message = lowertext(message) + for(var/aaa in aaa_words) + if(findtext(message, aaa)) + poss.respond_to_damage() + return + +/datum/say_list/possum + speak = list("Hiss!","Aaa!","Aaa?") + emote_hear = list("hisses") + emote_see = list("forages for trash", "lounges") + +// The poss itself. +/mob/living/simple_mob/animal/passive/opossum + name = "opossum" + real_name = "opossum" + tt_desc = "Didelphis astrum" + desc = "It's an opossum, a small scavenging marsupial." + icon_state = "possum" + item_state = "possum" + icon_living = "possum" + icon_dead = "possum_dead" + icon_rest = "possum_dead" + speak_emote = list("hisses") + pass_flags = PASSTABLE + ai_holder_type = /datum/ai_holder/simple_mob/passive/possum + see_in_dark = 6 + maxHealth = 50 + health = 50 + response_help = "pets" + response_disarm = "gently pushes aside" + response_harm = "stamps on" + density = 0 + minbodytemp = 223 + maxbodytemp = 323 + universal_speak = FALSE + universal_understand = TRUE + holder_type = /obj/item/weapon/holder/possum + mob_size = MOB_SMALL + can_pull_size = 2 + can_pull_mobs = MOB_PULL_SMALLER + say_list_type = /datum/say_list/possum + catalogue_data = list(/datum/category_item/catalogue/fauna/opossum) + +/mob/living/simple_mob/animal/passive/opossum/adjustBruteLoss(damage) + . = ..() + if(damage >= 3) + respond_to_damage() + +/mob/living/simple_mob/animal/passive/opossum/adjustFireLoss(damage) + . = ..() + if(damage >= 3) + respond_to_damage() + +/mob/living/simple_mob/animal/passive/opossum/lay_down() + . = ..() + update_icon() + +/mob/living/simple_mob/animal/passive/opossum/proc/respond_to_damage() + if(!resting && stat == CONSCIOUS) + var/datum/ai_holder/simple_mob/passive/possum/poss_ai = ai_holder + if(!client && istype(poss_ai)) + if(!poss_ai.is_angry) + visible_message("\The [src] hisses!") + poss_ai.is_angry = TRUE + poss_ai.be_angery_until = world.time + rand(30 SECONDS, 1 MINUTE) + else + visible_message("\The [src] dies!") + resting = TRUE + poss_ai.play_dead_until = world.time + rand(1 MINUTE, 2 MINUTES) + update_icon() + +/mob/living/simple_mob/animal/passive/opossum/updateicon() + update_icon() + +/mob/living/simple_mob/animal/passive/opossum/update_icon() + var/datum/ai_holder/simple_mob/passive/possum/poss_ai = ai_holder + var/is_angry = (!client && istype(poss_ai) && poss_ai.is_angry) + if(stat == DEAD || (resting && is_angry)) + icon_state = icon_dead + else if(resting || stat == UNCONSCIOUS) + icon_state = "[icon_living]_sleep" + else if(is_angry) + icon_state = "[icon_living]_aaa" + else + icon_state = icon_living + +/mob/living/simple_mob/animal/passive/opossum/Initialize() + . = ..() + verbs += /mob/living/proc/ventcrawl + verbs += /mob/living/proc/hide + +/mob/living/simple_mob/animal/passive/opossum/poppy + name = "Poppy the Safety Possum" + desc = "It's an opossum, a small scavenging marsupial. It's wearing appropriate personal protective equipment, though." + icon_state = "poppy" + item_state = "poppy" + icon_living = "poppy" + icon_dead = "poppy_dead" + icon_rest = "poppy_dead" + tt_desc = "Didelphis astrum salutem" + holder_type = /obj/item/weapon/holder/possum/poppy + ai_holder_type = /datum/ai_holder/simple_mob/passive/possum/poppy diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index 0a4f254bbd..9db6a6bffa 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -102,6 +102,7 @@ icon_state = "cat" item_state = "cat" named = TRUE + holder_type = /obj/item/weapon/holder/cat/runtime makes_dirt = 0 //Vorestation Edit /mob/living/simple_mob/animal/passive/cat/kitten diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm index a63140ac8a..652eba8161 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat_vr.dm @@ -1,5 +1,7 @@ /mob/living/simple_mob/animal/passive/cat/runtime/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside." diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm index 63e7f3fbab..0ff5beef37 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm @@ -50,7 +50,9 @@ base_wander_delay = 4 /mob/living/simple_mob/animal/passive/fox/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "Slick foxguts. Cute on the outside, slimy on the inside!" @@ -199,7 +201,9 @@ makes_dirt = FALSE // No more dirt /mob/living/simple_mob/animal/passive/fox/renault/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "Slick foxguts. They seem somehow more regal than perhaps other foxes!" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm index c84f9aeabc..b3651a63de 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/gaslamp_vr.dm @@ -88,7 +88,9 @@ TODO: Make them light up and heat the air when exposed to oxygen. vore_icons = SA_ICON_LIVING /mob/living/simple_mob/animal/passive/gaslamp/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "internal chamber" B.desc = "Having been too slow to disentangle yourself from the gaslamp's tentacles, the alien creature eventually winds enough of them around your body to lift you up off of the ground. Struggle as you might now, it is too late to deny the jellyfish-esque scavenger its lucky catch; inch by inch, the gaslamp tugs you upwards into its equivalent of a stomach, the transition between the cool-to-frigid atmosphere on the outside to its surprising internal heat something you can feel through any outer wear you possess. Minutes pass, soon resulting in the gentle creature's body sporting a rounded, bulging swell, an indistinct shadow shifting and twitching inside it as you squirm about. Be it to escape or simply to get settled, you might want to take care, however. The gaslamp's internal chamber is slick and squishy instead of overly oppressive, yet, each wave of warmth that pulses over you leaves you feeling weaker than the last..." diff --git a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm index 69486a061d..b20bdbb4cd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm +++ b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm @@ -33,7 +33,7 @@ appearance = thing_to_copy.appearance copying = thing_to_copy density = thing_to_copy.density // So you can't bump into objects that aren't supposed to be dense. - catalogue_data = thing_to_copy.catalogue_data.Copy() + catalogue_data = thing_to_copy.get_catalogue_data() catalogue_delay = thing_to_copy.catalogue_delay return TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm b/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm index 8fae2e2545..8196ce60f8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm +++ b/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm @@ -52,20 +52,20 @@ vore_active = 1 vore_pounce_chance = 25 vore_icons = SA_ICON_LIVING - + nutrition = 1000 //This actually gets overridden further down on initialize. max_nutrition = 2200 var/evo_point = 0 var/evo_limit = 0 var/next meat_type = /obj/item/toy/figure/bounty_hunter - + /mob/living/simple_mob/metroid/Initialize() nutrition = 100 //Have them start off pretty hungry still. existing_metroids += src //Keep track of how many for the event. verbs += /mob/living/proc/ventcrawl //May not do anything at the moment. return ..() - + /datum/say_list/metroid speak = list("Skree.", "Eree.", "Errer?") emote_see = list("floats about","looks around", "rubs its talons") @@ -82,7 +82,9 @@ /mob/living/simple_mob/metroid/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.digest_brute = 1 B.digest_burn = 1 diff --git a/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm b/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm index 1da1a6ffef..c2373b9784 100644 --- a/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm @@ -35,7 +35,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. vore_digest_chance = 1 //Chance to switch to digest mode if resisted vore_absorb_chance = 0 vore_escape_chance = 2 //Chance to escape if resisted. - + /datum/ai_holder/simple_mob/jellybrig hostile = FALSE // The majority of simplemobs are hostile, jellybrig is nice. cooperative = FALSE @@ -60,9 +60,11 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. vore_active = 1 vore_pounce_chance = 25 vore_icons = SA_ICON_LIVING - + /mob/living/simple_mob/metroid/mine/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.digest_burn = 0.5 B.digest_brute = 0 @@ -121,7 +123,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. max_co2 = 0 min_n2 = 0 max_n2 = 0 - + response_help = "pets" @@ -407,7 +409,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. faction = "metroids" max_nutrition = 2200 nutrition = 0 - + makes_dirt = TRUE projectiletype = /obj/item/projectile/energy/metroidacid //The projectiles I shoot diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm index 6a52dd69b4..5238b38c52 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm @@ -122,7 +122,9 @@ return TRUE /mob/living/simple_mob/vore/aggressive/corrupthound/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "fuel processor" B.desc = "Uttering distorted growls and fragmented voice clips all the while, the corrupted hound gulps the rest of your squirming figure past its jaws... which snap shut with an audible click of metal on metal. Your trip down its slickly lubricated, rubbery gullet is a tight and efficient one... and once you spill out into the machine's fuel processor, your weight making it sag slightly, hot-and-thick slime begins oozing all over your form. Only time will tell if you're destined to become fuel for its next bout of rampaging... be it days, hours, or just mere minutes..." @@ -144,6 +146,8 @@ "'FU3L mE A1RE@Dy, S0 sO SORrY!?', your corrupted captor growls as its synthetic innards begin oozing more potent juices, grinding down into your body with increasing fervor!") /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi/init_vore() + if(!voremob_loaded) + return ..() var/obj/belly/B = vore_selected B.name = "fuel processor" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm index 505cf02c47..d419bdd2bd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/deathclaw.dm @@ -62,7 +62,9 @@ return /mob/living/simple_mob/vore/aggressive/deathclaw/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "The giant mutant of a lizard finishes stuffing you into its jaws and down its ravenously clenching gullet with a worrying ease and efficiency. An assortment of slick, slimy noises assault your senses for a few gulp-filled moments... before you spill out into the apex predator's swelteringly hot stomach, its walls already possessively grinding into your body." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm index f55eab9fcd..a4179e5fbc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm @@ -48,7 +48,9 @@ var/is_shifting = FALSE /mob/living/simple_mob/vore/demon/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm index 4fa7da9947..d90f8a2bfb 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm @@ -63,7 +63,9 @@ var/is_shifting = FALSE /mob/living/simple_mob/vore/demonAI/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm index 4bf050dea5..9b5d9b56d5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_ch.dm @@ -60,7 +60,9 @@ var/laugh = 'sound/misc/demonlaugh.ogg' //Yknow maybe someone wants a custom laugh, you never know. /mob/living/simple_mob/vore/demon/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "Stomach" B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm b/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm index 1245278421..047f83e024 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/horse.dm @@ -78,7 +78,9 @@ return /mob/living/simple_mob/vore/horse/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "With a final few gulps, the horse finishes swallowing you down into its hot, dark gut... and with a slosh, your weight makes the equine's belly hang down slightly like some sort of organic hammock. The thick, humid air is tinged with the smell of half-digested grass, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm b/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm index c2e984864c..880008dff9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/lamia.dm @@ -101,6 +101,8 @@ icon_state = "[icon_rest]_vore_[upper_shows]_[tail_shows]" /mob/living/simple_mob/vore/lamia/init_vore() + if(!voremob_loaded) + return . = ..() var/obj/belly/B = vore_selected @@ -152,7 +154,7 @@ icon_living = "albino_bra" icon_rest = "albino_bra_rest" icon_dead = "albino_bra_dead" - + /mob/living/simple_mob/vore/lamia/albino/shirt desc = "Combination snake-human. This one is albino. They're wearing a shirt." icon_state = "albino_shirt" @@ -175,7 +177,7 @@ icon_living = "cobra_bra" icon_rest = "cobra_bra_rest" icon_dead = "cobra_bra_dead" - + /mob/living/simple_mob/vore/lamia/cobra/shirt desc = "Combination snake-human. This one looks like a cobra. They're wearing a shirt." icon_state = "cobra_shirt" @@ -198,7 +200,7 @@ icon_living = "copper_bra" icon_rest = "copper_bra_rest" icon_dead = "copper_bra_dead" - + /mob/living/simple_mob/vore/lamia/copper/shirt desc = "Combination snake-human. This one is copper. They're wearing a shirt." icon_state = "copper_shirt" @@ -221,7 +223,7 @@ icon_living = "green_bra" icon_rest = "green_bra_rest" icon_dead = "green_bra_dead" - + /mob/living/simple_mob/vore/lamia/green/shirt desc = "Combination snake-human. This one is green. They're wearing a shirt." icon_state = "green_shirt" @@ -244,7 +246,7 @@ icon_living = "zebra_bra" icon_rest = "zebra_bra_rest" icon_dead = "zebra_bra_dead" - + /mob/living/simple_mob/vore/lamia/zebra/shirt desc = "Combination snake-human. This one has a zebra pattern. They're wearing a shirt." icon_state = "zebra_shirt" @@ -283,7 +285,7 @@ GLOBAL_LIST_INIT(valid_random_lamias, list( icon_living = initial(new_attrs.icon_living) icon_rest = initial(new_attrs.icon_rest) icon_dead = initial(new_attrs.icon_dead) - + vore_default_mode = initial(new_attrs.vore_default_mode) vore_digest_chance = initial(new_attrs.vore_digest_chance) vore_pounce_chance = initial(new_attrs.vore_pounce_chance) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm index 2add7ca9e2..67aac85cd3 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm @@ -78,7 +78,6 @@ var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD) if(L.can_inject(src, null, target_zone)) last_inject = world.time - L.init_vore() if(!L.allowmobvore) //If we can't eat them, stop mauling them. ai_holder.lose_target() //Call this first so the attacks stop if the reagent proc runtimes. L.reagents.add_reagent("bicaridine", venom_dose) //If we can't eat them, give them some bicar to compensate for no heal belly. @@ -105,7 +104,9 @@ vore_bump_emote = "tries to snap up" /mob/living/simple_mob/vore/leopardmander/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "The leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, dark gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you with unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~" @@ -176,7 +177,9 @@ verbs |= /mob/living/simple_mob/vore/leopardmander/exotic/proc/toggle_glow /mob/living/simple_mob/vore/leopardmander/exotic/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "The exotic leopardmander tosses its head back with you firmly clasped in its jaws, and in a few swift moments it finishes swallowing you down into its hot, brightly glowing gut. Your weight makes absolutely no impact on its form, the doughy walls giving way beneath you, with their unnatural softness. The thick, humid air is tinged with an oddly pleasant smell, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder, smothering you in thick hot gutflesh~ You can only really sort of see outside that thick-walled gut." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm index c4163733bd..083048d561 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm @@ -64,7 +64,7 @@ vore_capacity = 1 vore_pounce_chance = 0 //grubs only eat incapacitated targets vore_default_mode = DM_DIGEST - + min_oxy = 0 max_oxy = 0 min_tox = 0 @@ -110,10 +110,10 @@ "bio" = 100, "rad" = 100 ) - + var/lava_min_ore = 6 var/lava_max_ore = 10 - + poison_per_bite = 5 poison_chance = 66 @@ -160,7 +160,9 @@ //I'm no good at writing this stuff, so I've just left it as placeholders and disabled the chances of them eating you. /* /mob/living/simple_mob/vore/oregrub/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "PLACEHOLDER!" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm b/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm index 16fa33596a..2b5103a128 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm @@ -58,7 +58,9 @@ return /mob/living/simple_mob/vore/aggressive/panther/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "All it takes is a few more rasps of the panther's rough, barbed tongue to shovel the rest of you down its tightly rippling gullet... and with a final couple ravenous swallows, you spill out into the predatory feline's stomach! Right away, that gut's muscular walls knead and contract around you, forcing you into a curled-up ball as the panther's noisy purring rumbles into you from every direction." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/plants_ch/pitcher.dm b/code/modules/mob/living/simple_mob/subtypes/vore/plants_ch/pitcher.dm index 4d1a78545a..b93ebbe0b7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/plants_ch/pitcher.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/plants_ch/pitcher.dm @@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( health = 200 a_intent = I_HELP //White this is help by default I'm leaving this here as a reminder thatdisarm will prevent playersfrom swapping places with the pitcher (but interfere with vore bump). faction = "plants" //Makes plantbgone deadly. - ai_holder_type = /datum/ai_holder/simple_mob/passive/pitcher //It's a passive carnivorous plant, it can't detect or interact with people. + ai_holder_type = /datum/ai_holder/simple_mob/passive/pitcher //It's a passive carnivorous plant, it can't detect or interact with people. min_oxy = 0 //Immune to atmos because so are space vines. This is arbitrary and can be tweaked if desired. max_oxy = 0 @@ -41,7 +41,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( minbodytemp = 0 melee_damage_upper = 0 //This shouldn't attack people but if it does (admemes) no damage can be dealt. - melee_damage_lower = 0 + melee_damage_lower = 0 armor = list( "melee" = 0, @@ -64,7 +64,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( /mob/living/simple_mob/vore/pitcher_plant //Putting vore variables separately because apparently that's tradition. - vore_bump_chance = 100 + vore_bump_chance = 100 vore_bump_emote = "slurps up" //Not really a good way to make the grammar work with a passive vore plant. vore_active = 1 vore_icons = 1 @@ -75,7 +75,9 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( vore_default_mode = DM_DIGEST /mob/living/simple_mob/vore/pitcher_plant/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.desc = "You leaned a little too close to the pitcher plant, stumbling over the lip and splashing into a puddle of liquid filling the bottom of the cramped pitcher. You squirm madly, righting yourself and scrabbling at the walls in vain as the slick surface offers no purchase. The dim light grows dark as the pitcher's cap lowers, silently sealing the exit. With a sinking feeling you realize you won't be able to push the exit open even if you could somehow climb that high, leaving you helplessly trapped in the slick, tingling fluid. ((You can't escape this mob without help but you may use OOC Escape if you wish.))" B.digest_burn = 0.5 @@ -126,7 +128,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( adjustToxLoss((nutrition - lastnutrition) * 3) if(nutrition < pitcher_metabolism) adjustToxLoss(pitcher_metabolism) - if(world.time > last_lifechecks + 30 SECONDS) + if(world.time > last_lifechecks + 30 SECONDS) last_lifechecks = world.time vore_checks() handle_hungry() @@ -138,7 +140,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( /mob/living/simple_mob/vore/pitcher_plant/Initialize() ..() pitcher_plant_lure_messages = GLOB.pitcher_plant_lure_messages - + /mob/living/simple_mob/vore/pitcher_plant/death() ..() @@ -147,7 +149,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( new /obj/item/weapon/reagent_containers/food/snacks/pitcher_fruit(get_turf(src)) fruit = FALSE - + /mob/living/simple_mob/vore/pitcher_plant/proc/grow_fruit() //This proc handles the pitcher turning nutrition into fruit (and new pitchers). if(!fruit) @@ -158,14 +160,14 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( else return if(fruit) - if(nutrition >= PITCHER_SATED + NUTRITION_PITCHER) - var/turf/T = safepick(circleviewturfs(src, 2)) + if(nutrition >= PITCHER_SATED + NUTRITION_PITCHER) + var/turf/T = safepick(circleviewturfs(src, 2)) if(T.density) //No spawning in walls return else if(src.loc ==T) return else - new /mob/living/simple_mob/vore/pitcher_plant(get_turf(T)) + new /mob/living/simple_mob/vore/pitcher_plant(get_turf(T)) fruit = FALSE //No admeming this to spawn endless pitchers. adjust_nutrition(-NUTRITION_PITCHER) @@ -226,12 +228,12 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( var/N = 0 var/hasdigestable = 0 var/hasindigestable = 0 - for(L in vore_selected.contents) + for(L in vore_selected.contents) if(istype(L, /mob/living/carbon/human/monkey)) L.nutrition = 0 //No stuffing monkeys with protein shakes for massive nutrition. if(!L.digestable) vore_selected.digest_mode = DM_DRAIN - N = 1 + N = 1 hasindigestable = 1 continue else @@ -250,8 +252,8 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( if(nutrition <= PITCHER_HUNGRY) //Is sanity check another way to say redundancy? var/turf/T = get_turf(src) var/cardinal_turfs = T.CardinalTurfs() - - for(var/mob/living/carbon/human/H in oview(2, src)) + + for(var/mob/living/carbon/human/H in oview(2, src)) if(!istype(H) || !isliving(H) || H.stat == DEAD) //Living mobs only continue if(isSynthetic(H) || !H.species.breath_type || H.internal) //Exclude species which don't breathe or have internals. @@ -292,7 +294,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( /obj/item/weapon/reagent_containers/food/snacks/pitcher_fruit/Initialize() . = ..() - reagents.add_reagent("pitcher_nectar", 5) + reagents.add_reagent("pitcher_nectar", 5) bitesize = 4 pit = new /obj/item/seeds/pitcherseed(src.contents) seed = pit.seed @@ -301,7 +303,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( if(istype(O,/obj/machinery/microwave)) return ..() if(istype (O, /obj/machinery/seed_extractor)) - pit.loc = O.loc //1 seed, perhaps balanced because you can get the reagents and the seed. Can be increased if desirable. + pit.loc = O.loc //1 seed, perhaps balanced because you can get the reagents and the seed. Can be increased if desirable. qdel(src) if(!(proximity && O.is_open_container())) return diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm index d708f265bb..67194a3a87 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm @@ -54,7 +54,9 @@ ai_holder_type = /datum/ai_holder/simple_mob/melee/rat /mob/living/simple_mob/vore/aggressive/rat/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "In a cruel game of cat-and-mouse gone horribly wrong, you struggle to breathe clearly as the giant rat holds your head in its jaws, the rest of its bulk pinning you to the ground. Slimy slurps and its own muffled squeaking fill your senses as it simultaneously tosses its head while backing up. Quickly, ravenously consuming you, bit by bit, packing you down its gullet no matter how you struggle. Passing by its excited heartbeat, your thoroughly slickened head pushes out into its awaiting stomach, a dark and humid hammock eager to accept the rest of you. Soon, those too-warm, plush walls clench and squeeze around you with undeniable need! A need for mere filling, or, perhaps, a proper meal?" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm index 1114303d96..b6293fdeef 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/slug_ch.dm @@ -33,7 +33,7 @@ "bio" = 0, "rad" = 100) //Relatively harmless but agonizing to kill with melee. - glow_toggle = TRUE + glow_toggle = TRUE glow_range = 1.3 //This seems to be the minimum range which makes glow visible. glow_color = "#33ccff" //Same glow color as Sif trees. glow_intensity = 1 @@ -45,7 +45,7 @@ /mob/living/simple_mob/vore/slug //I guess separating the vore variables is a little more organized? vore_bump_chance = 100 //Always attempt a bump nom if possible... - vore_bump_emote = "knocks over and begins slowly engulfing" + vore_bump_emote = "knocks over and begins slowly engulfing" vore_active = 1 vore_icons = 1 vore_capacity = 1 @@ -55,7 +55,9 @@ vore_default_mode = DM_DIGEST /mob/living/simple_mob/vore/slug/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.desc = "Somehow you remained still just long enough for the slug to wrap its radula around your body and gradually draw you into its pharynx. The slug moves with agonizing slowness and devours prey at a snail's pace; inch by inch you're crammed down its gullet and squishes and squeezed into the slug's gizzard. Thick walls bear down, covered with shallow, toothy ridges. The slimy moss in here suggests you're not the slug's diet but the gizzard seems intent on churning and scraping over you regardless..." B.digest_burn = 0.1 @@ -109,9 +111,9 @@ spread_slime() /mob/living/simple_mob/vore/slug/do_attack(atom/A, turf/T) //Override of attack proc to ensure the slug can only attempt to eat people, not harm them. Inability to actually hurt anybody is intended, otherwise this mob wouldn't have 98 melee armor. - if(ckey) //If we're player controlled, use the default attack code. + if(ckey) //If we're player controlled, use the default attack code. return ..() - if(istype(A, /mob/living) && !will_eat(A)) + if(istype(A, /mob/living) && !will_eat(A)) ai_holder.lose_target() //Ignore anybody we can't eat. return else //This is the parent do_attack() code for determining whether or not attacks can hit. @@ -127,7 +129,7 @@ playsound(src, 'sound/rakshasa/Decay1.ogg', 75, 1) visible_message(span("warning", "\The [src] misses.")) return FALSE - tryBumpNom(A) //Meant for bump noms but this works as intended here and has sanity checks. + tryBumpNom(A) //Meant for bump noms but this works as intended here and has sanity checks. /mob/living/simple_mob/vore/slug/perform_the_nom(mob/living/user, mob/living/prey, mob/living/pred, obj/belly/belly, delay) ..() @@ -135,8 +137,8 @@ /datum/ai_holder/simple_mob/passive/slug_ch wander = TRUE - base_wander_delay = 7 - wander_when_pulled = TRUE + base_wander_delay = 7 + wander_when_pulled = TRUE vision_range = 10 can_flee = FALSE //Otherwise it'll run as soon as it gets a target. @@ -153,7 +155,7 @@ buckle_lying = TRUE var/persist_time = 5 MINUTES //How long until we cease existing. - var/mob/living/simple_mob/vore/slug/my_slug = null //This should be set by the slug. + var/mob/living/simple_mob/vore/slug/my_slug = null //This should be set by the slug. var/turf/my_turf = null //The turf we spawn on. var/base_escape_time = 1 MINUTE //How long does it take to struggle free? Affected by the victim's size_multiplier. @@ -166,9 +168,9 @@ /* for(var/obj/effect/slug_glue/G in my_turf.contents) if(G == src) continue - else + else qdel(G) //Prevent glue layering -*/ //Not including this due to performance concerns but keeping as comments for reference. +*/ //Not including this due to performance concerns but keeping as comments for reference. /obj/effect/slug_glue/proc/dissipate() //When spawned, set a timer to despawn. if(!persist_time) @@ -204,7 +206,7 @@ if(istype(L, /mob/living/simple_mob/vore/slug)) return - if(L.m_intent == "run" && !L.buckled) + if(L.m_intent == "run" && !L.buckled) if(has_buckled_mobs()) return buckle_mob(L) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm b/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm index de2139fd1a..1bec4badf9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/snake.dm @@ -36,7 +36,9 @@ swallowTime = 2 SECONDS // Hungry little bastards. /mob/living/simple_mob/vore/aggressive/giant_snake/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "As the giant snake's closed jaws seal you away from the outside world, you are immediately greeted with a seemingly endless passage of tightly squeezing flesh. Hot and coated in thick, body-clinging slime, the serpent's stomach walls immediately get to work at rhythmically pulsing and contracting against your figure, slowly tugging you deeper into its ravenous clutches." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm b/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm index b5804c2267..d2039c2cb1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/softdog.dm @@ -94,7 +94,9 @@ /mob/living/simple_mob/vore/woof/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "You have found yourself pumping on down, down, down into this extremely soft dog. The slick touches of pulsing walls roll over you in greedy fashion as you're swallowed away, the flesh forms to your figure as in an instant the world is replaced by the hot squeeze of canine gullet. And in another moment a heavy GLLRMMPTCH seals you away, the dog tossing its head eagerly, the way forward stretching to accommodate your shape as you are greedily guzzled down. The wrinkled, doughy walls pulse against you in time to the creature's steady heartbeat. The sounds of the outside world muffled into obscure tones as the wet, grumbling rolls of this soft creature's gut hold you, churning you tightly such that no part of you is spared from these gastric affections." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm index 1a9dae9b1e..de7d23bce1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm @@ -168,7 +168,9 @@ var/global/list/moth_amount = 0 // Chompstation Addition, Rykka waz here. *pawst return 1 /mob/living/simple_mob/vore/solargrub/init_vore() - ..() + if(!voremob_loaded) + return + .=..() var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "Through either grave error, overwhelming willingness, or some other factor, you find yourself lodged halfway past the solargrub's mandibles. While it had initially hissed and chittered in glee at the prospect of a new meal, it is clearly more versed in suckling on power cables; inch by inch, bit by bit, it undulates forth to slowly, noisily gulp you down its short esophagus... and right into its extra-cramped, surprisingly hot stomach. As the rest of you spills out into the plush-walled chamber, the grub's soft body bulges outwards here and there with your compressed figure. Before long, a thick slime oozes out from the surrounding stomach walls; only time will tell how effective it is on something solid like you..." diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm index 5d6c88cc92..3ea220ef8d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/zz_vore_overrides.dm @@ -267,6 +267,8 @@ // Override stuff for holodeck carp to make them not digest when set to safe! /mob/living/simple_mob/animal/space/carp/holographic/init_vore() + if(!voremob_loaded) + return . = ..() var/safe = (faction == "neutral") for(var/belly in vore_organs) diff --git a/code/modules/mob/mob_defines_vr.dm b/code/modules/mob/mob_defines_vr.dm index 41c27a41d0..ff5f1ae582 100644 --- a/code/modules/mob/mob_defines_vr.dm +++ b/code/modules/mob/mob_defines_vr.dm @@ -1,6 +1,5 @@ /mob var/vantag_hud = 0 // Do I have the HUD enabled? - var/flying = 0 // Allows flight var/mob/temporary_form // For holding onto a temporary form var/disconnect_time = null //Time of client loss, set by Logout(), for timekeeping diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 95732bad6a..ebcc9cf35a 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -460,8 +460,6 @@ return dense_object /mob/proc/Check_Shoegrip() - if(flying) //VOREStation Edit. Checks to see if they and are flying. - return 1 //VOREStation Edit. Checks to see if they are flying. Mostly for this to be ported to Polaris. return 0 /mob/proc/Process_Spaceslipping(var/prob_slip = 5) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 953f4d01ac..2cbf9a74f8 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -252,8 +252,13 @@ /datum/preferences/proc/update_preview_icon() var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey) + if(!mannequin.dna) // Special handling for preview icons before SSAtoms has initailized. + mannequin.dna = new /datum/dna(null) mannequin.delete_inventory(TRUE) dress_preview_mob(mannequin) + mannequin.update_transform() //VOREStation Edit to update size/shape stuff. + mannequin.toggle_tail(setting = TRUE) + mannequin.toggle_wing(setting = TRUE) COMPILE_OVERLAYS(mannequin) update_character_previews(new /mutable_appearance(mannequin)) diff --git a/code/modules/mob/new_player/preferences_setup_vr.dm b/code/modules/mob/new_player/preferences_setup_vr.dm index 1f01884b60..dca0ff56ec 100644 --- a/code/modules/mob/new_player/preferences_setup_vr.dm +++ b/code/modules/mob/new_player/preferences_setup_vr.dm @@ -1,16 +1,3 @@ -/datum/preferences/update_preview_icon() // Lines up and un-overlaps character edit previews. Also un-splits taurs. - var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey) - if(!mannequin.dna) // Special handling for preview icons before SSAtoms has initailized. - mannequin.dna = new /datum/dna(null) - mannequin.delete_inventory(TRUE) - dress_preview_mob(mannequin) - mannequin.update_transform() - mannequin.toggle_tail_vr(setting = TRUE) - mannequin.toggle_wing_vr(setting = TRUE) - COMPILE_OVERLAYS(mannequin) - - update_character_previews(new /mutable_appearance(mannequin)) - //TFF 5/8/19 - add randomised sensor setting for random button clicking /datum/preferences/randomize_appearance_and_body_for(var/mob/living/carbon/human/H) sensorpref = rand(1,5) \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 4694499cc8..f04cde9c4c 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1708,23 +1708,23 @@ shaved /datum/sprite_accessory/hair/skr_tentacle_veryshort name = "Skrell Short Tentacles" icon_state = "skrell_hair_short" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) gender = MALE /datum/sprite_accessory/hair/skr_tentacle_short name = "Skrell Average Tentacles" icon_state = "skrell_hair_average" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) /datum/sprite_accessory/hair/skr_tentacle_average name = "Skrell Long Tentacles" icon_state = "skrell_hair_long" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) /datum/sprite_accessory/hair/skr_tentacle_verylong name = "Skrell Very Long Tentacles" icon_state = "skrell_hair_verylong" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) //Tajaran hairstyles /datum/sprite_accessory/hair/taj_ears @@ -2006,6 +2006,8 @@ shaved //like Tajaran inner-ear coloring overlay stuff. species_allowed = list() + color_blend_mode = ICON_ADD + var/body_parts = list() //A list of bodyparts this covers, in organ_tag defines //Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD diff --git a/code/modules/mob/new_player/sprite_accessories_ear.dm b/code/modules/mob/new_player/sprite_accessories_ear.dm new file mode 100644 index 0000000000..6262b8ba60 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_ear.dm @@ -0,0 +1,489 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Ear Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/ears + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/ears.dmi' + do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color + + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/extra_overlay // Icon state of an additional overlay to blend in. + var/extra_overlay2 + var/desc = "You should not see this..." + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/shadekin + name = "Shadekin Ears, colorable" + desc = "" + icon_state = "shadekin" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + apply_restrictions = TRUE + +/datum/sprite_accessory/ears/taj_ears + name = "Tajaran Ears" + icon_state = "ears_plain" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + extra_overlay = "ears_plain-inner" + +/datum/sprite_accessory/ears/taj_ears_tall + name = "Tajaran Tall Ears" + icon_state = "msai_plain" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + extra_overlay = "msai_plain-inner" + +/datum/sprite_accessory/ears/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/ears/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/ears/bunny_white + name = "bunny, white" + desc = "" + icon_state = "bunny" + +/datum/sprite_accessory/ears/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/ears/bear_panda + name = "bear, panda" + desc = "" + icon_state = "panda" + +/datum/sprite_accessory/ears/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/ears/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/ears/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/ears/mouse_grey + name = "mouse, grey" + desc = "" + icon_state = "mouse-grey" + +/datum/sprite_accessory/ears/bee + name = "bee antennae" + desc = "" + icon_state = "bee" + +/datum/sprite_accessory/ears/antennae + name = "antennae, colorable" + desc = "" + icon_state = "antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/curly_bug + name = "curly antennae, colorable" + desc = "" + icon_state = "curly_bug" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dual_robot + name = "synth antennae, colorable" + desc = "" + icon_state = "dual_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/right_robot + name = "right synth, colorable" + desc = "" + icon_state = "right_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/left_robot + name = "left synth, colorable" + desc = "" + icon_state = "left_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/oni_h1 + name = "oni horns" + desc = "" + icon_state = "oni-h1" + +/datum/sprite_accessory/ears/oni_h1_c + name = "oni horns, colorable" + desc = "" + icon_state = "oni-h1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns1 + name = "demon horns" + desc = "" + icon_state = "demon-horns1" + +/datum/sprite_accessory/ears/demon_horns1_c + name = "demon horns, colorable" + desc = "" + icon_state = "demon-horns1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns2 + name = "demon horns, colorable(outward)" + desc = "" + icon_state = "demon-horns2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dragon_horns + name = "dragon horns, colorable" + desc = "" + icon_state = "dragon-horns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/foxears + name = "highlander zorren ears" + desc = "" + icon_state = "foxears" + +/datum/sprite_accessory/ears/fenears + name = "flatland zorren ears" + desc = "" + icon_state = "fenears" + +/datum/sprite_accessory/ears/sergal //Redundant + name = "Sergal ears" + icon_state = "serg_plain_s" + +/datum/sprite_accessory/ears/foxearshc + name = "highlander zorren ears, colorable" + desc = "" + icon_state = "foxearshc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/fenearshc + name = "flatland zorren ears, colorable" + desc = "" + icon_state = "fenearshc" + extra_overlay = "fenears-inner" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sergalhc + name = "Sergal ears, colorable" + icon_state = "serg_plain_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/mousehc + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "mouseinner" + +/datum/sprite_accessory/ears/mousehcno + name = "mouse, colorable, no inner" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/wolfhc + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/ears/bearhc + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallbear + name = "small bear" + desc = "" + icon_state = "smallbear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/squirrelhc + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/kittyhc + name = "kitty, colorable" + desc = "" + icon_state = "kitty" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "kittyinner" + +/datum/sprite_accessory/ears/bunnyhc + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers + name = "antlers" + desc = "" + icon_state = "antlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers_e + name = "antlers with ears" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "antlers_mark" + +/datum/sprite_accessory/ears/smallantlers + name = "small antlers" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallantlers_e + name = "small antlers with ears" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deer" + +/datum/sprite_accessory/ears/deer + name = "deer ears" + desc = "" + icon_state = "deer" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow + name = "cow, horns" + desc = "" + icon_state = "cow" + +/datum/sprite_accessory/ears/cowc + name = "cow, horns, colorable" + desc = "" + icon_state = "cow-c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow_nohorns + name = "cow, no horns" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/caprahorns + name = "caprine horns" + desc = "" + icon_state = "caprahorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/otie + name = "otie, colorable" + desc = "" + icon_state = "otie" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/donkey + name = "donkey, colorable" + desc = "" + icon_state = "donkey" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/zears + name = "jagged ears" + desc = "" + icon_state = "zears" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/elfs + name = "elven ears" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + species_allowed = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/sleek + name = "sleek ears" + desc = "" + icon_state = "sleek" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/drake + name = "drake frills" + desc = "" + icon_state = "drake" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp + name = "vulpkanin, dual-color" + desc = "" + icon_state = "vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp-inner" + +/datum/sprite_accessory/ears/vulp_short + name = "vulpkanin short" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp_short_dc + name = "vulpkanin short, dual-color" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_terrier-inner" + +/datum/sprite_accessory/ears/vulp_jackal + name = "vulpkanin thin, dual-color" + desc = "" + icon_state = "vulp_jackal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_jackal-inner" + +/datum/sprite_accessory/ears/bunny_floppy + name = "floopy bunny ears (colorable)" + desc = "" + icon_state = "floppy_bun" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/teshari + name = "Teshari (colorable fluff)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshariinner" + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/tesharihigh + name = "Teshari upper ears (colorable fluff)" + desc = "" + icon_state = "tesharihigh" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharihighinner" + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/tesharilow + name = "Teshari lower ears (colorable fluff)" + desc = "" + icon_state = "tesharilow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharilowinner" + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/inkling + name = "colorable mature inkling hair" + desc = "" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "inkling-colorable" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/ears/large_dragon + name = "Large dragon horns" + desc = "" + icon_state = "big_liz" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +// Special snowflake ears go below here. +/datum/sprite_accessory/ears/elf_caprine_colorable + name = "Caprine horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "caprahorns" + +/datum/sprite_accessory/ears/elf_oni_colorable + name = "oni horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "oni-h1_c" + +/datum/sprite_accessory/ears/elf_demon_colorable + name = "Demon horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns1_c" + +/datum/sprite_accessory/ears/elf_demon_outwards_colorable + name = "Demon horns with pointy ears, outwards, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns2" + +/datum/sprite_accessory/ears/elf_dragon_colorable + name = "Dragon horns with pointy ears, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "dragon-horns" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm new file mode 100644 index 0000000000..7705e1a821 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm @@ -0,0 +1,708 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Ear Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/ears + name = "You should not see this..." + icon = 'icons/mob/vore/ears_vr.dmi' + do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + +// Species-unique ears + +/datum/sprite_accessory/ears/shadekin + name = "Shadekin Ears, colorable" + desc = "" + icon_state = "shadekin" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + apply_restrictions = TRUE + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +// 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 = "" + icon_state = "hyena" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "hyena-inner" + +/datum/sprite_accessory/ears/moth + name = "moth antennae" + desc = "" + icon_state = "moth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/ears/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/ears/bunny_white + name = "bunny, white" + desc = "" + icon_state = "bunny" + +/datum/sprite_accessory/ears/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/ears/bear_panda + name = "bear, panda" + desc = "" + icon_state = "panda" + +/datum/sprite_accessory/ears/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/ears/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/ears/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/ears/mouse_grey + name = "mouse, grey" + desc = "" + icon_state = "mouse-grey" + +/datum/sprite_accessory/ears/bee + name = "bee antennae" + desc = "" + icon_state = "bee" + +/datum/sprite_accessory/ears/antennae + name = "antennae, colorable" + desc = "" + icon_state = "antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/curly_bug + name = "curly antennae, colorable" + desc = "" + icon_state = "curly_bug" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dual_robot + name = "synth antennae, colorable" + desc = "" + icon_state = "dual_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/right_robot + name = "right synth, colorable" + desc = "" + icon_state = "right_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/left_robot + name = "left synth, colorable" + desc = "" + icon_state = "left_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/oni_h1 + name = "oni horns" + desc = "" + icon_state = "oni-h1" + +/datum/sprite_accessory/ears/oni_h1_c + name = "oni horns, colorable" + desc = "" + icon_state = "oni-h1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns1 + name = "demon horns" + desc = "" + icon_state = "demon-horns1" + +/datum/sprite_accessory/ears/demon_horns1_c + name = "demon horns, colorable" + desc = "" + icon_state = "demon-horns1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns2 + name = "demon horns, colorable(outward)" + desc = "" + icon_state = "demon-horns2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dragon_horns + name = "dragon horns, colorable" + desc = "" + icon_state = "dragon-horns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/foxears + name = "highlander zorren ears" + desc = "" + icon_state = "foxears" + +/datum/sprite_accessory/ears/fenears + name = "flatland zorren ears" + desc = "" + icon_state = "fenears" + +/datum/sprite_accessory/ears/sergal //Redundant + name = "Sergal ears" + icon_state = "serg_plain_s" + +/datum/sprite_accessory/ears/foxearshc + name = "highlander zorren ears, colorable" + desc = "" + icon_state = "foxearshc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/fenearshc + name = "flatland zorren ears, colorable" + desc = "" + icon_state = "fenearshc" + extra_overlay = "fenears-inner" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sergalhc + name = "Sergal ears, colorable" + icon_state = "serg_plain_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/mousehc + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "mouseinner" + +/datum/sprite_accessory/ears/mousehcno + name = "mouse, colorable, no inner" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/wolfhc + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/ears/bearhc + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallbear + name = "small bear" + desc = "" + icon_state = "smallbear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/squirrelhc + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/kittyhc + name = "kitty, colorable" + desc = "" + icon_state = "kitty" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "kittyinner" + +/datum/sprite_accessory/ears/bunnyhc + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers + name = "antlers" + desc = "" + icon_state = "antlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers_e + name = "antlers with ears" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "antlers_mark" + +/datum/sprite_accessory/ears/smallantlers + name = "small antlers" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallantlers_e + name = "small antlers with ears" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deer" + +/datum/sprite_accessory/ears/deer + name = "deer ears" + desc = "" + icon_state = "deer" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow + name = "cow, horns" + desc = "" + icon_state = "cow" + +/datum/sprite_accessory/ears/cowc + name = "cow, horns, colorable" + desc = "" + icon_state = "cow-c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow_nohorns + name = "cow, no horns" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/caprahorns + name = "caprine horns" + desc = "" + icon_state = "caprahorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/otie + name = "otie, colorable" + desc = "" + icon_state = "otie" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/donkey + name = "donkey, colorable" + desc = "" + icon_state = "donkey" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/zears + name = "jagged ears" + desc = "" + icon_state = "zears" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/elfs + name = "elven ears" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sleek + name = "sleek ears" + desc = "" + icon_state = "sleek" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/drake + name = "drake frills" + desc = "" + icon_state = "drake" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp + name = "vulpkanin, dual-color" + desc = "" + icon_state = "vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp-inner" + +/datum/sprite_accessory/ears/vulp_short + name = "vulpkanin short" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp_short_dc + name = "vulpkanin short, dual-color" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_terrier-inner" + +/datum/sprite_accessory/ears/vulp_jackal + name = "vulpkanin thin, dual-color" + desc = "" + icon_state = "vulp_jackal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_jackal-inner" + +/datum/sprite_accessory/ears/bunny_floppy + name = "floopy bunny ears (colorable)" + desc = "" + icon_state = "floppy_bun" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/teshari + name = "Teshari (colorable)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshariinner" + +/datum/sprite_accessory/ears/tesharihigh + name = "Teshari upper ears (colorable)" + desc = "" + icon_state = "tesharihigh" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharihighinner" + +/datum/sprite_accessory/ears/tesharilow + name = "Teshari lower ears (colorable)" + desc = "" + icon_state = "tesharilow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharilowinner" + +/datum/sprite_accessory/ears/tesh_pattern_ear_male + name = "Teshari male ear pattern (colorable)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshari_male_pattern" + +/datum/sprite_accessory/ears/tesh_pattern_ear_female + name = "Teshari female ear pattern (colorable)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshari_female_pattern" + +/datum/sprite_accessory/ears/inkling + name = "colorable mature inkling hair" + desc = "" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "inkling-colorable" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/ears/large_dragon + name = "Large dragon horns" + desc = "" + icon_state = "big_liz" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +// Special snowflake ears go below here. + +/datum/sprite_accessory/ears/molenar_kitsune + name = "quintail kitsune ears (Molenar)" + desc = "" + icon_state = "molenar-kitsune" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/ears/lilimoth_antennae + name = "citheronia antennae (Kira72)" + desc = "" + icon_state = "lilimoth_antennae" + ckeys_allowed = list("kira72") + +/datum/sprite_accessory/ears/molenar_deathclaw + name = "deathclaw ears (Molenar)" + desc = "" + icon_state = "molenar-deathclaw" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/ears/miria_fluffdragon + name = "fluffdragon ears (Miria Masters)" + desc = "" + icon_state = "miria-fluffdragonears" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/ears/miria_kitsune + name = "kitsune ears (Miria Masters)" + desc = "" + icon_state = "miria-kitsuneears" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/ears/runac + name = "fennecsune ears (Runac)" + desc = "" + icon_state = "runac" + ckeys_allowed = list("rebcom1807") + +/datum/sprite_accessory/ears/kerena + name = "wingwolf ears (Kerena)" + desc = "" + icon_state = "kerena" + ckeys_allowed = list("somekindofpony") + +/datum/sprite_accessory/ears/rosey + name = "tritail kitsune ears (Rosey)" + desc = "" + icon_state = "rosey" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("joey4298") + +/datum/sprite_accessory/ears/aronai + name = "aronai ears/head (Aronai)" + desc = "" + icon_state = "aronai" + ckeys_allowed = list("arokha") + +/datum/sprite_accessory/ears/holly + name = "tigress ears (Holly Sharp)" + desc = "" + icon_state = "tigressears" + ckeys_allowed = list("hoodoo") + +/datum/sprite_accessory/ears/molenar_inkling + name = "teal mature inkling hair (Kari Akiren)" + desc = "" + icon_state = "molenar-tentacle" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/ears/shock + name = "pharoah hound ears (Shock Diamond)" + desc = "" + icon_state = "shock" + ckeys_allowed = list("icowom","cameron653") + +/datum/sprite_accessory/ears/alurane + name = "alurane ears/hair (Pumila)" + desc = "" + icon_state = "alurane-ears" + ckeys_allowed = list("natje") + +/datum/sprite_accessory/ears/frost + name = "Frost antenna" + desc = "" + icon_state = "frosted_tips" + ckeys_allowed = list("tucker0666") + +/datum/sprite_accessory/ears/sylv_pip + name = "sylveon ears and ribbons (Pip Shyner)" + desc = "" + icon_state = "pipears" + ckeys_allowed = list("phoaly") + +/datum/sprite_accessory/ears/elf_caprine_colorable + name = "Caprine horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "caprahorns" + +/datum/sprite_accessory/ears/elf_oni_colorable + name = "oni horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "oni-h1_c" + +/datum/sprite_accessory/ears/elf_demon_colorable + name = "Demon horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns1_c" + +/datum/sprite_accessory/ears/elf_demon_outwards_colorable + name = "Demon horns with pointy ears, outwards, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns2" + +/datum/sprite_accessory/ears/elf_dragon_colorable + name = "Dragon horns with pointy ears, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "dragon-horns" + +/datum/sprite_accessory/ears/synthhorns_plain + name = "Synth horns, plain" + desc = "" + icon_state = "synthhorns_plain" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "synthhorns_plain_light" + +/datum/sprite_accessory/ears/synthhorns_thick + name = "Synth horns, thick" + desc = "" + icon_state = "synthhorns_thick" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "synthhorns_thick_light" + +/datum/sprite_accessory/ears/synthhorns_curly + name = "Synth horns, curly" + desc = "" + icon_state = "synthhorns_curled" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + +/datum/sprite_accessory/ears/forward_curled_demon_horns_bony + name = "Succubus horns, colourable" + desc = "" + icon_state = "succu-horns_b" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/forward_curled_demon_horns_bony_with_colorable_ears + name = "Succubus horns with pointy ears, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "succu-horns_b" + +/datum/sprite_accessory/ears/chorns_nubbydogs + name = "Nubby Chorns" + desc = "" + icon_state = "chorn_nubby" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_herk + name = "Herk Chorns" + desc = "" + icon_state = "chorn_herk" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_bork + name = "Bork Chorns" + desc = "" + icon_state = "chorn_bork" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_bull + name = "Bull Chorns" + desc = "" + icon_state = "chorn_bull" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_bicarrot + name = "Bicarrot Chorns" + desc = "" + icon_state = "chorn_bicarrot" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_longcarrot + name = "Long Carrot Chorns" + desc = "" + icon_state = "chorn_longcarrot" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_shortcarrot + name = "Short Carrot Chorns" + desc = "" + icon_state = "chorn_shortcarrot" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_scorp + name = "Scorp Chorns" + desc = "" + icon_state = "chorn_scorp" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_ocean + name = "Ocean Chorns" + desc = "" + icon_state = "chorn_ocean" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_chub + name = "Chub Chorns" + desc = "" + icon_state = "chorn_chub" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY diff --git a/code/modules/mob/new_player/sprite_accessories_extra.dm b/code/modules/mob/new_player/sprite_accessories_extra.dm new file mode 100644 index 0000000000..a124eff96b --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_extra.dm @@ -0,0 +1,566 @@ +/datum/sprite_accessory/marking/vr + icon = 'icons/mob/human_races/markings_alt.dmi' + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/marking/vr/vulp_belly + name = "belly fur (Vulp)" + icon_state = "vulp_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_fullbelly + name = "full belly fur (Vulp)" + icon_state = "vulp_fullbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_crest + name = "belly crest (Vulp)" + icon_state = "vulp_crest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_nose + name = "nose (Vulp)" + icon_state = "vulp_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_short_nose + name = "nose, short (Vulp)" + icon_state = "vulp_short_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/snoutstripe + name = "snout stripe (Vulp)" + icon_state = "snoutstripe" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_face + name = "face (Vulp)" + icon_state = "vulp_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_facealt + name = "face, alt. (Vulp)" + icon_state = "vulp_facealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_earsface + name = "ears and face (Vulp)" + icon_state = "vulp_earsface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_all + name = "all head highlights (Vulp)" + icon_state = "vulp_all" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergal_full + name = "Sergal Markings" + icon_state = "sergal_full" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/sergal_full_female + name = "Sergal Markings (Female)" + icon_state = "sergal_full_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/monoeye + name = "Monoeye" + icon_state = "monoeye" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spidereyes + name = "Spider Eyes" + icon_state = "spidereyes" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergaleyes + name = "Sergal Eyes" + icon_state = "eyes_sergal" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/brows + name = "Eyebrows" + icon_state = "brows" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/nevrean_female + name = "Female Nevrean beak" + icon_state = "nevrean_f" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = FEMALE + +/datum/sprite_accessory/marking/vr/nevrean_male + name = "Male Nevrean beak" + icon_state = "nevrean_m" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = MALE + +/datum/sprite_accessory/marking/vr/spots + name = "Spots" + icon_state = "spots" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/shaggy_mane + name = "Shaggy mane/feathers" + icon_state = "shaggy" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/jagged_teeth + name = "Jagged teeth" + icon_state = "jagged" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/blank_face + name = "Blank round face (use with monster mouth)" + icon_state = "blankface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/monster_mouth + name = "Monster mouth" + icon_state = "monster" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/saber_teeth + name = "Saber teeth" + icon_state = "saber" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/fangs + name = "Fangs" + icon_state = "fangs" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tusks + name = "Tusks" + icon_state = "tusks" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_face + name = "Otie face" + icon_state = "otieface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_nose + name = "Otie nose" + icon_state = "otie_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otienose_lite + name = "Short otie nose" + icon_state = "otienose_lite" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/backstripes + name = "Back stripes" + icon_state = "otiestripes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/belly_butt + name = "Belly and butt" + icon_state = "bellyandbutt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/fingers_toes + name = "Fingers and toes" + icon_state = "fingerstoes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/otie_socks + name = "Fingerless socks" + icon_state = "otiesocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/corvid_beak + name = "Corvid beak" + icon_state = "corvidbeak" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/corvid_belly + name = "Corvid belly" + icon_state = "corvidbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_body + name = "Cow markings" + icon_state = "cowbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_nose + name = "Cow nose" + icon_state = "cownose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zmask + name = "Eye mask" + icon_state = "zmask" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zbody + name = "Thick jagged stripes" + icon_state = "zbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/znose + name = "Jagged snout" + icon_state = "znose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_nose + name = "Otter nose" + icon_state = "otternose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_face + name = "Otter face" + icon_state = "otterface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/deer_face + name = "Deer face" + icon_state = "deerface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sharkface + name = "Akula snout" + icon_state = "sharkface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_face + name = "Shepherd snout" + icon_state = "shepface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_back + name = "Shepherd back" + icon_state = "shepback" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_male + name = "Zorren Male Torso" + icon_state = "zorren_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_female + name = "Zorren Female Torso" + icon_state = "zorren_belly_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_back_patch + name = "Zorren Back Patch" + icon_state = "zorren_backpatch" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/zorren_face_male + name = "Zorren Male Face" + icon_state = "zorren_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_face_female + name = "Zorren Female Face" + icon_state = "zorren_face_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_male + name = "Zorren Male Muzzle" + icon_state = "zorren_muzzle" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_female + name = "Zorren Female Muzzle" + icon_state = "zorren_muzzle_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_socks + name = "Zorren Socks" + icon_state = "zorren_socks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/zorren_longsocks + name = "Zorren Longsocks" + icon_state = "zorren_longsocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/tesh_feathers + name = "Teshari Feathers" + icon_state = "tesh-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/harpy_feathers + name = "Rapala leg Feather" + icon_state = "harpy-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/harpy_legs + name = "Rapala leg coloring" + icon_state = "harpy-leg" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/chooves + name = "Cloven hooves" + icon_state = "chooves" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT) + +/datum/sprite_accessory/marking/vr/body_tone + name = "Body toning (for emergency contrast loss)" + icon_state = "btone" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/gloss + name = "Full body gloss" + icon_state = "gloss" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/eboop_panels + name = "Eggnerd FBP panels" + icon_state = "eboop" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/osocks_rarm + name = "Modular Longsock (right arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_ARM,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/osocks_larm + name = "Modular Longsock (left arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_ARM,BP_L_HAND) + +/datum/sprite_accessory/marking/vr/osocks_rleg + name = "Modular Longsock (right leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_FOOT,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/osocks_lleg + name = "Modular Longsock (left leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_L_LEG) + +/datum/sprite_accessory/marking/vr/animeeyesinner + name = "Anime Eyes Inner" + icon_state = "animeeyesinner" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/animeeyesouter + name = "Anime Eyes Outer" + icon_state = "animeeyesouter" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/panda_eye_marks + name = "Panda Eye Markings" + icon_state = "eyes_panda" + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/marking/vr/catwomantorso + name = "Catwoman chest stripes" + icon_state = "catwomanchest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/catwomangroin + name = "Catwoman groin stripes" + icon_state = "catwomangroin" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN) + +/datum/sprite_accessory/marking/vr/catwoman_rleg + name = "Catwoman right leg stripes" + icon_state = "catwomanright" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_LEG) + +/datum/sprite_accessory/marking/vr/catwoman_lleg + name = "Catwoman left leg stripes" + icon_state = "catwomanleft" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG) + +/datum/sprite_accessory/marking/vr/teshi_small_feathers + name = "Teshari small wingfeathers" + icon_state = "teshi_sf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights + name = "Ward - Spirit FBP Lights" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_lights_body + name = "Ward - Spirit FBP Lights (body)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights_head + name = "Ward - Spirit FBP Lights (head)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels + name = "Ward - Spirit FBP Panels" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels_body + name = "Ward - Spirit FBP Panels (body)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_panels_head + name = "Ward - Spirit FBP Panels (head)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_head + name = "Squid Head" + icon_state = "tentaclehead" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_mouth + name = "Tentacle Mouth" + icon_state = "tentaclemouth" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/rosette + name = "Rosettes" + icon_state = "rosette" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) +/* +werewolf_nose + name = "Werewolf nose" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +werewolf_face + name = "Werewolf face" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +werewolf_belly + name = "Werewolf belly" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + species_allowed = list(SPECIES_WEREBEAST) + +werewolf_socks + name = "Werewolf socks" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + species_allowed = list(SPECIES_WEREBEAST) + +shadekin_snoot + name = "Shadekin Snoot" + icon_state = "shadekin-snoot" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) +*/ +/datum/sprite_accessory/marking/vr/taj_nose_alt + name = "Nose Color, alt. (Taj)" + icon_state = "taj_nosealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/talons + name = "Talons" + icon_state = "talons" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/claws + name = "Claws" + icon_state = "claws" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/equine_snout //Why the long face? Works best with sergal bodytype. + name = "Equine Snout" + icon_state = "donkey" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/equine_nose + name = "Equine Nose" + icon_state = "dnose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm new file mode 100644 index 0000000000..fd23037699 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm @@ -0,0 +1,725 @@ +//VOREStation Body Markings and Overrides +//Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD + +/datum/sprite_accessory/marking //Override for base markings + color_blend_mode = ICON_ADD + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + +/datum/sprite_accessory/marking/vr + icon = 'icons/mob/human_races/markings_vr.dmi' + +/datum/sprite_accessory/marking/vr/vulp_belly + name = "belly fur (Vulp)" + icon_state = "vulp_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_fullbelly + name = "full belly fur (Vulp)" + icon_state = "vulp_fullbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_crest + name = "belly crest (Vulp)" + icon_state = "vulp_crest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_nose + name = "nose (Vulp)" + icon_state = "vulp_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_short_nose + name = "nose, short (Vulp)" + icon_state = "vulp_short_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/snoutstripe + name = "snout stripe (Vulp)" + icon_state = "snoutstripe" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_face + name = "face (Vulp)" + icon_state = "vulp_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_facealt + name = "face, alt. (Vulp)" + icon_state = "vulp_facealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_earsface + name = "ears and face (Vulp)" + icon_state = "vulp_earsface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_all + name = "all head highlights (Vulp)" + icon_state = "vulp_all" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergal_full + name = "Sergal Markings" + icon_state = "sergal_full" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/sergal_full_female + name = "Sergal Markings (Female)" + icon_state = "sergal_full_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/monoeye + name = "Monoeye" + icon_state = "monoeye" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spidereyes + name = "Spider Eyes" + icon_state = "spidereyes" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergaleyes + name = "Sergal Eyes" + icon_state = "eyes_sergal" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/brows + name = "Eyebrows" + icon_state = "brows" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/nevrean_female + name = "Female Nevrean beak" + icon_state = "nevrean_f" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = FEMALE + +/datum/sprite_accessory/marking/vr/nevrean_male + name = "Male Nevrean beak" + icon_state = "nevrean_m" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = MALE + +/datum/sprite_accessory/marking/vr/spots + name = "Spots" + icon_state = "spots" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/shaggy_mane + name = "Shaggy mane/feathers" + icon_state = "shaggy" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/jagged_teeth + name = "Jagged teeth" + icon_state = "jagged" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/blank_face + name = "Blank round face (use with monster mouth)" + icon_state = "blankface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/monster_mouth + name = "Monster mouth" + icon_state = "monster" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/saber_teeth + name = "Saber teeth" + icon_state = "saber" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/fangs + name = "Fangs" + icon_state = "fangs" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tusks + name = "Tusks" + icon_state = "tusks" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_face + name = "Otie face" + icon_state = "otieface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_nose + name = "Otie nose" + icon_state = "otie_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otienose_lite + name = "Short otie nose" + icon_state = "otienose_lite" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/backstripes + name = "Back stripes" + icon_state = "otiestripes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/belly_butt + name = "Belly and butt" + icon_state = "bellyandbutt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/fingers_toes + name = "Fingers and toes" + icon_state = "fingerstoes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/otie_socks + name = "Fingerless socks" + icon_state = "otiesocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/corvid_beak + name = "Corvid beak" + icon_state = "corvidbeak" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/corvid_belly + name = "Corvid belly" + icon_state = "corvidbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_body + name = "Cow markings" + icon_state = "cowbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_nose + name = "Cow nose" + icon_state = "cownose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zmask + name = "Eye mask" + icon_state = "zmask" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zbody + name = "Thick jagged stripes" + icon_state = "zbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/znose + name = "Jagged snout" + icon_state = "znose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_nose + name = "Otter nose" + icon_state = "otternose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_face + name = "Otter face" + icon_state = "otterface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/deer_face + name = "Deer face" + icon_state = "deerface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sharkface + name = "Akula snout" + icon_state = "sharkface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_face + name = "Shepherd snout" + icon_state = "shepface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_back + name = "Shepherd back" + icon_state = "shepback" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_male + name = "Zorren Male Torso" + icon_state = "zorren_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_female + name = "Zorren Female Torso" + icon_state = "zorren_belly_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_back_patch + name = "Zorren Back Patch" + icon_state = "zorren_backpatch" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/zorren_face_male + name = "Zorren Male Face" + icon_state = "zorren_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_face_female + name = "Zorren Female Face" + icon_state = "zorren_face_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_male + name = "Zorren Male Muzzle" + icon_state = "zorren_muzzle" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_female + name = "Zorren Female Muzzle" + icon_state = "zorren_muzzle_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_socks + name = "Zorren Socks" + icon_state = "zorren_socks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/zorren_longsocks + name = "Zorren Longsocks" + icon_state = "zorren_longsocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/tesh_feathers + name = "Teshari Feathers" + icon_state = "tesh-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/harpy_feathers + name = "Rapala leg Feather" + icon_state = "harpy-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/harpy_legs + name = "Rapala leg coloring" + icon_state = "harpy-leg" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/chooves + name = "Cloven hooves" + icon_state = "chooves" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT) + +/datum/sprite_accessory/marking/vr/body_tone + name = "Body toning (for emergency contrast loss)" + icon_state = "btone" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/gloss + name = "Full body gloss" + icon_state = "gloss" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/eboop_panels + name = "Eggnerd FBP panels" + icon_state = "eboop" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/osocks_rarm + name = "Modular Longsock (right arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_ARM,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/osocks_larm + name = "Modular Longsock (left arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_ARM,BP_L_HAND) + +/datum/sprite_accessory/marking/vr/osocks_rleg + name = "Modular Longsock (right leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_FOOT,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/osocks_lleg + name = "Modular Longsock (left leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_L_LEG) + +/datum/sprite_accessory/marking/vr/animeeyesinner + name = "Anime Eyes Inner" + icon_state = "animeeyesinner" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/animeeyesouter + name = "Anime Eyes Outer" + icon_state = "animeeyesouter" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/panda_eye_marks + name = "Panda Eye Markings" + icon_state = "eyes_panda" + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/marking/vr/catwomantorso + name = "Catwoman chest stripes" + icon_state = "catwomanchest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/catwomangroin + name = "Catwoman groin stripes" + icon_state = "catwomangroin" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN) + +/datum/sprite_accessory/marking/vr/catwoman_rleg + name = "Catwoman right leg stripes" + icon_state = "catwomanright" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_LEG) + +/datum/sprite_accessory/marking/vr/catwoman_lleg + name = "Catwoman left leg stripes" + icon_state = "catwomanleft" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG) + +/datum/sprite_accessory/marking/vr/teshi_small_feathers + name = "Teshari small wingfeathers" + icon_state = "teshi_sf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights + name = "Ward - Spirit FBP Lights" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_lights_body + name = "Ward - Spirit FBP Lights (body)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights_head + name = "Ward - Spirit FBP Lights (head)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels + name = "Ward - Spirit FBP Panels" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels_body + name = "Ward - Spirit FBP Panels (body)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_panels_head + name = "Ward - Spirit FBP Panels (head)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_head + name = "Squid Head" + icon_state = "tentaclehead" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_mouth + name = "Tentacle Mouth" + icon_state = "tentaclemouth" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/rosette + name = "Rosettes" + icon_state = "rosette" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/werewolf_nose + name = "Werewolf nose" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/werewolf_face + name = "Werewolf face" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/werewolf_belly + name = "Werewolf belly" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/werewolf_socks + name = "Werewolf socks" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/shadekin_snoot + name = "Shadekin Snoot" + icon_state = "shadekin-snoot" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/marking/vr/taj_nose_alt + name = "Nose Color, alt. (Taj)" + icon_state = "taj_nosealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/talons + name = "Talons" + icon_state = "talons" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/claws + name = "Claws" + icon_state = "claws" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/equine_snout //Why the long face? Works best with sergal bodytype. + name = "Equine Snout" + icon_state = "donkey" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/equine_nose + name = "Equine Nose" + icon_state = "dnose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/bee_stripes + name = "bee stripes" + icon_state = "beestripes" + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vas_toes + name = "Bug Paws (Vasilissan)" + icon_state = "vas_toes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT) + + //CitRP stuff +/datum/sprite_accessory/marking/vr/vox_alt + name = "Vox Alternate" + icon_state = "bay_vox" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) + species_allowed = list(SPECIES_VOX) + +/datum/sprite_accessory/marking/vr/vox_alt_eyes + name = "Alternate Vox Eyes" + icon_state = "bay_vox_eyes" + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_VOX) + +/datum/sprite_accessory/marking/vr/c_beast_body + name = "Cyber Body" + icon_state = "c_beast_body" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/c_beast_plating + name = "Cyber Plating (Use w/ Cyber Body)" + icon_state = "c_beast_plating" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM) + +/datum/sprite_accessory/marking/vr/c_beast_band + name = "Cyber Band (Use w/ Cybertech head)" + icon_state = "c_beast_band" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/c_beast_cheek_a + name = "Cyber Beast Cheeks A (Use A, B and C)" + icon_state = "c_beast_a" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/c_beast_cheek_b + name = "Cyber Beast Cheeks B (Use A, B and C)" + icon_state = "c_beast_b" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/c_beast_cheek_c + name = "Cyber Beast Cheeks C (Use A, B and C)" + icon_state = "c_beast_c" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/teshari_large_eyes + name = "Teshari large eyes" + icon_state = "teshlarge_eyes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/teshari_coat + name = "Teshari coat" + icon_state = "tesh_coat" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/teshari_pattern_male + name = "Teshari male pattern" + icon_state = "tesh-pattern-male" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/teshari_pattern_female + name = "Teshari female pattern" + icon_state = "tesh-pattern-fem" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/voxscales + name = "Vox Scales" + icon_state = "Voxscales" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_HEAD) + +/datum/sprite_accessory/marking/vr/voxclaws + name = "Vox Claws" + icon_state = "Voxclaws" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/voxbeak + name = "Vox Beak" + icon_state = "Voxscales" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathihood + name = "Cobra Hood" + icon_state = "unathihood" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathidoublehorns + name = "Double Unathi Horns" + icon_state = "unathidoublehorns" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathihorns + name = "Unathi Horns" + icon_state = "unathihorns" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathiramhorns + name = "Unathi Ram Horns" + icon_state = "unathiramhorns" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathishortspines + name = "Unathi Short Spines" + icon_state = "unathishortspines" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathilongspines + name = "Unathi Long Spines" + icon_state = "unathilongspines" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathishortfrills + name = "Unathi Short Frills" + icon_state = "unathishortfrills" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathilongfrills + name = "Unathi Long Frills" + icon_state = "unathilongfrills" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm new file mode 100644 index 0000000000..012591a895 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_tail.dm @@ -0,0 +1,941 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Tail Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/tail + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/tails.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/extra_overlay // Icon state of an additional overlay to blend in. + var/extra_overlay2 //Tertiary. + var/show_species_tail = 0 // If false, do not render species' tail. + var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it + var/desc = "You should not see this..." + var/ani_state // State when wagging/animated + var/extra_overlay_w // Wagging state for extra overlay + var/extra_overlay2_w // Tertiary wagging. + var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff. + var/icon/clip_mask_icon = null //Icon file used for clip mask. + var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits. + var/icon/clip_mask = null //Instantiated clip mask of given icon and state + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/New() + . = ..() + if(clip_mask_icon && clip_mask_state) + clip_mask = icon(icon = clip_mask_icon, icon_state = clip_mask_state) + +// Species-unique tails + +// Everyone tails + +/datum/sprite_accessory/tail/invisible + name = "hide species-sprite tail" + icon = null + icon_state = null + + species_allowed = list(SPECIES_TAJ, SPECIES_UNATHI, SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/tail/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/tail/squirrel + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kitty + name = "kitty, colorable, downwards" + desc = "" + icon_state = "kittydown" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kittyup + name = "kitty, colorable, upwards" + desc = "" + icon_state = "kittyup" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/tiger_white + name = "tiger, colorable" + desc = "" + icon_state = "tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigerinnerwhite" + +/datum/sprite_accessory/tail/stripey + name = "stripey taj, colorable" + desc = "" + icon_state = "stripeytail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "stripeytail_mark" + + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/stripeytail_brown + name = "stripey taj, brown" + desc = "" + icon_state = "stripeytail-brown" + +/datum/sprite_accessory/tail/chameleon + name = "Chameleon, colorable" + desc = "" + icon_state = "chameleon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/bunny + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + +/datum/sprite_accessory/tail/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/tail/bear + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/dragon + name = "dragon, colorable" + desc = "" + icon_state = "dragon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/tail/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/tail/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/tail/blackwolf + name = "wolf, black" + desc = "" + icon_state = "wolf" + +/datum/sprite_accessory/tail/wolf + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/tail/mouse_pink + name = "mouse, pink" + desc = "" + icon_state = "mouse-pink" + +/datum/sprite_accessory/tail/mouse + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/horse + name = "horse tail, colorable" + desc = "" + icon_state = "horse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/cow + name = "cow tail, colorable" + desc = "" + icon_state = "cow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fantail + name = "avian fantail, colorable" + desc = "" + icon_state = "fantail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wagtail + name = "avian wagtail, colorable" + desc = "" + icon_state = "wagtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreandc + name = "nevrean tail, dual-color" + desc = "" + icon_state = "nevreantail_dc" + extra_overlay = "nevreantail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc + name = "nevrean wagtail, dual-color" + desc = "" + icon_state = "wagtail" + extra_overlay = "wagtail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc_alt + name = "nevrean wagtail, marked, dual-color" + desc = "" + icon_state = "wagtail2_dc" + extra_overlay = "wagtail2_dc_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/crossfox + name = "cross fox" + desc = "" + icon_state = "crossfox" + +/datum/sprite_accessory/tail/beethorax + name = "bee thorax" + desc = "" + icon_state = "beethorax" + +/datum/sprite_accessory/tail/doublekitsune + name = "double kitsune tail, colorable" + desc = "" + icon_state = "doublekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/spade_color + name = "spade-tail (colorable)" + desc = "" + icon_state = "spadetail-black" + do_colouration = 1 + +/datum/sprite_accessory/tail/snag + name = "xenomorph tail 1" + desc = "" + icon_state = "snag" + +/datum/sprite_accessory/tail/xenotail + name = "xenomorph tail 2" + desc = "" + icon_state = "xenotail" + +/datum/sprite_accessory/tail/eboop + name = "EGN mech tail (dual color)" + desc = "" + icon_state = "eboop" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "eboop_mark" + +/datum/sprite_accessory/tail/ketrai_wag + name = "fennix tail (vwag)" + desc = "" + icon_state = "ketraitail" + ani_state = "ketraitail_w" + //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone. + +/datum/sprite_accessory/tail/ketrainew_wag + name = "new fennix tail (vwag)" + desc = "" + icon_state = "ketraitailnew" + ani_state = "ketraitailnew_w" + +/datum/sprite_accessory/tail/redpanda + name = "red panda" + desc = "" + icon_state = "redpanda" + +/datum/sprite_accessory/tail/ringtail + name = "ringtail, colorable" + desc = "" + icon_state = "ringtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ringtail_mark" + +/datum/sprite_accessory/tail/satyr + name = "goat legs, colorable" + desc = "" + icon_state = "satyr" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/human_races/sprite_accessories/taurs.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. + +/datum/sprite_accessory/tail/tailmaw + name = "tailmaw, colorable" + desc = "" + icon_state = "tailmaw" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/tail/curltail + name = "curltail (vwag)" + desc = "" + icon_state = "curltail" + ani_state = "curltail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "curltail_mark" + extra_overlay_w = "curltail_mark_w" + +/datum/sprite_accessory/tail/shorttail + name = "shorttail (vwag)" + desc = "" + icon_state = "straighttail" + ani_state = "straighttail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sneptail + name = "Snep/Furry Tail (vwag)" + desc = "" + icon_state = "sneptail" + ani_state = "sneptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sneptail_mark" + extra_overlay_w = "sneptail_mark_w" + + +/datum/sprite_accessory/tail/tiger_new + name = "tiger tail (vwag)" + desc = "" + icon_state = "tigertail" + ani_state = "tigertail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigertail_mark" + extra_overlay_w = "tigertail_mark_w" + +/datum/sprite_accessory/tail/vulp_new + name = "new vulp tail (vwag)" + desc = "" + icon_state = "vulptail" + ani_state = "vulptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulptail_mark" + extra_overlay_w = "vulptail_mark_w" + +/datum/sprite_accessory/tail/otietail + name = "otie tail (vwag)" + desc = "" + icon_state = "otie" + ani_state = "otie_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/newtailmaw + name = "new tailmaw (vwag)" + desc = "" + icon_state = "newtailmaw" + ani_state = "newtailmaw_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/ztail + name = "jagged flufftail" + desc = "" + icon_state = "ztail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/snaketail + name = "snake tail, colorable" + desc = "" + icon_state = "snaketail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/vulpan_alt + name = "vulpkanin alt style, colorable" + desc = "" + icon_state = "vulptail_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sergaltaildc + name = "sergal, dual-color" + desc = "" + icon_state = "sergal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sergal_mark" + +/datum/sprite_accessory/tail/skunktail + name = "skunk, dual-color" + desc = "" + icon_state = "skunktail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "skunktail_mark" + +/datum/sprite_accessory/tail/deertail + name = "deer, dual-color" + desc = "" + icon_state = "deertail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deertail_mark" + +/datum/sprite_accessory/tail/teshari_fluffytail + name = "Teshari alternative, colorable" + desc = "" + icon_state = "teshari_fluffytail" + extra_overlay = "teshari_fluffytail_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/nightstalker + name = "Nightstalker, colorable" + desc = "" + icon_state = "nightstalker" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +//For all species tails. Includes haircolored tails. +/datum/sprite_accessory/tail/special + name = "Blank tail. Do not select." + icon = 'icons/effects/species_tails.dmi' + +/datum/sprite_accessory/tail/special/unathi + name = "unathi tail" + desc = "" + icon_state = "sogtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/tajaran + name = "tajaran tail" + desc = "" + icon_state = "tajtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/sergal + name = "sergal tail" + desc = "" + icon_state = "sergtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akula + name = "akula tail" + desc = "" + icon_state = "sharktail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevrean + name = "nevrean tail" + desc = "" + icon_state = "nevreantail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalis + name = "armalis tail" + desc = "" + icon_state = "armalis_tail_humanoid_s" + +/datum/sprite_accessory/tail/special/xenodrone + name = "xenomorph drone tail" + desc = "" + icon_state = "xenos_drone_tail_s" + +/datum/sprite_accessory/tail/special/xenosentinel + name = "xenomorph sentinel tail" + desc = "" + icon_state = "xenos_sentinel_tail_s" + +/datum/sprite_accessory/tail/special/xenohunter + name = "xenomorph hunter tail" + desc = "" + icon_state = "xenos_hunter_tail_s" + +/datum/sprite_accessory/tail/special/xenoqueen + name = "xenomorph queen tail" + desc = "" + icon_state = "xenos_queen_tail_s" + +/datum/sprite_accessory/tail/special/monkey + name = "monkey tail" + desc = "" + icon_state = "chimptail_s" + +/datum/sprite_accessory/tail/special/seromitail + name = "seromi tail" + desc = "" + icon_state = "seromitail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/seromitailfeathered + name = "seromi tail w/ feathers" + desc = "" + icon_state = "seromitail_s" + extra_overlay = "seromitail_feathers_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/unathihc + name = "unathi tail, colorable" + desc = "" + icon_state = "sogtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/tajaranhc + name = "tajaran tail, colorable" + desc = "" + icon_state = "tajtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/sergalhc + name = "sergal tail, colorable" + desc = "" + icon_state = "sergtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akulahc + name = "akula tail, colorable" + desc = "" + icon_state = "sharktail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevreanhc + name = "nevrean tail, colorable" + desc = "" + icon_state = "nevreantail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/foxhc + name = "highlander zorren tail, colorable" + desc = "" + icon_state = "foxtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/fennechc + name = "flatland zorren tail, colorable" + desc = "" + icon_state = "fentail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalishc + name = "armalis tail, colorable" + desc = "" + icon_state = "armalis_tail_humanoid_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenodronehc + name = "xenomorph drone tail, colorable" + desc = "" + icon_state = "xenos_drone_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenosentinelhc + name = "xenomorph sentinel tail, colorable" + desc = "" + icon_state = "xenos_sentinel_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenohunterhc + name = "xenomorph hunter tail, colorable" + desc = "" + icon_state = "xenos_hunter_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenoqueenhc + name = "xenomorph queen tail, colorable" + desc = "" + icon_state = "xenos_queen_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/monkeyhc + name = "monkey tail, colorable" + desc = "" + icon_state = "chimptail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/seromitailhc + name = "seromi tail, colorable" + desc = "" + icon_state = "seromitail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/seromitailfeatheredhc + name = "seromi tail w/ feathers, colorable" + desc = "" + icon_state = "seromitail_feathers_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/vulpan + name = "vulpkanin, colorable" + desc = "" + icon_state = "vulptail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + +/datum/sprite_accessory/tail/zenghu_taj + name = "Zeng-Hu Tajaran Synth tail" + desc = "" + icon_state = "zenghu_taj" + +//Taurs moved to a separate file due to extra code around them + +//Buggo Abdomens! + +/datum/sprite_accessory/tail/buggo + name = "Bug abdomen, colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobee + name = "Bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + +/datum/sprite_accessory/tail/buggobeefull + name = "Bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + +/datum/sprite_accessory/tail/buggounder + name = "Bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + +/datum/sprite_accessory/tail/buggofirefly + name = "Bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + +/datum/sprite_accessory/tail/buggofat + name = "Fat bug abdomen, colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggofatbee + name = "Fat bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggofatbeefull + name = "Fat bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggofatunder + name = "Fat bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofatfirefly + name = "Fat bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_markings" + +/datum/sprite_accessory/tail/buggowag + name = "Bug abdomen, colorable, vwag change" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobeewag + name = "Bug abdomen, bee top, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + extra_overlay_w = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggobeefullwag + name = "Bug abdomen, bee full, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + extra_overlay_w = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggounderwag + name = "Bug abdomen, underside, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + extra_overlay_w = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofireflywag + name = "Bug abdomen, firefly, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + extra_overlay_w = "buggofatfirefly_markings" + +//Vass buggo variants! + +/datum/sprite_accessory/tail/buggovass + name = "Bug abdomen, vass, colorable" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbee + name = "Bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefull + name = "Bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunder + name = "Bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfirefly + name = "Bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovassfat + name = "Fat bug abdomen, vass, colorable" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassfatbee + name = "Fat bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatbeefull + name = "Fat bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatunder + name = "Fat bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatfirefly + name = "Fat bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovasswag + name = "Bug abdomen, vass, colorable, vwag change" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbeewag + name = "Bug abdomen, bee top, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + extra_overlay_w = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefullwag + name = "Bug abdomen, bee full, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + extra_overlay_w = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunderwag + name = "Bug abdomen, underside, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + extra_overlay_w = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfireflywag + name = "Bug abdomen, firefly, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + extra_overlay_w = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/tail_smooth + name = "Smooth Lizard Tail, colorable" + desc = "" + icon_state = "tail_smooth" + ani_state = "tail_smooth_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/triplekitsune_colorable + name = "Kitsune 3 tails, colorable" + desc = "" + icon_state = "triplekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "triplekitsune_tips" + +/datum/sprite_accessory/tail/ninekitsune_colorable + name = "Kitsune 9 tails, colorable" + desc = "" + icon_state = "ninekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ninekitsune-tips" + +/datum/sprite_accessory/tail/shadekin_short + name = "Shadekin Short Tail, colorable" + desc = "" + icon_state = "shadekin-short" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts + name = "Ward-Takahashi Tail" + desc = "" + icon_state = "wardtakahashi_vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wartacosushi_tail_dc + name = "Ward-Takahashi Tail, dual-color" + desc = "" + icon_state = "wardtakahashi_vulp_dc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wardtakahashi_vulp_dc_mark" diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm similarity index 50% rename from code/modules/vore/appearance/sprite_accessories_vr.dm rename to code/modules/mob/new_player/sprite_accessories_tail_vr.dm index bcb0a09f6e..d76244aba7 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm @@ -1,945 +1,3 @@ -/* - Hello and welcome to VOREStation sprite_accessories: For a more general overview - please read sprite_accessories.dm. This file is for ears and tails. - This is intended to be friendly for people with little to no actual coding experience. - !!WARNING!!: changing existing accessory information can be VERY hazardous to savefiles, - to the point where you may completely corrupt a server's savefiles. Please refrain - from doing this unless you absolutely know what you are doing, and have defined a - conversion in savefile.dm -*/ - -// Add Additional variable onto sprite_accessory -/datum/sprite_accessory - // Ckey of person allowed to use this, if defined. - list/ckeys_allowed = null - apply_restrictions = FALSE //whether to apply restrictions for specific tails/ears/wings - -/* -//////////////////////////// -/ =--------------------= / -/ == Ear Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/ears - name = "You should not see this..." - icon = 'icons/mob/vore/ears_vr.dmi' - do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color - - color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/extra_overlay2 - var/desc = "You should not see this..." - -// Species-unique ears - -/datum/sprite_accessory/ears/shadekin - name = "Shadekin Ears, colorable" - desc = "" - icon_state = "shadekin" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -// 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 = "" - icon_state = "hyena" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "hyena-inner" - -/datum/sprite_accessory/ears/moth - name = "moth antennae" - desc = "" - icon_state = "moth" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/squirrel_orange - name = "squirel, orange" - desc = "" - icon_state = "squirrel-orange" - -/datum/sprite_accessory/ears/squirrel_red - name = "squirrel, red" - desc = "" - icon_state = "squirrel-red" - -/datum/sprite_accessory/ears/bunny_white - name = "bunny, white" - desc = "" - icon_state = "bunny" - -/datum/sprite_accessory/ears/bear_brown - name = "bear, brown" - desc = "" - icon_state = "bear-brown" - -/datum/sprite_accessory/ears/bear_panda - name = "bear, panda" - desc = "" - icon_state = "panda" - -/datum/sprite_accessory/ears/wolf_grey - name = "wolf, grey" - desc = "" - icon_state = "wolf-grey" - -/datum/sprite_accessory/ears/wolf_green - name = "wolf, green" - desc = "" - icon_state = "wolf-green" - -/datum/sprite_accessory/ears/wisewolf - name = "wolf, wise" - desc = "" - icon_state = "wolf-wise" - -/datum/sprite_accessory/ears/mouse_grey - name = "mouse, grey" - desc = "" - icon_state = "mouse-grey" - -/datum/sprite_accessory/ears/bee - name = "bee antennae" - desc = "" - icon_state = "bee" - -/datum/sprite_accessory/ears/antennae - name = "antennae, colorable" - desc = "" - icon_state = "antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/curly_bug - name = "curly antennae, colorable" - desc = "" - icon_state = "curly_bug" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/dual_robot - name = "synth antennae, colorable" - desc = "" - icon_state = "dual_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/right_robot - name = "right synth, colorable" - desc = "" - icon_state = "right_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/left_robot - name = "left synth, colorable" - desc = "" - icon_state = "left_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/oni_h1 - name = "oni horns" - desc = "" - icon_state = "oni-h1" - -/datum/sprite_accessory/ears/oni_h1_c - name = "oni horns, colorable" - desc = "" - icon_state = "oni-h1_c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/demon_horns1 - name = "demon horns" - desc = "" - icon_state = "demon-horns1" - -/datum/sprite_accessory/ears/demon_horns1_c - name = "demon horns, colorable" - desc = "" - icon_state = "demon-horns1_c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/demon_horns2 - name = "demon horns, colorable(outward)" - desc = "" - icon_state = "demon-horns2" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/dragon_horns - name = "dragon horns, colorable" - desc = "" - icon_state = "dragon-horns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/foxears - name = "highlander zorren ears" - desc = "" - icon_state = "foxears" - -/datum/sprite_accessory/ears/fenears - name = "flatland zorren ears" - desc = "" - icon_state = "fenears" - -/datum/sprite_accessory/ears/sergal //Redundant - name = "Sergal ears" - icon_state = "serg_plain_s" - -/datum/sprite_accessory/ears/foxearshc - name = "highlander zorren ears, colorable" - desc = "" - icon_state = "foxearshc" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/fenearshc - name = "flatland zorren ears, colorable" - desc = "" - icon_state = "fenearshc" - extra_overlay = "fenears-inner" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/sergalhc - name = "Sergal ears, colorable" - icon_state = "serg_plain_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/mousehc - name = "mouse, colorable" - desc = "" - icon_state = "mouse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "mouseinner" - -/datum/sprite_accessory/ears/mousehcno - name = "mouse, colorable, no inner" - desc = "" - icon_state = "mouse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/wolfhc - name = "wolf, colorable" - desc = "" - icon_state = "wolf" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "wolfinner" - -/datum/sprite_accessory/ears/bearhc - name = "bear, colorable" - desc = "" - icon_state = "bear" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/smallbear - name = "small bear" - desc = "" - icon_state = "smallbear" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/squirrelhc - name = "squirrel, colorable" - desc = "" - icon_state = "squirrel" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/kittyhc - name = "kitty, colorable" - desc = "" - icon_state = "kitty" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "kittyinner" - -/datum/sprite_accessory/ears/bunnyhc - name = "bunny, colorable" - desc = "" - icon_state = "bunny" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/antlers - name = "antlers" - desc = "" - icon_state = "antlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/antlers_e - name = "antlers with ears" - desc = "" - icon_state = "cow-nohorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "antlers_mark" - -/datum/sprite_accessory/ears/smallantlers - name = "small antlers" - desc = "" - icon_state = "smallantlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/smallantlers_e - name = "small antlers with ears" - desc = "" - icon_state = "smallantlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "deer" - -/datum/sprite_accessory/ears/deer - name = "deer ears" - desc = "" - icon_state = "deer" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/cow - name = "cow, horns" - desc = "" - icon_state = "cow" - -/datum/sprite_accessory/ears/cowc - name = "cow, horns, colorable" - desc = "" - icon_state = "cow-c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/cow_nohorns - name = "cow, no horns" - desc = "" - icon_state = "cow-nohorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/caprahorns - name = "caprine horns" - desc = "" - icon_state = "caprahorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/otie - name = "otie, colorable" - desc = "" - icon_state = "otie" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "otie-inner" - -/datum/sprite_accessory/ears/donkey - name = "donkey, colorable" - desc = "" - icon_state = "donkey" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "otie-inner" - -/datum/sprite_accessory/ears/zears - name = "jagged ears" - desc = "" - icon_state = "zears" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/elfs - name = "elven ears" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/sleek - name = "sleek ears" - desc = "" - icon_state = "sleek" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/drake - name = "drake frills" - desc = "" - icon_state = "drake" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/vulp - name = "vulpkanin, dual-color" - desc = "" - icon_state = "vulp" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulp-inner" - -/datum/sprite_accessory/ears/vulp_short - name = "vulpkanin short" - desc = "" - icon_state = "vulp_terrier" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/vulp_short_dc - name = "vulpkanin short, dual-color" - desc = "" - icon_state = "vulp_terrier" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulp_terrier-inner" - -/datum/sprite_accessory/ears/vulp_jackal - name = "vulpkanin thin, dual-color" - desc = "" - icon_state = "vulp_jackal" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulp_jackal-inner" - -/datum/sprite_accessory/ears/bunny_floppy - name = "floopy bunny ears (colorable)" - desc = "" - icon_state = "floppy_bun" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/teshari - name = "Teshari (colorable)" - desc = "" - icon_state = "teshari" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshariinner" - -/datum/sprite_accessory/ears/tesharihigh - name = "Teshari upper ears (colorable)" - desc = "" - icon_state = "tesharihigh" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tesharihighinner" - -/datum/sprite_accessory/ears/tesharilow - name = "Teshari lower ears (colorable)" - desc = "" - icon_state = "tesharilow" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tesharilowinner" - -/datum/sprite_accessory/ears/tesh_pattern_ear_male - name = "Teshari male ear pattern (colorable)" - desc = "" - icon_state = "teshari" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshari_male_pattern" - -/datum/sprite_accessory/ears/tesh_pattern_ear_female - name = "Teshari female ear pattern (colorable)" - desc = "" - icon_state = "teshari" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshari_female_pattern" - -/datum/sprite_accessory/ears/inkling - name = "colorable mature inkling hair" - desc = "" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "inkling-colorable" - color_blend_mode = ICON_MULTIPLY - do_colouration = 1 - -/datum/sprite_accessory/ears/large_dragon - name = "Large dragon horns" - desc = "" - icon_state = "big_liz" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -// Special snowflake ears go below here. - -/datum/sprite_accessory/ears/molenar_kitsune - name = "quintail kitsune ears (Molenar)" - desc = "" - icon_state = "molenar-kitsune" - -/datum/sprite_accessory/ears/lilimoth_antennae - name = "citheronia antennae (Kira72)" - desc = "" - icon_state = "lilimoth_antennae" - -/datum/sprite_accessory/ears/molenar_deathclaw - name = "deathclaw ears (Molenar)" - desc = "" - icon_state = "molenar-deathclaw" - -/datum/sprite_accessory/ears/miria_fluffdragon - name = "fluffdragon ears (Miria Masters)" - desc = "" - icon_state = "miria-fluffdragonears" - -/datum/sprite_accessory/ears/miria_kitsune - name = "kitsune ears (Miria Masters)" - desc = "" - icon_state = "miria-kitsuneears" - -/datum/sprite_accessory/ears/runac - name = "fennecsune ears (Runac)" - desc = "" - icon_state = "runac" - -/datum/sprite_accessory/ears/kerena - name = "wingwolf ears (Kerena)" - desc = "" - icon_state = "kerena" - -/datum/sprite_accessory/ears/rosey - name = "tritail kitsune ears (Rosey)" - desc = "" - icon_state = "rosey" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/aronai - name = "aronai ears/head (Aronai)" - desc = "" - icon_state = "aronai" - -/datum/sprite_accessory/ears/holly - name = "tigress ears (Holly Sharp)" - desc = "" - icon_state = "tigressears" - -/datum/sprite_accessory/ears/molenar_inkling - name = "teal mature inkling hair (Kari Akiren)" - desc = "" - icon_state = "molenar-tentacle" - -/datum/sprite_accessory/ears/shock - name = "pharoah hound ears (Shock Diamond)" - desc = "" - icon_state = "shock" - -/datum/sprite_accessory/ears/alurane - name = "alurane ears/hair (Pumila)" - desc = "" - icon_state = "alurane-ears" - -/datum/sprite_accessory/ears/frost - name = "Frost antenna" - desc = "" - icon_state = "frosted_tips" - -/datum/sprite_accessory/ears/sylv_pip - name = "sylveon ears and ribbons (Pip Shyner)" - desc = "" - icon_state = "pipears" - -/datum/sprite_accessory/ears/elf_caprine_colorable - name = "Caprine horns with pointy ears, colorable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "caprahorns" - -/datum/sprite_accessory/ears/elf_oni_colorable - name = "oni horns with pointy ears, colorable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "oni-h1_c" - -/datum/sprite_accessory/ears/elf_demon_colorable - name = "Demon horns with pointy ears, colorable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "demon-horns1_c" - -/datum/sprite_accessory/ears/elf_demon_outwards_colorable - name = "Demon horns with pointy ears, outwards, colourable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "demon-horns2" - -/datum/sprite_accessory/ears/elf_dragon_colorable - name = "Dragon horns with pointy ears, colourable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "dragon-horns" - -/datum/sprite_accessory/ears/synthhorns_plain - name = "Synth horns, plain" - desc = "" - icon_state = "synthhorns_plain" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "synthhorns_plain_light" - -/datum/sprite_accessory/ears/synthhorns_thick - name = "Synth horns, thick" - desc = "" - icon_state = "synthhorns_thick" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "synthhorns_thick_light" - -/datum/sprite_accessory/ears/synthhorns_curly - name = "Synth horns, curly" - desc = "" - icon_state = "synthhorns_curled" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/forward_curled_demon_horns_bony - name = "Succubus horns, colourable" - desc = "" - icon_state = "succu-horns_b" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/forward_curled_demon_horns_bony_with_colorable_ears - name = "Succubus horns with pointy ears, colourable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "succu-horns_b" - -/datum/sprite_accessory/ears/chorns_nubbydogs - name = "Nubby Chorns" - desc = "" - icon_state = "chorn_nubby" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_herk - name = "Herk Chorns" - desc = "" - icon_state = "chorn_herk" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_bork - name = "Bork Chorns" - desc = "" - icon_state = "chorn_bork" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_bull - name = "Bull Chorns" - desc = "" - icon_state = "chorn_bull" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_bicarrot - name = "Bicarrot Chorns" - desc = "" - icon_state = "chorn_bicarrot" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_longcarrot - name = "Long Carrot Chorns" - desc = "" - icon_state = "chorn_longcarrot" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_shortcarrot - name = "Short Carrot Chorns" - desc = "" - icon_state = "chorn_shortcarrot" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_scorp - name = "Scorp Chorns" - desc = "" - icon_state = "chorn_scorp" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_ocean - name = "Ocean Chorns" - desc = "" - icon_state = "chorn_ocean" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_chub - name = "Chub Chorns" - desc = "" - icon_state = "chorn_chub" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - - - - -/* -//////////////////////////// -/ =--------------------= / -/ == Wing Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/wing - name = "You should not see this..." - icon = 'icons/mob/vore/wings_vr.dmi' - do_colouration = 0 //Set to 1 to enable coloration using the tail color. - - color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/extra_overlay2 //Tertiary. - var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it. If the clothing is bulky enough to hide a tail, it should also hide wings. - // var/show_species_tail = 1 // Just so // TODO - Seems not needed ~Leshana - var/desc = "You should not see this..." - var/ani_state // State when flapping/animated - var/extra_overlay_w // Flapping state for extra overlay - var/extra_overlay2_w - -/datum/sprite_accessory/wing/shock //Unable to split the tail from the wings in the sprite, so let's just classify it as wings. - name = "pharoah hound tail (Shock Diamond)" - desc = "" - icon_state = "shock" - -/datum/sprite_accessory/wing/featheredlarge //Made by Natje! - name = "large feathered wings (colorable)" - desc = "" - icon_state = "feathered2" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here. - name = "spider legs" - desc = "" - icon_state = "spider-legs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/moth - name = "moth wings" - desc = "" - icon_state = "moth" - -/datum/sprite_accessory/wing/mothc - name = "moth wings, colorable" - desc = "" - icon_state = "moth" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/dragonfly - name = "dragonfly" - desc = "" - icon_state = "dragonfly" - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/citheroniamoth - name = "citheronia wings" - desc = "" - icon_state = "citheronia_wings" - -/datum/sprite_accessory/wing/feathered - name = "feathered wings, colorable" - desc = "" - icon_state = "feathered" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/feathered_medium - name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys. - desc = "" - icon_state = "feathered3" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/bat_black - name = "bat wings, black" - desc = "" - icon_state = "bat-black" - -/datum/sprite_accessory/wing/bat_color - name = "bat wings, colorable" - desc = "" - icon_state = "bat-color" - do_colouration = 1 - -/datum/sprite_accessory/wing/bat_red - name = "bat wings, red" - desc = "" - icon_state = "bat-red" - -/datum/sprite_accessory/wing/harpywings - name = "harpy wings, colorable" - desc = "" - icon_state = "harpywings" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/harpywings_alt - name = "harpy wings alt, archeopteryx" - desc = "" - icon_state = "harpywings_alt" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_altmarkings" - -/datum/sprite_accessory/wing/harpywings_alt_neckfur - name = "harpy wings alt, archeopteryx & neckfur" - desc = "" - icon_state = "harpywings_alt" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_altmarkings" - extra_overlay2 = "neckfur" - -/datum/sprite_accessory/wing/harpywings_bat - name = "harpy wings, bat" - desc = "" - icon_state = "harpywings_bat" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_batmarkings" - -/datum/sprite_accessory/wing/harpywings_bat_neckfur - name = "harpy wings, bat & neckfur" - desc = "" - icon_state = "harpywings_bat" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_batmarkings" - extra_overlay2 = "neckfur" - -/datum/sprite_accessory/wing/neckfur - name = "neck fur" - desc = "" - icon_state = "neckfur" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/feathered - name = "feathered wings, colorable" - desc = "" - icon_state = "feathered" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/beewings - name = "bee wings" - desc = "" - icon_state = "beewings" - -/datum/sprite_accessory/wing/sepulchre - name = "demon wings (Sepulchre)" - desc = "" - icon_state = "sepulchre_wings" - -/datum/sprite_accessory/wing/miria_fluffdragon - name = "fluffdragon wings (Miria Masters)" - desc = "" - icon_state = "miria-fluffdragontail" - -/datum/sprite_accessory/wing/scree - name = "green taj wings (Scree)" - desc = "" - icon_state = "scree-wings" - -/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings? - name = "gazer eyestalks" - desc = "" - icon_state = "liquidfirefly-eyestalks" - -/datum/sprite_accessory/wing/moth_full - name = "moth antenna and wings" - desc = "" - icon_state = "moth_full" - -/datum/sprite_accessory/wing/moth_full_gray - name = "moth antenna and wings, colorable" - desc = "" - icon_state = "moth_full_gray" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/kerena - name = "wingwolf wings (Kerena)" - desc = "" - icon_state = "kerena-wings" - -/datum/sprite_accessory/wing/snag - name = "xenomorph backplate" - desc = "" - icon_state = "snag-backplate" - -/datum/sprite_accessory/wing/sepulchre_c_yw - name = "demon wings (colorable)" - desc = "" - icon_state = "sepulchre_wingsc" - do_colouration = 1 - -/datum/sprite_accessory/wing/cyberdragon - name = "Cyber dragon wing (colorable)" - desc = "" - icon_state = "cyberdragon_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/cyberdragon_red - name = "Cyber dragon wing (red)" - desc = "" - icon_state = "cyberdragon_red_s" - do_colouration = 0 - -/datum/sprite_accessory/wing/cyberdoe - name = "Cyber doe wing" - desc = "" - icon_state = "cyberdoe_s" - do_colouration = 0 - -/datum/sprite_accessory/wing/drago_wing - name = "Cybernetic Dragon wings" - desc = "" - icon_state = "drago_wing" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "drago_wing_2" - /* //////////////////////////// / =--------------------= / @@ -951,20 +9,7 @@ name = "You should not see this..." icon = 'icons/mob/vore/tails_vr.dmi' do_colouration = 0 //Set to 1 to enable coloration using the tail color. - - color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/extra_overlay2 //Tertiary. - var/show_species_tail = 0 // If false, do not render species' tail. - var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it - var/desc = "You should not see this..." - var/ani_state // State when wagging/animated - var/extra_overlay_w // Wagging state for extra overlay - var/extra_overlay2_w // Tertiary wagging. - var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff. - var/icon/clip_mask_icon = null //Icon file used for clip mask. - var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits. - var/icon/clip_mask = null //Instantiated clip mask of given icon and state + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use /datum/sprite_accessory/tail/New() . = ..() @@ -1201,36 +246,43 @@ name = "quintail kitsune tails (Molenar)" desc = "" icon_state = "molenar-kitsune" + ckeys_allowed = list("molenar") /datum/sprite_accessory/tail/miria_fluffdragon name = "fluffdragon tail (Miria Masters)" desc = "" icon_state = "miria-fluffdragontail" + ckeys_allowed = list("miriamasters") /datum/sprite_accessory/tail/miria_kitsune name = "Black kitsune tails (Miria Masters)" desc = "" icon_state = "miria-kitsunetail" + ckeys_allowed = list("miriamasters") /datum/sprite_accessory/tail/molenar_deathclaw name = "deathclaw bits (Molenar)" desc = "" icon_state = "molenar-deathclaw" + ckeys_allowed = list("molenar","silvertalismen","jertheace") /datum/sprite_accessory/tail/runac name = "fennecsune tails (Runac)" desc = "" icon_state = "runac" + ckeys_allowed = list("rebcom1807") /datum/sprite_accessory/tail/reika //Leaving this since it was too hard to split the wings from the tail. name = "fox tail (+ beewings) (Reika)" desc = "" icon_state = "reika" + ckeys_allowed = list("rikaru19xjenkins") /datum/sprite_accessory/tail/rosey name = "tritail kitsune tails (Rosey)" desc = "" icon_state = "rosey_three" + ckeys_allowed = list("joey4298") /datum/sprite_accessory/tail/rosey2 name = "pentatail kitsune tails (Rosey)" //I predict seven tails next. ~CK @@ -1238,32 +290,38 @@ icon_state = "rosey_five" do_colouration = 1 color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("joey4298") /datum/sprite_accessory/tail/scree name = "green taj tail (Scree)" desc = "" icon_state = "scree" + ckeys_allowed = list("scree") /datum/sprite_accessory/tail/aronai name = "aronai tail (Aronai)" desc = "" icon_state = "aronai" + ckeys_allowed = list("arokha") /datum/sprite_accessory/tail/cabletail name = "cabletail" desc = "cabletail" icon_state = "cabletail" + ckeys_allowed = list("tucker0666") /datum/sprite_accessory/tail/featherfluff_tail name = "featherfluff_tail" desc = "" icon_state = "featherfluff_tail" + ckeys_allowed = list("tucker0666") /datum/sprite_accessory/tail/ketrai_wag name = "fennix tail (vwag)" desc = "" icon_state = "ketraitail" ani_state = "ketraitail_w" + //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone. /datum/sprite_accessory/tail/ketrainew_wag name = "new fennix tail (vwag)" @@ -1288,6 +346,7 @@ name = "tigress tail (Holly)" desc = "" icon_state = "tigresstail" + ckeys_allowed = list("hoodoo") /datum/sprite_accessory/tail/satyr name = "goat legs, colorable" @@ -1927,6 +986,8 @@ icon_state = "shadekin-short" do_colouration = 1 color_blend_mode = ICON_MULTIPLY + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) /datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts name = "Ward-Takahashi Tail" @@ -2077,30 +1138,3 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY ckeys_allowed = list("prettiebyrd") - -/* -//////////////////////////// -/ =--------------------= / -/ == Misc Definitions == / -/ =--------------------= / -//////////////////////////// -*/ - -// Yes, I have to add all of this just to make some glowy hair. -// No, this isn't a character creation option, but... I guess in the future it could be, if anyone wants that? - -/datum/sprite_accessory/hair_accessory - name = "You should not see this..." - icon = 'icons/mob/vore/hair_accessories_vr.dmi' - do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color - - var/ignores_lighting = 0 // Whether or not this hair accessory will ignore lighting and glow in the dark. - color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/desc = "You should not see this..." - -/datum/sprite_accessory/hair_accessory/verie_hair_glow //CHOMP Comment: Leaving the name Verie here because I cannot be arsed to change it in other code - name = "hair glow" //CHOMP Edit: removed the name Verie - desc = "" - icon_state = "verie_hair_glow" //CHOMP Comment: Leaving the name Verie here because I cannot be arsed to change the .dmi - ignores_lighting = 1 - //ckeys_allowed = list("vitoras") // This probably won't come into play EVER but better safe than sorry diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm new file mode 100644 index 0000000000..748a6904b4 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_taur.dm @@ -0,0 +1,349 @@ +/datum/riding/taur + keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack! + nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. + key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. + only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. + +/datum/riding/taur/handle_vehicle_layer() + if(ridden.has_buckled_mobs()) + ridden.layer = initial(ridden.layer) + else + var/mob/living/L = ridden + if(!(istype(L) && (L.status_flags & HIDING))) + ridden.layer = initial(ridden.layer) + +/datum/riding/taur/ride_check(mob/living/M) + var/mob/living/L = ridden + if(L.stat) + force_dismount(M) + return FALSE + return TRUE + +/datum/riding/taur/force_dismount(mob/M) + . = ..() + ridden.visible_message("[M] stops riding [ridden]!") + +//Hoooo boy. +/datum/riding/taur/get_offsets(pass_index) // list(dir = x, y, layer) + var/mob/living/L = ridden + var/scale_x = L.icon_scale_x + var/scale_y = L.icon_scale_y + + var/list/values = list( + "[NORTH]" = list(0, 8*scale_y, ABOVE_MOB_LAYER), + "[SOUTH]" = list(0, 8*scale_y, BELOW_MOB_LAYER), + "[EAST]" = list(-10*scale_x, 8*scale_y, ABOVE_MOB_LAYER), + "[WEST]" = list(10*scale_x, 8*scale_y, ABOVE_MOB_LAYER)) + + return values + +//Human overrides for taur riding +/mob/living/carbon/human + max_buckled_mobs = 1 //Yeehaw + can_buckle = TRUE + buckle_movable = TRUE + buckle_lying = FALSE + +/mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE) + if(forced) + return ..() // Skip our checks + if(!isTaurTail(tail_style)) + return FALSE + else + var/datum/sprite_accessory/tail/taur/taurtype = tail_style + if(!taurtype.can_ride) + return FALSE + if(lying) + return FALSE + if(!ishuman(M)) + return FALSE + if(M in buckled_mobs) + return FALSE +// if(M.size_multiplier > size_multiplier * 1.2) +// to_chat(M,"This isn't a pony show! You need to be bigger for them to ride.") +// return FALSE + if(M.loc != src.loc) + if(M.Adjacent(src)) + M.forceMove(get_turf(src)) + + var/mob/living/carbon/human/H = M + + if(isTaurTail(H.tail_style)) + to_chat(src,"Too many legs. TOO MANY LEGS!!") + return FALSE + + . = ..() + if(.) + buckled_mobs[M] = "riding" + +/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use. + return + +/mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1)) + set name = "Taur Mount/Dismount" + set category = "Abilities" + set desc = "Let people ride on you." + + if(LAZYLEN(buckled_mobs)) + var/datum/riding/R = riding_datum + for(var/rider in buckled_mobs) + R.force_dismount(rider) + return + if (stat != CONSCIOUS) + return + if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled) + return + if(buckle_mob(M)) + visible_message("[M] starts riding [name]!") + +/mob/living/carbon/human/attack_hand(mob/user as mob) + if(LAZYLEN(buckled_mobs)) + //We're getting off! + if(user in buckled_mobs) + riding_datum.force_dismount(user) + //We're kicking everyone off! + if(user == src) + for(var/rider in buckled_mobs) + riding_datum.force_dismount(rider) + else + . = ..() + +/* +//////////////////////////// +/ =--------------------= / +/ == Taur Definitions == / +/ =--------------------= / +//////////////////////////// +*/ + +// Taur sprites are now a subtype of tail since they are mutually exclusive anyway. + +/datum/sprite_accessory/tail/taur + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/taurs.dmi' + do_colouration = 1 // Yes color, using tail color + color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY + + var/icon/suit_sprites = null //File for suit sprites, if any. + var/icon/under_sprites = null + + var/icon_sprite_tag // This is where we put stuff like _Horse, so we can assign icons easier. + + var/can_ride = FALSE //whether we're real rideable taur or just in that category. + + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/human_races/sprite_accessories/taurs.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. + +// Species-unique long tails/taurhalves + +// Tails/taurhalves for everyone + +/datum/sprite_accessory/tail/taur/wolf + name = "Wolf (Taur)" + icon_state = "wolf_s" + under_sprites = 'icons/mob/taursuits_wolf.dmi' + suit_sprites = 'icons/mob/taursuits_wolf.dmi' + icon_sprite_tag = "wolf" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/fatwolf + name = "Fat Wolf (Taur)" + icon_state = "fatwolf_s" + icon_sprite_tag = "wolf" //This could be modified later. + +/datum/sprite_accessory/tail/taur/wolf/wolf_2c + name = "Wolf dual-color (Taur)" + icon_state = "wolf_s" + extra_overlay = "wolf_markings" + //icon_sprite_tag = "wolf2c" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c + name = "Fat Wolf dual-color (Taur)" + icon_state = "fatwolf_s" + extra_overlay = "fatwolf_markings" + //icon_sprite_tag = "fatwolf2c" + +/datum/sprite_accessory/tail/taur/wolf/synthwolf + name = "SynthWolf dual-color (Taur)" + icon_state = "synthwolf_s" + extra_overlay = "synthwolf_markings" + //icon_sprite_tag = "synthwolf" + +/datum/sprite_accessory/tail/taur/naga + name = "Naga (Taur)" + icon_state = "naga_s" + suit_sprites = 'icons/mob/taursuits_naga.dmi' + //icon_sprite_tag = "naga" + +/datum/sprite_accessory/tail/taur/naga/naga_2c + name = "Naga dual-color (Taur)" + icon_state = "naga_s" + extra_overlay = "naga_markings" + //icon_sprite_tag = "naga2c" + +/datum/sprite_accessory/tail/taur/horse + name = "Horse (Taur)" + icon_state = "horse_s" + under_sprites = 'icons/mob/taursuits_horse.dmi' + suit_sprites = 'icons/mob/taursuits_horse.dmi' + icon_sprite_tag = "horse" + +/datum/sprite_accessory/tail/taur/horse/synthhorse + name = "SynthHorse dual-color (Taur)" + icon_state = "synthhorse_s" + extra_overlay = "synthhorse_markings" + //icon_sprite_tag = "synthhorse" + +/datum/sprite_accessory/tail/taur/cow + name = "Cow (Taur)" + icon_state = "cow_s" + suit_sprites = 'icons/mob/taursuits_cow.dmi' + icon_sprite_tag = "cow" + +/datum/sprite_accessory/tail/taur/deer + name = "Deer dual-color (Taur)" + icon_state = "deer_s" + extra_overlay = "deer_markings" + suit_sprites = 'icons/mob/taursuits_deer.dmi' + icon_sprite_tag = "deer" + +/datum/sprite_accessory/tail/taur/lizard + name = "Lizard (Taur)" + icon_state = "lizard_s" + suit_sprites = 'icons/mob/taursuits_lizard.dmi' + icon_sprite_tag = "lizard" + +/datum/sprite_accessory/tail/taur/lizard/lizard_2c + name = "Lizard dual-color (Taur)" + icon_state = "lizard_s" + extra_overlay = "lizard_markings" + //icon_sprite_tag = "lizard2c" + +/datum/sprite_accessory/tail/taur/lizard/synthlizard + name = "SynthLizard dual-color (Taur)" + icon_state = "synthlizard_s" + extra_overlay = "synthlizard_markings" + //icon_sprite_tag = "synthlizard" + +/datum/sprite_accessory/tail/taur/spider + name = "Spider (Taur)" + icon_state = "spider_s" + suit_sprites = 'icons/mob/taursuits_spider.dmi' + icon_sprite_tag = "spider" + +/datum/sprite_accessory/tail/taur/tents + name = "Tentacles (Taur)" + icon_state = "tent_s" + icon_sprite_tag = "tentacle" + can_ride = 0 + +/datum/sprite_accessory/tail/taur/feline + name = "Feline (Taur)" + icon_state = "feline_s" + suit_sprites = 'icons/mob/taursuits_feline.dmi' + icon_sprite_tag = "feline" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/fatfeline + name = "Fat Feline (Taur)" + icon_state = "fatfeline_s" + //icon_sprite_tag = "fatfeline" + +/datum/sprite_accessory/tail/taur/fatfeline_wag + name = "Fat Feline (Taur) (vwag)" + icon_state = "fatfeline_s" + ani_state = "fatfeline_w" + +/datum/sprite_accessory/tail/taur/feline/feline_2c + name = "Feline dual-color (Taur)" + icon_state = "feline_s" + extra_overlay = "feline_markings" + //icon_sprite_tag = "feline2c" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/feline/fatfeline_2c + name = "Fat Feline dual-color (Taur)" + icon_state = "fatfeline_s" + extra_overlay = "fatfeline_markings" + //icon_sprite_tag = "fatfeline2c" + +/datum/sprite_accessory/tail/taur/feline/synthfeline + name = "SynthFeline dual-color (Taur)" + icon_state = "synthfeline_s" + extra_overlay = "synthfeline_markings" + //icon_sprite_tag = "synthfeline" + +/datum/sprite_accessory/tail/taur/slug + name = "Slug (Taur)" + icon_state = "slug_s" + suit_sprites = 'icons/mob/taursuits_slug.dmi' + icon_sprite_tag = "slug" + +/datum/sprite_accessory/tail/taur/frog + name = "Frog (Taur)" + icon_state = "frog_s" + icon_sprite_tag = "frog" + +/datum/sprite_accessory/tail/taur/thicktentacles + name = "Thick Tentacles (Taur)" + icon_state = "tentacle_s" + can_ride = 0 + icon_sprite_tag = "thick_tentacles" + +/datum/sprite_accessory/tail/taur/drake //Enabling on request, no suit compatibility but then again see 2 above. + name = "Drake (Taur)" + icon_state = "drake_s" + extra_overlay = "drake_markings" + suit_sprites = 'icons/mob/taursuits_drake.dmi' + icon_sprite_tag = "drake" + +/datum/sprite_accessory/tail/taur/otie + name = "Otie (Taur)" + icon_state = "otie_s" + extra_overlay = "otie_markings" + suit_sprites = 'icons/mob/taursuits_otie.dmi' + icon_sprite_tag = "otie" + +/datum/sprite_accessory/tail/taur/alraune/alraune_2c + name = "Alraune (dual color)" + icon_state = "alraunecolor_s" + ani_state = "alraunecolor_closed_s" + ckeys_allowed = null + do_colouration = 1 + extra_overlay = "alraunecolor_markings" + extra_overlay_w = "alraunecolor_closed_markings" + clip_mask_state = "taur_clip_mask_alraune" + icon_sprite_tag = "alraune" + +/datum/sprite_accessory/tail/taur/wasp + name = "Wasp (dual color)" + icon_state = "wasp_s" + extra_overlay = "wasp_markings" + clip_mask_state = "taur_clip_mask_wasp" + icon_sprite_tag = "wasp" + +/datum/sprite_accessory/tail/taur/mermaid + name = "Mermaid (Taur)" + icon_state = "mermaid_s" + can_ride = 0 + icon_sprite_tag = "mermaid" + +/datum/sprite_accessory/tail/taur/shadekin_tail + name = "Shadekin Tail" + icon_state = "shadekin_s" + can_ride = 0 + hide_body_parts = null + clip_mask_icon = null + clip_mask_state = null + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_2c + name = "Shadekin Tail (dual color)" + extra_overlay = "shadekin_markings" + +/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_long + name = "Shadekin Long Tail" + icon_state = "shadekin_long_s" diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm similarity index 88% rename from code/modules/vore/appearance/sprite_accessories_taur_vr.dm rename to code/modules/mob/new_player/sprite_accessories_taur_vr.dm index e1879c627f..c9e451c625 100644 --- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm @@ -1,117 +1,3 @@ -/datum/riding/taur - keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! - nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. - key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. - only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. - -/datum/riding/taur/handle_vehicle_layer() - if(ridden.has_buckled_mobs()) - ridden.layer = initial(ridden.layer) - else - var/mob/living/L = ridden - if(!(istype(L) && (L.status_flags & HIDING))) - ridden.layer = initial(ridden.layer) - -/datum/riding/taur/ride_check(mob/living/M) - var/mob/living/L = ridden - if(L.stat) - force_dismount(M) - return FALSE - return TRUE - -/datum/riding/taur/force_dismount(mob/M) - . = ..() - ridden.visible_message("[M] stops riding [ridden]!") - -//Hoooo boy. -/datum/riding/taur/get_offsets(pass_index) // list(dir = x, y, layer) - var/mob/living/L = ridden - var/scale = L.size_multiplier - - var/list/values = list( - "[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER), - "[SOUTH]" = list(0, 8*scale, BELOW_MOB_LAYER), - "[EAST]" = list(-10*scale, 8*scale, ABOVE_MOB_LAYER), - "[WEST]" = list(10*scale, 8*scale, ABOVE_MOB_LAYER)) - - return values - -//Human overrides for taur riding -/mob/living/carbon/human - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - -/mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE) - if(forced) - return ..() // Skip our checks - if(!isTaurTail(tail_style)) - return FALSE - else - var/datum/sprite_accessory/tail/taur/taurtype = tail_style - if(!taurtype.can_ride) - return FALSE - if(lying) - return FALSE - if(!ishuman(M)) - return FALSE - if(M in buckled_mobs) - return FALSE - if(M.size_multiplier > size_multiplier * 1.2) - to_chat(M,"This isn't a pony show! You need to be bigger for them to ride.") - return FALSE - if(M.loc != src.loc) - if(M.Adjacent(src)) - M.forceMove(get_turf(src)) - - var/mob/living/carbon/human/H = M - - if(isTaurTail(H.tail_style)) - var/datum/sprite_accessory/tail/taur/ridertype = H.tail_style - if(ridertype.can_ride) - if(istype(ridertype, /datum/sprite_accessory/tail/taur/naga) || istype(ridertype, /datum/sprite_accessory/tail/taur/slug)) - to_chat(src,"Too few legs. TOO FEW LEGS!!") - return FALSE - to_chat(src,"Too many legs. TOO MANY LEGS!!") - return FALSE - - . = ..() - if(.) - buckled_mobs[M] = "riding" - -/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use. - return - -/mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1)) - set name = "Taur Mount/Dismount" - set category = "Abilities" - set desc = "Let people ride on you." - - if(LAZYLEN(buckled_mobs)) - var/datum/riding/R = riding_datum - for(var/rider in buckled_mobs) - R.force_dismount(rider) - return - if (stat != CONSCIOUS) - return - if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled) - return - if(buckle_mob(M)) - visible_message("[M] starts riding [name]!") - -/mob/living/carbon/human/attack_hand(mob/user as mob) - if(LAZYLEN(buckled_mobs)) - //We're getting off! - if(user in buckled_mobs) - riding_datum.force_dismount(user) - //We're kicking everyone off! - if(user == src) - for(var/rider in buckled_mobs) - riding_datum.force_dismount(rider) - else - . = ..() - /* //////////////////////////// / =--------------------= / @@ -128,12 +14,7 @@ do_colouration = 1 // Yes color, using tail color color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY - var/icon/suit_sprites = null //File for suit sprites, if any. - var/icon/under_sprites = null - - var/icon_sprite_tag // This is where we put stuff like _Horse, so we can assign icons easier. - - var/can_ride = 1 //whether we're real rideable taur or just in that category + can_ride = TRUE //whether we're real rideable taur or just in that category //Could do nested lists but it started becoming a nightmare. It'd be more fun for lookups of a_intent and m_intent, but then subtypes need to //duplicate all the messages, and it starts getting awkward. These are singletons, anyway! diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 663b8b8c2d..ce783bcddb 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -603,739 +603,29 @@ species_allowed = list(SPECIES_VULPKANIN) gender = NEUTER -//VOREStation Body Markings and Overrides -//Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD - -/datum/sprite_accessory/marking //Override for base markings - color_blend_mode = ICON_ADD - -/datum/sprite_accessory/marking/vr - icon = 'icons/mob/human_races/markings_vr.dmi' - - vulp_belly - name = "belly fur (Vulp)" - icon_state = "vulp_belly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - vulp_fullbelly - name = "full belly fur (Vulp)" - icon_state = "vulp_fullbelly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - vulp_crest - name = "belly crest (Vulp)" - icon_state = "vulp_crest" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - vulp_nose - name = "nose (Vulp)" - icon_state = "vulp_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_short_nose - name = "nose, short (Vulp)" - icon_state = "vulp_short_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - snoutstripe - name = "snout stripe (Vulp)" - icon_state = "snoutstripe" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_face - name = "face (Vulp)" - icon_state = "vulp_face" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_facealt - name = "face, alt. (Vulp)" - icon_state = "vulp_facealt" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_earsface - name = "ears and face (Vulp)" - icon_state = "vulp_earsface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_all - name = "all head highlights (Vulp)" - icon_state = "vulp_all" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sergal_full - name = "Sergal Markings" - icon_state = "sergal_full" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - species_allowed = list("Sergal") - - sergal_full_female - name = "Sergal Markings (Female)" - icon_state = "sergal_full_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - species_allowed = list("Sergal") - - monoeye - name = "Monoeye" - icon_state = "monoeye" - body_parts = list(BP_HEAD) - - spidereyes - name = "Spider Eyes" - icon_state = "spidereyes" - body_parts = list(BP_HEAD) - - sergaleyes - name = "Sergal Eyes" - icon_state = "eyes_sergal" - body_parts = list(BP_HEAD) - - closedeyes - name = "Closed Eyes" - icon_state = "eyes_closed" - body_parts = list(BP_HEAD) - - brows - name = "Eyebrows" - icon_state = "brows" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - nevrean_female - name = "Female Nevrean beak" - icon_state = "nevrean_f" - body_parts = list(BP_HEAD) - color_blend_mode = ICON_MULTIPLY - gender = FEMALE - - nevrean_male - name = "Male Nevrean beak" - icon_state = "nevrean_m" - body_parts = list(BP_HEAD) - color_blend_mode = ICON_MULTIPLY - gender = MALE - - spots - name = "Spots" - icon_state = "spots" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) - - shaggy_mane - name = "Shaggy mane/feathers" - icon_state = "shaggy" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO) - - jagged_teeth - name = "Jagged teeth" - icon_state = "jagged" - body_parts = list(BP_HEAD) - - blank_face - name = "Blank round face (use with monster mouth)" - icon_state = "blankface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - monster_mouth - name = "Monster mouth" - icon_state = "monster" - body_parts = list(BP_HEAD) - - saber_teeth - name = "Saber teeth" - icon_state = "saber" - body_parts = list(BP_HEAD) - - fangs - name = "Fangs" - icon_state = "fangs" - body_parts = list(BP_HEAD) - - tusks - name = "Tusks" - icon_state = "tusks" - body_parts = list(BP_HEAD) - - otie_face - name = "Otie face" - icon_state = "otieface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otie_nose - name = "Otie nose" - icon_state = "otie_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otienose_lite - name = "Short otie nose" - icon_state = "otienose_lite" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - backstripes - name = "Back stripes" - icon_state = "otiestripes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_HEAD) - - belly_butt - name = "Belly and butt" - icon_state = "bellyandbutt" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN,BP_TORSO) - - fingers_toes - name = "Fingers and toes" - icon_state = "fingerstoes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) - - otie_socks - name = "Fingerless socks" - icon_state = "otiesocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - - corvid_beak - name = "Corvid beak" - icon_state = "corvidbeak" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - corvid_belly - name = "Corvid belly" - icon_state = "corvidbelly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD) - - cow_body - name = "Cow markings" - icon_state = "cowbody" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - cow_nose - name = "Cow nose" - icon_state = "cownose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - zmask - name = "Eye mask" - icon_state = "zmask" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - zbody - name = "Thick jagged stripes" - icon_state = "zbody" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO) - - znose - name = "Jagged snout" - icon_state = "znose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otter_nose - name = "Otter nose" - icon_state = "otternose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otter_face - name = "Otter face" - icon_state = "otterface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - deer_face - name = "Deer face" - icon_state = "deerface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sharkface - name = "Akula snout" - icon_state = "sharkface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sheppy_face - name = "Shepherd snout" - icon_state = "shepface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sheppy_back - name = "Shepherd back" - icon_state = "shepback" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - zorren_belly_male - name = "Zorren Male Torso" - icon_state = "zorren_belly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - zorren_belly_female - name = "Zorren Female Torso" - icon_state = "zorren_belly_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - zorren_back_patch - name = "Zorren Back Patch" - icon_state = "zorren_backpatch" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO) - - zorren_face_male - name = "Zorren Male Face" - icon_state = "zorren_face" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = MALE - - zorren_face_female - name = "Zorren Female Face" - icon_state = "zorren_face_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = FEMALE - - zorren_muzzle_male - name = "Zorren Male Muzzle" - icon_state = "zorren_muzzle" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = MALE - - zorren_muzzle_female - name = "Zorren Female Muzzle" - icon_state = "zorren_muzzle_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = FEMALE - - zorren_socks - name = "Zorren Socks" - icon_state = "zorren_socks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - - zorren_longsocks - name = "Zorren Longsocks" - icon_state = "zorren_longsocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - - tesh_feathers - name = "Teshari Feathers" - icon_state = "tesh-feathers" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) - - harpy_feathers - name = "Rapala leg Feather" - icon_state = "harpy-feathers" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG) - - harpy_legs - name = "Rapala leg coloring" - icon_state = "harpy-leg" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) - - chooves - name = "Cloven hooves" - icon_state = "chooves" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT) - - alurane - name = "Alurane Body" - icon_state = "alurane" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - ckeys_allowed = list("natje") - - body_tone - name = "Body toning (for emergency contrast loss)" - icon_state = "btone" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) - - gloss - name = "Full body gloss" - icon_state = "gloss" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - eboop_panels - name = "Eggnerd FBP panels" - icon_state = "eboop" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - osocks_rarm - name = "Modular Longsock (right arm)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_R_ARM,BP_R_HAND) - - osocks_larm - name = "Modular Longsock (left arm)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_ARM,BP_L_HAND) - - osocks_rleg - name = "Modular Longsock (right leg)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_R_FOOT,BP_R_LEG) - - osocks_lleg - name = "Modular Longsock (left leg)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_L_LEG) - - animeeyesinner - name = "Anime Eyes Inner" - icon_state = "animeeyesinner" - body_parts = list(BP_HEAD) - - animeeyesouter - name = "Anime Eyes Outer" - icon_state = "animeeyesouter" - body_parts = list(BP_HEAD) - - panda_eye_marks - name = "Panda Eye Markings" - icon_state = "eyes_panda" - body_parts = list(BP_HEAD) - species_allowed = list("Human") - - catwomantorso - name = "Catwoman chest stripes" - icon_state = "catwomanchest" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO) - - catwomangroin - name = "Catwoman groin stripes" - icon_state = "catwomangroin" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN) - - catwoman_rleg - name = "Catwoman right leg stripes" - icon_state = "catwomanright" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_R_LEG) - - catwoman_lleg - name = "Catwoman left leg stripes" - icon_state = "catwomanleft" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG) - - teshi_small_feathers - name = "Teshari small wingfeathers" - icon_state = "teshi_sf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) - - spirit_lights - name = "Ward - Spirit FBP Lights" - icon_state = "lights" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD) - - spirit_lights_body - name = "Ward - Spirit FBP Lights (body)" - icon_state = "lights" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO) - - spirit_lights_head - name = "Ward - Spirit FBP Lights (head)" - icon_state = "lights" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - spirit_panels - name = "Ward - Spirit FBP Panels" - icon_state = "panels" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - spirit_panels_body - name = "Ward - Spirit FBP Panels (body)" - icon_state = "panels" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) - - spirit_panels_head - name = "Ward - Spirit FBP Panels (head)" - icon_state = "panels" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - tentacle_head - name = "Squid Head" - icon_state = "tentaclehead" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - tentacle_mouth - name = "Tentacle Mouth" - icon_state = "tentaclemouth" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - rosette - name = "Rosettes" - icon_state = "rosette" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - werewolf_nose - name = "Werewolf nose" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_WEREBEAST) - - werewolf_face - name = "Werewolf face" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_WEREBEAST) - - werewolf_belly - name = "Werewolf belly" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN,BP_TORSO) - species_allowed = list(SPECIES_WEREBEAST) - - werewolf_socks - name = "Werewolf socks" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - species_allowed = list(SPECIES_WEREBEAST) - - shadekin_snoot - name = "Shadekin Snoot" - icon_state = "shadekin-snoot" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_SHADEKIN_YW) //YW edits - - taj_nose_alt - name = "Nose Color, alt. (Taj)" - icon_state = "taj_nosealt" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - talons - name = "Talons" - icon_state = "talons" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) - - claws - name = "Claws" - icon_state = "claws" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_HAND,BP_R_HAND) - - equine_snout //Why the long face? Works best with sergal bodytype. - name = "Equine Snout" - icon_state = "donkey" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - equine_nose - name = "Equine Nose" - icon_state = "dnose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - bee_stripes - name = "bee stripes" - icon_state = "beestripes" - body_parts = list(BP_TORSO,BP_GROIN) - - vas_toes - name = "Bug Paws (Vasilissan)" - icon_state = "vas_toes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT) - - //CitRP stuff - vox_alt - name = "Vox Alternate" - icon_state = "bay_vox" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) - species_allowed = list(SPECIES_VOX) - - vox_alt_eyes - name = "Alternate Vox Eyes" - icon_state = "bay_vox_eyes" - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_VOX) - - c_beast_body - name = "Cyber Body" - icon_state = "c_beast_body" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN) - - c_beast_plating - name = "Cyber Plating (Use w/ Cyber Body)" - icon_state = "c_beast_plating" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM) - - c_beast_band - name = "Cyber Band (Use w/ Cybertech head)" - icon_state = "c_beast_band" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - c_beast_cheek_a - name = "Cyber Beast Cheeks A (Use A, B and C)" - icon_state = "c_beast_a" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - c_beast_cheek_b - name = "Cyber Beast Cheeks B (Use A, B and C)" - icon_state = "c_beast_b" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - c_beast_cheek_c - name = "Cyber Beast Cheeks C (Use A, B and C)" - icon_state = "c_beast_c" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - teshari_large_eyes - name = "Teshari large eyes" - icon_state = "teshlarge_eyes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - - teshari_coat - name = "Teshari coat" - icon_state = "tesh_coat" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - - teshari_pattern_male - name = "Teshari male pattern" - icon_state = "tesh-pattern-male" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - - teshari_pattern_female - name = "Teshari female pattern" - icon_state = "tesh-pattern-fem" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - body_parts = list(BP_L_FOOT,BP_R_FOOT) - - voxscales - name = "Vox Scales" - icon_state = "Voxscales" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_HEAD) - - voxclaws - name = "Vox Claws" - icon_state = "Voxclaws" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) - - voxbeak - name = "Vox Beak" - icon_state = "Voxscales" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathihood - name = "Cobra Hood" - icon_state = "unathihood" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathidoublehorns - name = "Double Unathi Horns" - icon_state = "unathidoublehorns" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathihorns - name = "Unathi Horns" - icon_state = "unathihorns" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathiramhorns - name = "Unathi Ram Horns" - icon_state = "unathiramhorns" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathishortspines - name = "Unathi Short Spines" - icon_state = "unathishortspines" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathilongspines - name = "Unathi Long Spines" - icon_state = "unathilongspines" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathishortfrills - name = "Unathi Short Frills" - icon_state = "unathishortfrills" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathilongfrills - name = "Unathi Long Frills" - icon_state = "unathilongfrills" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) +/* +//////////////////////////// +/ =--------------------= / +/ == Misc Definitions == / +/ =--------------------= / +//////////////////////////// +*/ + +// Yes, I have to add all of this just to make some glowy hair. +// No, this isn't a character creation option, but... I guess in the future it could be, if anyone wants that? + +/datum/sprite_accessory/hair_accessory + name = "You should not see this..." + icon = 'icons/mob/vore/hair_accessories_vr.dmi' + do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color + + var/ignores_lighting = 0 // Whether or not this hair accessory will ignore lighting and glow in the dark. + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/desc = "You should not see this..." + +/datum/sprite_accessory/hair_accessory/verie_hair_glow + name = "verie's hair glow" + 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 diff --git a/code/modules/mob/new_player/sprite_accessories_wing.dm b/code/modules/mob/new_player/sprite_accessories_wing.dm new file mode 100644 index 0000000000..486e81f4b1 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_wing.dm @@ -0,0 +1,152 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Wing Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/wing + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/wings.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/extra_overlay // Icon state of an additional overlay to blend in. + var/extra_overlay2 //Tertiary. + var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it. If the clothing is bulky enough to hide a tail, it should also hide wings. + // var/show_species_tail = 1 // Just so // TODO - Seems not needed ~Leshana + var/desc = "You should not see this..." + var/ani_state // State when flapping/animated + var/extra_overlay_w // Flapping state for extra overlay + var/extra_overlay2_w + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/wing/featheredlarge //Made by Natje! + name = "large feathered wings (colorable)" + desc = "" + icon_state = "feathered2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here. + name = "spider legs" + desc = "" + icon_state = "spider-legs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/moth + name = "moth wings" + desc = "" + icon_state = "moth" + +/datum/sprite_accessory/wing/mothc + name = "moth wings, colorable" + desc = "" + icon_state = "moth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/dragonfly + name = "dragonfly" + desc = "" + icon_state = "dragonfly" + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered_medium + name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys. + desc = "" + icon_state = "feathered3" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/bat_black + name = "bat wings, black" + desc = "" + icon_state = "bat-black" + +/datum/sprite_accessory/wing/bat_color + name = "bat wings, colorable" + desc = "" + icon_state = "bat-color" + do_colouration = 1 + +/datum/sprite_accessory/wing/bat_red + name = "bat wings, red" + desc = "" + icon_state = "bat-red" + +/datum/sprite_accessory/wing/harpywings + name = "harpy wings, colorable" + desc = "" + icon_state = "harpywings" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/beewings + name = "bee wings" + desc = "" + icon_state = "beewings" + +/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings? + name = "gazer eyestalks" + desc = "" + icon_state = "liquidfirefly-eyestalks" + //ckeys_allowed = list("liquidfirefly","seiga") //At request. + +/datum/sprite_accessory/wing/moth_full + name = "moth antenna and wings" + desc = "" + icon_state = "moth_full" + +/datum/sprite_accessory/wing/moth_full_gray + name = "moth antenna and wings, colorable" + desc = "" + icon_state = "moth_full_gray" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/snag + name = "xenomorph backplate" + desc = "" + icon_state = "snag-backplate" + +/datum/sprite_accessory/wing/sepulchre_c_yw + name = "demon wings (colorable)" + desc = "" + icon_state = "sepulchre_wingsc" + do_colouration = 1 + +/datum/sprite_accessory/wing/cyberdragon + name = "Cyber dragon wing (colorable)" + desc = "" + icon_state = "cyberdragon_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/cyberdragon_red + name = "Cyber dragon wing (red)" + desc = "" + icon_state = "cyberdragon_red_s" + do_colouration = 0 + +/datum/sprite_accessory/wing/cyberdoe + name = "Cyber doe wing" + desc = "" + icon_state = "cyberdoe_s" + do_colouration = 0 diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm new file mode 100644 index 0000000000..7cc4dfc081 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm @@ -0,0 +1,227 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Wing Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/wing + name = "You should not see this..." + icon = 'icons/mob/vore/wings_vr.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + +/datum/sprite_accessory/wing/shock //Unable to split the tail from the wings in the sprite, so let's just classify it as wings. + name = "pharoah hound tail (Shock Diamond)" + desc = "" + icon_state = "shock" + ckeys_allowed = list("icowom") + +/datum/sprite_accessory/wing/featheredlarge //Made by Natje! + name = "large feathered wings (colorable)" + desc = "" + icon_state = "feathered2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here. + name = "spider legs" + desc = "" + icon_state = "spider-legs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/moth + name = "moth wings" + desc = "" + icon_state = "moth" + +/datum/sprite_accessory/wing/mothc + name = "moth wings, colorable" + desc = "" + icon_state = "moth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/dragonfly + name = "dragonfly" + desc = "" + icon_state = "dragonfly" + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/citheroniamoth + name = "citheronia wings" + desc = "" + icon_state = "citheronia_wings" + ckeys_allowed = list("kira72") + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered_medium + name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys. + desc = "" + icon_state = "feathered3" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/bat_black + name = "bat wings, black" + desc = "" + icon_state = "bat-black" + +/datum/sprite_accessory/wing/bat_color + name = "bat wings, colorable" + desc = "" + icon_state = "bat-color" + do_colouration = 1 + +/datum/sprite_accessory/wing/bat_red + name = "bat wings, red" + desc = "" + icon_state = "bat-red" + +/datum/sprite_accessory/wing/harpywings + name = "harpy wings, colorable" + desc = "" + icon_state = "harpywings" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/harpywings_alt + name = "harpy wings alt, archeopteryx" + desc = "" + icon_state = "harpywings_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_altmarkings" + +/datum/sprite_accessory/wing/harpywings_alt_neckfur + name = "harpy wings alt, archeopteryx & neckfur" + desc = "" + icon_state = "harpywings_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_altmarkings" + extra_overlay2 = "neckfur" + +/datum/sprite_accessory/wing/harpywings_bat + name = "harpy wings, bat" + desc = "" + icon_state = "harpywings_bat" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_batmarkings" + +/datum/sprite_accessory/wing/harpywings_bat_neckfur + name = "harpy wings, bat & neckfur" + desc = "" + icon_state = "harpywings_bat" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_batmarkings" + extra_overlay2 = "neckfur" + +/datum/sprite_accessory/wing/neckfur + name = "neck fur" + desc = "" + icon_state = "neckfur" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/beewings + name = "bee wings" + desc = "" + icon_state = "beewings" + +/datum/sprite_accessory/wing/sepulchre + name = "demon wings (Sepulchre)" + desc = "" + icon_state = "sepulchre_wings" + ckeys_allowed = list("sepulchre") + +/datum/sprite_accessory/wing/miria_fluffdragon + name = "fluffdragon wings (Miria Masters)" + desc = "" + icon_state = "miria-fluffdragontail" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/wing/scree + name = "green taj wings (Scree)" + desc = "" + icon_state = "scree-wings" + ckeys_allowed = list("scree") + +/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings? + name = "gazer eyestalks" + desc = "" + icon_state = "liquidfirefly-eyestalks" + //ckeys_allowed = list("liquidfirefly","seiga") //At request. + +/datum/sprite_accessory/wing/moth_full + name = "moth antenna and wings" + desc = "" + icon_state = "moth_full" + +/datum/sprite_accessory/wing/moth_full_gray + name = "moth antenna and wings, colorable" + desc = "" + icon_state = "moth_full_gray" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/kerena + name = "wingwolf wings (Kerena)" + desc = "" + icon_state = "kerena-wings" + ckeys_allowed = list("somekindofpony") + +/datum/sprite_accessory/wing/snag + name = "xenomorph backplate" + desc = "" + icon_state = "snag-backplate" + +/datum/sprite_accessory/wing/sepulchre_c_yw + name = "demon wings (colorable)" + desc = "" + icon_state = "sepulchre_wingsc" + do_colouration = 1 + +/datum/sprite_accessory/wing/cyberdragon + name = "Cyber dragon wing (colorable)" + desc = "" + icon_state = "cyberdragon_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/cyberdragon_red + name = "Cyber dragon wing (red)" + desc = "" + icon_state = "cyberdragon_red_s" + do_colouration = 0 + +/datum/sprite_accessory/wing/cyberdoe + name = "Cyber doe wing" + desc = "" + icon_state = "cyberdoe_s" + do_colouration = 0 + +/datum/sprite_accessory/wing/drago_wing + name = "Cybernetic Dragon wings" + desc = "" + icon_state = "drago_wing" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "drago_wing_2" diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 7f65e4e510..bf4a770f54 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -1,18 +1,20 @@ /proc/generate_speech_bubble(var/bubble_loc, var/speech_state, var/set_layer = FLOAT_LAYER) var/image/I = image('icons/mob/talk_vr.dmi', bubble_loc, speech_state, set_layer) //VOREStation Edit - talk_vr.dmi instead of talk.dmi for right-side icons - I.appearance_flags |= (KEEP_APART|RESET_COLOR|PIXEL_SCALE) + I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) //VOREStation Edit + /* //VOREStation Removal Start if(istype(bubble_loc, /atom/movable)) var/atom/movable/AM = bubble_loc var/x_scale = AM.get_icon_scale_x() if(abs(x_scale) < 2) // reset transform on bubbles, except for the Very Large I.pixel_z = (AM.icon_expected_height * (x_scale-1)) I.appearance_flags |= RESET_TRANSFORM + */ //VOREStation Removal Start return I /mob/proc/init_typing_indicator(var/set_state = "typing") typing_indicator = new typing_indicator.appearance = generate_speech_bubble(null, set_state) - typing_indicator.appearance_flags |= (KEEP_APART|RESET_COLOR|RESET_TRANSFORM|PIXEL_SCALE) + typing_indicator.appearance_flags |= (RESET_COLOR|PIXEL_SCALE) //VOREStation Edit /mob/proc/set_typing_indicator(var/state) //Leaving this here for mobs. @@ -43,7 +45,7 @@ set_typing_indicator(TRUE) var/message = input("","say (text)") as text set_typing_indicator(FALSE) - + if(message) say_verb(message) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 02c939bd19..ce8e1f6f8a 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -82,7 +82,7 @@ return 0 else if(ismob(src)) //VOREStation Edit Start. Are they a mob, and are they currently flying?? - var/mob/H = src + var/mob/living/H = src if(H.flying) if(H.incapacitated(INCAPACITATION_ALL)) to_chat(src, "You can't fly in your current state.") diff --git a/code/modules/multiz/movement_vr.dm b/code/modules/multiz/movement_vr.dm index 9c1a8f2994..bbca4eef0d 100644 --- a/code/modules/multiz/movement_vr.dm +++ b/code/modules/multiz/movement_vr.dm @@ -77,8 +77,6 @@ pred.Weaken(8) var/mob/living/prey = src var/fallloc = prey.loc - pred.init_vore() - prey.init_vore() if(pred.can_be_drop_pred && prey.can_be_drop_prey) pred.feed_grabbed_to_self_falling_nom(pred,prey) pred.loc = fallloc diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm index d09dc346e7..f34cae0065 100644 --- a/code/modules/multiz/turf.dm +++ b/code/modules/multiz/turf.dm @@ -39,7 +39,7 @@ ..() update() -/turf/simulated/open/ChangeTurf() +/turf/simulated/open/ChangeTurf(var/turf/N, var/tell_universe, var/force_lighting_update, var/preserve_outdoors) var/turf/T = GetBelow(src) if(T) GLOB.turf_entered_event.unregister(T, src, .proc/BelowOpenUpdated) diff --git a/code/modules/nifsoft/software/15_misc.dm b/code/modules/nifsoft/software/15_misc.dm index 957924314d..2b173346ce 100644 --- a/code/modules/nifsoft/software/15_misc.dm +++ b/code/modules/nifsoft/software/15_misc.dm @@ -130,7 +130,8 @@ var/new_size = input("Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null if (!nif.human.size_range_check(new_size)) - to_chat(nif.human,"The safety features of the NIF Program prevent you from choosing this size.") + if(new_size) + to_chat(nif.human,"The safety features of the NIF Program prevent you from choosing this size.") return else if(nif.human.resize(new_size/100)) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 00fd0d98a8..246cb23d04 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -30,6 +30,7 @@ // Appearance vars. var/nonsolid // Snowflake warning, reee. Used for slime limbs. + var/transparent // As above, so below. Used for transparent limbs. var/icon_name = null // Icon state base. var/body_part = null // Part flag var/icon_position = 0 // Used in mob overlay layering calculations. @@ -1399,4 +1400,8 @@ Note that amputating the affected organ does in fact remove the infection from t for(var/obj/item/organ/external/L in organs) for(var/obj/item/I in L.implants) if(!istype(I,/obj/item/weapon/implant) && !istype(I,/obj/item/device/nif)) //VOREStation Add - NIFs - return 1 \ No newline at end of file + return 1 + +/obj/item/organ/external/proc/is_hidden_by_tail() + if(owner && owner.tail_style && owner.tail_style.hide_body_parts && (organ_tag in owner.tail_style.hide_body_parts)) + return 1 diff --git a/code/modules/organs/organ_external_vr.dm b/code/modules/organs/organ_external_vr.dm index 1742259864..0e3fb07d9e 100644 --- a/code/modules/organs/organ_external_vr.dm +++ b/code/modules/organs/organ_external_vr.dm @@ -1,6 +1,3 @@ -/obj/item/organ/external - var/transparent = 0 //For better slime limbs - //Sideways override for nanoform limbs (ugh) /obj/item/organ/external/robotize(var/company, var/skip_prosthetics = FALSE, var/keep_organs = FALSE) var/original_robotic = robotic @@ -16,7 +13,3 @@ min_broken_damage = o_min_broken_damage else return ..() - -/obj/item/organ/external/proc/is_hidden_by_tail() - if(owner && owner.tail_style && owner.tail_style.hide_body_parts && (organ_tag in owner.tail_style.hide_body_parts)) - return 1 \ No newline at end of file diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 86e71c4fc2..28f0e7e33f 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -51,69 +51,6 @@ var/global/list/limb_icon_cache = list() var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] if(eyes) eyes.update_colour() -/obj/item/organ/external/head/get_icon() - ..() - - //The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item - cut_overlays() - - //Every 'addon' below requires information from species - if(!iscarbon(owner) || !owner.species) - return - - var/icon/eyecon //VOREStation Edit -- holds eye icon to render over markings later. - - //Eye color/icon - var/should_have_eyes = owner.should_have_organ(O_EYES) - var/has_eye_color = owner.species.appearance_flags & HAS_EYE_COLOR - if((should_have_eyes || has_eye_color) && eye_icon) - var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] - var/icon/eyes_icon = new/icon(eye_icon_location, eye_icon) - //Should have eyes - if(should_have_eyes) - //And we have them - if(eyes) - if(has_eye_color) - eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) - //They're gone! - else - eyes_icon.Blend(rgb(128,0,0), ICON_ADD) - //We have weird other-sorts of eyes (as we're not supposed to have eye organ, but we have HAS_EYE_COLOR species) - else - eyes_icon.Blend(rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes), ICON_ADD) - - //VOREStation edit -- allow rendering of eyes over markings. - if(eyes_over_markings) - eyecon = eyes_icon - else - add_overlay(eyes_icon) - mob_icon.Blend(eyes_icon, ICON_OVERLAY) - icon_cache_key += "[eye_icon]" - - //Lip color/icon - if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) - var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") - add_overlay(lip_icon) - mob_icon.Blend(lip_icon, ICON_OVERLAY) - - //Head markings - for(var/M in markings) - var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] - var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") - mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit - add_overlay(mark_s) //So when it's not on your body, it has icons - mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons - icon_cache_key += "[M][markings[M]["color"]]" - - if(eyes_over_markings && eyecon) //VOREStation edit -- toggle to render eyes above markings. - add_overlay(eyecon) - mob_icon.Blend(eyecon, ICON_OVERLAY) - icon_cache_key += "[eye_icon]" - - add_overlay(get_hair_icon()) - - return mob_icon - /obj/item/organ/external/head/proc/get_hair_icon() var/image/res = image('icons/mob/human_face.dmi',"bald_s") //Facial hair diff --git a/code/modules/organs/robolimbs_custom.dm b/code/modules/organs/robolimbs_custom.dm new file mode 100644 index 0000000000..7fef655df9 --- /dev/null +++ b/code/modules/organs/robolimbs_custom.dm @@ -0,0 +1,176 @@ +/datum/robolimb + var/includes_tail //Cyberlimbs dmi includes a tail sprite to wear. + var/includes_wing //Cyberlimbs dmi includes a wing sprite to wear. + var/list/whitelisted_to //List of ckeys that are allowed to pick this in charsetup. + +//////////////// For-specific-character fluff ones ///////////////// May be viable to place these into a custom_item subfolder, in order to allow CI Repo integration. + +// verkister : Rahwoof Boop +/datum/robolimb/eggnerdltd + company = "Eggnerd Prototyping Ltd." + desc = "This limb has a slight salvaged handicraft vibe to it. The CE-marking on it is definitely not the standardized one, it looks more like a hand-written sharpie monogram." + icon = 'icons/mob/human_races/cyberlimbs/_fluff_vr/rahboop.dmi' + blood_color = "#5e280d" + includes_tail = 1 + unavailable_to_build = 1 + +/obj/item/weapon/disk/limb/eggnerdltd + company = "Eggnerd Prototyping Ltd." +// icon = 'icons/obj/items_vr.dmi' +// icon_state = "verkdisk" + +//////////////// General VS-only ones ///////////////// +/datum/robolimb/talon //They're buildable by default due to being extremely basic. + company = "Talon LLC" + desc = "This metallic limb is sleek and featuresless apart from some exposed motors" + icon = 'icons/mob/human_races/cyberlimbs/talon/talon_main.dmi' //Sprited by: Viveret + +/obj/item/weapon/disk/limb/talon + company = "Talon LLC" + +/datum/robolimb/zenghu_taj //This wasn't indented. At all. It's a miracle this didn't break literally everything. + company = "Zeng-Hu - Tajaran" + desc = "This limb has a rubbery fleshtone covering with visible seams." + icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_taj.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + +/datum/robolimb/eggnerdltdred + company = "Eggnerd Prototyping Ltd. (Red)" + desc = "A slightly more refined limb variant from Eggnerd Prototyping. Its got red plating instead of orange." + icon = 'icons/mob/human_races/cyberlimbs/rahboopred/rahboopred.dmi' + blood_color = "#5e280d" + includes_tail = 1 + unavailable_to_build = 1 + +/obj/item/weapon/disk/limb/eggnerdltdred + company = "Eggnerd Prototyping Ltd. (Red)" + icon = 'icons/obj/items_vr.dmi' //VOREStation add. Use the right sprites + icon_state = "verkdisk" //VOREStation add. Use the right sprites + + +//Darkside Incorperated synthetic augmentation list! Many current most used fuzzy and notsofuzzy races made into synths here. +/datum/robolimb/dsi_tajaran + company = "DSI - Tajaran" + desc = "This limb feels soft and fluffy, realistic design and squish. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSITajaran/dsi_tajaran.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Tajara" + +/*/datum/robolimb/dsi_tajaran/New() + species_cannot_use = GLOB.all_species.Copy() + species_cannot_use -= SPECIES_TAJ +VS Edit - anyone can select these. */ + +/obj/item/weapon/disk/limb/dsi_tajaran + company = "DSI - Tajaran" + +/datum/robolimb/dsi_lizard + company = "DSI - Lizard" + desc = "This limb feels smooth and scalie, realistic design and squish. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSILizard/dsi_lizard.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Unathi" + +/* /datum/robolimb/dsi_lizard/New() // + species_cannot_use = GLOB.all_species.Copy() + species_cannot_use -= SPECIES_UNATHI +VS Edit - anyone can select these. */ + +/obj/item/weapon/disk/limb/dsi_lizard + company = "DSI - Lizard" + +/datum/robolimb/dsi_sergal + company = "DSI - Sergal" + desc = "This limb feels soft and fluffy, realistic design and toned muscle. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSISergal/dsi_sergal.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Sergal" + +/obj/item/weapon/disk/limb/dsi_sergal + company = "DSI - Sergal" + +/datum/robolimb/dsi_nevrean + company = "DSI - Nevrean" + desc = "This limb feels soft and feathery, lightweight, realistic design and squish. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSINevrean/dsi_nevrean.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Nevrean" + +/obj/item/weapon/disk/limb/dsi_nevrean + company = "DSI - Nevrean" + +/datum/robolimb/dsi_vulpkanin + company = "DSI - Vulpkanin" + desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSIVulpkanin/dsi_vulpkanin.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Vulpkanin" + +/obj/item/weapon/disk/limb/dsi_vulpkanin + company = "DSI - Vulpkanin" + +/datum/robolimb/dsi_akula + company = "DSI - Akula" + desc = "This limb feels soft and fleshy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSIAkula/dsi_akula.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Akula" + +/obj/item/weapon/disk/limb/dsi_akula + company = "DSI - Akula" + +/datum/robolimb/dsi_spider + company = "DSI - Vasilissan" + desc = "This limb feels hard and chitinous, realistic design. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSISpider/dsi_spider.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Vasilissan" + +/obj/item/weapon/disk/limb/dsi_spider + company = "DSI - Vasilissan" + +/datum/robolimb/dsi_teshari + company = "DSI - Teshari" + desc = "This limb has a thin synthflesh casing with a few connection ports." + icon = 'icons/mob/human_races/cyberlimbs/DSITeshari/dsi_teshari.dmi' + lifelike = 1 + skin_tone = 1 + suggested_species = "Teshari" + +/datum/robolimb/dsi_teshari/New() + species_cannot_use = GLOB.all_species.Copy() + species_cannot_use -= SPECIES_TESHARI //VOREStation add - let 'em be selected. + species_cannot_use -= SPECIES_CUSTOM //VOREStation add - let 'em be selected. + ..() + +/obj/item/weapon/disk/limb/dsi_teshari + company = "DSI - Teshari" \ No newline at end of file diff --git a/code/modules/organs/robolimbs_vr.dm b/code/modules/organs/robolimbs_vr.dm index 44953be646..fd0a8b230c 100644 --- a/code/modules/organs/robolimbs_vr.dm +++ b/code/modules/organs/robolimbs_vr.dm @@ -1,8 +1,3 @@ -/datum/robolimb - var/includes_tail //Cyberlimbs dmi includes a tail sprite to wear. - var/includes_wing //Cyberlimbs dmi includes a wing sprite to wear. - var/list/whitelisted_to //List of ckeys that are allowed to pick this in charsetup. - //CitRP Port var/const/cyberbeast_monitor_styles = "blank=cyber_blank;\ default=cyber_default;\ @@ -51,20 +46,6 @@ var/const/cyberbeast_monitor_styles = "blank=cyber_blank;\ /obj/item/weapon/disk/limb/white_kryten company = "White Kryten Cybernetics" -// verkister : Rahwoof Boop -/datum/robolimb/eggnerdltd - company = "Eggnerd Prototyping Ltd." - desc = "This limb has a slight salvaged handicraft vibe to it. The CE-marking on it is definitely not the standardized one, it looks more like a hand-written sharpie monogram." - icon = 'icons/mob/human_races/cyberlimbs/_fluff_vr/rahboop.dmi' - blood_color = "#5e280d" - includes_tail = 1 - unavailable_to_build = 1 - -/obj/item/weapon/disk/limb/eggnerdltd - company = "Eggnerd Prototyping Ltd." - icon = 'icons/obj/items_vr.dmi' - icon_state = "verkdisk" - // tucker0666 : Frost /datum/robolimb/zenghu_frost company = "Zeng-Hu (Custom)" @@ -76,158 +57,10 @@ var/const/cyberbeast_monitor_styles = "blank=cyber_blank;\ unavailable_to_build = 1 whitelisted_to = list("tucker0666") - /obj/item/weapon/disk/limb/zenghu_frost company = "Zeng-Hu (Modified)" catalogue_data = list(/datum/category_item/catalogue/information/organization/zeng_hu) -//////////////// General VS-only ones ///////////////// -/datum/robolimb/talon //They're buildable by default due to being extremely basic. - company = "Talon LLC" - desc = "This metallic limb is sleek and featuresless apart from some exposed motors" - icon = 'icons/mob/human_races/cyberlimbs/talon/talon_main.dmi' //Sprited by: Viveret - -/obj/item/weapon/disk/limb/talon - company = "Talon LLC" - -/datum/robolimb/zenghu_taj //This wasn't indented. At all. It's a miracle this didn't break literally everything. - company = "Zeng-Hu - Tajaran" - desc = "This limb has a rubbery fleshtone covering with visible seams." - icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_taj.dmi' - unavailable_to_build = 1 - parts = list(BP_HEAD) - -/datum/robolimb/eggnerdltdred - company = "Eggnerd Prototyping Ltd. (Red)" - desc = "A slightly more refined limb variant from Eggnerd Prototyping. Its got red plating instead of orange." - icon = 'icons/mob/human_races/cyberlimbs/rahboopred/rahboopred.dmi' - blood_color = "#5e280d" - includes_tail = 1 - unavailable_to_build = 1 - -/obj/item/weapon/disk/limb/eggnerdltdred - company = "Eggnerd Prototyping Ltd. (Red)" - icon = 'icons/obj/items_vr.dmi' - icon_state = "verkdisk" - - -//Darkside Incorperated synthetic augmentation list! Many current most used fuzzy and notsofuzzy races made into synths here. - -/datum/robolimb/dsi_tajaran - company = "DSI - Tajaran" - desc = "This limb feels soft and fluffy, realistic design and squish. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSITajaran/dsi_tajaran.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Tajara" - -/obj/item/weapon/disk/limb/dsi_tajaran - company = "DSI - Tajaran" - -/datum/robolimb/dsi_lizard - company = "DSI - Lizard" - desc = "This limb feels smooth and scalie, realistic design and squish. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSILizard/dsi_lizard.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Unathi" - -/obj/item/weapon/disk/limb/dsi_lizard - company = "DSI - Lizard" - -/datum/robolimb/dsi_sergal - company = "DSI - Sergal" - desc = "This limb feels soft and fluffy, realistic design and toned muscle. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSISergal/dsi_sergal.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Sergal" - -/obj/item/weapon/disk/limb/dsi_sergal - company = "DSI - Sergal" - -/datum/robolimb/dsi_nevrean - company = "DSI - Nevrean" - desc = "This limb feels soft and feathery, lightweight, realistic design and squish. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSINevrean/dsi_nevrean.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Nevrean" - -/obj/item/weapon/disk/limb/dsi_nevrean - company = "DSI - Nevrean" - -/datum/robolimb/dsi_vulpkanin - company = "DSI - Vulpkanin" - desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSIVulpkanin/dsi_vulpkanin.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Vulpkanin" - -/obj/item/weapon/disk/limb/dsi_vulpkanin - company = "DSI - Vulpkanin" - -/datum/robolimb/dsi_akula - company = "DSI - Akula" - desc = "This limb feels soft and fleshy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSIAkula/dsi_akula.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Akula" - -/obj/item/weapon/disk/limb/dsi_akula - company = "DSI - Akula" - -/datum/robolimb/dsi_spider - company = "DSI - Vasilissan" - desc = "This limb feels hard and chitinous, realistic design. Seems a little mischievous. By Darkside Incorperated." - icon = 'icons/mob/human_races/cyberlimbs/DSISpider/dsi_spider.dmi' - blood_color = "#ffe2ff" - lifelike = 1 - unavailable_to_build = 1 - includes_tail = 1 - skin_tone = 1 - suggested_species = "Vasilissan" - -/obj/item/weapon/disk/limb/dsi_spider - company = "DSI - Vasilissan" - -/datum/robolimb/dsi_teshari - company = "DSI - Teshari" - desc = "This limb has a thin synthflesh casing with a few connection ports." - icon = 'icons/mob/human_races/cyberlimbs/DSITeshari/dsi_teshari.dmi' - lifelike = 1 - skin_tone = 1 - suggested_species = "Teshari" - -/datum/robolimb/dsi_teshari/New() - species_cannot_use = GLOB.all_species.Copy() - species_cannot_use -= SPECIES_TESHARI - species_cannot_use -= SPECIES_CUSTOM - ..() - -/obj/item/weapon/disk/limb/dsi_teshari - company = "DSI - Teshari" - //Ported from CitRP /datum/robolimb/cyber_beast company = "Cyber Tech(Protogen analogue)" //CHOMPEdit diff --git a/code/modules/organs/subtypes/shadekin_vr.dm b/code/modules/organs/subtypes/shadekin_vr.dm index 8b17b70d6e..90ecbad9cf 100644 --- a/code/modules/organs/subtypes/shadekin_vr.dm +++ b/code/modules/organs/subtypes/shadekin_vr.dm @@ -4,11 +4,11 @@ /obj/item/organ/external/groin/crewkin min_broken_damage = 20 -/obj/item/organ/external/head/vr/crewkin +/obj/item/organ/external/head/crewkin min_broken_damage = 15 - eye_icons_vr = 'icons/mob/human_face_vr.dmi' - eye_icon_vr = "eyes_shadekin_station" + eye_icon_location = 'icons/mob/human_face_vr.dmi' + eye_icon = "eyes_shadekin_station" /obj/item/organ/external/arm/crewkin min_broken_damage = 15 diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index 1c4fb5ee27..a3c79c4c40 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -266,13 +266,13 @@ encased = "skull" base_miss_chance = 40 var/can_intake_reagents = 1 + var/head_offset = 0 var/eye_icon = "eyes_s" + var/eye_icon_location = 'icons/mob/human_face.dmi' force = 3 throwforce = 7 var/eyes_over_markings = FALSE //VOREStation edit - var/eye_icon_location = 'icons/mob/human_face.dmi' - /obj/item/organ/external/head/Initialize() if(config.allow_headgibs) cannot_gib = FALSE @@ -324,6 +324,69 @@ "You make \the [I] kiss \the [src]!.") return ..() +/obj/item/organ/external/head/get_icon() + ..() + + //The overlays are not drawn on the mob, they are used for if the head is removed and becomes an item + cut_overlays() + + //Every 'addon' below requires information from species + if(!iscarbon(owner) || !owner.species) + return + + var/icon/eyecon //VOREStation Add + + //Eye color/icon + var/should_have_eyes = owner.should_have_organ(O_EYES) + var/has_eye_color = owner.species.appearance_flags & HAS_EYE_COLOR + if((should_have_eyes || has_eye_color) && eye_icon) + var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] + var/icon/eyes_icon = new/icon(eye_icon_location, eye_icon) + //Should have eyes + if(should_have_eyes) + //And we have them + if(eyes) + if(has_eye_color) + eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) + //They're gone! + else + eyes_icon.Blend(rgb(128,0,0), ICON_ADD) + //We have weird other-sorts of eyes (as we're not supposed to have eye organ, but we have HAS_EYE_COLOR species) + else + eyes_icon.Blend(rgb(owner.r_eyes, owner.g_eyes, owner.b_eyes), ICON_ADD) + + //VOREStation edit -- allow rendering of eyes over markings. + if(eyes_over_markings) + eyecon = eyes_icon + else + add_overlay(eyes_icon) + mob_icon.Blend(eyes_icon, ICON_OVERLAY) + icon_cache_key += "[eye_icon]" + + //Lip color/icon + if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) + var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") + add_overlay(lip_icon) + mob_icon.Blend(lip_icon, ICON_OVERLAY) + + //Head markings + for(var/M in markings) + var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] + var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") + mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) + add_overlay(mark_s) //So when it's not on your body, it has icons + mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons + icon_cache_key += "[M][markings[M]["color"]]" + + if(eyes_over_markings && eyecon) //VOREStation edit -- toggle to render eyes above markings. + add_overlay(eyecon) + mob_icon.Blend(eyecon, ICON_OVERLAY) + icon_cache_key += "[eye_icon]" + + add_overlay(get_hair_icon()) + + return mob_icon + /obj/item/organ/external/head/skrell eye_icon = "skrell_eyes_s" diff --git a/code/modules/organs/subtypes/standard_vr.dm b/code/modules/organs/subtypes/standard_vr.dm index bf429cb878..64ec8b08a6 100644 --- a/code/modules/organs/subtypes/standard_vr.dm +++ b/code/modules/organs/subtypes/standard_vr.dm @@ -1,77 +1,27 @@ //For custom heads with custom parts since the base code is restricted to a single icon file. -/obj/item/organ/external/head/vr/get_icon() - - ..() - overlays.Cut() - if(!owner || !owner.species) - return - - for(var/M in markings) - var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] - var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") - mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) - overlays |= mark_s //So when it's not on your body, it has icons - mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons - icon_cache_key += "[M][markings[M]["color"]]" - - if(owner.should_have_organ(O_EYES))//Moved on top of markings. - var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] - if(eye_icon) - var/icon/eyes_icon = new/icon(eye_icons_vr, eye_icon_vr) - if(eyes) - if(owner.species.appearance_flags & HAS_EYE_COLOR) - eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) - else - eyes_icon.Blend(rgb(128,0,0), ICON_ADD) - mob_icon.Blend(eyes_icon, ICON_OVERLAY) - overlays |= eyes_icon - - if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) - var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") - overlays |= lip_icon - mob_icon.Blend(lip_icon, ICON_OVERLAY) - - if(owner.f_style) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] - if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed)) - var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) - overlays |= image(facial_s, "pixel_y" = head_offset) - - if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))) - var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] - if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed)) - var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) - hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY) - overlays |= image(hair_s, "pixel_y" = head_offset) - return mob_icon - -/obj/item/organ/external/head/vr - var/eye_icons_vr = 'icons/mob/human_face_vr.dmi' - var/eye_icon_vr = "blank_eyes" - var/head_offset = 0 +/obj/item/organ/external/head/blank_vr // Unused for now. Might be at some point. + eye_icon_location = 'icons/mob/human_face_vr.dmi' eye_icon = "blank_eyes" -/obj/item/organ/external/head/vr/sergal - eye_icon_vr = "eyes_sergal" +/obj/item/organ/external/head/sergal + eye_icon_location = 'icons/mob/human_face_vr.dmi' + eye_icon = "eyes_sergal" -/obj/item/organ/external/head/vr/werebeast - eye_icons_vr = 'icons/mob/werebeast_face_vr.dmi' - eye_icon_vr = "werebeast_eyes" +/obj/item/organ/external/head/werebeast + eye_icon_location = 'icons/mob/werebeast_face_vr.dmi' + eye_icon = "werebeast_eyes" head_offset = 6 -/obj/item/organ/external/head/vr/shadekin +/obj/item/organ/external/head/shadekin cannot_gib = 1 cannot_amputate = 1 - - eye_icons_vr = 'icons/mob/human_face_vr.dmi' - eye_icon_vr = "eyes_shadekin" - + + eye_icon_location = 'icons/mob/human_face_vr.dmi' + eye_icon = "eyes_shadekin" + //yw edit /obj/item/organ/external/head/vr/grey - eye_icons_vr = 'icons/mob/human_face_yw.dmi' - eye_icon_vr = "eyes_grey" + eye_icon_location = 'icons/mob/human_face_yw.dmi' + eye_icon = "eyes_grey" //yw edit diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 9182a17530..1b2624c125 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -21,50 +21,63 @@ return // don't set a label if(!labels_left) - to_chat(user, "No labels left.") + to_chat(user, SPAN_WARNING("\The [src] has no labels left.")) return if(!label || !length(label)) - to_chat(user, "No text set.") + to_chat(user, SPAN_WARNING("\The [src] has no label text set.")) return if(length(A.name) + length(label) > 64) - to_chat(user, "Label too big.") + to_chat(user, SPAN_WARNING("\The [src]'s label too big.")) + return + if(istype(A, /mob/living/silicon/robot/platform)) + var/mob/living/silicon/robot/platform/P = A + if(!P.allowed(user)) + to_chat(usr, SPAN_WARNING("Access denied.")) + else if(P.client || P.key) + to_chat(user, SPAN_NOTICE("You rename \the [P] to [label].")) + to_chat(P, SPAN_NOTICE("\The [user] renames you to [label].")) + P.custom_name = label + P.SetName(P.custom_name) + else + to_chat(user, SPAN_WARNING("\The [src] is inactive and cannot be renamed.")) return if(ishuman(A)) - to_chat(user, "The label refuses to stick to [A.name].") + to_chat(user, SPAN_WARNING("The label refuses to stick to [A.name].")) return if(issilicon(A)) - to_chat(user, "The label refuses to stick to [A.name].") + to_chat(user, SPAN_WARNING("The label refuses to stick to [A.name].")) return if(isobserver(A)) - to_chat(user, "[src] passes through [A.name].") + to_chat(user, SPAN_WARNING("[src] passes through [A.name].")) return if(istype(A, /obj/item/weapon/reagent_containers/glass)) - to_chat(user, "The label can't stick to the [A.name]. (Try using a pen)") + to_chat(user, SPAN_WARNING("The label can't stick to the [A.name] (Try using a pen).")) return if(istype(A, /obj/machinery/portable_atmospherics/hydroponics)) var/obj/machinery/portable_atmospherics/hydroponics/tray = A if(!tray.mechanical) - to_chat(user, "How are you going to label that?") + to_chat(user, SPAN_WARNING("How are you going to label that?")) return tray.labelled = label spawn(1) tray.update_icon() - user.visible_message("[user] labels [A] as [label].", \ - "You label [A] as [label].") + user.visible_message( \ + SPAN_NOTICE("\The [user] labels [A] as [label]."), \ + SPAN_NOTICE("You label [A] as [label].")) A.name = "[A.name] ([label])" /obj/item/weapon/hand_labeler/attack_self(mob/user as mob) mode = !mode icon_state = "labeler[mode]" if(mode) - to_chat(user, "You turn on \the [src].") + to_chat(user, SPAN_NOTICE("You turn on \the [src].")) //Now let them chose the text. var/str = sanitizeSafe(input(user,"Label text?","Set label",""), MAX_NAME_LEN) if(!str || !length(str)) - to_chat(user, "Invalid text.") + to_chat(user, SPAN_WARNING("Invalid text.")) return label = str - to_chat(user, "You set the text to '[str]'.") + to_chat(user, SPAN_NOTICE("You set the text to '[str]'.")) else - to_chat(user, "You turn off \the [src].") \ No newline at end of file + to_chat(user, SPAN_NOTICE("You turn off \the [src].")) \ No newline at end of file diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm index ca6f96ec9b..052813ade7 100644 --- a/code/modules/power/cells/power_cells.dm +++ b/code/modules/power/cells/power_cells.dm @@ -62,6 +62,11 @@ charge = 0 update_icon() +/obj/item/weapon/cell/mech + name = "mecha power cell" + charge = 15000 + maxcharge = 15000 + /obj/item/weapon/cell/infinite name = "infinite-capacity power cell!" icon_state = "icell" diff --git a/code/modules/power/fusion/core/core_control.dm b/code/modules/power/fusion/core/core_control.dm index c9ba42bbd5..e897dbd6ab 100644 --- a/code/modules/power/fusion/core/core_control.dm +++ b/code/modules/power/fusion/core/core_control.dm @@ -6,7 +6,7 @@ icon_keyboard = "tech_key" icon_screen = "core_control" -// var/id_tag + var/id_tag = "" var/scan_range = 25 var/list/connected_devices = list() var/obj/machinery/power/fusion_core/cur_viewed_device @@ -15,6 +15,7 @@ /obj/machinery/computer/fusion_core_control/New() ..() monitor = new(src) + monitor.core_tag = id_tag /obj/machinery/computer/fusion_core_control/Destroy() QDEL_NULL(monitor) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_control.dm b/code/modules/power/fusion/fuel_assembly/fuel_control.dm index b0fbf33095..b5d039d5b2 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_control.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_control.dm @@ -13,6 +13,7 @@ /obj/machinery/computer/fusion_fuel_control/New() ..() monitor = new(src) + monitor.fuel_tag = id_tag /obj/machinery/computer/fusion_fuel_control/Destroy() QDEL_NULL(monitor) diff --git a/code/modules/power/fusion/gyrotron/gyrotron.dm b/code/modules/power/fusion/gyrotron/gyrotron.dm index d4c995bf73..9621234007 100644 --- a/code/modules/power/fusion/gyrotron/gyrotron.dm +++ b/code/modules/power/fusion/gyrotron/gyrotron.dm @@ -23,17 +23,16 @@ GLOBAL_LIST_EMPTY(gyrotrons) /obj/machinery/power/emitter/gyrotron/Initialize() GLOB.gyrotrons += src - update_active_power_usage(mega_energy * 50000) default_apply_parts() - . = ..() + return ..() /obj/machinery/power/emitter/gyrotron/Destroy() GLOB.gyrotrons -= src return ..() -/obj/machinery/power/emitter/gyrotron/process() - update_active_power_usage(mega_energy * 50000) - . = ..() +/obj/machinery/power/emitter/gyrotron/proc/set_beam_power(var/new_power) + mega_energy = new_power + update_active_power_usage(mega_energy * initial(active_power_usage)) /obj/machinery/power/emitter/gyrotron/get_rand_burst_delay() return rate * 10 diff --git a/code/modules/power/fusion/gyrotron/gyrotron_control.dm b/code/modules/power/fusion/gyrotron/gyrotron_control.dm index e8daf7e0b9..1f06a4b6d1 100644 --- a/code/modules/power/fusion/gyrotron/gyrotron_control.dm +++ b/code/modules/power/fusion/gyrotron/gyrotron_control.dm @@ -14,6 +14,8 @@ /obj/machinery/computer/gyrotron_control/New() ..() monitor = new(src) + monitor.gyro_tag = id_tag + monitor.scan_range = scan_range /obj/machinery/computer/gyrotron_control/Destroy() QDEL_NULL(monitor) diff --git a/code/modules/projectiles/guns/energy/phase.dm b/code/modules/projectiles/guns/energy/phase.dm index 33ba37ad40..2498aba776 100644 --- a/code/modules/projectiles/guns/energy/phase.dm +++ b/code/modules/projectiles/guns/energy/phase.dm @@ -13,6 +13,15 @@ one_handed_penalty = 15 recoil_mode = 0 //CHOMP Addition: Removes recoil for micros. +/obj/item/weapon/gun/energy/phasegun/mounted + self_recharge = 1 + use_external_power = 1 + one_handed_penalty = 0 + +/obj/item/weapon/gun/energy/phasegun/mounted/cyborg + charge_cost = 400 + recharge_time = 7 + /obj/item/weapon/gun/energy/phasegun/pistol name = "phase pistol" desc = "The RayZar EW15 Apollo is an energy handgun, specifically designed for self-defense against aggressive wildlife." diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 018d051607..47395f4a3d 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -4140,6 +4140,17 @@ allergen_type = FRUIT //Made from lemons(fruit) +/datum/reagent/ethanol/jager + name = "Schuss Konig" + id = "jager" + description = "A complex alcohol that leaves you feeling all warm inside." + taste_description = "complex, rich alcohol" + color = "#7f6906" + strength = 25 + + glass_name = "schusskonig" + glass_desc = "A glass of schusskonig digestif. Good for shooting or mixing." + /datum/reagent/ethanol/fusionnaire name = "Fusionnaire" id = "fusionnaire" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm index a47070d617..02334afe15 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm @@ -13,7 +13,7 @@ mrate_static = TRUE /datum/reagent/macrocillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(M.size_multiplier < RESIZE_HUGE) + if(M.size_range_check(M.size_multiplier)) M.resize(M.size_multiplier+0.01, FALSE)//Incrrease 1% per tick. //CHOMP Edit: don't do fancy animates. Unnecessary on 1% changes. Laggy. return @@ -27,7 +27,7 @@ mrate_static = TRUE /datum/reagent/microcillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(M.size_multiplier > RESIZE_TINY) + if(M.size_range_check(M.size_multiplier)) M.resize(M.size_multiplier-0.01, FALSE) //Decrease 1% per tick. //CHOMP Edit: don't do fancy animates. Unnecessary on 1% changes. Laggy. return diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index 8f932b0082..5fc685bf1d 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -357,10 +357,15 @@ build_path = /obj/item/robot_parts/robot_component/camera /datum/design/item/prosfab/cyborg/component/armour - name = "Armour Plating" + name = "Armour Plating (Robot)" id = "armour" build_path = /obj/item/robot_parts/robot_component/armour +/datum/design/item/prosfab/cyborg/component/armour_heavy + name = "Armour Plating (Platform)" + id = "platform_armour" + build_path = /obj/item/robot_parts/robot_component/armour_platform + /datum/design/item/prosfab/cyborg/component/ai_shell name = "AI Remote Interface" id = "mmi_ai_shell" diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm index 6f8c1e0c9d..8e4578fd25 100644 --- a/code/modules/resleeving/designer.dm +++ b/code/modules/resleeving/designer.dm @@ -385,9 +385,6 @@ ASSERT(istype(B)) var/datum/category_item/player_setup_item/general/basic/G = CG.items_by_name["Basic"] ASSERT(istype(G)) - CG = CC.categories_by_name["VORE"] - var/datum/category_item/player_setup_item/vore/ears/E = CG.items_by_name["Appearance"] - ASSERT(istype(E)) if(params["target_href"] == "bio_gender") var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", active_br.bodygender) as null|anything in G.get_genders() @@ -408,12 +405,6 @@ active_br.mydna.dna.ResetUIFrom(mannequin) update_preview_icon() return 1 - action = E.OnTopic(list2params(href_list), href_list, user) - if(action & TOPIC_UPDATE_PREVIEW && mannequin && active_br) - E.copy_to_mob(mannequin) - active_br.mydna.dna.ResetUIFrom(mannequin) - update_preview_icon() - return 1 // Fake subtype of preferences we can use to steal code from player_setup /datum/preferences/designer/New() diff --git a/code/modules/tgui/modules/gyrotron_control.dm b/code/modules/tgui/modules/gyrotron_control.dm index 192c6a0feb..fd8c14bb85 100644 --- a/code/modules/tgui/modules/gyrotron_control.dm +++ b/code/modules/tgui/modules/gyrotron_control.dm @@ -3,57 +3,52 @@ tgui_id = "GyrotronControl" var/gyro_tag = "" + var/scan_range = 25 /datum/tgui_module/gyrotron_control/tgui_act(action, params) if(..()) return TRUE - for(var/parameter in params) - to_world("[parameter] - [params[parameter]]") + // If the command requires a gyrotron, and we can't find it, we don't need to check any further + var/obj/machinery/power/emitter/gyrotron/G = null + if(params["gyro"]) + G = locate(params["gyro"]) in GLOB.gyrotrons + if(!istype(G)) + return FALSE switch(action) - if("toggle_active") - var/obj/machinery/power/emitter/gyrotron/G = locate(params["gyro"]) - if(!istype(G)) - return 0 - - G.activate(usr) - - return 1 - if("set_tag") var/new_ident = sanitize_text(input("Enter a new ident tag.", "Gyrotron Control", gyro_tag) as null|text) if(new_ident) gyro_tag = new_ident + return TRUE + + if("toggle_active") + G.activate(usr) + return TRUE if("set_str") - var/obj/machinery/power/emitter/gyrotron/G = locate(params["gyro"]) - if(!istype(G)) - return 0 - var/new_strength = params["str"] - - G.mega_energy = new_strength - - return 1 + if(istext(new_strength)) + new_strength = text2num(new_strength) + if(new_strength) + G.set_beam_power(new_strength) + return TRUE if("set_rate") - var/obj/machinery/power/emitter/gyrotron/G = locate(params["gyro"]) - if(!istype(G)) - return 0 - var/new_delay = params["rate"] - - G.rate = new_delay - - return 1 + if(istext(new_delay)) + new_delay = text2num(new_delay) + if(new_delay) + G.rate = new_delay + return TRUE /datum/tgui_module/gyrotron_control/tgui_data(mob/user) var/list/data = list() var/list/gyros = list() for(var/obj/machinery/power/emitter/gyrotron/G in GLOB.gyrotrons) - if(G.id_tag == gyro_tag) + if(G.id_tag == gyro_tag)// && (get_dist(get_turf(G), get_turf(src)) <= scan_range)) gyros.Add(list(list( "name" = G.name, "active" = G.active, @@ -70,4 +65,4 @@ return data /datum/tgui_module/gyrotron_control/ntos - ntos = TRUE \ No newline at end of file + ntos = TRUE diff --git a/code/modules/tgui/modules/rustcore_monitor.dm b/code/modules/tgui/modules/rustcore_monitor.dm index 4477c54d43..69ccc1bf4e 100644 --- a/code/modules/tgui/modules/rustcore_monitor.dm +++ b/code/modules/tgui/modules/rustcore_monitor.dm @@ -8,22 +8,19 @@ if(..()) return TRUE - for(var/parameter in params) - to_world("[parameter] - [params[parameter]]") + var/obj/machinery/power/fusion_core/C = null + if(params["core"]) + C = locate(params["core"]) in GLOB.fusion_cores + if(!istype(C)) + return FALSE switch(action) if("toggle_active") - var/obj/machinery/power/fusion_core/C = locate(params["core"]) - if(!istype(C)) - return FALSE if(!C.Startup()) //Startup() whilst the device is active will return null. C.Shutdown() return TRUE if("toggle_reactantdump") - var/obj/machinery/power/fusion_core/C = locate(params["core"]) - if(!istype(C)) - return FALSE C.reactant_dump = !C.reactant_dump return TRUE @@ -31,16 +28,11 @@ var/new_ident = sanitize_text(input("Enter a new ident tag.", "Core Control", core_tag) as null|text) if(new_ident) core_tag = new_ident + return TRUE if("set_fieldstr") - var/obj/machinery/power/fusion_core/C = locate(params["core"]) - if(!istype(C)) - return FALSE - var/new_strength = params["fieldstr"] - C.target_field_strength = new_strength - return TRUE /datum/tgui_module/rustcore_monitor/tgui_data(mob/user) diff --git a/code/modules/tgui/modules/rustfuel_control.dm b/code/modules/tgui/modules/rustfuel_control.dm index 01029d6e85..a1e7336419 100644 --- a/code/modules/tgui/modules/rustfuel_control.dm +++ b/code/modules/tgui/modules/rustfuel_control.dm @@ -8,12 +8,9 @@ if(..()) return TRUE - for(var/parameter in params) - to_world("[parameter] - [params[parameter]]") - switch(action) if("toggle_active") - var/obj/machinery/fusion_fuel_injector/FI = locate(params["fuel"]) + var/obj/machinery/fusion_fuel_injector/FI = locate(params["fuel"]) in GLOB.fuel_injectors if(!istype(FI)) return FALSE @@ -51,4 +48,4 @@ return data /datum/tgui_module/rustfuel_control/ntos - ntos = TRUE \ No newline at end of file + ntos = TRUE diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm index a69295452b..93ba1df55f 100644 --- a/code/modules/tgui/states/default.dm +++ b/code/modules/tgui/states/default.dm @@ -61,7 +61,7 @@ GLOBAL_DATUM_INIT(tgui_default_state, /datum/tgui_state/default, new) return STATUS_CLOSE -/mob/living/simple_animal/default_can_use_tgui_topic(src_object) +/mob/living/simple_mob/default_can_use_tgui_topic(src_object) . = shared_tgui_interaction(src_object) if(. > STATUS_CLOSE) . = min(., shared_living_tgui_distance(src_object)) //simple animals can only use things they're near. @@ -74,6 +74,6 @@ GLOBAL_DATUM_INIT(tgui_default_state, /datum/tgui_state/default, new) return ..() /mob/observer/dead/default_can_use_tgui_topic() - if(can_admin_interact()) + if(check_rights(R_ADMIN|R_EVENT, 0, src)) return STATUS_INTERACTIVE // Admins are more equal return STATUS_UPDATE // Ghosts can view updates diff --git a/code/modules/tgui/states/observer.dm b/code/modules/tgui/states/observer.dm index bf98f44465..bdfe690dba 100644 --- a/code/modules/tgui/states/observer.dm +++ b/code/modules/tgui/states/observer.dm @@ -9,7 +9,7 @@ GLOBAL_DATUM_INIT(tgui_observer_state, /datum/tgui_state/observer_state, new) /datum/tgui_state/observer_state/can_use_topic(src_object, mob/user) if(isobserver(user)) return STATUS_INTERACTIVE - if(check_rights(R_ADMIN, 0, src)) + if(check_rights(R_ADMIN|R_EVENT, 0, src)) return STATUS_INTERACTIVE return STATUS_CLOSE diff --git a/code/modules/vore/appearance/preferences_vr.dm b/code/modules/vore/appearance/preferences_vr.dm index 5897cb2a48..01caeda13d 100644 --- a/code/modules/vore/appearance/preferences_vr.dm +++ b/code/modules/vore/appearance/preferences_vr.dm @@ -20,36 +20,3 @@ var/r_acc3 = 30 var/g_acc3 = 30 var/b_acc3 = 30 - var/datum/sprite_accessory/ears/ear_style = null - var/r_ears = 30 - var/g_ears = 30 - var/b_ears = 30 - var/r_ears2 = 30 - var/g_ears2 = 30 - var/b_ears2 = 30 - var/r_ears3 = 30 //Trust me, we could always use more colour. No japes. - var/g_ears3 = 30 - var/b_ears3 = 30 - var/datum/sprite_accessory/tail/tail_style = null - var/r_tail = 30 - var/g_tail = 30 - var/b_tail = 30 - var/r_tail2 = 30 - var/g_tail2 = 30 - var/b_tail2 = 30 - var/r_tail3 = 30 - var/g_tail3 = 30 - var/b_tail3 = 30 - var/datum/sprite_accessory/wing/wing_style = null - var/r_wing = 30 - var/g_wing = 30 - var/b_wing = 30 - var/r_wing2 = 30 - var/g_wing2 = 30 - var/b_wing2 = 30 - var/r_wing3 = 30 - var/g_wing3 = 30 - var/b_wing3 = 30 - - // Custom Species Name - var/custom_species diff --git a/code/modules/vore/appearance/sprite_accessories_taur_ch.dm b/code/modules/vore/appearance/sprite_accessories_taur_ch.dm new file mode 100644 index 0000000000..4df2ff7831 --- /dev/null +++ b/code/modules/vore/appearance/sprite_accessories_taur_ch.dm @@ -0,0 +1,30 @@ +/datum/sprite_accessory/tail/taur/naga/alt + name = "Naga alt (Taur)" + icon_state = "naga_alt_s" + icon = 'icons/mob/vore/taurs_ch.dmi' + suit_sprites = 'icons/mob/taursuits_naga_ch.dmi' + +/datum/sprite_accessory/tail/taur/naga/alt_2c + name = "Naga dual-color alt (Taur)" + icon_state = "naga_alt_s" + icon = 'icons/mob/vore/taurs_ch.dmi' + extra_overlay = "naga_alt_markings" + suit_sprites = 'icons/mob/taursuits_naga_ch.dmi' + +/datum/sprite_accessory/tail/taur/horse/scoli + name = "Scolipede (Taur)" + icon_state = "scoli_s" + icon = 'icons/mob/vore/taurs_ch.dmi' + extra_overlay = "scoli_markings1" + extra_overlay2 = "scoli_markings2" + +/datum/sprite_accessory/tail/taur/lizard/fat + name = "Fat Lizard (Taur)" + icon_state = "fatlizard_s" + icon = 'icons/mob/vore/taurs_ch.dmi' + +/datum/sprite_accessory/tail/taur/lizard/fat_2c + name = "Fat Lizard (Taur, dual-color)" + icon_state = "fatlizard_s" + icon = 'icons/mob/vore/taurs_ch.dmi' + extra_overlay= "fatlizard_markings" diff --git a/code/modules/vore/appearance/update_icons_vr.dm b/code/modules/vore/appearance/update_icons_vr.dm index 9185db35f3..15ebcc7c9f 100644 --- a/code/modules/vore/appearance/update_icons_vr.dm +++ b/code/modules/vore/appearance/update_icons_vr.dm @@ -1,25 +1,3 @@ -var/global/list/wing_icon_cache = list() - -/mob/living/carbon/human/proc/get_ears_overlay() - if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) - var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state) - if(ear_style.do_colouration) - ears_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), ear_style.color_blend_mode) - - if(ear_style.extra_overlay) - var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay) - overlay.Blend(rgb(src.r_ears2, src.g_ears2, src.b_ears2), ear_style.color_blend_mode) - ears_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(ear_style.extra_overlay2) //MORE COLOURS IS BETTERER - var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay2) - overlay.Blend(rgb(src.r_ears3, src.g_ears3, src.b_ears3), ear_style.color_blend_mode) - ears_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - return ears_s - return null - /mob/living/carbon/human/proc/get_hair_accessory_overlay() if(hair_accessory_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) var/icon/hair_acc_s = icon(hair_accessory_style.icon, hair_accessory_style.icon_state) @@ -27,99 +5,3 @@ var/global/list/wing_icon_cache = list() hair_acc_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), hair_accessory_style.color_blend_mode) return hair_acc_s return null - - -/mob/living/carbon/human/proc/get_tail_image() - //If you are FBP with tail style and didn't set a custom one - var/datum/robolimb/model = isSynthetic() - if(istype(model) && model.includes_tail && !tail_style) - var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail") - tail_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) - return image(tail_s) - - //If you have a custom tail selected - if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !isTaurTail(tail_style))) - var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state) - if(tail_style.do_colouration) - tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode) - if(tail_style.extra_overlay) - var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay) - if(wagging && tail_style.ani_state) - overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w) - overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - else - overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(tail_style.extra_overlay2) - var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2) - if(wagging && tail_style.ani_state) - overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2_w) - overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - else - overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(isTaurTail(tail_style)) - var/datum/sprite_accessory/tail/taur/taurtype = tail_style - if(taurtype.can_ride && !riding_datum) - riding_datum = new /datum/riding/taur(src) - verbs |= /mob/living/carbon/human/proc/taur_mount - verbs |= /mob/living/proc/toggle_rider_reins - return image(tail_s, "pixel_x" = -16) - else - return image(tail_s) - return null - -/mob/living/carbon/human/proc/get_wing_image() - if(QDESTROYING(src)) - return - - //If you are FBP with wing style and didn't set a custom one - if((synthetic && synthetic.includes_wing && !wing_style) && !wings_hidden) - var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing? - wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) - return image(wing_s) - - //If you have custom wings selected - if((wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) && !wings_hidden) - var/icon/wing_s = new/icon("icon" = wing_style.icon, "icon_state" = flapping && wing_style.ani_state ? wing_style.ani_state : wing_style.icon_state) - if(wing_style.do_colouration) - wing_s.Blend(rgb(src.r_wing, src.g_wing, src.b_wing), wing_style.color_blend_mode) - if(wing_style.extra_overlay) - var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay) - overlay.Blend(rgb(src.r_wing2, src.g_wing2, src.b_wing2), wing_style.color_blend_mode) - wing_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(wing_style.extra_overlay2) - var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2) - if(wing_style.ani_state) - overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2_w) - overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) - wing_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - else - overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) - wing_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - return image(wing_s) - - -// TODO - Move this to where it should go ~Leshana -/mob/proc/stop_flying() - if(QDESTROYING(src)) - return - flying = FALSE - return 1 - -/mob/living/carbon/human/stop_flying() - if((. = ..())) - update_wing_showing() \ No newline at end of file diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 99c0d94c00..c35c346c41 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -18,7 +18,6 @@ var/vore_verb = "ingest" // Verb for eating with this in messages var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else - var/emote_time = 60 SECONDS // How long between stomach emotes at prey var/nutrition_percent = 100 // Nutritional percentage per tick in digestion mode var/digest_brute = 0.5 // Brute damage per tick in digestion mode var/digest_burn = 0.5 // Burn damage per tick in digestion mode @@ -41,6 +40,10 @@ var/obj/item/weapon/storage/vore_egg/ownegg // Is this belly creating an egg? var/egg_type = "Egg" // Default egg type and path. var/egg_path = /obj/item/weapon/storage/vore_egg + var/list/emote_lists = list() // Idle emotes that happen on their own, depending on the bellymode. Contains lists of strings indexed by bellymode + var/emote_time = 60 // How long between stomach emotes at prey (in seconds) + var/emote_active = TRUE // Are we even giving emotes out at all or not? + var/next_emote = 0 // When we're supposed to print our next emote, as a world.time //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. //Actual full digest modes @@ -56,7 +59,6 @@ var/tmp/mob/living/owner // The mob whose belly this is. var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human) var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again. - var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a world.time var/tmp/recent_sound = FALSE // Prevent audio spam // Don't forget to watch your commas at the end of each line if you change these. @@ -113,11 +115,6 @@ var/contamination_flavor = "Generic" // Determines descriptions of contaminated items var/contamination_color = "green" // Color of contamination overlay - //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into - //a carbon's belly if someone really wanted. No UI for carbons to adjust this. - //List has indexes that are the digestion mode strings, and keys that are lists of strings. - var/tmp/list/emote_lists = list() - // Lets you do a fullscreen overlay. Set to an icon_state string. var/belly_fullscreen = "" var/disable_hud = FALSE @@ -152,6 +149,8 @@ "digest_messages_prey", "examine_messages", "emote_lists", + "emote_time", + "emote_active", "mode_flags", "item_digest_mode", "contaminates", @@ -164,6 +163,7 @@ "belly_fullscreen", "disable_hud", "reagent_mode_flags", //CHOMP start of variables from CHOMP + "belly_fullscreen_color", "reagentbellymode", "liquid_fullness1_messages", "liquid_fullness2_messages", @@ -840,6 +840,7 @@ dupe.wet_loop = wet_loop dupe.reagent_mode_flags = reagent_mode_flags //CHOMP start of variables from CHOMP + dupe.belly_fullscreen_color = belly_fullscreen_color dupe.reagentbellymode = reagentbellymode dupe.vorefootsteps_sounds = vorefootsteps_sounds dupe.liquid_fullness1_messages = liquid_fullness1_messages @@ -862,6 +863,8 @@ dupe.belly_fullscreen = belly_fullscreen dupe.disable_hud = disable_hud dupe.egg_type = egg_type + dupe.emote_time = emote_time + dupe.emote_active = emote_active //// Object-holding variables //struggle_messages_outside - strings diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 55f0c5cf1b..75a2540a0e 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -56,8 +56,8 @@ ///////////////////// Early Non-Mode Handling ///////////////////// var/list/EL = emote_lists[digest_mode] - if(LAZYLEN(EL) && touchable_mobs && next_emote <= world.time) - next_emote = world.time + emote_time + if(LAZYLEN(EL) && touchable_mobs && next_emote <= world.time && emote_active) + next_emote = world.time + (emote_time SECONDS) for(var/mob/living/M in contents) if(digest_mode == DM_DIGEST && !M.digestable) continue // don't give digesty messages to indigestible people diff --git a/code/modules/vore/eating/living_ch.dm b/code/modules/vore/eating/living_ch.dm index 5d8dc28d08..f51bc265b1 100644 --- a/code/modules/vore/eating/living_ch.dm +++ b/code/modules/vore/eating/living_ch.dm @@ -7,7 +7,7 @@ var/vore_footstep_chance = 0 var/vore_footstep_volume_cooldown = 0 //goes up each time a step isnt heard, and will proc update of list of viable bellies to determine the most filled and loudest one to base audio on. - var/parasitic = FALSE //Digestion immunity and nutrition leeching variable + var/parasitic = FALSE //Digestion immunity and nutrition leeching variable mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) @@ -66,6 +66,16 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) return message +/mob/living/proc/vore_check_reagents() + set name = "Check Belly Liquid (Vore)" + set category = "Abilities" + set desc = "Check the amount of liquid in your belly." + + var/obj/belly/RTB = input("Choose which vore belly to check") as null|anything in src.vore_organs + if(!RTB) + return FALSE + + to_chat(src, "[RTB] has [RTB.reagents.total_volume] units of liquid.") /mob/living/proc/vore_transfer_reagents() set name = "Transfer Liquid (Vore)" @@ -111,9 +121,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) return FALSE if(TG == user) - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from their [RTB] into their [TB].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [RTB] into their [TB].") else - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from [TG]'s [RTB] into their [TB].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [RTB] into their [TB].") add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s [TB]") //Bonus for staff so they can see if people have abused transfer and done pref breaks RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_VORE, 1, 0, TB) @@ -132,9 +142,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) return FALSE if(TG == user) - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from their [RTB] into [TR]'s [TB].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [RTB] into [TR]'s [TB].") else - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from [TG]s [RTB] into [TR]'s [TB].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]s [RTB] into [TR]'s [TB].") RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_VORE, 1, 0, TB) add_attack_logs(user,TR,"Transfered reagents from [TG]'s [RTB] to [TR]'s [TB]") //Bonus for staff so they can see if people have abused transfer and done pref breaks @@ -148,9 +158,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) if(TR == user) //Proceed, we dont need to have prefs enabled for transfer within user if(TG == user) - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from their [RTB] into their stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [RTB] into their stomach.") else - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from [TG]'s [RTB] into their stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [RTB] into their stomach.") RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_INGEST, 1, 0, null) add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s Stomach") @@ -160,9 +170,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) else if(TG == user) - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from their [RTB] into [TR]'s stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [RTB] into [TR]'s stomach.") else - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from [TG]'s [RTB] into [TR]'s stomach.") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [RTB] into [TR]'s stomach.") RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_INGEST, 1, 0, null) add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s Stomach") //Bonus for staff so they can see if people have abused transfer and done pref breaks @@ -178,9 +188,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) return //No long distance transfer if(TG == user) - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from their [RTB] into [T].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [RTB] into [T].") else - user.visible_message("[user] [RTB.reagent_transfer_verb]'s [RTB.reagent_name] from [TG]'s [RTB] into [T].") + user.custom_emote_vr(1, "[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [RTB] into [T].") RTB.reagents.vore_trans_to_con(T, transfer_amount, 1, 0) add_attack_logs(user, T,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to a [T]") //Bonus for staff so they can see if people have abused transfer and done pref breaks @@ -195,9 +205,9 @@ mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T) return if(TG == user) - user.visible_message("[user] spills [RTB.reagent_name] from their [RTB] onto the floor!") + user.custom_emote_vr(1, "spills [RTB.reagent_name] from their [RTB] onto the floor!") else - user.visible_message("[user] spills [RTB.reagent_name] from [TG]'s [RTB] onto the floor!") + user.custom_emote_vr(1, "spills [RTB.reagent_name] from [TG]'s [RTB] onto the floor!") var/obj/effect/decal/cleanable/blood/reagent/puddle = new /obj/effect/decal/cleanable/blood/reagent(RTB.reagent_name, RTB.reagentcolor, RTB.reagentid, puddle_amount, user.ckey, TG.ckey) puddle.loc = TG.loc diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 5173c469cc..55ccfee5be 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -23,8 +23,7 @@ var/noisy = FALSE // Toggle audible hunger. var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr. var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time. - var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon. - var/tail_alt = 0 // Tail layer toggle. + var/fuzzy = 0 // Preference toggle for sharp/fuzzy icon. var/permit_healbelly = TRUE var/can_be_drop_prey = FALSE var/can_be_drop_pred = TRUE // Mobs are pred by default. @@ -48,6 +47,12 @@ M.vorePanel = new(M) M.verbs += /mob/living/proc/insidePanel M.verbs += /mob/living/proc/vore_transfer_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything + M.verbs += /mob/living/proc/vore_check_reagents //CHOMP If mob doesnt have bellies it cant use this verb for anything + + //Tries to load prefs if a client is present otherwise gives freebie stomach + spawn(2 SECONDS) + if(M) + M.init_vore() //return TRUE to hook-caller return TRUE @@ -97,7 +102,6 @@ //Has to be aggressive grab, has to be living click-er and non-silicon grabbed if(G.state >= GRAB_AGGRESSIVE && (isliving(user) && !issilicon(G.affecting))) var/mob/living/attacker = user // Typecast to living - G.affecting.init_vore() // src is the mob clicked on and attempted predator @@ -148,10 +152,6 @@ var/mob/living/attacker = user // Typecast to living if(is_vore_predator(src)) for(var/mob/living/M in H.contents) - M.init_vore() - if(!M.devourable) - to_chat(user, "[M] isn't able to be devoured.") - return FALSE if(attacker.eat_held_mob(attacker, M, src)) if(H.held_mob == M) H.held_mob = null @@ -290,6 +290,7 @@ vore_organs.Cut() for(var/entry in P.belly_prefs) list_to_object(entry,src) + break //CHOMPedit: Belly load optimization. Only load first belly, save the rest for vorepanel. return TRUE @@ -852,6 +853,7 @@ set category = "Preferences" set desc = "Switch sharp/fuzzy scaling for current mob." appearance_flags ^= PIXEL_SCALE + fuzzy = !fuzzy /mob/living/examine(mob/user, infix, suffix) . = ..() diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index 02a3a77868..9272bd37f0 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -3,6 +3,12 @@ var/swallowTime = (3 SECONDS) //How long it takes to eat its prey in 1/10 of a second. The default is 3 seconds. var/list/prey_excludes = list() //For excluding people from being eaten. +/mob/living/simple_mob/insidePanel() //CHOMPedit: On-demand belly loading. + if(vore_active && !voremob_loaded) + voremob_loaded = TRUE + init_vore() + ..() + // // Simple nom proc for if you get ckey'd into a simple_mob mob! Avoids grabs. // @@ -11,10 +17,11 @@ set category = "IC" set desc = "Since you can't grab, you get a verb!" + if(vore_active && !voremob_loaded) //CHOMPedit: On-demand belly loading. + voremob_loaded = TRUE + init_vore() if(stat != CONSCIOUS) return - init_vore() - T.init_vore() // Verbs are horrifying. They don't call overrides. So we're stuck with this. if(istype(src, /mob/living/simple_mob/animal/passive/mouse) && !T.ckey) // Mice can't eat logged out players! diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index e889f9e08f..5a69bc9dc9 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -82,7 +82,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE // Check if an object is capable of eating things, based on vore_organs // /proc/is_vore_predator(mob/living/O) - O.init_vore() if(istype(O,/mob/living)) if(O.vore_organs.len > 0) return TRUE diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 3f99821e86..6a892c65d1 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -18,7 +18,16 @@ if(!vorePanel) log_debug("[src] ([type], \ref[src]) didn't have a vorePanel and tried to use the verb.") vorePanel = new(src) - init_vore() //CHOMPedit Returns if the organs already exist anyway. + + if(!vorePanel.bellies_loaded) //CHOMPedit Start: On-demand belly loading + var/datum/vore_preferences/P = client.prefs_vr + var/firstbelly = FALSE // First belly loaded on init_vore + for(var/entry in P.belly_prefs) + if(!firstbelly) + firstbelly = TRUE + continue + list_to_object(entry,src) + vorePanel.bellies_loaded = TRUE //CHOMPedit End vorePanel.tgui_interact(src) @@ -32,6 +41,7 @@ var/mob/living/host // Note, we do this in case we ever want to allow people to view others vore panels var/unsaved_changes = FALSE var/show_pictures = TRUE + var/bellies_loaded = FALSE //CHOMPedit: On-demand belly loading /datum/vore_look/New(mob/living/new_host) if(istype(new_host)) @@ -158,6 +168,8 @@ "digest_burn" = selected.digest_burn, "bulge_size" = selected.bulge_size, "shrink_grow_size" = selected.shrink_grow_size, + "emote_time" = selected.emote_time, + "emote_active" = selected.emote_active, "belly_fullscreen" = selected.belly_fullscreen, "belly_fullscreen_color" = selected.belly_fullscreen_color, //CHOMPEdit "mapRef" = map_name, //CHOMPEdit @@ -902,6 +914,16 @@ var/new_new_damage = CLAMP(new_damage, 0, 6) host.vore_selected.digest_brute = new_new_damage . = TRUE + if("b_emoteactive") + host.vore_selected.emote_active = !host.vore_selected.emote_active + . = TRUE + if("b_emotetime") + var/new_time = input(user, "Choose the period it takes for idle belly emotes to be shown to prey. Measured in seconds, Minimum 1 minute, Maximum 10 minutes.", "Set Belly Emote Delay.", host.vore_selected.digest_brute) + if(new_time == null) + return FALSE + var/new_new_time = CLAMP(new_time, 60, 600) + host.vore_selected.emote_time = new_new_time + . = TRUE if("b_escapable") if(host.vore_selected.escapable == 0) //Possibly escapable and special interactions. host.vore_selected.escapable = 1 @@ -1040,7 +1062,7 @@ host.vore_selected.reagent_name = new_name . = TRUE if("b_liq_reagent_transfer_verb") - var/new_verb = html_encode(input(usr,"New verb when liquid is transfered from this belly (infinitive tense, e.g. pump or inject):","New Verb") as text|null) + var/new_verb = html_encode(input(usr,"New verb when liquid is transfered from this belly:","New Verb") as text|null) if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN) alert("Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error") diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 776e7dad2e..53594ceef5 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -952,23 +952,6 @@ /obj/item/weapon/material/twohanded/fluff/New(var/newloc) ..(newloc," ") //See materials_vr_dmi for more information as to why this is a blank space. -//General use. -/obj/item/weapon/material/twohanded/fluff/riding_crop - name = "riding crop" - desc = "A steel rod, a little over a foot long with a widened grip and a thick, leather patch at the end. Made to smack naughty submissives." - //force_wielded = 0.05 //Stings, but does jack shit for damage, provided you don't hit someone 100 times. 1 damage with hardness of 60. - force_divisor = 0.05 //Required in order for the X attacks Y message to pop up. - unwielded_force_divisor = 1 // One here, too. - applies_material_colour = 0 - unbreakable = 1 - base_icon = "riding_crop" - icon_state = "riding_crop0" - attack_verb = list("cropped","spanked","swatted","smacked","peppered") -//1R1S: Malady Blanche -/obj/item/weapon/material/twohanded/fluff/riding_crop/malady - name = "Malady's riding crop" - desc = "An infernum made riding crop with Malady Blanche engraved in the shaft. It's a little worn from how many butts it has spanked." - //jacknoir413:Areax Third /obj/item/weapon/melee/baton/fluff/stunstaff name = "Electrostaff" diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index 8075c8132b..eb14ffb20e 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -144,7 +144,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 var/nagmessage = "Adjust your mass to be a size between 25 to 200% (or 1% to 600% in dormitories). (DO NOT ABUSE)" var/new_size = input(nagmessage, "Pick a Size") as num|null - if(new_size && ISINRANGE(new_size, 25, 200)) + if(size_range_check(new_size)) resize(new_size/100) // I'm not entirely convinced that `src ? ADMIN_JMP(src) : "null"` here does anything // but just in case it does, I'm leaving the null-src checking diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm index b428337f16..e30c218fbb 100644 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -24,7 +24,10 @@ /obj/item/weapon/gun/energy/sizegun/New() ..() - verbs += /obj/item/weapon/gun/energy/sizegun/proc/select_size + if(istype(src, /obj/item/weapon/gun/energy/sizegun/admin)) + verbs += /obj/item/weapon/gun/energy/sizegun/admin/select_size + else + verbs += /obj/item/weapon/gun/energy/sizegun/proc/select_size /obj/item/weapon/gun/energy/sizegun/attack_self(mob/user) . = ..() @@ -65,7 +68,7 @@ var/size_select = input("Put the desired size", "Set Size", size_set_to * 100) as num size_set_to = max(1,size_select/100) //No negative numbers - to_chat(usr, "You set the size to [size_set_to]%") + to_chat(usr, "You set the size to [size_select]%") // // Beams for size gun diff --git a/html/changelog.html b/html/changelog.html index b8143c8dba..f5813382aa 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -40,6 +40,25 @@ -->
+

25 March 2021

+

Fenodyree updated:

+
    +
  • Adds adds random encounters with Sif mobs in the wilderness.
  • +
+ +

22 March 2021

+

CHOMPStationBot updated:

+
    +
  • Talon alt-titles no longer show up under miscellaneous on the manifest
  • +
  • https://github.com/VOREStation/VOREStation/issues/9975
  • +
+ +

20 March 2021

+

None updated:

+
    +
  • Fixes tracking implant cost to 0, not 10, as a VS edit.
  • +
+

12 March 2021

CHOMPStationBot updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index cb572d252e..7c53e1fe80 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -5517,3 +5517,13 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: Fixed laptop vendors not selling tesla relays on tablets - rscadd: Tested. Appears to have been changed unintentionally in the nanoui -> tgui switchover. +2021-03-20: + null: + - tweak: Fixes tracking implant cost to 0, not 10, as a VS edit. +2021-03-22: + CHOMPStationBot: + - bugfix: Talon alt-titles no longer show up under miscellaneous on the manifest + - bugfix: https://github.com/VOREStation/VOREStation/issues/9975 +2021-03-25: + Fenodyree: + - rscadd: Adds adds random encounters with Sif mobs in the wilderness. diff --git a/icons/effects/species_tails.dmi b/icons/effects/species_tails.dmi new file mode 100644 index 0000000000..5fea0671c6 Binary files /dev/null and b/icons/effects/species_tails.dmi differ diff --git a/icons/effects/thinktank_labels.dmi b/icons/effects/thinktank_labels.dmi new file mode 100644 index 0000000000..abd5a139d7 Binary files /dev/null and b/icons/effects/thinktank_labels.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index f265594a8d..a20911d435 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/feet_ch.dmi b/icons/mob/feet_ch.dmi index 27a4757a62..a098b2a027 100644 Binary files a/icons/mob/feet_ch.dmi and b/icons/mob/feet_ch.dmi differ diff --git a/icons/mob/hands_ch.dmi b/icons/mob/hands_ch.dmi new file mode 100644 index 0000000000..13cccb3df0 Binary files /dev/null and b/icons/mob/hands_ch.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index c580e2ccd4..4a5e549c7d 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/head_ch.dmi b/icons/mob/head_ch.dmi index fa54729c83..854f1d2676 100644 Binary files a/icons/mob/head_ch.dmi and b/icons/mob/head_ch.dmi differ diff --git a/icons/mob/human_races/markings_alt.dmi b/icons/mob/human_races/markings_alt.dmi new file mode 100644 index 0000000000..e9fcad5e63 Binary files /dev/null and b/icons/mob/human_races/markings_alt.dmi differ diff --git a/icons/mob/human_races/sprite_accessories/ears.dmi b/icons/mob/human_races/sprite_accessories/ears.dmi new file mode 100644 index 0000000000..243b901e8e Binary files /dev/null and b/icons/mob/human_races/sprite_accessories/ears.dmi differ diff --git a/icons/mob/human_races/sprite_accessories/tails.dmi b/icons/mob/human_races/sprite_accessories/tails.dmi new file mode 100644 index 0000000000..5e4a27597f Binary files /dev/null and b/icons/mob/human_races/sprite_accessories/tails.dmi differ diff --git a/icons/mob/human_races/sprite_accessories/taurs.dmi b/icons/mob/human_races/sprite_accessories/taurs.dmi new file mode 100644 index 0000000000..69d0a91388 Binary files /dev/null and b/icons/mob/human_races/sprite_accessories/taurs.dmi differ diff --git a/icons/mob/human_races/sprite_accessories/wings.dmi b/icons/mob/human_races/sprite_accessories/wings.dmi new file mode 100644 index 0000000000..2042d667f2 Binary files /dev/null and b/icons/mob/human_races/sprite_accessories/wings.dmi differ diff --git a/icons/mob/items/lefthand_holder.dmi b/icons/mob/items/lefthand_holder.dmi index 14cd2406f0..dcbe69902a 100644 Binary files a/icons/mob/items/lefthand_holder.dmi and b/icons/mob/items/lefthand_holder.dmi differ diff --git a/icons/mob/items/lefthand_material.dmi b/icons/mob/items/lefthand_material.dmi index a2f035cd58..7fbcc1131f 100644 Binary files a/icons/mob/items/lefthand_material.dmi and b/icons/mob/items/lefthand_material.dmi differ diff --git a/icons/mob/items/righthand_holder.dmi b/icons/mob/items/righthand_holder.dmi index 19bb1967f6..a29bb598ed 100644 Binary files a/icons/mob/items/righthand_holder.dmi and b/icons/mob/items/righthand_holder.dmi differ diff --git a/icons/mob/items/righthand_material.dmi b/icons/mob/items/righthand_material.dmi index 6895183a5b..ac51aa86f1 100644 Binary files a/icons/mob/items/righthand_material.dmi and b/icons/mob/items/righthand_material.dmi differ diff --git a/icons/mob/limb_mask.dmi b/icons/mob/limb_mask.dmi index ba4d0e3456..4d83672aa4 100644 Binary files a/icons/mob/limb_mask.dmi and b/icons/mob/limb_mask.dmi differ diff --git a/icons/mob/mecha.dmi b/icons/mob/mecha.dmi index a6d3b13773..975e46371d 100644 Binary files a/icons/mob/mecha.dmi and b/icons/mob/mecha.dmi differ diff --git a/icons/mob/rig_back.dmi b/icons/mob/rig_back.dmi index dfeea2ece0..826dfdb447 100644 Binary files a/icons/mob/rig_back.dmi and b/icons/mob/rig_back.dmi differ diff --git a/icons/mob/robots_thinktank.dmi b/icons/mob/robots_thinktank.dmi new file mode 100644 index 0000000000..471647bf60 Binary files /dev/null and b/icons/mob/robots_thinktank.dmi differ diff --git a/icons/mob/screen1_robot.dmi b/icons/mob/screen1_robot.dmi index ccad7e0f4a..e4ae2f77c8 100644 Binary files a/icons/mob/screen1_robot.dmi and b/icons/mob/screen1_robot.dmi differ diff --git a/icons/mob/screen_full_vore.dmi b/icons/mob/screen_full_vore.dmi index 349e8b0315..3759bcf1c8 100644 Binary files a/icons/mob/screen_full_vore.dmi and b/icons/mob/screen_full_vore.dmi differ diff --git a/icons/mob/spacesuit_ch.dmi b/icons/mob/spacesuit_ch.dmi new file mode 100644 index 0000000000..c1cd4ba515 Binary files /dev/null and b/icons/mob/spacesuit_ch.dmi differ diff --git a/icons/mob/species/akula/helmet_ch.dmi b/icons/mob/species/akula/helmet_ch.dmi index 24f1ff4a07..14238cb455 100644 Binary files a/icons/mob/species/akula/helmet_ch.dmi and b/icons/mob/species/akula/helmet_ch.dmi differ diff --git a/icons/mob/species/akula/suit_ch.dmi b/icons/mob/species/akula/suit_ch.dmi index ce52ab935e..6ca4733a32 100644 Binary files a/icons/mob/species/akula/suit_ch.dmi and b/icons/mob/species/akula/suit_ch.dmi differ diff --git a/icons/mob/species/fennec/helmet_ch.dmi b/icons/mob/species/fennec/helmet_ch.dmi index 24f1ff4a07..57c666415a 100644 Binary files a/icons/mob/species/fennec/helmet_ch.dmi and b/icons/mob/species/fennec/helmet_ch.dmi differ diff --git a/icons/mob/species/fennec/suit_ch.dmi b/icons/mob/species/fennec/suit_ch.dmi index 6f886d2baf..71d96142e5 100644 Binary files a/icons/mob/species/fennec/suit_ch.dmi and b/icons/mob/species/fennec/suit_ch.dmi differ diff --git a/icons/mob/species/fox/helmet_ch.dmi b/icons/mob/species/fox/helmet_ch.dmi index 24f1ff4a07..57c666415a 100644 Binary files a/icons/mob/species/fox/helmet_ch.dmi and b/icons/mob/species/fox/helmet_ch.dmi differ diff --git a/icons/mob/species/fox/suit_ch.dmi b/icons/mob/species/fox/suit_ch.dmi index 6f886d2baf..71d96142e5 100644 Binary files a/icons/mob/species/fox/suit_ch.dmi and b/icons/mob/species/fox/suit_ch.dmi differ diff --git a/icons/mob/species/sergal/helmet_ch.dmi b/icons/mob/species/sergal/helmet_ch.dmi index 24f1ff4a07..14238cb455 100644 Binary files a/icons/mob/species/sergal/helmet_ch.dmi and b/icons/mob/species/sergal/helmet_ch.dmi differ diff --git a/icons/mob/species/sergal/suit_ch.dmi b/icons/mob/species/sergal/suit_ch.dmi index ce98c97dde..6b7cf3eb75 100644 Binary files a/icons/mob/species/sergal/suit_ch.dmi and b/icons/mob/species/sergal/suit_ch.dmi differ diff --git a/icons/mob/species/skrell/helmet_ch.dmi b/icons/mob/species/skrell/helmet_ch.dmi index 68f6e0951b..3c9ce45d37 100644 Binary files a/icons/mob/species/skrell/helmet_ch.dmi and b/icons/mob/species/skrell/helmet_ch.dmi differ diff --git a/icons/mob/species/skrell/suit_ch.dmi b/icons/mob/species/skrell/suit_ch.dmi index d8ef9a52fe..cc07b90015 100644 Binary files a/icons/mob/species/skrell/suit_ch.dmi and b/icons/mob/species/skrell/suit_ch.dmi differ diff --git a/icons/mob/species/tajaran/helmet_ch.dmi b/icons/mob/species/tajaran/helmet_ch.dmi index f6b7eed222..828823a868 100644 Binary files a/icons/mob/species/tajaran/helmet_ch.dmi and b/icons/mob/species/tajaran/helmet_ch.dmi differ diff --git a/icons/mob/species/tajaran/suit_ch.dmi b/icons/mob/species/tajaran/suit_ch.dmi index d8ef9a52fe..da5aa22ae5 100644 Binary files a/icons/mob/species/tajaran/suit_ch.dmi and b/icons/mob/species/tajaran/suit_ch.dmi differ diff --git a/icons/mob/species/unathi/helmet_ch.dmi b/icons/mob/species/unathi/helmet_ch.dmi index 1d6bec5d6f..f877e2f35b 100644 Binary files a/icons/mob/species/unathi/helmet_ch.dmi and b/icons/mob/species/unathi/helmet_ch.dmi differ diff --git a/icons/mob/species/unathi/suit_ch.dmi b/icons/mob/species/unathi/suit_ch.dmi index 1ce6ef1379..527a45918d 100644 Binary files a/icons/mob/species/unathi/suit_ch.dmi and b/icons/mob/species/unathi/suit_ch.dmi differ diff --git a/icons/mob/species/vox/gloves_ch.dmi b/icons/mob/species/vox/gloves_ch.dmi new file mode 100644 index 0000000000..043d409ab4 Binary files /dev/null and b/icons/mob/species/vox/gloves_ch.dmi differ diff --git a/icons/mob/species/vox/head_ch.dmi b/icons/mob/species/vox/head_ch.dmi new file mode 100644 index 0000000000..5bfd81ffea Binary files /dev/null and b/icons/mob/species/vox/head_ch.dmi differ diff --git a/icons/mob/species/vox/shoes_ch.dmi b/icons/mob/species/vox/shoes_ch.dmi new file mode 100644 index 0000000000..14a1c8ff2e Binary files /dev/null and b/icons/mob/species/vox/shoes_ch.dmi differ diff --git a/icons/mob/species/vox/suit_ch.dmi b/icons/mob/species/vox/suit_ch.dmi new file mode 100644 index 0000000000..58ecc85ca4 Binary files /dev/null and b/icons/mob/species/vox/suit_ch.dmi differ diff --git a/icons/mob/species/vulpkanin/helmet_ch.dmi b/icons/mob/species/vulpkanin/helmet_ch.dmi index c01233fd1b..6eb6c34963 100644 Binary files a/icons/mob/species/vulpkanin/helmet_ch.dmi and b/icons/mob/species/vulpkanin/helmet_ch.dmi differ diff --git a/icons/mob/species/vulpkanin/suit_ch.dmi b/icons/mob/species/vulpkanin/suit_ch.dmi index b32ec0f8bc..a53ab8ceb1 100644 Binary files a/icons/mob/species/vulpkanin/suit_ch.dmi and b/icons/mob/species/vulpkanin/suit_ch.dmi differ diff --git a/icons/mob/taursuits_cow.dmi b/icons/mob/taursuits_cow.dmi new file mode 100644 index 0000000000..ce592d5edb Binary files /dev/null and b/icons/mob/taursuits_cow.dmi differ diff --git a/icons/mob/taursuits_deer.dmi b/icons/mob/taursuits_deer.dmi new file mode 100644 index 0000000000..6c53a6f4d0 Binary files /dev/null and b/icons/mob/taursuits_deer.dmi differ diff --git a/icons/mob/taursuits_drake.dmi b/icons/mob/taursuits_drake.dmi new file mode 100644 index 0000000000..ca0db57532 Binary files /dev/null and b/icons/mob/taursuits_drake.dmi differ diff --git a/icons/mob/taursuits_feline.dmi b/icons/mob/taursuits_feline.dmi new file mode 100644 index 0000000000..1d4c597e02 Binary files /dev/null and b/icons/mob/taursuits_feline.dmi differ diff --git a/icons/mob/taursuits_horse.dmi b/icons/mob/taursuits_horse.dmi new file mode 100644 index 0000000000..4162463c69 Binary files /dev/null and b/icons/mob/taursuits_horse.dmi differ diff --git a/icons/mob/taursuits_lizard.dmi b/icons/mob/taursuits_lizard.dmi new file mode 100644 index 0000000000..a6b9858f17 Binary files /dev/null and b/icons/mob/taursuits_lizard.dmi differ diff --git a/icons/mob/taursuits_naga.dmi b/icons/mob/taursuits_naga.dmi new file mode 100644 index 0000000000..7df326318c Binary files /dev/null and b/icons/mob/taursuits_naga.dmi differ diff --git a/icons/mob/taursuits_naga_ch.dmi b/icons/mob/taursuits_naga_ch.dmi new file mode 100644 index 0000000000..a532e22a5f Binary files /dev/null and b/icons/mob/taursuits_naga_ch.dmi differ diff --git a/icons/mob/taursuits_otie.dmi b/icons/mob/taursuits_otie.dmi new file mode 100644 index 0000000000..06e083854e Binary files /dev/null and b/icons/mob/taursuits_otie.dmi differ diff --git a/icons/mob/taursuits_slug.dmi b/icons/mob/taursuits_slug.dmi new file mode 100644 index 0000000000..98692375f3 Binary files /dev/null and b/icons/mob/taursuits_slug.dmi differ diff --git a/icons/mob/taursuits_spider.dmi b/icons/mob/taursuits_spider.dmi new file mode 100644 index 0000000000..b8090eceaa Binary files /dev/null and b/icons/mob/taursuits_spider.dmi differ diff --git a/icons/mob/taursuits_wolf.dmi b/icons/mob/taursuits_wolf.dmi new file mode 100644 index 0000000000..0f638ea6d3 Binary files /dev/null and b/icons/mob/taursuits_wolf.dmi differ diff --git a/icons/mob/vore/taurs_ch.dmi b/icons/mob/vore/taurs_ch.dmi index 66bc20e205..9ae9985582 100644 Binary files a/icons/mob/vore/taurs_ch.dmi and b/icons/mob/vore/taurs_ch.dmi differ diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi index 922dd12508..b85ea96357 100644 Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ diff --git a/icons/obj/clothing/gloves_ch.dmi b/icons/obj/clothing/gloves_ch.dmi new file mode 100644 index 0000000000..f7b14b7a6c Binary files /dev/null and b/icons/obj/clothing/gloves_ch.dmi differ diff --git a/icons/obj/clothing/hats_ch.dmi b/icons/obj/clothing/hats_ch.dmi index c79fdb08b3..3c869c5949 100644 Binary files a/icons/obj/clothing/hats_ch.dmi and b/icons/obj/clothing/hats_ch.dmi differ diff --git a/icons/obj/clothing/shoes_ch.dmi b/icons/obj/clothing/shoes_ch.dmi new file mode 100644 index 0000000000..457561366c Binary files /dev/null and b/icons/obj/clothing/shoes_ch.dmi differ diff --git a/icons/obj/clothing/spacesuits_ch.dmi b/icons/obj/clothing/spacesuits_ch.dmi new file mode 100644 index 0000000000..5f41ee8c75 Binary files /dev/null and b/icons/obj/clothing/spacesuits_ch.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 0a112657ea..68188dd88a 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/rig_modules_ch.dmi b/icons/obj/rig_modules_ch.dmi new file mode 100644 index 0000000000..24de8390d9 Binary files /dev/null and b/icons/obj/rig_modules_ch.dmi differ diff --git a/maps/southern_cross/events/wildlife_encounter.dm b/maps/southern_cross/events/wildlife_encounter.dm new file mode 100644 index 0000000000..0a045f9f17 --- /dev/null +++ b/maps/southern_cross/events/wildlife_encounter.dm @@ -0,0 +1,103 @@ +// This event sends random sif mobs at someone in the wilderness, unannounced. + +/datum/event2/meta/wildlife_encounter + name = "random encounter" + departments = list(DEPARTMENT_EVERYONE) + chaos = 10 + event_type = /datum/event2/event/wildlife_encounter + +/datum/event2/meta/wildlife_encounter/get_weight() + var/explorers = metric.count_people_with_job(/datum/job/explorer) + metric.count_people_with_job(/datum/job/sar) + + if(!explorers) + return 0 + return 20 + explorers * 50 + +/datum/event2/event/wildlife_encounter + var/mob/living/victim = null + var/list/potential_victims = list() + +/datum/event2/event/wildlife_encounter/set_up() + for(var/mob/living/L in player_list) + //if(!(L.z in get_location_z_levels())) + // log_debug("Not on the right z-level") + // continue // Not on the right z-level. + if(L.stat) + continue // Don't want dead people. + if(istype(get_turf(L), /turf/simulated/floor/outdoors) && istype(get_area(L),/area/surface/outside/wilderness)) + potential_victims += L + + if(potential_victims.len) + victim = pick(potential_victims) + +/datum/event2/event/wildlife_encounter/start() + if(!victim) + log_debug("Failed to find a target for random encounter. Aborting.") + abort() + return + + var/number_of_packs = rand(1, 3) + // Getting off screen tiles is kind of tricky due to potential edge cases that could arise. + // The method we're gonna do is make a big square around the victim, then + // subtract a smaller square in the middle for the default vision range. + + var/list/outer_square = get_safe_square(victim, world.view + 5) + var/list/inner_square = get_safe_square(victim, world.view + 1) + + var/list/donut = outer_square - inner_square + for(var/T in donut) + if(!istype(T, /turf/simulated/floor/outdoors)) + donut -= T + + var/build_path = item_to_spawn() + var/turf/spawning_turf = null + var/attempts = 0 + + while (!spawning_turf && attempts != 10) + spawning_turf = pick(donut) + for(var/i = 1 to potential_victims.len) + if (get_dist(spawning_turf, potential_victims[i]) < world.view) + spawning_turf = null + log_debug("Failed to locate position out of sight of [potential_victims[i]].") + attempts++ + + potential_victims = null + + log_debug("Sending [number_of_packs] [build_path]\s after \the [victim].") + for(var/i = 1 to number_of_packs) + + if(spawning_turf) + var/mob/living/simple_mob/M = new build_path(spawning_turf) + M.ai_holder?.give_destination(get_turf(victim)) + else + log_debug("Failed to locate turf to spawn encounter.") + +/datum/event2/event/wildlife_encounter/proc/item_to_spawn() + return pick(prob(22);/mob/living/simple_mob/animal/sif/savik, + prob(20);/mob/living/simple_mob/animal/sif/frostfly, + prob(10);/mob/living/simple_mob/animal/sif/tymisian, + prob(45);/mob/living/simple_mob/animal/sif/shantak, + prob(15);/mob/living/simple_mob/animal/sif/kururak/hibernate, + prob(10);/mob/living/simple_mob/animal/sif/kururak, + prob(3);/mob/living/simple_mob/animal/giant_spider, + prob(8);/mob/living/simple_mob/animal/giant_spider/hunter, + prob(3);/mob/living/simple_mob/animal/giant_spider/webslinger, + prob(3);/mob/living/simple_mob/animal/giant_spider/carrier, + prob(6);/mob/living/simple_mob/animal/giant_spider/lurker, + prob(4);/mob/living/simple_mob/animal/giant_spider/tunneler, + prob(5);/mob/living/simple_mob/animal/giant_spider/pepper, + prob(5);/mob/living/simple_mob/animal/giant_spider/thermic, + prob(1);/mob/living/simple_mob/animal/giant_spider/phorogenic, + prob(30);/mob/living/simple_mob/animal/giant_spider/frost) + +/datum/event2/event/wildlife_encounter/proc/get_safe_square(atom/center, radius) + var/lower_left_x = max(center.x - radius, 1 + TRANSITIONEDGE) + var/lower_left_y = max(center.y - radius, 1 + TRANSITIONEDGE) + + var/upper_right_x = min(center.x + radius, world.maxx - TRANSITIONEDGE) + var/upper_right_y = min(center.y + radius, world.maxy - TRANSITIONEDGE) + + var/turf/lower_left = locate(lower_left_x, lower_left_y, victim.z) + var/turf/upper_right = locate(upper_right_x, upper_right_y, victim.z) + + return block(lower_left, upper_right) diff --git a/maps/southern_cross/items/clothing/sc_under.dm b/maps/southern_cross/items/clothing/sc_under.dm index 9f73935e80..3f7f7eb1a8 100644 --- a/maps/southern_cross/items/clothing/sc_under.dm +++ b/maps/southern_cross/items/clothing/sc_under.dm @@ -12,6 +12,9 @@ ) starting_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot1) +/obj/item/clothing/under/rank/pilot1/no_webbing + starting_accessories = null + /obj/item/clothing/under/rank/pilot2 name = "\improper NanoTrasen flight suit" desc = "A dark blue NanoTrasen flight suit. Warm and practical, seveal patches are scattered across it." @@ -24,4 +27,7 @@ sprite_sheets = list( "Teshari" = 'maps/southern_cross/icons/mob/species/teshari/sc_uniform.dmi' ) - starting_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot2) \ No newline at end of file + starting_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot2) + +/obj/item/clothing/under/rank/pilot2/no_webbing + starting_accessories = null diff --git a/maps/southern_cross/job/outfits.dm b/maps/southern_cross/job/outfits.dm index 6310c29afd..56e62dd28d 100644 --- a/maps/southern_cross/job/outfits.dm +++ b/maps/southern_cross/job/outfits.dm @@ -39,11 +39,12 @@ Keep outfits simple. Spawn with basic uniforms and minimal gear. Gear instead go /decl/hierarchy/outfit/job/pilot name = OUTFIT_JOB_NAME("Pilot") shoes = /obj/item/clothing/shoes/black - uniform = /obj/item/clothing/under/rank/pilot1 + uniform = /obj/item/clothing/under/rank/pilot1/no_webbing suit = /obj/item/clothing/suit/storage/toggle/bomber/pilot gloves = /obj/item/clothing/gloves/fingerless glasses = /obj/item/clothing/glasses/fakesunglasses/aviator l_ear = /obj/item/device/radio/headset/pilot/alt + uniform_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot1 = 1) id_slot = slot_wear_id pda_slot = slot_belt pda_type = /obj/item/device/pda //VOREStation Edit - Civilian diff --git a/maps/southern_cross/southern_cross-1.dmm b/maps/southern_cross/southern_cross-1.dmm index c357197461..4ece23ffd2 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -4,19 +4,19 @@ "aad" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) "aae" = (/obj/structure/lattice,/obj/structure/grille/broken,/obj/machinery/shield_diffuser,/turf/space,/area/space) "aaf" = (/obj/structure/lattice,/turf/space,/area/space) -"aag" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/space,/turf/simulated/floor/tiled,/area/construction/firstdeck/construction5) -"aah" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/item/weapon/tool/wirecutters,/turf/space,/turf/simulated/floor/tiled,/area/construction/firstdeck/construction5) -"aai" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/space,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet/firstdeck) +"aag" = (/turf/space,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/construction/firstdeck/construction5) +"aah" = (/turf/space,/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/item/weapon/tool/wirecutters,/turf/simulated/floor/tiled,/area/construction/firstdeck/construction5) +"aai" = (/turf/space,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet/firstdeck) "aaj" = (/obj/effect/landmark{name = "bluespacerift"},/turf/space,/area/space) -"aak" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/space,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet/firstdeck) +"aak" = (/turf/space,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/toilet/firstdeck) "aal" = (/obj/machinery/shield_diffuser,/turf/simulated/floor/airless,/area/hallway/primary/firstdeck/auxdockfore) "aam" = (/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/firstdeck/auxdockfore) -"aan" = (/obj/structure/table/glass,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/weapon/weldingtool,/obj/item/clothing/head/welding,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/space,/turf/simulated/floor/tiled/techfloor,/area/rnd/xenobiology) +"aan" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/foreport) "aao" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "d1fore_port2_outer"; locked = 1; name = "Dock External Airlock"; req_access = list(13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "d1fore_port2_airlock"; name = "exterior access button"; pixel_x = 26; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/hallway/primary/firstdeck/auxdockfore) -"aap" = (/obj/structure/table/glass,/obj/item/weapon/surgical/scalpel{pixel_y = 12},/obj/item/weapon/surgical/circular_saw,/obj/machinery/camera/network/research{c_tag = "SCI - Xenobiology Fore Starboard"; dir = 4},/obj/effect/floor_decal/corner_steel_grid{dir = 5},/obj/effect/floor_decal/spline/plain{dir = 1},/turf/space,/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"aap" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/catwalk,/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/forestarboard) "aaq" = (/obj/machinery/ai_status_display{pixel_y = 32},/obj/structure/table,/turf/simulated/floor/holofloor/wood,/area/construction/firstdeck) "aar" = (/turf/simulated/floor/holofloor/wood,/area/construction/firstdeck) -"aas" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/obj/machinery/light{dir = 8},/turf/space,/turf/simulated/floor/tiled/white,/area/rnd/research/firstdeck/hallway) +"aas" = (/turf/space,/obj/structure/table/glass,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/obj/item/weapon/weldingtool,/obj/item/clothing/head/welding,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/techfloor,/area/rnd/xenobiology) "aat" = (/obj/machinery/camera/network/civilian{c_tag = "CIV - Station Gym"},/turf/simulated/floor/plating,/area/construction/firstdeck) "aau" = (/obj/machinery/status_display{pixel_y = 32},/turf/simulated/floor/plating,/area/construction/firstdeck) "aav" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{frequency = 1379; id_tag = "d1fore_port2_pump"},/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/hallway/primary/firstdeck/auxdockfore) @@ -37,7 +37,7 @@ "aaK" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "d1fore_port_airlock"; name = "exterior access button"; pixel_x = -26; req_access = null},/obj/machinery/light/small{dir = 8},/obj/machinery/shield_diffuser,/turf/simulated/floor/airless,/area/maintenance/firstdeck/foreport) "aaL" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/shield_diffuser,/turf/simulated/floor/airless,/area/maintenance/firstdeck/foreport) "aaM" = (/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled,/area/construction/firstdeck) -"aaN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/door/window/brigdoor/southright{name = "Containment Pen"; req_access = list(47)},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/space,/turf/simulated/floor/tiled/techmaint,/area/rnd/xenobiology) +"aaN" = (/turf/space,/obj/structure/table/glass,/obj/item/weapon/surgical/scalpel{pixel_y = 12},/obj/item/weapon/surgical/circular_saw,/obj/machinery/camera/network/research{c_tag = "SCI - Xenobiology Fore Starboard"; dir = 4},/obj/effect/floor_decal/corner_steel_grid{dir = 5},/obj/effect/floor_decal/spline/plain{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology) "aaO" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 28},/turf/simulated/floor/tiled,/area/construction/firstdeck) "aaP" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{id_tag = "d1fore_port2_airlock"; pixel_y = -26; req_access = list(13); tag_airpump = "d1fore_port2_pump"; tag_chamber_sensor = "d1fore_port2_sensor"; tag_exterior_door = "d1fore_port2_outer"; tag_interior_door = "d1fore_port2_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "d1fore_port2_pump"},/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/hallway/primary/firstdeck/auxdockfore) "aaQ" = (/obj/machinery/airlock_sensor{id_tag = "d1fore_port2_sensor"; pixel_y = -25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "d1fore_port2_pump"},/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/hallway/primary/firstdeck/auxdockfore) @@ -70,10 +70,10 @@ "abr" = (/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/hallway/primary/firstdeck/auxdockfore) "abs" = (/obj/machinery/alarm{dir = 4; pixel_x = -22},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fore) "abt" = (/obj/effect/shuttle_landmark{base_area = /area/space; base_turf = /turf/space; landmark_tag = "d1_near_nw"; name = "Near SC - Deck 1 North West"},/turf/space,/area/space) -"abu" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/warning,/obj/machinery/button/remote/blast_door{id = "xenobio6station"; name = "Containment Blast Doors"; pixel_y = 4; req_access = list(55)},/turf/space,/turf/simulated/floor/tiled/dark,/area/rnd/xenobiology) -"abv" = (/obj/effect/floor_decal/corner_steel_grid{dir = 10},/obj/effect/floor_decal/spline/plain,/turf/space,/turf/simulated/floor/tiled,/area/rnd/xenobiology) +"abu" = (/turf/space,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/research/firstdeck/hallway) +"abv" = (/turf/space,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/door/window/brigdoor/southright{name = "Containment Pen"; req_access = list(47)},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/techmaint,/area/rnd/xenobiology) "abw" = (/obj/structure/stairs/spawner/east,/turf/simulated/floor/tiled/dark,/area/hallway/primary/firstdeck/fore) -"abx" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/turf/space,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology) +"abx" = (/turf/space,/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/industrial/warning,/obj/machinery/button/remote/blast_door{id = "xenobio6station"; name = "Containment Blast Doors"; pixel_y = 4; req_access = list(55)},/turf/simulated/floor/tiled/dark,/area/rnd/xenobiology) "aby" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_1_hatch"; locked = 1; name = "Escape Pod 1 Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod1/station) "abz" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{id_tag = "d1fore_starboard_airlock"; pixel_x = -26; req_access = null; tag_airpump = "d1fore_starboard_pump"; tag_chamber_sensor = "d1fore_starboard_sensor"; tag_exterior_door = "d1fore_starboard_outer"; tag_interior_door = "d1fore_starboard_inner"},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "d1fore_starboard_pump"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/forestarboard) "abA" = (/obj/machinery/airlock_sensor{id_tag = "d1fore_starboard_sensor"; pixel_x = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 4; frequency = 1379; id_tag = "d1fore_starboard_pump"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/forestarboard) @@ -84,7 +84,7 @@ "abF" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/maintenance/firstdeck/foreport) "abG" = (/obj/machinery/newscaster{layer = 3.3; pixel_y = -27},/turf/simulated/floor/tiled,/area/construction/firstdeck) "abH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/turf/simulated/floor/tiled,/area/construction/firstdeck) -"abI" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/turf/space,/turf/simulated/floor/tiled/white,/area/rnd/xenobiology) +"abI" = (/turf/space,/obj/effect/floor_decal/corner_steel_grid{dir = 10},/obj/effect/floor_decal/spline/plain,/turf/simulated/floor/tiled,/area/rnd/xenobiology) "abJ" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/construction/firstdeck) "abK" = (/obj/structure/closet/hydrant{pixel_x = -32},/obj/item/clothing/glasses/meson,/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/plating,/area/storage/emergency_storage/firstdeck/fore_emergency) "abL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/emergency_storage/firstdeck/fore_emergency) @@ -106,10 +106,13 @@ "acb" = (/turf/simulated/wall,/area/storage/emergency_storage/firstdeck/fore_emergency) "acc" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock{name = "Emergency Storage"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/emergency_storage/firstdeck/fore_emergency) "acd" = (/obj/machinery/newscaster,/turf/simulated/wall/r_wall,/area/storage/emergency_storage/firstdeck/fore_emergency) -"ace" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/random/mob/mouse,/turf/space,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard) +"ace" = (/turf/space,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/purple/border{dir = 1},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology) "acf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/firstdeck/fore) "acg" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fore) +"ach" = (/turf/space,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/xenobiology) +"aci" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard) "acj" = (/obj/effect/overmap/visitable/sector/Southern_Cross,/turf/space,/area/space) +"ack" = (/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftport) "acl" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fore) "acm" = (/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fore) "acn" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/hallway/primary/firstdeck/fore) @@ -130,6 +133,7 @@ "acC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/firstdeck/fore) "acD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fore) "acE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/red/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fore) +"acF" = (/turf/space,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/random/mob/mouse,/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard) "acK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/white/border{dir = 1},/obj/machinery/status_display{layer = 4; pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fore) "acL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/white/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fore) "acM" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/ai_status_display{pixel_y = 32},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/white/border{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fore) @@ -1045,7 +1049,6 @@ "aCK" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/machinery/space_heater,/obj/effect/floor_decal/corner/green/border{dir = 8},/turf/simulated/floor/tiled,/area/hangar/three) "aCL" = (/obj/machinery/power/apc{name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 4; icon_state = "0-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/light_switch{pixel_x = 11; pixel_y = -24},/turf/simulated/floor/tiled/monotile,/area/hangar/three) "aCM" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/firstdeck/fpcenter) -"aCN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/firstdeck/forestarboard) "aCO" = (/obj/effect/wingrille_spawn/reinforced,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/hallway/primary/firstdeck/port) "aCS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/monotile,/area/hangar/three) "aCT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled/monotile,/area/hangar/three) @@ -1564,7 +1567,6 @@ "aTE" = (/obj/structure/lattice,/obj/structure/grille/broken,/turf/space,/area/space) "aTF" = (/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor/tiled/dark,/area/hallway/primary/firstdeck/port) "aTG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/random/obstruction,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard) -"aTH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard) "aTI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard) "aTJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/firstdeck/port) "aTK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/firstdeck/aftstarboard) @@ -3071,7 +3073,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaplaxQaeIxPQaeKaeLaeLahTahUagkagkagkahVahTaeLaeLdZMxPQaqDaxQaqEnFXaqFaqSaqHaqIaAsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasgaqQahWaqRaqUaqTasgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatlarcardawXahXaAqaOdaRtaNSahYaAncpDcpDckbckbckbckbckbckbckbcpDcpDaAzaAAaAlaRtaDlaDlaDlarxaAbaryaryaryaryaAbaAbarFlxFlxFarFarFlxFlxFlxFarEarFwzVarIarGarHahZarIwzVwzVaafaafaafaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTEaadaadaadaadaadaadaaaaaaaaaaaaaaaaxQaeIaiaaeKaeLaeLaeMaibaicagkaidaieaeMaeLaeLdZMaiaaqDaxQaifnFXapnaigarTaAsaAsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasgascasdaujaihaAKasgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatlatlasrajSatmaiiaijaRtaNSaikaAncpDcpDckbckbckbckbckbckbckbcpDcpDaAzaiuaAlaRtaDlauqasvauXaAbasyaivasDasCaxUasAasCaiwaixaqgasBasCasDaizasEaAbasGasIasJasIasJasIasKwzVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTEaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaxQaiAaiBaeKaeLaeMaeMagJaggaiKahTagJaeMaeMaeLdZMaiLaiMaxQaiNnFXapnaAsaAsaAsaaaaaaaaaaaaaaaaaaazWazWaEIaEIaEIazWaiOataatbaujatdaiPaiQaBxaKbaKbaKbaBxaBxaaaaaaaaaaaaaaaaaaatlatlatlatmaiRaOWaRtaiSauraAncpDckbckbckbckbckbckbckbckbckbcpDaAzatuatvaRtaiTatxatyatzlxFaycaycaycaycaycaycaycaycaycajbaycaycaycaycatGaAbatIatJajcatJajcatJajcwzVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaxQajdfAgaeKaeLajeajfajgajhagkaggajjajqaeMaeLdZMfAgajsaxQajtnFXajupYHaaaaaaaaasNDaaaaaaaEIaEIazWatZaueajvaufatWaugauhauiaujaukaAuajyaCXaumaunauoaupaBxaKbaKbaaaaaasNDaaaaaaaaaaFfauBauDauCaRtaNSaAAaAncpDckbckbckbckbckbckbckbckbckbcpDaAzaAAaAlaRtajzauOauPauQauRauSauTaCZavcazQazQauYauZavaavbazQavcajAazQavdajCajDaDgaJxavgajGavhajHwzVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaxQajdfAgaeKaeLajeajfajgajhagkaggajjajqaeMaeLdZMfAgajsaxQajtaanajupYHaaaaaaaaasNDaaaaaaaEIaEIazWatZaueajvaufatWaugauhauiaujaukaAuajyaCXaumaunauoaupaBxaKbaKbaaaaaasNDaaaaaaaaaaFfauBauDauCaRtaNSaAAaAncpDckbckbckbckbckbckbckbckbckbcpDaAzaAAaAlaRtajzauOauPauQauRauSauTaCZavcazQazQauYauZavaavbazQavcajAazQavdajCajDaDgaJxavgajGavhajHwzVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaxQajdfAgajNaeLajOagkagkagkagkajPajQajRajTaeLdZMfAgajsaxQaplajUajVpYHaaaaaaaaaaaaaaaaEIaEIayPavxavyavzajWavAajXajYavBavCavDajZakaakbakcakdakeakfavEavFaQXaKbaKbaaaaaaaaaaaaaaaaFfavNaIqaNGaRtaNSaAAaAncpDckbckbckbckbckbckbckbavTckbcpDaAzaAAaAlaRtakkayraysawclxFaweaweakpawfawhawhawiawjawkawlawhawmakqawhawnawoakraksaktawpakuawqakvwzVaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaakwakwakwakwakwakwakwakwakwakwakwakwakwaxQaxQakxajNaeLaeMakyakzakAakAakBakCakDakEaeLdZMawyaxQaxQaxQnFXakFpYHaaaaaaaaaaaaaEIaEIayPawGawIawIawJawKaxGawAaKaawMakGawNakHakSawPakXawRakYawSazRazRawVaQXaKbaKbaaaaaaaaaaaaaFfaxdaAqaRtaRtaRtaxiaAncpDckbckbckbckbckbckbckbckbckbcpDaAzakZaRtaRtalaaxpaysaxrarFaxsaxvaLPaxvaLPalbaxxaxyaxzaxAaLPaLPaLPaLPaxEaAbalcaUialdaUiaUiaytalewzVaafaafaafaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalfalfalgalgalgalhalgalgalhalgalgalgaliaxQaljalkajNaeLaeMallalpalqalyalDalpalLaeMaeLdZMalMalNaxQaplnFXpYHpYHaaaaaaaaaaEIaEIayPayPazXayPalOtcOtcOtcOtcOtcOtcOtcOtcOtcOtcOtcOtcOaMgaMgaMgaBwaQXaybaQXaQXaKbaKbaaaaaaaaaaFfaFfaAqaNGaRtalPalQaAncpDckbckbckbckbckbckbckbckbckbcpDaAzaoVazvaRtalVayraysamjaAbatPayvamkazIayxamlamramtamwayyamJamLamNayzayAaAbayCayDamOamPasJayEamQwzVaaaaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -3079,11 +3081,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalfaoraosaotaotaotaotaotaotaotaouanCanTaxQaovfAgaeKaeLaowaozaeLaeLaeLaeLaeLaowaozaeLdZMfAgaoAaxQaoEaoHaBiaaaaaaaaaazWazWaoRazXayPapaapctcOtcOtcOapdapeapiazZaAaaqcaALazZaqdaAcaqeeRraqfaMgaqhwQPaQXaybaqiaBxaBxaaaaaaaaaaBDaAqazqaRtaqjaokaAncpDckbckbcpDcpDcpDcpDcpDckbckbcpDaAzaAAaABaRtaqraADaAEaCbaAGaquaqvaCbaCbaqyvyDaAIktoaqzaAJaANaCbaAMaCcaAOaDljUCjUCjUCjUCjUCjUCjUCjUCjUCaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalfalganeaqAaqBaqCaqLaqMaqNaqOaqPanCanTaxQaqWaqXaqZaraaraaraaraaraaraaraaraaraaraaraarbarzaBfaxQaBgaBhaBiaaaaaaaaaazWaBmarJazXalOaFTaFTaFTtcOtcOaEUaEUaEUaEUaEUarKaBtarLarLarMarNarOarPaMgaMgaMgaBwaybarQarRaBxaaaaaaaaaaBDaAqdpTaRtaBBaBGaBHaJsaJsaJsaJsaJsaJsaJsaJsaJsaJsaJsaBQaBRaBSaRtarVaBUaBWaBWaBXarWarXarYaBYarZaBYaBZaCaasaasbaFwaGQaHrashxhdasijUCasjaNkaEvaskaCgaNkaChjUCaDoaDoaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalfalfalgalgalgalhaslaslalhalgalgalgasmaxQasnaswasLasLasMasLasLasNasOasSasTasUasUasUasUasVasXaxQaCsnFXpYHpYHaaaaaaaEIateaCuatgaFTaFTathatiaFTtcOatEatMaCvaCweYAeYAatNaCzaCAaCBaCCaMgaCEaMgatOaMgaMgatQatRatSaKbaaaaaaaFfaFfaBLaRlaRtaCKaCLaCSaCSaCSaCSaCTaCUaCVanoaGpaGpaCYaGpaGpdVsaDcaRtatVaDeaDfaRUaxratXauaaxraDhaDigdraDjaDlaDlaDkaDlasvaulautxhdauujUCaNnauvaEvaskaCgaNkauwjUCjUCauxauUjUCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaakwaveaveakwakwakwakwavfavfavjavjavjavjavjaxQaxQaxQaxQaxQaxQaxQaxQavkaplavmaxQavnavnavnaxQaxQaxQaxQaCtaDpaDqpYHaaaaaaaEIaDvaDwaDxaKDaDyaDzaDAaFTtcOaEUayjaESaDGaDHeYAaEWaDEaDLaDMavoavpaDNavraDOaDPaMgavsavtavuaKbaaaaaaaFfaCNavIavJaRtaRtaRtaNGaDXaDXaDXaNGaJUaNGaEbaNGaRtaRtaRtaRtaRtaRtaRtaEkaEkaEkaEkaEkavKavKvfXvfXvfXvfXvfXvfXaEoaEpvfXvfXaulaEqaEraEyjUCaMIaNkaEvaskaCgaNkaMIjUCaanaEzawsjUCjUCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafakwakwawtawuawvawwawxakwawzawzawBawLawUawZaxaaxbaxcaxKaxLaxMaxNaxOaxbaxPaxPaxRaxSayfaygayhaxSayGaCtpYHayHaEEaEFpYHaaaaaaaEIaEJayIaEKaFTaEMaENayJaFTtcOaEUaEUaEUaEUaEUaEVaEYaEYaEYaEZayKayLaFaaFbayMayNaMgaziazjazkaKbaaaaaaaFfaFgafZazlaFhazoaDTaHHaFjazpazwaHHaKMaLQaLQaUcaFnaHPaHPazSaHeazTaUcaFqaFraFsaFtazUaAfaAfvfXaFuaAgaFvaAhaKjaFxaFyaFzvfXaAiaAkjUCjUCjUCaApaAraAtaAVaFAaFBaFCjUCaapaFEaFFaFGaFHaFIaSjaSjaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaakwakwaAWaAXawuaAYaAZaBaaBbaBcaBdaBeaBjaBkaBlaByaxbaxcaBzaBAaxMaxMaxMaxbaBMaBMaCdaCiaCjaCkaClaxSaCmaCoxfyaCpaCqaFOpYHaaaaaaazWaCraCIaCMaFTaGGaDmaDsaFTtcOaDtaFUaFVaGaaFXaFYaFZaGaaDKaGbaGcaGdaGeaDQaEcaEBaMgaEDazjaEHaBxaaaaaaaFfaFdaTtafZafZaFeafZaGhaGiaGjaGkaFkaMlaGnaGnaUcaHdaHcaHPaGqaFDaHeaUcaGtaFLaGuaFMaFNaFQaGfaGgaSxaSxaGvaSxaSxaGwaSxvfXaKEaasaGsjUCaGzaGAaGCaaNabuaHtaGBaHuaKFaHIabvaHKaGDjUCjUCjUCjUCjUCaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakwaIzawuakwakwakwakwakwakwaJapBrpBrpBraJkaJtaJPaxbaJSaxMaBAaKmaLBaMvaxbaMFaMGaMLaxSaMMaNhaNlaxSaNqaNraNIaNJaOjaOlpYHaOmaOmaOpaOraPdaugapcaGGaDmaPeaFTtcOtcOtcOtcOtcOtcOtcOtcOtcOtcOtcOaMgaMgaMgaqeaPjaGSaMgaPraPJaPKaPLaPMaPMaFfaPNaOdaGTaGTaGTaGTaHHaQpaQzaGWaHHaQCaKTaJZaUcaHSaHRaHTaGqaQMaHeaUcaHgaHhaQVaQWaQWaQWaEkvfXvfXvfXvfXvfXvfXaHNaRavfXaHkaRcxhdaRuaRXaScaSdaSeaShaSzaSBaSCaHmaSDabxaSNaHnaHoaHpaHqaTnjUCaaaaaaaaaaadaabaabaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakwaTjawuakwaTkaTkaTkaTkaTkaJaaTFaUbaUdaUeaUfaUAaUEaUKaxbaVbaxbaxbaxbaxbaVcaVdaVeaVfaxSaxSaxSaxSaVlpYHpBrpBrpYHagNpBraVmaVnaVoaVpaVqaVraKoaKoaVsaVuaKoaIMaIMaIMaIMaKYaKYaKYaKYaKYaNjaHCaVvaVxaJMaVyaHDaVzaNjaVAaVBaVCaVDaVEaVFaHFaVGaFfaHFaHFaHFaHFaHHaHHaHHaHHaJXaOJaKCaHLaUcaUcaUcaUcaVHaUcaVIaVKaVLaVOaVPaHFaVQaVVaVXiCiiCiiCiiCiiCivfXaHNaVYvfXaHOaHVaHQbqBaMzbskaWabsmaWdaWdaWdaHWaHXaWhabIaWjaWkaWlaNkaWmaNkjUCaafaafaafaafsdxaabaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaakwaveaveakwakwakwakwavfavfavjavjavjavjavjaxQaxQaxQaxQaxQaxQaxQaxQavkaplavmaxQavnavnavnaxQaxQaxQaxQaCtaDpaDqpYHaaaaaaaEIaDvaDwaDxaKDaDyaDzaDAaFTtcOaEUayjaESaDGaDHeYAaEWaDEaDLaDMavoavpaDNavraDOaDPaMgavsavtavuaKbaaaaaaaFfaapavIavJaRtaRtaRtaNGaDXaDXaDXaNGaJUaNGaEbaNGaRtaRtaRtaRtaRtaRtaRtaEkaEkaEkaEkaEkavKavKvfXvfXvfXvfXvfXvfXaEoaEpvfXvfXaulaEqaEraEyjUCaMIaNkaEvaskaCgaNkaMIjUCaasaEzawsjUCjUCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafakwakwawtawuawvawwawxakwawzawzawBawLawUawZaxaaxbaxcaxKaxLaxMaxNaxOaxbaxPaxPaxRaxSayfaygayhaxSayGaCtpYHayHaEEaEFpYHaaaaaaaEIaEJayIaEKaFTaEMaENayJaFTtcOaEUaEUaEUaEUaEUaEVaEYaEYaEYaEZayKayLaFaaFbayMayNaMgaziazjazkaKbaaaaaaaFfaFgafZazlaFhazoaDTaHHaFjazpazwaHHaKMaLQaLQaUcaFnaHPaHPazSaHeazTaUcaFqaFraFsaFtazUaAfaAfvfXaFuaAgaFvaAhaKjaFxaFyaFzvfXaAiaAkjUCjUCjUCaApaAraAtaAVaFAaFBaFCjUCaaNaFEaFFaFGaFHaFIaSjaSjaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaakwakwaAWaAXawuaAYaAZaBaaBbaBcaBdaBeaBjaBkaBlaByaxbaxcaBzaBAaxMaxMaxMaxbaBMaBMaCdaCiaCjaCkaClaxSaCmaCoxfyaCpaCqaFOpYHaaaaaaazWaCraCIaCMaFTaGGaDmaDsaFTtcOaDtaFUaFVaGaaFXaFYaFZaGaaDKaGbaGcaGdaGeaDQaEcaEBaMgaEDazjaEHaBxaaaaaaaFfaFdaTtafZafZaFeafZaGhaGiaGjaGkaFkaMlaGnaGnaUcaHdaHcaHPaGqaFDaHeaUcaGtaFLaGuaFMaFNaFQaGfaGgaSxaSxaGvaSxaSxaGwaSxvfXaKEabuaGsjUCaGzaGAaGCabvabxaHtaGBaHuaKFaHIabIaHKaGDjUCjUCjUCjUCjUCaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakwaIzawuakwakwakwakwakwakwaJapBrpBrpBraJkaJtaJPaxbaJSaxMaBAaKmaLBaMvaxbaMFaMGaMLaxSaMMaNhaNlaxSaNqaNraNIaNJaOjaOlpYHaOmaOmaOpaOraPdaugapcaGGaDmaPeaFTtcOtcOtcOtcOtcOtcOtcOtcOtcOtcOtcOaMgaMgaMgaqeaPjaGSaMgaPraPJaPKaPLaPMaPMaFfaPNaOdaGTaGTaGTaGTaHHaQpaQzaGWaHHaQCaKTaJZaUcaHSaHRaHTaGqaQMaHeaUcaHgaHhaQVaQWaQWaQWaEkvfXvfXvfXvfXvfXvfXaHNaRavfXaHkaRcxhdaRuaRXaScaSdaSeaShaSzaSBaSCaHmaSDaceaSNaHnaHoaHpaHqaTnjUCaaaaaaaaaaadaabaabaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaakwaTjawuakwaTkaTkaTkaTkaTkaJaaTFaUbaUdaUeaUfaUAaUEaUKaxbaVbaxbaxbaxbaxbaVcaVdaVeaVfaxSaxSaxSaxSaVlpYHpBrpBrpYHagNpBraVmaVnaVoaVpaVqaVraKoaKoaVsaVuaKoaIMaIMaIMaIMaKYaKYaKYaKYaKYaNjaHCaVvaVxaJMaVyaHDaVzaNjaVAaVBaVCaVDaVEaVFaHFaVGaFfaHFaHFaHFaHFaHHaHHaHHaHHaJXaOJaKCaHLaUcaUcaUcaUcaVHaUcaVIaVKaVLaVOaVPaHFaVQaVVaVXiCiiCiiCiiCiiCivfXaHNaVYvfXaHOaHVaHQbqBaMzbskaWabsmaWdaWdaWdaHWaHXaWhachaWjaWkaWlaNkaWmaNkjUCaafaafaafaafsdxaabaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaafaaaaaaaaaaveaWnaXTakwaTkaTkaTkaTkaTkaZjaZYbabbaXbcWbekbfFbhgbhjbcWbhqbhgbijaZYbmqbmGbntbnwbnybnVbnybotboCbplbpybpRbrxbrQbwTbxGbyQbnybyRbySbznbzXaHZbCNbEiaIabEmbFFbFRaIbaIMaKYaKYaKYaKYaKYaNjaIgbFSbHuaJMaIibHvbsSaNjbHwbHzbHAaIsaIpbHBbIYbJabJbbJcbJHaIkaBKaImaIsaDnaIpaIpaRCaKTaIsaNRaIuaIvaBKaIxaIsbMcaBKbMNbOSaIsbWvcbvaIpcbPiCiiCiiCiiCiiCivfXaLjaHNvfXaIAaIBaICaIDaIEaKidbxbwscceaLvaSdaLvccfcdzalrcdBcdCcfnaNkaNkaNkjUCaaaaaaaaaaadaabaabaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsdxaafaafaafaafavecfocfpakwaTkaTkaTkaTkaTkcjEclTcnNcnZcnZcpEcpFcpFcpGcpHcuncpFcvHcpFcpFcyYcAKcAMcpFcpFcpHcpFcpFcvHcpFcBZaCOcCncCpcpFcItcpFcpFcJxcLTcpFaIHaIIaIJcLUaIKcOQcPZaILaIMaKYaKYaKYaKYaKYaNjaISaITcSccTFcXDcYaaJNaNjdbidbjddbddhddhddjddhdebdeIaIWapFasRaDZaJiaJiaJjaJiaJiaStaJgaJiaJiaJjaIwaJiaIYaJiaJoaJiaJidfZdjydjydkodoxdoAiCiiCiiCiiCiiCivfXdoDdoJvfXjUCaTTaKhjUCaJwaKidbxdGcblpdGydHDdOZbradRFdVDdVFdVGaAVaAVaAVaAVjUCaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaafaaaaaaaaaaveawudVHakwaTkaTkaTkaTkaTkdVIdVJdVKdVLdVMdVNdVOdVPdVQdVTdVUdVVdVWdVJdVXdVYaVddVZdVJdVJdWadVJdWbdVJdWcdWdaDRaJzdWedWfdWgdWhdWjdWkaTJbzXdWlbCNdWmaJAdWnaJBaJCaJDaIMaKYaKYaKYaKYaKYaNjaJLdWodWpaJMaJNpvidWqaNjdWrdWsdWtaJZaJTdWudWvdWwdWxbJcaJlaJnaWbaJQdWyaJTdWzaJTaSHaKTaJZaRwaJTaJRaWeaJYaJZdWAaWbdWBdWCaJZdWDdWEaJTdWFiCiiCiiCiiCiiCivfXdWGaHNvfXdWHaKfaKgaKhdWIaKidbxdccaLbdWJaLcdWJdWKdWLalrdWMdWNdWOaNkaNkaEvdWPaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -3106,8 +3108,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaawouvicxvaknLknLknLknLknLknLknLrnAvtfvtfvtfwFwtijuKAuKAuKAuKAuKApmGcrGunMtmAmYXdZAdZAdZApVEdXdqVIaSfgRHnZocjGxCgaaaaaaaaaaaaulGoWjktwoWjukkaaaaaatlHtlHvwjqvRmgaaVgaVgaVgaVgaVgaVglXHlXHlXHaVgaVgaVgaVgaSgqfvaSipPPaWwaWqaToebhebhtHcaSVebkebkaZibhkbhkaZbbhkbhkaZiebkebkaTAaSPebhebhiLMaafaafaafaadaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaawoulcixvaknLknLknLknLknLknLknLrnAbSHvtfvtfbFyisruKAuKAuKAuKAuKApmGmYXtNmmYXmYXqNBkehdUNlXblXbdXeaSfcxznZosNExCgaaaaaaaaaaaanPXrxyhfalhCnPXaaaaaaaaatlHdUuqvReVukrvefNvVVbegtEPlXHbfSuWEqhHpmKlFkkExaVgrKOkEKaSinSkaTloxqebhebhfCyaSUaSVebkebkaUmaSZaZiaTbaZiaTdaUmebkebkaTAaThaTiebhaToaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaawoulcixvaknLknLknLknLknLknLknLrnAodGviYjSxoKewounEcuKAuKAuKAuKAlXbhqphqphqpdXddXddXddXdlXbcFhqVIaSfaSfylDaSfxCgubvubvubvszanPXdBEecVtOLnPXoYRubvubvubvqHGgeKqHGaVgefNpznuKFesepVKsbEtaJgwUmxnuBzkExaVgaTlaTlaTmaTlaWwinCaToebhjMhdnCaSVebkebkaZilDGbhiaZbbhiaTwaZiebkebkaTAdnCaUtebhaaaaaaaaaaaaaTEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTEaaaaaaaaawoueXRflYvSRhCIhCIbQpcZtcZtnhkeEXfaXrsYrsYrsYwoulXblXblXblXblXblXbmQhmQhmQhxYRoJwdXdeZVrmMdZAtUzowXvPIeWcvpcwgBubvvysfazwqRcIrhOgfdzhOgcIrqGNpQFifeubvuXadetuXaaVgmoqcfUteKewWhLrfsKkcrgXOcVAwTOkExaVgaTGaTHaTIaWfaTKaTLaTMaTNxeOdnCaTPebkebkaUmaTSbhlaTUnWOaTSaUmebkebkaTAdnCaTZebhaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafwouwoubqbncnqGBqGBuBFqGBqGBhkNtocoETwTJhqpgnUdZBdZAdZAjWCdZAdZAdZCdZBdZAdkjdZAdZAksNdZAdZAdZAdZAdZBdZAdZAuoHsXzubvwLFwLFsbUpKGhzvjnwkSYxUJqiRwLFmXWubvlsJokXchyaVgshNsltdvDmGFcYgqSbsqXqOAofLmJGbBQaVgukxtxfdKjroUacetsaaUgebhuapdnCaTPebkebkebkaUmbhmxGsaUoaUmebkebkebkaTAdnCaUtebhaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTEaaaaaaaaawoueXRflYvSRhCIhCIbQpcZtcZtnhkeEXfaXrsYrsYrsYwoulXblXblXblXblXblXbmQhmQhmQhxYRoJwdXdeZVrmMdZAtUzowXvPIeWcvpcwgBubvvysfazwqRcIrhOgfdzhOgcIrqGNpQFifeubvuXadetuXaaVgmoqcfUteKewWhLrfsKkcrgXOcVAwTOkExaVgaTGaciaTIaWfaTKaTLaTMaTNxeOdnCaTPebkebkaUmaTSbhlaTUnWOaTSaUmebkebkaTAdnCaTZebhaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaafaafaafwouwoubqbncnqGBqGBuBFqGBqGBhkNtocoETwTJhqpgnUdZBdZAdZAjWCdZAdZAdZCdZBdZAdkjdZAdZAksNdZAdZAackdZAdZBdZAdZAuoHsXzubvwLFwLFsbUpKGhzvjnwkSYxUJqiRwLFmXWubvlsJokXchyaVgshNsltdvDmGFcYgqSbsqXqOAofLmJGbBQaVgukxtxfdKjroUacFtsaaUgebhuapdnCaTPebkebkebkaUmbhmxGsaUoaUmebkebkebkaTAdnCaUtebhaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaawouwoudgHoatdgHwoudgHoatdgHwouwouwouhqpmWhlXbaOoaOoaOoaOoaOolXbxVwfFBlXblXblXblXblXblXblXbaOoaOoiUgdZAnqOvIMubvqUqwLFvpFdwhdwhcsUexsexslCZwLFqlQubvjUmreMgcqaVguRVxFopdrxHwbJWfcNbLdkdeyiPlNTgwvaVgaUvmUsdRvmORaVkaVkaWuebhebhdnCjAHbhnbhnbhnbhnbhnbhnbhnbhnbhnbhnbhnubbaWvebhebhaafaafaafaTEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaawoulXblXblXbaaaaaaaaaaaaaaalXblXblXblXbaaaaaaaaaaafaaaaaaaaaaOoaOosAodtemBtubvpLmgDzkRHlcfjXQuaSwApyfyrhBlunhOguKWuSywRNduNaVgaVgkDNxcseVQlXHpyJuWAhlSbJlgCtvgnaVgaUGaUHqHBaVkaVkaaaaaaaaaebhebhebhebhebhebhebhebhebhebhebhebhebhebhebhebhebhaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaOoaOolMzjptubvhOghOghOghOghOgbHOhOghOghOghOghOgeFTljUwRNfKKtCHrXyrXyxkhrXyrXyrXyrXyrXyrXyrXyrXyaVgaVhaViaVkaVkaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/southern_cross/southern_cross-2.dmm b/maps/southern_cross/southern_cross-2.dmm index b10a81aba1..98160ea9e0 100644 --- a/maps/southern_cross/southern_cross-2.dmm +++ b/maps/southern_cross/southern_cross-2.dmm @@ -53,7 +53,7 @@ "aba" = (/obj/structure/table/standard,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/outline/grey,/obj/item/device/binoculars{pixel_y = 5},/turf/simulated/floor/tiled/dark,/area/security/armoury) "abb" = (/obj/structure/table/standard,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/storage/box/handcuffs{pixel_x = 8; pixel_y = 6},/obj/item/weapon/storage/box/chemimp{pixel_x = 4; pixel_y = 3},/obj/item/weapon/storage/box/trackimp,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/armoury) "abc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/security/armoury) -"abd" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Unisex Restrooms"},/turf/space,/turf/simulated/floor/tiled/steel_grid,/area/crew_quarters/barrestroom) +"abd" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/research) "abe" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/dark,/area/security/tactical) "abf" = (/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/obj/structure/table/steel,/obj/item/weapon/storage/firstaid/combat,/turf/simulated/floor/tiled/dark,/area/security/tactical) "abg" = (/obj/effect/landmark{name = "carpspawn"},/obj/structure/lattice,/obj/machinery/shield_diffuser,/turf/space,/area/space) @@ -363,6 +363,7 @@ "agY" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor/tiled,/area/engineering/atmos) "agZ" = (/obj/machinery/atmospherics/binary/pump,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/green/bordercorner2{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "aha" = (/obj/machinery/atmospherics/binary/pump{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/green/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/green/bordercorner2{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) +"ahb" = (/obj/random/junk,/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/engineering) "ahc" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/item/weapon/stool,/turf/simulated/floor/plating,/area/security/riot_control) "ahd" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 4},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/security/riot_control) "ahe" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/security/brig) @@ -378,6 +379,8 @@ "aho" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled,/area/engineering/atmos) "ahp" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) "ahq" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos) +"ahr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/bar) +"ahs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/medbay) "aht" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "ahu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "ahv" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -396,6 +399,8 @@ "ahI" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals4,/turf/simulated/floor/tiled,/area/security/security_hallway) "ahJ" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/camera/network/security{c_tag = "SEC - Brig Hallway Starboard"; dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/turf/simulated/floor/tiled,/area/security/security_hallway) "ahK" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/security/security_hallway) +"ahL" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/cargo) +"ahM" = (/turf/space,/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Unisex Restrooms"},/turf/simulated/floor/tiled/steel_grid,/area/crew_quarters/barrestroom) "ahN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/security/security_hallway) "ahO" = (/obj/machinery/door/firedoor/border_only,/obj/effect/wingrille_spawn/reinforced,/obj/structure/cable/green,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/security_hallway) "ahP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -405,6 +410,7 @@ "ahT" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "ahU" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "ahV" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) +"ahW" = (/obj/machinery/light/small{dir = 4},/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/locker) "ahX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Air Tank Bypass Pump"},/turf/simulated/floor/tiled,/area/engineering/atmos) "ahY" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "ahZ" = (/obj/machinery/portable_atmospherics/canister/empty,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -2188,7 +2194,6 @@ "aZl" = (/obj/structure/table/steel,/obj/item/weapon/hand_labeler,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/storage/auxillary) "aZm" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8; target_pressure = 200},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/table/rack{dir = 8; layer = 2.6},/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/research) "aZn" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/maintenance/research) -"aZo" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/research) "aZt" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/mixing) "aZv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{req_access = null; req_one_access = null},/turf/simulated/floor/plating,/area/maintenance/research) "aZx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/research) @@ -5707,7 +5712,6 @@ "gtw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/bar) "gtA" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin{pixel_y = -6},/obj/item/device/camera{name = "Autopsy Camera"; pixel_x = -2; pixel_y = 7},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = -9},/obj/item/weapon/pen/blue{pixel_x = 3; pixel_y = -5},/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Medical Officer's Desk"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_y = -30},/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/turf/simulated/floor/tiled,/area/medical/morgue) "guC" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/shield_diffuser,/obj/machinery/door/airlock/external{frequency = null; icon_state = "door_locked"; id_tag = null; locked = 1; name = "Dock Three External Airlock"; req_access = list(13)},/obj/effect/map_helper/airlock/door/ext_door,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D3) -"guL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plating,/area/maintenance/bar) "gvF" = (/obj/machinery/door/firedoor/glass,/obj/effect/wingrille_spawn/reinforced,/turf/simulated/floor/plating,/area/medical/patient_wing) "gwp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/cafeteria) "gyw" = (/obj/structure/bed/chair/sofa/blue/left{dir = 1},/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/machinery/vending/wallmed1{pixel_y = -30},/turf/simulated/floor/tiled,/area/medical/medbay2) @@ -6433,7 +6437,6 @@ "oHE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Cargo Substation"; req_one_access = list(11,24,50)},/turf/simulated/floor/plating,/area/maintenance/substation/cargo) "oHP" = (/obj/machinery/light/small{dir = 4},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/central) "oIs" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"oIK" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "oIX" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/carpet,/area/hallway/secondary/entry/docking_lounge) "oJi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/bench/padded,/turf/simulated/floor/tiled/dark,/area/chapel/main) "oJo" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/turf/simulated/floor/tiled,/area/security/checkpoint2) @@ -7229,10 +7232,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaeHarLarMarNaiqairaisarOaiuaixarParQarRarSaTsarTarUarWarXaTraTsaTtaTuaTvaTwaYEaTxarYaTyaYEbaJaTBaTCbGhbfVaTFaTGaTHaTIaTKaTKaTLberarZaWYaTOaWYaXbberasaaTSberaTRaTSberascaTSaTTasdasCasDasEbbmaTWasFaTWbcVaTXaTYasHasIasJbcVasKasLasNasOasPbcYasQbJYbJYasRaUfbdcaXBaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaUhaUnaUmasSasTasTasUarKbzBbzBasVaUpaUpaUpaaaaaaaaaaaaaZLaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaUwaaaaaaaaaaafqlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsaaaaaaaaaaeHatsarMattajIajKatuatvatwatxatxatyatAatBaTsatDatEatFatGaUQaURatHaUSaUTaUUaYEaUVaUWaUXaUYatIaUZaVabaXbaYbaYbaYbaYbaYaVfatJatKberaVhaWYaVjaWYaXbberaWYaVnberaWYaVpberaWYaVsberaVuaVvaunatLbbmaVzatMaVAbcVaVBsyUatNatOaVCbcVatPaukaulaumauobcYaVDaXsbJYaVGbIqaVIaXBaaaaaaaaaaaaaaaaXBaXBbzBbzBbzBaXBaVQaVRaSwauqaVSaurausautauuauvauwvNrvNrblxblxaafaafaafaZLaafaafaafaafaWbaWcaJnaZLaWeaWfaWgawMaWiaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeHaeHaeHaeHaeHaaaakgauxakAauyauzauAauBauCaWGauDauEavcavdaWFaWGbawaWIaWJaWKaYEaWLaWMaveaYEbaJaWOaWPkMikMikMikMikMikMikMibGlaYOberaWXaWYaWZaXaaXbberaXjaXeberaXjaXhberaXjaXkberaXmaXnaXoaXpbbmaXqavfavgbcVavhaviavjavkaXrbcVavlaukavmaukavnbcYavoaXsbJYbJYaXubJYaXBaXBaXBaXBaXBaXBaXBaXCaXDbcTaXFaXFaXGaXIaXIaXGavpavqavravsavtavRavSvNraXJaXKblxblxaaaaaaaZLaaaaaaaaaaafbflaXUaXVaXYaXXaXYbflavTbflaafaafaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaYyavUavVaweagbagbawfawgawhaYzaYAawiaTsaYzaYzawjawlaYBaYCaYEaYEaYDaYEaYEkMiaYFbcybgekMiaYIaYJaYKaYLkMibGlaYOberberberberberberberberberberberberberberberberaZcaZdaZeawUbbmaZgaZhawVbcVawWaZjawXawYaZkbcVawZaxaaxbaukaZlbcYaxnaZmaZnaZoaZxaZxaZxaZxaPuaZxaZvaZxaZxaZyaZyaZzaZAaQWaZCaZDaZEaZFaxoaxpaZGaxqaxraxsaxtazHaZHaxuaZIblxaaaaaaaZLaaaaaaaaaaaaaZQaZRaZSaxvaZTaZUbflaZWbflaaaaaaaaaaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaYyavUavVaweagbagbawfawgawhaYzaYAawiaTsaYzaYzawjawlaYBaYCaYEaYEaYDaYEaYEkMiaYFbcybgekMiaYIaYJaYKaYLkMibGlaYOberberberberberberberberberberberberberberberberaZcaZdaZeawUbbmaZgaZhawVbcVawWaZjawXawYaZkbcVawZaxaaxbaukaZlbcYaxnaZmaZnabdaZxaZxaZxaZxaPuaZxaZvaZxaZxaZyaZyaZzaZAaQWaZCaZDaZEaZFaxoaxpaZGaxqaxraxsaxtazHaZHaxuaZIblxaaaaaaaZLaaaaaaaaaaaaaZQaZRaZSaxvaZTaZUbflaZWbflaaaaaaaaaaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabiXbiXbiXbiXbiXbiXbiXbiXbiXayjaykbavbaDbaxbaybazbaAbaDbaBaylbaCbaDbaEbaFaymbaGbaHbaIbaJbaKbaLaynkMiayobaObaObGlbaQaypbaRbaYbaSbaTbaUbaVbaYbaXbaYbaYbaZbbabbbbbcbbdbbebGgkMiayqbbhbbibbmbbmbbmbbmbcVayAbboayBayCbbpbcVayDayEayGayHbbqbcYayLbbraUkbbtbdbbbvayMbIqbbwbdhbdhbdhbdhbdhbdhbdhbbDayNazmazobjJbjUbjUbjUbjUlGRlGRlGRlGRlGRazpeaebynxMrxMrxMrxMrxMrxMrxMrxMrxMrbbMazqaUyazrbbNbflbbPbflbflaaaaaaaaaaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaWaaiaaaaaaaaaaaaaaaaaaaaaaaaaagaagaafaafaaaaaaazsazAazBazCbiXazDazEazGazIazKazKazLbiXaAtaAvaAwbclbcqbcnbcqbcpbcqaAxaAHbcrbcsbctbcuaAIbcvbcwbkLbaJbcxbcyaAJkMiaAKaAMbGlbcBkMiaANbcCaAObcDbcEkMikMibcHkMikMiaAQbcKbcLbcMaARbcLbcNkMikMibcPbJFaASbJYbJYbcSbcTbcVaATaAUbcVbcVbcVbcVbcYbcYaAVbcYbcYbcYbcZbIqaAWaAXbdbbdcbddbIlbImbdhaAYbdfaBgaBkbdgbdhblyblybdkblyblybjUbdmbdnbdolGRaBFlGRaBGlGRbdqbdrbdsxMrbdtbdubeZbeZbdwaZPbdxxMrbdzbdAbdBaBHbdCbdDaBIaBJbflaaaaaaaaaaaaaagaaiaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiuZKaaiaaaaaaaaaaaaaaaaafqlFaagaagaaacFUaaaaaaaaaazCaBKaBKaBLbiXaBTaBTaBTaBUazKaBVaBWbiXaBXaBYaBZbdTbdUbdVbdWbkLbdYaCbaCeaCfbdYbqcbqcbqbbebbecbqckMibedbeeaCgkMikMikMibeibGlkMibxqbmFbmFbelbmFbmFbeobGlbeqkMiaChbaOaCikMibGhbGlbxqbGlkMiaCjbetaCkbJYaClbIqaCmaCobIqaCqlLllLllLllLlaUkaCraCsbgqbeybezbeAboIbeCbJYblublublublubjObdhbeIbiiaCtbeKbeLbgJbeNbeObePbeQaCubjUbeSbeTaCvlGRaCwlGRaCZlGRlGRbeWaDaaDcbeXbeYbeZaDdbfabfbbfcxMrbflbflbflbfhbflbflbflbflbflbflaafaafaafaafuZKaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiuZKaaiaaaaaaaaaaaaaaaaafqlFaagaagaaacFUaaaaaaaaaazCaBKaBKaBLbiXaBTaBTaBTaBUazKaBVaBWbiXaBXaBYaBZbdTbdUbdVbdWbkLbdYaCbaCeaCfbdYbqcbqcbqbbebbecbqckMibedbeeaCgkMikMikMibeibGlkMibxqbmFbmFbelbmFbmFbeobGlbeqkMiaChahbaCikMibGhbGlbxqbGlkMiaCjbetaCkbJYaClbIqaCmaCobIqaCqlLllLllLllLlaUkaCraCsbgqbeybezbeAboIbeCbJYblublublublubjObdhbeIbiiaCtbeKbeLbgJbeNbeObePbeQaCubjUbeSbeTaCvlGRaCwlGRaCZlGRlGRbeWaDaaDcbeXbeYbeZaDdbfabfbbfcxMrbflbflbflbfhbflbflbflbflbflbflaafaafaafaafuZKaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaagaafqlFaagaagaagqlFaafaaaaafaaaaaaaaaaaaaaaaaaaaaazCaDeaDfbasbiXaDgaDmaDmaDnaDmaDoaDpbiXaDqaBYaDrbfMaDsbfNaDtbkKfPUbAwaDuaDwbfObnPaDxaDyaDzaDAaDBkMibfQbfRaDCbfSbfTkMibfVbGhkMibfYbmFaDDaDEbgabmFbgbbgcaAJkMibgebGlbgfkMibfVbGlbgibgjbgkbglbgmaDFbgnbgqbgoaDGbgpbgqbgrbgqmypbgqbgqaDHaDIbnbbnbbnbbnbbnbbnbbgxbgyblubgAbgBbgCbjObgEbgFbgGaDJbgHbgIbgJbgKbgLbgMbePaDKaVxbgPbgQbgRbbFaDLaEfaEgaEhlGRbgTbgUaEiaEjbgXbgWbgXbgYaEkbgZbhabhbbhcbhdbhebhfbhgbhhbhibhjbAiaaaaaaaaahqqaaiaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaaaaaaaafaaaaaaaaaaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaazCaElaEraEsbiXbhDaDmaDmaEtaEuaEvaEwaExaEyaEAaEBbhEaECbhFaEDbkKbhHaEFaEGaEHbhIbnPbhJbhKbhLbhMbhNkMiaEIbhOkMiaEJbfTkMibGgbGgkMiaEKbmFbhPaDEaELbmFkMikMikMikMibzjbzjbzjkMikMikMikMikMiaEMaENaXibhVaEMbJYbJYbJYbJYbJYbzBbzBbzBbJYbJYbJYbJYbnbbibbicbidbiebnbaEOaEPaEQaERaESaETbjObihaEUbiiaEVaEWaEXbjRaFHbikaFJbilaFKbjUaFLbinaFMlGRaFNaFOaFPaFQlGRblFbirxMraFRaFSaFTaFSaFTaFSbitbiubivaFUaFVaFWaFXaFYaFZaGcaGdbwBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFUaaaaaaaaaaaaaagaaaaaaaaaaafaaaaaaaaaaaaaafaaaaGhaGhaGhaGhaGhaGhaGhaGiaGiazCaGjaGkaBLbiXaGlaGmaGnaGoaGpaGqaGrbiXaGsaGtaGvbiYaGxbiZbjabkLbjcbjdbnMbjebjfbqcbjhbjibjjbjkbjlbsebsebjnbsebsebsebsekMikMikMiaGybmFaGzaGAaHjbmFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanWHaHkbjCyetaHlaHmnWHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnbbjFaHnbjGbjGbjHbjIbjJblubjLbjMbjNbjObjPaHobjQaHpaHqaHrbjRbePaHsbjSbjTaHwbjUbjUbjUbjUlGRaHxaHyaHzaHAlGRbjWbjXxMrxMrbkcaHBbkabkcaHDbkcbkdbkeaHEbkfbkkbkhbkibkjbkkbklbrbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7271,10 +7274,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiuZKaafaafaaaaaaaaactQcC aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaiaagaafaafaafcDZcEactQcEbcEccEdctQcCTcEecxucEfcEgcEhcEicEjcEkcvRcElcEmcEmcuecEncEocDdcEpcEqcuecErcEscwNcEtcEucEucEucEscEzcDpcEAcEAcEAcEAcEAcEBcECcECcEDcECjiSjiSjiScEEcBKcDycEIcEJcEKcDycDyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWCcEMcENcEOcEZcFabWCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackackachpchqckacFbcgochschtcFccjfchvcFdchwchxcFhckjchychzchAchBchCckHchEchFcFschGcFtcDMcFucFvcFycFAcFBcgGcFFcFGcFHcFIcgGcFJcFMcFMcFNcFOcFPcFVcFWchIchJchKchLchMaaaaaaaaaqlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFUaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaacFXctQcvKcvKctQctQcvMcFYcFYcvMcFZcGdcvMcvMcEkcvRcAOcAOcAOcuecGecGfcGmcGncGocuecGpcwNcwNcGqcGwcwNcwNcwNcGxcGycEAcEAcEAcEAcEAcEBcGDcGEcGFcECcGKcGLjiScBJcGOcGPcGRcGRcGTcGYcDyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWCcIncJncSRedReiIbWCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackacijceZekkckaewQcgocilcimcincjfcipciqcirciscitciueBmcivciwccJciycjRcjociBfnQfADfFDfRjgitgFDgFOgKChiKhMyiJYciCeLachHcgGkjRklKkrHkrZkAhkMjkQGlnNcjqciFlxXciGciHaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacvMlyBlTBmiQcvMcEkcvRcAOcAOcAOcuecuecuecuecuecuecuemlFmnfcwNcwNmuMmuMmuMcwNmQgmRMcEAcEAcEAcEAcEAcEBnakniKnojcECntHcqYooQppWpvHcDypzWpEjqoIczOcDyjiSjiSjiSjiSbYZbYZbYZjiSjiSjiSjiSjiSqOerpYcEOrtrqOeclgclgclgclgclgcmFcmFcmFclgclgclgclgckacgdcjLrwPckasnDcgocjdcjessCcjfcjgcjhsZZcjitSockjcjktVqcjlcjmcjQcDIcjocjpunruLkvkvvoLwOCxipxHjxLNkqHcgGljrckpciDrrBcgGjSRhQJvxelxRgywhpAbXjoqzcjqcjrcjscjtcjuaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacvMxZueGpjDscvMfHQcvRcvRfHhcAOcxOcxOcAOcEmcEmvIDcvRcuCvICcuCcuChSpcNagUkuflfeheCocEAcEAcEAcEAcEAcEBxeVqkTkzAcECrFOrvujiShVhnkIcDycDycDycDycDycDyguLcyQcyQnTFnUhutJlbXnUhnUhnUhnUhnUhflBljujPicHRfVPhVHhVHjeIhVHhVHpHxcjEcjFclgcjGcjHcjIckacjKcjLlKyckamOGcgocgocWIcgocjfnVWkHlsydsYgkgmcjNrDCcjOcjUcjPcjQcjRcjScjTcjUrHymQPkEzuvSmsvemXjvulLDcgGtHEcjVwxPdWCcgGrfDrfDrfDrfDrfDrfDkdqkjbcjucjucjucjucjuaafaafaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFUaafaaaaaaaaaaaacvMsWJsWJcvMcvMnFarRkcvRcvRcxOcxOcvRcvRcvRcvRcvRcvRmNfmNfmNfcuCcuCcuCcuCgqmsPZcDpcEAcEAcEAcEAcEAcEBcECoHEcECcECjiSjiSjiSvcvpmdhlXcyQrXgqTxvqBcyQcyScqYcqYiCXirxeIZenRcqVnEoirxhNKxvtjiSqGwtdmlKaclglmFmWRlmFpBmoevcjWnmjdQtgCIcjXcjXiHRckackacjYckackavgHclgcfcckcbEZckEckfbGockhckijYEckjoEUckkcklckmcknckHockckotrTvYLfdhcDMmGltEatNhqeEhkrcgGeHUckpkPkbNrcgGuZIpEFvApmRDqZerfDipymBKbTyaaaaaaaaaaaaaaaaaaaaahqqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaacvMxZueGpjDscvMfHQcvRcvRfHhcAOcxOcxOcAOcEmcEmvIDcvRcuCvICcuCcuChSpcNagUkuflfeheCocEAcEAcEAcEAcEAcEBxeVqkTkzAcECrFOrvujiShVhnkIcDycDycDycDycDycDyahrcyQcyQnTFnUhutJlbXnUhnUhnUhnUhnUhflBljujPicHRfVPhVHhVHjeIhVHhVHpHxcjEcjFclgcjGcjHcjIckacjKcjLlKyckamOGcgocgocWIcgocjfnVWkHlsydsYgkgmcjNrDCcjOcjUcjPcjQcjRcjScjTcjUrHymQPkEzuvSmsvemXjvulLDcgGtHEcjVwxPdWCcgGrfDrfDrfDrfDrfDrfDkdqkjbcjucjucjucjucjuaafaafaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFUaafaaaaaaaaaaaacvMsWJsWJcvMcvMnFarRkcvRcvRcxOcxOcvRcvRcvRcvRcvRcvRmNfmNfmNfcuCcuCcuCcuCgqmsPZcDpcEAcEAcEAcEAcEAcEBcECoHEcECcECjiSjiSjiSvcvpmdhlXcyQrXgqTxvqBcyQcyScqYcqYiCXirxeIZenRcqVnEoirxhNKxvtjiSqGwtdmlKaclglmFmWRlmFpBmoevcjWnmjdQtgCIahscjXiHRckackacjYckackavgHclgcfcckcbEZckEckfbGockhckijYEckjoEUckkcklckmcknckHockckotrTvYLfdhcDMmGltEatNhqeEhkrcgGeHUckpkPkbNrcgGuZIpEFvApmRDqZerfDipymBKbTyaaaaaaaaaaaaaaaaaaaaahqqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahqqaagaagaaaaaaaaacvMplkilyehEcvMrzKcCZeIYeLejdCjUwgThsXooRMdCHpuYnqKfBJfBJfBJdzifjpfjpcuCcuCcuCcDpcDpcDpcDpcDpcDpcDpmNfdsjmNfcvRegHcvRsaJcwEcqYiCXkUDuqPhVhtZJcqYtosenGqtOtostostostostostostostostostosjMajLawAMclgcmAclguNimXbclgmXbckquSGeNbckrckscktckuckvckwckyckyrDBckzckArzwollckEckEckEckEckEckEckEckHckHckHckHckHckHwIackIclwjDgwIacDMcDMcDMcDMcDMcDMcgGtkJckpuuUfnpcgGjOOkLOrXYjgqiznrfDdOFhimbTyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaesaafaafaafaafaaaaaaaaacvMcvMrzKcCYcCYcWkggihRvitjpfJiYspfJpfJkZvlRGcCYsIscCYeKsggieYucCYcCYcCYcCYcCYcCYcCYvVPoByqxUokZrmMvddjEmeFxpAQcsAnKRnKRnKRnKRnKRuiItosjJfeNjkTwdvetosqHWkAwkQVjUxutZjwTtosvSRpAGjbTclgegGcljlmFviXmXbclgcAqaTVclgclgclgcljclgclgclgclgclgclgqmVckOegGbGTckQeLIbHRckSckScnacmHjdwckVckWbZXmgkclwfwZckZclthenszjclwdEcbZXckWckVvbXcgGgtAtWdclaeSncgGttWjZotAFreHmDZrfDgbdefRbTyaaaaaaaaahqqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaesaafaafaafaafaaaaaaaaacvMcvMahLcCYcCYcWkggihRvitjpfJiYspfJpfJkZvlRGcCYsIscCYeKsggieYucCYcCYcCYcCYcCYcCYcCYvVPoByqxUokZrmMvddjEmeFxpAQcsAnKRnKRnKRnKRnKRuiItosjJfeNjkTwdvetosqHWkAwkQVjUxutZjwTtosvSRpAGjbTclgegGcljlmFviXmXbclgcAqaTVclgclgclgcljclgclgclgclgclgclgqmVckOegGbGTckQeLIbHRckSckScnacmHjdwckVckWbZXmgkclwfwZckZclthenszjclwdEcbZXckWckVvbXcgGgtAtWdclaeSncgGttWjZotAFreHmDZrfDgbdefRbTyaaaaaaaaahqqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaafaaaaaaaaaaaacvMcvMcFYcFYcFYcvMcvMcvMcFYcFYcFYcvMcvMcvMcvMcvMcvMcvMcvMpuYcAOcAOiADcEmcAOcAOcAOcAOcAOmmqcvMcvMcvMcvMqSAcwEcqYnKRkhrsyMiErkqplkAtosgTMoGboQzpfYylttoUfbPlXKfPktRmcRitosiuXvDlcsMclgcljdgYdkbegGfyDclgckJclhclgbUdclgcljclhclgclhcliuDrcljcljclkcllclmclncloclpclqclrjBXcmHnwlcltcluclvkNSclwclxclyfbZpfZgNyclwpQeclvclucltkhAcgGcgGcgGcgGcgGcgGrfDejPvbLejPrfDrfDpBwoxNlhGaafaafaafhqqaaaaaacFUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagaaaaaaaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaacvMcvMqbZwiEqkKwuHwRteMvjMYsyJkKpcvMcvMaaaaaaaaabYZqMIdIqrZArsMsZgtAtsdEstrtosgCylpdhgnuEFtosuxZgUjmBHmPDoUCpTRtosrlrvIXkLGclgclgclgclgclgclgclgclActMctMctMctMclectMctMctMctMctMclJcljclKclLcdScdSclLcerbYmclPclQclRclSclTclUclVclWclXclYclZoLQclYclYclXoLQoGxubNclYclYeEylTMqjtekFpFuxKOneWmqHocbkvqlUZmKooVWxomtwlaaaaaaaaaqlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaagqlFaafaagaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaacvMcvMcvMcFYcFYcFYcFYcFYcvMcvMcvMaaaaaaaaaaaabYZsgacqYnKRkwykPrrJBiiQfixtostostostostostosenddzbkuxnkNnkNfJXtoskSsvDlxPXfERgMajqdjrSmnGmEJclBhZZctMcmacplcmccmfcmecpmcmgcmhctMctMclgcmkgMzcikcixckdckgckgcmpcfccmHvRqrgLbIwcmstxXcmtcmubKptwctsocmumfzplpeGrmIzvvhgaArXOpgWfoisxZdDwkrQiMomrFofDduciMopesrQuqtDgvFaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7289,7 +7292,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahqqaaaaaaaaaaaaqSAsfvkOMcqVnKRygzvhSmbldXDmbykEpfvadHRdGsnYUvtuhKFhKFfWjfWjhKFhKFuhVdIxoOzhtmfERtSvtSvctBcqBctBmuSctBcsYcsYcsYcsYcsYcsYcsYcsYcsYcsYcsZctactbaaaaafaafaagaaacFUaaaaaaaaaaagaaaaaaaaaaaaaafaaaaaaaaaaafaaaaaaaaaaafaaaaaaaafaafaagaagaagaafcAwqlFaagaagaagaafaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqlFaafaafaafaafbYZsfvfFGiJTiJTuRkuRkuRkiJTdtIruNiJTiJTjewlnssAghKFeHotuItuIrZGctxdyydIxcsMcsMgNtvdctKlctBbOoctBkRJctBcsYcsYcsYcsYcsYcsYcsYcsYcsYcsYcrkkXkcvjaaaaaaaaaaagaaaaaaaaaaaaaaaaagaagaaaaaaaaaaafaaaaaaaaaaafaaaaagaagaafaagaagqlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiuZKaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaabYZxLTcqYmNtjiHxwadvzxwawkiiYwkFdnFEuRkdGsvmblYOoBhgdVgQRtNagJrkotyeNfBzmuOcsMqVRvKXnnNctBmEScrKvQTctBcsYcsYcsYcsYcsYcsYcsYcsYcsYcsYcsZctactbaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaagqlFaaaaagaagaagqlFaagaagaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiaaiaaiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaabYZcNBgtwemneGFhyffMShyfhyfwQEqTWeuBgLDmoHmaCokunMnpPUrAmmKsgmIvbqfIxcsmmYLmnKcsnkLllgmabdcspcsqcsrctBcsYcsYcsYcsYcsYcsYcsYcsYcsYcsYcoJctactbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaabYZcNBgtwemneGFhyffMShyfhyfwQEqTWeuBgLDmoHmaCokunMnpPUrAmmKsgmIvbqfIxcsmmYLmnKcsnkLllgmahMcspcsqcsrctBcsYcsYcsYcsYcsYcsYcsYcsYcsYcsYcoJctactbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafqSAsfvcqYiJTpnBlzdhBtfVAvVVnTMlKQlLjuRkjiLvPrfoFhKFqnAdmmlbWpPcctxsiqpAGcsLcsMgNteHGcsNctBuAZcsOcsPctBcsYcsYcsYcsYcsYcsYcsYcsYcsYcsYcsZctactbaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaabYZfGWqmtiJTlcelzddUesAHiKnkttlzdnSdiJTcKudywrAKrAKrAKrAKrAKrAKrAKqBgnZyctuctxctxctxctxddHctBctBctActBctMctMctMctMctMctMctMctJctKctLctMctNcvjaaaaafaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaabYZiKAcdMiJTiFylzdhIhxDllzdxPelzdsCEiJTiImtZCwLhjjVadurAKvjZfAHrAKopMpAGjIMcuYcurnAIcGMcuncuocGMcuqcurcuscutcuucuvgVltkzcuscuwcuxcuycuzcuAcvjaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7308,7 +7311,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagpBnWLeQyffZffZjYjkRudSttyLvfnhadfWdttqomuxtRttqttqfWdnEheKppbbsDgtfvsdqrRgjHagbBxhMrRgcsMmmagOjojNwLiipNstlstlstlstlstlagRpFVgPCyjcyjcyjchjeyjcyjcwBdojNlyJsDqugPkaLdFHaafaafaafaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagpBnWLkVvffZffZpXikRudSttyLtgdivxfWdojjiNstYYmVepuyfWdvUvvUvowyvUvfgekPKvcokfYvcokPKqmXqZTmmakXmojNijcifdpKApKApKApKApKApUipFVuNAwuIxsZwuImFswuIwuIpMWojNdBhugPgeVgeVgeVgeVaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeHVgDkgyAtcetceflCeHVtzPrhjtgdkmjttqoIXqDVqEtoIXdWpfWdtDnerEhJoerElJskPKdQcoJofJbvcolbdcsMxEQwNapoCcBzcBpxxfmgaxxfxxfxxfpPGmTbxvbpUnxvbxvbqvYxvbeHlxXnlySnWFrxEczFwuvfgbdFHaaaaaaaagaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagpBnWLvUVvUVvUVhHGhHGtzPcJLtgdgpGttqsXGpcGhvGhDcdcSfWdsSlpRGmyqerExkYkPKjHHuNhoFMvcolbdcsMrEqcGQqoXukIcBDhUOhUOhUOuAtrXEgJdgmAwQPphKrkpjhWxylwQPmbBexSojNtdsuspgWbugPoIKdFHaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagpBnWLvUVvUVvUVhHGhHGtzPcJLtgdgpGttqsXGpcGhvGhDcdcSfWdsSlpRGmyqerExkYkPKjHHuNhoFMvcolbdcsMrEqcGQqoXukIcBDhUOhUOhUOuAtrXEgJdgmAwQPphKrkpjhWxylwQPmbBexSojNtdsuspgWbugPahWdFHaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagpBgpBgpBeHVgpBgpBiEStzPmaUluYfgNfWdnaXseOxaYpTKgAXfWdtiTfjyiaherEssPkPKmFYvJSutGqkBiYDcsMnbkmuOsDcyiwxEJcBQcBRsvDbsjnYwcCvojNwNjwNjojNojNojNwNjwNjojNojNduxgImczFnmGrXUdFHaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatzPtzPtzPtzPtzPtzPtzPjDiqaCkmjttquzIfSYiqTvaLixUfWdrBrerErzkfiGuxikPKwDmmYKoVkvcolbdcsMvDlcsMhPKydnxEJoqZpNasvDbsjyaIjmhuzynDbxDJfCAfUEtfQovosgcrXmojNjcrhPygeVgeVgeVgeVaafaafaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaatzPwzwwzjgpGttqvVQiNsvVQpOhgCHfWdduKerEqmDerEoYzkPKgUVhLgnZMvconHJdpQpAGdpQhPKnaCxeTfzRfzRxeTjXUyaIjmLxODfIikVypnzpnzpnzgompbYnXPojNsWhiJcgeVaaaaaaaaaaaaaaaqlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/southern_cross/southern_cross-3.dmm b/maps/southern_cross/southern_cross-3.dmm index 58f055f4be..10b168301c 100644 --- a/maps/southern_cross/southern_cross-3.dmm +++ b/maps/southern_cross/southern_cross-3.dmm @@ -1,6 +1,10 @@ "aaa" = (/obj/structure/lattice,/obj/machinery/shield_diffuser,/turf/space,/area/space) "aab" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/obj/effect/floor_decal/industrial/outline/grey,/mob/living/simple_mob/animal/passive/armadillo{desc = "It's a small armored mammal. It seems to be territorial and protective of the dorms.”"; name = "Torta"},/turf/simulated/floor/tiled/dark,/area/hallway/primary/thirddeck/aftdoorm) +"aac" = (/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/thirddeck/foreport) +"aad" = (/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/thirddeck/forestarboard) +"aae" = (/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/thirddeck/dormsaft) "aaf" = (/obj/machinery/chemical_dispenser/bar_soft/full{dir = 8; pixel_x = 5},/obj/structure/table/marble,/turf/simulated/floor/tiled,/area/maintenance/thirddeck/aftport) +"aag" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/landmark{name = "maint_pred"},/turf/simulated/floor/plating,/area/maintenance/thirddeck/dormsaft) "aav" = (/obj/structure/sign/directions/cryo{dir = 8},/obj/structure/sign/directions/medical{dir = 8; pixel_y = 6},/obj/structure/sign/directions/evac{dir = 8; pixel_y = -6},/turf/simulated/wall,/area/hallway/primary/thirddeck/aft) "aaM" = (/obj/structure/cable,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/obj/machinery/power/apc{name = "south bump"; pixel_y = -24},/obj/structure/table/steel,/obj/item/stack/cable_coil/yellow,/obj/item/stack/cable_coil/yellow,/obj/item/stack/cable_coil/yellow,/obj/item/stack/cable_coil/yellow,/turf/simulated/floor/plating,/area/maintenance/solars/aftstarboardsolar) "abK" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/structure/sign/warning/airlock{pixel_y = 32},/turf/simulated/floor/plating,/area/maintenance/solars/aftportsolar) @@ -1880,7 +1884,6 @@ "sZg" = (/turf/simulated/floor/carpet/sblucarpet,/area/crew_quarters/sleep/vistor_room_10) "sZu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/thirddeck/dormsport) "tad" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/monotile,/area/hallway/primary/thirddeck/aft) -"taf" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating,/area/maintenance/thirddeck/dormsaft) "tao" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_y = -30},/obj/effect/shuttle_landmark/southern_cross/escape_pod7/station,/turf/simulated/shuttle/floor,/area/shuttle/escape_pod7/station) "tat" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "aft_port_solar_outer"; locked = 1; name = "Engineering External Access"; req_access = list(11,13)},/turf/simulated/floor/plating,/area/maintenance/solars/aftportsolar) "tav" = (/obj/machinery/door/airlock/glass_external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_pod_8_berth_hatch"; locked = 1; name = "Escape Pod 8"; req_access = list(13)},/turf/simulated/floor,/area/hallway/primary/thirddeck/starboard) @@ -2461,7 +2464,7 @@ apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcap apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcepgepgaqjaqjapcapcnSNnSNnSNnSNjhgjhgjhgjhgjhgjhgjhgjhglwWiqXicmjhglwWiqXicmjhglwWiqXicmjhglwWiqXicmjhglwWiqXicmjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgxcojVtjVtpRLeqroDgpUjyaQhCZhZZiIDopAvPXnZVjVtjVtjvUjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhggCuhISoXgjhggCuhISoXgjhggCuhISoXgjhggCuhISoXgjhggCuhISoXgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgapcapcapcapcepgapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcaqjavHepgepgapcapcapcapcapcjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhglwWiqXicmjhglwWiqXicmjhglwWiqXicmjhglwWiqXicmjhglwWiqXicmjhgjhgjhgjhgjhgjhgjhgjhgjhgjhguPBuPBuPBuPBuPBuPBuPBjhgjhgjhgjhgjhgjhgjhgjVtjVtjVtevxhIRusirYRjRXrYRqkfsmoxKSjVtjVtjVtjhgjhgjhgjhgjhgjhgjhgxVXxVXxVXxVXxVXxVXxVXjhgjhgjhgjhgjhgjhgjhgjhgjhgjhggCuhISoXgjhggCuhISoXgjhggCuhISoXgjhggCuhISoXgjhggCuhISoXgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgaqjaqjaqjaqjapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcepgepgavHaqjapcaqjapcapcapcapcapcapcapcjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhglwWiqXicmjhglwWiqXicmjhglwWiqXicmjhglwWiqXicmjhglwWiqXicmjhgjhgjhgjhgjhgjhguEWmepmepmepmepmGmpNeoqCsAcuZKuPBjhgjhgjhgjhgjhgjdlgjTgjTxkWxkWvsurOZsuQrYRrYRrYRhPMjiYbZnjVtjVtjhgjhgjhgjhgjhgjhgjhgjhgxVXelRfUHcsKmKxqTVxiIxiIxiIxiIiHHjhgjhgjhgjhgjhgjhggCuhISoXgjhggCuhISoXgjhggCuhISoXgjhggCuhISoXgjhggCuhISoXgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgapcapcapcfXnapcapcapcapcapcapcapcapcapcapcapcapcapc -apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcaqjapcapcaqjapcapcapcapcapcapcapcjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhggJNjhgjhgjhggJNjhgjhgjhggJNjhgjhgjhggJNjhgjhgjhggJNjhgjhgqXCjhgsBYsBYsBYuEWgguwyrmCrjiNfmfjAEjAEjAEuFJuPBjhgjhgjhgjhgjhgiaZjhgjhgjVtjVtjVtkpCvDzdMhgycdMhwuIeJKjVtjVtjVtjhgjhgjhgjhgjhgjhgjhgjhgxVXtuUeSnqmkqmkeCUxrzemCbsMnwmiHHnhVnhVnhVjhgjhgjhgjhgersjhgjhgjhgersjhgjhgjhgersjhgjhgjhgersjhgjhgjhgersjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc +apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcaqjapcapcaqjapcapcapcapcapcapcapcjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhggJNjhgjhgjhggJNjhgjhgjhggJNjhgjhgjhggJNjhgjhgjhggJNjhgjhgqXCjhgsBYsBYsBYuEWgguwyrmCrjiNfmfaacjAEjAEuFJuPBjhgjhgjhgjhgjhgiaZjhgjhgjVtjVtjVtkpCvDzdMhgycdMhwuIeJKjVtjVtjVtjhgjhgjhgjhgjhgjhgjhgjhgxVXtuUeSnaadqmkeCUxrzemCbsMnwmiHHnhVnhVnhVjhgjhgjhgjhgersjhgjhgjhgersjhgjhgjhgersjhgjhgjhgersjhgjhgjhgersjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcepgapcapcaqjapcjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgsmFjjgjjgjjgsrajjgjjgjjgsrajjgjjgjjgsrajjgjjgjjgsrajjgjjgjjgsrajjgjjgkASbjzbTWbkmmZPaBAqeweBimgHddunNWkETlMEmJHfFFuPBapcapcapcapcapcgTbapcapcjVtjVtjVtjVtmZuiXWwJloifatXjVtjVtjVtjVtapcapcuNfapcapcapcapcapcxVXylwwoekzduVFcZtoDocEdudTfjXriextjjUhrhRtgjlzKuenitjitjitjitjitjitjitjitjitjitjitjitjitjitjitjitjitjitjitjitjoSWsEnjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcaqjapcapcaqjjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhggJNjhgjhgjhggJNjhgjhgjhggJNjhgjhgjhggJNjhgjhgjhggJNjhgjhgjhgjhgsBYaTKgYivGZiMAlVxmXjjiNtbbjAEhDeojYuPBuPBapcapcapcapcapcgTbapcapcapcapcjVtjVtjVtjVtwbXjVtjVtjVtjVtapcapcapcapcuNfapcapcapcapcapcxVXxVXoWdqfgqmkueuxrzmSugJevHppBFkTKcPJnhVjhgjhgjhgjhgueNjhgjhgjhgueNjhgjhgjhgueNjhgjhgjhgueNjhgjhgjhgueNjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcepgaqjaqjaqjjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhglwWnxpicmjhglwWnxpicmjhglwWnxpicmjhglwWnxpicmjhglwWnxpicmjhgjhgjhgjhgjhgjhguEWmepmepmepuPBvvHmASuPBuPBuPBapcapcapcapcapcapciaZjhgjhgjhggIngIngIngInjVtvSLdBhbAfgIngIngInjhgjhgjhgjhgapcapcapcapcapcapcxVXxVXxVXcwvaIGxVXxiIxiIxiIiHHjhgjhgjhgjhgjhgjhggCuhsNoXgjhggCuhsNoXgjhggCuhsNoXgjhggCuhsNoXgjhggCuhsNoXgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgjhgapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc @@ -2537,10 +2540,10 @@ apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcap apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcjhgjhgsNBsNBhfmaHxfhgihnhVLfSxsLVpOUpfEnlInlInlInlInlInlInlInlIvYbtFItjaketuWTwGXtQWoUdpESptqkQovbbpzbbJohlOwRhgAnwBRnmBuByuByuByuByuByuByuByuByummwlXcqzcvCcvCcvCcvCcvCapcapcapcepgepgapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcjhgjhgjhgsNBsNBsNBsNBcvCcvCcvCcvCaFnpldeJkgPmqLDtTodRNrQKnbotnoxNrsuweLAeLAeLAeLAeLAeLAeLAptqptqiYCiYCiYCiYCiYCiYCqrzdTReJFvXlxJnpXCaVjlINpKHabVsjLwYOkWBkWBcvCelzvvysVXapcapcapcepgapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcjhgjhgjhgjhgjhgjhgjhgcvCwuJhSUcqzcfypldbTysRMtqhkrZeQxrQKeaWtnoeMPtIFhoZiVEcOxqRadmbbLcopniHLhoZlpZtIPeJCiXsqffiYCbqSqzGkNrfmxykLxWmuSwrYjvXGkaLsjLwYOnAteQUnIuhSUhdMsVXapcapcapcepgapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc -apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcjhgjhgjhgjhgjhgjhgcvCipucvCcvCcfypldxVweYgfnnvtdgcWeCsfEDaFqxynfDgaeejnbxKXkTshoZxQFjZoaZQhoZgcQaKmmLTiXsumqiYClYatgteJFryKfgjjDgvRwhgNvXGabVsjLwYOeQUrHDcvCwMXeQUsVXaqjaqjaqjepgapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc +apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcjhgjhgjhgjhgjhgjhgcvCipucvCcvCcfypldxVweYgfnnvtdgcWeCsfEDaFqxynfDgaeejnbxKXkTshoZxQFjZoaZQhoZgcQaKmmLTiXsumqiYClYatgteJFryKfgjjDgvRwhgNvXGabVsjLwYOaaerHDcvCwMXeQUsVXaqjaqjaqjepgapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapccvCykdcvCrHDcfypldpldpldpldpldhGTtnotnotnofBAtgthoZkVgfrGwPvhoZhoZhoZhoZhoZiYCbGQmLTiXsrcRiYCdYfnmBeJFeJFeJFstgsjLsjLsjLsjLsjLwYOeQUjUfcvCcvCcvCcvCapcapcapcavHapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapccvCwMXcvCujUcfyvvNiDwkWBkWBpldaAAhnKjVAtnoffQnmBhoZalAprPidDoROiYCuYrpMPbdGiYCdxlklUdAfvIQpocaVvoKMeJFwUVjjYoUSsjLfJRooUtIimEkgGhhSUhSUcvCapcaqjapcapcapcapcaqjapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc -apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapccvCcvCiUScvCjdptafwyHwyHfbncBtpldhIhwJdqjxtnojKowSChoZpeffGawaphNRiYCiMMidAwNNtSOxGflJneTWeyriYCvAsoIFeJFvTunrscMksjLkFvvvMsdSfMEtCScvCcvCcvCjhgdZUapcapcapcapcaqjapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc +apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapccvCcvCiUScvCjdpaagwyHwyHfbncBtpldhIhwJdqjxtnojKowSChoZpeffGawaphNRiYCiMMidAwNNtSOxGflJneTWeyriYCvAsoIFeJFvTunrscMksjLkFvvvMsdSfMEtCScvCcvCcvCjhgdZUapcapcapcapcaqjapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapccvCtMIeQUcvCcvCcvCcvCcvCcvCahppldpldpldpldpldmpscvCmiHmiHmiHmiHmiHfbpfbpfbpfbpfbpfbpfbpfbpfbpfbpcvCmpssjLsjLsjLsjLsjLouEkFYjcJnuNhNhgGwtXEbFIbFIdZUapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapccvCacYwMXykdkrOgOcurWhykcvCvidwyHeBywyHfFqfFqsEfdOIfLvdOIbDSnfFlwadOIdOIajCdOIuTTbDSnfFlwadOIfLvdOIiJcfFqfFqppKwyHvDkejhelFliIeTAvEPgGwhIzbFIbFIdZUapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc apcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapccvCcvCwuJiSFftJcFpnCAsVKcvCcvCcvCcvCgQAkWBrHDhSUmmBiIXwMXcvCcvCcvCjdpujUbvAlFAcEpcvCcvCcvCeQUxXQhSUlRRlMSkWBkWBwMXofNwSUwSUfdqoQlqYhcvCcvCjhgjhgdZUapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapcapc diff --git a/maps/southern_cross/southern_cross-5.dmm b/maps/southern_cross/southern_cross-5.dmm index cc15ca2789..19875016b2 100644 --- a/maps/southern_cross/southern_cross-5.dmm +++ b/maps/southern_cross/southern_cross-5.dmm @@ -348,8 +348,11 @@ "gJ" = (/obj/structure/boxingropeenter{dir = 8},/turf/simulated/floor/boxing,/area/surface/outpost/main/gym) "gK" = (/turf/simulated/wall,/area/surface/outpost/main/gateway) "gL" = (/obj/machinery/light/spot{dir = 4},/turf/simulated/floor/tiled,/area/surface/outpost/main/landing) +"gM" = (/obj/effect/landmark/event_spawn/dronepod_landing,/turf/simulated/floor/outdoors/snow/sif/planetuse,/area/surface/outside/plains/normal) +"gN" = (/obj/effect/landmark/event_spawn/dronepod_landing,/turf/simulated/floor/outdoors/dirt/sif/planetuse,/area/surface/outside/plains/normal) "gO" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/white/bordercorner{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/surface/outpost/main/corridor/right_upper) "gP" = (/obj/effect/floor_decal/borderfloor/cee{dir = 1},/obj/effect/floor_decal/industrial/danger/cee{dir = 1},/obj/machinery/door/window/brigdoor/westright{name = "Containment Pen"; req_one_access = list(43,1)},/obj/machinery/door/window/brigdoor/eastleft{name = "Containment Pen"; req_one_access = list(43,1)},/obj/machinery/door/blast/regular/open{id = "pen"; name = "Containment Lockdown Blast Doors"},/turf/simulated/floor/tiled,/area/surface/outpost/main/exploration/containment) +"gQ" = (/obj/effect/landmark/event_spawn/dronepod_landing,/turf/simulated/floor/outdoors/grass/sif/planetuse,/area/surface/outside/plains/normal) "gR" = (/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced/full,/obj/structure/grille,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/surface/outpost/security/maa) "gS" = (/obj/effect/floor_decal/industrial/outline/red,/turf/simulated/floor/tiled/monotile,/area/surface/outpost/mining_main/storage) "gT" = (/obj/effect/floor_decal/industrial/outline/red,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/monotile,/area/surface/outpost/main/airlock/landing_south) @@ -2311,7 +2314,7 @@ tFxaxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbxaxaxaxaxaxaxaxaxaxaxaxaxaxaxa tFxaxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbxaxaxaxaxaxaxaxaxaxaxaxaxaxaXbXbXbXbXbXbUXUXUXUXUXLKUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXQTinininfpfpfpfpUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaAdAdAdxaxaxaxaxaxaxaxatF tFxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbxaxaxaxaxaxaxaxaxaXbXbXbXbXbXbXbXbXbUXUXUXUXUXLKUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXQTinininUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaAdAdAdxaxaxaxaxaxaxaxatF tFxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXLKUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXQTinininUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaAdAdAdxaxaxaxaxaxaxaxatF -tFxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXLKUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXQTinininUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaAdAdAdxaxaxaxaxaxaxaxatF +tFxaXbXbXbXbXbXbXbXbXbgMXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXLKUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXQTinininUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXGkGkGkGkGkGkGkGkGkGkGkGkGkGkGkxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaAdAdAdxaxaxaxaxaxaxaxatF tFxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXLKUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXQTinininUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXGkGkGkGkGkGkGkGkGkGkGkGkGkGkxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaAdAdAdxaxaxaxaxaxaxaxatF tFxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXLKUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXQTinininUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXGkGkGkGkGkGkGkGkGkGkGkGkGkGkxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaAdAdAdxaxaxaxaxaxaxaxatF tFxaxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbxaxaxaxaXbxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXLKUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXQTinininUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXGkGkGkGkGkGkGkGkGkGkGkGkGkxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaxaAdAdAdxaxaxaxaxaxaxaxatF @@ -2370,7 +2373,7 @@ tFxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXb tFxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXwsgmylylylvPoMRaRaYFRfYFYFBklBBkBkBkKApHjuQvEqnhsqgyemwCiOILUXUXMQMQSbSbhPKdSbSbMQMQMQMQMQMQMyfBKDqaGKSwOQWoMyMQMQMQMQMQMQGfGfGfqGGfGfMQMQUXUXUXUXUXUXUXbqeNymepXOUXUXUXUXUXUXUXUXUXUXUXUXblUXUXUXUXxaxaxaxaxaxaxaxamOmOXxXxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXwspsJLhsKGTtiqTjRagDPCTQYFWOjwJKBkGoKAEBvvQvSRLZHWRQDawCoaILUXUXXjMQSbwpYwwTqHSbMQMQMQMQUXUXharSEGaXsPVnEGpzWbUXUXMQMQMQMQGfDwnLJBZuGfMQUXUXUXUXUXUXUXUXbquuXMZNXOUXUXUXUXUXUXUXUXUXUXUXUXblUXUXUXUXxaxaxaxaxaxaxaxamOmOXxXxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXwsUXUXgmjLfhfQOGRaRbLENcYFRxtKpSBkciKANxgXkQvDUxboofwCRvfUILUXUXUXXjSbqMfyXZRNSbUXUXUXUXUXUXhaSaEGaXEGVnEGwyWbUXUXUXUXUXUXGfxgmwsoLCGfUXUXUXUXUXUXUXUXUXXOEHiTXOXOUXUXUXUXUXUXUXUXUXUXUXUXblUXUXUXUXUXxaxaxaxaxaxamOmOmOXxXxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao -tFxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXwsUXUXgmjLVSprcmRaAsmxQYYFjtXsdJBkXfKANxhWkQYHMbKBpmQrhOILILUXUXUXUXSbfYQKiWzrSbUXUXUXUXUXUXhaGyeMxFkLGPcvnBWbUXUXUXUXUXUXGfdgMkyBsAGfUXUXUXUXUXUXUXUXUXbqmbZxvAxuUXUXUXUXUXUXUXUXUXUXUXUXblUXUXUXUXUXxaxaxaxaxaxamOmOXxXxXxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao +tFxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbgMXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXwsUXUXgmjLVSprcmRaAsmxQYYFjtXsdJBkXfKANxhWkQYHMbKBpmQrhOILILUXUXUXUXSbfYQKiWzrSbUXUXUXUXUXUXhaGyeMxFkLGPcvnBWbUXUXUXUXUXUXGfdgMkyBsAGfUXUXUXUXUXUXUXUXUXbqmbZxvAxuUXUXUXUXUXUXUXUXUXUXUXUXblUXUXUXUXUXxaxaxaxaxaxamOmOXxXxXxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXwsUXUXgmKGvNUZPYRaQjOujVYFQSLxvXBkqFKANxNNILILILILILILILILUXUXUXUXUXSbSbSbqtSbSbUXUXUXUXUXUXMyMyMywjThwjMyMyMyUXUXUXUXUXUXGfGfGfGfGfGfUXUXUXUXUXUXUXUXUXbqTxXmAUxuUXUXUXUXUXUXUXUXUXUXUXUXblUXUXUXUXUXxaxaxaxaxaxamOmOXxXxXxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXwsUXUXgmKGXywaOURaNUNCSxYFfkNweUBktJKANxLcILhjmKILUXUXUXUXUXBYJLJLJLJLJLCDmPlFDmUXUXUXUXUXUXUXUXhaOHgTOHWbUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXXOBoCnXOXOUXUXUXUXUXUXUXUXUXUXUXUXblUXUXUXUXUXUXxaxaxaxaxamOmOXxXxXxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxaxaXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbXbUXUXUXUXUXwsUXUXgmKGKGKVRaRaRaTMGxYFYFWKBkBkBkyGJOeXIUIUIUIUIUIUkEkEIUgmininUXUXUXUXUXUXUXUXininininUXUXUXhaWYmWWYWbUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXUXQWGOGOQWUXUXUXUXUXUXUXUXUXUXUXUXUXblUXUXUXUXUXUXxaxaxaxamOmOmOXxXxXxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao @@ -2434,7 +2437,7 @@ tFxapcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuo tFxapcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuouououououououououououououoyLuouououououououououououououououououououououououououououououououououououououououoininininuouououououououououououoininininuouououououououououououououoVWVWVWVWKQKQKQVWVWVWVWVWVWVWVWVWVWVWVWVWVWuouououououoBxBxBxBxBxBxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxapcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououououoyLuouououououououououououououououououououououououououououououououououououououououoinininininininuouououououoininininininuououououououououououououououououoVWVWVWKQKQKQVWVWVWVWVWVWVWVWVWVWVWVWuououououououoBxBxBxBxBxBxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxapcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououououoyLuououououououououououououououououououououououououououououououououououououououoinininininininininininininininininuouououououououououououououououououououououoVWVWVWKQKQKQVWVWVWVWVWVWVWuouououououououououoBxBxBxBxBxBxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao -tFxapcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuouououououououououououoyLuouououououououououououououououououououououououououououououououououououououououoinininininininininininininininuououououououououououououououououououououououououoVWVWKQKQKQKQKQKQVWVWVWuouououououououououoBxBxBxBxBxBxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao +tFxapcpcpcpcpcpcpcpcpcpcpcpcpcgNpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuouououououououououououoyLuouououououououououououououououououououououououououououououououououououououououoinininininininininininininininuououououououououououououououououououououououououoVWVWKQKQKQKQKQKQVWVWVWuouououououououououoBxBxBxBxBxBxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxapcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououoyLuouououououououououououououououououououououououououououououououououououououououoinininuououououoininininininininininuououououououououououououououououououououououoVWVWVWKQKQKQKQKQKQVWVWVWuououououououououoBxBxBxBxBxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxapcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououoyLuououououououououououououououououououououououououououououououououououououououoinininuouououououououououououoinininininininuououououououououououououououououououououoVWVWKQKQVWVWVWVWVWVWVWVWVWuououououououoBxBxBxBxBxbZVsVsVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxaHupcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououoyLuououououououououououououououououououououououououououououououououououououououoinininuououououououououououououououoinininininininuououououououououououououououououoVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWVWuououoBxJyJyJyJyxAVsVsVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao @@ -2449,14 +2452,14 @@ tFxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHupcpcpcpcpcpcpcpcpcpcpcpcpcpcpc tFxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHupcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuopcuouououoyLuouououououououououououououououououououououououououououououououououououououououoinpcpcuououououououououououououououououououououououoFsnXhJhJZXVWVWuouououououououououououououououououououououououououououopcpcBxBxBxBxBxWRwAsRVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHupcpcpcpcpcpcpcpcpcpcpcpcuouopcpcpcuoWWuouououououououououououououououououououououououououououououououououououououououoinpcpcuouououououououououououououououououououououoFsFsnXhJhJZXVWVWuouououououououououououououououououououououououououououopcpcBxBxBxBxBxBxBxbZVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHupcpcHuHupcpcpcpcpcpcpcuououououoyLpcuououououououououououououououououououououououououououououououououououououououopcinpcuouououououououououououououououououououoFsFsFsFsnXhJhJZXVWuououououououououououououououououououououououououououououopcpcpcpcBxBxBxBxBxbZVsVsVsVsRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJao -tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHupcpcHuHupcpcpcpcpcpcuouououoyLuouououououououououououououououououououououououououououououououououououououououopcinuououououououououououououououououououoFsFsFsFsFsFsBBhJhJBBuopcpcpcpcpcpcuououououououououououououououououououououououopcpcpcpcBxBxBxBxBxWRsRVsVsVsVsVsVsVsVsRJRJRJRJRJRJRJRJRJRJao +tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHupcpcHuHupcpcpcpcpcpcuouououoyLuouououououououououououououououououogQuououououououououououououououououououououopcinuououououououououououououououououououoFsFsFsFsFsFsBBhJhJBBuopcpcpcpcpcpcuououououououououououououououououououououououopcpcpcpcBxBxBxBxBxWRsRVsVsVsVsVsVsVsVsRJRJRJRJRJRJRJRJRJRJao tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHupcpcpcpcpcpcpcpcuoyLuouououououououououououououououououououououououououououououououououououououououopcinuouououououououououououououououououoFsFsFsFsFsFsuouointLpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououououououououououopcpcpcpcBxBxBxBxBxBxbZVsVsVsVsVsVsVsVsVsVsVsRJRJRJRJRJRJRJao tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHupcpcpcpcpcpcpcWWpcuopcuouououououououououououououououououououououououououououououououououououopcpcinuouououououououououououououououoFsFsFskbFsFspcpcpcpcininpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuouououououououououououououououououopcpcBxBxBxBxBxBxbZVsVsVsVsVsVsVsVsVsVsVsRJRJVsVsVsVsVsao tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHupcHupcpcWWuououououououououououououououououououououououououououououououououououououououopcpcuouououououououououououououoFsFsFsFsFskbFsFsFspcpcpcpcinpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououououououopcpcBxBxBxBxBxBxWRwAwAsRVsVsVsVsVsVsVsVsVsVsVsVsVsVsVsao tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuioHuHuHuHuHuHuHuHuHuuouououououououououououououououououououououououououououououopcpcpcuououououououououououououoFsFsFsFsFskbFsFspcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououououopcpcBxBxBxBxBxBxBxBxBxbZVsVsVsVsVsVsVsVsVsVsVsVsVsVsVsao tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuioHuHuHuHuHuHuHuHuHuuouououououououououououououououououououououououououououououopcpcpcuouououououououououoFsFsFsFsFsFsFskbFsFsFspcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououououopcpcpcBxBxBxBxBxBxBxBxWRwAwAwAwAwAsRVsVsVsVsVsVsbzwAwAao tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuioHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuuououououououououououououououououououououououopcpcuouououououououououoFsFsFsFsFsFsFskbFsFsFsFspcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuouououououououououououopcpcBxBxBxBxBxBxBxBxBxBxBxBxBxBxbZVsVsVsVsbzwALPxaxatF -tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuioHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuuououououououououououououououououououououououopcpcuououououououououoFsFsFsFsFsFsFskbkbFsFsFsFspcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououopcpcpcpcBxBxBxBxBxBxBxBxBxBxBxBxWRwAwAwAwALPBxBxxaxatF +tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuioHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuuououououououououououououououououououououououopcpcuououououououououoFsFsFsFsFsFsFskbkbFsFsFsFspcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcgNuououououououououououopcpcpcpcBxBxBxBxBxBxBxBxBxBxBxBxWRwAwAwAwALPBxBxxaxatF tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuioHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuuouououououououououououououououououopcpcpcuououououououoFsFsFsFsFsFsFskbkbkbkbFsFsFsFspcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuouououououououououopcpcpcpcpcpcBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxBxxaxatF tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuioHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuuouououououououououououououopcpcuououououououoFsFsFsFsFsFsFsFskbkbkbkbFsFsFsFspcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououopcpcpcpcpcpcpcpcpcpcpcpcBxBxBxBxBxBxBxBxBxBxBxBxBxxaxatF tFxaxaHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuioHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuHuuououououououououopcpcuououououououoFsFsFsFsFsFsFskbkbkbkbkbkbFsFsFsFsFspcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcpcuououououououououououopcpcpcpcpcpcpcpcpcpcpcpcBxBxBxBxBxBxBxBxBxBxBxBxBxxaxatF diff --git a/maps/southern_cross/southern_cross.dm b/maps/southern_cross/southern_cross.dm index a12a546792..4b797eccb7 100644 --- a/maps/southern_cross/southern_cross.dm +++ b/maps/southern_cross/southern_cross.dm @@ -6,6 +6,7 @@ #include "southern_cross_defines.dm" #include "southern_cross_elevator.dm" #include "southern_cross_events.dm" + #include "southern_cross_overrides.dm" #include "southern_cross_presets.dm" #include "southern_cross_shuttles.dm" #include "southern_cross_shuttles_ch.dm" @@ -35,6 +36,7 @@ #include "structures/closets/security.dm" #include "turfs/outdoors.dm" #include "overmap/sectors.dm" + #include "events/wildlife_encounter.dm" //CHOMPStation Edit Start TFF 25/3/20 - Station level map z-levels separated into 3 distinct files to work with MapDiffBot. All other files renamed accordingly. #include "southern_cross-1.dmm" diff --git a/maps/southern_cross/southern_cross_overrides.dm b/maps/southern_cross/southern_cross_overrides.dm new file mode 100644 index 0000000000..6525446b1f --- /dev/null +++ b/maps/southern_cross/southern_cross_overrides.dm @@ -0,0 +1,9 @@ +/mob/living/silicon/robot/platform/explorer + req_access = list(access_explorer) + +/mob/living/silicon/robot/platform/cargo + req_access = list(access_cargo_bot) + +/obj/item/weapon/card/id/platform/Initialize() + . = ..() + access |= access_explorer diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index d9bf9f8111..869a7fcbb4 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -13728,6 +13728,7 @@ dir = 4; icon_state = "steel_decals_central5" }, +/mob/living/simple_mob/animal/passive/opossum/poppy, /turf/simulated/floor/tiled/monotile, /area/engineering/workshop) "azg" = ( diff --git a/maps/tether/tether_jobs.dm b/maps/tether/tether_jobs.dm index a737f96bd0..00bde79692 100644 --- a/maps/tether/tether_jobs.dm +++ b/maps/tether/tether_jobs.dm @@ -158,10 +158,11 @@ l_ear = /obj/item/device/radio/headset/talon shoes = /obj/item/clothing/shoes/black - uniform = /obj/item/clothing/under/rank/pilot1 + uniform = /obj/item/clothing/under/rank/pilot1/no_webbing suit = /obj/item/clothing/suit/storage/toggle/bomber/pilot gloves = /obj/item/clothing/gloves/fingerless glasses = /obj/item/clothing/glasses/fakesunglasses/aviator + uniform_accessories = list(/obj/item/clothing/accessory/storage/webbing/pilot1 = 1) /decl/hierarchy/outfit/job/talon_doctor name = OUTFIT_JOB_NAME("Talon Doctor") diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml index 1db6f6dcd8..14aff98f9d 100644 --- a/tgui/.eslintrc.yml +++ b/tgui/.eslintrc.yml @@ -110,7 +110,7 @@ rules: ## Enforce that class methods utilize this # class-methods-use-this: error ## Enforce a maximum cyclomatic complexity allowed in a program - complexity: [error, { max: 60 }] + complexity: [error, { max: 65 }] ## Require return statements to either always or never specify values # consistent-return: error ## Enforce consistent brace style for all control statements diff --git a/tgui/packages/tgui/interfaces/VorePanel.js b/tgui/packages/tgui/interfaces/VorePanel.js index af4b36d403..9725685f75 100644 --- a/tgui/packages/tgui/interfaces/VorePanel.js +++ b/tgui/packages/tgui/interfaces/VorePanel.js @@ -289,6 +289,8 @@ const VoreSelectedBelly = (props, context) => { digest_burn, bulge_size, shrink_grow_size, + emote_time, + emote_active, addons, contaminates, contaminate_flavor, @@ -554,6 +556,18 @@ const VoreSelectedBelly = (props, context) => { selected={vorespawn_blacklist} content={vorespawn_blacklist ? "Yes" : "No"} /> + +