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:
+
+
+
+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:
+
+
+
+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.
+
+
+
+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:
+
+
+
+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.
+
+
+
+### 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).
+
+
+
+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!
+
+
+
+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"