diff --git a/code/datums/autolathe/arms.dm b/code/datums/autolathe/arms.dm
index 03fd38532c..630433c973 100644
--- a/code/datums/autolathe/arms.dm
+++ b/code/datums/autolathe/arms.dm
@@ -298,6 +298,15 @@
name = "speedloader (.38 rubber)"
path =/obj/item/ammo_magazine/s38/rubber
+/datum/category_item/autolathe/arms/speedloader_45
+ name = "speedloader (.45)"
+ path = /obj/item/ammo_magazine/s45
+ hidden = 1
+
+/datum/category_item/autolathe/arms/speedloader_45r
+ name = "speedloader (.45 rubber)"
+ path = /obj/item/ammo_magazine/s45/rubber
+
// Commented out until metal exploits with autolathe is fixed.
/*/datum/category_item/autolathe/arms/pistol_clip_45
name = "ammo clip (.45)"
diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm
index d644a9eaa8..c0b7600aad 100644
--- a/code/datums/uplink/ammunition.dm
+++ b/code/datums/uplink/ammunition.dm
@@ -22,6 +22,14 @@
name = "Pistol Magazine (.45 AP)"
path = /obj/item/ammo_magazine/m45/ap
+/datum/uplink_item/item/ammo/s45m
+ name = "Speedloader (.45)"
+ path = /obj/item/ammo_magazine/s45
+
+/datum/uplink_item/item/ammo/s45map
+ name = "Speedloader (.45 AP)"
+ path = /obj/item/ammo_magazine/s45/ap
+
/datum/uplink_item/item/ammo/tommymag
name = "Tommygun Magazine (.45)"
path = /obj/item/ammo_magazine/m45tommy
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index f46f03d90f..7a9926c102 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -640,7 +640,7 @@
name = "Nonstandard suit cycler"
model_text = "Nonstandard"
req_access = list(access_syndicate)
- departments = list("Mercenary")
+ departments = list("Mercenary", "Charring")
can_repair = 1
/obj/machinery/suit_cycler/attack_ai(mob/user as mob)
@@ -752,7 +752,7 @@
//Clear the access reqs, disable the safeties, and open up all paintjobs.
user << "You run the sequencer across the interface, corrupting the operating protocols."
- departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Crowd Control","Emergency Medical Response","^%###^%$")
+ departments = list("Engineering","Mining","Medical","Security","Atmos","HAZMAT","Construction","Biohazard","Crowd Control","Emergency Medical Response","^%###^%$", "Charring")
species = list("Human","Skrell","Unathi","Tajara", "Teshari", "Nevrean", "Akula", "Sergal", "Flatland Zorren", "Highlander Zorren", "Vulpkanin", "Promethean", "Xenomorph Hybrid", "Vasilissan", "Rapala") //VORESTATION EDIT
emagged = 1
@@ -1073,6 +1073,15 @@
suit.name = "blood-red voidsuit"
suit.item_state = "syndie_voidsuit"
suit.icon_state = "rig-syndie"
+ if("Charring")
+ if(helmet)
+ helmet.name = "soot-covered voidsuit helmet"
+ helmet.icon_state = "rig0-firebug"
+ helmet.item_state = "rig0-firebug"
+ if(suit)
+ suit.name = "soot-covered voidsuit"
+ suit.item_state = "rig-firebug"
+ suit.icon_state = "rig-firebug"
if(helmet) helmet.name = "refitted [helmet.name]"
if(suit) suit.name = "refitted [suit.name]"
diff --git a/code/game/objects/items/gunbox.dm b/code/game/objects/items/gunbox.dm
new file mode 100644
index 0000000000..add1530ca4
--- /dev/null
+++ b/code/game/objects/items/gunbox.dm
@@ -0,0 +1,19 @@
+/obj/item/gunbox
+ name = "detective's gun box"
+ desc = "A secure box containing a Detective's sidearm."
+ icon = 'icons/obj/storage.dmi'
+ icon_state = "gunbox"
+ w_class = ITEMSIZE_HUGE
+
+/obj/item/gunbox/attack_self(mob/living/user)
+ var/list/options = list()
+ options[".45 Pistol"] = list(/obj/item/weapon/gun/projectile/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber)
+ options[".45 Revolver"] = list(/obj/item/weapon/gun/projectile/revolver/detective45, /obj/item/ammo_magazine/s45/rubber, /obj/item/ammo_magazine/s45/rubber)
+ var/choice = input(user,"Would you prefer a pistol or a revolver?") as null|anything in options
+ if(src && choice)
+ var/list/things_to_spawn = options[choice]
+ for(var/new_type in things_to_spawn) // Spawn all the things, the gun and the ammo.
+ var/atom/movable/AM = new new_type(get_turf(src))
+ if(istype(AM, /obj/item/weapon/gun))
+ to_chat(user, "You have chosen \the [AM]. Say hello to your new friend.")
+ qdel(src)
\ No newline at end of file
diff --git a/code/game/objects/items/trash_vr.dm b/code/game/objects/items/trash_vr.dm
new file mode 100644
index 0000000000..57d3bbbef0
--- /dev/null
+++ b/code/game/objects/items/trash_vr.dm
@@ -0,0 +1,33 @@
+// Custom garbage or whatever
+
+/obj/item/trash/rkibble
+ name = "bowl of Borg-O's"
+ desc = "Contains every type of scrap material your robot puppy needs to grow big and strong."
+ icon = 'icons/mob/dogborg_vr.dmi'
+ icon_state = "kibble"
+
+/obj/item/trash/attack(mob/living/M as mob, mob/living/user as mob)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ if(H.species.trashcan == 1)
+ playsound(H.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
+ user.drop_item()
+ var/belly = H.vore_selected
+ var/datum/belly/selected = H.vore_organs[belly]
+ src.forceMove(H)
+ selected.internal_contents += src
+ to_chat(H, "You can taste the flavor of garbage. Wait what?")
+ return
+
+ if(isrobot(M))
+ var/mob/living/silicon/robot/R = M
+ if(R.module.type == /obj/item/weapon/robot_module/scrubpup) // You can now feed the trash borg yay.
+ playsound(R.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
+ user.drop_item()
+ var/belly = R.vore_selected
+ var/datum/belly/selected = R.vore_organs[belly]
+ src.forceMove(R)
+ selected.internal_contents += src // Too many hoops and obstacles to stick it into the sleeper module.
+ R.visible_message("[user] feeds [R] with [src]!")
+ return
+ ..()
diff --git a/code/game/objects/items/weapons/storage/backpack_vr.dm b/code/game/objects/items/weapons/storage/backpack_vr.dm
index d24cf31087..1ce5afe220 100644
--- a/code/game/objects/items/weapons/storage/backpack_vr.dm
+++ b/code/game/objects/items/weapons/storage/backpack_vr.dm
@@ -91,4 +91,15 @@
icon_override = 'icons/mob/back_vr.dmi'
item_state = "robustsaddle"
icon_state = "robustsaddle"
- icon_base = "robustsaddle"
\ No newline at end of file
+ icon_base = "robustsaddle"
+
+/obj/item/weapon/storage/backpack/saddlebag_common/vest //Shared bag for other taurs with sturdy backs
+ name = "Taur Duty Vest"
+ desc = "An armored vest with the armor modules replaced with various handy compartments with decent storage capacity. Useless for protection though."
+ icon = 'icons/obj/storage_vr.dmi'
+ icon_override = 'icons/mob/back_vr.dmi'
+ item_state = "taurvest"
+ icon_state = "taurvest"
+ icon_base = "taurvest"
+ max_storage_space = INVENTORY_STANDARD_SPACE
+ slowdown = 0
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 98ecb2bec7..c2b6e4653a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -260,6 +260,17 @@
new /obj/item/device/camera(src)
new /obj/item/weapon/storage/fancy/vials(src) //VOREStation Edit - adding vials for new hypo
new /obj/item/toy/plushie/therapy/blue(src)
+ new /obj/item/weapon/storage/box/pillbottles(src)
+ new /obj/item/weapon/storage/box/pillbottles(src)
+ new /obj/item/weapon/storage/box/beakers(src)
+ new /obj/item/weapon/storage/box/autoinjectors(src)
+ new /obj/item/weapon/storage/box/syringes(src)
+ new /obj/item/weapon/reagent_containers/dropper(src)
+ new /obj/item/weapon/reagent_containers/dropper(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/antitoxin(src)
return
/obj/structure/closet/secure_closet/psych
@@ -276,8 +287,21 @@
New()
..()
- new /obj/item/weapon/storage/box/pillbottles(src)
- new /obj/item/weapon/storage/box/pillbottles(src)
+ new /obj/item/clothing/under/rank/psych(src)
+ new /obj/item/clothing/under/rank/psych/turtleneck(src)
+ new /obj/item/clothing/suit/straight_jacket(src)
+ new /obj/item/weapon/reagent_containers/glass/bottle/stoxin(src)
+ new /obj/item/weapon/reagent_containers/syringe(src)
+ new /obj/item/weapon/storage/pill_bottle/citalopram(src)
+ new /obj/item/weapon/reagent_containers/pill/methylphenidate(src)
+ new /obj/item/weapon/clipboard(src)
+ new /obj/item/weapon/folder/white(src)
+ new /obj/item/device/taperecorder(src)
+ new /obj/item/device/tape/random(src)
+ new /obj/item/device/tape/random(src)
+ new /obj/item/device/tape/random(src)
+ new /obj/item/device/camera(src)
+ new /obj/item/toy/plushie/therapy/blue(src)
return
/obj/structure/closet/secure_closet/medical_wall
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index f4af008dd4..fe09268ecd 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -296,6 +296,7 @@
..()
new /obj/item/clothing/accessory/badge/holo/detective(src)
new /obj/item/clothing/gloves/black(src)
+ new /obj/item/gunbox(src)
new /obj/item/weapon/storage/belt/detective(src)
new /obj/item/weapon/storage/box/evidence(src)
new /obj/item/device/radio/headset/headset_sec(src)
diff --git a/code/game/objects/stumble_into_vr.dm b/code/game/objects/stumble_into_vr.dm
index 90a519b2a2..f1612be040 100644
--- a/code/game/objects/stumble_into_vr.dm
+++ b/code/game/objects/stumble_into_vr.dm
@@ -81,7 +81,11 @@
else
M.forceMove(get_turf(src))
-/obj/machinery/door/stumble_into(mob/living/M)
+/obj/machinery/door/window/stumble_into(mob/living/M)
+ ..()
+ bumpopen(M)
+
+/obj/machinery/door/airlock/stumble_into(mob/living/M)
..()
bumpopen(M)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index c5ebcf7587..7f6c093384 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1226,21 +1226,6 @@ var/datum/announcement/minor/admin_min_announcer = new
if(istype(H))
H.regenerate_icons()
-
-/*
- helper proc to test if someone is an event manager or not. Got tired of writing this same check all over the place.
-*/
-/proc/is_eventM(client/C)
-
- if(!istype(C))
- return 0
- if(!C.holder)
- return 0
-
- if(C.holder.rights == R_EVENT)
- return 1
- return 0
-
/proc/get_options_bar(whom, detail = 2, name = 0, link = 1, highlight_special = 1)
if(!whom)
return "(*null*)"
diff --git a/code/modules/admin/admin_secrets.dm b/code/modules/admin/admin_secrets.dm
index b6d0abbe1c..473770ac2b 100644
--- a/code/modules/admin/admin_secrets.dm
+++ b/code/modules/admin/admin_secrets.dm
@@ -100,18 +100,18 @@ var/datum/admin_secrets/admin_secrets = new()
/datum/admin_secret_item/admin_secret
category = /datum/admin_secret_category/admin_secrets
log = 0
- permissions = R_ADMIN
+ permissions = R_ADMIN|R_EVENT
/datum/admin_secret_item/random_event
category = /datum/admin_secret_category/random_events
- permissions = R_FUN
+ permissions = R_FUN|R_EVENT
warn_before_use = 1
/datum/admin_secret_item/fun_secret
category = /datum/admin_secret_category/fun_secrets
- permissions = R_FUN
+ permissions = R_FUN|R_EVENT
warn_before_use = 1
/datum/admin_secret_item/final_solution
category = /datum/admin_secret_category/final_solutions
- permissions = R_FUN|R_SERVER|R_ADMIN
+ permissions = R_FUN|R_SERVER|R_ADMIN|R_EVENT
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 2151bc1ab0..9d3e492698 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -8,7 +8,6 @@ var/list/admin_verbs_default = list(
/client/proc/debug_variables, //allows us to -see- the variables of any instance in the game. +VAREDIT needed to modify,
// /client/proc/check_antagonists, //shows all antags,
// /client/proc/cmd_mod_say,
- /client/proc/cmd_eventM_check_new_players,
// /client/proc/deadchat //toggles deadchat on/off,
// /client/proc/toggle_ahelp_sound,
)
@@ -336,11 +335,11 @@ var/list/admin_verbs_mod = list(
)
var/list/admin_verbs_event_manager = list(
+ /client/proc/cmd_event_say,
/client/proc/cmd_admin_pm_context,
/client/proc/cmd_admin_pm_panel,
/datum/admins/proc/PlayerNotes,
/client/proc/admin_ghost,
- /client/proc/cmd_mod_say,
/datum/admins/proc/show_player_info,
/client/proc/dsay,
/client/proc/cmd_admin_subtle_message,
@@ -454,9 +453,6 @@ var/list/admin_verbs_event_manager = list(
feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-
-
-
/client/proc/admin_ghost()
set category = "Admin"
set name = "Aghost"
@@ -467,7 +463,7 @@ var/list/admin_verbs_event_manager = list(
if(ghost.can_reenter_corpse)
ghost.reenter_corpse()
else
- ghost << "Error: Aghost: Can't reenter corpse, event managers that use adminHUD while aghosting are not permitted to enter their corpse again"
+ to_chat(ghost, "Error: Aghost: Can't reenter corpse.")
return
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 1531790268..92536a6e05 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -363,20 +363,14 @@
PM |
"}
-
-
if(usr.client)
- var/client/C = usr.client
- if(is_eventM(C))
- dat += {" N/A | "}
- else
- switch(is_special_character(M))
- if(0)
- dat += {"Traitor? | "}
- if(1)
- dat += {"Traitor? | "}
- if(2)
- dat += {"Traitor? | "}
+ switch(is_special_character(M))
+ if(0)
+ dat += {"Traitor? | "}
+ if(1)
+ dat += {"Traitor? | "}
+ if(2)
+ dat += {"Traitor? | "}
else
dat += {" N/A | "}
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index 63209f84b4..264e5ad64e 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -36,7 +36,8 @@
if(check_rights(R_ADMIN, 0))
sender_name = "[sender_name]"
for(var/client/C in admins)
- C << "" + create_text_tag("mod", "MOD:", C) + " [sender_name]([admin_jump_link(mob, C.holder)]): [msg]"
+ if(check_rights(R_ADMIN|R_MOD|R_SERVER))
+ C << "" + create_text_tag("mod", "MOD:", C) + " [sender_name]([admin_jump_link(mob, C.holder)]): [msg]"
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -45,7 +46,7 @@
set name = "Esay"
set hidden = 1
- if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER))
+ if(!check_rights(R_ADMIN|R_MOD|R_EVENT|R_SERVER|R_EVENT))
return
msg = sanitize(msg)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index c14c74edd1..b80d95e3c1 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -65,42 +65,6 @@
message_admins("SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]", 1)
feedback_add_details("admin_verb","SMS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/cmd_eventM_check_new_players() //Allows event managers / admins to determine who the newer players are.
- set category = "Admin"
- set name = "Check new Players"
- if(!holder)
- src << "Only staff members may use this command."
-
- var/age = alert(src, "Age check", "Show accounts yonger then _____ days","7", "30" , "All")
-
- if(age == "All")
- age = 9999999
- else
- age = text2num(age)
-
- var/missing_ages = 0
- var/msg = ""
-
- var/highlight_special_characters = 1
- if(is_eventM(usr.client))
- highlight_special_characters = 0
-
- for(var/client/C in clients)
- if(C.player_age == "Requires database")
- missing_ages = 1
- continue
- if(C.player_age < age)
- msg += "[key_name(C, 1, 1, highlight_special_characters)]: account is [C.player_age] days old
"
-
- if(missing_ages)
- src << "Some accounts did not have proper ages set in their clients. This function requires database to be present"
-
- if(msg != "")
- src << browse(msg, "window=Player_age_check")
- else
- src << "No matches for that age range found."
-
-
/client/proc/cmd_admin_world_narrate() // Allows administrators to fluff events a little easier -- TLE
set category = "Special Verbs"
set name = "Global Narrate"
diff --git a/code/modules/busy_space/organizations_vr.dm b/code/modules/busy_space/organizations_vr.dm
index a305af74b0..2e700b6497 100644
--- a/code/modules/busy_space/organizations_vr.dm
+++ b/code/modules/busy_space/organizations_vr.dm
@@ -341,9 +341,9 @@
"Forward Base Sigma-Alpha in ArCon space")
/datum/lore/organization/gov/imperial
- name = "Imperium Auream"
+ name = "Auream Imperium"
short_name = "Imperial"
- desc = "Also known as the \"Golden Empire\", Imperium Auream is a superpower of elf-like humanoid beings who thrive in the southern \
+ desc = "Also known as the \"Golden Empire\", Auream Imperium is a superpower of elf-like humanoid beings who thrive in the southern \
galaxy, presumably somewhere in the mid Centaurus Arm. Having existed in the observation shadow of the galactic core, this \
galactic superpower had remained undiscovered by humanity despite its size until only recently. First contact was made on \
June 15th 2561, when Imperial Navy cartographers stumbled upon the Virgo-Erigone system, far from the influence of the USDF. \
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
index 6bc944552c..c41c482d10 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
@@ -33,10 +33,13 @@
/datum/gear/accessory/wallet_poly
display_name = "wallet, polychromic"
path = /obj/item/weapon/storage/wallet/poly
+ cost = 0 //VOREStation Edit
+
/datum/gear/accessory/wallet/womens
display_name = "wallet, womens"
path = /obj/item/weapon/storage/wallet/womens
+ cost = 0 //VOREStation Edit
/datum/gear/accessory/wallet/womens/New()
..()
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
index 9c3eef63ec..004eb6a022 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
@@ -50,6 +50,11 @@
path = /obj/item/weapon/storage/backpack/saddlebag_common/robust
slot = slot_back
+/datum/gear/accessory/saddlebag_common/vest
+ display_name = "Taur Duty Vest (backpack)"
+ path = /obj/item/weapon/storage/backpack/saddlebag_common/vest
+ slot = slot_back
+
/datum/gear/accessory/khcrystal
display_name = "KH Life Crystal"
path = /obj/item/weapon/storage/box/khcrystal
diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm b/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm
index bec6894dd2..5f89d824c1 100644
--- a/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm
@@ -5,3 +5,11 @@
/datum/gear/eyes/arglassespres
display_name = "AR glasses, prescription"
path = /obj/item/clothing/glasses/omnihud/prescription
+
+/datum/gear/eyes/spiffygogs
+ display_name = "Slick orange goggles"
+ path = /obj/item/clothing/glasses/fluff/spiffygogs
+
+/datum/gear/eyes/science_proper
+ display_name = "Science goggles (no overlay)"
+ path = /obj/item/clothing/glasses/fluff/science_proper
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
index 388760f81c..1078cd0de5 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -94,7 +94,7 @@
/datum/gear/utility/implant/tracking
display_name = "implant, tracking"
path = /obj/item/weapon/implant/tracking/weak
- cost = 10
+ cost = 0 //VOREStation Edit. Changed cost to 0
slot = "implant"
exploitable = 1
diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm
index bc9feacf05..0aa5bf3195 100644
--- a/code/modules/client/preference_setup/vore/02_size.dm
+++ b/code/modules/client/preference_setup/vore/02_size.dm
@@ -9,8 +9,9 @@
var/size_multiplier = RESIZE_NORMAL
// Body weight stuff.
var/weight_vr = 137 // bodyweight of character (pounds, because I'm not doing the math again -Spades)
- var/weight_gain = 100 // bodyweight of character (pounds, because I'm not doing the math again -Spades)
- var/weight_loss = 50 // bodyweight of character (pounds, because I'm not doing the math again -Spades)
+ var/weight_gain = 100 // Weight gain rate.
+ var/weight_loss = 50 // Weight loss rate.
+ var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon. Default sharp.
// Definition of the stuff for Sizing
/datum/category_item/player_setup_item/vore/size
@@ -22,28 +23,34 @@
S["weight_vr"] >> pref.weight_vr
S["weight_gain"] >> pref.weight_gain
S["weight_loss"] >> pref.weight_loss
+ S["fuzzy"] >> pref.fuzzy
/datum/category_item/player_setup_item/vore/size/save_character(var/savefile/S)
S["size_multiplier"] << pref.size_multiplier
S["weight_vr"] << pref.weight_vr
S["weight_gain"] << pref.weight_gain
S["weight_loss"] << pref.weight_loss
+ S["fuzzy"] << pref.fuzzy
/datum/category_item/player_setup_item/vore/size/sanitize_character()
pref.size_multiplier = pref.size_multiplier
- pref.weight_vr = sanitize_integer(pref.weight_vr, WEIGHT_MIN, WEIGHT_MAX, initial(pref.weight_vr))
- pref.weight_gain = sanitize_integer(pref.weight_gain, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_gain))
- pref.weight_loss = sanitize_integer(pref.weight_loss, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_loss))
+ pref.weight_vr = sanitize_integer(pref.weight_vr, WEIGHT_MIN, WEIGHT_MAX, initial(pref.weight_vr))
+ pref.weight_gain = sanitize_integer(pref.weight_gain, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_gain))
+ pref.weight_loss = sanitize_integer(pref.weight_loss, WEIGHT_CHANGE_MIN, WEIGHT_CHANGE_MAX, initial(pref.weight_loss))
+ pref.fuzzy = pref.fuzzy
/datum/category_item/player_setup_item/vore/size/copy_to_mob(var/mob/living/carbon/human/character)
character.resize(pref.size_multiplier, FALSE)
character.weight = pref.weight_vr
character.weight_gain = pref.weight_gain
character.weight_loss = pref.weight_loss
+ character.fuzzy = pref.fuzzy
+ character.appearance_flags |= pref.fuzzy*PIXEL_SCALE
/datum/category_item/player_setup_item/vore/size/content(var/mob/user)
. += "
"
. += "Scale: [round(pref.size_multiplier*100)]%
"
+ . += "Scaled Appearance: [pref.fuzzy ? "Sharp" : "Fuzzy"]
"
. += "
"
. += "Relative Weight: [pref.weight_vr]
"
. += "Weight Gain Rate: [pref.weight_gain]
"
@@ -60,6 +67,10 @@
pref.size_multiplier = (new_size/100)
return TOPIC_REFRESH_UPDATE_PREVIEW
+ else if(href_list["toggle_fuzzy"])
+ pref.fuzzy = pref.fuzzy ? 0 : 1;
+ return TOPIC_REFRESH
+
else if(href_list["weight"])
var/new_weight = input(user, "Choose your character's relative body weight.\n\
This measurement should be set relative to a normal 5'10'' person's body and not the actual size of your character.\n\
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index 5c4ba8f3c6..84a055eb0d 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -12,16 +12,16 @@
mannequin.dir = NORTH
var/icon/stamp = getFlatIcon(mannequin)
stamp.Scale(stamp.Width()*size_multiplier,stamp.Height()*size_multiplier)
- preview_icon.Blend(stamp, ICON_OVERLAY, 65-stamp.Width()/2, 5)
+ preview_icon.Blend(stamp, ICON_OVERLAY, 64-stamp.Width()/2, 5)
mannequin.dir = WEST
stamp = getFlatIcon(mannequin)
stamp.Scale(stamp.Width()*size_multiplier,stamp.Height()*size_multiplier)
- preview_icon.Blend(stamp, ICON_OVERLAY, 15-stamp.Width()/2, 5)
+ preview_icon.Blend(stamp, ICON_OVERLAY, 16-stamp.Width()/2, 5)
mannequin.dir = SOUTH
stamp = getFlatIcon(mannequin)
stamp.Scale(stamp.Width()*size_multiplier,stamp.Height()*size_multiplier)
- preview_icon.Blend(stamp, ICON_OVERLAY, 115-stamp.Width()/2, 5)
+ preview_icon.Blend(stamp, ICON_OVERLAY, 112-stamp.Width()/2, 5)
preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser.
\ No newline at end of file
diff --git a/code/modules/economy/economy_misc.dm b/code/modules/economy/economy_misc.dm
index a2cc9aafb9..84a187ef91 100644
--- a/code/modules/economy/economy_misc.dm
+++ b/code/modules/economy/economy_misc.dm
@@ -49,6 +49,7 @@
/var/list/economic_species_modifier = list(
/datum/species/human = 10,
+ /datum/species/human/vatgrown = 10,
/datum/species/skrell = 12,
/datum/species/unathi = 7,
/datum/species/tajaran = 7,
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index 5195a8c198..804a146f7e 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -1,7 +1,7 @@
//This file was auto-corrected by findeclaration.exe on 29/05/2012 15:03:04
/datum/event/ionstorm
- var/botEmagChance = 0.5
+ var/botEmagChance = 0 //VOREStation Edit
var/list/players = list()
/datum/event/ionstorm/announce()
diff --git a/code/modules/integrated_electronics/core/helpers.dm b/code/modules/integrated_electronics/core/helpers.dm
index edfa6b1a86..e31b26fbb1 100644
--- a/code/modules/integrated_electronics/core/helpers.dm
+++ b/code/modules/integrated_electronics/core/helpers.dm
@@ -18,7 +18,9 @@
else
io_list.Add(new io_type(src, io_entry, default_data))
-/obj/item/integrated_circuit/proc/set_pin_data(var/pin_type, var/pin_number, var/new_data)
+/obj/item/integrated_circuit/proc/set_pin_data(var/pin_type, var/pin_number, datum/new_data)
+ if (istype(new_data) && !isweakref(new_data))
+ new_data = weakref(new_data)
var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number)
return pin.write_data_to_pin(new_data)
diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm
index c417c3e4fd..0a516e360a 100644
--- a/code/modules/integrated_electronics/passive/power.dm
+++ b/code/modules/integrated_electronics/passive/power.dm
@@ -29,6 +29,28 @@
if(assembly)
assembly.give_power(adjusted_power)
+/obj/item/integrated_circuit/passive/power/starter
+ name = "starter"
+ desc = "This tiny circuit will send a pulse right after device is turned on, or when power is restored."
+ icon_state = "led"
+ complexity = 1
+ activators = list("pulse out" = IC_PINTYPE_PULSE_OUT)
+ origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ var/is_charge=0
+
+/obj/item/integrated_circuit/passive/power/starter/make_energy()
+ if(assembly.battery)
+ if(assembly.battery.charge)
+ if(!is_charge)
+ activate_pin(1)
+ is_charge=1
+ else
+ is_charge=0
+ else
+ is_charge=0
+ return FALSE
+
// For implants.
/obj/item/integrated_circuit/passive/power/metabolic_siphon
name = "metabolic siphon"
@@ -82,6 +104,44 @@
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2)
spawn_flags = IC_SPAWN_RESEARCH
var/power_amount = 250
+//fuel cell
+
+/obj/item/integrated_circuit/passive/power/chemical_cell
+ name = "fuel cell"
+ desc = "Produces electricity from chemicals."
+ icon_state = "chemical_cell"
+ extended_desc = "This is effectively an internal beaker. It will consume and produce power from phoron, slime jelly, welding fuel, carbon,\
+ ethanol, nutriments and blood, in order of decreasing efficiency. It will consume fuel only if the battery can take more energy."
+ flags = OPENCONTAINER
+ complexity = 4
+ inputs = list()
+ outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
+ activators = list()
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
+ var/volume = 60
+ var/list/fuel = list("phoron" = 50000, "slimejelly" = 25000, "fuel" = 15000, "carbon" = 10000, "ethanol"= 10000, "nutriment" =8000, "blood" = 5000)
+
+/obj/item/integrated_circuit/passive/power/chemical_cell/New()
+ ..()
+ create_reagents(volume)
+
+/obj/item/integrated_circuit/passive/power/chemical_cell/interact(mob/user)
+ set_pin_data(IC_OUTPUT, 2, weakref(src))
+ push_data()
+ ..()
+
+/obj/item/integrated_circuit/passive/power/chemical_cell/on_reagent_change()
+ set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
+ push_data()
+
+/obj/item/integrated_circuit/passive/power/chemical_cell/make_energy()
+ if(assembly)
+ for(var/I in fuel)
+ if((assembly.battery.maxcharge-assembly.battery.charge) / CELLRATE > fuel[I])
+ if(reagents.remove_reagent(I, 1))
+ assembly.give_power(fuel[I])
+
// For really fat machines.
/obj/item/integrated_circuit/passive/power/relay/large
diff --git a/code/modules/integrated_electronics/subtypes/data_transfer.dm b/code/modules/integrated_electronics/subtypes/data_transfer.dm
index 7b5846eb8d..e490ccd27a 100644
--- a/code/modules/integrated_electronics/subtypes/data_transfer.dm
+++ b/code/modules/integrated_electronics/subtypes/data_transfer.dm
@@ -27,13 +27,10 @@
/obj/item/integrated_circuit/transfer/multiplexer/do_work()
var/input_index = get_pin_data(IC_INPUT, 1)
- var/output = null
if(!isnull(input_index) && (input_index >= 1 && input_index < inputs.len))
- output = get_pin_data(IC_INPUT, input_index + 1)
-
- set_pin_data(IC_OUTPUT, 1, output)
- push_data()
+ set_pin_data(IC_OUTPUT, 1,get_pin_data(IC_INPUT, input_index + 1))
+ push_data()
activate_pin(2)
/obj/item/integrated_circuit/transfer/multiplexer/medium
@@ -79,10 +76,8 @@
/obj/item/integrated_circuit/transfer/demultiplexer/do_work()
var/output_index = get_pin_data(IC_INPUT, 1)
- var/output = get_pin_data(IC_INPUT, 2)
-
for(var/i = 1 to outputs.len)
- set_pin_data(IC_OUTPUT, i, i == output_index ? output : null)
+ set_pin_data(IC_OUTPUT, i, i == output_index ? get_pin_data(IC_INPUT, 2) : null)
activate_pin(2)
@@ -101,4 +96,51 @@
name = "sixteen demultiplexer"
icon_state = "dmux16"
w_class = ITEMSIZE_SMALL
+ number_of_outputs = 16
+
+/obj/item/integrated_circuit/transfer/pulsedemultiplexer
+ name = "two pulse demultiplexer"
+ desc = "Selector switch to choose the pin to be activated by number."
+ extended_desc = "The first input pin is used to select which of the pulse out pins will be activated after activation of the circuit. \
+ If the output selection is outside the valid range then no output is given."
+ complexity = 2
+ icon_state = "dmux2"
+ inputs = list("output selection" = IC_PINTYPE_NUMBER)
+ outputs = list()
+ activators = list("select" = IC_PINTYPE_PULSE_IN)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ power_draw_per_use = 4
+ var/number_of_outputs = 2
+
+/obj/item/integrated_circuit/transfer/pulsedemultiplexer/New()
+ for(var/i = 1 to number_of_outputs)
+ // outputs += "output [i]"
+ activators["output [i]"] = IC_PINTYPE_PULSE_OUT
+ complexity = number_of_outputs
+
+ ..()
+ desc += " It has [number_of_outputs] output pins."
+ extended_desc += " This pulse demultiplexer has a range from 1 to [activators.len - 1]."
+
+/obj/item/integrated_circuit/transfer/pulsedemultiplexer/do_work()
+ var/output_index = get_pin_data(IC_INPUT, 1)
+
+ if(output_index == Clamp(output_index, 1, number_of_outputs))
+ activate_pin(round(output_index + 1 ,1))
+
+/obj/item/integrated_circuit/transfer/pulsedemultiplexer/medium
+ name = "four pulse demultiplexer"
+ icon_state = "dmux4"
+ number_of_outputs = 4
+
+/obj/item/integrated_circuit/transfer/pulsedemultiplexer/large
+ name = "eight pulse demultiplexer"
+ icon_state = "dmux8"
+ w_class = ITEMSIZE_SMALL
+ number_of_outputs = 8
+
+/obj/item/integrated_circuit/transfer/pulsedemultiplexer/huge
+ name = "sixteen pulse demultiplexer"
+ icon_state = "dmux16"
+ w_class = ITEMSIZE_SMALL
number_of_outputs = 16
\ No newline at end of file
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index 00e5bf2ea4..8da4fad6d8 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -110,8 +110,10 @@
/obj/item/integrated_circuit/input/adv_med_scanner
- name = "integrated advanced medical analyser"
- desc = "A very small version of the medbot's medical analyser. This allows the machine to know how healthy someone is. \
+
+ name = "integrated advanced medical analyzer"
+ desc = "A very small version of the medibot's medical analyzer. This allows the machine to know how healthy someone is. \
+
This type is much more precise, allowing the machine to know much more about the target than a normal analyzer."
icon_state = "medscan_adv"
complexity = 12
@@ -134,7 +136,9 @@
var/mob/living/carbon/human/H = get_pin_data_as_type(IC_INPUT, 1, /mob/living/carbon/human)
if(!istype(H)) //Invalid input
return
+
if(H in view(get_turf(H))) // Like medbot's analyzer it can be used in range..
+
var/total_health = round(H.health/H.getMaxHealth(), 0.01)*100
var/missing_health = H.getMaxHealth() - H.health
@@ -336,6 +340,7 @@
// Set the pins so when someone sees them, they won't show as null
set_pin_data(IC_INPUT, 1, frequency)
set_pin_data(IC_INPUT, 2, code)
+ push_data()
/obj/item/integrated_circuit/input/signaler/Destroy()
if(radio_controller)
@@ -464,6 +469,7 @@
set_pin_data(IC_OUTPUT, 1, null)
set_pin_data(IC_OUTPUT, 2, null)
if(!T)
+ push_data()
return
set_pin_data(IC_OUTPUT, 1, T.x)
@@ -486,7 +492,7 @@
"speaker" = IC_PINTYPE_STRING,
"message" = IC_PINTYPE_STRING
)
- activators = list("on message received" = IC_PINTYPE_PULSE_IN, "on translation" = IC_PINTYPE_PULSE_OUT)
+ activators = list("on message received" = IC_PINTYPE_PULSE_OUT, "on translation" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
power_draw_per_use = 15
@@ -618,7 +624,6 @@
push_data()
activate_pin(2)
-
/obj/item/integrated_circuit/input/atmo_scanner
name = "integrated atmospheric analyser"
desc = "The same atmospheric analysis module that is integrated into every PDA. \
@@ -850,4 +855,4 @@
else
set_pin_data(IC_OUTPUT, 1, 0)
push_data()
- activate_pin(2)
\ No newline at end of file
+ activate_pin(2)
diff --git a/code/modules/integrated_electronics/subtypes/lists.dm b/code/modules/integrated_electronics/subtypes/lists.dm
index 84e0724bb9..943141b071 100644
--- a/code/modules/integrated_electronics/subtypes/lists.dm
+++ b/code/modules/integrated_electronics/subtypes/lists.dm
@@ -52,12 +52,123 @@
push_data()
activate_pin(2)
+/obj/item/integrated_circuit/list/search
+ name = "search circuit"
+ desc = "This circuit will give index of desired element in the list."
+ extended_desc = "Search will start at 1 position and will return first matching position."
+ inputs = list(
+ "list" = IC_PINTYPE_LIST,
+ "item" = IC_PINTYPE_ANY
+ )
+ outputs = list(
+ "index" = IC_PINTYPE_NUMBER
+ )
+ icon_state = "addition"
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/list/search/do_work()
+ var/list/input_list = get_pin_data(IC_INPUT, 1)
+ var/item = get_pin_data(IC_INPUT, 2)
+ set_pin_data(IC_OUTPUT, 1, input_list.Find(item))
+ push_data()
+ activate_pin(2)
+
+/obj/item/integrated_circuit/list/at
+ name = "at circuit"
+ desc = "This circuit will pick an element from a list by index."
+ extended_desc = "If there is no element with such index, result will be null."
+ inputs = list(
+ "list" = IC_PINTYPE_LIST,
+ "index" = IC_PINTYPE_NUMBER
+ )
+ outputs = list("item" = IC_PINTYPE_ANY)
+ icon_state = "addition"
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/list/at/do_work()
+ var/list/input_list = get_pin_data(IC_INPUT, 1)
+ var/index = get_pin_data(IC_INPUT, 2)
+ var/item = input_list[index]
+ set_pin_data(IC_OUTPUT, 1, item)
+ push_data()
+ activate_pin(2)
+
+/obj/item/integrated_circuit/list/delete
+ name = "delete circuit"
+ desc = "This circuit will delete the element from a list by index."
+ extended_desc = "If there is no element with such index, result list will be unchanged."
+ inputs = list(
+ "list" = IC_PINTYPE_LIST,
+ "index" = IC_PINTYPE_NUMBER
+ )
+ outputs = list(
+ "item" = IC_PINTYPE_LIST
+ )
+ icon_state = "addition"
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/list/delete/do_work()
+ var/list/input_list = get_pin_data(IC_INPUT, 1)
+ var/list/red_list = list()
+ var/index = get_pin_data(IC_INPUT, 2)
+ var/j = 0
+ for(var/I in input_list)
+ j = j + 1
+ if(j != index)
+ red_list.Add(I)
+ set_pin_data(IC_OUTPUT, 1, red_list)
+ push_data()
+ activate_pin(2)
+
+/obj/item/integrated_circuit/list/write
+ name = "write circuit"
+ desc = "This circuit will write element in list with given index."
+ extended_desc = "If there is no element with such index, it will give the same list, as before."
+ inputs = list(
+ "list" = IC_PINTYPE_LIST,
+ "index" = IC_PINTYPE_NUMBER,
+ "item" = IC_PINTYPE_ANY
+ )
+ outputs = list(
+ "redacted list" = IC_PINTYPE_LIST
+ )
+ icon_state = "addition"
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/list/write/do_work()
+ var/list/input_list = get_pin_data(IC_INPUT, 1)
+ var/index = get_pin_data(IC_INPUT, 2)
+ var/item = get_pin_data(IC_INPUT, 3)
+ input_list[index] = item
+ set_pin_data(IC_OUTPUT, 1, input_list)
+ push_data()
+ activate_pin(2)
+
+obj/item/integrated_circuit/list/len
+ name = "len circuit"
+ desc = "This circuit will give length of the list."
+ inputs = list(
+ "list" = IC_PINTYPE_LIST,
+ )
+ outputs = list(
+ "item" = IC_PINTYPE_NUMBER
+ )
+ icon_state = "addition"
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+
+/obj/item/integrated_circuit/list/len/do_work()
+ var/list/input_list = get_pin_data(IC_INPUT, 1)
+ set_pin_data(IC_OUTPUT, 1, input_list.len)
+ push_data()
+ activate_pin(2)
+
+
/obj/item/integrated_circuit/list/jointext
name = "join text circuit"
desc = "This circuit will add all elements of a list into one string, seperated by a character."
extended_desc = "Default settings will encode the entire list into a string."
inputs = list(
- "list to join" = IC_PINTYPE_LIST,
+ "list to join" = IC_PINTYPE_LIST,//
"delimiter" = IC_PINTYPE_CHAR,
"start" = IC_PINTYPE_NUMBER,
"end" = IC_PINTYPE_NUMBER
diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm
index fa4fd9ded6..40f617e62e 100644
--- a/code/modules/integrated_electronics/subtypes/memory.dm
+++ b/code/modules/integrated_electronics/subtypes/memory.dm
@@ -40,8 +40,15 @@
O.push_data()
activate_pin(2)
+/obj/item/integrated_circuit/memory/tiny
+ name = "small memory circuit"
+ desc = "This circuit can store two pieces of data."
+ icon_state = "memory2"
+ power_draw_per_use = 2
+ number_of_pins = 2
+
/obj/item/integrated_circuit/memory/medium
- name = "memory circuit"
+ name = "medium memory circuit"
desc = "This circuit can store four pieces of data."
icon_state = "memory4"
power_draw_per_use = 2
diff --git a/code/modules/integrated_electronics/subtypes/power.dm b/code/modules/integrated_electronics/subtypes/power.dm
index f528434129..e1e3f56c89 100644
--- a/code/modules/integrated_electronics/subtypes/power.dm
+++ b/code/modules/integrated_electronics/subtypes/power.dm
@@ -37,9 +37,7 @@
amount_to_move = 20000
/obj/item/integrated_circuit/power/transmitter/do_work()
- set_pin_data(IC_OUTPUT, 1, null)
- set_pin_data(IC_OUTPUT, 2, null)
- set_pin_data(IC_OUTPUT, 3, null)
+
var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
if(AM)
if(!assembly)
@@ -72,7 +70,15 @@
set_pin_data(IC_OUTPUT, 2, cell.maxcharge)
set_pin_data(IC_OUTPUT, 3, cell.percent())
activate_pin(2)
+ push_data()
return TRUE
+ else
+ set_pin_data(IC_OUTPUT, 1, null)
+ set_pin_data(IC_OUTPUT, 2, null)
+ set_pin_data(IC_OUTPUT, 3, null)
+ activate_pin(2)
+ push_data()
+ return FALSE
return FALSE
/obj/item/integrated_circuit/power/transmitter/large/do_work()
diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm
index 25a80c2a28..e6d65bd07a 100644
--- a/code/modules/integrated_electronics/subtypes/reagents.dm
+++ b/code/modules/integrated_electronics/subtypes/reagents.dm
@@ -1,6 +1,8 @@
/obj/item/integrated_circuit/reagent
category_text = "Reagent"
var/volume = 0
+ unacidable = 1
+ phoronproof = 1
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
/obj/item/integrated_circuit/reagent/New()
@@ -18,13 +20,23 @@
complexity = 20
cooldown_per_use = 30 SECONDS
inputs = list()
- outputs = list()
- activators = list("create smoke" = IC_PINTYPE_PULSE_IN)
+ outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
+ activators = list("create smoke" = IC_PINTYPE_PULSE_IN,"on smoked" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIO = 3)
volume = 100
power_draw_per_use = 20
+/obj/item/integrated_circuit/reagent/smoke/on_reagent_change()
+ set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
+ push_data()
+
+
+/obj/item/integrated_circuit/reagent/smoke/interact(mob/user)
+ set_pin_data(IC_OUTPUT, 2, weakref(src))
+ push_data()
+ ..()
+
/obj/item/integrated_circuit/reagent/smoke/do_work()
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
var/datum/effect/effect/system/smoke_spread/chem/smoke_system = new()
@@ -33,52 +45,141 @@
for(var/i = 1 to 8)
smoke_system.start()
reagents.clear_reagents()
+ activate_pin(2)
/obj/item/integrated_circuit/reagent/injector
name = "integrated hypo-injector"
desc = "This scary looking thing is able to pump liquids into whatever it's pointed at."
icon_state = "injector"
extended_desc = "This autoinjector can push reagents into another container or someone else outside of the machine. The target \
- must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing."
+ must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing. A negative amount makes the injector draw out reagents."
flags = OPENCONTAINER
complexity = 20
cooldown_per_use = 6 SECONDS
inputs = list("target" = IC_PINTYPE_REF, "injection amount" = IC_PINTYPE_NUMBER)
inputs_default = list("2" = 5)
- outputs = list()
- activators = list("inject" = IC_PINTYPE_PULSE_IN)
+ outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
+ activators = list("inject" = IC_PINTYPE_PULSE_IN, "on injected" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT)
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
volume = 30
power_draw_per_use = 15
+ var/direc = 1
+ var/transfer_amount = 10
+
+/obj/item/integrated_circuit/reagent/injector/interact(mob/user)
+ set_pin_data(IC_OUTPUT, 2, weakref(src))
+ push_data()
+ ..()
+
+
+/obj/item/integrated_circuit/reagent/injector/on_reagent_change()
+ set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
+ push_data()
+
+/obj/item/integrated_circuit/reagent/injector/on_data_written()
+ var/new_amount = get_pin_data(IC_INPUT, 2)
+ if(new_amount < 0)
+ new_amount = -new_amount
+ direc = 0
+ else
+ direc = 1
+ if(isnum(new_amount))
+ new_amount = Clamp(new_amount, 0, volume)
+ transfer_amount = new_amount
-/obj/item/integrated_circuit/reagent/injector/proc/inject_amount()
- var/amount = get_pin_data(IC_INPUT, 2)
- if(isnum(amount))
- return Clamp(amount, 0, 30)
/obj/item/integrated_circuit/reagent/injector/do_work()
set waitfor = 0 // Don't sleep in a proc that is called by a processor without this set, otherwise it'll delay the entire thing
-
var/atom/movable/AM = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
if(!istype(AM)) //Invalid input
+ activate_pin(3)
return
- if(!reagents.total_volume) // Empty
- return
- if(AM.can_be_injected_by(src))
- if(isliving(AM))
- var/mob/living/L = AM
- var/turf/T = get_turf(AM)
- T.visible_message("[src] is trying to inject [L]!")
- sleep(3 SECONDS)
- if(!L.can_be_injected_by(src))
+
+ if(direc == 1)
+
+ if(!istype(AM)) //Invalid input
+ activate_pin(3)
+ return
+ if(!reagents.total_volume) // Empty
+ activate_pin(3)
+ return
+ if(AM.can_be_injected_by(src))
+ if(isliving(AM))
+ var/mob/living/L = AM
+ var/turf/T = get_turf(AM)
+ T.visible_message("[src] is trying to inject [L]!")
+ sleep(3 SECONDS)
+ if(!L.can_be_injected_by(src))
+ activate_pin(3)
+ return
+ var/contained = reagents.get_reagents()
+ var/trans = reagents.trans_to_mob(L, transfer_amount, CHEM_BLOOD)
+ message_admins("[src] injected \the [L] with [trans]u of [contained].")
+ to_chat(AM, "You feel a tiny prick!")
+ visible_message("[src] injects [L]!")
+ else
+ reagents.trans_to(AM, transfer_amount)
+ else
+
+ if(reagents.total_volume >= volume) // Full
+ activate_pin(3)
+ return
+ var/obj/target = AM
+ if(!target.reagents)
+ activate_pin(3)
+ return
+ var/turf/TS = get_turf(src)
+ var/turf/TT = get_turf(AM)
+ if(!TS.Adjacent(TT))
+ activate_pin(3)
+ return
+ var/tramount = Clamp(min(transfer_amount, reagents.maximum_volume - reagents.total_volume), 0, reagents.maximum_volume)
+ if(ismob(target))//Blood!
+ if(istype(target, /mob/living/carbon))
+ var/mob/living/carbon/T = target
+ if(!T.dna)
+ if(T.reagents.trans_to_obj(src, tramount))
+ activate_pin(2)
+ else
+ activate_pin(3)
+ return
+ if(NOCLONE in T.mutations) //target done been et, no more blood in him
+ if(T.reagents.trans_to_obj(src, tramount))
+ activate_pin(2)
+ else
+ activate_pin(3)
+ return
+ return
+ var/datum/reagent/B
+ if(istype(T, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = T
+ if(H.species && !H.should_have_organ(O_HEART))
+ H.reagents.trans_to_obj(src, tramount)
+ else
+ B = T.take_blood(src, tramount)
+ else
+ B = T.take_blood(src,tramount)
+ if (B)
+ reagents.reagent_list |= B
+ reagents.update_total()
+ on_reagent_change()
+ reagents.handle_reactions()
+ B = null
+ visible_message( "Machine takes a blood sample from [target].")
+ else
+ activate_pin(3)
return
- var/contained = reagents.get_reagents()
- var/trans = reagents.trans_to_mob(L, inject_amount(), CHEM_BLOOD)
- message_admins("[src] injected \the [L] with [trans]u of [contained].")
- to_chat(AM, "You feel a tiny prick!")
- visible_message("[src] injects [L]!")
- else
- reagents.trans_to(AM, inject_amount())
+
+ else //if not mob
+ if(!target.reagents.total_volume)
+ visible_message( "[target] is empty.")
+ activate_pin(3)
+ return
+ target.reagents.trans_to_obj(src, tramount)
+ activate_pin(2)
+
+
+
/obj/item/integrated_circuit/reagent/pump
name = "reagent pump"
@@ -96,11 +197,17 @@
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
var/transfer_amount = 10
+ var/direc = 1
power_draw_per_use = 10
/obj/item/integrated_circuit/reagent/pump/on_data_written()
var/new_amount = get_pin_data(IC_INPUT, 3)
- if(!isnull(new_amount))
+ if(new_amount < 0)
+ new_amount = -new_amount
+ direc = 0
+ else
+ direc = 1
+ if(isnum(new_amount))
new_amount = Clamp(new_amount, 0, 50)
transfer_amount = new_amount
@@ -111,17 +218,23 @@
if(!istype(source) || !istype(target)) //Invalid input
return
var/turf/T = get_turf(src)
- if(source.Adjacent(T) && target.Adjacent(T))
+ var/turf/TS = get_turf(source)
+ var/turf/TT = get_turf(target)
+ if(TS.Adjacent(T) && TT.Adjacent(T))
if(!source.reagents || !target.reagents)
return
if(ismob(source) || ismob(target))
return
if(!source.is_open_container() || !target.is_open_container())
return
- if(!target.reagents.get_free_space())
- return
-
- source.reagents.trans_to(target, transfer_amount)
+ if(direc)
+ if(!target.reagents.get_free_space())
+ return
+ source.reagents.trans_to(target, transfer_amount)
+ else
+ if(!source.reagents.get_free_space())
+ return
+ target.reagents.trans_to(source, transfer_amount)
activate_pin(2)
/obj/item/integrated_circuit/reagent/storage
@@ -132,12 +245,18 @@
flags = OPENCONTAINER
complexity = 4
inputs = list()
- outputs = list("volume used" = IC_PINTYPE_NUMBER)
+ outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF)
activators = list()
spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
volume = 60
+
+/obj/item/integrated_circuit/reagent/storage/interact(mob/user)
+ set_pin_data(IC_OUTPUT, 2, weakref(src))
+ push_data()
+ ..()
+
/obj/item/integrated_circuit/reagent/storage/on_reagent_change()
set_pin_data(IC_OUTPUT, 1, reagents.total_volume)
push_data()
@@ -150,4 +269,95 @@
flags = OPENCONTAINER | NOREACT
complexity = 8
spawn_flags = IC_SPAWN_RESEARCH
- origin_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
\ No newline at end of file
+ origin_tech = list(TECH_MATERIALS = 4, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
+
+/obj/item/integrated_circuit/reagent/storage/big
+ name = "big reagent storage"
+ desc = "Stores liquid inside, and away from electrical components. Can store up to 180u."
+ icon_state = "reagent_storage_big"
+ extended_desc = "This is effectively an internal beaker."
+ flags = OPENCONTAINER
+ complexity = 16
+ volume = 180
+ spawn_flags = IC_SPAWN_RESEARCH
+ origin_tech = list(TECH_MATERIALS = 3, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
+
+/obj/item/integrated_circuit/reagent/storage/scan
+ name = "reagent scanner"
+ desc = "Stores liquid inside, and away from electrical components. Can store up to 60u. On pulse this beaker will send list of contained reagents."
+ icon_state = "reagent_scan"
+ extended_desc = "Mostly useful for reagent filter."
+ flags = OPENCONTAINER
+ complexity = 8
+ outputs = list("volume used" = IC_PINTYPE_NUMBER,"self reference" = IC_PINTYPE_REF,"list of reagents" = IC_PINTYPE_LIST)
+ activators = list("scan" = IC_PINTYPE_PULSE_IN)
+ spawn_flags = IC_SPAWN_RESEARCH
+ origin_tech = list(TECH_MATERIALS = 3, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
+
+/obj/item/integrated_circuit/reagent/storage/scan/do_work()
+ var/cont[0]
+ for(var/datum/reagent/RE in reagents.reagent_list)
+ cont += RE.id
+ set_pin_data(IC_OUTPUT, 3, cont)
+ push_data()
+
+
+/obj/item/integrated_circuit/reagent/filter
+ name = "reagent filter"
+ desc = "Filtering liquids by list of desired or unwanted reagents."
+ icon_state = "reagent_filter"
+ extended_desc = "This is a filter which will move liquids from the source ref to the target ref. \
+ It will move all reagents, except list, given in fourth pin if amount value is positive.\
+ Or it will move only desired reagents if amount is negative, The third pin determines \
+ how much reagent is moved per pulse, between 0 and 50. Amount is given for each separate reagent."
+ flags = OPENCONTAINER
+ complexity = 8
+ inputs = list("source" = IC_PINTYPE_REF, "target" = IC_PINTYPE_REF, "injection amount" = IC_PINTYPE_NUMBER, "list of reagents" = IC_PINTYPE_LIST)
+ inputs_default = list("3" = 5)
+ outputs = list()
+ activators = list("transfer reagents" = IC_PINTYPE_PULSE_IN, "on transfer" = IC_PINTYPE_PULSE_OUT)
+ spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH
+ origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2)
+ var/transfer_amount = 10
+ var/direc = 1
+ power_draw_per_use = 10
+
+/obj/item/integrated_circuit/reagent/filter/on_data_written()
+ var/new_amount = get_pin_data(IC_INPUT, 3)
+ if(new_amount < 0)
+ new_amount = -new_amount
+ direc = 0
+ else
+ direc = 1
+ if(isnum(new_amount))
+ new_amount = Clamp(new_amount, 0, 50)
+ transfer_amount = new_amount
+
+/obj/item/integrated_circuit/reagent/filter/do_work()
+ var/atom/movable/source = get_pin_data_as_type(IC_INPUT, 1, /atom/movable)
+ var/atom/movable/target = get_pin_data_as_type(IC_INPUT, 2, /atom/movable)
+ var/list/demand = get_pin_data(IC_INPUT, 4)
+ if(!istype(source) || !istype(target)) //Invalid input
+ return
+ var/turf/T = get_turf(src)
+ if(source.Adjacent(T) && target.Adjacent(T))
+ if(!source.reagents || !target.reagents)
+ return
+ if(ismob(source) || ismob(target))
+ return
+ if(!source.is_open_container() || !target.is_open_container())
+ return
+ if(!target.reagents.get_free_space())
+ return
+ for(var/datum/reagent/G in source.reagents.reagent_list)
+ if (!direc)
+ if(G.id in demand)
+ source.reagents.trans_id_to(target, G.id, transfer_amount)
+ else
+ if(!(G.id in demand))
+ source.reagents.trans_id_to(target, G.id, transfer_amount)
+ activate_pin(2)
+ push_data()
+
+
+
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 7ca7f74737..a84eae381b 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -321,19 +321,18 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!client)
return
- var/mentor = is_eventM(usr.client)
- if(!config.antag_hud_allowed && (!client.holder || mentor))
+ if(!config.antag_hud_allowed && !client.holder)
src << "Admins have disabled this for this round."
return
var/mob/observer/dead/M = src
if(jobban_isbanned(M, "AntagHUD"))
src << "You have been banned from using this feature"
return
- if(config.antag_hud_restricted && !M.has_enabled_antagHUD && (!client.holder || mentor))
+ if(config.antag_hud_restricted && !M.has_enabled_antagHUD && !client.holder)
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
if(response == "No") return
M.can_reenter_corpse = 0
- if(!M.has_enabled_antagHUD && (!client.holder || mentor))
+ if(!M.has_enabled_antagHUD && !client.holder)
M.has_enabled_antagHUD = 1
if(M.antagHUD)
M.antagHUD = 0
diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
index 71fd0d7a61..b79773c4a2 100644
--- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
@@ -6,6 +6,8 @@
var/hard_vore_enabled = 0 //Determines if the person has the hardvore verb or not.
var/metabolism = 0.0015
var/can_fly = 0 //Determines if the species can fly if they have wings.
+ var/lightweight = 0 //Oof! Nonhelpful bump stumbles.
+ var/trashcan = 0 //It's always sunny in the wrestling ring.
/datum/species/custom
name = "Custom Species"
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 8bbd84bf5e..3408e09bc0 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
@@ -754,6 +754,9 @@
if(!C.wing_style) //The species var isn't taken into account here, as it's only purpose is to give this proc to a person.
to_chat(src, "You don't have wings!")
return
+ if(!C.flying)
+ to_chat(src, "You must be flying to hover!")
+ return
if(C.incapacitated(INCAPACITATION_ALL))
to_chat(src, "You cannot hover in your current state!")
return
@@ -772,4 +775,4 @@
spawn(6) //.6 seconds.
C.anchored = 0
else
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index 33777448d5..edfa941d75 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -75,9 +75,11 @@
if(H.feral == 0)
H << "Something in your mind flips, your instincts taking over, no longer able to fully comprehend your surroundings as survival becomes your primary concern - you must feed, survive, there is nothing else. Hunt. Eat. Hide. Repeat."
log_and_message_admins("has gone feral due to hunger.", H)
+ H.feral += 5 //just put them over the threshold by a decent amount for the first chunk.
if(H.stat == CONSCIOUS)
H.emote("twitch")
- H.feral = min(150-H.nutrition, H.feral+1) //Feralness increases while this hungry, capped at 50-150 depending on hunger.
+ if(H.feral + H.nutrition < 150) //Feralness increases while this hungry, capped at 50-150 depending on hunger.
+ H.feral += 1
// If they're hurt, chance of snapping. Not if they're straight-up KO'd though.
if (H.stat == CONSCIOUS && H.traumatic_shock >=min(60, H.nutrition/10)) //at 360 nutrition, this is 30 brute/burn, or 18 halloss. Capped at 50 brute/30 halloss - if they take THAT much, no amount of satiation will help them. Also they're fat.
diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
index 6eeaf47674..269d468ef7 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
@@ -384,3 +384,6 @@ datum/species/harpy
"You feel uncomfortably warm.",
"Your overheated skin itches."
)
+
+/datum/species/human/vatgrown
+ spawn_flags = SPECIES_IS_RESTRICTED
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm
index 171365fd0a..28c98ace23 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm
@@ -35,7 +35,7 @@
/datum/trait/endurance_very_low
name = "Extremely Low Endurance"
desc = "Reduces your maximum total hitpoints to 50."
- cost = -3 //Teshari HP. This makes the person a lot more suseptable to getting stunned, killed, etc.
+ cost = -3 //Teshari HP. This makes the person a lot more suseptable to getting stunned, killed, etc.
var_changes = list("total_health" = 50)
apply(var/datum/species/S,var/mob/living/carbon/human/H)
@@ -95,3 +95,9 @@
desc = "Increases stun duration from flashes and other light-based stuns."
cost = -1
var_changes = list("flash_mod" = 2.0)
+
+/datum/trait/lightweight
+ name = "Lightweight"
+ desc = "Your light weight and poor balance make you very susceptible to unhelpful bumping. Think of it like a bowling ball versus a pin."
+ cost = -4
+ var_changes = list("lightweight" = 1)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
index 38df2a9215..61b70505f9 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm
@@ -81,4 +81,10 @@
name = "Brutal Predation"
desc = "Allows you to tear off limbs & tear out internal organs."
cost = 0 //I would make this cost a point, since it has some in game value, but there are easier, less damaging ways to perform the same functions.
- var_changes = list("hard_vore_enabled" = 1) //The verb is given in human.dm
\ No newline at end of file
+ var_changes = list("hard_vore_enabled" = 1) //The verb is given in human.dm
+
+/datum/trait/trashcan
+ name = "Trash Can"
+ desc = "Allows you to dispose of the snack wrappings on the go instead of having to look for a bin or littering like an animal."
+ cost = 0
+ var_changes = list("trashcan" = 1)
diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
index 74da59b887..173b80f021 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm
@@ -97,7 +97,7 @@
var_changes = list("brute_mod" = 0.5)
/datum/trait/minor_burn_resist
- name = "Minor Brute Resist"
+ name = "Minor Burn Resist"
desc = "Adds 15% resistance to burn damage sources."
cost = 1
var_changes = list("burn_mod" = 0.85)
@@ -125,3 +125,9 @@
desc = "Allows you to fly by using your wings."
cost = 2 //Some in game value.
var_changes = list("can_fly" = 1)
+
+/datum/trait/hardfeet
+ name = "Hard Feet"
+ desc = "Makes your nice clawed, scaled, hooved, armored, or otherwise just awfully calloused feet immune to glass shards."
+ cost = 1
+ var_changes = list("flags" = NO_MINOR_CUT) //Checked the flag is only used by shard stepping.
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 62ba1438ab..8cbe6ebfa0 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -311,6 +311,8 @@ var/global/list/damage_icon_parts = list()
base_icon = chest.get_icon()
for(var/obj/item/organ/external/part in organs)
+ if(isnull(part) || part.is_stump())
+ continue
var/icon/temp = part.get_icon(skeleton)
//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)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 5536da02be..844fcd72ce 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -120,6 +120,14 @@ default behaviour is:
// VOREStation Edit - Begin
// Handle grabbing, stomping, and such of micros!
if(handle_micro_bump_other(tmob)) return
+ // Plow that nerd.
+ if(ishuman(tmob))
+ var/mob/living/carbon/human/H = tmob
+ if(H.species.lightweight == 1 && prob(50))
+ H.visible_message("[src] bumps into [H], knocking them off balance!")
+ H.Weaken(20)
+ now_pushing = 0
+ return
// VOREStation Edit - End
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index cbcdc069aa..4e7fa35f32 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -160,6 +160,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
add_language(LANGUAGE_EAL, 1)
add_language(LANGUAGE_SCHECHI, 1)
add_language(LANGUAGE_SIGN, 1)
+ add_language(LANGUAGE_ROOTLOCAL, 1)
if(!safety)//Only used by AIize() to successfully spawn an AI.
if (!B)//If there is no player/brain inside.
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
index cd8b466ac7..97e7de9ef6 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm
@@ -304,6 +304,9 @@
var/obj/effect/decal/cleanable/C = locate() in target
qdel(C)
target.clean_blood()
+ if(istype(target, /turf/simulated))
+ var/turf/simulated/T = target
+ T.dirt = 0
return
/obj/item/weapon/gun/energy/taser/mounted/cyborg/ertgun //Not a taser, but it's being used as a base so it takes energy and actually works.
diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
index 776d057456..7fb86b7e85 100644
--- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
+++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm
@@ -85,6 +85,7 @@
update_patient()
/obj/item/device/dogborg/sleeper/proc/drain(var/amt = 3) //Slightly reduced cost (before, it was always injecting inaprov)
+ hound = src.loc
hound.cell.charge = hound.cell.charge - amt
/obj/item/device/dogborg/sleeper/attack_self(mob/user)
@@ -252,7 +253,7 @@
//For if the dogborg's existing patient uh, doesn't make it.
/obj/item/device/dogborg/sleeper/proc/update_patient()
-
+ hound = src.loc
//Well, we HAD one, what happened to them?
if(patient in contents)
if(patient_laststat != patient.stat)
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 0f7dda53b2..426220b4ae 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -79,8 +79,8 @@
Paralyse(3)
src.sleeping--
- if(src.resting)
- Weaken(5)
+ //if(src.resting) // VOREStation edit. Our borgos would rather not.
+ // Weaken(5)
if(health < config.health_threshold_dead && src.stat != 2) //die only once
death()
@@ -338,7 +338,7 @@
weaponlock_time = 120
/mob/living/silicon/robot/update_canmove()
- if(paralysis || stunned || weakened || buckled || lockdown || !is_component_functioning("actuator")) canmove = 0
+ if(paralysis || stunned || weakened || buckled || lockdown || resting || !is_component_functioning("actuator")) canmove = 0 //VOREStation edit for resting.
else canmove = 1
return canmove
diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm
index 2f6c11d9ab..847719a389 100644
--- a/code/modules/mob/living/silicon/robot/robot_vr.dm
+++ b/code/modules/mob/living/silicon/robot/robot_vr.dm
@@ -9,11 +9,21 @@
/mob/living/silicon/robot/updateicon()
..()
- if(stat == CONSCIOUS)
- if(sleeper_g == 1)
- overlays += "[module_sprites[icontype]]-sleeper_g"
- if(sleeper_r == 1)
- overlays += "[module_sprites[icontype]]-sleeper_r"
+ if(icon == 'icons/mob/widerobot_vr.dmi' || 'icons/mob/62x62robot_vr.dmi')
+ if(stat == CONSCIOUS)
+ if(sleeper_g == 1)
+ overlays += "[module_sprites[icontype]]-sleeper_g"
+ if(sleeper_r == 1)
+ overlays += "[module_sprites[icontype]]-sleeper_r"
+ if(resting)
+ overlays.Cut() // Hide that gut for it has no ground sprite yo.
+ icon_state = "[module_sprites[icontype]]-rest"
+ else
+ icon_state = module_sprites[icontype]
+ else if(stat == DEAD)
+ icon_state = "[module_sprites[icontype]]-wreck"
+
+
/mob/living/silicon/robot/Move(a, b, flag)
@@ -46,6 +56,6 @@
cleaned_human.shoes.clean_blood()
cleaned_human.update_inv_shoes(0)
cleaned_human.clean_blood(1)
- cleaned_human << "[src] cleans your face!"//Again travis what the fuck? You and your random unrelated bugs.
+ cleaned_human << "[src] cleans your face!"
return
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/simple_animal/vore/solargrub_larva.dm b/code/modules/mob/living/simple_animal/vore/solargrub_larva.dm
index b412be2a4b..b48ef8963e 100644
--- a/code/modules/mob/living/simple_animal/vore/solargrub_larva.dm
+++ b/code/modules/mob/living/simple_animal/vore/solargrub_larva.dm
@@ -10,6 +10,9 @@ var/global/list/grub_machine_overlays = list()
health = 5
maxHealth = 5
+
+ meat_amount = 2
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat
faction = "grubs"
@@ -250,4 +253,4 @@ var/global/list/grub_machine_overlays = list()
grub.eject_from_machine(O)
to_chat(user, "You disturb a grub nesting in \the [O]!")
return
- return ..()
\ No newline at end of file
+ return ..()
diff --git a/code/modules/mob/mob_defines_vr.dm b/code/modules/mob/mob_defines_vr.dm
index df9e1f8edd..ab1670560f 100644
--- a/code/modules/mob/mob_defines_vr.dm
+++ b/code/modules/mob/mob_defines_vr.dm
@@ -1,3 +1,5 @@
/mob
var/vantag_hud = 0 // Do I have the HUD enabled?
- var/flying = 0 //Allows flight
\ No newline at end of file
+ var/flying = 0 //Allows flight
+ var/can_be_drop_prey = 0
+ var/can_be_drop_pred = 1 //Mobs are pred by default.
\ No newline at end of file
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 2ccbc8cea7..176b2184d8 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -400,7 +400,7 @@ proc/is_blind(A)
return // Can't talk in deadchat if you can't see it.
for(var/mob/M in player_list)
- if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_eventM(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay))
+ if(M.client && (!istype(M, /mob/new_player) && M.stat == DEAD) && M.is_preference_enabled(/datum/client_preference/show_dsay))
var/follow
var/lname
if(M.forbid_seeing_deadchat && !M.client.holder)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 0b91e3e39b..ad642f3215 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -324,7 +324,7 @@
name = "Overeye Long"
icon_state = "hair_longovereye"
- fag
+ flowhair
name = "Flow Hair"
icon_state = "hair_f"
diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm
index 3ed09d94e3..4e2bf6699d 100644
--- a/code/modules/multiz/movement.dm
+++ b/code/modules/multiz/movement.dm
@@ -352,6 +352,11 @@
"You hear something slam into \the [landing].")
playsound(loc, "punch", 25, 1, -1)
var/damage = 15 // Because wounds heal rather quickly, 15 should be enough to discourage jumping off but not be enough to ruin you, at least for the first time.
+ var/mob/living/carbon/human/pred = src //VOREStation Edit Start
+ var/belly = src.vore_selected
+ var/datum/belly/belly_target = pred.vore_organs[belly]
+ if(belly_target && belly_target.internal_contents.len != 0)
+ damage = 5 //VOREStation Edit End
apply_damage(rand(0, damage), BRUTE, BP_HEAD)
apply_damage(rand(0, damage), BRUTE, BP_TORSO)
apply_damage(rand(0, damage), BRUTE, BP_L_LEG)
diff --git a/code/modules/multiz/movement_vr.dm b/code/modules/multiz/movement_vr.dm
new file mode 100644
index 0000000000..20867e35e2
--- /dev/null
+++ b/code/modules/multiz/movement_vr.dm
@@ -0,0 +1,60 @@
+
+/mob/living/handle_fall(var/turf/landing)
+ var/mob/drop_mob= locate(/mob, loc)
+
+ if(locate(/obj/structure/stairs) in landing)
+ for(var/atom/A in landing)
+ if(!A.CanPass(src, src.loc, 1, 0))
+ return FALSE
+ Move(landing)
+ return 1
+
+ if(drop_mob && drop_mob != src && ismob(drop_mob)) //Shitload of checks. This is because the game finds various ways to screw me over.
+ drop_mob.fall_impact(src)
+
+ // Then call parent to have us actually fall
+ return ..()
+/mob/CheckFall(var/atom/movable/falling_atom)
+ return falling_atom.fall_impact(src)
+/* //Leaving this here to show my previous iterations which failed.
+/mob/living/fall_impact(var/atom/hit_atom) //This is called even when a humanoid falls. Dunno why, it just does.
+ if(isliving(hit_atom)) //THIS WEAKENS THE PERSON FALLING & NOMS THE PERSON FALLEN ONTO. SRC is person fallen onto. hit_atom is the person falling. Confusing.
+ var/mob/living/pred = hit_atom
+ pred.visible_message("\The [pred] falls onto \the [src]! FALL IMPACT MOB")
+ pred.Weaken(8) //Stun the person you're dropping onto! You /are/ suffering massive damage for a single stun.
+ if(isliving(hit_atom) && isliving(src))
+ var/mob/living/prey = src
+ if(pred.can_be_drop_pred && prey.can_be_drop_prey) //Is person falling pred & person being fallen onto prey?
+ pred.feed_grabbed_to_self_falling_nom(pred,prey)
+ else if(prey.can_be_drop_pred && pred.can_be_drop_prey) //Is person being fallen onto pred & person falling prey
+ pred.feed_grabbed_to_self_falling_nom(prey,pred) //oh, how the tables have turned.
+*/
+/mob/zshadow/fall_impact(var/atom/hit_atom) //You actually "fall" onto their shadow, first.
+ /*
+ var/floor_below = src.loc.below //holy fuck
+ for(var/mob/M in floor_below.contents)
+ if(M && M != src) //THIS WEAKENS THE MOBS YOU'RE FALLING ONTO
+ M.visible_message("\The [src] drops onto \the [M]! FALL IMPACT SHADOW WEAKEN 8")
+ M.Weaken(8)
+ */
+ if(isliving(hit_atom)) //THIS WEAKENS THE PERSON FALLING & NOMS THE PERSON FALLEN ONTO. SRC is person fallen onto. hit_atom is the person falling. Confusing.
+ var/mob/living/pred = hit_atom
+ pred.visible_message("\The [hit_atom] falls onto \the [src]!")
+ pred.Weaken(8) //Stun the person you're dropping onto! You /are/ suffering massive damage for a single stun.
+ var/mob/living/prey = src.owner //The shadow's owner
+ if(isliving(prey))
+ if(pred.can_be_drop_pred && prey.can_be_drop_prey) //Is person falling pred & person being fallen onto prey?
+ pred.feed_grabbed_to_self_falling_nom(pred,prey)
+ else if(prey.can_be_drop_pred && pred.can_be_drop_prey) //Is person being fallen onto pred & person falling prey
+ pred.feed_grabbed_to_self_falling_nom(prey,pred) //oh, how the tables have turned.
+ else
+ prey.Weaken(8) //Just fall onto them if neither of the above apply.
+
+/mob/proc/CanZPass(atom/A, direction)
+ if(z == A.z) //moving FROM this turf
+ return direction == UP //can't go below
+ else
+ if(direction == UP) //on a turf below, trying to enter
+ return 0
+ if(direction == DOWN) //on a turf above, trying to enter
+ return 1
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 342e10db84..10a4b5ead9 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -159,6 +159,34 @@
name = "ammo clip (.45 flash)"
ammo_type = /obj/item/ammo_casing/a45f
+/obj/item/ammo_magazine/s45
+ name = "speedloader (.45)"
+ icon_state = "45s"
+ ammo_type = /obj/item/ammo_casing/a45
+ matter = list(DEFAULT_WALL_MATERIAL = 525) //metal costs are very roughly based around 1 .45 casing = 75 metal
+ caliber = ".45"
+ max_ammo = 7
+ multiple_sprites = 1
+
+/obj/item/ammo_magazine/s45/empty
+ initial_ammo = 0
+
+/obj/item/ammo_magazine/s45/rubber
+ name = "speedloader (.45 rubber)"
+ ammo_type = /obj/item/ammo_casing/a45r
+
+/obj/item/ammo_magazine/s45/practice
+ name = "speedloader (.45 practice)"
+ ammo_type = /obj/item/ammo_casing/a45p
+
+/obj/item/ammo_magazine/s45/flash
+ name = "speedloader (.45 flash)"
+ ammo_type = /obj/item/ammo_casing/a45f
+
+/obj/item/ammo_magazine/s45/ap
+ name = "speedloader (.45 AP)"
+ ammo_type = /obj/item/ammo_casing/a45ap
+
///////// 9mm /////////
/obj/item/ammo_magazine/m9mm
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index e545ebb848..9a9f0b4bd6 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -23,7 +23,7 @@
icon_state = "[initial(icon_state)]-e"
/obj/item/weapon/gun/projectile/colt/detective
- desc = "A Martian recreation of an old Terran pistol. Uses .45 rounds."
+ desc = "A Martian recreation of an old pistol. Uses .45 rounds."
magazine_type = /obj/item/ammo_magazine/m45/rubber
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
@@ -60,7 +60,8 @@
options["H&K VP"] = "VP78"
options["P08 Luger"] = "p08"
options["P08 Luger, Brown"] = "p08b"
- var/choice = input(M,"What do you want the gun's sprite to be?","Resprite Gun") in options
+ options["Glock 37"] = "enforcer_black"
+ var/choice = input(M,"Choose your sprite!","Resprite Gun") in options
if(src && choice && !M.stat && in_range(M,src))
icon_state = options[choice]
unique_reskin = options[choice]
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 81355d1031..20671d6fd5 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -66,6 +66,58 @@
M << "You name the gun [input]. Say hello to your new friend."
return 1
+/obj/item/weapon/gun/projectile/revolver/detective45
+ name = ".45 revolver"
+ desc = "A fancy replica of an old revolver, modified for .45 rounds and a seven-shot cylinder."
+ icon_state = "detective"
+ caliber = ".45"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
+ fire_sound = 'sound/weapons/gunshot_heavy.ogg'
+ ammo_type = /obj/item/ammo_casing/a45r
+ max_shells = 7
+
+
+obj/item/weapon/gun/projectile/revolver/detective45/verb/rename_gun()
+ set name = "Name Gun"
+ set category = "Object"
+ set desc = "Rename your gun. If you're the Detective."
+
+ var/mob/M = usr
+ if(!M.mind) return 0
+ var/job = M.mind.assigned_role
+ if(job != "Detective")
+ M << "You don't feel cool enough to name this gun, chump."
+ return 0
+
+ var/input = sanitizeSafe(input("What do you want to name the gun?", ,""), MAX_NAME_LEN)
+
+ if(src && input && !M.stat && in_range(M,src))
+ name = input
+ M << "You name the gun [input]. Say hello to your new friend."
+ return 1
+
+/obj/item/weapon/gun/projectile/revolver/detective45/verb/reskin_gun()
+ set name = "Resprite gun"
+ set category = "Object"
+ set desc = "Click to choose a sprite for your gun."
+
+ var/mob/M = usr
+ var/list/options = list()
+ options["Colt Detective Special"] = "detective"
+ options["Ruger GP100"] = "GP100"
+ options["Colt Single Action Army"] = "detective_peacemaker"
+ options["Colt Single Action Army, Dark"] = "detective_peacemaker_dark"
+ options["H&K PT"] = "detective_panther"
+ options["Vintage LeMat"] = "lemat_old"
+ options["Webley MKVI "] = "webley"
+ var/choice = input(M,"Choose your sprite!","Resprite Gun") in options
+ if(src && choice && !M.stat && in_range(M,src))
+ icon_state = options[choice]
+ M << "Your gun is now sprited as [choice]. Say hello to your new friend."
+ return 1
+
+
+
// Blade Runner pistol.
/obj/item/weapon/gun/projectile/revolver/deckard
name = "\improper Deckard .38"
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 393ee201a8..aefbebe1f6 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -210,6 +210,7 @@
icon_state = "vial"
matter = list("glass" = 250)
volume = 30
+ w_class = ITEMSIZE_TINY
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25)
flags = OPENCONTAINER
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 6312d08d84..88b6d9d064 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -76,6 +76,13 @@
..()
reagents.add_reagent("water",1000)
+/obj/structure/reagent_dispensers/watertank/high/New()
+ name = "high-capacity water tank"
+ desc = "A highly-pressurized water tank made to hold vast amounts of water.."
+ icon_state = "watertank_high"
+ ..()
+ reagents.add_reagent("water",4000)
+
/obj/structure/reagent_dispensers/fueltank
name = "fueltank"
desc = "A fueltank."
diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm
index 8b190275c8..d63eabda0e 100644
--- a/code/modules/vore/appearance/sprite_accessories_vr.dm
+++ b/code/modules/vore/appearance/sprite_accessories_vr.dm
@@ -468,6 +468,13 @@
desc = ""
icon_state = "snag-backplate"
+/datum/sprite_accessory/wing/nevrean
+ name = "nevrean wings/fantail"
+ desc = ""
+ icon_state = "nevrean_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
/*
////////////////////////////
/ =--------------------= /
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index ff441d8788..339bde8386 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -54,7 +54,7 @@
owner << "" + digest_alert_owner + ""
M << "" + digest_alert_prey + ""
- owner.nutrition += 20 // so eating dead mobs gives you *something*.
+ owner.nutrition += 20 // so eating dead mobs gives you *something* (that's 0.66u nutriment yo)
if(isrobot(owner))
s_owner = owner
s_owner.cell.charge += 200
@@ -101,8 +101,8 @@
items_preserved += ID
return
for(var/obj/item/SubItem in T)
- if(istype(SubItem,/obj/item/weapon/reagent_containers/food/snacks))
- var/obj/item/weapon/reagent_containers/food/snacks/SF = SubItem
+ if(istype(SubItem,/obj/item/weapon/reagent_containers/food))
+ var/obj/item/weapon/reagent_containers/food/SF = SubItem
if(istype(owner,/mob/living/carbon/human))
var/mob/living/carbon/human/howner = owner
SF.reagents.trans_to_holder(howner.ingested, (SF.reagents.total_volume * 0.3), 1, 0)
@@ -111,16 +111,16 @@
SubItem.gurglecontaminate()
if(istype(SubItem,/obj/item/weapon/storage))
for(var/obj/item/SubSubItem in SubItem)
- if(istype(SubSubItem,/obj/item/weapon/reagent_containers/food/snacks))
- var/obj/item/weapon/reagent_containers/food/snacks/SSF = SubSubItem
+ if(istype(SubSubItem,/obj/item/weapon/reagent_containers/food))
+ var/obj/item/weapon/reagent_containers/food/SSF = SubSubItem
if(istype(owner,/mob/living/carbon/human))
var/mob/living/carbon/human/howner = owner
SSF.reagents.trans_to_holder(howner.ingested, (SSF.reagents.total_volume * 0.3), 1, 0)
internal_contents -= SSF
qdel(SSF)
SubSubItem.gurglecontaminate()
- if(istype(T, /obj/item/weapon/reagent_containers/food/snacks)) // Weakgurgles still act on foodstuff. Hopefully your prey didn't load their bag with donk boxes.
- var/obj/item/weapon/reagent_containers/food/snacks/F = T
+ if(istype(T, /obj/item/weapon/reagent_containers/food)) // Weakgurgles still act on foodstuff. Hopefully your prey didn't load their bag with donk boxes.
+ var/obj/item/weapon/reagent_containers/food/F = T
if(istype(owner,/mob/living/carbon/human))
var/mob/living/carbon/human/howner = owner
F.reagents.trans_to_holder(howner.reagents, (F.reagents.total_volume * 0.3), 1, 0)
@@ -136,6 +136,9 @@
internal_contents += M
internal_contents -= H
qdel(H)
+ if(istype(T,/obj/item/organ))
+ owner.nutrition += (66)
+ qdel(T)
else
items_preserved += T
T.gurglecontaminate() // Someone got gurgled in this crap. You wouldn't wear/use it unwashed. :v
@@ -197,6 +200,9 @@
internal_contents += M
internal_contents -= H
qdel(H)
+ if(istype(T,/obj/item/organ))
+ owner.nutrition += (66)
+ qdel(T)
else
owner.nutrition += (1 * T.w_class)
if(isrobot(owner))
@@ -274,6 +280,9 @@
internal_contents += M
internal_contents -= H
qdel(H)
+ if(istype(T,/obj/item/organ))
+ owner.nutrition += (66)
+ qdel(T)
else
owner.nutrition += (1 * T.w_class)
if(isrobot(owner))
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 1a1ba7ff3f..b1363406f8 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -19,6 +19,7 @@
var/noisy = 0 // Toggle audible hunger.
var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr.
var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time.
+ var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon.
//
// Hook for generic creation of stuff on new creatures
@@ -31,7 +32,7 @@
return 1
M.verbs += /mob/living/proc/insidePanel
- M.appearance_flags |= PIXEL_SCALE
+ //M.appearance_flags |= PIXEL_SCALE // Moved to 02_size.dm
//Tries to load prefs if a client is present otherwise gives freebie stomach
if(!M.vore_organs || !M.vore_organs.len)
@@ -235,6 +236,8 @@
P.vore_taste = src.vore_taste
P.nif_examine = src.nif_examine
P.conceal_nif = src.conceal_nif
+ P.can_be_drop_prey = src.can_be_drop_prey
+ P.can_be_drop_pred = src.can_be_drop_pred
return 1
@@ -253,6 +256,8 @@
src.vore_taste = P.vore_taste
src.nif_examine = P.nif_examine
src.conceal_nif = P.conceal_nif
+ src.can_be_drop_prey = P.can_be_drop_prey
+ src.can_be_drop_pred = P.can_be_drop_pred
for(var/I in P.belly_prefs)
var/datum/belly/Bp = P.belly_prefs[I]
@@ -511,3 +516,50 @@
B.internal_contents += src
return
return
+
+/mob/living/proc/feed_grabbed_to_self_falling_nom(var/mob/living/user, var/mob/living/prey)
+ var/belly = user.vore_selected
+ return perform_the_falling_nom(user, prey, user, belly)
+
+/mob/living/proc/perform_the_falling_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly) //For dropnoms.
+ //Sanity
+ belly = pred.vore_selected
+ if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs))
+ log_debug("[user] attempted to feed [prey] to [pred], via [belly] but it went wrong.")
+ return
+
+ // The belly selected at the time of noms
+ var/datum/belly/belly_target = pred.vore_organs[belly]
+ var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
+
+ //Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros
+ var/user_to_pred = get_dist(get_turf(user),get_turf(pred))
+ var/user_to_prey = get_dist(get_turf(user),get_turf(prey))
+
+ if(user_to_pred > 1 || user_to_prey > 1)
+ return 0
+
+ // Prepare messages
+ if(user == pred) //Feeding someone to yourself
+ success_msg = text("[] manages to [] [] into their []!",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
+ else //Feeding someone to another person. This shouldn't happen.
+ success_msg = text("[] manages to make [] [] [] into their []!",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
+
+ user.visible_message(success_msg)
+ if(belly_target.vore_sound)
+ playsound(user, belly_target.vore_sound, 100, 1)
+
+ // Actually shove prey into the belly.
+ belly_target.nom_mob(prey, user)
+ user.update_icons()
+
+ // Flavor handling
+ if(belly_target.can_taste && prey.get_taste_message(0))
+ to_chat(belly_target.owner, "[prey] tastes of [prey.get_taste_message(0)].")
+
+ // Inform Admins
+ if (pred == user)
+ msg_admin_attack("[key_name(pred)] ate [key_name(prey)] via dropnoms!. ([pred ? "JMP" : "null"])")
+ else
+ msg_admin_attack("[key_name(user)] forced [key_name(pred)] to eat [key_name(prey)] via dropnoms! ([pred ? "JMP" : "null"])")
+ return 1
\ No newline at end of file
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index 024e0ad4af..0440e927de 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -46,6 +46,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/vore_taste
var/conceal_nif
var/nif_examine
+ var/can_be_drop_prey
+ var/can_be_drop_pred
//Mechanically required
var/path
@@ -107,6 +109,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
S["vore_taste"] >> vore_taste
S["conceal_nif"] >> conceal_nif
S["nif_examine"] >> nif_examine
+ S["can_be_drop_prey"] >> can_be_drop_prey
+ S["can_be_drop_pred"] >> can_be_drop_pred
if(isnull(digestable))
digestable = 1
@@ -127,5 +131,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
S["vore_taste"] << vore_taste
S["conceal_nif"] << conceal_nif
S["nif_examine"] << nif_examine
+ S["can_be_drop_prey"] << can_be_drop_prey
+ S["can_be_drop_pred"] << can_be_drop_pred
return 1
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index b26a0d6aff..8e0d411eb4 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -284,6 +284,9 @@
dat += "
Set NIF concealment" //These two get their own, custom row.
dat += "Set NIF Examine Message."
+ dat += "
Toggle Drop-nom Prey Mode" //These two get their own, custom row, too.
+ dat += "Toggle Drop-nom Pred Mode"
+
//Returns the dat html to the vore_look
return dat
@@ -751,6 +754,26 @@
else //Returned null
return 0
+ if(href_list["toggle_dropnom_pred"])
+ var/choice = alert(user, "You are currently [user.can_be_drop_pred ? " able to eat prey that fall from above or that you fall onto" : "not able to eat prey that fall from above or that you fall onto."]", "", "Be Pred", "Cancel", "Don't be Pred")
+ switch(choice)
+ if("Cancel")
+ return 0
+ if("Be Pred")
+ user.can_be_drop_pred = 1
+ if("Don't be Pred")
+ user.can_be_drop_pred = 0
+
+ if(href_list["toggle_dropnom_prey"])
+ var/choice = alert(user, "You are currently [user.can_be_drop_prey ? "able to be eaten." : "not able to be eaten."]", "", "Be Prey", "Cancel", "Don't Be Prey")
+ switch(choice)
+ if("Cancel")
+ return 0
+ if("Be Prey")
+ user.can_be_drop_prey = 1
+ if("Don't Be Prey")
+ user.can_be_drop_prey = 0
+
if(href_list["toggledg"])
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable. Don't abuse this button by toggling it back and forth to extend a scene or whatever, or you'll make the admins cry. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
switch(choice)
diff --git a/code/modules/vore/fluffstuff/custom_guns_vr.dm b/code/modules/vore/fluffstuff/custom_guns_vr.dm
index 3f2501b4fc..1c0d13dee1 100644
--- a/code/modules/vore/fluffstuff/custom_guns_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_guns_vr.dm
@@ -418,17 +418,18 @@
// ------------ Energy Luger ------------
/obj/item/weapon/gun/energy/gun/eluger
name = "energy Luger"
- desc = "The finest sidearm produced by RauMauser; this pistol can punch a hole through inch thick steel plating. This ain't your great-grand-daddy's Luger! Can switch between stun and kill."
+ desc = "The finest sidearm produced by RauMauser. Although its battery cannot be removed, its ergonomic design makes it easy to shoot, allowing for rapid follow-up shots. It also has the ability to toggle between stun and kill."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "elugerstun100"
item_state = "gun"
- charge_cost = 100 //How much energy is needed to fire.
- projectile_type = /obj/item/projectile/beam/stun
+ fire_delay = null // Lugers are quite comfortable to shoot, thus allowing for more controlled follow-up shots. Rate of fire similar to a laser carbine.
+ battery_lock = 1 // In exchange for balance, you cannot remove the battery. Also there's no sprite for that and I fucking suck at sprites. -Ace
+ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2) // Illegal tech cuz Space Nazis
modifystate = "elugerstun"
fire_sound = 'sound/weapons/Taser.ogg'
firemodes = list(
- list(mode_name="stun", charge_cost=100,projectile_type=/obj/item/projectile/beam/stun, modifystate="elugerstun", fire_sound='sound/weapons/Taser.ogg'),
- list(mode_name="lethal", charge_cost=200,projectile_type=/obj/item/projectile/beam/eluger, modifystate="elugerkill", fire_sound='sound/weapons/eluger.ogg'),
+ list(mode_name="stun", charge_cost=120,projectile_type=/obj/item/projectile/beam/stun, modifystate="elugerstun", fire_sound='sound/weapons/Taser.ogg'),
+ list(mode_name="lethal", charge_cost=240,projectile_type=/obj/item/projectile/beam/eluger, modifystate="elugerkill", fire_sound='sound/weapons/eluger.ogg'),
)
//////////////////// Eris Ported Guns ////////////////////
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index 2021b88ae0..dfeee451ba 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -1024,7 +1024,7 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
accessset = 1
..()
-//verkister: Cameron Eggbert - Science goggles that ACTUALLY do nothing.
+//General use, Verk felt like sharing.
/obj/item/clothing/glasses/fluff/science_proper
name = "Aesthetic Science Goggles"
desc = "The goggles really do nothing this time!"
@@ -1032,9 +1032,9 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
item_state_slots = list(slot_r_hand_str = "glasses", slot_l_hand_str = "glasses")
item_flags = AIRTIGHT
-//verkister: Opie Eggbert - Spiffy fluff goggles
+//General use, Verk felt like sharing.
/obj/item/clothing/glasses/fluff/spiffygogs
- name = "Chad Goggles"
+ name = "Orange Goggles"
desc = "You can almost feel the raw power radiating off these strange specs."
icon = 'icons/vore/custom_items_vr.dmi'
icon_override = 'icons/vore/custom_clothes_vr.dmi'
@@ -1478,3 +1478,75 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie
/obj/item/weapon/material/twohanded/fluff/riding_crop/malady
name = "Malady's riding crop"
desc = "An infernum made riding crop with Malady Blanche engraved in the shaft. It's a little worn from how many butts it has spanked."
+
+
+//SilverTalisman: Evian
+/obj/item/weapon/implant/reagent_generator/evian
+ emote_descriptor = list("an egg right out of Evian's lower belly!", "into Evian' belly firmly, forcing him to lay an egg!", "Evian really tight, who promptly lays an egg!")
+ var/verb_descriptor = list("squeezes", "pushes", "hugs")
+ var/self_verb_descriptor = list("squeeze", "push", "hug")
+ var/short_emote_descriptor = list("lays", "forces out", "pushes out")
+ self_emote_descriptor = list("lay", "force out", "push out")
+ random_emote = list("hisses softly with a blush on his face", "yelps in embarrassment", "grunts a little")
+ assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_evian
+
+/obj/item/weapon/implant/reagent_generator/evian/implanted(mob/living/carbon/source)
+ processing_objects += src
+ to_chat(source, "You implant [source] with \the [src].")
+ source.verbs |= assigned_proc
+ return 1
+
+/obj/item/weapon/implanter/reagent_generator/evian
+ implant_type = /obj/item/weapon/implant/reagent_generator/evian
+
+/mob/living/carbon/human/proc/use_reagent_implant_evian()
+ set name = "Lay Egg"
+ set desc = "Force Evian to lay an egg by squeezing into his lower body! This makes the lizard extremely embarrassed, and it looks funny."
+ set category = "Object"
+ set src in view(1)
+
+ //do_reagent_implant(usr)
+ if(!isliving(usr) || !usr.canClick())
+ return
+
+ if(usr.incapacitated() || usr.stat > CONSCIOUS)
+ return
+
+ var/obj/item/weapon/implant/reagent_generator/evian/rimplant
+ for(var/I in src.contents)
+ if(istype(I, /obj/item/weapon/implant/reagent_generator))
+ rimplant = I
+ break
+ if (rimplant)
+ if(rimplant.reagents.total_volume <= rimplant.transfer_amount)
+ to_chat(src, "[pick(rimplant.empty_message)]")
+ return
+
+ new /obj/item/weapon/reagent_containers/food/snacks/egg/roiz/evian(get_turf(src)) //Roiz/evian so it gets all the functionality
+
+ var/index = rand(0,3)
+
+ if (usr != src)
+ var/emote = rimplant.emote_descriptor[index]
+ var/verb_desc = rimplant.verb_descriptor[index]
+ var/self_verb_desc = rimplant.self_verb_descriptor[index]
+ usr.visible_message("[usr] [verb_desc] [emote]",
+ "You [self_verb_desc] [emote]")
+ else
+ src.visible_message("[src] [pick(rimplant.short_emote_descriptor)] an egg.",
+ "You [pick(rimplant.self_emote_descriptor)] an egg.")
+ if(prob(15))
+ src.visible_message("[src] [pick(rimplant.random_emote)].") // M-mlem.
+
+ rimplant.reagents.remove_any(rimplant.transfer_amount)
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/roiz/evian
+ name = "dragon egg"
+ icon_state = "egg_roiz_yellow"
+
+
+/obj/item/weapon/reagent_containers/food/snacks/egg/roiz/evian/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype( W, /obj/item/weapon/pen/crayon)) //No coloring these ones!
+ return
+ else
+ ..()
\ No newline at end of file
diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm
index 09beabb7b0..81737b6047 100644
--- a/code/modules/vore/resizing/resize_vr.dm
+++ b/code/modules/vore/resizing/resize_vr.dm
@@ -51,7 +51,10 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
* but in the future we may also incorporate the "mob_size", so that
* a macro mouse is still only effectively "normal" or a micro dragon is still large etc.
*/
-/mob/living/proc/get_effective_size()
+/mob/proc/get_effective_size()
+ return 100000 //Whatever it is, it's too big to pick up, or it's a ghost, or something.
+
+/mob/living/get_effective_size()
return src.size_multiplier
/**
diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt
index ef8f321ed4..96409fc3d7 100644
--- a/config/alienwhitelist.txt
+++ b/config/alienwhitelist.txt
@@ -17,6 +17,8 @@ silverTalismen - Diona
silvertalismen - Xenochimera
singo - Gutter
some~user - Species
+tastypred - Xenochimera
+verkister - Xenochimera
xioen - Diona
xioen - Xenochimera
xioen - Xenomorph Hybrid
diff --git a/config/example/config.txt b/config/example/config.txt
index 35c3248ff7..667721f8eb 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -394,5 +394,8 @@ STARLIGHT 0
## Uncomment to override default brain health.
#DEFAULT_BRAIN_HEALTH 400
+#No more mice
+DISABLE_PLAYER_MICE
+
## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , # and -
# DEFAULT_LANGUAGE_PREFIXES , # -
diff --git a/html/changelog.html b/html/changelog.html
index cb2923c0f1..610d80aa38 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -53,6 +53,20 @@
-->
+
06 November 2017
+
Atermonera updated:
+
+ - AI's can speak local rootspeak.
+ - Implements Virtual Reality.
+
+
Woodrat updated:
+
+ - Added 'see down' in open spaces from Vore.
+ - Added talking and visible messages upward through open space from Vore.
+ - Added a Syndicate ID with all access (admin spawn only).
+ - Port of 'Syndicate id cards now listen for owner destruction' from Bay.
+
+
24 September 2017
Belsima updated:
diff --git a/html/changelogs/MoondancerPony-electronics4246.yml b/html/changelogs/MoondancerPony-electronics4246.yml
new file mode 100644
index 0000000000..d07b11d320
--- /dev/null
+++ b/html/changelogs/MoondancerPony-electronics4246.yml
@@ -0,0 +1,5 @@
+author: MoondancerPony
+delete-after: True
+changes:
+ - bugfix: "Fixed a mislabeled pulse pin on the microphone."
+ - bugfix: "Fixed an issue with reference pins and multiplexers, and reference pins in general."
diff --git a/html/changelogs/Woodrat-MultiZ.yml b/html/changelogs/Woodrat-MultiZ.yml
deleted file mode 100644
index 0058ee3623..0000000000
--- a/html/changelogs/Woodrat-MultiZ.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Woodrat
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - rscadd: "Added 'see down' in open spaces from Vore."
- - rscadd: "Added talking and visible messages upward through open space from Vore."
\ No newline at end of file
diff --git a/html/changelogs/Woodrat-SyndIDs.yml b/html/changelogs/Woodrat-SyndIDs.yml
deleted file mode 100644
index fba90ab1fd..0000000000
--- a/html/changelogs/Woodrat-SyndIDs.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# maptweak
-# spellcheck (typo fixes)
-# experiment
-#################################
-
-# Your name.
-author: Woodrat
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
-# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
-changes:
- - rscadd: "Added a Syndicate ID with all access (admin spawn only)."
- - tweak: "Port of 'Syndicate id cards now listen for owner destruction' from Bay."
diff --git a/icons/mob/62x62robot_vr.dmi b/icons/mob/62x62robot_vr.dmi
index 0aaf9f189d..bbb6d319d8 100644
Binary files a/icons/mob/62x62robot_vr.dmi and b/icons/mob/62x62robot_vr.dmi differ
diff --git a/icons/mob/back_vr.dmi b/icons/mob/back_vr.dmi
index 5a7f436841..9d7a95b01a 100644
Binary files a/icons/mob/back_vr.dmi and b/icons/mob/back_vr.dmi differ
diff --git a/icons/mob/human_face_vr.dmi b/icons/mob/human_face_vr.dmi
index a54ca17f9a..00b2e58f72 100644
Binary files a/icons/mob/human_face_vr.dmi and b/icons/mob/human_face_vr.dmi differ
diff --git a/icons/mob/human_face_vr_add.dmi b/icons/mob/human_face_vr_add.dmi
index db641e74fe..9dc080e1f1 100644
Binary files a/icons/mob/human_face_vr_add.dmi and b/icons/mob/human_face_vr_add.dmi differ
diff --git a/icons/mob/human_races/r_def_sergal.dmi b/icons/mob/human_races/r_def_sergal.dmi
index c39c2f6038..3222c9e989 100644
Binary files a/icons/mob/human_races/r_def_sergal.dmi and b/icons/mob/human_races/r_def_sergal.dmi differ
diff --git a/icons/mob/human_races/r_fennec_vr.dmi b/icons/mob/human_races/r_fennec_vr.dmi
index d85bdb7e42..99fa60881c 100644
Binary files a/icons/mob/human_races/r_fennec_vr.dmi and b/icons/mob/human_races/r_fennec_vr.dmi differ
diff --git a/icons/mob/human_races/r_fox_vr.dmi b/icons/mob/human_races/r_fox_vr.dmi
index 7cf9c675b7..4517d58135 100644
Binary files a/icons/mob/human_races/r_fox_vr.dmi and b/icons/mob/human_races/r_fox_vr.dmi differ
diff --git a/icons/mob/human_races/r_harpy_vr.dmi b/icons/mob/human_races/r_harpy_vr.dmi
index 002ee25e8d..b8a12cf32e 100644
Binary files a/icons/mob/human_races/r_harpy_vr.dmi and b/icons/mob/human_races/r_harpy_vr.dmi differ
diff --git a/icons/mob/human_races/r_nevrean.dmi b/icons/mob/human_races/r_nevrean.dmi
index dc9a8ae774..d937299dc5 100644
Binary files a/icons/mob/human_races/r_nevrean.dmi and b/icons/mob/human_races/r_nevrean.dmi differ
diff --git a/icons/mob/human_races/r_spider.dmi b/icons/mob/human_races/r_spider.dmi
index 6d0501da40..11cd3507cf 100644
Binary files a/icons/mob/human_races/r_spider.dmi and b/icons/mob/human_races/r_spider.dmi differ
diff --git a/icons/mob/human_races/r_tajaran_vr.dmi b/icons/mob/human_races/r_tajaran_vr.dmi
index 724350146f..a5be7b7d4c 100644
Binary files a/icons/mob/human_races/r_tajaran_vr.dmi and b/icons/mob/human_races/r_tajaran_vr.dmi differ
diff --git a/icons/mob/human_races/r_vulpkanin.dmi b/icons/mob/human_races/r_vulpkanin.dmi
index b054a0c4e2..6f4d013342 100644
Binary files a/icons/mob/human_races/r_vulpkanin.dmi and b/icons/mob/human_races/r_vulpkanin.dmi differ
diff --git a/icons/mob/human_races/r_xenomorph.dmi b/icons/mob/human_races/r_xenomorph.dmi
index eceea3145f..6807555300 100644
Binary files a/icons/mob/human_races/r_xenomorph.dmi and b/icons/mob/human_races/r_xenomorph.dmi differ
diff --git a/icons/mob/screen1_robot.dmi b/icons/mob/screen1_robot.dmi
index c56d1e140c..43d5f421c9 100644
Binary files a/icons/mob/screen1_robot.dmi and b/icons/mob/screen1_robot.dmi differ
diff --git a/icons/mob/species/seromi/head.dmi b/icons/mob/species/seromi/head.dmi
index bc63fd187a..df3411eff2 100644
Binary files a/icons/mob/species/seromi/head.dmi and b/icons/mob/species/seromi/head.dmi differ
diff --git a/icons/mob/species/seromi/suit.dmi b/icons/mob/species/seromi/suit.dmi
index dc6958de59..16a939593a 100644
Binary files a/icons/mob/species/seromi/suit.dmi and b/icons/mob/species/seromi/suit.dmi differ
diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi
index 37f61ce77b..4d56c2a68a 100644
Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ
diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi
index ea08461b8a..ab7f712844 100644
Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ
diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi
index ff89b2dcdd..0aafc2d8ea 100644
Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ
diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi
index c18fed8a7c..60bb13c6e1 100644
Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index 618d3be573..9f43a8d664 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index a163d76e83..d3a54865fd 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/species/vox/head.dmi b/icons/mob/species/vox/head.dmi
index 884dfea1f7..a0b81bfbd0 100644
Binary files a/icons/mob/species/vox/head.dmi and b/icons/mob/species/vox/head.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 6faf4c97f5..9260e30087 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/vore/wings_vr.dmi b/icons/mob/vore/wings_vr.dmi
index f552f2b6c7..aedb041a01 100644
Binary files a/icons/mob/vore/wings_vr.dmi and b/icons/mob/vore/wings_vr.dmi differ
diff --git a/icons/mob/widerobot_vr.dmi b/icons/mob/widerobot_vr.dmi
index 8896bd01eb..3743c2122c 100644
Binary files a/icons/mob/widerobot_vr.dmi and b/icons/mob/widerobot_vr.dmi differ
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 27744ed62e..8e0f83772b 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index fa9ea15dc7..9cc38c1037 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/species/akula/hats.dmi b/icons/obj/clothing/species/akula/hats.dmi
index f162ae1135..ed48c55894 100644
Binary files a/icons/obj/clothing/species/akula/hats.dmi and b/icons/obj/clothing/species/akula/hats.dmi differ
diff --git a/icons/obj/clothing/species/akula/suits.dmi b/icons/obj/clothing/species/akula/suits.dmi
index e0333e4f09..4a30de52e3 100644
Binary files a/icons/obj/clothing/species/akula/suits.dmi and b/icons/obj/clothing/species/akula/suits.dmi differ
diff --git a/icons/obj/clothing/species/fennec/hats.dmi b/icons/obj/clothing/species/fennec/hats.dmi
index daa585d930..0f340d8b94 100644
Binary files a/icons/obj/clothing/species/fennec/hats.dmi and b/icons/obj/clothing/species/fennec/hats.dmi differ
diff --git a/icons/obj/clothing/species/fennec/suits.dmi b/icons/obj/clothing/species/fennec/suits.dmi
index 3442792d4f..18969d0ab6 100644
Binary files a/icons/obj/clothing/species/fennec/suits.dmi and b/icons/obj/clothing/species/fennec/suits.dmi differ
diff --git a/icons/obj/clothing/species/fox/hats.dmi b/icons/obj/clothing/species/fox/hats.dmi
index daa585d930..0f340d8b94 100644
Binary files a/icons/obj/clothing/species/fox/hats.dmi and b/icons/obj/clothing/species/fox/hats.dmi differ
diff --git a/icons/obj/clothing/species/fox/suits.dmi b/icons/obj/clothing/species/fox/suits.dmi
index 3442792d4f..18969d0ab6 100644
Binary files a/icons/obj/clothing/species/fox/suits.dmi and b/icons/obj/clothing/species/fox/suits.dmi differ
diff --git a/icons/obj/clothing/species/nevrean/hats.dmi b/icons/obj/clothing/species/nevrean/hats.dmi
index f162ae1135..ed48c55894 100644
Binary files a/icons/obj/clothing/species/nevrean/hats.dmi and b/icons/obj/clothing/species/nevrean/hats.dmi differ
diff --git a/icons/obj/clothing/species/nevrean/suits.dmi b/icons/obj/clothing/species/nevrean/suits.dmi
index 2083332177..3a857ee39c 100644
Binary files a/icons/obj/clothing/species/nevrean/suits.dmi and b/icons/obj/clothing/species/nevrean/suits.dmi differ
diff --git a/icons/obj/clothing/species/sergal/hats.dmi b/icons/obj/clothing/species/sergal/hats.dmi
index f25e987f79..5616012386 100644
Binary files a/icons/obj/clothing/species/sergal/hats.dmi and b/icons/obj/clothing/species/sergal/hats.dmi differ
diff --git a/icons/obj/clothing/species/sergal/suits.dmi b/icons/obj/clothing/species/sergal/suits.dmi
index afe001a787..5da61c6bfd 100644
Binary files a/icons/obj/clothing/species/sergal/suits.dmi and b/icons/obj/clothing/species/sergal/suits.dmi differ
diff --git a/icons/obj/clothing/species/seromi/hats.dmi b/icons/obj/clothing/species/seromi/hats.dmi
index 97d39473c8..ec3a7b2fc0 100644
Binary files a/icons/obj/clothing/species/seromi/hats.dmi and b/icons/obj/clothing/species/seromi/hats.dmi differ
diff --git a/icons/obj/clothing/species/seromi/suits.dmi b/icons/obj/clothing/species/seromi/suits.dmi
index 5234d887c2..8324d9274d 100644
Binary files a/icons/obj/clothing/species/seromi/suits.dmi and b/icons/obj/clothing/species/seromi/suits.dmi differ
diff --git a/icons/obj/clothing/species/skrell/hats.dmi b/icons/obj/clothing/species/skrell/hats.dmi
index c8f1dfc515..d132ea5183 100644
Binary files a/icons/obj/clothing/species/skrell/hats.dmi and b/icons/obj/clothing/species/skrell/hats.dmi differ
diff --git a/icons/obj/clothing/species/skrell/suits.dmi b/icons/obj/clothing/species/skrell/suits.dmi
index 22b74198f0..00a304a197 100644
Binary files a/icons/obj/clothing/species/skrell/suits.dmi and b/icons/obj/clothing/species/skrell/suits.dmi differ
diff --git a/icons/obj/clothing/species/tajaran/hats.dmi b/icons/obj/clothing/species/tajaran/hats.dmi
index b392ab37af..0f2ebda4e1 100644
Binary files a/icons/obj/clothing/species/tajaran/hats.dmi and b/icons/obj/clothing/species/tajaran/hats.dmi differ
diff --git a/icons/obj/clothing/species/tajaran/suits.dmi b/icons/obj/clothing/species/tajaran/suits.dmi
index 2d18418610..a18223677f 100644
Binary files a/icons/obj/clothing/species/tajaran/suits.dmi and b/icons/obj/clothing/species/tajaran/suits.dmi differ
diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi
index b213b00a15..13a59eeabc 100644
Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ
diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi
index 62dfc57cfe..21e0f8bcd7 100644
Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ
diff --git a/icons/obj/clothing/species/vulpkanin/hats.dmi b/icons/obj/clothing/species/vulpkanin/hats.dmi
index e227fe38d8..d29e6998e9 100644
Binary files a/icons/obj/clothing/species/vulpkanin/hats.dmi and b/icons/obj/clothing/species/vulpkanin/hats.dmi differ
diff --git a/icons/obj/clothing/species/vulpkanin/suits.dmi b/icons/obj/clothing/species/vulpkanin/suits.dmi
index e4c3d8e75d..f8b3b2e51a 100644
Binary files a/icons/obj/clothing/species/vulpkanin/suits.dmi and b/icons/obj/clothing/species/vulpkanin/suits.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 52ae865f92..424bc8894c 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index e037ce6f9b..e517091428 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 32827b2b81..87af25615b 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 6af3f71071..9c7d917fa9 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/storage_vr.dmi b/icons/obj/storage_vr.dmi
index 46e3798092..a291eadb7d 100644
Binary files a/icons/obj/storage_vr.dmi and b/icons/obj/storage_vr.dmi differ
diff --git a/maps/tether/tether-01-surface.dmm b/maps/tether/tether-01-surface.dmm
index a7c013d9f6..8742e2944d 100644
--- a/maps/tether/tether-01-surface.dmm
+++ b/maps/tether/tether-01-surface.dmm
@@ -5598,6 +5598,8 @@
"cdH" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/mauve/border{dir = 10},/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/tiled,/area/rnd/research)
"cdI" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/mauve/border{dir = 6},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/flora/pottedplant/stoutbush,/turf/simulated/floor/tiled,/area/rnd/research)
"cdJ" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/beige/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/beige/bordercorner2{dir = 6},/obj/structure/sign/department/bar{pixel_x = 32},/obj/structure/flora/pottedplant/xmas,/turf/simulated/floor/tiled,/area/hallway/lower/third_south)
+"cdK" = (/obj/structure/flora/ausbushes/ywflowers,/obj/machinery/light/small{dir = 8; pixel_x = 0},/turf/simulated/floor/grass,/area/tether/surfacebase/atrium_one)
+"cdL" = (/obj/structure/flora/ausbushes/ywflowers,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/grass,/area/tether/surfacebase/atrium_one)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaacaacaacaacaacaacaacaacaacaacaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -5643,7 +5645,7 @@ aaaaadaadaadaadaadaadaadaadaadaadaadaadakbakbalZaiyamaambaiyamcamdagUameamfamgam
aaaaadaadaadaadaadaadaadaadaadaadaadaadaahaahamDamDamDamDamDamEamEamEamEamFamFamFamFamFamGamHamIahlakVakXakXakXalJakXakXakXakVakVakVakVakVakVakVakVakVakVakVaktaktamJamKamLamMalgalOalgbykahXahXahXahXahXaahaahagMbcCakCajUamOalRalSalSalSalSalSalSalSalTamOajUajVakFagMalralralralralramPamPamQamPamRamPamSamSamTalYalYalYalraahaahaahaadaadaadaadaadaadaadaadaadaadaaa
aaaaadaadaadaadaadaadaadaadaadaadaadaahaahaahamUamVamWamXamUamYamZanaamUanbancandaneanfangakoakpahlakVakXalJakXakXamlamlakXakXakXakVakVakVakVakVakVakVakVakVakVaktaktanhanianjalgankalOalOalgaahaahaahaahaahaahagManlakCajUamOalRalSalSanmanmanmalSalSalTamOajUajVannagMaahaahaahalranoanoalralralralralralralralralralralralraahaahaahaadaadaadaadaadaadaadaadaadaadaaa
aaaaadaadaadaadaadaadaadaadaadaadaadaahaahaahamUanpanqanramUansantanuamUanvanwanwanxanyanzaiHanAahlanBakXalaakXakXakXakXalJalJalaakVakVakVakVakVakVakVakVakVakVakVaktaktaktaktalganCanDalOalgaahaahaahaahaahaahagManEakCajUamOalRalSalTanFanFanGalRalSalTamOajUajVanHagMaahaahaahalranIalralraahaahaahaahaahaahaahaahaahaahaahaahaahaahaadaadaadaadaadaadaadaadaadaadaaa
-aaaaadaadaadaadaadaadaadaadaadaadaadaahamUamUamUanJanKanLamUanManNanOamUanPbdyanRanSanTanUakoanVanWakXakXakXakXakXalJakXakXakXalaakVakVakVakVakVakVakVakVakVakVakVakVakVakVakValganXanYanZalgaahaahaahaahaahaahaoaalQaobajUamOalRalSalTanFbzAanFalRalSalTamOajUaocakFaodaoeaoeaoeaoeaofaoeaoeaoeaoeaoeaoeaahaahaahaahaahaahaahaahaahaahaadaadaadaadaadaadaadaadaadaadaaa
+aaaaadaadaadaadaadaadaadaadaadaadaadaahamUamUamUanJanKanLamUanManNanOamUanPbdyanRanSanTanUakoanVanWakXakXakXakXakXalJakXakXakXalaakVakVakVakVakVakVakVakVakVakVakVakVakVakVakValganXanYanZalgaahaahaahaahaahaahaoaalQaobajUamOalRalSalTcdKbzAcdLalRalSalTamOajUaocakFaodaoeaoeaoeaoeaofaoeaoeaoeaoeaoeaoeaahaahaahaahaahaahaahaahaahaahaadaadaadaadaadaadaadaadaadaadaaa
aaaaadaadaadaadaadaadaadaadaadaadaadaahamUaogamUaohaoiaojamUaokaolaomamUamFamFamFamFamFaonaooaopaoqaoralJamlakXakXakXakXakXaosaotakVakVakVakVakValgalgalgalgalgalgalgalgalgalgalgalgalgaoualgalgalgalgalgalgalgagMalQakCajUamOalRalSalTanGanFanGalRalSalTamOajUajVakFaoeaovaowaoxaoyaozaoeaoAaoBaoCaoDaoeaahaahaahaahaahaahaahaahaahaahaadaadaadaadaadaadaadaadaadaadaaa
aaaaadaadaadaadaadaadaadaadaadaadaahaahamUaoEaoFaoGaoHaoIaoJaoKaoLaoMamUaoNaoOaoPaoQahlaoRakoaoSahlaoTakXakXakXalJalJaoUakVakVakVakVakVakVakVakValgaoVaoWaoXalOalOaoYalOalOalOalOalOalOaoZapaapaapaapaapaapaapaapbapcakCajUamOalRalSalSaloaloaloalSalSalTamOajUajVaHgaoeapeapfapgaphapiaoeapjapkaoeaoeaoeaahaahaahaahaahaahaahaahaadaadaadaadaadaadaadaadaadaadaadaadaaa
aaaaadaadaadaadaadaadaadaadaadaadaahaahamUarsaoFaoGapmapnapoappapmaoMamUapqaprapsaptahlapuapvakpahlapwakXakXalJapxakVakVakVakVakVakVakVakVakVakValgapyalOapzapAapAapAanCanCanCanCapBapCalgapDalgalgapEapFalgalgagMapGakCajUamOalRalSalSalSalSalSalSalSalTamOajUajVapHaoeapeapIapJapKapLaoeapMapNapOaoDaoeaahapPapPapPapPapPapPapPapQapRapRapSapTapTapTapTapSapRapRapUaaa
diff --git a/maps/tether/tether-03-station.dmm b/maps/tether/tether-03-station.dmm
index b17d6ff268..dac3e2c711 100644
--- a/maps/tether/tether-03-station.dmm
+++ b/maps/tether/tether-03-station.dmm
@@ -144,7 +144,7 @@
"acN" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/obj/machinery/camera/network/engineering,/turf/simulated/floor,/area/engineering/engine_smes)
"acO" = (/obj/machinery/power/terminal{tag = "icon-term (WEST)"; icon_state = "term"; dir = 8},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/engineering/engine_smes)
"acP" = (/obj/machinery/power/grid_checker,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/engineering/engine_smes)
-"acQ" = (/obj/machinery/power/smes/buildable{charge = 2e+007; cur_coils = 4; input_attempt = 1; input_level = 500000; output_level = 500000; RCon_tag = "Power - Main"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/engineering/engine_smes)
+"acQ" = (/obj/machinery/power/smes/buildable{charge = 2e+007; cur_coils = 4; input_attempt = 1; input_level = 500000; output_level = 1000000; RCon_tag = "Power - Main"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor,/area/engineering/engine_smes)
"acR" = (/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 1},/turf/simulated/floor/tiled,/area/engineering/hallway)
"acS" = (/turf/simulated/wall/r_wall,/area/engineering/workshop)
"acT" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/spline/plain{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_5)
diff --git a/maps/tether/tether-07-misc.dmm b/maps/tether/tether-07-misc.dmm
index 754fe684d7..2e244f6e58 100644
--- a/maps/tether/tether-07-misc.dmm
+++ b/maps/tether/tether-07-misc.dmm
@@ -1066,10 +1066,10 @@
"uz" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/shuttle/floor{tag = "icon-floor_dred"; icon_state = "floor_dred"},/area/syndicate_station/start)
"uA" = (/obj/item/device/aicard,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{tag = "icon-floor_black"; icon_state = "floor_black"},/area/syndicate_station/start)
"uB" = (/obj/effect/floor_decal/corner_steel_grid{dir = 10},/obj/effect/floor_decal/industrial/danger,/obj/machinery/door/airlock/glass_external/public{frequency = 1379; icon_state = "door_locked"; id_tag = "merc_south_airlock_outer"; locked = 1},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "smindicate"; name = "Outer Airlock"; opacity = 0},/turf/simulated/shuttle/floor{tag = "icon-floor_dred"; icon_state = "floor_dred"},/area/syndicate_station/start)
+"uC" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/table/rack,/turf/simulated/shuttle/floor{tag = "icon-floor_yellow"; icon_state = "floor_yellow"},/area/syndicate_station/start)
"uD" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
"uE" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
"uF" = (/obj/item/device/radio/intercom{desc = "Talk through this. Evilly"; frequency = 1213; name = "Syndicate Intercom"; pixel_x = 0; pixel_y = -32; subspace_transmission = 1; syndie = 1},/obj/structure/closet/syndicate,/obj/item/clothing/mask/gas/wwii,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/item/clothing/head/helmet,/obj/item/clothing/shoes/boots/jackboots,/obj/item/clothing/suit/armor/vest,/obj/item/clothing/under/syndicate,/obj/item/clothing/gloves/black,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
-"uG" = (/obj/machinery/telecomms/allinone{intercept = 1},/obj/machinery/door/window/northright{name = "Telecoms Mainframe"; req_access = list(150)},/obj/structure/window/reinforced{dir = 4},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{tag = "icon-floor_yellow"; icon_state = "floor_yellow"},/area/syndicate_station/start)
"uH" = (/obj/machinery/washing_machine,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
"uI" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
"uJ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/syndicate_station/start)
@@ -1187,7 +1187,7 @@ ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapap
ahaieGeGeGeGeGaiahappEqxpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapaphbhahcdCjLhdpihfhfdCdChfpjeyunprdCprprqfhUujhWhVhXaCfkflapapapapgp
ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRqKpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapgLhYuodCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCigigigigaCfkihapapapapgp
ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapgLiiuodCdCupdCdCdCdCdCdCdCuqdCdCdCdCdCdCuqigigigigaCfkihapapapapgp
-ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapikhaildCurcJuDisitdCdCituEeyuFprdCprprqfeyuGixiwizaCfkiAapapapapgp
+ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapikhaildCurcJuDisitdCdCituEeyuFprdCprprqfeyuCixiwizaCfkiAapapapapgp
ahaieGeGeGeGeGaiahappEqxpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapapgLgYgMiBaCaCaCeyumdCeyaCaCaCeyuleyaCaCaCaCaCaCaCaCcJfkiAapapapgp
ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRqKpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapaCaCaCaCaCaCaCfmfydCdCiFuHeyuIusdCususuJutiGiLiLiGiPaCcJfkiAapapgp
ahaieGeGeGeGeGaiahappEpFpRpRpRpRpRpHpEapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapapapuiaCuKiQcDjccJeDexdCdCdCdCuldCdCdCdCdCdCjdiGuvuuiGjsaCaCcJfkiAapgp
diff --git a/vorestation.dme b/vorestation.dme
index eac73393b2..10ecdfcc9b 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -877,11 +877,13 @@
#include "code\game\objects\items\contraband_vr.dm"
#include "code\game\objects\items\crayons.dm"
#include "code\game\objects\items\glassjar.dm"
+#include "code\game\objects\items\gunbox.dm"
#include "code\game\objects\items\latexballoon.dm"
#include "code\game\objects\items\paintkit.dm"
#include "code\game\objects\items\shooting_range.dm"
#include "code\game\objects\items\toys.dm"
#include "code\game\objects\items\trash.dm"
+#include "code\game\objects\items\trash_vr.dm"
#include "code\game\objects\items\devices\ai_detector.dm"
#include "code\game\objects\items\devices\aicard.dm"
#include "code\game\objects\items\devices\binoculars.dm"
@@ -2103,6 +2105,7 @@
#include "code\modules\multiz\basic.dm"
#include "code\modules\multiz\ladder_assembly_vr.dm"
#include "code\modules\multiz\movement.dm"
+#include "code\modules\multiz\movement_vr.dm"
#include "code\modules\multiz\open_space_controller.dm"
#include "code\modules\multiz\pipes.dm"
#include "code\modules\multiz\structures.dm"