diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index e7853f7059..d497391d3f 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -19,6 +19,7 @@ #define DM_FLAG_STRIPPING 0x2 #define DM_FLAG_LEAVEREMAINS 0x4 #define DM_FLAG_THICKBELLY 0x8 +#define DM_FLAG_AFFECTWORN 0x10 //Item related modes #define IM_HOLD "Hold" diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 946cd9de0e..7a49e8b387 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -12,6 +12,7 @@ var/global/list/everyone_traits = list() // Neutral traits available to all spec var/global/list/positive_traits = list() // Positive custom species traits, indexed by path var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup var/global/list/all_traits = list() // All of 'em at once (same instances) +var/global/list/active_ghost_pods = list() var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference") //TFF 5/8/19 - Suit Sensors global list @@ -107,30 +108,66 @@ var/global/list/fancy_release_sounds = list( ) var/global/list/global_vore_egg_types = list( - "Unathi" = UNATHI_EGG, - "Tajaran" = TAJARAN_EGG, - "Akula" = AKULA_EGG, - "Skrell" = SKRELL_EGG, - "Nevrean" = NEVREAN_EGG, - "Sergal" = SERGAL_EGG, - "Human" = HUMAN_EGG, - "Slime" = SLIME_EGG, - "Egg" = EGG_EGG, - "Xenochimera" = XENOCHIMERA_EGG, - "Xenomorph" = XENOMORPH_EGG) + "Unathi", + "Tajara", + "Akula", + "Skrell", + "Sergal", + "Nevrean", + "Human", + "Slime", + "Egg", + "Xenochimera", + "Xenomorph", + "Chocolate", + "Boney", + "Slime glob", + "Chicken", + "Synthetic", + "Cooking error", + "Escape pod", + "Web cocoon", + "Bug cocoon", + "Rock", + "Yellow", + "Blue", + "Green", + "Orange", + "Purple", + "Red", + "Rainbow", + "Spotted pink") var/global/list/tf_vore_egg_types = list( - "Unathi" = /obj/structure/closet/secure_closet/egg/unathi, - "Tajara" = /obj/structure/closet/secure_closet/egg/tajaran, - "Akula" = /obj/structure/closet/secure_closet/egg/shark, - "Skrell" = /obj/structure/closet/secure_closet/egg/skrell, - "Sergal" = /obj/structure/closet/secure_closet/egg/sergal, - "Nevrean" = /obj/structure/closet/secure_closet/egg/nevrean, - "Human" = /obj/structure/closet/secure_closet/egg/human, - "Slime" = /obj/structure/closet/secure_closet/egg/slime, - "Egg" = /obj/structure/closet/secure_closet/egg, - "Xenochimera" = /obj/structure/closet/secure_closet/egg/scree, - "Xenomorph" = /obj/structure/closet/secure_closet/egg/xenomorph) + "Unathi" = /obj/item/weapon/storage/vore_egg/unathi, + "Tajara" = /obj/item/weapon/storage/vore_egg/tajaran, + "Akula" = /obj/item/weapon/storage/vore_egg/shark, + "Skrell" = /obj/item/weapon/storage/vore_egg/skrell, + "Sergal" = /obj/item/weapon/storage/vore_egg/sergal, + "Nevrean" = /obj/item/weapon/storage/vore_egg/nevrean, + "Human" = /obj/item/weapon/storage/vore_egg/human, + "Slime" = /obj/item/weapon/storage/vore_egg/slime, + "Egg" = /obj/item/weapon/storage/vore_egg, + "Xenochimera" = /obj/item/weapon/storage/vore_egg/scree, + "Xenomorph" = /obj/item/weapon/storage/vore_egg/xenomorph, + "Chocolate" = /obj/item/weapon/storage/vore_egg/chocolate, + "Boney" = /obj/item/weapon/storage/vore_egg/owlpellet, + "Slime glob" = /obj/item/weapon/storage/vore_egg/slimeglob, + "Chicken" = /obj/item/weapon/storage/vore_egg/chicken, + "Synthetic" = /obj/item/weapon/storage/vore_egg/synthetic, + "Cooking error" = /obj/item/weapon/storage/vore_egg/badrecipe, + "Escape pod" = /obj/item/weapon/storage/vore_egg/escapepod, + "Web cocoon" = /obj/item/weapon/storage/vore_egg/cocoon, + "Bug cocoon" = /obj/item/weapon/storage/vore_egg/bugcocoon, + "Rock" = /obj/item/weapon/storage/vore_egg/rock, + "Yellow" = /obj/item/weapon/storage/vore_egg/yellow, + "Blue" = /obj/item/weapon/storage/vore_egg/blue, + "Green" = /obj/item/weapon/storage/vore_egg/green, + "Orange" = /obj/item/weapon/storage/vore_egg/orange, + "Purple" = /obj/item/weapon/storage/vore_egg/purple, + "Red" = /obj/item/weapon/storage/vore_egg/red, + "Rainbow" = /obj/item/weapon/storage/vore_egg/rainbow, + "Spotted pink" = /obj/item/weapon/storage/vore_egg/pinkspots) var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars, @@ -181,7 +218,8 @@ var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/fancy/crayons, /obj/item/weapon/storage/fancy/egg_box, - /obj/item/weapon/storage/wallet) + /obj/item/weapon/storage/wallet, + /obj/item/weapon/storage/vore_egg) var/global/list/contamination_flavors = list( "Generic" = contamination_flavors_generic, diff --git a/code/datums/outfits/jobs/special_vr.dm b/code/datums/outfits/jobs/special_vr.dm index 89c4883e92..010010291d 100644 --- a/code/datums/outfits/jobs/special_vr.dm +++ b/code/datums/outfits/jobs/special_vr.dm @@ -15,11 +15,14 @@ shoes = /obj/item/clothing/shoes/boots/swat gloves = /obj/item/clothing/gloves/swat l_ear = /obj/item/device/radio/headset/ert - belt = /obj/item/weapon/gun/energy/gun glasses = /obj/item/clothing/glasses/sunglasses back = /obj/item/weapon/storage/backpack/satchel id_type = /obj/item/weapon/card/id/centcom/ERT pda_type = /obj/item/device/pda/centcom + + post_equip(var/mob/living/carbon/human/H) + ..() + ert.add_antagonist(H.mind) /decl/hierarchy/outfit/job/clown name = OUTFIT_JOB_NAME("Clown") diff --git a/code/datums/uplink/ammunition_vr.dm b/code/datums/uplink/ammunition_vr.dm index 3235bb7311..18235e5343 100644 --- a/code/datums/uplink/ammunition_vr.dm +++ b/code/datums/uplink/ammunition_vr.dm @@ -18,3 +18,5 @@ name = "Void cell" path = /obj/item/weapon/cell/device/weapon/recharge/alien/hybrid item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5 + antag_roles = list("ert") + blacklisted = 1 diff --git a/code/datums/uplink/backup.dm b/code/datums/uplink/backup.dm index 40f2a468f6..3e21676da3 100644 --- a/code/datums/uplink/backup.dm +++ b/code/datums/uplink/backup.dm @@ -11,7 +11,7 @@ This type comes with a directional shield projector, a supressive fire energy weapon, \ a stunbaton, handcuffs, an agent ID, energy sword, pinpointer, and a jetpack." item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5 - antag_roles = list("mercenary") + antag_roles = list("mercenary", "ert") //VOREStation Edit path = /obj/item/weapon/antag_spawner/syndicate_drone/protector /datum/uplink_item/item/backup/syndicate_drone_combat_medic @@ -21,7 +21,7 @@ a powerful hypospray that can create many potent chemicals, an agent ID, energy \ sword, pinpointer, and a jetpack." item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5 - antag_roles = list("mercenary") + antag_roles = list("mercenary", "ert") //VOREStation Edit path = /obj/item/weapon/antag_spawner/syndicate_drone/combat_medic /datum/uplink_item/item/backup/syndicate_drone_mechanist @@ -31,5 +31,5 @@ a cryptographic sequencer, an AI detector, the ability to analyze and repair full-body prosthetics, \ a set of construction materials, an ionic rapier, an agent ID, energy sword, pinpointer, and a jetpack." item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 1.5 - antag_roles = list("mercenary") + antag_roles = list("mercenary", "ert") //VOREStation Edit path = /obj/item/weapon/antag_spawner/syndicate_drone/mechanist \ No newline at end of file diff --git a/code/datums/uplink/medical_vr.dm b/code/datums/uplink/medical_vr.dm index 8f0264d3e9..5b4a0f31cc 100644 --- a/code/datums/uplink/medical_vr.dm +++ b/code/datums/uplink/medical_vr.dm @@ -100,3 +100,66 @@ name = "Healing Nanite pill bottle" item_cost = 30 path = /obj/item/weapon/storage/pill_bottle/healing_nanites + +/datum/uplink_item/item/medical/vermicetol + name = "Vermicetol Bottle" + item_cost = 30 + path = /obj/item/weapon/reagent_containers/glass/bottle/vermicetol + antag_roles = list("ert") + blacklisted = 1 + +/datum/uplink_item/item/medical/dermaline + name = "Dermaline Bottle" + item_cost = 30 + path = /obj/item/weapon/reagent_containers/glass/bottle/dermaline + antag_roles = list("ert") + blacklisted = 1 + +/datum/uplink_item/item/medical/carthatoline + name = "Carthatoline Bottle" + item_cost = 30 + path = /obj/item/weapon/reagent_containers/glass/bottle/carthatoline + antag_roles = list("ert") + blacklisted = 1 + +/datum/uplink_item/item/medical/dexalinp + name = "Dexalin Plus Bottle" + item_cost = 30 + path = /obj/item/weapon/reagent_containers/glass/bottle/dexalinp + antag_roles = list("ert") + blacklisted = 1 + +/datum/uplink_item/item/medical/tramadol + name = "Tramadol Bottle" + item_cost = 30 + path = /obj/item/weapon/reagent_containers/glass/bottle/tramadol + antag_roles = list("ert") + blacklisted = 1 + +/datum/uplink_item/item/medical/arithrazine + name = "Arithrazine Bottle" + item_cost = 50 + path = /obj/item/weapon/reagent_containers/glass/bottle/arithrazine + antag_roles = list("ert") + blacklisted = 1 + +/datum/uplink_item/item/medical/corophizine + name = "Corophizine Bottle" + item_cost = 50 + path = /obj/item/weapon/reagent_containers/glass/bottle/corophizine + antag_roles = list("ert") + blacklisted = 1 + +/datum/uplink_item/item/medical/rezadone + name = "Rezadone Bottle" + item_cost = 50 + path = /obj/item/weapon/reagent_containers/glass/bottle/rezadone + antag_roles = list("ert") + blacklisted = 1 + +/datum/uplink_item/item/medical/defib + name = "Combat Defibrilator" + item_cost = 90 + path = /obj/item/device/defib_kit/compact/combat + antag_roles = list("mercenary", "ert") + blacklisted = 1 diff --git a/code/datums/uplink/tools_vr.dm b/code/datums/uplink/tools_vr.dm index 30b2cd725e..871bfbb5ad 100644 --- a/code/datums/uplink/tools_vr.dm +++ b/code/datums/uplink/tools_vr.dm @@ -26,6 +26,11 @@ item_cost = 5 path = /obj/item/device/survivalcapsule +/datum/uplink_item/item/tools/popcabin + name = "Cabin Capsule" + item_cost = 5 + path = /obj/item/device/survivalcapsule/popcabin + /datum/uplink_item/item/tools/nanopaste name = "Nanopaste (Advanced)" item_cost = 10 @@ -41,6 +46,16 @@ item_cost = 15 path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced +/datum/uplink_item/item/tools/metal + name = "Metal (50 sheets)" + item_cost = 15 + path = /obj/fiftyspawner/steel + +/datum/uplink_item/item/tools/glass + name = "Glass (50 sheets)" + item_cost = 15 + path = /obj/fiftyspawner/glass + /datum/uplink_item/item/tools/elitelaptop name = "Laptop (Advanced)" item_cost = 20 diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm index d3ed1dcec3..b939e953de 100644 --- a/code/datums/uplink/visible_weapons.dm +++ b/code/datums/uplink/visible_weapons.dm @@ -103,7 +103,7 @@ name = "Anti-Materiel Rifle (14.5mm)" item_cost = DEFAULT_TELECRYSTAL_AMOUNT path = /obj/item/weapon/gun/projectile/heavysniper - antag_roles = list("mercenary") + antag_roles = list("mercenary", "ert") //VOREStation Edit /datum/uplink_item/item/visible_weapons/heavysnipertraitor name = "Anti-Materiel Rifle (14.5mm)" diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index bd5ca6f964..d8523d2b45 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -168,9 +168,9 @@ if(reas) reason = reas if("duration") - var/dur = input("Duration (in minutes) during which pass is valid (up to 120 minutes).", "Duration") as num|null + var/dur = input("Duration (in minutes) during which pass is valid (up to 360 minutes).", "Duration") as num|null //VOREStation Edit if(dur) - if(dur > 0 && dur <= 120) + if(dur > 0 && dur <= 360) //VOREStation Edit duration = dur else to_chat(usr, "Invalid duration.") diff --git a/code/game/machinery/syndicatebeacon_vr.dm b/code/game/machinery/syndicatebeacon_vr.dm index ef6b3da0bb..668b36dcb7 100644 --- a/code/game/machinery/syndicatebeacon_vr.dm +++ b/code/game/machinery/syndicatebeacon_vr.dm @@ -25,7 +25,7 @@ updateUsrDialog() return var/mob/M = locate(href_list["traitormob"]) - if(M.mind.special_role || jobban_isbanned(M, "Syndicate")) + if(M.mind.tcrystals > 0 || jobban_isbanned(M, "Syndicate")) temptext = "We have no need for you at this time. Have a pleasant day.
" updateUsrDialog() return @@ -33,7 +33,9 @@ if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/N = M to_chat(N, "Access granted, here are the supplies!") - traitors.equip(N) + traitors.spawn_uplink(N) + N.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT + N.mind.accept_tcrystals = 1 message_admins("[N]/([N.ckey]) has recieved an uplink and telecrystals from the syndicate beacon.") updateUsrDialog() diff --git a/code/game/mecha/combat/durand.dm b/code/game/mecha/combat/durand.dm index aa5a9e000c..19bd2b9c53 100644 --- a/code/game/mecha/combat/durand.dm +++ b/code/game/mecha/combat/durand.dm @@ -33,6 +33,9 @@ defence_mode_possible = 1 + icon_scale_x = 1.5 + icon_scale_y = 1.5 + /* /obj/mecha/combat/durand/New() ..() diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 0323124c47..1f9d4a0b6e 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -31,6 +31,9 @@ overload_possible = 1 + icon_scale_x = 1.35 + icon_scale_y = 1.35 + //Not quite sure how to move those yet. /obj/mecha/combat/gygax/get_commands() var/output = {"
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm index e2c0b9467a..fd0442a294 100644 --- a/code/game/mecha/combat/marauder.dm +++ b/code/game/mecha/combat/marauder.dm @@ -44,6 +44,9 @@ /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster ) + icon_scale_x = 1.5 + icon_scale_y = 1.5 + /obj/mecha/combat/marauder/seraph desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel." name = "Seraph" diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index bec2b1a6c3..c716b1f33e 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -49,6 +49,9 @@ ..() return +/obj/item/mecha_parts/mecha_equipment/proc/add_equip_overlay(obj/mecha/M as obj) + return + /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() if(chassis) send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) diff --git a/code/game/mecha/equipment/tools/repair_droid.dm b/code/game/mecha/equipment/tools/repair_droid.dm index 7cd8ebd9ab..acae64142f 100644 --- a/code/game/mecha/equipment/tools/repair_droid.dm +++ b/code/game/mecha/equipment/tools/repair_droid.dm @@ -26,9 +26,10 @@ pr_repair_droid = null ..() -/obj/item/mecha_parts/mecha_equipment/repair_droid/attach(obj/mecha/M as obj) +/obj/item/mecha_parts/mecha_equipment/repair_droid/add_equip_overlay(obj/mecha/M as obj) ..() - droid_overlay = new(src.icon, icon_state = "repair_droid") + if(!droid_overlay) + droid_overlay = new(src.icon, icon_state = "repair_droid") M.add_overlay(droid_overlay) return diff --git a/code/game/mecha/equipment/tools/shield.dm b/code/game/mecha/equipment/tools/shield.dm index ce0c43e7da..0a50869e88 100644 --- a/code/game/mecha/equipment/tools/shield.dm +++ b/code/game/mecha/equipment/tools/shield.dm @@ -37,15 +37,19 @@ my_shield = null ..() +/obj/item/mecha_parts/mecha_equipment/combat_shield/add_equip_overlay(obj/mecha/M as obj) + ..() + if(!drone_overlay) + drone_overlay = new(src.icon, icon_state = "shield_droid") + M.overlays += drone_overlay + return + /obj/item/mecha_parts/mecha_equipment/combat_shield/attach(obj/mecha/M as obj) ..() if(chassis) my_shield.shield_health = 0 my_shield.my_mecha = chassis my_shield.forceMove(chassis) - - drone_overlay = new(src.icon, icon_state = "shield_droid") - M.overlays += drone_overlay return /obj/item/mecha_parts/mecha_equipment/combat_shield/detach() diff --git a/code/game/mecha/equipment/tools/syringe_gun.dm b/code/game/mecha/equipment/tools/syringe_gun.dm index 7449d80c0f..1658a01df6 100644 --- a/code/game/mecha/equipment/tools/syringe_gun.dm +++ b/code/game/mecha/equipment/tools/syringe_gun.dm @@ -467,11 +467,15 @@ if(enabled) set_ready_state(0) log_message("Activated.") - chassis.overlays += drone_overlay else set_ready_state(1) log_message("Deactivated.") - chassis.overlays -= drone_overlay + +/obj/item/mecha_parts/mecha_equipment/crisis_drone/add_equip_overlay(obj/mecha/M as obj) + ..() + if(enabled) + M.add_overlay(drone_overlay) + return /obj/item/mecha_parts/mecha_equipment/crisis_drone/Topic(href, href_list) ..() diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 548bb0fbe9..2e68ca068d 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -208,6 +208,7 @@ for(var/path in starting_equipment) var/obj/item/mecha_parts/mecha_equipment/ME = new path(src) ME.attach(src) + update_transform() /obj/mecha/drain_power(var/drain_check) @@ -1576,11 +1577,12 @@ src.verbs += /obj/mecha/verb/eject src.Entered(mmi_as_oc) src.Move(src.loc) - src.icon_state = src.reset_icon() + update_icon() set_dir(dir_in) src.log_message("[mmi_as_oc] moved in as pilot.") if(!hasInternalDamage()) src.occupant << sound('sound/mecha/nominal.ogg',volume=50) + update_icon() return 1 else return 0 @@ -1883,7 +1885,7 @@ src.forceMove(src.loc) src.verbs += /obj/mecha/verb/eject src.log_append_to_last("[H] moved in as pilot.") - src.icon_state = src.reset_icon() + update_icon() //VOREStation Edit Add if(occupant.hud_used) minihud = new (occupant.hud_used, src) @@ -2003,7 +2005,7 @@ occupant.clear_alert("mech damage") occupant.in_enclosed_vehicle = 0 occupant = null - icon_state = src.reset_icon()+"-open" + update_icon() set_dir(dir_in) verbs -= /obj/mecha/verb/eject @@ -2663,13 +2665,6 @@ return 1 return 0 -/obj/mecha/proc/reset_icon() - if (initial_icon) - icon_state = initial_icon - else - icon_state = initial(icon_state) - return icon_state - //This is for mobs mostly. /obj/mecha/attack_generic(var/mob/user, var/damage, var/attack_message) diff --git a/code/game/mecha/mecha_appearance.dm b/code/game/mecha/mecha_appearance.dm new file mode 100644 index 0000000000..5136ef070b --- /dev/null +++ b/code/game/mecha/mecha_appearance.dm @@ -0,0 +1,65 @@ + + +/obj/mecha + // Show the pilot. + var/show_pilot = FALSE + + // The state of the 'face', or the thing that overlays on the pilot. If this isn't set, it will probably look really weird. + var/face_state = null + var/icon/face_overlay + + var/icon/pilot_image + + // How many pixels do we bump the pilot upward? + var/pilot_lift = 0 + +/obj/mecha/update_transform() + // Now for the regular stuff. + var/matrix/M = matrix() + M.Scale(icon_scale_x, icon_scale_y) + M.Translate(0, 16*(icon_scale_y-1)) + animate(src, transform = M, time = 10) + return + +/obj/mecha/update_icon() + if(!initial_icon) + initial_icon = initial(icon_state) + + if(occupant) + icon_state = initial_icon + else + icon_state = "[initial_icon]-open" + + cut_overlays() + + if(show_pilot) + if(occupant) + pilot_image = getCompoundIcon(occupant) + + if(!istype(occupant, /mob/living/carbon/brain)) + + var/icon/Cutter + + if("[initial_icon]_cutter" in icon_states(icon)) + Cutter = new(src.icon, "[initial_icon]_cutter") + + if(Cutter) + pilot_image.Blend(Cutter, ICON_MULTIPLY, y = (-1 * pilot_lift)) + + var/image/Pilot = image(pilot_image) + + Pilot.pixel_y = pilot_lift + + add_overlay(Pilot) + else + pilot_image = null + + if(face_state && !face_overlay) + face_overlay = new(src.icon, icon_state = face_state) + + if(face_overlay) + add_overlay(face_overlay) + + for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) + ME.add_equip_overlay(src) + return diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index dbba0cd251..4db6332cb1 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -17,6 +17,9 @@ step_energy_drain = 6 var/obj/item/clothing/glasses/hud/health/mech/hud + icon_scale_x = 1.2 + icon_scale_y = 1.2 + /obj/mecha/medical/odysseus/New() ..() hud = new /obj/item/clothing/glasses/hud/health/mech(src) diff --git a/code/game/mecha/working/ripley.dm b/code/game/mecha/working/ripley.dm index aff19e301d..def044c9bb 100644 --- a/code/game/mecha/working/ripley.dm +++ b/code/game/mecha/working/ripley.dm @@ -24,6 +24,9 @@ /obj/item/mecha_parts/component/electrical ) + icon_scale_x = 1.2 + icon_scale_y = 1.2 + /obj/mecha/working/ripley/Destroy() for(var/atom/movable/A in src.cargo) A.loc = loc @@ -92,6 +95,20 @@ for(var/obj/item/mecha_parts/mecha_tracking/B in src.contents)//Deletes the beacon so it can't be found easily qdel (B) +/obj/mecha/working/ripley/antique + name = "APLU \"Geiger\"" + desc = "You can't beat the classics." + icon_state = "ripley-old" + initial_icon = "ripley-old" + + show_pilot = TRUE + pilot_lift = 5 + + max_utility_equip = 1 + max_universal_equip = 3 + + icon_scale_x = 1 + icon_scale_y = 1 //Vorestation Edit Start diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm index 223c9a2018..45430a41c9 100644 --- a/code/game/objects/items/paintkit.dm +++ b/code/game/objects/items/paintkit.dm @@ -241,7 +241,7 @@ M.initial_icon = new_icon if(new_icon_file) M.icon = new_icon_file - M.reset_icon() + M.update_icon() use(1, user) /obj/mecha/attackby(var/obj/item/weapon/W, var/mob/user) diff --git a/code/game/objects/items/robot/robot_upgrades_vr.dm b/code/game/objects/items/robot/robot_upgrades_vr.dm index ad2556f810..b31f737e78 100644 --- a/code/game/objects/items/robot/robot_upgrades_vr.dm +++ b/code/game/objects/items/robot/robot_upgrades_vr.dm @@ -31,8 +31,8 @@ return 1 /obj/item/borg/upgrade/bellysizeupgrade - name = "robotic Hound process capacity upgrade Module" - desc = "Used to upgrade a hound belly capacity. This only affects total volume and such, you won't be able to support more than one patient. Usable once." + name = "robohound capacity expansion module" + desc = "Used to double a robohound's belly capacity. This only affects total volume, and won't allow support of more than one patient in case of sleeper bellies. Can only be applied once." icon_state = "cyborg_upgrade2" item_state = "cyborg_upgrade" require_module = 1 diff --git a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm index 098926f535..e9d5f6a2a5 100644 --- a/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm +++ b/code/game/objects/items/stacks/tiles/fifty_spawner_tiles.dm @@ -8,6 +8,10 @@ name = "stack of sifgrass" type_to_spawn = /obj/item/stack/tile/grass/sif +/obj/fiftyspawner/grass/sif/forest + name = "stack of sifgrass" + type_to_spawn = /obj/item/stack/tile/grass/sif/forest + /obj/fiftyspawner/wood name = "stack of wood" type_to_spawn = /obj/item/stack/tile/wood diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index bf50db2188..d5b4f2ebcd 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -47,6 +47,11 @@ singular_name = "sivian grass floor tile" desc = "A patch of grass like those that decorate the plains of Sif." +/obj/item/stack/tile/grass/sif/forest + name = "sivian overgrowth tile" + singular_name = "sivian overgrowth floor tile" + desc = "A patch of dark overgrowth like those that decorate the plains of Sif." + /* * Wood */ diff --git a/code/game/objects/items/weapons/storage/egg_vr.dm b/code/game/objects/items/weapons/storage/egg_vr.dm new file mode 100644 index 0000000000..0ea3b673e1 --- /dev/null +++ b/code/game/objects/items/weapons/storage/egg_vr.dm @@ -0,0 +1,182 @@ +//Item type vorepanel egg release containers. + +/obj/item/weapon/storage/vore_egg + name = "egg" + desc = "It's an egg; it's smooth to the touch." //This is the default egg. + icon = 'icons/obj/egg_new_vr.dmi' + icon_state = "egg" + var/open_egg_icon = 'icons/obj/egg_open_vr.dmi' + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_storage.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_storage.dmi', + ) + w_class = 2 + max_w_class = 0 + show_messages = 0 + allow_quick_empty = TRUE + use_sound = 'sound/items/drop/flesh.ogg' + +/obj/item/weapon/storage/vore_egg/open(mob/user as mob) + icon = open_egg_icon + ..() + +/obj/item/weapon/storage/vore_egg/proc/hatch(mob/living/user as mob) + visible_message("\The [src] begins to shake as something pushes out from within!") + animate_shake() + if(do_after(user, 50)) + if(use_sound) + playsound(src, src.use_sound, 50, 0, -5) + animate_shake() + drop_contents() + icon = open_egg_icon + +/obj/item/weapon/storage/vore_egg/proc/animate_shake() + var/init_px = pixel_x + var/shake_dir = pick(-1, 1) + animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1) + animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING) + +/obj/item/weapon/storage/vore_egg/unathi + name = "unathi egg" + desc = "Some species of Unathi apparently lay soft-shelled eggs!" + icon_state = "egg_unathi" + +/obj/item/weapon/storage/vore_egg/nevrean + name = "nevrean egg" + desc = "Most Nevreans lay hard-shelled eggs!" + icon_state = "egg_nevrean" + +/obj/item/weapon/storage/vore_egg/human + name = "human egg" + desc = "Some humans lay eggs that are--wait, what?" + icon_state = "egg_human" + +/obj/item/weapon/storage/vore_egg/tajaran + name = "tajaran egg" + desc = "Apparently that's what a Tajaran egg looks like. Weird." + icon_state = "egg_tajaran" + +/obj/item/weapon/storage/vore_egg/skrell + name = "skrell egg" + desc = "Its soft and squishy" + icon_state = "egg_skrell" + +/obj/item/weapon/storage/vore_egg/shark + name = "akula egg" + desc = "Its soft and slimy to the touch" + icon_state = "egg_akula" + +/obj/item/weapon/storage/vore_egg/sergal + name = "sergal egg" + desc = "An egg with a slightly fuzzy exterior, and a hard layer beneath." + icon_state = "egg_sergal" + +/obj/item/weapon/storage/vore_egg/slime + name = "slime egg" + desc = "An egg with a soft and squishy interior, coated with slime." + icon_state = "egg_slime" + +/obj/item/weapon/storage/vore_egg/special //Not actually used, but the sprites are in, and it's there in case any admins need to spawn in the egg for any specific reasons. + name = "special egg" + desc = "This egg has a very unique look to it." + icon_state = "egg_unique" + +/obj/item/weapon/storage/vore_egg/scree + name = "Chimera egg" + desc = "...You don't know what type of creature laid this egg." + icon_state = "egg_scree" + +/obj/item/weapon/storage/vore_egg/xenomorph + name = "Xenomorph egg" + desc = "Some type of pitch black egg. It has a slimy exterior coating." + icon_state = "egg_xenomorph" + +/obj/item/weapon/storage/vore_egg/chocolate + name = "chocolate egg" + desc = "Delicious. May contain a choking hazard." + icon_state = "egg_chocolate" + +/obj/item/weapon/storage/vore_egg/owlpellet + name = "boney egg" + desc = "Can an egg shell be made of bones and hair?" + icon_state = "egg_pellet" + +/obj/item/weapon/storage/vore_egg/slimeglob + name = "glob of slime" + desc = "Very squishy." + icon_state = "egg_slimeglob" + +/obj/item/weapon/storage/vore_egg/chicken + name = "chicken egg" + desc = "Looks like chickens come in all sizes and shapes." + icon_state = "egg_chicken" + +/obj/item/weapon/storage/vore_egg/synthetic + name = "synthetic egg" + desc = "Can robots lay eggs?" + icon_state = "egg_synthetic" + +/obj/item/weapon/storage/vore_egg/badrecipe + name = "Burned mess" + desc = "Someone didn't cook this egg quite right..." + icon_state = "egg_badrecipe" + +/obj/item/weapon/storage/vore_egg/escapepod + name = "small escape pod" + desc = "Someone left in a hurry." + icon_state = "egg_escapepod" + +/obj/item/weapon/storage/vore_egg/cocoon + name = "web cocoon" + desc = "It straight up smells like spiders in here." + icon_state = "egg_cocoon" + +/obj/item/weapon/storage/vore_egg/bugcocoon + name = "bug cocoon" + desc = "Metamorphosis!" + icon_state = "egg_bugcocoon" + +/obj/item/weapon/storage/vore_egg/rock + name = "rock egg" + desc = "It looks like a small boulder." + icon_state = "egg_rock" + +/obj/item/weapon/storage/vore_egg/yellow + name = "yellow egg" + desc = "It is a nice yellow egg." + icon_state = "egg_yellow" + +/obj/item/weapon/storage/vore_egg/blue + name = "blue egg" + desc = "It is a nice blue egg." + icon_state = "egg_blue" + +/obj/item/weapon/storage/vore_egg/green + name = "green egg" + desc = "It is a nice green egg." + icon_state = "egg_green" + +/obj/item/weapon/storage/vore_egg/orange + name = "orange egg" + desc = "It is a nice orange egg." + icon_state = "egg_orange" + +/obj/item/weapon/storage/vore_egg/purple + name = "purple egg" + desc = "It is a nice purple egg." + icon_state = "egg_purple" + +/obj/item/weapon/storage/vore_egg/red + name = "red egg" + desc = "It is a nice red egg." + icon_state = "egg_red" + +/obj/item/weapon/storage/vore_egg/rainbow + name = "rainbow egg" + desc = "It looks so colorful." + icon_state = "egg_rainbow" + +/obj/item/weapon/storage/vore_egg/pinkspots + name = "spotted pink egg" + desc = "It is a cute pink egg with white spots." + icon_state = "egg_pinkspots" diff --git a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm index ba0809f638..dabc8fd88b 100644 --- a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm @@ -36,11 +36,11 @@ icon_opened = "egg_unathi_open" /obj/structure/closet/secure_closet/egg/nevrean - name = "nevarean egg" - desc = "Most Nevareans lay hard-shelled eggs!" - icon_state = "egg_nevarean" - icon_closed = "egg_nevarean" - icon_opened = "egg_nevarean_open" + name = "nevrean egg" + desc = "Most Nevreans lay hard-shelled eggs!" + icon_state = "egg_nevrean" + icon_closed = "egg_nevrean" + icon_opened = "egg_nevrean_open" /obj/structure/closet/secure_closet/egg/human name = "human egg" diff --git a/code/game/objects/structures/ghost_pods/event_vr.dm b/code/game/objects/structures/ghost_pods/event_vr.dm new file mode 100644 index 0000000000..c724b9bd80 --- /dev/null +++ b/code/game/objects/structures/ghost_pods/event_vr.dm @@ -0,0 +1,101 @@ +/obj/structure/ghost_pod/ghost_activated/maintpred + name = "maintenance hole" + desc = "Looks like some creature dug its way into station's maintenance..." + icon = 'icons/effects/effects.dmi' + icon_state = "tunnel_hole" + icon_state_opened = "tunnel_hole" + density = FALSE + ghost_query_type = /datum/ghost_query/maints_pred + anchored = TRUE + invisibility = INVISIBILITY_OBSERVER + spawn_active = TRUE + var/announce_prob = 35 + var/list/possible_mobs = list("Space Bumblebee" = /mob/living/simple_mob/vore/bee, + "Voracious Lizard" = /mob/living/simple_mob/vore/aggressive/dino, + "Giant Frog" = /mob/living/simple_mob/vore/aggressive/frog, + "Giant Rat" = /mob/living/simple_mob/vore/aggressive/rat, + "Juvenile Solargrub" = /mob/living/simple_mob/vore/solargrub, + "Red Panda" = /mob/living/simple_mob/vore/redpanda, + "Fennec" = /mob/living/simple_mob/vore/fennec, + "Fennix" = /mob/living/simple_mob/vore/fennix, + "Jelly Blob" = /mob/living/simple_mob/animal/space/jelly, + "Wolf" = /mob/living/simple_mob/animal/wolf, + "Sect Queen" = /mob/living/simple_mob/vore/sect_queen, + "Defanged Xenomorph" = /mob/living/simple_mob/vore/xeno_defanged, + ) + +/obj/structure/ghost_pod/ghost_activated/maintpred/create_occupant(var/mob/M) + ..() + var/choice + var/randomize + var/finalized = "No" + + while(finalized == "No" && M.client) + choice = input(M,"What type of predator do you want to play as?") as null|anything in possible_mobs + if(!choice) + randomize = TRUE + break + + if(choice) + finalized = alert(M, "Are you sure you want to play as [choice]?","Confirmation","No","Yes") + + if(randomize) + choice = pick(possible_mobs) + + var/mobtype = possible_mobs[choice] + var/mob/living/simple_mob/newPred = new mobtype(get_turf(src)) + qdel(newPred.ai_holder) + newPred.ai_holder = null + //newPred.movement_cooldown = 0 // The "needless artificial speed cap" exists for a reason + if(M.mind) + M.mind.transfer_to(newPred) + to_chat(M, "You are [newPred], somehow having gotten aboard the station in search of food. \ + You are wary of environment around you, but you do feel rather peckish. Stick around dark, secluded places to avoid danger or, \ + if you are cute enough, try to make friends with this place's inhabitants.") + newPred.ckey = M.ckey + newPred.visible_message("[newPred] emerges from somewhere!") + + if(prob(announce_prob)) + spawn(2 MINUTES) + command_announcement.Announce("Unexpected biosignature detected in the maintenance tunnels of [station_name()].", "Lifesign Alert") + + qdel(src) + +/obj/structure/ghost_pod/ghost_activated/maintpred/no_announce + announce_prob = 0 + +/obj/structure/ghost_pod/ghost_activated/morphspawn + name = "weird goo" + desc = "A pile of weird gunk... Wait, is it actually moving?" + icon = 'icons/mob/animal_vr.dmi' + icon_state = "morph" + icon_state_opened = "morph_dead" + density = FALSE + ghost_query_type = /datum/ghost_query/morph + anchored = TRUE + invisibility = INVISIBILITY_OBSERVER + spawn_active = TRUE + var/announce_prob = 50 + +/obj/structure/ghost_pod/ghost_activated/morphspawn/create_occupant(var/mob/M) + ..() + var/mob/living/simple_mob/vore/hostile/morph/newMorph = new /mob/living/simple_mob/vore/hostile/morph(get_turf(src)) + if(M.mind) + M.mind.transfer_to(newMorph) + to_chat(M, "You are a Morph, somehow having gotten aboard the station in your wandering. \ + You are wary of environment around you, but your primal hunger still calls for you to find prey. Seek a convincing disguise, \ + using your amorphous form to traverse vents to find and consume weak prey.") + to_chat(M, "You can use shift + click on objects to disguise yourself as them, but your strikes are nearly useless when you are disguised. \ + You can undisguise yourself by shift + clicking yourself, but disguise being switched, or turned on and off has a short cooldown. You can also ventcrawl, \ + by using alt + click on the vent or scrubber.") + newMorph.ckey = M.ckey + newMorph.visible_message("A morph appears to crawl out of somewhere.") + + if(prob(announce_prob)) + spawn(2 MINUTES) + command_announcement.Announce("Unexpected biosignature detected in the maintenance tunnels of [station_name()].", "Lifesign Alert") + + qdel(src) + +/obj/structure/ghost_pod/ghost_activated/morphspawn/no_announce + announce_prob = 0 \ No newline at end of file diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm index 12cfe24dc2..386d493d2d 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm @@ -36,6 +36,10 @@ // Override this to create whatever mob you need. Be sure to call ..() if you don't want it to make infinite mobs. /obj/structure/ghost_pod/proc/create_occupant(var/mob/M) used = TRUE + //VOREStation Addition Start + if(src in active_ghost_pods) + active_ghost_pods -= src + //VOREStation Addition End return TRUE @@ -52,6 +56,7 @@ // VOREStation Addition Start if(!used) activated = TRUE + ghostpod_startup(FALSE) // VOREStation Addition End /obj/structure/ghost_pod/manual/attack_ai(var/mob/living/silicon/user) diff --git a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm index 9eedbb453c..2d8f8198c5 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm @@ -1,3 +1,11 @@ +/obj/structure/ghost_pod/Destroy() + if(src in active_ghost_pods) + active_ghost_pods -= src + ..() + +/obj/structure/ghost_pod + var/spawn_active = FALSE + /obj/structure/ghost_pod/manual var/remains_active = FALSE var/activated = FALSE @@ -28,4 +36,14 @@ busy = FALSE - create_occupant(user) \ No newline at end of file + create_occupant(user) + +/obj/structure/ghost_pod/proc/ghostpod_startup(var/notify = FALSE) + if(!(src in active_ghost_pods)) + active_ghost_pods += src + if(notify) + trigger() + +/obj/structure/ghost_pod/ghost_activated/Initialize() + ..() + ghostpod_startup(spawn_active) \ No newline at end of file diff --git a/code/game/objects/structures/watercloset_vr.dm b/code/game/objects/structures/watercloset_vr.dm new file mode 100644 index 0000000000..7e8790fbcc --- /dev/null +++ b/code/game/objects/structures/watercloset_vr.dm @@ -0,0 +1,41 @@ +//Flushable toilets on station levels. Flushing sends stuff directly to a trashpit landmark without stinking up the cargo office. +//Only on-station toilets are affected and only if the trashpit landmark also exists. Otherwise toilets will stay normal. + +/obj/structure/toilet + var/teleplumbed = FALSE + var/exit_landmark + +/obj/structure/toilet/Initialize() + if(z in global.using_map.map_levels) + teleplumbed = TRUE + exit_landmark = locate(/obj/effect/landmark/teleplumb_exit) + if(teleplumbed && exit_landmark) + desc = "The BS-500, a bluespace rift-rotation-based waste disposal unit for small matter. This one seems remarkably clean." + return ..() + +/obj/structure/toilet/attack_hand(mob/living/user as mob) + if(open && teleplumbed && exit_landmark) + var/list/bowl_contents = list() + for(var/obj/item/I in loc.contents) + if(istype(I) && !I.anchored) + bowl_contents += I + if(bowl_contents.len) + user.visible_message("[user] flushes the toilet.", "You flush the toilet.") + playsound(src, 'sound/vore/death7.ogg', 50, 1) //Got lazy about getting new sound files. Have a sick remix lmao. + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + playsound(src, 'sound/mecha/powerup.ogg', 30, 1) + for(var/obj/item/F in bowl_contents) + F.forceMove(get_turf(exit_landmark)) + bowl_contents -= F + return + return ..() + +/obj/structure/toilet/attack_ai(mob/user as mob) + if(isrobot(user)) + if(user.client && user.client.eye == user) + return attack_hand(user) + else + return attack_hand(user) + +/obj/effect/landmark/teleplumb_exit + name = "teleplumbing exit" diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm index 08133f1b72..31d39aa47d 100644 --- a/code/game/turfs/flooring/flooring.dm +++ b/code/game/turfs/flooring/flooring.dm @@ -148,6 +148,15 @@ var/list/flooring_types icon_base = "grass_sif" build_type = /obj/item/stack/tile/grass/sif has_base_range = 1 + +/decl/flooring/grass/sif/forest + name = "thick growth" + desc = "A natural moss that has adapted to the sheer cold climate." + flags = TURF_REMOVE_SHOVEL + icon = 'icons/turf/outdoors.dmi' + icon_base = "grass_sif_dark" + build_type = /obj/item/stack/tile/grass/sif/forest + has_base_range = 1 /decl/flooring/water name = "water" diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm index 09784b21a3..65d0e472f1 100644 --- a/code/game/turfs/simulated/outdoors/grass.dm +++ b/code/game/turfs/simulated/outdoors/grass.dm @@ -86,6 +86,7 @@ var/list/grass_types = list( /turf/simulated/floor/outdoors/grass/sif/forest name = "thick growth" icon_state = "grass_sif_dark0" + initial_flooring = /decl/flooring/grass/sif/forest edge_blending_priority = 5 tree_chance = 10 grass_chance = 1 diff --git a/code/modules/admin/admin_verb_lists.dm b/code/modules/admin/admin_verb_lists.dm index b3b5b9a3cc..5fba4a679a 100644 --- a/code/modules/admin/admin_verb_lists.dm +++ b/code/modules/admin/admin_verb_lists.dm @@ -104,7 +104,6 @@ var/list/admin_verbs_admin = list( /client/proc/toggle_attack_logs, /datum/admins/proc/paralyze_mob, /client/proc/fixatmos, - /datum/admins/proc/quick_nif, //VOREStation Add, /datum/admins/proc/sendFax, /client/proc/despawn_player, /datum/admins/proc/view_feedback, @@ -140,7 +139,6 @@ var/list/admin_verbs_fun = list( /datum/admins/proc/call_supply_drop, /datum/admins/proc/call_drop_pod, /client/proc/smite, - /client/proc/smite_vr, //VOREStation Add, /client/proc/admin_lightning_strike, ) @@ -151,7 +149,6 @@ var/list/admin_verbs_spawn = list( /datum/admins/proc/spawn_plant, /datum/admins/proc/spawn_atom, //allows us to spawn instances, /client/proc/respawn_character, - /client/proc/spawn_character_mob, //VOREStation Add, /client/proc/virus2_editor, /client/proc/spawn_chemdisp_cartridge, /client/proc/map_template_load, @@ -182,6 +179,7 @@ var/list/admin_verbs_server = list( /datum/admins/proc/toggle_space_ninja, /client/proc/toggle_random_events, /client/proc/check_customitem_activity, + /client/proc/nanomapgen_DumpImage, /client/proc/modify_server_news, /client/proc/recipe_dump, /client/proc/panicbunker, @@ -229,7 +227,7 @@ var/list/admin_verbs_debug = list( /client/proc/toggle_debug_logs, /client/proc/admin_ghost, //allows us to ghost/reenter body at will, /datum/admins/proc/view_runtimes, - // /client/proc/show_gm_status, // VOREStation Edit - We don't use SSgame_master yet. + /client/proc/show_gm_status, /datum/admins/proc/change_weather, /datum/admins/proc/change_time, /client/proc/admin_give_modifier, @@ -404,7 +402,7 @@ var/list/admin_verbs_event_manager = list( /client/proc/callproc, /client/proc/callproc_datum, /client/proc/debug_controller, - // /client/proc/show_gm_status, // VOREStation Edit - We don't use SSgame_master yet. + /client/proc/show_gm_status, /datum/admins/proc/change_weather, /datum/admins/proc/change_time, /client/proc/admin_give_modifier, diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm new file mode 100644 index 0000000000..b024211d2c --- /dev/null +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -0,0 +1,575 @@ +//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless +var/list/admin_verbs_default = list( +// /datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, //VOREStation Remove, +// /client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Remove, +// /client/proc/player_panel, //VOREStation Remove, + /client/proc/deadmin_self, //destroys our own admin datum so we can play as a regular player, + /client/proc/cmd_admin_say, //VOREStation Add, + /client/proc/cmd_mod_say, //VOREStation Add, + /client/proc/cmd_event_say, //VOREStation Add, +// /client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Remove, +// /client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Remove, +// /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Remove, +// /client/proc/mark_datum_mapview, //VOREStation Remove, +// /client/proc/cmd_check_new_players, //allows us to see every new player, //VOREStation Remove, +// /client/proc/check_antagonists, //shows all antags, +// /client/proc/cmd_mod_say, +// /client/proc/deadchat //toggles deadchat on/off, +// /client/proc/toggle_ahelp_sound, + ) + +var/list/admin_verbs_admin = list( + /datum/admins/proc/set_tcrystals, + /datum/admins/proc/add_tcrystals, + /client/proc/invisimin, //allows our mob to go invisible/visible, + /datum/admins/proc/show_traitor_panel, //interface which shows a mob's mind., + /datum/admins/proc/show_game_mode, //Configuration window for the current game mode., + /datum/admins/proc/force_mode_latespawn, //Force the mode to try a latespawn proc, + /datum/admins/proc/force_antag_latespawn, //Force a specific template to try a latespawn proc, + /datum/admins/proc/toggleenter, //toggles whether people can join the current game, + /datum/admins/proc/toggleguests, //toggles whether guests can join the current game, + /datum/admins/proc/announce, //priority announce something to all clients., + /datum/admins/proc/intercom, //send a fake intercom message, like an arrivals announcement, + /datum/admins/proc/intercom_convo, //send a fake intercom conversation, like an ATC exchange, + /client/proc/colorooc, //allows us to set a custom colour for everythign we say in ooc, + /client/proc/admin_ghost, //allows us to ghost/reenter body at will, + /datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, //VOREStation Add, + /client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Add, + /client/proc/player_panel, //VOREStation Add, + /client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Add, + /client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Add, + /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Add, + /client/proc/mark_datum_mapview, //VOREStation Add, + /client/proc/cmd_check_new_players, //allows us to see every new player, //VOREStation Add, + /client/proc/toggle_view_range, //changes how far we can see, + /datum/admins/proc/view_txt_log, //shows the server log (diary) for today, + /datum/admins/proc/view_atk_log, //shows the server combat-log, doesn't do anything presently, + /client/proc/cmd_admin_pm_context, //right-click adminPM interface, + /client/proc/cmd_admin_pm_panel, //admin-pm list, + /client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head', + /client/proc/cmd_admin_delete, //delete an instance/object/mob/etc, + /client/proc/cmd_admin_check_contents, //displays the contents of an instance, + /client/proc/cmd_admin_check_player_logs, //checks a player's attack logs, + /client/proc/cmd_admin_check_dialogue_logs, //checks a player's dialogue logs, + /datum/admins/proc/access_news_network, //allows access of newscasters, + /client/proc/giveruntimelog, //allows us to give access to runtime logs to somebody, + /client/proc/getserverlog, //allows us to fetch server logs (diary) for other days, + /client/proc/jumptocoord, //we ghost and jump to a coordinate, + /client/proc/Getmob, //teleports a mob to our location, + /client/proc/Getkey, //teleports a mob with a certain ckey to our location, +// /client/proc/sendmob, //sends a mob somewhere, -Removed due to it needing two sorting procs to work, which were executed every time an admin right-clicked. ~Errorage, + /client/proc/Jump, + /client/proc/jumptokey, //allows us to jump to the location of a mob with a certain ckey, + /client/proc/jumptomob, //allows us to jump to a specific mob, + /client/proc/jumptoturf, //allows us to jump to a specific turf, + /client/proc/admin_call_shuttle, //allows us to call the emergency shuttle, + /client/proc/admin_cancel_shuttle, //allows us to cancel the emergency shuttle, sending it back to CentCom, + /client/proc/cmd_admin_direct_narrate, //send text directly to a player with no padding. Useful for narratives and fluff-text, + /client/proc/cmd_admin_world_narrate, //sends text to all players with no padding, + /client/proc/cmd_admin_z_narrate, //VOREStation Add, + /client/proc/cmd_admin_create_centcom_report, + /client/proc/check_words, //displays cult-words, + /client/proc/check_ai_laws, //shows AI and borg laws, + /client/proc/rename_silicon, //properly renames silicons, + /client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. , + /client/proc/check_antagonists, + /client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others, + /client/proc/dsay, //talk in deadchat using our ckey/fakekey, +// /client/proc/toggle_hear_deadcast, //toggles whether we hear deadchat, + /client/proc/investigate_show, //various admintools for investigation. Such as a singulo grief-log, + /client/proc/secrets, + /datum/admins/proc/toggleooc, //toggles ooc on/off for everyone, + /datum/admins/proc/togglelooc, //toggles looc on/off for everyone, + /datum/admins/proc/toggleoocdead, //toggles ooc on/off for everyone who is dead, + /datum/admins/proc/togglehubvisibility, //toggles visibility on the BYOND Hub., + /datum/admins/proc/toggledsay, //toggles dsay on/off for everyone, + /client/proc/game_panel, //game panel, allows to change game-mode etc, + /client/proc/cmd_admin_say, //admin-only ooc chat, + /client/proc/cmd_mod_say, + /client/proc/cmd_event_say, + /datum/admins/proc/PlayerNotes, + /datum/admins/proc/show_player_info, + /client/proc/free_slot, //frees slot for chosen job, + /client/proc/cmd_admin_change_custom_event, + /client/proc/cmd_admin_rejuvenate, + /client/proc/toggleghostwriters, + /client/proc/toggledrones, + /datum/admins/proc/show_skills, + /client/proc/check_customitem_activity, + /client/proc/man_up, + /client/proc/global_man_up, + /client/proc/response_team, // Response Teams admin verb, + /client/proc/trader_ship, // Trader ship admin verb, + /client/proc/toggle_antagHUD_use, + /client/proc/toggle_antagHUD_restrictions, + /client/proc/allow_character_respawn, // Allows a ghost to respawn , + /client/proc/event_manager_panel, + /client/proc/empty_ai_core_toggle_latejoin, + /client/proc/empty_ai_core_toggle_latejoin, + /client/proc/aooc, + /client/proc/change_human_appearance_admin, // Allows an admin to change the basic appearance of human-based mobs , + /client/proc/change_human_appearance_self, // Allows the human-based mob itself change its basic appearance , + /client/proc/change_security_level, + /client/proc/view_chemical_reaction_logs, + /client/proc/makePAI, + /client/proc/toggle_debug_logs, + /client/proc/toggle_attack_logs, + /datum/admins/proc/paralyze_mob, + /client/proc/fixatmos, + /datum/admins/proc/quick_nif, //VOREStation Add, + /datum/admins/proc/set_uplink, //VOREStation Add, + /datum/admins/proc/sendFax, + /client/proc/despawn_player, + /datum/admins/proc/view_feedback + ) + +var/list/admin_verbs_ban = list( + /client/proc/unban_panel, + /client/proc/jobbans + ) + +var/list/admin_verbs_sounds = list( + /client/proc/play_local_sound, + /client/proc/play_sound, + /client/proc/play_server_sound + ) + +var/list/admin_verbs_fun = list( + /client/proc/object_talk, + /datum/admins/proc/cmd_admin_dress, + /client/proc/cmd_admin_gib_self, + /client/proc/drop_bomb, + /client/proc/everyone_random, + /client/proc/cinematic, + /datum/admins/proc/toggle_aliens, + /datum/admins/proc/toggle_space_ninja, + /client/proc/cmd_admin_add_freeform_ai_law, + /client/proc/cmd_admin_add_random_ai_law, + /client/proc/make_sound, + /client/proc/toggle_random_events, + /client/proc/editappear, + /client/proc/roll_dices, + /datum/admins/proc/call_supply_drop, + /datum/admins/proc/call_drop_pod, + /client/proc/smite, + /client/proc/smite_vr, //VOREStation Add, + /client/proc/admin_lightning_strike, + ) + +var/list/admin_verbs_spawn = list( + /datum/admins/proc/spawn_fruit, + /datum/admins/proc/spawn_custom_item, + /datum/admins/proc/check_custom_items, + /datum/admins/proc/spawn_plant, + /datum/admins/proc/spawn_atom, //allows us to spawn instances, + /client/proc/respawn_character, + /client/proc/spawn_character_mob, //VOREStation Add, + /client/proc/virus2_editor, + /client/proc/spawn_chemdisp_cartridge, + /client/proc/map_template_load, + /client/proc/map_template_upload, + /client/proc/map_template_load_on_new_z + ) + +var/list/admin_verbs_server = list( + /datum/admins/proc/capture_map, + /client/proc/Set_Holiday, + /client/proc/ToRban, + /datum/admins/proc/startnow, + /datum/admins/proc/restart, + /datum/admins/proc/delay, + /datum/admins/proc/toggleaban, + /datum/admins/proc/togglepersistence, + /client/proc/cmd_mod_say, + /client/proc/toggle_log_hrefs, + /datum/admins/proc/immreboot, + /client/proc/everyone_random, + /datum/admins/proc/toggleAI, + /client/proc/cmd_admin_delete, //delete an instance/object/mob/etc, + /client/proc/cmd_debug_del_all, + /datum/admins/proc/adrev, + /datum/admins/proc/adspawn, + /datum/admins/proc/adjump, + /datum/admins/proc/toggle_aliens, + /datum/admins/proc/toggle_space_ninja, + /client/proc/toggle_random_events, + /client/proc/check_customitem_activity, + /client/proc/modify_server_news, + /client/proc/recipe_dump, + /client/proc/panicbunker, + /client/proc/paranoia_logging, + /client/proc/ip_reputation + ) + +var/list/admin_verbs_debug = list( + /client/proc/getruntimelog, //allows us to access runtime logs to somebody, + /client/proc/cmd_admin_list_open_jobs, + /client/proc/Debug2, + /client/proc/kill_air, + /client/proc/ZASSettings, + /client/proc/cmd_debug_make_powernets, + /client/proc/kill_airgroup, + /client/proc/debug_controller, + /client/proc/debug_antagonist_template, + /client/proc/cmd_debug_mob_lists, + /client/proc/cmd_debug_using_map, + /client/proc/cmd_admin_delete, + /client/proc/cmd_debug_del_all, + /client/proc/cmd_debug_tog_aliens, + /client/proc/cmd_display_del_log, + /client/proc/cmd_display_init_log, + /client/proc/cmd_display_overlay_log, + /client/proc/air_report, + /client/proc/reload_admins, + /client/proc/reload_eventMs, + /client/proc/restart_controller, + /datum/admins/proc/restart, + /client/proc/print_random_map, + /client/proc/create_random_map, + /client/proc/apply_random_map, + /client/proc/overlay_random_map, + /client/proc/delete_random_map, + /client/proc/show_plant_genes, + /client/proc/enable_debug_verbs, + /client/proc/callproc, + /client/proc/callproc_datum, + /client/proc/SDQL2_query, + /client/proc/Jump, + /client/proc/jumptomob, + /client/proc/jumptocoord, + /client/proc/dsay, + /client/proc/toggle_debug_logs, + /client/proc/admin_ghost, //allows us to ghost/reenter body at will, + /datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, //VOREStation Add, + /client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Add, + /client/proc/player_panel, //VOREStation Add, + /client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Add, + /client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Add, + /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Add, + /client/proc/mark_datum_mapview, //VOREStation Add, + /client/proc/cmd_check_new_players, //allows us to see every new player, //VOREStation Add, + /datum/admins/proc/view_runtimes, + // /client/proc/show_gm_status, // VOREStation Edit - We don't use SSgame_master yet. + /datum/admins/proc/set_uplink, //VOREStation Add, + /datum/admins/proc/change_weather, + /datum/admins/proc/change_time, + /client/proc/admin_give_modifier, + /client/proc/simple_DPS, + /datum/admins/proc/view_feedback + ) + +var/list/admin_verbs_paranoid_debug = list( + /client/proc/callproc, + /client/proc/callproc_datum, + /client/proc/debug_controller + ) + +var/list/admin_verbs_possess = list( + /proc/possess, + /proc/release + ) +var/list/admin_verbs_permissions = list( + /client/proc/edit_admin_permissions + ) +var/list/admin_verbs_rejuv = list( + /client/proc/respawn_character + ) + +//verbs which can be hidden - needs work +var/list/admin_verbs_hideable = list( + /client/proc/deadmin_self, +// /client/proc/deadchat, + /datum/admins/proc/show_traitor_panel, + /datum/admins/proc/toggleenter, + /datum/admins/proc/toggleguests, + /datum/admins/proc/announce, + /client/proc/colorooc, + /client/proc/admin_ghost, + /client/proc/toggle_view_range, + /datum/admins/proc/view_txt_log, + /datum/admins/proc/view_atk_log, + /client/proc/cmd_admin_subtle_message, + /client/proc/cmd_admin_check_contents, + /client/proc/cmd_admin_check_player_logs, + /client/proc/cmd_admin_check_dialogue_logs, + /datum/admins/proc/access_news_network, + /client/proc/admin_call_shuttle, + /client/proc/admin_cancel_shuttle, + /client/proc/cmd_admin_direct_narrate, + /client/proc/cmd_admin_world_narrate, + /client/proc/cmd_admin_z_narrate, //VOREStation Add, + /client/proc/check_words, + /client/proc/play_local_sound, + /client/proc/play_sound, + /client/proc/play_server_sound, + /client/proc/object_talk, + /datum/admins/proc/cmd_admin_dress, + /client/proc/cmd_admin_gib_self, + /client/proc/drop_bomb, + /client/proc/cinematic, + /datum/admins/proc/toggle_aliens, + /datum/admins/proc/toggle_space_ninja, + /client/proc/cmd_admin_add_freeform_ai_law, + /client/proc/cmd_admin_add_random_ai_law, + /client/proc/cmd_admin_create_centcom_report, + /client/proc/make_sound, + /client/proc/toggle_random_events, + /client/proc/cmd_admin_add_random_ai_law, + /client/proc/Set_Holiday, + /client/proc/ToRban, + /datum/admins/proc/startnow, + /datum/admins/proc/restart, + /datum/admins/proc/delay, + /datum/admins/proc/toggleaban, + /client/proc/toggle_log_hrefs, + /datum/admins/proc/immreboot, + /client/proc/everyone_random, + /datum/admins/proc/toggleAI, + /datum/admins/proc/adrev, + /datum/admins/proc/adspawn, + /datum/admins/proc/adjump, + /client/proc/restart_controller, + /client/proc/cmd_admin_list_open_jobs, + /client/proc/callproc, + /client/proc/callproc_datum, + /client/proc/Debug2, + /client/proc/reload_admins, + /client/proc/kill_air, + /client/proc/cmd_debug_make_powernets, + /client/proc/kill_airgroup, + /client/proc/debug_controller, + /client/proc/startSinglo, + /client/proc/simple_DPS, + /client/proc/cmd_debug_mob_lists, + /client/proc/cmd_debug_using_map, + /client/proc/cmd_debug_del_all, + /client/proc/cmd_debug_tog_aliens, + /client/proc/cmd_display_del_log, + /client/proc/air_report, + /client/proc/enable_debug_verbs, + /client/proc/roll_dices, + /proc/possess, + /proc/release, + /datum/admins/proc/set_uplink, //VOREStation Add, + /datum/admins/proc/set_tcrystals + ) +var/list/admin_verbs_mod = list( + /client/proc/cmd_admin_pm_context, //right-click adminPM interface, + /client/proc/cmd_admin_pm_panel, //admin-pm list, + /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game., + /datum/admins/proc/PlayerNotes, + /client/proc/admin_ghost, //allows us to ghost/reenter body at will, + /datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, //VOREStation Add, + /client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Add, + /client/proc/player_panel, //VOREStation Add, + /client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Add, + /client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Add, + /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Add, + /client/proc/mark_datum_mapview, //VOREStation Add, + /client/proc/cmd_check_new_players, //allows us to see every new player, //VOREStation Add, + /client/proc/cmd_mod_say, + /client/proc/cmd_event_say, + /datum/admins/proc/show_player_info, + /datum/admins/proc/show_traitor_panel, + /client/proc/colorooc, + /client/proc/player_panel_new, + /client/proc/dsay, + /datum/admins/proc/show_skills, + /datum/admins/proc/show_player_panel, + /client/proc/check_antagonists, + /client/proc/aooc, + /client/proc/jobbans, + /client/proc/toggle_attack_logs, + /client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head', + /datum/admins/proc/paralyze_mob, + /client/proc/cmd_admin_direct_narrate, + /client/proc/cmd_admin_z_narrate, //VOREStation Add, + /client/proc/allow_character_respawn, // Allows a ghost to respawn , + /datum/admins/proc/sendFax, + /client/proc/getserverlog, //allows us to fetch server logs (diary) for other days, + /datum/admins/proc/view_persistent_data, + /datum/admins/proc/view_txt_log, //shows the server log (diary) for today, + /datum/admins/proc/view_atk_log //shows the server combat-log, doesn't do anything presently, +) + +var/list/admin_verbs_event_manager = list( + /client/proc/cmd_event_say, + /client/proc/cmd_admin_pm_context, + /client/proc/cmd_admin_pm_panel, + /client/proc/admin_ghost, + /datum/admins/proc/show_player_panel, //shows an interface for individual players, with various links (links require additional flags, //VOREStation Add, + /client/proc/player_panel_new, //shows an interface for all players, with links to various panels, //VOREStation Add, + /client/proc/player_panel, //VOREStation Add, + /client/proc/hide_verbs, //hides all our adminverbs, //VOREStation Add, + /client/proc/hide_most_verbs, //hides all our hideable adminverbs, //VOREStation Add, + /client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify, //VOREStation Add, + /client/proc/mark_datum_mapview, //VOREStation Add, + /client/proc/cmd_check_new_players, //allows us to see every new player, //VOREStation Add, + /datum/admins/proc/show_player_info, + /client/proc/dsay, + /client/proc/cmd_admin_subtle_message, + /client/proc/debug_variables, + /client/proc/check_antagonists, + /client/proc/aooc, + /datum/admins/proc/paralyze_mob, + /client/proc/cmd_admin_direct_narrate, + /client/proc/cmd_admin_z_narrate, //VOREStation Add, + /client/proc/allow_character_respawn, + /datum/admins/proc/sendFax, + /client/proc/respawn_character, + /proc/possess, + /proc/release, + /datum/admins/proc/change_weather, + /datum/admins/proc/change_time, + /client/proc/admin_give_modifier, + /client/proc/Jump, + /client/proc/jumptomob, + /client/proc/jumptocoord, + /client/proc/cmd_admin_delete, + /datum/admins/proc/delay, + /client/proc/Set_Holiday, + /client/proc/make_sound, + /client/proc/toggle_random_events, + /datum/admins/proc/cmd_admin_dress, + /client/proc/cmd_admin_gib_self, + /client/proc/drop_bomb, + /client/proc/cmd_admin_add_freeform_ai_law, + /client/proc/cmd_admin_add_random_ai_law, + /client/proc/make_sound, + /client/proc/toggle_random_events, + /client/proc/editappear, + /client/proc/roll_dices, + /datum/admins/proc/call_supply_drop, + /datum/admins/proc/call_drop_pod, + /datum/admins/proc/PlayerNotes, + /client/proc/callproc, + /client/proc/callproc_datum, + /client/proc/debug_controller, + // /client/proc/show_gm_status, // VOREStation Edit - We don't use SSgame_master yet. + /datum/admins/proc/change_weather, + /datum/admins/proc/change_time, + /client/proc/admin_give_modifier, + /datum/admins/proc/cmd_admin_dress, + /client/proc/cmd_admin_gib_self, + /datum/admins/proc/set_tcrystals, + /datum/admins/proc/add_tcrystals, + /client/proc/invisimin, //allows our mob to go invisible/visible, + /datum/admins/proc/show_traitor_panel, //interface which shows a mob's mind., + /datum/admins/proc/show_game_mode, //Configuration window for the current game mode., + /datum/admins/proc/force_mode_latespawn, //Force the mode to try a latespawn proc, + /datum/admins/proc/force_antag_latespawn, //Force a specific template to try a latespawn proc, + /datum/admins/proc/announce, //priority announce something to all clients., + /datum/admins/proc/intercom, //send a fake intercom message, like an arrivals announcement, + /datum/admins/proc/intercom_convo, //send a fake intercom conversation, like an ATC exchange, + /client/proc/colorooc, //allows us to set a custom colour for everythign we say in ooc, + /client/proc/admin_ghost, //allows us to ghost/reenter body at will, + /client/proc/toggle_view_range, //changes how far we can see, + /client/proc/cmd_admin_pm_context, //right-click adminPM interface, + /client/proc/cmd_admin_pm_panel, //admin-pm list, + /client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head', + /client/proc/cmd_admin_delete, //delete an instance/object/mob/etc, + /client/proc/cmd_admin_check_contents, //displays the contents of an instance, + /client/proc/cmd_admin_check_player_logs, //checks a player's attack logs, + /client/proc/cmd_admin_check_dialogue_logs, //checks a player's dialogue logs, + /datum/admins/proc/access_news_network, //allows access of newscasters, + /client/proc/jumptocoord, //we ghost and jump to a coordinate, + /client/proc/Getmob, //teleports a mob to our location, + /client/proc/Getkey, //teleports a mob with a certain ckey to our location, + /client/proc/Jump, + /client/proc/jumptokey, //allows us to jump to the location of a mob with a certain ckey, + /client/proc/jumptomob, //allows us to jump to a specific mob, + /client/proc/jumptoturf, //allows us to jump to a specific turf, + /client/proc/admin_call_shuttle, //allows us to call the emergency shuttle, + /client/proc/admin_cancel_shuttle, //allows us to cancel the emergency shuttle, sending it back to CentCom, + /client/proc/cmd_admin_direct_narrate, //send text directly to a player with no padding. Useful for narratives and fluff-text, + /client/proc/cmd_admin_world_narrate, //sends text to all players with no padding, + /client/proc/cmd_admin_z_narrate, //VOREStation Add, + /client/proc/cmd_admin_create_centcom_report, + /client/proc/check_words, //displays cult-words, + /client/proc/check_ai_laws, //shows AI and borg laws, + /client/proc/rename_silicon, //properly renames silicons, + /client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. , + /client/proc/check_antagonists, + /client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others, + /client/proc/dsay, //talk in deadchat using our ckey/fakekey, + /client/proc/secrets, + /client/proc/game_panel, //game panel, allows to change game-mode etc, + /client/proc/cmd_mod_say, + /client/proc/cmd_event_say, + /datum/admins/proc/show_player_info, + /client/proc/free_slot, //frees slot for chosen job, + /client/proc/cmd_admin_change_custom_event, + /client/proc/cmd_admin_rejuvenate, + /client/proc/toggleghostwriters, + /datum/admins/proc/show_skills, + /client/proc/man_up, + /client/proc/global_man_up, + /client/proc/response_team, // Response Teams admin verb, + /client/proc/trader_ship, // Trader ship admin verb, + /client/proc/allow_character_respawn, // Allows a ghost to respawn , + /client/proc/event_manager_panel, + /client/proc/aooc, + /client/proc/change_human_appearance_admin, // Allows an admin to change the basic appearance of human-based mobs , + /client/proc/change_human_appearance_self, // Allows the human-based mob itself change its basic appearance , + /client/proc/change_security_level, + /client/proc/makePAI, + /client/proc/toggle_debug_logs, + /client/proc/toggle_attack_logs, + /datum/admins/proc/paralyze_mob, + /client/proc/fixatmos, + /datum/admins/proc/sendFax, + /client/proc/despawn_player, + /datum/admins/proc/view_feedback, + /datum/admins/proc/capture_map, + /client/proc/Set_Holiday, + /datum/admins/proc/startnow, + /datum/admins/proc/restart, + /datum/admins/proc/delay, + /client/proc/cmd_mod_say, + /datum/admins/proc/immreboot, + /client/proc/everyone_random, + /client/proc/cmd_admin_delete, //delete an instance/object/mob/etc, + /client/proc/cmd_debug_del_all, + /client/proc/toggle_random_events, + /client/proc/modify_server_news + +) + +/client/proc/add_admin_verbs() + if(holder) + verbs += admin_verbs_default + if(holder.rights & R_BUILDMODE) verbs += /client/proc/togglebuildmodeself + if(holder.rights & R_ADMIN) verbs += admin_verbs_admin + if(holder.rights & R_BAN) verbs += admin_verbs_ban + if(holder.rights & R_FUN) verbs += admin_verbs_fun + if(holder.rights & R_SERVER) verbs += admin_verbs_server + if(holder.rights & R_DEBUG) + verbs += admin_verbs_debug + if(config.debugparanoid && !(holder.rights & R_ADMIN)) + verbs.Remove(admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on. + if(holder.rights & R_POSSESS) verbs += admin_verbs_possess + if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions + if(holder.rights & R_STEALTH) verbs += /client/proc/stealth + if(holder.rights & R_REJUVINATE) verbs += admin_verbs_rejuv + if(holder.rights & R_SOUNDS) verbs += admin_verbs_sounds + if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn + if(holder.rights & R_MOD) verbs += admin_verbs_mod + if(holder.rights & R_EVENT) verbs += admin_verbs_event_manager + +/client/proc/remove_admin_verbs() + verbs.Remove( + admin_verbs_default, + /client/proc/togglebuildmodeself, + admin_verbs_admin, + admin_verbs_ban, + admin_verbs_fun, + admin_verbs_server, + admin_verbs_debug, + admin_verbs_possess, + admin_verbs_permissions, + /client/proc/stealth, + admin_verbs_rejuv, + admin_verbs_sounds, + admin_verbs_spawn, + debug_verbs + ) diff --git a/code/modules/admin/admin_vr.dm b/code/modules/admin/admin_vr.dm new file mode 100644 index 0000000000..356d69a376 --- /dev/null +++ b/code/modules/admin/admin_vr.dm @@ -0,0 +1,12 @@ +/datum/admins/proc/set_uplink(mob/living/carbon/human/H as mob) + set category = "Debug" + set name = "Set Uplink" + set desc = "Allows admins to set up an uplink on a character. This will be required for a character to use telecrystals." + set popup_menu = FALSE + + if(check_rights(R_ADMIN|R_DEBUG)) + traitors.spawn_uplink(H) + H.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT + H.mind.accept_tcrystals = 1 + else + to_chat(usr, "You do not have access to this command.") \ No newline at end of file diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index ba75d45317..b9332751b5 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -11,9 +11,9 @@ log_adminsay(msg,src) - //VOREStation Edit Start - Adds R_EVENT + //VOREStation Edit Start - Adds R_STEALTH for(var/client/C in GLOB.admins) - if(check_rights(R_ADMIN|R_EVENT)) + if(check_rights(R_ADMIN|R_STEALTH)) to_chat(C, "" + create_text_tag("admin", "ADMIN:", C) + " [key_name(usr, 1)]([admin_jump_link(mob, src)]): [msg]") //VOREStation Edit End @@ -24,7 +24,7 @@ set name = "Msay" set hidden = 1 - if(!check_rights(R_ADMIN|R_MOD|R_SERVER|R_EVENT)) //VOREStation Edit + if(!check_rights(R_ADMIN|R_MOD|R_SERVER|R_STEALTH)) //VOREStation Edit return msg = sanitize(msg) @@ -47,7 +47,7 @@ set name = "Esay" set hidden = 1 - if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER|R_EVENT)) + if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER|R_STEALTH)) //VOREStation Edit return msg = sanitize(msg) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 2898145795..58e982822b 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -515,6 +515,12 @@ Traitors and the like can also be revived with the previous role mostly intact. if(new_character.mind) new_character.mind.loaded_from_ckey = picked_ckey new_character.mind.loaded_from_slot = picked_slot + + for(var/lang in picked_client.prefs.alternate_languages) + var/datum/language/chosen_language = GLOB.all_languages[lang] + if(chosen_language) + if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs))) + new_character.add_language(lang) //VOREStation Add End //If desired, apply equipment. diff --git a/code/modules/admin/verbs/randomverbs_vr.dm b/code/modules/admin/verbs/randomverbs_vr.dm index dbf38882d9..d4fa30c824 100644 --- a/code/modules/admin/verbs/randomverbs_vr.dm +++ b/code/modules/admin/verbs/randomverbs_vr.dm @@ -71,4 +71,29 @@ feedback_add_details("admin_verb","SCAM") //heh - return new_mob \ No newline at end of file + return new_mob + +/client/proc/cmd_admin_z_narrate() // Allows administrators to fluff events a little easier -- TLE + set category = "Special Verbs" + set name = "Z Narrate" + set desc = "Narrates to your Z level." + + if (!holder) + return + + var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text + if(!(msg[1] == "<" && msg[length(msg)] == ">")) //You can use HTML but only if the whole thing is HTML. Tries to prevent admin 'accidents'. + msg = sanitize(msg) + + if (!msg) + return + + var/pos_z = get_z(src.mob) + if (!pos_z) + return + for(var/mob/M in player_list) + if(M.z == pos_z) + to_chat(M, msg) + log_admin("ZNarrate: [key_name(usr)] : [msg]") + message_admins(" ZNarrate: [key_name_admin(usr)] : [msg]
", 1) + feedback_add_details("admin_verb","GLNA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 6467eb6e15..daf964e443 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -133,14 +133,17 @@ obj/machinery/gateway/centerstation/process() M.set_dir(SOUTH) return else - //VOREStation Addition Start: Prevent taurriding abuse + //VOREStation Addition Start: Prevent abuse + if(istype(M, /obj/item/device/uav)) + var/obj/item/device/uav/L = M + L.power_down() if(istype(M, /mob/living)) var/mob/living/L = M if(LAZYLEN(L.buckled_mobs)) var/datum/riding/R = L.riding_datum for(var/rider in L.buckled_mobs) R.force_dismount(rider) - //VOREStation Addition End: Prevent taurriding abuse + //VOREStation Addition End: Prevent abuse var/obj/effect/landmark/dest = pick(awaydestinations) if(dest) M.forceMove(dest.loc) diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm index d9eb426499..09e0fcdc47 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm @@ -27,6 +27,14 @@ ..() gear_tweaks += gear_tweak_free_color_choice +/datum/gear/eyes/thinblindfold + display_name = "blindfold, thin white (recolorable)" + path = /obj/item/clothing/glasses/sunglasses/thinblindfold + +/datum/gear/eyes/thinblindfold/New() + ..() + gear_tweaks += gear_tweak_free_color_choice + /datum/gear/eyes/glasses display_name = "Glasses, prescription" path = /obj/item/clothing/glasses/regular diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index 6d23cd00c3..136c6194ac 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -88,9 +88,9 @@ ckeywhitelist = list("arokha") character_name = list("Aronai Sieyes") -/datum/gear/fluff/astraether_ritualknife - path = /obj/item/weapon/material/knife/ritual - display_name = "Astra's Ritual Knife" +/datum/gear/fluff/astra_ritualknife + path = /obj/item/weapon/material/knife/ritual/fluff/astra + display_name = "Polished Ritual Knife" description = "A well kept strange ritual knife, There is a small tag with the name 'Astra Ether' on it. They are probably looking for this." ckeywhitelist = list("astraether") character_name = list("Astra Ether") diff --git a/code/modules/client/preference_setup/vore/03_egg.dm b/code/modules/client/preference_setup/vore/03_egg.dm index 648b31b399..6c090478d5 100644 --- a/code/modules/client/preference_setup/vore/03_egg.dm +++ b/code/modules/client/preference_setup/vore/03_egg.dm @@ -1,15 +1,3 @@ -var/UNATHI_EGG = "Unathi" -var/TAJARAN_EGG = "Tajaran" -var/AKULA_EGG = "Akula" -var/SKRELL_EGG = "Skrell" -var/SERGAL_EGG = "Sergal" -var/HUMAN_EGG = "Human" -var/NEVREAN_EGG = "nevrean" -var/SLIME_EGG = "Slime" -var/EGG_EGG = "Egg" -var/XENOCHIMERA_EGG = "Xenochimera" -var/XENOMORPH_EGG = "Xenomorph" - // Define a place to save appearance in character setup /datum/preferences var/vore_egg_type = "Egg" //The egg type they have. @@ -26,8 +14,7 @@ var/XENOMORPH_EGG = "Xenomorph" S["vore_egg_type"] << pref.vore_egg_type /datum/category_item/player_setup_item/vore/egg/sanitize_character() - var/valid_vore_egg_types = global_vore_egg_types - pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, valid_vore_egg_types, initial(pref.vore_egg_type)) + pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, global_vore_egg_types, initial(pref.vore_egg_type)) /datum/category_item/player_setup_item/vore/egg/copy_to_mob(var/mob/living/carbon/human/character) character.vore_egg_type = pref.vore_egg_type @@ -44,7 +31,7 @@ var/XENOMORPH_EGG = "Xenomorph" var/list/vore_egg_types = global_vore_egg_types var/selection = input(user, "Choose your character's egg type:", "Character Preference", pref.vore_egg_type) as null|anything in vore_egg_types if(selection) - pref.vore_egg_type = vore_egg_types[selection] + pref.vore_egg_type = selection return TOPIC_REFRESH else return diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 9030fc0862..57e7cd66b3 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -397,6 +397,13 @@ BLIND // can't see anything desc = "A white blindfold that covers the eyes, preventing sight." icon_state = "blindfoldwhite" +/obj/item/clothing/glasses/sunglasses/thinblindfold + name = "thin white blindfold" + desc = "A thin blindfold to help protect sensitive eyes while still allowing some sight" + icon_state = "blindfoldwhite" + flash_protection = FLASH_PROTECTION_MODERATE //not as thick, only offers some protection + tint = TINT_HEAVY + /obj/item/clothing/glasses/sunglasses/blindfold/tape name = "length of tape" desc = "It's a robust DIY blindfold!" diff --git a/code/modules/events/maintenance_predator_vr.dm b/code/modules/events/maintenance_predator_vr.dm index 9199f861c3..d316b9fde5 100644 --- a/code/modules/events/maintenance_predator_vr.dm +++ b/code/modules/events/maintenance_predator_vr.dm @@ -1,21 +1,6 @@ /datum/event/maintenance_predator startWhen = 1 - announceWhen = 50 - endWhen = 100 - var/announceProb = 35 - var/list/possible_mobs = list("Space Bumblebee" = /mob/living/simple_mob/vore/bee, - "Voracious Lizard" = /mob/living/simple_mob/vore/aggressive/dino, - "Giant Frog" = /mob/living/simple_mob/vore/aggressive/frog, - "Giant Rat" = /mob/living/simple_mob/vore/aggressive/rat, - "Juvenile Solargrub" = /mob/living/simple_mob/vore/solargrub, - "Red Panda" = /mob/living/simple_mob/vore/redpanda, - "Fennec" = /mob/living/simple_mob/vore/fennec, - "Fennix" = /mob/living/simple_mob/vore/fennix, - "Jelly Blob" = /mob/living/simple_mob/animal/space/jelly, - "Wolf" = /mob/living/simple_mob/animal/wolf, - "Sect Queen" = /mob/living/simple_mob/vore/sect_queen, - "Defanged Xenomorph" = /mob/living/simple_mob/vore/xeno_defanged, - ) + endWhen = 30 /datum/event/maintenance_predator/start() @@ -34,48 +19,8 @@ kill() // To prevent fake announcements return - var/datum/ghost_query/Q = new /datum/ghost_query/maints_pred() - var/list/winner = Q.query() - - if(winner.len) - var/mob/observer/dead/D = winner[1] - var/choice - var/randomize - var/finalized = "No" - - while(finalized == "No" && D.client) - choice = input(D,"What type of predator do you want to play as?") as null|anything in possible_mobs - if(!choice) - randomize = TRUE - break - - if(choice) - finalized = alert(D, "Are you sure you want to play as [choice]?","Confirmation","No","Yes") - - if(randomize) - choice = pick(possible_mobs) - - var/mobtype = possible_mobs[choice] - var/mob/living/simple_mob/newPred = new mobtype(get_turf(spawnspot)) - qdel(newPred.ai_holder) - newPred.ai_holder = null - //newPred.movement_cooldown = 0 // The "needless artificial speed cap" exists for a reason - if(D.mind) - D.mind.transfer_to(newPred) - to_chat(D, "You are [newPred], somehow having gotten aboard the station in search of food. \ - You are wary of environment around you, but you do feel rather peckish. Stick around dark, secluded places to avoid danger or, \ - if you are cute enough, try to make friends with this place's inhabitants.") - newPred.ckey = D.ckey - newPred.visible_message("[newPred] emerges from somewhere!") - else - kill() // To prevent fake announcements - return - - -/datum/event/maintenance_predator/announce() - if(prob(announceProb)) - command_announcement.Announce("Unexpected biosignature detected in the maintenance tunnels of [station_name()].", "Lifesign Alert") + new /obj/structure/ghost_pod/ghost_activated/maintpred(get_turf(spawnspot)) //YW Addition: Adding named landmark for events /obj/effect/landmark/event_spawn/maintpred - name = "maint_pred" + name = "maint_pred" \ No newline at end of file diff --git a/code/modules/events/morph_spawn_vr.dm b/code/modules/events/morph_spawn_vr.dm index 04b3b63898..01c39fec2b 100644 --- a/code/modules/events/morph_spawn_vr.dm +++ b/code/modules/events/morph_spawn_vr.dm @@ -1,8 +1,6 @@ /datum/event/morph_spawn startWhen = 1 - announceWhen = 20 endWhen = 30 - var/announceProb = 50 /datum/event/morph_spawn/start() @@ -21,30 +19,7 @@ kill() // To prevent fake announcements return - var/datum/ghost_query/Q = new /datum/ghost_query/morph() - var/list/winner = Q.query() - - if(winner.len) - var/mob/living/simple_mob/vore/hostile/morph/newMorph = new /mob/living/simple_mob/vore/hostile/morph(get_turf(spawnspot)) - var/mob/observer/dead/D = winner[1] - if(D.mind) - D.mind.transfer_to(newMorph) - to_chat(D, "You are a Morph, somehow having gotten aboard the station in your wandering. \ - You are wary of environment around you, but your primal hunger still calls for you to find prey. Seek a convincing disguise, \ - using your amorphous form to traverse vents to find and consume weak prey.") - to_chat(D, "You can use shift + click on objects to disguise yourself as them, but your strikes are nearly useless when you are disguised. \ - You can undisguise yourself by shift + clicking yourself, but disguise being switched, or turned on and off has a short cooldown. You can also ventcrawl, \ - by using alt + click on the vent or scrubber.") - newMorph.ckey = D.ckey - newMorph.visible_message("A morph appears to crawl out of somewhere.") - else - kill() // To prevent fake announcements - return - - -/datum/event/morph_spawn/announce() - if(prob(announceProb)) - command_announcement.Announce("Unknown entitity detected boarding [station_name()]. Exercise extra caution.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg') + new /obj/structure/ghost_pod/ghost_activated/morphspawn(get_turf(spawnspot)) //YW Addition: Adding named landmark for events /obj/effect/landmark/event_spawn/morphspawn diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 8741182c40..cbe9ff8f77 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -6066,6 +6066,23 @@ reagents.add_reagent("water", 5) bitesize = 6 +/obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup + name = "chicken noodle soup" + gender = PLURAL + desc = "A bright bowl of yellow broth with cuts of meat, noodles and carrots." + icon = 'icons/obj/food_custom.dmi' + icon_state = "chickennoodlesoup" + filling_color = "#ead90c" + nutriment_amt = 6 + nutriment_desc = list("warm soup" = 6) + center_of_mass = list("x"=16, "y"=5) + +/obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup/Initialize() + . = ..() + reagents.add_reagent("protein", 4) + reagents.add_reagent("water", 5) + bitesize = 6 + /obj/item/weapon/reagent_containers/food/snacks/chilicheesefries name = "chili cheese fries" gender = PLURAL @@ -6421,8 +6438,8 @@ reagents.add_reagent("protein", 2) //For meaty things. /obj/item/weapon/reagent_containers/food/snacks/gigapuddi - name = "Giga Puddi" - desc = "A large crème caramel" + name = "Astro-Pudding" + desc = "A crème caramel of astronomical size." icon = 'icons/obj/food.dmi' icon_state = "gigapuddi" trash = /obj/item/trash/plate @@ -6433,17 +6450,17 @@ bitesize = 2 /obj/item/weapon/reagent_containers/food/snacks/gigapuddi/happy - desc = "A large crème caramel made with extra love" + desc = "A crème caramel of astronomical size, made with extra love." icon = 'icons/obj/food.dmi' icon_state = "happypuddi" /obj/item/weapon/reagent_containers/food/snacks/gigapuddi/anger - desc = "A large crème caramel made with extra hate" + desc = "A crème caramel of astronomical size, made with extra hate." icon_state = "angerpuddi" - + /obj/item/weapon/reagent_containers/food/snacks/sliceable/buchedenoel name = "\improper Buche de Noel" - desc = "Merry Christmas" + desc = "Yule love it!" icon = 'icons/obj/food.dmi' icon_state = "buche" slice_path = /obj/item/weapon/reagent_containers/food/snacks/bucheslice @@ -6468,7 +6485,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/turkey name = "turkey" - desc = "Tastes like chicken" + desc = "Tastes like chicken." icon = 'icons/obj/food.dmi' icon_state = "turkey" slice_path = /obj/item/weapon/reagent_containers/food/snacks/turkeyslice @@ -6486,12 +6503,12 @@ /obj/item/weapon/reagent_containers/food/snacks/turkeyslice name = "turkey drumstick" - desc = "Guaranteed vox-free" + desc = "Forsooth!" icon = 'icons/obj/food.dmi' icon_state = "turkey_drumstick" trash = /obj/item/trash/plate bitesize = 2 - + /obj/item/weapon/reagent_containers/food/snacks/sliceable/suppermatter name = "suppermatter" desc = "Extremely dense and powerful food." @@ -6565,7 +6582,7 @@ /obj/item/weapon/reagent_containers/food/snacks/omurice/face icon = 'icons/obj/food.dmi' icon_state = "omuriceface" - + /obj/item/weapon/reagent_containers/food/snacks/cinnamonbun name = "cinnamon bun" desc = "Life needs frosting!" diff --git a/code/modules/food/glass/bottle_vr.dm b/code/modules/food/glass/bottle_vr.dm index fc1595b699..5f918f2f7b 100644 --- a/code/modules/food/glass/bottle_vr.dm +++ b/code/modules/food/glass/bottle_vr.dm @@ -5,6 +5,13 @@ icon_state = "bottle-4" prefill = list("bicaridine" = 60) +/obj/item/weapon/reagent_containers/glass/bottle/vermicetol + name = "vermicetol bottle" + desc = "A small bottle. Vermicetol is an powerful analgesic medication and can be used to treat blunt trauma." + icon = 'icons/obj/chemical.dmi' + icon_state = "bottle-4" + prefill = list("vermicetol" = 60) + /obj/item/weapon/reagent_containers/glass/bottle/keloderm name = "keloderm bottle" desc = "A small bottle. A fifty-fifty mix of the popular burn medications kelotane and deramline." diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index b615932f43..216eb0303c 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -940,6 +940,13 @@ I said no! /obj/item/weapon/reagent_containers/food/snacks/bun ) result = /obj/item/weapon/reagent_containers/food/snacks/chickenfillet + +/datum/recipe/chickennoodlesoup + fruit = list("carrot" = 1) + reagents = list("water" = 10) + items = list( /obj/item/weapon/reagent_containers/food/snacks/spagetti, /obj/item/weapon/reagent_containers/food/snacks/rawcutlet) + reagent_mix = RECIPE_REAGENT_REPLACE //Simplify end product + result = /obj/item/weapon/reagent_containers/food/snacks/chickennoodlesoup /datum/recipe/chickennoodlesoup fruit = list("carrot" = 1) diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm index 2be0c90b80..7abad3ef09 100644 --- a/code/modules/mob/dead/observer/observer_vr.dm +++ b/code/modules/mob/dead/observer/observer_vr.dm @@ -73,4 +73,31 @@ record.last_notification = world.time to_chat(src, "New notification has been sent.") else - to_chat(src, "No mind record found!") \ No newline at end of file + to_chat(src, "No mind record found!") + +/mob/observer/dead/verb/findghostpod() //Moves the ghost instead of just changing the ghosts's eye -Nodrak + set category = "Ghost" + set name = "Find Ghost Pod" + set desc = "Find an active ghost pod" + set popup_menu = FALSE + + if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! + return + + var/input = input(usr, "Select a ghost pod:", "Ghost Jump") as null|anything in observe_list_format(active_ghost_pods) + if(!input) + to_chat(src, "No active ghost pods detected.") + return + + var/target = observe_list_format(active_ghost_pods)[input] + if (!target)//Make sure we actually have a target + return + else + var/obj/O = target //Destination mob + var/turf/T = get_turf(O) //Turf of the destination mob + + if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. + forceMove(T) + stop_following() + else + to_chat(src, "This ghost pod is not located in the game world.") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index fbf1b76b90..785e223f8f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1323,6 +1323,8 @@ if(!O.up) found_welder = 1 if(!found_welder && nif && nif.flag_check(NIF_V_UVFILTER,NIF_FLAGS_VISION)) found_welder = 1 //VOREStation Add - NIF + if(istype(glasses, /obj/item/clothing/glasses/sunglasses/thinblindfold)) + found_welder = 1 if(!found_welder && istype(head, /obj/item/clothing/head/welding)) var/obj/item/clothing/head/welding/O = head if(!O.up) diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index 63158f9cba..db223014b7 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -566,7 +566,7 @@ return var/mob/living/carbon/human/T = G.affecting // I must say, this is a quite ingenious way of doing it. Props to the original coders. - if(!istype(T) || T.isSynthetic()) + if(!istype(T)) to_chat(src, "\The [T] is not able to be fed.") return diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index acaea0e8ca..3190f52679 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -287,6 +287,9 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() if(part.transparent) //VOREStation Edit. For better slime limbs. Avoids using solid var due to limb dropping. icon_key += "_t" //VOREStation Edit. + if(istype(tail_style, /datum/sprite_accessory/tail/taur)) + icon_key += tail_style.clip_mask_state + icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" var/icon/base_icon if(human_icon_cache[icon_key]) @@ -296,10 +299,26 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() var/obj/item/organ/external/chest = get_organ(BP_TORSO) base_icon = chest.get_icon() + var/icon/Cutter = null + + if(istype(tail_style, /datum/sprite_accessory/tail/taur)) // Tail icon 'cookie cutters' are filled in where icons are preserved. We need to invert that. + Cutter = new(icon = tail_style.icon, icon_state = tail_style.clip_mask) + + Cutter.Blend("#000000", ICON_MULTIPLY) // Make it all black. + + Cutter.SwapColor("#00000000", "#FFFFFFFF") // Everywhere empty, make white. + Cutter.SwapColor("#000000FF", "#00000000") // Everywhere black, make empty. + + Cutter.Blend("#000000", ICON_MULTIPLY) // Black again. + for(var/obj/item/organ/external/part in organs) if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. continue var/icon/temp = part.get_icon(skeleton) + + if((part.organ_tag in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) && Cutter) + temp.Blend(Cutter, ICON_AND, x = -16) + //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) if(part.icon_position & (LEFT | RIGHT)) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index 099c9657dd..ca4d387753 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -203,7 +203,8 @@ B.water = water src.modules += B - R.icon = 'icons/mob/widerobot_vr.dmi' + R.icon = 'icons/mob/widerobot_sec_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_sec_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -290,27 +291,8 @@ B.water = water src.modules += B - var/obj/item/stack/medical/advanced/ointment/O = new /obj/item/stack/medical/advanced/ointment(src) - var/obj/item/stack/medical/advanced/bruise_pack/P = new /obj/item/stack/medical/advanced/bruise_pack(src) - var/obj/item/stack/medical/splint/S = new /obj/item/stack/medical/splint(src) - O.uses_charge = 1 - O.charge_costs = list(1000) - O.synths = list(medicine) - P.uses_charge = 1 - P.charge_costs = list(1000) - P.synths = list(medicine) - S.uses_charge = 1 - S.charge_costs = list(1000) - S.synths = list(medicine) - src.modules += O - src.modules += P - src.modules += S - -// End YW Edit - - R.icon = 'icons/mob/widerobot_vr.dmi' - - src.modules += new /obj/item/device/dogborg/pounce_module(src) //Pounce shit test + R.icon = 'icons/mob/widerobot_med_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_med_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -446,7 +428,8 @@ G.recipes += new/datum/stack_recipe("glass sheet", /obj/item/stack/material/glass, 1, 1, 20) src.modules += G - R.icon = 'icons/mob/widerobot_yw.dmi' //YW edit - using yw icon files + R.icon = 'icons/mob/widerobot_jan_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_jan_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -521,7 +504,8 @@ C.synths = list(wire) src.modules += C - R.icon = 'icons/mob/widerobot_vr.dmi' + R.icon = 'icons/mob/widerobot_sci_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_sci_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -667,12 +651,12 @@ var/obj/item/stack/material/cyborg/plastic/PL = new (src) PL.synths = list(plastic) src.modules += PL - //YW changes start, plasteel manipulator var/obj/item/stack/material/cyborg/plasteel/PS = new (src) PS.synths = list(plasteel) src.modules += PS - //YW changes end, plasteel manipulator - R.icon = 'icons/mob/widerobot_vr.dmi' + + R.icon = 'icons/mob/widerobot_eng_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_eng_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -820,7 +804,8 @@ src.modules += B */ - R.icon = 'icons/mob/widerobot_vr.dmi' + R.icon = 'icons/mob/widerobot_ser_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_ser_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 @@ -872,7 +857,8 @@ B.water = water src.modules += B - R.icon = 'icons/mob/widerobot_vr.dmi' + R.icon = 'icons/mob/widerobot_car_vr.dmi' + R.wideborg_dept = 'icons/mob/widerobot_car_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' R.ui_style_vr = TRUE R.pixel_x = -16 diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index a7a36fcc96..f81aee6158 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -15,6 +15,7 @@ var/sitting = FALSE var/bellyup = FALSE does_spin = FALSE + var/wideborg_dept = 'icons/mob/widerobot_vr.dmi' var/vr_icons = list( "handy-hydro", "handy-service", @@ -145,10 +146,10 @@ return if(wideborg == TRUE) if(icontype== "Drake") // Why, Why can't we have normal nice things - icon = 'icons/mob/drakeborg/drakeborg_vr.dmi' - /*YW EDIT else - icon = 'icons/mob/widerobot_vr.dmi' - return*/ + icon = 'icons/mob/drakeborg/drakeborg_vr.dmi' + else + icon = wideborg_dept + return if((!(original_icon == icon)) && (!(icon == 'icons/mob/robots_vr.dmi'))) original_icon = icon if((icon_state in vr_icons) && (icon == 'icons/mob/robots.dmi')) diff --git a/code/modules/overmap/ships/computers/ship_vr.dm b/code/modules/overmap/ships/computers/ship_vr.dm new file mode 100644 index 0000000000..b317eb3c1e --- /dev/null +++ b/code/modules/overmap/ships/computers/ship_vr.dm @@ -0,0 +1,13 @@ +/* +Ships can now be hijacked! +*/ +/obj/machinery/computer/ship + var/hacked = 0 // Has been emagged, no access restrictions. + +/obj/machinery/computer/ship/emag_act(var/remaining_charges, var/mob/user) + if (!hacked) + req_access = list() + req_one_access = list() + hacked = 1 + to_chat(user, "You short out the console's ID checking system. It's now available to everyone!") + return 1 diff --git a/code/modules/planet/virgo3b_vr.dm b/code/modules/planet/virgo3b_vr.dm index 791841aca7..26d33631a1 100644 --- a/code/modules/planet/virgo3b_vr.dm +++ b/code/modules/planet/virgo3b_vr.dm @@ -1,7 +1,7 @@ var/datum/planet/virgo3b/planet_virgo3b = null /datum/time/virgo3b - seconds_in_day = 3 HOURS + seconds_in_day = 6 HOURS /datum/planet/virgo3b name = "Virgo-3B" diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm index 73fe811b9c..eccc55f7a3 100644 --- a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm +++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm @@ -31,7 +31,8 @@ /obj/item/projectile/beam/medical_cell/brute/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustBruteLoss(-5) + if(target.stat != DEAD) + target.adjustBruteLoss(-10) else return 1 @@ -43,7 +44,8 @@ /obj/item/projectile/beam/medical_cell/burn/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustFireLoss(-5) + if(target.stat != DEAD) + target.adjustFireLoss(-10) else return 1 @@ -83,7 +85,8 @@ /obj/item/projectile/beam/medical_cell/toxin/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustToxLoss(-5) + if(target.stat != DEAD) + target.adjustToxLoss(-10) else return 1 @@ -95,10 +98,11 @@ /obj/item/projectile/beam/medical_cell/omni/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustBruteLoss(-2.5) - target.adjustFireLoss(-2.5) - target.adjustToxLoss(-2.5) - target.adjustOxyLoss(-10) + if(target.stat != DEAD) + target.adjustBruteLoss(-5) + target.adjustFireLoss(-5) + target.adjustToxLoss(-5) + target.adjustOxyLoss(-20) else return 1 @@ -110,8 +114,9 @@ /obj/item/projectile/beam/medical_cell/antirad/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustToxLoss(-2.5) - target.radiation = max(target.radiation - 150, 0) //same as 5 units of arithrazine, sans the brute damage + if(target.stat != DEAD) + target.adjustToxLoss(-5) + target.radiation = max(target.radiation - 350, 0) //same as 5 units of arithrazine, sans the brute damage else return 1 @@ -123,7 +128,8 @@ /obj/item/projectile/beam/medical_cell/brute2/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustBruteLoss(-10) + if(target.stat != DEAD) + target.adjustBruteLoss(-20) else return 1 @@ -135,7 +141,8 @@ /obj/item/projectile/beam/medical_cell/burn2/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustFireLoss(-10) + if(target.stat != DEAD) + target.adjustFireLoss(-20) else return 1 @@ -170,10 +177,11 @@ /obj/item/projectile/beam/medical_cell/omni2/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustBruteLoss(-5) - target.adjustFireLoss(-5) - target.adjustToxLoss(-5) - target.adjustOxyLoss(-30) + if(target.stat != DEAD) + target.adjustBruteLoss(-10) + target.adjustFireLoss(-10) + target.adjustToxLoss(-10) + target.adjustOxyLoss(-60) else return 1 @@ -185,7 +193,8 @@ /obj/item/projectile/beam/medical_cell/toxin2/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustToxLoss(-20) + if(target.stat != DEAD) + target.adjustToxLoss(-20) else return 1 @@ -253,7 +262,8 @@ /obj/item/projectile/beam/medical_cell/brute3/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustBruteLoss(-20) + if(target.stat != DEAD) + target.adjustBruteLoss(-40) else return 1 @@ -265,7 +275,8 @@ /obj/item/projectile/beam/medical_cell/burn3/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustFireLoss(-20) + if(target.stat != DEAD) + target.adjustFireLoss(-40) else return 1 @@ -277,7 +288,8 @@ /obj/item/projectile/beam/medical_cell/toxin3/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustToxLoss(-20) + if(target.stat != DEAD) + target.adjustToxLoss(-40) else return 1 @@ -289,10 +301,11 @@ /obj/item/projectile/beam/medical_cell/omni3/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) - target.adjustBruteLoss(-10) - target.adjustFireLoss(-10) - target.adjustToxLoss(-10) - target.adjustOxyLoss(-60) + if(target.stat != DEAD) + target.adjustBruteLoss(-20) + target.adjustFireLoss(-20) + target.adjustToxLoss(-20) + target.adjustOxyLoss(-120) else return 1 @@ -337,4 +350,4 @@ target.show_message("The beam fires into your body, changing your size!") target.updateicon() else - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/research/prosfab_designs_vr.dm b/code/modules/research/prosfab_designs_vr.dm index 094d036c91..b425b3964a 100644 --- a/code/modules/research/prosfab_designs_vr.dm +++ b/code/modules/research/prosfab_designs_vr.dm @@ -8,8 +8,8 @@ build_path = /obj/item/borg/upgrade/sizeshift /datum/design/item/prosfab/robot_upgrade/bellysizeupgrade - name = "Size Alteration Module" + name = "Robohound Capacity Expansion Module" id = "borg_hound_capacity_module" - req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2) materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) build_path = /obj/item/borg/upgrade/bellysizeupgrade \ No newline at end of file diff --git a/code/modules/shieldgen/energy_shield.dm b/code/modules/shieldgen/energy_shield.dm index d6218eac8f..6170768252 100644 --- a/code/modules/shieldgen/energy_shield.dm +++ b/code/modules/shieldgen/energy_shield.dm @@ -4,7 +4,7 @@ /obj/effect/shield name = "energy shield" desc = "An impenetrable field of energy, capable of blocking anything as long as it's active." - icon = 'icons/obj/machines/shielding.dmi' + icon = 'icons/obj/machines/shielding_vr.dmi' icon_state = "shield" anchored = 1 plane = MOB_PLANE @@ -110,7 +110,7 @@ diffused_for = max(duration, 0) gen?.damaged_segments |= src - + set_density(0) update_visuals() update_nearby_tiles() //Force ZAS update @@ -299,7 +299,7 @@ // /obj/effect/temp_visual/shield_impact_effect name = "shield impact" - icon = 'icons/obj/machines/shielding.dmi' + icon = 'icons/obj/machines/shielding_vr.dmi' icon_state = "shield_impact" plane = MOB_PLANE layer = ABOVE_MOB_LAYER diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index b87f66432f..08d0b8ce86 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -123,7 +123,7 @@ "max_charge" = C.max_charge, "failing" = (C.time_since_fail <= 2), ))) - + data["lockedData"]["active"] = active data["lockedData"]["failing"] = (time_since_fail <= 2) data["lockedData"]["radius"] = field_radius @@ -201,7 +201,7 @@ /obj/machinery/shield_gen/tgui_act(action, params) if(..()) return TRUE - + switch(action) if("toggle") if (!active && !anchored) diff --git a/code/modules/shieldgen/shield_generator.dm b/code/modules/shieldgen/shield_generator.dm index cc3d2f1b25..abe6c6efbf 100644 --- a/code/modules/shieldgen/shield_generator.dm +++ b/code/modules/shieldgen/shield_generator.dm @@ -4,7 +4,7 @@ /obj/machinery/power/shield_generator name = "advanced shield generator" desc = "A heavy-duty shield generator and capacitor, capable of generating energy shields at large distances." - icon = 'icons/obj/machines/shielding.dmi' + icon = 'icons/obj/machines/shielding_vr.dmi' icon_state = "generator0" circuit = /obj/item/weapon/circuitboard/shield_generator density = 1 @@ -105,7 +105,7 @@ // Generates the field objects. Deletes existing field, if applicable. /obj/machinery/power/shield_generator/proc/regenerate_field() for(var/obj/effect/shield/S in field_segments) - qdel(S) + qdel(S) var/list/shielded_turfs if(check_flag(MODEFLAG_HULL)) diff --git a/code/modules/vchat/js/vchat.js b/code/modules/vchat/js/vchat.js index e09339bb59..e2225e3833 100644 --- a/code/modules/vchat/js/vchat.js +++ b/code/modules/vchat/js/vchat.js @@ -137,7 +137,7 @@ function start_vue() { //The table to map game css classes to our vchat categories type_table: [ { - matches: ".filter_say, .say, .emote", + matches: ".filter_say, .say, .emote, .emote_subtle", //VOREStation Edit becomes: "vc_localchat", pretty: "Local Chat", tooltip: "In-character local messages (say, emote, etc)", diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 83118392e8..0889c29933 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -38,12 +38,15 @@ var/fancy_vore = FALSE // Using the new sounds? var/is_wet = TRUE // Is this belly's insides made of slimy parts? var/wet_loop = TRUE // Does the belly have a fleshy loop playing? + var/obj/item/weapon/storage/vore_egg/ownegg // Is this belly creating an egg? + var/egg_type = "egg" // Default egg type and path. + var/egg_path = /obj/item/weapon/storage/vore_egg //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. //Actual full digest modes var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_EGG) //Digest mode addon flags - var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS, "Muffles" = DM_FLAG_THICKBELLY) + var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS, "Muffles" = DM_FLAG_THICKBELLY, "Affect Worn Items" = DM_FLAG_AFFECTWORN) //Item related modes var/tmp/static/list/item_digest_modes = list(IM_HOLD,IM_DIGEST_FOOD,IM_DIGEST) @@ -284,6 +287,11 @@ if (!(M in contents)) return 0 // They weren't in this belly anyway + for(var/mob/living/L in M.contents) + L.muffled = 0 + for(var/obj/item/weapon/holder/H in M.contents) + H.held_mob.muffled = 0 + //Place them into our drop_location M.forceMove(drop_location()) @@ -544,9 +552,10 @@ //Handle a mob struggling // Called from /mob/living/carbon/relaymove() -/obj/belly/proc/relay_resist(mob/living/R) +/obj/belly/proc/relay_resist(mob/living/R, obj/item/C) if (!(R in contents)) - return // User is not in this belly + if(!C) + return // User is not in this belly R.setClickCooldown(50) @@ -555,9 +564,13 @@ to_chat(owner, "Someone is attempting to climb out of your [lowertext(name)]!") if(do_after(R, escapetime, owner, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED)) - if((owner.stat || escapable) && (R.loc == src)) //Can still escape? - release_specific_contents(R) - return + if((owner.stat || escapable)) //Can still escape? + if(C) + release_specific_contents(C) + return + if(R.loc == src) + release_specific_contents(R) + return else if(R.loc != src) //Aren't even in the belly. Quietly fail. return else //Belly became inescapable or mob revived @@ -600,6 +613,13 @@ to_chat(R, "You start to climb out of \the [lowertext(name)].") to_chat(owner, "Someone is attempting to climb out of your [lowertext(name)]!") if(do_after(R, escapetime)) + if(escapable && C) + release_specific_contents(C) + to_chat(R,"Your struggles successfully cause [owner] to squeeze your container out of their \the [lowertext(name)].") + to_chat(owner,"[C] suddenly slips out of your [lowertext(name)]!") + for(var/mob/M in hearers(4, owner)) + M.show_message("[C] suddenly slips out of [owner]'s [lowertext(name)]!", 2) + return if((escapable) && (R.loc == src) && !R.absorbed) //Does the owner still have escapable enabled? release_specific_contents(R) to_chat(R,"You climb out of \the [lowertext(name)].") @@ -630,6 +650,9 @@ to_chat(R, "Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!") to_chat(owner, "Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]!") + if(C) + transfer_contents(C, dest_belly) + return transfer_contents(R, dest_belly) return diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm index 30fe4fd33a..e00860cada 100644 --- a/code/modules/vore/eating/bellymodes_datum_vr.dm +++ b/code/modules/vore/eating/bellymodes_datum_vr.dm @@ -14,6 +14,9 @@ GLOBAL_LIST_INIT(digest_modes, list()) /datum/digest_mode/proc/process_mob(obj/belly/B, mob/living/L) return null +/datum/digest_mode/proc/handle_atoms(obj/belly/B, list/touchable_atoms) + return FALSE + /datum/digest_mode/digest id = DM_DIGEST noise_chance = 50 @@ -132,8 +135,69 @@ GLOBAL_LIST_INIT(digest_modes, list()) // E G G /datum/digest_mode/egg id = DM_EGG - +/* /datum/digest_mode/egg/process_mob(obj/belly/B, mob/living/carbon/human/H) if(!istype(H) || H.stat == DEAD || H.absorbed) return null - B.put_in_egg(H, 1) + B.put_in_egg(H, 1)*/ + +/datum/digest_mode/egg/handle_atoms(obj/belly/B, list/touchable_atoms) + var/list/egg_contents = list() + for(var/E in touchable_atoms) + if(istype(E, /obj/item/weapon/storage/vore_egg)) // Don't egg other eggs. + continue + if(isliving(E)) + var/mob/living/L = E + if(L.absorbed) + continue + egg_contents += L + if(isitem(E)) + egg_contents += E + if(egg_contents.len) + if(!B.ownegg) + if(B.owner.vore_egg_type in tf_vore_egg_types) + B.egg_type = B.owner.vore_egg_type + B.egg_path = tf_vore_egg_types[B.egg_type] + B.ownegg = new B.egg_path(B) + for(var/atom/movable/C in egg_contents) + if(isitem(C) && egg_contents.len == 1) //Only egging one item + var/obj/item/I = C + B.ownegg.w_class = I.w_class + B.ownegg.max_storage_space = B.ownegg.w_class + I.forceMove(B.ownegg) + B.ownegg.icon_scale_x = 0.2 * B.ownegg.w_class + B.ownegg.icon_scale_y = 0.2 * B.ownegg.w_class + B.ownegg.update_transform() + egg_contents -= I + B.ownegg = null + return + if(isliving(C)) + var/mob/living/M = C + B.ownegg.w_class = M.size_multiplier * 4 //Egg size and weight scaled to match occupant. + var/obj/item/weapon/holder/H = new M.holder_type(B.ownegg) + H.held_mob = M + M.forceMove(H) + H.sync(M) + B.ownegg.max_storage_space = H.w_class + B.ownegg.icon_scale_x = 0.25 * B.ownegg.w_class + B.ownegg.icon_scale_y = 0.25 * B.ownegg.w_class + B.ownegg.update_transform() + egg_contents -= M + if(B.ownegg.w_class > 4) + B.ownegg.slowdown = B.ownegg.w_class - 4 + B.ownegg = null + return + C.forceMove(B.ownegg) + if(isitem(C)) + var/obj/item/I = C + B.ownegg.w_class += I.w_class //Let's assume a regular outfit can reach total w_class of 16. + B.ownegg.calibrate_size() + B.ownegg.orient2hud() + B.ownegg.w_class = clamp(B.ownegg.w_class * 0.25, 1, 8) //A total w_class of 16 will result in a backpack sized egg. + B.ownegg.icon_scale_x = 0.25 * B.ownegg.w_class + B.ownegg.icon_scale_y = 0.25 * B.ownegg.w_class + B.ownegg.update_transform() + if(B.ownegg.w_class > 4) + B.ownegg.slowdown = B.ownegg.w_class - 4 + B.ownegg = null + return \ No newline at end of file diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index f6c74215cd..23ef02e9ac 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -31,6 +31,14 @@ if(!length(touchable_atoms)) return + var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"] + if(!DM) + log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!") + return FALSE + if(DM.handle_atoms(src, touchable_atoms)) + updateVRPanels() + return + var/list/touchable_mobs = null var/list/hta_returns = handle_touchable_atoms(touchable_atoms) @@ -54,11 +62,6 @@ continue // don't give digesty messages to indigestible people to_chat(M, "[pick(EL)]") - var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"] - if(!DM) - log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!") - return FALSE - if(!digestion_noise_chance) digestion_noise_chance = DM.noise_chance @@ -137,6 +140,16 @@ if((mode_flags & DM_FLAG_THICKBELLY) && !H.muffled) H.muffled = TRUE + //Worn items flag + if(mode_flags & DM_FLAG_AFFECTWORN) + for(var/slot in slots) + var/obj/item/I = H.get_equipped_item(slot = slot) + if(I && I.canremove) + if(handle_digesting_item(I)) + digestion_noise_chance = 25 + to_update = TRUE + break + //Stripping flag if(mode_flags & DM_FLAG_STRIPPING) for(var/slot in slots) diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index f654009726..086c5270f7 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -236,7 +236,7 @@ // Host is inside someone else, and is trying to interact with something else inside that person. if("pick_from_inside") return pick_from_inside(usr, params) - + // Host is trying to interact with something in host's belly. if("pick_from_outside") return pick_from_outside(usr, params) @@ -267,7 +267,7 @@ host.vore_selected = NB unsaved_changes = TRUE return TRUE - + if("bellypick") host.vore_selected = locate(params["bellypick"]) return TRUE @@ -403,11 +403,11 @@ if(!(target in OB)) return TRUE // Aren't here anymore, need to update menu - + var/intent = "Examine" if(isliving(target)) intent = alert("What do you want to do to them?","Query","Examine","Help Out","Devour") - + else if(istype(target, /obj/item)) intent = alert("What do you want to do to that?","Query","Examine","Use Hand") @@ -505,7 +505,7 @@ host.vore_selected.transfer_contents(target, choice, 1) return TRUE return - + var/atom/movable/target = locate(params["pick"]) if(!(target in host.vore_selected)) return TRUE // Not in our X anymore, update UI @@ -602,7 +602,7 @@ if(!toggle_addon) return FALSE host.vore_selected.mode_flags ^= host.vore_selected.mode_flag_list[toggle_addon] - host.vore_selected.items_preserved.Cut() //Re-evaltuate all items in belly on + host.vore_selected.items_preserved.Cut() //Re-evaltuate all items in belly on . = TRUE if("b_item_mode") var/list/menu_list = host.vore_selected.item_digest_modes.Copy() @@ -632,7 +632,7 @@ host.vore_selected.contamination_color = new_color host.vore_selected.items_preserved.Cut() //To re-contaminate for new color . = TRUE - if("b_desc") + if("b_desc") var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",host.vore_selected.desc) as message|null) if(new_desc) @@ -865,6 +865,6 @@ qdel(host.vore_selected) host.vore_selected = host.vore_organs[1] . = TRUE - + if(.) unsaved_changes = TRUE \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 6b88eec383..6d546576f4 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -1435,7 +1435,9 @@ else to_chat(user, "\The [src] isn't compatible with your body as it is now.") - - - - +// Astra - // Astra +/obj/item/weapon/material/knife/ritual/fluff/astra + name = "Polished Ritual Knife" + desc = "A well kept strange ritual knife, There is a small tag with the name 'Astra Ether' on it. They are probably looking for this." + icon = 'icons/obj/wizard.dmi' + icon_state = "render" diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index 4e7b63e0b9..b0bfbcc5b4 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -48,3 +48,23 @@ ..() for(var/mob/living/carbon/human/I in contents) item_state = lowertext(I.species.name) + +//Egg features. +/obj/item/weapon/holder/attack_hand(mob/living/user as mob) + if(istype(src.loc, /obj/item/weapon/storage/vore_egg)) //Don't scoop up the egged mob + src.pickup(user) + user.drop_from_inventory(src) + return + ..() + +/obj/item/weapon/holder/container_resist(mob/living/held) + if(!istype(src.loc, /obj/item/weapon/storage/vore_egg)) + ..() + else + var/obj/item/weapon/storage/vore_egg/E = src.loc + if(isbelly(E.loc)) + var/obj/belly/B = E.loc + B.relay_resist(held, E) + return + E.hatch(held) + return diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi index 65dfa98237..44f6047eeb 100644 Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ diff --git a/icons/mob/species/seromi/eyes.dmi b/icons/mob/species/seromi/eyes.dmi index e50b97c956..250a56d4f9 100644 Binary files a/icons/mob/species/seromi/eyes.dmi and b/icons/mob/species/seromi/eyes.dmi differ diff --git a/icons/mob/species/werebeast/back.dmi b/icons/mob/species/werebeast/back.dmi index 14cd04dbdd..f04103f7a7 100644 Binary files a/icons/mob/species/werebeast/back.dmi and b/icons/mob/species/werebeast/back.dmi differ diff --git a/icons/mob/species/werebeast/uniform.dmi b/icons/mob/species/werebeast/uniform.dmi index e441c4af6d..267847085f 100644 Binary files a/icons/mob/species/werebeast/uniform.dmi and b/icons/mob/species/werebeast/uniform.dmi differ diff --git a/icons/mob/widerobot_car_vr.dmi b/icons/mob/widerobot_car_vr.dmi new file mode 100644 index 0000000000..01e6ea41b5 Binary files /dev/null and b/icons/mob/widerobot_car_vr.dmi differ diff --git a/icons/mob/widerobot_eng_vr.dmi b/icons/mob/widerobot_eng_vr.dmi new file mode 100644 index 0000000000..b5c55b53c8 Binary files /dev/null and b/icons/mob/widerobot_eng_vr.dmi differ diff --git a/icons/mob/widerobot_jan_vr.dmi b/icons/mob/widerobot_jan_vr.dmi new file mode 100644 index 0000000000..23ec7272b2 Binary files /dev/null and b/icons/mob/widerobot_jan_vr.dmi differ diff --git a/icons/mob/widerobot_med_vr.dmi b/icons/mob/widerobot_med_vr.dmi new file mode 100644 index 0000000000..809bed1be0 Binary files /dev/null and b/icons/mob/widerobot_med_vr.dmi differ diff --git a/icons/mob/widerobot_sci_vr.dmi b/icons/mob/widerobot_sci_vr.dmi new file mode 100644 index 0000000000..9b2592fcc0 Binary files /dev/null and b/icons/mob/widerobot_sci_vr.dmi differ diff --git a/icons/mob/widerobot_sec_vr.dmi b/icons/mob/widerobot_sec_vr.dmi new file mode 100644 index 0000000000..5cf9850300 Binary files /dev/null and b/icons/mob/widerobot_sec_vr.dmi differ diff --git a/icons/mob/widerobot_ser_vr.dmi b/icons/mob/widerobot_ser_vr.dmi new file mode 100644 index 0000000000..14c8d35469 Binary files /dev/null and b/icons/mob/widerobot_ser_vr.dmi differ diff --git a/icons/mob/widerobot_vr.dmi b/icons/mob/widerobot_vr.dmi index 953a3cc630..39d27a1dba 100644 Binary files a/icons/mob/widerobot_vr.dmi and b/icons/mob/widerobot_vr.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index e410088a23..93d368d42c 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 473b6614e6..3c252b8d35 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/clothing/uniforms_1.dmi b/icons/obj/clothing/uniforms_1.dmi index eba7fa299f..9478ef888d 100644 Binary files a/icons/obj/clothing/uniforms_1.dmi and b/icons/obj/clothing/uniforms_1.dmi differ diff --git a/icons/obj/egg_new_vr.dmi b/icons/obj/egg_new_vr.dmi new file mode 100644 index 0000000000..b9804d69ba Binary files /dev/null and b/icons/obj/egg_new_vr.dmi differ diff --git a/icons/obj/egg_open_vr.dmi b/icons/obj/egg_open_vr.dmi new file mode 100644 index 0000000000..e3faabb4dc Binary files /dev/null and b/icons/obj/egg_open_vr.dmi differ diff --git a/icons/obj/egg_vr.dmi b/icons/obj/egg_vr.dmi index c54ac62b10..14c17920f8 100644 Binary files a/icons/obj/egg_vr.dmi and b/icons/obj/egg_vr.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi index 56d13d9fc6..af15334c11 100644 Binary files a/icons/obj/food.dmi and b/icons/obj/food.dmi differ diff --git a/icons/obj/machines/shielding.dmi b/icons/obj/machines/shielding.dmi index 195192b1c8..42087073d3 100644 Binary files a/icons/obj/machines/shielding.dmi and b/icons/obj/machines/shielding.dmi differ diff --git a/icons/obj/machines/shielding_vr.dmi b/icons/obj/machines/shielding_vr.dmi new file mode 100644 index 0000000000..195192b1c8 Binary files /dev/null and b/icons/obj/machines/shielding_vr.dmi differ diff --git a/maps/tether/submaps/tether_misc.dmm b/maps/tether/submaps/tether_misc.dmm index 529143989b..efed63f2c1 100644 --- a/maps/tether/submaps/tether_misc.dmm +++ b/maps/tether/submaps/tether_misc.dmm @@ -3296,7 +3296,7 @@ /area/space) "Sl" = ( /obj/structure/sign/nanotrasen, -/turf/simulated/wall/rshull, +/turf/simulated/wall/thull, /area/shuttle/escape) "Sm" = ( /turf/simulated/shuttle/wall/alien/blue/hard_corner, @@ -4675,7 +4675,7 @@ name = "\improper CentCom Security Arrivals" }) "XE" = ( -/turf/simulated/wall/rshull, +/turf/simulated/wall/thull, /area/shuttle/escape) "XH" = ( /obj/structure/bed/chair{ diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index 728bd4fd7a..45df6fec18 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -5787,6 +5787,7 @@ /obj/random/junk, /obj/random/junk, /obj/random/tool, +/obj/effect/landmark/teleplumb_exit, /turf/simulated/floor/plating, /area/maintenance/lower/trash_pit) "ajS" = ( @@ -11523,8 +11524,13 @@ /turf/simulated/wall, /area/tether/surfacebase/tram) "atz" = ( -/obj/machinery/door/blast/regular, -/turf/simulated/wall, +/obj/effect/floor_decal/techfloor/orange{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/techfloor/grid, /area/tether/surfacebase/tram) "atA" = ( /obj/effect/floor_decal/techfloor/orange{ @@ -11816,16 +11822,6 @@ /turf/simulated/floor/tiled/techfloor/grid, /area/tether/surfacebase/tram) "aue" = ( -/obj/effect/shuttle_landmark{ - base_area = /area/tether/surfacebase/tram; - base_turf = /turf/simulated/floor/tiled/techfloor/grid; - docking_controller = null; - landmark_tag = "escape_station"; - name = "Tether Surface Base" - }, -/turf/simulated/floor/tiled/techfloor/grid, -/area/tether/surfacebase/tram) -"auf" = ( /obj/effect/floor_decal/techfloor/orange{ dir = 4 }, @@ -12139,13 +12135,8 @@ /turf/simulated/floor/tiled, /area/tether/surfacebase/tram) "auD" = ( -/obj/effect/floor_decal/techfloor/orange{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/turf/simulated/floor/tiled/techfloor/grid, +/obj/machinery/door/blast/regular, +/turf/simulated/wall, /area/tether/surfacebase/tram) "auE" = ( /turf/simulated/wall, @@ -36349,6 +36340,16 @@ }, /turf/simulated/floor/tiled, /area/tether/surfacebase/security/brig) +"wXW" = ( +/obj/effect/shuttle_landmark{ + base_area = /area/tether/surfacebase/tram; + base_turf = /turf/simulated/floor/tiled/techfloor/grid; + docking_controller = null; + landmark_tag = "escape_station"; + name = "Tether Surface Base" + }, +/turf/simulated/floor/tiled/techfloor/grid, +/area/tether/surfacebase/tram) "xdV" = ( /obj/structure/cable/green{ d1 = 4; @@ -53214,11 +53215,11 @@ aah aah aah aah -aah -aah -aah -aah -baU +aty +atx +atx +atx +atx aty afH aub @@ -53240,11 +53241,11 @@ aub aub aub aty -atx -atx -atx -atx -aty +aad +aad +aad +aad +aad aad aad aad @@ -53356,37 +53357,37 @@ aah aah aah aah -aah -aah -aah -aah -baU -atz -atA -atA -atA -atA -atA -atA -atA -auc -auc -auc -auc -atA -atA -auc -auc -auc -auc -atA -atA auD auc auc -auc -auD atz +auc +auc +atA +atA +atA +atA +atA +auc +auc +auc +atA +auc +atA +auc +auc +auc +atA +atA +atA +atA +atA +auD +aad +aad +aad +aad +aad aad aad aad @@ -53498,37 +53499,37 @@ aah aah aah aah -aah -aah -aah +auD +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +auD +aad +aad +aad aad aad -atz -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -atz aad aad aad @@ -53640,37 +53641,37 @@ aad aad aah aah -aah +auD +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +wXW +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +auD +aad aad aad aad aad -atz -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aue -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -atz aad aad aad @@ -53782,37 +53783,37 @@ aad aad aad aad +auD +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +auD aad aad aad aad aad -atz -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atz aad aad aad @@ -53924,37 +53925,37 @@ aad aad aad aad +auD +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +auD aad aad aad aad aad -atz -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -atz aad aad aad @@ -54066,37 +54067,37 @@ aad aad aad aad +auD +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +auD aad aad aad aad aad -atz -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -atz aad aad aad @@ -54208,37 +54209,37 @@ aad aad aad aad +auD +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +auD aad aad aad aad aad -atz -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -atz aad aad aad @@ -54350,37 +54351,37 @@ aad aad aad aad +auD +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +auD aad aad aad aad aad -atz -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -atz aad aad aad @@ -54492,37 +54493,37 @@ aad aad aad aad +auD +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +auD aad aad aad aad aad -atz -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -atz aad aad aad @@ -54634,37 +54635,37 @@ aad aad aad aad +auD +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +auD aad aad aad aad aad -atz -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -atz aad aad aad @@ -54776,37 +54777,37 @@ aad aad aad aad +auD +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +auD aad aad aad aad aad -atz -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -atz aad aad aad @@ -54918,37 +54919,37 @@ aad aad aad aad +auD +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +atB +auD aad aad aad aad aad -atz -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atB -atz aad aad aad @@ -55060,37 +55061,37 @@ aad aad aad aad +auD +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +aud +auD aad aad aad aad aad -atz -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -aud -atz aad aad aad @@ -55202,37 +55203,37 @@ aad aad aad aad +auD +atC +atC +aua +atC +atC +atC +aua +atC +atC +aue +aua +atC +atC +aua +atC +atC +atC +aua +atC +aue +atC +aua +atC +atC +auD aad aad aad aad aad -atz -atC -atC -aua -atC -atC -atC -aua -atC -atC -auf -aua -atC -atC -aua -atC -atC -atC -aua -atC -auf -atC -aua -atC -atC -atz aad aad aad @@ -55344,11 +55345,6 @@ aad aad aad aad -aad -aad -aad -aad -aad aty atx atx @@ -55432,6 +55428,11 @@ aad aad aad aad +aad +aad +aad +aad +aad aaa "} (134,1,1) = {" diff --git a/maps/tether/tether-02-surface2.dmm b/maps/tether/tether-02-surface2.dmm index 425e3d9903..3b7cead3e9 100644 --- a/maps/tether/tether-02-surface2.dmm +++ b/maps/tether/tether-02-surface2.dmm @@ -19291,7 +19291,7 @@ /obj/machinery/camera/network/outside{ dir = 5 }, -/turf/simulated/floor/tiled/steel_dirty/virgo3b, +/turf/simulated/floor/outdoors/grass/sif/virgo3b, /area/tether/surfacebase/outside/outside2) "aHE" = ( /turf/simulated/wall, @@ -51155,9 +51155,9 @@ adt adt adt adt -adt -adt -adt +abn +abn +abn adt adt adt @@ -51296,16 +51296,16 @@ adt adt adt adt -adt -aab -aab -aab -aab -aab -aab -aab -aab -aab +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn aab adt adt @@ -51439,13 +51439,13 @@ adt adt adt adt -aeG -aab -aab -aab -aab +abn +abn +abn aab aab +abn +abn aab aab aab @@ -51542,9 +51542,9 @@ awv ard aab aab -aab -aab -aab +abn +abn +abn ard aBa aBz @@ -51574,15 +51574,15 @@ abn abn abn abn -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aab +abn +abn +abn +abn +abn +abn +abn +abn +abn aab aab aab @@ -51685,10 +51685,10 @@ ard aab aab aab -aab -aab -aab -aab +abn +abn +abn +abn aBz aCk aDh @@ -51698,32 +51698,32 @@ aFd aFM aBz abn -aeG +abn aHD -aeG -aeG -aeG -aeG abn abn abn abn abn -aeG -aeG -aeG abn abn abn -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn aab aab aab @@ -51829,8 +51829,8 @@ aab aab aab aab -aab -aab +abn +abn aBz aCl aDi @@ -51839,33 +51839,33 @@ aEw aFe aFN aBz +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn aab -aeG -aeG -aeG -aeG -aeG -aeG -abn -abn -abn -abn -aeG -aeG -aeG -aeG -aeG -aeG -abn -abn -abn -aeG -aeG -aeG -aeG -aeG -aeG -aeG aab aab aab @@ -51972,7 +51972,7 @@ aab aab aab aab -aab +abn aBz aBz aBz @@ -51981,33 +51981,33 @@ aBz aBz aBz aBz -aab -aeG -aeG -aeG -aeG -aeG -aeG -aeG abn abn abn -aeG +abn +abn +abn +abn +abn +abn +abn +abn +abn aac aac -aeG -aeG -aeG abn abn abn -aeG -aeG -aeG -aeG -aeG -aeG -aeG +abn +abn +abn +abn +abn +abn +abn +abn +aab +aab aab aab aab @@ -52114,43 +52114,43 @@ aab aab aab aab -aab -aab -aab +abn +abn +abn adt adt adt +abn +abn +abn +abn +abn +abn +abn +abn +aac +aac +abn +abn +abn +abn +abn +aac +aac +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn aab aab aab aab -aeG -aeG -aeG -aeG -aac -aac -aeG -aeG -abn -abn -aeG -aac -aac -aeG -aeG -aeG -aeG -aeG -abn -abn -aeG -aeG -aeG -aeG -aeG -aeG -aab aab aab aab @@ -52257,41 +52257,41 @@ aab aab aab aab -aab -aab -aab -aab -aab -aab -aab -aab -aab -aeG -aeG -aeG +abn +abn +abn +abn aeG +abn +abn +abn +abn +abn +abn +abn +abn aac aac -aeG -aeG -aeG -abn -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG abn abn abn -aeG -aeG -aeG -aeG +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +aab +aab +aab +aab aab aab aab @@ -52400,40 +52400,40 @@ aab aab aab aab -aab -aab -aab -aab -aab -aab -aab -aab -aeG -aeG -aeG -aeG -aeG -aeG +abn +abn +abn aeG aeG abn abn abn abn -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG abn -aeG -aeG -aeG -aeG +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +aab +aab +aab +aab aab aab aab @@ -52543,6 +52543,35 @@ aab aab aab aab +abn +abn +aeG +aeG +aeG +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn aab aab aab @@ -52550,35 +52579,6 @@ aab aab aab aab -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -abn -abn -abn -abn -abn -abn -abn -aeG -aeG -aeG -aeG -aeG -abn -abn -aeG -aeG -aeG -aeG -aab -aab -aab aab aab aab @@ -52686,39 +52686,39 @@ aab aab aab aab +abn +aeG +aeG +aeG +aeG +aeG +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +abn +aeG +abn +abn +abn aab aab aab aab aab aab -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -abn -abn -abn -abn -abn -abn -abn -abn -abn -aeG -aeG -aeG -abn -abn -abn -abn -aeG -aeG -aab aab aab aab @@ -52828,20 +52828,21 @@ aab aab aab aab -aab -aab -aab -aab -aab -aab +abn +aeG +aeG +aeG +aeG +aeG aac aac -aeG -aeG -aeG -aeG -aeG -aeG +abn +abn +abn +abn +abn +abn +abn abn abn abn @@ -52854,12 +52855,11 @@ aeG aeG aeG aeG -aeG -aeG -abn -abn -aeG -aeG +aab +aab +aab +aab +aab aab aab aab @@ -52970,19 +52970,19 @@ aab aab aab aab -aab -aab -aab -aab -aab -aab +abn +aeG +aeG +aeG +aeG +aeG aac aac -aeG -aeG -aeG -aeG -aeG +abn +abn +abn +abn +abn abn abn abn @@ -52997,11 +52997,11 @@ aeG aeG aeG aeG -aeG -aeG -aeG -aeG -aeG +aab +aab +aab +aab +aab aab aab aab @@ -53112,12 +53112,12 @@ aab aab aab aab -aab -aab -aab -aab -aab -aab +abn +aeG +aeG +aeG +aeG +aeG aeG aeG aeG @@ -53139,11 +53139,11 @@ aeG aeG aeG aeG -aeG -aeG -aeG -aeG -aeG +aab +aab +aab +aab +aab aab aab aab @@ -53255,11 +53255,11 @@ aab aab aab aab -aab -aab -aab -aab -aab +aeG +aeG +aeG +aeG +aeG aeG aeG aeG @@ -53281,11 +53281,11 @@ aeG aeG aeG aeG -aeG -aeG -aeG -aeG -aeG +aab +aab +aab +aab +aab aab aab aab @@ -53397,37 +53397,37 @@ aab aab aab aab +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG aab aab aab aab aab -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG aab aab aab @@ -53539,37 +53539,37 @@ aab aab aab aab +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG +aeG aab aab aab aab aab -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG -aeG aab aab aab diff --git a/maps/tether/tether-07-station3.dmm b/maps/tether/tether-07-station3.dmm index 849c92f6ae..a82fdd2dfd 100644 --- a/maps/tether/tether-07-station3.dmm +++ b/maps/tether/tether-07-station3.dmm @@ -22638,7 +22638,7 @@ /obj/structure/bed/chair/shuttle{ dir = 4 }, -/obj/structure/closet/autolok_wall{ +/obj/structure/closet/emergsuit_wall{ pixel_y = 32 }, /turf/simulated/floor/tiled/eris/white, @@ -23161,7 +23161,7 @@ health = 1e+006 }, /obj/machinery/atmospherics/pipe/simple/hidden/aux, -/obj/structure/closet/autolok_wall{ +/obj/structure/closet/emergsuit_wall{ pixel_x = 27 }, /turf/simulated/floor/tiled/eris/steel/gray_perforated, diff --git a/maps/tether/tether_shuttles.dm b/maps/tether/tether_shuttles.dm index 7ad7472fc6..8f459766c7 100644 --- a/maps/tether/tether_shuttles.dm +++ b/maps/tether/tether_shuttles.dm @@ -259,7 +259,6 @@ /obj/machinery/computer/shuttle_control/explore/medivac name = "short jump console" shuttle_tag = "Medivac Shuttle" - req_one_access = list(access_cmo, access_pilot) //////////////////////////////////////// //////// Securiship ///////////// @@ -285,4 +284,3 @@ /obj/machinery/computer/shuttle_control/explore/securiship name = "short jump console" shuttle_tag = "Securiship Shuttle" - req_one_access = list(access_pilot, access_hos) diff --git a/tools/StrongDMM/README.md b/tools/StrongDMM/README.md new file mode 100644 index 0000000000..ba8a552901 --- /dev/null +++ b/tools/StrongDMM/README.md @@ -0,0 +1,45 @@ +# StrongDMM + +### LICENSE +The contents of this folder are licensed under the GNU General Public License version 3, which can be found in full in ~/LICENSE-GPL3.txt. + +The source code can be found at https://github.com/SpaiR/StrongDMM + +### Overview +[SpaiR/StrongDMM](https://github.com/SpaiR/StrongDMM) is a 3rd-party program licensed under GPL-v3 that loads in the object tree from a .dme file, and provides an interface very similar to DreamMaker's own mapping interface with which to make and edit .dmm map files. Generally speaking, it loads faster than DM, has several useful features and a cleaner interface, but requires compilation from a separate program (With some care required to ensure that changes are properly copied over). Executables for both Windows and Linux are provided, differentiated by the windows executable being suffixed with `.exe`. There are also instructions on StrongDMM's github page (Linked above) on how to build it from the source code (Not provided) + +### Setup +Navigate to `/tools/StrongDMM` and run the launcher appropriate for your operating system. If you're on windows, it ends in `.exe`. If you're on linux, it has no suffix. Because going into those folders is considered tedious by ~~lazy coders~~ basically everyone, it's recommended to set up a shortcut in the root directory. The launcher will automatically update to the latest build and then open the editor. You should see something like this: + +![.png](https://puu.sh/H75QH/28c4a5917c.png) + +It's important to note the format of the map files you intend to be working with. Byond's native format is very compact, both by organization and actual storage, where single tile definitions and rows of map tiles are each one line, and tile definitions are re-used where possible. This tends to make map diffs much larger and merge conflicts more tedious to deal with. /tg/ has designed their own format, `TGM`, which spreads out tile and map-row definitions across multiple lines, making the file much more human-readable. It also uses a unique definition for each map tile, which increases the size of the map files by a fair margin. DreamMaker doesn't really care what format it loads in, but it only knows how to save to the native format. StrongDMM has a preference to save maps according to either format, and this can be set by going to `File`->`Preferences`, and selecting the appropriate format, as shown: + +![.png](https://puu.sh/H75Uj/8b666b11b0.png) + +You can also change the other settings as you see fit, but the map save format and nudge mode are most important. Unless you know what you're doing, you probably don't want to change nudge mode, as `step_x/step_y` breaks the commonly-used glide movement animations. Ticking the `Alternate Scrolling Behaviour` will allow you to zoom while holding Space, and scrolling otherwise pans like DreamMaker. With the option unticked, scrolling will only affect zoom. The middle mouse button can always be used to pan, in either case. + + +### Loading a map +If this is the first time you're using StrongDMM, the panel on the left will be blank except for the `Open Environment...` button at the top. You'll want to click that (Or go `File`->`Open Environment`, or open one directly from `Recent Environments`) and then navigate to the `.dme` file for the project you're working on. StrongDMM needs this to load in the object tree so it can understand the map files that you try to load. It's generally a good idea to make sure that the map files you want to load successfully compile, which generally means making sure the right files for their map-specific objects and areas are ticked when you compile. Once you've loaded an environment, the panel on the left should show the object tree, which looks very similar to DreamMaker's UI, but is notably not a blinding white. + +![.png](https://puu.sh/H75YM/dc455a1b42.png) + +Next is to load a map. Go to `File`->`Open Available Map...` (Ctrl+Shift+o) and it'll show all map files that exist within the environment you've loaded. Note that some, or even many, of them may not load correctly because you didn't compile all their necessary objects. You can also use `File`->`Open Map` (Ctrl+o) to navigate to the desired map files yourself. Once you click `Open`, it'll take (up to) a couple of seconds to load the map file into the program, and your screen should show whatever's in the bottom-left corner of the map: + +![.png](https://puu.sh/H762D/90894c7e49.png) + +If the map cannot load correctly because objects aren't defined in the environment tree, you'll see a UI that looks pretty similar to DreamMaker's "Hey this doesn't exist" UI, but again, isn't bright white, and also lets you set variables on the replacements. + +![.png](https://puu.sh/H763d/c609eaff27.png) + +### Mapping +Once a map is loaded, you're pretty much free to start mapping, just as you would in DreamMaker. You can use Ctrl+[1, 2, 3, 4] to toggle the various layers or do so manually from the `Options` menu, which notably _doesn't_ require ticking any extra boxes. By default, in the bottom right of the screen will be one or two small UI elements. The bottommost one will show the map coordinates of the cursor, and the top one, if present, will allow you to move between Z-levels on maps with multiple Z levels (But not when multiple map _files_ are stitched together into multi-Z). + +![.png](https://puu.sh/H7685/da1121bfef.png) + +Shift+Right Click will open up the Edit-Variables interface for whatever you clicked on, which can be tricky to do for small things or things on very cluttered tiles, but you can also right click on the tile, and navigate to the appropriate object and click `Edit`. Note that while the Edit-Variables interface is open, you cannot pan or edit the map, the interface consumes all input. This interface also has a filter, so you can quickly and easily find the variable that you're trying to set! + +![.png](https://puu.sh/H76aI/0726f5ebc4.png) + +The only other really important thing to note is that all these panels can be moved about the whole window, so if you find something is in the way, you're totally free to move it. And again, remember to save (Ctrl+S) and compile your changes before you start your test server and wonder where in the hells all your changes went. \ No newline at end of file diff --git a/tools/StrongDMM/SpacemanDMM.toml b/tools/StrongDMM/SpacemanDMM.toml new file mode 100644 index 0000000000..500be06fa6 --- /dev/null +++ b/tools/StrongDMM/SpacemanDMM.toml @@ -0,0 +1,5 @@ +[diagnostics] +macro_redefined = "off" +macro_undefined_no_definition = "off" +as_local_var = "off" +tmp_no_effect = "off" diff --git a/tools/StrongDMM/sdmmlauncher b/tools/StrongDMM/sdmmlauncher new file mode 100644 index 0000000000..0d544adb2d Binary files /dev/null and b/tools/StrongDMM/sdmmlauncher differ diff --git a/tools/StrongDMM/sdmmlauncher.exe b/tools/StrongDMM/sdmmlauncher.exe new file mode 100644 index 0000000000..e35a71fd35 Binary files /dev/null and b/tools/StrongDMM/sdmmlauncher.exe differ diff --git a/vorestation.dme b/vorestation.dme index 6ca4812add..53b5e1e2d0 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -971,6 +971,7 @@ #include "code\game\mecha\mech_sensor.dm" #include "code\game\mecha\mecha.dm" #include "code\game\mecha\mecha_actions.dm" +#include "code\game\mecha\mecha_appearance.dm" #include "code\game\mecha\mecha_construction_paths.dm" #include "code\game\mecha\mecha_control_console.dm" #include "code\game\mecha\mecha_helpers.dm" @@ -1384,6 +1385,7 @@ #include "code\game\objects\items\weapons\storage\boxes.dm" #include "code\game\objects\items\weapons\storage\boxes_vr.dm" #include "code\game\objects\items\weapons\storage\briefcase.dm" +#include "code\game\objects\items\weapons\storage\egg_vr.dm" #include "code\game\objects\items\weapons\storage\fancy.dm" #include "code\game\objects\items\weapons\storage\fancy_yw.dm" #include "code\game\objects\items\weapons\storage\firstaid.dm" @@ -1477,6 +1479,7 @@ #include "code\game\objects\structures\trash_pile_vr.dm" #include "code\game\objects\structures\under_wardrobe.dm" #include "code\game\objects\structures\watercloset.dm" +#include "code\game\objects\structures\watercloset_vr.dm" #include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\window.dm" #include "code\game\objects\structures\window_spawner.dm" @@ -1527,6 +1530,7 @@ #include "code\game\objects\structures\flora\flora_vr.dm" #include "code\game\objects\structures\flora\grass.dm" #include "code\game\objects\structures\flora\trees.dm" +#include "code\game\objects\structures\ghost_pods\event_vr.dm" #include "code\game\objects\structures\ghost_pods\ghost_pods.dm" #include "code\game\objects\structures\ghost_pods\ghost_pods_vr.dm" #include "code\game\objects\structures\ghost_pods\human.dm" @@ -1622,8 +1626,9 @@ #include "code\modules\admin\admin_ranks.dm" #include "code\modules\admin\admin_secrets.dm" #include "code\modules\admin\admin_tools.dm" -#include "code\modules\admin\admin_verb_lists.dm" +#include "code\modules\admin\admin_verb_lists_vr.dm" #include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\admin_vr.dm" #include "code\modules\admin\banjob.dm" #include "code\modules\admin\ckey_vr.dm" #include "code\modules\admin\create_mob.dm" @@ -3184,6 +3189,7 @@ #include "code\modules\overmap\ships\computers\helm.dm" #include "code\modules\overmap\ships\computers\sensors.dm" #include "code\modules\overmap\ships\computers\ship.dm" +#include "code\modules\overmap\ships\computers\ship_vr.dm" #include "code\modules\overmap\ships\computers\shuttle.dm" #include "code\modules\overmap\ships\engines\engine.dm" #include "code\modules\overmap\ships\engines\gas_thruster.dm"