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/__defines/sound.dm b/code/__defines/sound.dm index fcdb53edd6..7db8a2f760 100644 --- a/code/__defines/sound.dm +++ b/code/__defines/sound.dm @@ -112,7 +112,7 @@ 'sound/ambience/generic/generic2.ogg',\ 'sound/ambience/generic/generic3.ogg'\ ) -// 'sound/ambience/generic/generic4.ogg'\ // VOREStation Edit: Comment out entry 4 as this doesn't fit on Virgo, and we have our own weather system. +// 'sound/ambience/generic/generic4.ogg'\ // Sounds of PA announcements, presumably involving shuttles? #define AMBIENCE_ARRIVALS list(\ 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 5046575b0b..e68f75e911 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -114,7 +114,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]" @@ -275,7 +275,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") 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,iYou 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/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 60bb48c5f6..cfcb2923ae 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -353,10 +353,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 94121f3b65..21775d0403 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -354,6 +354,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, @@ -950,4 +954,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/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/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 78884826f7..78cd9c39e7 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -140,6 +140,11 @@ slot_flags = SLOT_BELT default_material = "plasteel" //VOREStation Edit +/obj/item/weapon/material/knife/machete/cyborg + name = "integrated machete" + desc = "A sharp machete often found attached to robots." + unbreakable = TRUE + /obj/item/weapon/material/knife/tacknife/survival name = "survival knife" desc = "A hunting grade survival knife." diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 704081437e..e1ff8f0ce5 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 fdc84aa3c4..d79b95d58f 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/turfs/turf.dm b/code/game/turfs/turf.dm index 8465280607..9cacb36eaf 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -66,15 +66,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 ac0e103478..bad4a2764a 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -198,7 +198,7 @@ var/world_topic_spam_protect_time = world.timeofday // No combat/syndicate cyborgs, no drones, and no AI shells. 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/loadout/loadout_accessories_vr.dm b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm index 1143b4035c..3be939bab9 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm @@ -51,43 +51,43 @@ /datum/gear/accessory/holster display_name = "holster selection (Security, SM, HoP, Exploration)" - allowed_roles = list("Site Manager", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Explorer","Pathfinder", "Blueshield Guard","Security Pilot") //YW ADDITIONS + allowed_roles = list("Site Manager", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Explorer","Pathfinder","Talon Guard", "Blueshield Guard","Security Pilot") //YW ADDITIONS /datum/gear/accessory/brown_vest display_name = "webbing, brown (Eng, Sec, Med, Exploration, Miner)" - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner", "Blueshield Guard","Security Pilot") //YW ADDITIONS + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Blueshield Guard","Security Pilot") //YW ADDITIONS /datum/gear/accessory/black_vest display_name = "webbing, black (Eng, Sec, Med, Exploration, Miner)" - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner", "Blueshield Guard","Security Pilot") //YW ADDITIONS + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Blueshield Guard","Security Pilot") //YW ADDITIONS /datum/gear/accessory/white_vest display_name = "webbing, white (Medical)" - allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic") + allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Talon Doctor") /datum/gear/accessory/brown_drop_pouches display_name = "drop pouches, brown (Eng, Sec, Med, Exploration, Miner)" - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner", "Blueshield Guard","Security Pilot") //YW ADDITIONS + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Blueshield Guard","Security Pilot") //YW ADDITIONS /datum/gear/accessory/black_drop_pouches display_name = "drop pouches, black (Eng, Sec, Med, Exploration, Miner)" - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner", "Blueshield Guard","Security Pilot") //YW ADDITIONS + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard", "Blueshield Guard","Security Pilot") //YW ADDITIONS /datum/gear/accessory/white_drop_pouches display_name = "drop pouches, white (Medical)" - allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic") + allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Talon Doctor") /datum/gear/accessory/bluespace display_name = "bluespace badge (Eng, Sec, Med, Exploration, Miner)" path = /obj/item/clothing/accessory/storage/bluespace - allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner") + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer","Security Officer","Detective","Head of Security","Warden","Paramedic","Chief Medical Officer","Medical Doctor","Chemist","Field Medic","Explorer","Pathfinder","Shaft Miner","Talon Captain","Talon Doctor","Talon Engineer","Talon Guard") cost = 2 /datum/gear/accessory/webbing cost = 1 /datum/gear/accessory/stethoscope - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic") + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Field Medic","Talon Doctor") /datum/gear/accessory/khcrystal display_name = "Life Crystal" @@ -103,7 +103,7 @@ display_name = "pilot qualification pin" description = "An iron pin denoting the qualification to fly USG spacecraft." path = /obj/item/clothing/accessory/solgov/specialty/pilot - allowed_roles = list("Pathfinder", "Pilot", "Field Medic","Security Pilot") //YW ADDITIONS + allowed_roles = list("Pathfinder","Pilot","Field Medic","Talon Pilot","Security Pilot") //YW ADDITIONS /datum/gear/accessory/flops display_name = "drop straps" 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/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/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 edbbbdc0d3..237688622d 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -4724,9 +4724,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/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 0975e97ae5..016f17ae46 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/living/carbon/human/species/shadekin/shadekin.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm index c175412f3b..6af26d350e 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm @@ -54,7 +54,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 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 7f7aaf0251..ed7f36629c 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 @@ -459,7 +459,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 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 d0670dea74..c9efc049d4 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 @@ -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/living.dm b/code/modules/mob/living/living.dm index 7debf735b1..010a170d1b 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/silicon/robot/component.dm b/code/modules/mob/living/silicon/robot/component.dm index 882a7d934b..5f7dae3a0f 100644 --- a/code/modules/mob/living/silicon/robot/component.dm +++ b/code/modules/mob/living/silicon/robot/component.dm @@ -77,6 +77,10 @@ external_type = /obj/item/robot_parts/robot_component/armour max_damage = 90 +/datum/robot_component/armour/platform + name = "platform armour plating" + external_type = /obj/item/robot_parts/robot_component/armour_platform + max_damage = 140 // ACTUATOR // Enables movement. @@ -243,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 849696ea4c..229aa7b66a 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) ..() @@ -286,10 +288,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)) @@ -299,6 +298,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) @@ -906,18 +910,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 @@ -1211,3 +1218,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 c27e4cad2e..6fca511bbf 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 @@ -803,7 +806,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", @@ -826,7 +829,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) @@ -910,7 +913,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/subtypes/thinktank/_thinktank.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm new file mode 100644 index 0000000000..79279af6dd --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm @@ -0,0 +1,163 @@ +// Spawner landmarks are used because platforms that are mapped during +// SSatoms init try to Initialize() twice. I have no idea why and I am +// not paid enough to spend more time trying to debug it. +/obj/effect/landmark/robot_platform + name = "recon platform spawner" + icon = 'icons/mob/screen1.dmi' + icon_state = "x3" + delete_me = TRUE + var/platform_type + +/obj/effect/landmark/robot_platform/Initialize() + if(platform_type) + new platform_type(get_turf(src)) + return ..() + +/mob/living/silicon/robot/platform + name = "support platform" + desc = "A large quadrupedal AI platform, colloquially known as a 'think-tank' due to the flexible onboard intelligence." + icon = 'icons/mob/robots_thinktank.dmi' + icon_state = "tachi" + color = "#68a2f2" + + cell = /obj/item/weapon/cell/mech + idcard_type = /obj/item/weapon/card/id/platform + module = /obj/item/weapon/robot_module/robot/platform + + lawupdate = FALSE + modtype = "Standard" + speak_statement = "chirps" + + mob_bump_flag = HEAVY + mob_swap_flags = ~HEAVY + mob_push_flags = HEAVY + mob_size = MOB_LARGE + + var/const/platform_respawn_time = 3 MINUTES + + var/tmp/last_recharge_state = FALSE + var/tmp/recharge_complete = FALSE + var/tmp/recharger_charge_amount = 10 KILOWATTS + var/tmp/recharger_tick_cost = 80 KILOWATTS + var/weakref/recharging + + var/list/stored_atoms + var/max_stored_atoms = 1 + var/static/list/can_store_types = list( + /mob/living, + /obj/item, + /obj/structure, + /obj/machinery + ) + // Currently set to prevent tonks hauling a deliaminating SM into the middle of the station. + var/static/list/cannot_store_types = list( + /obj/machinery/power/supermatter + ) + +/mob/living/silicon/robot/platform/SetName(pickedName) + . = ..() + if(mind) + mind.name = real_name + +/mob/living/silicon/robot/platform/Initialize(var/mapload) + . = ..() + if(!mmi) + mmi = new /obj/item/device/mmi/digital/robot(src) + SetName("inactive [initial(name)]") + updateicon() + +// Copypasting from root proc to avoid calling ..() and accidentally creating duplicate armour etc. +/mob/living/silicon/robot/platform/initialize_components() + components["actuator"] = new /datum/robot_component/actuator(src) + components["radio"] = new /datum/robot_component/radio(src) + components["power cell"] = new /datum/robot_component/cell(src) + components["diagnosis unit"] = new /datum/robot_component/diagnosis_unit(src) + components["camera"] = new /datum/robot_component/camera(src) + components["comms"] = new /datum/robot_component/binary_communication(src) + components["armour"] = new /datum/robot_component/armour/platform(src) + +/mob/living/silicon/robot/platform/Destroy() + for(var/weakref/drop_ref in stored_atoms) + var/atom/movable/drop_atom = drop_ref.resolve() + if(istype(drop_atom) && !QDELETED(drop_atom) && drop_atom.loc == src) + drop_atom.dropInto(loc) + stored_atoms = null + if(recharging) + var/obj/item/recharging_atom = recharging.resolve() + if(istype(recharging_atom) && recharging_atom.loc == src) + recharging_atom.dropInto(loc) + recharging = null + . = ..() + +/mob/living/silicon/robot/platform/examine(mob/user, distance) + . = ..() + if(distance <= 3) + + if(recharging) + var/obj/item/weapon/cell/recharging_atom = recharging.resolve() + if(istype(recharging_atom) && !QDELETED(recharging_atom)) + . += "It has \a [recharging_atom] slotted into its recharging port." + . += "The cell readout shows [round(recharging_atom.percent(),1)]% charge." + else + . += "Its recharging port is empty." + else + . += "Its recharging port is empty." + + if(length(stored_atoms)) + var/list/atom_names = list() + for(var/weakref/stored_ref in stored_atoms) + var/atom/movable/AM = stored_ref.resolve() + if(istype(AM)) + atom_names += "\a [AM]" + if(length(atom_names)) + . += "It has [english_list(atom_names)] loaded into its transport bay." + else + . += "Its cargo bay is empty." + +/mob/living/silicon/robot/platform/update_braintype() + braintype = BORG_BRAINTYPE_PLATFORM + +/mob/living/silicon/robot/platform/init() + . = ..() + if(ispath(module, /obj/item/weapon/robot_module)) + module = new module(src) + +/mob/living/silicon/robot/platform/module_reset() + return FALSE + +/mob/living/silicon/robot/platform/use_power() + . = ..() + + if(stat != DEAD && cell) + + // TODO generalize solar occlusion to charge from the actual sun. + var/new_recharge_state = istype(loc, /turf/simulated/floor/outdoors) || /*, /turf/exterior) */ istype(loc, /turf/space) + if(new_recharge_state != last_recharge_state) + last_recharge_state = new_recharge_state + if(last_recharge_state) + to_chat(src, SPAN_NOTICE("Your integrated solar panels begin recharging your battery.")) + else + to_chat(src, SPAN_DANGER("Your integrated solar panels cease recharging your battery.")) + + if(last_recharge_state) + var/charge_amt = recharger_charge_amount * CELLRATE + cell.give(charge_amt) + used_power_this_tick -= (charge_amt) + module.respawn_consumable(src, (charge_amt / 250)) // magic number copied from borg charger. + + if(recharging) + + var/obj/item/weapon/cell/recharging_atom = recharging.resolve() + if(!istype(recharging_atom) || QDELETED(recharging_atom) || recharging_atom.loc != src) + recharging = null + return + + if(recharging_atom.percent() < 100) + var/charge_amount = recharger_tick_cost * CELLRATE + if(cell.check_charge(charge_amount * 1.5) && cell.checked_use(charge_amount)) // Don't kill ourselves recharging the battery. + recharging_atom.give(charge_amount) + used_power_this_tick += charge_amount + + if(!recharge_complete && recharging_atom.percent() >= 100) + recharge_complete = TRUE + visible_message(SPAN_NOTICE("\The [src] beeps and flashes a green light above \his recharging port.")) 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_interactions.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm new file mode 100644 index 0000000000..cfb7b2dd81 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm @@ -0,0 +1,77 @@ +/mob/living/silicon/robot/platform/attack_hand(mob/user) + + if(!opened) + if(recharging) + var/obj/item/recharging_atom = recharging.resolve() + if(istype(recharging_atom) && !QDELETED(recharging_atom) && recharging_atom.loc == src) + recharging_atom.dropInto(loc) + user.put_in_hands(recharging_atom) + user.visible_message(SPAN_NOTICE("\The [user] pops \the [recharging_atom] out of \the [src]'s recharging port.")) + recharging = null + return TRUE + + if(try_remove_cargo(user)) + return TRUE + + . = ..() + +/mob/living/silicon/robot/platform/attackby(obj/item/W, mob/user) + + if(istype(W, /obj/item/weapon/cell) && !opened) + if(recharging) + to_chat(user, SPAN_WARNING("\The [src] already has \a [recharging.resolve()] inserted into its recharging port.")) + else if(user.unEquip(W)) + W.forceMove(src) + recharging = weakref(W) + recharge_complete = FALSE + user.visible_message(SPAN_NOTICE("\The [user] slots \the [W] into \the [src]'s recharging port.")) + return TRUE + + if(istype(W, /obj/item/device/floor_painter)) + return FALSE // Paint sprayer wil call try_paint() in afterattack() + + . = ..() + +/mob/living/silicon/robot/platform/attack_ghost(mob/observer/ghost/user) + + if(client || key || stat == DEAD || !ticker || !ticker.mode) + return ..() + + var/confirm = alert("Do you wish to take control of \the [src]?", "Platform Control", "No", "Yes") + if(confirm != "Yes" || QDELETED(src) || client || key || stat == DEAD || !ticker || !ticker.mode) + return ..() + + if(jobban_isbanned(user, "Robot")) + to_chat(user, SPAN_WARNING("You are banned from synthetic roles and cannot take control of \the [src].")) + return + + // Boilerplate from drone fabs, unsure if there's a shared proc to use instead. + var/deathtime = world.time - user.timeofdeath + var/deathtimeminutes = round(deathtime / (1 MINUTE)) + var/pluralcheck = "" + if(deathtimeminutes == 1) + pluralcheck = "minute" + else if(deathtimeminutes > 0) + pluralcheck = " [deathtimeminutes] minute\s and" + var/deathtimeseconds = round((deathtime - deathtimeminutes * 1 MINUTE) / 10,1) + if (deathtime < platform_respawn_time) + to_chat(usr, "You have been dead for[pluralcheck] [deathtimeseconds] seconds.") + to_chat(usr, "You must wait [platform_respawn_time/600] minute\s to take control of \the [src]!") + return + // End boilerplate. + + if(user.mind) + user.mind.transfer_to(src) + if(key != user.key) + key = user.key + SetName("[modtype] [braintype]-[rand(100,999)]") + addtimer(CALLBACK(src, .proc/welcome_client), 1) + qdel(user) + +/mob/living/silicon/robot/platform/proc/welcome_client() + if(client) + to_chat(src, SPAN_NOTICE("You are a think-tank, a kind of flexible and adaptive drone intelligence installed into an armoured platform. Your programming compels you to be friendly and helpful wherever possible.")) + SetSleeping(0) + SetWeakened(0) + SetParalysis(0) + resting = FALSE diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm new file mode 100644 index 0000000000..2a8ffcb3e1 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_module.dm @@ -0,0 +1,102 @@ +/obj/item/weapon/robot_module/robot/platform + + hide_on_manifest = TRUE + + var/pupil_color = COLOR_CYAN + var/base_color = COLOR_WHITE + var/eye_color = COLOR_BEIGE + var/armor_color = "#68a2f2" + var/user_icon = 'icons/mob/robots_thinktank.dmi' + var/user_icon_state = "tachi" + + var/list/decals + var/list/available_decals = list( + "Stripe" = "stripe", + "Vertical Stripe" = "stripe_vertical" + ) + +// Only show on manifest if they have a player. +/obj/item/weapon/robot_module/robot/platform/hide_on_manifest() + if(isrobot(loc)) + var/mob/living/silicon/robot/R = loc + return !R.key + return ..() + +/obj/item/weapon/robot_module/robot/platform/verb/set_eye_colour() + set name = "Set Eye Colour" + set desc = "Select an eye colour to use." + set category = "Robot Commands" + set src in usr + + var/new_pupil_color = input(usr, "Select a pupil colour.", "Pupil Colour Selection") as color|null + if(usr.incapacitated() || QDELETED(usr) || QDELETED(src) || loc != usr) + return + + pupil_color = new_pupil_color || initial(pupil_color) + usr.update_icon() + +/obj/item/weapon/robot_module/robot/platform/explorer + armor_color = "#528052" + eye_color = "#7b7b46" + decals = list( + "stripe_vertical" = "#52b8b8", + "stripe" = "#52b8b8" + ) + channels = list( + "Science" = 1, + "Explorer" = 1 + ) + +/obj/item/weapon/robot_module/robot/platform/explorer/New() + ..() + modules += new /obj/item/weapon/tool/wrench/cyborg(src) + modules += new /obj/item/weapon/weldingtool/electric/mounted/cyborg(src) + modules += new /obj/item/weapon/tool/wirecutters/cyborg(src) + modules += new /obj/item/weapon/tool/screwdriver/cyborg(src) + modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + modules += new /obj/item/weapon/material/knife/machete/cyborg(src) + + var/datum/matter_synth/medicine = new /datum/matter_synth/medicine(7500) + var/obj/item/stack/medical/bruise_pack/bandaid = new(src) + bandaid.uses_charge = 1 + bandaid.charge_costs = list(1000) + bandaid.synths = list(medicine) + modules += bandaid + synths += medicine + + var/obj/item/weapon/gun/energy/phasegun/mounted/cyborg/phasegun = new(src) + modules += phasegun + + emag = new /obj/item/weapon/chainsaw(src) + +/obj/item/weapon/robot_module/robot/platform/explorer/respawn_consumable(var/mob/living/silicon/robot/R, rate) + . = ..() + for(var/obj/item/weapon/gun/energy/pew in modules) + if(pew.power_supply && pew.power_supply.charge < pew.power_supply.maxcharge) + pew.power_supply.give(pew.charge_cost * rate) + pew.update_icon() + else + pew.charge_tick = 0 + +/obj/item/weapon/robot_module/robot/platform/cargo + armor_color = "#d5b222" + eye_color = "#686846" + decals = list( + "stripe_vertical" = "#bfbfa1", + "stripe" = "#bfbfa1" + ) + channels = list("Supply" = 1) + networks = list(NETWORK_MINE) + +/obj/item/weapon/robot_module/robot/platform/cargo/New() + ..() + modules += new /obj/item/weapon/packageWrap(src) + modules += new /obj/item/weapon/pen/multi(src) + modules += new /obj/item/device/destTagger(src) + emag = new /obj/item/weapon/stamp/denied + +/obj/item/weapon/robot_module/robot/platform/cargo/respawn_consumable(mob/living/silicon/robot/R, rate) + . = ..() + var/obj/item/weapon/packageWrap/wrapper = locate() in modules + if(wrapper.amount < initial(wrapper.amount)) + wrapper.amount++ diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm new file mode 100644 index 0000000000..ec6d6f4267 --- /dev/null +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm @@ -0,0 +1,139 @@ +/mob/living/silicon/robot/platform/death(gibbed, deathmessage, show_dead_message) + + if(gibbed) + + if(recharging) + var/obj/item/recharging_atom = recharging.resolve() + if(istype(recharging_atom) && !QDELETED(recharging_atom) && recharging_atom.loc == src) + recharging_atom.dropInto(loc) + recharging_atom.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),30) + recharging = null + + if(length(stored_atoms)) + for(var/weakref/stored_ref in stored_atoms) + var/atom/movable/dropping = stored_ref.resolve() + if(istype(dropping) && !QDELETED(dropping) && dropping.loc == src) + dropping.dropInto(loc) + dropping.throw_at(get_edge_target_turf(src,pick(GLOB.alldirs)),rand(1,3),30) + stored_atoms = null + + . = ..() + +/mob/living/silicon/robot/platform/proc/can_store_atom(var/atom/movable/storing, var/mob/user) + + if(!istype(storing)) + var/storing_target = (user == src) ? "yourself" : "\the [src]" + to_chat(user, SPAN_WARNING("You cannot store that inside [storing_target].")) + return FALSE + + if(!isturf(storing.loc)) + return FALSE + + if(storing.anchored || !storing.simulated) + to_chat(user, SPAN_WARNING("\The [storing] won't budge!")) + return FALSE + + if(storing == src) + var/storing_target = (user == src) ? "yourself" : "\the [src]" + to_chat(user, SPAN_WARNING("You cannot store [storing_target] inside [storing_target]!")) + return FALSE + + if(length(stored_atoms) >= max_stored_atoms) + var/storing_target = (user == src) ? "Your" : "\The [src]'s" + to_chat(user, SPAN_WARNING("[storing_target] cargo compartment is full.")) + return FALSE + + if(ismob(storing)) + var/mob/M = storing + if(M.mob_size >= mob_size) + var/storing_target = (user == src) ? "your storage compartment" : "\the [src]" + to_chat(user, SPAN_WARNING("\The [storing] is too big for [storing_target].")) + return FALSE + + for(var/store_type in can_store_types) + if(istype(storing, store_type)) + . = TRUE + break + + if(.) + for(var/store_type in cannot_store_types) + if(istype(storing, store_type)) + . = FALSE + break + if(!.) + var/storing_target = (user == src) ? "yourself" : "\the [src]" + to_chat(user, SPAN_WARNING("You cannot store \the [storing] inside [storing_target].")) + +/mob/living/silicon/robot/platform/proc/store_atom(var/atom/movable/storing, var/mob/user) + if(istype(storing)) + storing.forceMove(src) + LAZYDISTINCTADD(stored_atoms, weakref(storing)) + +/mob/living/silicon/robot/platform/proc/drop_stored_atom(var/atom/movable/ejecting, var/mob/user) + + if(!ejecting && length(stored_atoms)) + var/weakref/stored_ref = stored_atoms[1] + if(!istype(stored_ref)) + LAZYREMOVE(stored_atoms, stored_ref) + else + ejecting = stored_ref?.resolve() + + LAZYREMOVE(stored_atoms, weakref(ejecting)) + if(istype(ejecting) && !QDELETED(ejecting) && ejecting.loc == src) + ejecting.dropInto(loc) + if(user == src) + visible_message(SPAN_NOTICE("\The [src] ejects \the [ejecting] from its cargo compartment.")) + else + user.visible_message(SPAN_NOTICE("\The [user] pulls \the [ejecting] from \the [src]'s cargo compartment.")) + +/mob/living/silicon/robot/platform/attack_ai(mob/user) + if(isrobot(user) && user.Adjacent(src)) + return try_remove_cargo(user) + return ..() + +/mob/living/silicon/robot/platform/proc/try_remove_cargo(var/mob/user) + if(!length(stored_atoms) || !istype(user)) + return FALSE + var/weakref/remove_ref = stored_atoms[length(stored_atoms)] + var/atom/movable/removing = remove_ref?.resolve() + if(!istype(removing) || QDELETED(removing) || removing.loc != src) + LAZYREMOVE(stored_atoms, remove_ref) + else + user.visible_message(SPAN_NOTICE("\The [user] begins unloading \the [removing] from \the [src]'s cargo compartment.")) + if(do_after(user, 3 SECONDS, src) && !QDELETED(removing) && removing.loc == src) + drop_stored_atom(removing, user) + return TRUE + +/mob/living/silicon/robot/platform/verb/drop_stored_atom_verb() + set name = "Eject Cargo" + set category = "Robot Commands" + set desc = "Drop something from your internal storage." + + if(incapacitated()) + to_chat(src, SPAN_WARNING("You are not in any state to do that.")) + return + + if(length(stored_atoms)) + drop_stored_atom(user = src) + else + to_chat(src, SPAN_WARNING("You have nothing in your cargo compartment.")) + +/mob/living/silicon/robot/platform/MouseDrop_T(atom/movable/dropping, mob/living/user) + if(!istype(user) || !istype(dropping) || user.incapacitated()) + return FALSE + if(!can_mouse_drop(dropping, user) || !can_store_atom(dropping, user)) + return FALSE + if(user == src) + visible_message(SPAN_NOTICE("\The [src] begins loading \the [dropping] into its cargo compartment.")) + else + user.visible_message(SPAN_NOTICE("\The [user] begins loading \the [dropping] into \the [src]'s cargo compartment.")) + if(do_after(user, 3 SECONDS, src) && can_mouse_drop(dropping, user) && can_store_atom(dropping, user)) + store_atom(dropping, user) + return FALSE + +/mob/living/silicon/robot/platform/proc/can_mouse_drop(var/atom/dropping, var/mob/user) + if(!istype(user) || !istype(dropping) || QDELETED(dropping) || QDELETED(user) || QDELETED(src)) + return FALSE + if(user.incapacitated() || !Adjacent(user) || !dropping.Adjacent(user)) + return FALSE + return TRUE \ No newline at end of file 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_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index dedac8e1e2..292a4eeacd 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/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm index d76244aba7..a0e1f3854d 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm @@ -1,1140 +1,1149 @@ -/* -//////////////////////////// -/ =--------------------= / -/ == Tail Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/tail - 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. - 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() - . = ..() - 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 - -/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" - -/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/molenar_kitsune - 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 - desc = "" - 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)" - 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/holly - name = "tigress tail (Holly)" - desc = "" - icon_state = "tigresstail" - ckeys_allowed = list("hoodoo") - -/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/vore/taurs_vr.dmi' - clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. - -/datum/sprite_accessory/tail/tailmaw - name = "tailmaw, colorable" - 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/tesh_feathered - name = "Teshari tail" - desc = "" - icon_state = "teshtail_s" - do_colouration = 1 - extra_overlay = "teshtail_feathers_s" - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/teshari_fluffytail - name = "Teshari alternative, colorable" - desc = "" - icon_state = "teshari_fluffytail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshari_fluffytail_mark" - -/datum/sprite_accessory/tail/tesh_pattern_male - name = "Teshari male tail pattern" - desc = "" - icon_state = "teshtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshpattern_male_tail" - -/datum/sprite_accessory/tail/tesh_pattern_male_alt - name = "Teshari male tail alt. pattern" - desc = "" - icon_state = "teshtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshpattern_male_alt" - -/datum/sprite_accessory/tail/tesh_pattern_fem - name = "Teshari female tail pattern" - desc = "" - icon_state = "teshtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshpattern_fem_tail" - -/datum/sprite_accessory/tail/tesh_pattern_fem_alt - name = "Teshari male tail alt. pattern" - desc = "" - icon_state = "teshtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshpattern_fem_alt" - -/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_vr.dmi' - -/datum/sprite_accessory/tail/special/unathi - name = "unathi tail" - desc = "" - icon_state = "sogtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/tajaran - name = "tajaran tail" - desc = "" - icon_state = "tajtail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/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/unathihc - name = "unathi tail, colorable" - desc = "" - icon_state = "sogtail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/special/tajaranhc - name = "tajaran tail, colorable" - desc = "" - icon_state = "tajtail_hc_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/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/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" - -/datum/sprite_accessory/tail/Easterntail - name = "Eastern Dragon (Animated)" - desc = "" - icon_state = "Easterntail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "EasterntailColorTip" - ani_state = "Easterntail_w" - extra_overlay_w = "EasterntailColorTip_w" - -/datum/sprite_accessory/tail/synthtail_static - name = "Synthetic lizard tail" - desc = "" - icon_state = "synthtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/synthtail_vwag - name = "Synthetic lizard tail (vwag)" - desc = "" - icon_state = "synthtail" - ani_state = "synthtail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/Plugtail - name = "Synthetic plug tail" - desc = "" - icon_state = "Plugtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "PlugtailMarking" - extra_overlay2 = "PlugtailMarking2" - -/datum/sprite_accessory/tail/Segmentedtail - name = "Segmented tail, animated" - desc = "" - icon_state = "Segmentedtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "Segmentedtailmarking" - ani_state = "Segmentedtail_w" - extra_overlay_w = "Segmentedtailmarking_w" - -/datum/sprite_accessory/tail/Segmentedlights - name = "Segmented tail, animated synth" - desc = "" - icon_state = "Segmentedtail" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "Segmentedlights" - ani_state = "Segmentedtail_w" - extra_overlay_w = "Segmentedlights_w" - -/datum/sprite_accessory/tail/fox_tail - name = "Fox tail" - desc = "" - icon_state = "fox_tail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/fox_tail_plain - name = "Fox tail" - desc = "" - icon_state = "fox_tail_plain_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/fennec_tail - name = "Fennec tail" - desc = "" - icon_state = "fennec_tail_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/lizard_tail_smooth - name = "Lizard Tail (Smooth)" - desc = "" - icon_state = "lizard_tail_smooth" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/lizard_tail_dark_tiger - name = "Lizard Tail (Dark Tiger)" - desc = "" - icon_state = "lizard_tail_dark_tiger" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/lizard_tail_light_tiger - name = "Lizard Tail (Light Tiger)" - desc = "" - icon_state = "lizard_tail_light_tiger" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/lizard_tail_spiked - name = "Lizard Tail (Spiked)" - desc = "" - icon_state = "lizard_tail_spiked" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/xenotail_fullcolour - name = "xenomorph tail (fully colourable)" - desc = "" - icon_state = "xenotail_fullcolour" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/xenotailalt_fullcolour - name = "xenomorph tail alt. (fully colourable)" - desc = "" - icon_state = "xenotailalt_fullcolour" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/peacocktail_red //this is ckey locked for now, but prettiebyrd wants these tails to be unlocked at a later date - name = "Peacock tail (vwag)" - desc = "" - icon = "icons/mob/vore/tails_vr.dmi" - icon_state = "peacocktail_red" - ani_state = "peacocktail_red_w" - ckeys_allowed = list("prettiebyrd") - -/datum/sprite_accessory/tail/peacocktail //ditto - name = "Peacock tail, colorable (vwag)" - desc = "" - icon = "icons/mob/vore/tails_vr.dmi" - icon_state = "peacocktail" - ani_state = "peacocktail_w" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - ckeys_allowed = list("prettiebyrd") +/* +//////////////////////////// +/ =--------------------= / +/ == Tail Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/tail + 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. + 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() + . = ..() + 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 + +/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" + +/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/molenar_kitsune + 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 + desc = "" + 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)" + 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/holly + name = "tigress tail (Holly)" + desc = "" + icon_state = "tigresstail" + ckeys_allowed = list("hoodoo") + +/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/vore/taurs_vr.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. + +/datum/sprite_accessory/tail/tailmaw + name = "tailmaw, colorable" + 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/tesh_feathered + name = "Teshari tail" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + extra_overlay = "teshtail_feathers_s" + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/teshari_fluffytail + name = "Teshari alternative, colorable" + desc = "" + icon_state = "teshari_fluffytail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshari_fluffytail_mark" + +/datum/sprite_accessory/tail/tesh_pattern_male + name = "Teshari male tail pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_male_tail" + +/datum/sprite_accessory/tail/tesh_pattern_male_alt + name = "Teshari male tail alt. pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_male_alt" + +/datum/sprite_accessory/tail/tesh_pattern_fem + name = "Teshari female tail pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_fem_tail" + +/datum/sprite_accessory/tail/tesh_pattern_fem_alt + name = "Teshari male tail alt. pattern" + desc = "" + icon_state = "teshtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshpattern_fem_alt" + +/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_vr.dmi' + +/datum/sprite_accessory/tail/special/unathi + name = "unathi tail" + desc = "" + icon_state = "sogtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/tajaran + name = "tajaran tail" + desc = "" + icon_state = "tajtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/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/unathihc + name = "unathi tail, colorable" + desc = "" + icon_state = "sogtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/tajaranhc + name = "tajaran tail, colorable" + desc = "" + icon_state = "tajtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/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/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" + +/datum/sprite_accessory/tail/Easterntail + name = "Eastern Dragon (Animated)" + desc = "" + icon_state = "Easterntail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "EasterntailColorTip" + ani_state = "Easterntail_w" + extra_overlay_w = "EasterntailColorTip_w" + +/datum/sprite_accessory/tail/synthtail_static + name = "Synthetic lizard tail" + desc = "" + icon_state = "synthtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/synthtail_vwag + name = "Synthetic lizard tail (vwag)" + desc = "" + icon_state = "synthtail" + ani_state = "synthtail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/Plugtail + name = "Synthetic plug tail" + desc = "" + icon_state = "Plugtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "PlugtailMarking" + extra_overlay2 = "PlugtailMarking2" + +/datum/sprite_accessory/tail/Segmentedtail + name = "Segmented tail, animated" + desc = "" + icon_state = "Segmentedtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "Segmentedtailmarking" + ani_state = "Segmentedtail_w" + extra_overlay_w = "Segmentedtailmarking_w" + +/datum/sprite_accessory/tail/Segmentedlights + name = "Segmented tail, animated synth" + desc = "" + icon_state = "Segmentedtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "Segmentedlights" + ani_state = "Segmentedtail_w" + extra_overlay_w = "Segmentedlights_w" + +/datum/sprite_accessory/tail/fox_tail + name = "Fox tail" + desc = "" + icon_state = "fox_tail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fox_tail_plain + name = "Fox tail" + desc = "" + icon_state = "fox_tail_plain_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fennec_tail + name = "Fennec tail" + desc = "" + icon_state = "fennec_tail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_smooth + name = "Lizard Tail (Smooth)" + desc = "" + icon_state = "lizard_tail_smooth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_dark_tiger + name = "Lizard Tail (Dark Tiger)" + desc = "" + icon_state = "lizard_tail_dark_tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_light_tiger + name = "Lizard Tail (Light Tiger)" + desc = "" + icon_state = "lizard_tail_light_tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/lizard_tail_spiked + name = "Lizard Tail (Spiked)" + desc = "" + icon_state = "lizard_tail_spiked" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/xenotail_fullcolour + name = "xenomorph tail (fully colourable)" + desc = "" + icon_state = "xenotail_fullcolour" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/xenotailalt_fullcolour + name = "xenomorph tail alt. (fully colourable)" + desc = "" + icon_state = "xenotailalt_fullcolour" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/peacocktail_red //this is ckey locked for now, but prettiebyrd wants these tails to be unlocked at a later date + name = "Peacock tail (vwag)" + desc = "" + icon = "icons/mob/vore/tails_vr.dmi" + icon_state = "peacocktail_red" + ani_state = "peacocktail_red_w" + ckeys_allowed = list("prettiebyrd") + +/datum/sprite_accessory/tail/peacocktail //ditto + name = "Peacock tail, colorable (vwag)" + desc = "" + icon = "icons/mob/vore/tails_vr.dmi" + icon_state = "peacocktail" + ani_state = "peacocktail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("prettiebyrd") + +/datum/sprite_accessory/tail/tentacle + name = "Tentacle, colorable (vwag)" + desc = "" + icon = "icons/mob/vore/tails_vr.dmi" + icon_state = "tentacle" + ani_state = "tentacle_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY diff --git a/code/modules/organs/robolimbs_custom.dm b/code/modules/organs/robolimbs_custom.dm index 15df0c98c8..727db0927a 100644 --- a/code/modules/organs/robolimbs_custom.dm +++ b/code/modules/organs/robolimbs_custom.dm @@ -45,12 +45,11 @@ /obj/item/weapon/disk/limb/eggnerdltdred company = "Eggnerd Prototyping Ltd. (Red)" -// icon = 'icons/obj/items_vr.dmi' -// icon_state = "verkdisk" + 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." @@ -62,9 +61,10 @@ skin_tone = 1 suggested_species = "Tajara" -/datum/robolimb/dsi_tajaran/New() +/*/datum/robolimb/dsi_tajaran/New() species_cannot_use = GLOB.all_species.Copy() -// species_cannot_use -= SPECIES_TAJ + species_cannot_use -= SPECIES_TAJ +VS Edit - anyone can select these. */ /obj/item/weapon/disk/limb/dsi_tajaran company = "DSI - Tajaran" @@ -80,13 +80,14 @@ skin_tone = 1 suggested_species = "Unathi" -/datum/robolimb/dsi_lizard/New() +/* /datum/robolimb/dsi_lizard/New() // species_cannot_use = GLOB.all_species.Copy() -// species_cannot_use -= SPECIES_UNATHI + 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." @@ -156,7 +157,7 @@ /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." @@ -167,8 +168,8 @@ /datum/robolimb/dsi_teshari/New() species_cannot_use = GLOB.all_species.Copy() -// species_cannot_use -= SPECIES_TESHARI -// species_cannot_use -= SPECIES_CUSTOM + 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 diff --git a/code/modules/organs/robolimbs_vr.dm b/code/modules/organs/robolimbs_vr.dm index b93a37fd5a..9c45394b54 100644 --- a/code/modules/organs/robolimbs_vr.dm +++ b/code/modules/organs/robolimbs_vr.dm @@ -46,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)" @@ -71,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" diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index 9dc249167b..6f9e04c5b4 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -334,7 +334,7 @@ if(!iscarbon(owner) || !owner.species) return - var/icon/eyecon //VOREStation Edit -- holds eye icon to render over markings later. + var/icon/eyecon //Eye color/icon var/should_have_eyes = owner.should_have_organ(O_EYES) @@ -373,7 +373,7 @@ 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 + 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"]]" 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/projectiles/guns/energy/phase.dm b/code/modules/projectiles/guns/energy/phase.dm index ec3c7ff438..18290c3946 100644 --- a/code/modules/projectiles/guns/energy/phase.dm +++ b/code/modules/projectiles/guns/energy/phase.dm @@ -12,6 +12,15 @@ projectile_type = /obj/item/projectile/energy/phase one_handed_penalty = 15 +/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 f2dbac9f69..a3a1af83fe 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -4099,6 +4099,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/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index 1bec508e50..ac585315e5 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/tgui/states/default.dm b/code/modules/tgui/states/default.dm index cd08fb7f4c..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. diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 0c8123b003..00512aa264 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -23,7 +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/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. diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index cf1f091087..92dc014f84 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -40,6 +40,7 @@ magpiemayhem - Vox marco_barko - Protean mewchild - Diona mewchild - Vox +milu - Xenochimera mrsebbi - Xenochimera natje - Xenochimera nerdass - Protean @@ -61,6 +62,7 @@ rixunie - Diona rubyflamewing - Protean rykkastormheart - Xenochimera ryumi - Protean +ryumi - Xenochimera scoutisafolflol - Xenochimera seiga - Vox sepulchre - Vox diff --git a/icons/_nanomaps/tether_nanomap_z2.png b/icons/_nanomaps/tether_nanomap_z2.png index f9beaab7c0..653034b4b5 100644 Binary files a/icons/_nanomaps/tether_nanomap_z2.png and b/icons/_nanomaps/tether_nanomap_z2.png 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/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/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/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/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/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi index 44a960e345..339e0c96c5 100644 Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.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/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/maps/offmap_vr/talon/talon.dm b/maps/offmap_vr/talon/talon.dm index 45c5d28dc8..74281e86b8 100644 --- a/maps/offmap_vr/talon/talon.dm +++ b/maps/offmap_vr/talon/talon.dm @@ -292,7 +292,8 @@ Once in open space, consider disabling nonessential power-consuming electronics /obj/item/clothing/suit/space/void/refurb/marine/talon, /obj/item/weapon/tank/oxygen, /obj/item/device/suit_cooling_unit, - /obj/item/device/gps/security/talonguard + /obj/item/device/gps/security/talonguard, + /obj/item/weapon/melee/baton ) /obj/structure/closet/secure_closet/talon_doctor @@ -439,6 +440,7 @@ Once in open space, consider disabling nonessential power-consuming electronics /obj/item/modular_computer/laptop/preset/custom_loadout/standard/talon/pilot/install_default_programs() ..() + hard_drive.store_file(new/datum/computer_file/program/ship_nav()) /obj/item/modular_computer/laptop/preset/custom_loadout/standard/talon/engineer name = "engineer's laptop" diff --git a/maps/offmap_vr/talon/talon1.dmm b/maps/offmap_vr/talon/talon1.dmm index 5ff5ada988..461e64e033 100644 --- a/maps/offmap_vr/talon/talon1.dmm +++ b/maps/offmap_vr/talon/talon1.dmm @@ -1511,6 +1511,7 @@ "db" = ( /obj/machinery/vending/engivend{ products = list(/obj/item/device/geiger = 4, /obj/item/clothing/glasses/meson = 2, /obj/item/device/multitool = 4, /obj/item/weapon/cell/high = 10, /obj/item/weapon/airlock_electronics = 10, /obj/item/weapon/module/power_control = 10, /obj/item/weapon/circuitboard/airalarm = 10, /obj/item/weapon/circuitboard/firealarm = 10, /obj/item/weapon/circuitboard/status_display = 2, /obj/item/weapon/circuitboard/ai_status_display = 2, /obj/item/weapon/circuitboard/newscaster = 2, /obj/item/weapon/circuitboard/holopad = 2, /obj/item/weapon/circuitboard/intercom = 4, /obj/item/weapon/circuitboard/security/telescreen/entertainment = 4, /obj/item/weapon/stock_parts/motor = 2, /obj/item/weapon/stock_parts/spring = 2, /obj/item/weapon/stock_parts/gear = 2, /obj/item/weapon/circuitboard/atm, /obj/item/weapon/circuitboard/guestpass, /obj/item/weapon/circuitboard/keycard_auth, /obj/item/weapon/circuitboard/photocopier, /obj/item/weapon/circuitboard/fax, /obj/item/weapon/circuitboard/request, /obj/item/weapon/circuitboard/microwave, /obj/item/weapon/circuitboard/washing, /obj/item/weapon/circuitboard/scanner_console, /obj/item/weapon/circuitboard/sleeper_console, /obj/item/weapon/circuitboard/body_scanner, /obj/item/weapon/circuitboard/sleeper, /obj/item/weapon/circuitboard/dna_analyzer, /obj/item/weapon/circuitboard/partslathe); + req_access = list(301); req_log_access = 301 }, /turf/simulated/floor/tiled/eris/dark/brown_platform, @@ -2472,6 +2473,7 @@ "mS" = ( /obj/structure/table/standard, /obj/fiftyspawner/steel, +/obj/fiftyspawner/copper, /turf/simulated/floor/tiled/eris/steel/gray_perforated, /area/talon/deckone/workroom) "mT" = ( 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 e162147d2b..c7f43260ba 100644 --- a/maps/southern_cross/southern_cross-1.dmm +++ b/maps/southern_cross/southern_cross-1.dmm @@ -45963,6 +45963,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, +/mob/living/simple_mob/animal/passive/opossum/poppy, /turf/simulated/floor/tiled, /area/engineering/foyer) "bGL" = ( @@ -72952,12 +72953,9 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/effect/floor_decal/borderfloor{ - dir = 1 - }, -/obj/effect/floor_decal/corner/brown/border{ - dir = 1 - }, +/obj/machinery/mech_recharger, +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/effect/landmark/robot_platform/cargo, /turf/simulated/floor/tiled/steel, /area/quartermaster/warehouse) "cHa" = ( @@ -72973,6 +72971,9 @@ /obj/effect/floor_decal/corner/brown/border{ dir = 1 }, +/obj/structure/table/steel, +/obj/item/device/floor_painter, +/obj/item/weapon/weldingtool, /turf/simulated/floor/tiled, /area/quartermaster/warehouse) "cHb" = ( diff --git a/maps/southern_cross/southern_cross-3.dmm b/maps/southern_cross/southern_cross-3.dmm index 2d672e6eee..b3b89008ba 100644 --- a/maps/southern_cross/southern_cross-3.dmm +++ b/maps/southern_cross/southern_cross-3.dmm @@ -4043,6 +4043,8 @@ /area/surface/outpost/main/garage) "iI" = ( /obj/structure/table/steel, +/obj/item/weapon/weldingtool, +/obj/item/device/floor_painter, /turf/simulated/floor/tiled/steel_grid, /area/surface/outpost/main/garage) "iJ" = ( @@ -14234,6 +14236,26 @@ }, /turf/simulated/floor/tiled/freezer, /area/surface/outpost/main/pool) +"GP" = ( +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/mech_recharger, +/obj/effect/landmark/robot_platform/explorer, +/turf/simulated/floor/plating, +/area/surface/outpost/main/garage) +"Iw" = ( +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/machinery/mech_recharger, +/turf/simulated/floor/plating, +/area/surface/outpost/main/garage) +"Lz" = ( +/obj/effect/floor_decal/industrial/hatch/yellow, +/obj/machinery/mech_recharger, +/obj/effect/landmark/robot_platform/explorer, +/turf/simulated/floor/plating, +/area/surface/outpost/main/garage) (1,1,1) = {" aa @@ -54622,11 +54644,11 @@ hq hG ii iG -iH -iH -iH -iH -iH +iG +iG +iG +iG +iG kJ hF lq @@ -54880,10 +54902,10 @@ hF ij iI Ej -iH -iH -iH -iH +Lz +GP +Iw +iG kK hF lr diff --git a/maps/southern_cross/southern_cross.dm b/maps/southern_cross/southern_cross.dm index c34b4b74d6..a9a009e553 100644 --- a/maps/southern_cross/southern_cross.dm +++ b/maps/southern_cross/southern_cross.dm @@ -7,6 +7,7 @@ #include "southern_cross_jobs.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" 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-02-surface2.dmm b/maps/tether/tether-02-surface2.dmm index 44b000e800..617fb42766 100644 --- a/maps/tether/tether-02-surface2.dmm +++ b/maps/tether/tether-02-surface2.dmm @@ -8291,7 +8291,7 @@ icon_state = "4-8" }, /obj/machinery/door/firedoor/glass, -/turf/simulated/floor/tiled/white, +/turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/north) "amS" = ( /obj/structure/cable{ @@ -8304,7 +8304,7 @@ dir = 4 }, /obj/machinery/door/firedoor/glass, -/turf/simulated/floor/tiled/white, +/turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/north) "amT" = ( /obj/structure/cable{ @@ -8325,7 +8325,7 @@ name = "Maintenance Access" }, /obj/machinery/door/firedoor/glass, -/turf/simulated/floor/tiled/white, +/turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/north) "amV" = ( /obj/structure/railing{ @@ -13542,19 +13542,13 @@ /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/bar) "avQ" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 5 - }, -/obj/structure/cable/green{ - d1 = 1; - d2 = 4; - icon_state = "1-4" - }, +/obj/structure/table/rack/holorack, +/obj/effect/floor_decal/rust, +/obj/random/maintenance/clean, +/obj/random/tech_supply, +/obj/random/maintenance/research, /turf/simulated/floor/plating, -/area/maintenance/lower/public_garden_maintenence/upper) +/area/tether/surfacebase/outside/outside2) "avR" = ( /obj/structure/cable/green{ d1 = 4; @@ -15902,11 +15896,14 @@ /turf/simulated/floor/plating, /area/maintenance/lower/bar) "aBb" = ( -/obj/structure/railing{ - dir = 4 +/obj/structure/cable{ + icon_state = "4-8" }, -/turf/simulated/wall, -/area/tether/surfacebase/fish_farm) +/obj/machinery/alarm{ + pixel_y = 22 + }, +/turf/simulated/floor, +/area/maintenance/substation/research) "aBc" = ( /obj/machinery/light{ dir = 8 @@ -20541,14 +20538,10 @@ /turf/simulated/floor, /area/maintenance/substation/research) "aKj" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/alarm{ - pixel_y = 22 - }, -/turf/simulated/floor, -/area/maintenance/substation/research) +/obj/structure/railing, +/obj/effect/floor_decal/rust, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) "aKk" = ( /obj/structure/cable/green{ d1 = 4; @@ -23061,6 +23054,10 @@ }, /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/south) +"aOM" = ( +/obj/machinery/door/airlock/maintenance/common, +/turf/simulated/floor/tiled/techfloor, +/area/tether/surfacebase/fish_farm) "aON" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -23205,6 +23202,22 @@ "aPc" = ( /turf/simulated/wall, /area/rnd/research) +"aPd" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/floor_decal/techfloor{ + dir = 4 + }, +/turf/simulated/floor/tiled/techfloor, +/area/maintenance/asmaint2) +"aPe" = ( +/obj/effect/floor_decal/techfloor{ + dir = 4 + }, +/obj/effect/floor_decal/industrial/danger/corner, +/turf/simulated/floor/tiled/techfloor, +/area/maintenance/asmaint2) "aPf" = ( /obj/structure/cable/cyan{ d1 = 1; @@ -23433,6 +23446,13 @@ }, /turf/simulated/floor/tiled/techmaint, /area/tether/surfacebase/east_stairs_two) +"aPv" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/floor_decal/rust, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) "aPw" = ( /obj/effect/floor_decal/corner_techfloor_grid{ dir = 9 @@ -23443,6 +23463,10 @@ /obj/machinery/portable_atmospherics/hydroponics, /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/south) +"aPx" = ( +/obj/structure/catwalk, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) "aPy" = ( /obj/structure/closet/crate, /obj/random/maintenance/clean, @@ -23473,12 +23497,38 @@ }, /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/south) +"aPA" = ( +/obj/machinery/door/airlock/maintenance/common, +/turf/simulated/floor/plating, +/area/maintenance/lower/public_garden_maintenence/upper) +"aPB" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 5 + }, +/obj/structure/cable/green{ + d1 = 1; + d2 = 4; + icon_state = "1-4" + }, +/obj/effect/floor_decal/rust, +/turf/simulated/floor/plating, +/area/maintenance/lower/public_garden_maintenence/upper) "aPC" = ( /obj/effect/floor_decal/corner_techfloor_grid{ dir = 10 }, /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/south) +"aPD" = ( +/obj/structure/railing{ + dir = 4 + }, +/obj/structure/railing, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) "aPE" = ( /obj/effect/floor_decal/borderfloor{ dir = 8 @@ -23613,6 +23663,22 @@ /obj/random/maintenance/research, /turf/simulated/floor/plating, /area/tether/surfacebase/emergency_storage/atmos) +"aPU" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/rust, +/obj/random/junk, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) +"aPV" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/floor_decal/rust, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) "aPW" = ( /obj/machinery/light{ dir = 8 @@ -23794,6 +23860,9 @@ /obj/structure/frame/computer, /turf/simulated/floor, /area/maintenance/lower/south) +"aQq" = ( +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) "aQr" = ( /obj/structure/frame{ anchored = 1 @@ -24149,10 +24218,45 @@ }, /turf/simulated/floor/tiled/techfloor, /area/maintenance/lower/south) +"aRe" = ( +/turf/simulated/wall{ + can_open = 1 + }, +/area/tether/surfacebase/outside/outside2) +"aRf" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/rust, +/obj/random/drinkbottle, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) +"aRg" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) +"aRh" = ( +/obj/structure/table/rack/holorack, +/obj/random/maintenance/clean, +/obj/random/maintenance/clean, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) +"aRi" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/rust, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) "aRj" = ( /obj/random/tool, /turf/simulated/floor/plating, /area/maintenance/asmaint2) +"aRk" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/floor_decal/rust, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) "aRl" = ( /obj/machinery/requests_console{ department = "Science"; @@ -24354,6 +24458,13 @@ }, /turf/simulated/floor/tiled/techmaint, /area/tether/surfacebase/east_stairs_two) +"aRB" = ( +/obj/structure/closet, +/obj/item/weapon/storage/mre/random, +/obj/item/weapon/storage/mre/random, +/obj/item/weapon/storage/mre/random, +/turf/simulated/floor/plating, +/area/tether/surfacebase/outside/outside2) "aRC" = ( /obj/effect/floor_decal/corner_techfloor_grid{ dir = 5 @@ -24427,6 +24538,19 @@ can_open = 1 }, /area/maintenance/lower/south) +"aRJ" = ( +/obj/structure/railing, +/obj/structure/railing{ + dir = 8 + }, +/turf/simulated/floor/water/deep/indoors, +/area/maintenance/asmaint2) +"aRK" = ( +/obj/structure/catwalk, +/obj/effect/floor_decal/rust, +/obj/random/junk, +/turf/simulated/floor/tiled/techfloor, +/area/maintenance/asmaint2) "aRL" = ( /obj/random/maintenance/research, /turf/simulated/floor/plating, @@ -39843,7 +39967,7 @@ akX akX adt adt -adt +aQq adt adt adt @@ -39985,7 +40109,7 @@ aui akX akX adt -adt +aQq adt adt azs @@ -40127,7 +40251,7 @@ ass avi akX adt -adt +aQq adt adt azs @@ -40269,7 +40393,7 @@ ars avj akX adt -adt +aQq adt adt azs @@ -40410,9 +40534,9 @@ atH auj akX akX -adt -adt -adt +aac +aRe +aac adt azs swg @@ -40426,8 +40550,8 @@ adt adt adt adt -adt -adt +aHm +aHm aHm aHE aHE @@ -40551,11 +40675,11 @@ ars atI aqt akX -adt -adt -adt -adt -adt +aPv +aPD +aRf +aac +aac azs axO bCs @@ -40568,8 +40692,8 @@ azs azs azs azs -adt -adt +aHm +aHm aHm aHm aqp @@ -40692,13 +40816,13 @@ ars asw akX akX -adt -adt -adt -adt -adt -adt -azs +aKj +aPx +aPU +aPx +aRi +aPU +fLW axO pqb bOW @@ -40709,12 +40833,12 @@ aDj aDV aCm aBB -azs -adt -adt -aHm -aHm -aHm +aOM +aJf +aRK +aJf +arY +aJf aJf aJf aJf @@ -40833,13 +40957,13 @@ aqB art akX akX -adt -adt -adt -adt -adt -adt -adt +avQ +aKj +aPx +aPV +aRg +aRk +aRk azs awN flk @@ -40852,10 +40976,10 @@ aDk aEx aBd azs -adt -adt -aHm -aHm +aRJ +arY +aJf +aJf aqq aJf aJf @@ -40977,11 +41101,11 @@ akX ajV ajV ajV +aPA ajV -ajV -adt -adt -adt +aRh +aRh +aRB azs axO viY @@ -40994,10 +41118,10 @@ aDk aEy azq azs -adt -adt -aHm -aHm +aHE +aHE +aPd +aPe aqr are arh @@ -41119,11 +41243,11 @@ amQ atJ auk auk -avQ +aPB ajV -adt -adt -adt +aac +aac +aac azs azs sgu @@ -41136,9 +41260,9 @@ aDk aEy azq azs -adt -adt -aGy +aHm +aHm +aHm aHE aqs aHE @@ -41270,14 +41394,14 @@ awY azq azq azq -aBb +azs aBC aCo aDk aDk aEz aBC -aBb +azs awY awY aGy @@ -43132,7 +43256,7 @@ aEc aEc aEc aJJ -aKj +aBb aKW aLD aMo diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index 6cf991129a..673c59a11c 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -32564,7 +32564,9 @@ /area/tether/surfacebase/entertainment/backstage) "bee" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/computer/arcade/orion_trail, +/obj/machinery/computer/arcade/orion_trail{ + dir = 4 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bef" = ( @@ -33407,7 +33409,9 @@ /turf/simulated/floor/tiled/eris/steel/bar_dance, /area/tether/surfacebase/barbackmaintenance) "bfR" = ( -/obj/machinery/computer/arcade/battle, +/obj/machinery/computer/arcade/battle{ + dir = 1 + }, /turf/simulated/floor/wood, /area/crew_quarters/bar) "bfS" = ( diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index 7503f37d69..4b015e675d 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -13744,6 +13744,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..2b9807f28f 100644 --- a/maps/tether/tether_jobs.dm +++ b/maps/tether/tether_jobs.dm @@ -150,7 +150,6 @@ /decl/hierarchy/outfit/job/talon_pilot name = OUTFIT_JOB_NAME("Talon Pilot") - id_pda_assignment = "Pilot" id_slot = slot_wear_id pda_type = null diff --git a/vorestation.dme b/vorestation.dme index 503611c9b0..fd234060dc 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2827,6 +2827,12 @@ #include "code\modules\mob\living\silicon\robot\subtypes\lost_drone.dm" #include "code\modules\mob\living\silicon\robot\subtypes\lost_drone_vr.dm" #include "code\modules\mob\living\silicon\robot\subtypes\syndicate.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\_thinktank.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_icon.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_interactions.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_module.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_storage.dm" +#include "code\modules\mob\living\silicon\robot\subtypes\thinktank\thinktank_subtypes.dm" #include "code\modules\mob\living\simple_mob\appearance.dm" #include "code\modules\mob\living\simple_mob\butchering.dm" #include "code\modules\mob\living\simple_mob\combat.dm" @@ -2870,6 +2876,7 @@ #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\mouse_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\passive.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\passive\penguin.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\passive\possum.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\pets\bird_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\pets\cat.dm"
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.