diff --git a/code/controllers/subsystems/transcore_vr.dm b/code/controllers/subsystems/transcore_vr.dm
index 0c2236f6e4..593650e1b0 100644
--- a/code/controllers/subsystems/transcore_vr.dm
+++ b/code/controllers/subsystems/transcore_vr.dm
@@ -112,10 +112,11 @@ SUBSYSTEM_DEF(transcore)
if(since_backup < overdue_time)
curr_MR.dead_state = MR_NORMAL
else
- if(curr_MR.dead_state != MR_DEAD) //First time switching to dead
+/* if(curr_MR.dead_state != MR_DEAD) //First time switching to dead //Remove auto notification! Ghosts have a button to notify, so no more false flags.
if(curr_MR.do_notify)
db.notify(curr_MR)
curr_MR.last_notification = world.time
+*/
curr_MR.dead_state = MR_DEAD
if(MC_TICK_CHECK)
diff --git a/code/datums/components/crafting/recipes/weapons.dm b/code/datums/components/crafting/recipes/weapons.dm
index bcb00d0d07..68f01b54e9 100644
--- a/code/datums/components/crafting/recipes/weapons.dm
+++ b/code/datums/components/crafting/recipes/weapons.dm
@@ -60,10 +60,8 @@
/datum/crafting_recipe/scopedrifle
name = "Bolt scope to bolt-action (cannot be removed)"
result = /obj/item/weapon/gun/projectile/shotgun/pump/rifle/scoped
- reqs = list(
- /obj/item/device/binoculars/scope = 1,
- /obj/item/weapon/gun/projectile/shotgun/pump/rifle = 1
- )
+ reqs = list(list(/obj/item/device/binoculars/scope = 1),
+ list(/obj/item/weapon/gun/projectile/shotgun/pump/rifle = 1))
time = 180
category = CAT_WEAPONRY
- subcategory = CAT_WEAPON
\ No newline at end of file
+ subcategory = CAT_WEAPON
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 02dd0426fb..bc0c2dca14 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -228,6 +228,9 @@
if(!temp)
to_chat(user, "You try to use your hand, but realize it is no longer attached!")
return
+ if(istype(src, /obj/item/weapon/holder))
+ var/obj/item/weapon/holder/D = src
+ if(D.held_mob == user) return // No picking your own micro self up
var/old_loc = src.loc
if (istype(src.loc, /obj/item/weapon/storage))
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 5adca5dffb..b7304fa8a1 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -298,7 +298,8 @@ var/global/list/default_medbay_channels = list(
GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
-/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels)
+/obj/item/device/radio/proc/autosay(var/message, var/from, var/channel, var/list/zlevels, var/states) //VOREStation Edit
+
if(!GLOB.autospeaker)
return
var/datum/radio_frequency/connection = null
@@ -314,12 +315,15 @@ GLOBAL_DATUM(autospeaker, /mob/living/silicon/ai/announcer)
if(!LAZYLEN(zlevels))
zlevels = list(0)
-
+ //VOREStation Edit Start
+ if(!states)
+ states = "states"
+ //VOREStation Edit End
GLOB.autospeaker.SetName(from)
Broadcast_Message(connection, GLOB.autospeaker,
0, "*garbled automated announcement*", src,
message_to_multilingual(message), from, "Automated Announcement", from, "synthesized voice",
- DATA_FAKE, 0, zlevels, connection.frequency, "states")
+ DATA_FAKE, 0, zlevels, connection.frequency, states) //VOREStation Edit
// Interprets the message mode when talking into a radio, possibly returning a connection datum
/obj/item/device/radio/proc/handle_message_mode(mob/living/M as mob, list/message_pieces, message_mode)
diff --git a/code/game/objects/items/gunbox.dm b/code/game/objects/items/gunbox.dm
index d97aa51ba0..249daf1b4e 100644
--- a/code/game/objects/items/gunbox.dm
+++ b/code/game/objects/items/gunbox.dm
@@ -33,6 +33,27 @@
options["Stun Revolver"] = list(/obj/item/weapon/gun/energy/stunrevolver/detective, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/cell/device/weapon)
options["Taser"] = list(/obj/item/weapon/gun/energy/taser, /obj/item/weapon/cell/device/weapon, /obj/item/weapon/cell/device/weapon)
var/choice = tgui_input_list(user,"Please, select an option.", "Stun Gun!", 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)
+
+/*
+ * CentCom Pistol
+ */
+/obj/item/gunbox/centcom
+ name = "centcom sidearm box"
+ desc = "A secure box containing a lethal sidearm used by Central Command."
+ w_class = ITEMSIZE_HUGE
+/obj/item/gunbox/centcom/attack_self(mob/living/user)
+ var/list/options = list()
+ options["Écureuil (10mm)"] = list(/obj/item/weapon/gun/projectile/ecureuil, /obj/item/ammo_magazine/m10mm/pistol, /obj/item/ammo_magazine/m10mm/pistol)
+ options["Écureuil Olive (10mm)"] = list(/obj/item/weapon/gun/projectile/ecureuil/tac, /obj/item/ammo_magazine/m10mm/pistol, /obj/item/ammo_magazine/m10mm/pistol)
+ options["Écureuil Tan (10mm)"] = list(/obj/item/weapon/gun/projectile/ecureuil/tac2, /obj/item/ammo_magazine/m10mm/pistol, /obj/item/ammo_magazine/m10mm/pistol)
+ var/choice = tgui_input_list(user,"Please, select an option.", "Gun!", 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.
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index b1fbed33c2..d482535968 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -25,7 +25,7 @@
var/max_w_class = ITEMSIZE_SMALL //Max size of objects that this object can store (in effect only if can_hold isn't set)
var/max_storage_space = ITEMSIZE_COST_SMALL * 4 //The sum of the storage costs of all the items in this storage item.
var/storage_slots = null //The number of storage slots in this container. If null, it uses the volume-based storage instead.
-
+
/// Boxes screen object for fixed-size storage (belts, etc)
var/obj/screen/storage/boxes = null
/// List of 'click catchers' for boxes for fixed-size storage
@@ -37,8 +37,8 @@
var/obj/screen/storage/storage_continue = null
/// For dynamic storage, the rightmost pixel column for the whole storage display. Decorative.
var/obj/screen/storage/storage_end = null
-
- /// The "X" button at the far right of the storage
+
+ /// The "X" button at the far right of the storage
var/obj/screen/close/closer = null
var/use_to_pickup //Set this to make it possible to use this item in an inverse way, so you can have the item in your hand and click items on the floor to pick them up.
@@ -189,12 +189,12 @@
return
if(user.s_active)
user.s_active.hide_from(user)
-
+
var/client/C = user.client
if(!C)
return
- if(storage_slots)
+ if(storage_slots)
C.screen += src.boxes
create_slot_catchers()
C.screen += src.box_catchers
@@ -202,7 +202,7 @@
C.screen += src.storage_start
C.screen += src.storage_continue
C.screen += src.storage_end
-
+
C.screen += src.closer
C.screen += src.contents
@@ -212,12 +212,12 @@
/obj/item/weapon/storage/proc/hide_from(mob/user as mob)
var/client/C = user.client
LAZYREMOVE(is_seeing,user)
-
+
if(!C)
if(!LAZYLEN(is_seeing))
clear_slot_catchers()
return
-
+
if(storage_slots)
C.screen -= src.boxes
C.screen -= src.box_catchers
@@ -225,13 +225,13 @@
C.screen -= src.storage_start
C.screen -= src.storage_continue
C.screen -= src.storage_end
-
+
C.screen -= src.closer
C.screen -= src.contents
-
+
if(user.s_active == src)
user.s_active = null
-
+
if(!LAZYLEN(is_seeing))
clear_slot_catchers()
@@ -330,7 +330,7 @@
/obj/item/weapon/storage/proc/space_orient_objs(var/list/obj/item/display_contents)
SHOULD_NOT_SLEEP(TRUE)
-
+
/// A prototype for drawing the leftmost border behind each item in storage
var/static/mutable_appearance/stored_start
/// A prototype for drawing the wide backing space behind each item in storage
@@ -856,7 +856,7 @@
ASSERT(held_item)
name += held_item.name
src.held_item = weakref(held_item)
-
+
/atom/movable/storage_slot/Destroy()
held_item = null
@@ -869,4 +869,33 @@
var/obj/item/I = held_item?.resolve()
if(I)
usr.ClickOn(I)
- return 1
\ No newline at end of file
+ return 1
+
+// Allows micros to drag themselves into storage items
+/obj/item/weapon/storage/MouseDrop_T(mob/living/target, mob/living/user)
+ if(!istype(user)) return // If the user passed in isn't a living mob, exit
+ if(target != user) return // If the user didn't drag themselves, exit
+ if(user.incapacitated() || user.buckled) return // If user is incapacitated or buckled, exit
+ if(get_holder_of_type(src, /mob/living/carbon/human) == user) return // No jumping into your own equipment
+ if(ishuman(user) && user.get_effective_size() > 0.25) return // Only micro characters
+ if(ismouse(user) && user.get_effective_size() > 1) return // Only normal sized mice or less
+
+ // Create a dummy holder with user's size to test insertion
+ var/obj/item/weapon/holder/D = new/obj/item/weapon/holder
+ if(ismouse(user))
+ D.w_class = ITEMSIZE_TINY // Mouse smol
+ else if(ishuman(user))
+ D.w_class = ITEMSIZE_SMALL // Players small
+ else // Other creatures not accepted at this time
+ qdel(D) // If there's a better way to check the size of a
+ return // mob's holder and if it fits, replace this slab
+ if(!src.can_be_inserted(D, 1)) // If the dummy item doesn't fit, exit
+ qdel(D)
+ return
+ qdel(D)
+
+ // Scoop and insert target into storage
+ var/obj/item/weapon/holder/H = new user.holder_type(get_turf(user), user)
+ src.handle_item_insertion(H, 1)
+ to_chat(user, "You climb into \the [src].")
+ return ..()
diff --git a/code/game/objects/random/guns_and_ammo.dm b/code/game/objects/random/guns_and_ammo.dm
index 990527ac22..1e94a8b2c9 100644
--- a/code/game/objects/random/guns_and_ammo.dm
+++ b/code/game/objects/random/guns_and_ammo.dm
@@ -379,8 +379,8 @@
),
prob(5);list(
/obj/item/weapon/gun/projectile/luger,
- /obj/item/ammo_magazine/m9mm/compact,
- /obj/item/ammo_magazine/m9mm/compact
+ /obj/item/ammo_magazine/m9mm/luger,
+ /obj/item/ammo_magazine/m9mm/luger
),
prob(4);list(
/obj/item/weapon/gun/projectile/luger/brown,
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 2d11b0dea4..404bdfbfda 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -29,11 +29,9 @@
/obj/item/device/radio/headset/heads/hop,
/obj/item/device/radio/headset/heads/hop/alt,
/obj/item/weapon/storage/box/ids = 2,
- ///obj/item/weapon/gun/energy/gun, //YW Edit,
- /obj/item/weapon/gun/energy/gun/martin, //VOREStation Add,
- /obj/item/weapon/storage/box/commandkeys, //VOREStation Add,
- /obj/item/weapon/storage/box/servicekeys, //VOREStation Add,
- ///obj/item/weapon/gun/projectile/sec/flash, //VOREStation Removal,
+ /obj/item/weapon/gun/energy/gun/compact,
+ /obj/item/weapon/storage/box/commandkeys,
+ /obj/item/weapon/storage/box/servicekeys,
/obj/item/device/flash)
/obj/structure/closet/secure_closet/hop2
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 8feb63148c..4b9ffbfed8 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -138,6 +138,8 @@
if(M.slip("the [floor_type] floor", slip_stun))
for(var/i = 1 to slip_dist)
+ if(isbelly(M.loc)) //VOREEdit, Stop the slip if we're in a belly. Inspired by a chompedit, cleaned it up with isbelly instead of a variable since the var was resetting too fast.
+ return
step(M, M.dir)
sleep(1)
else
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index c19b70a85d..9bd7fb3feb 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -714,10 +714,16 @@ var/datum/announcement/minor/admin_min_announcer = new
if(sender) //They put a sender
sender = sanitize(sender, 75, extra = 0)
var/message = input(usr, "Message content (max 500):", "Contents", "This is a test of the announcement system.") as null|message
-
+ var/msgverb = input(usr, "Name of verb (Such as 'states', 'says', 'asks', etc):", "Verb", "says") as null|text //VOREStation Addition
if(message) //They put a message
message = sanitize(message, 500, extra = 0)
- global_announcer.autosay("[message]", "[sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
+ //VOREStation Edit Start
+ if(msgverb)
+ msgverb = sanitize(msgverb, 50, extra = 0)
+ else
+ msgverb = "states"
+ global_announcer.autosay("[message]", "[sender]", "[channel == "Common" ? null : channel]", states = msgverb) //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
+ //VOREStation Edit End
log_admin("Intercom: [key_name(usr)] : [sender]:[message]")
feedback_add_details("admin_verb","IN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -802,7 +808,7 @@ var/datum/announcement/minor/admin_min_announcer = new
var/this_sender = decomposed[i]
var/this_message = decomposed[++i]
var/this_wait = decomposed[++i]
- global_announcer.autosay("[this_message]", "[this_sender]", "[channel == "Common" ? null : channel]") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set.
+ global_announcer.autosay("[this_message]", "[this_sender]", "[channel == "Common" ? null : channel]", "says") //Common is a weird case, as it's not a "channel", it's just talking into a radio without a channel set. //VOREStation Edit
sleep(this_wait SECONDS)
/datum/admins/proc/toggleooc()
diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm
index 0fe5cc0ce2..7ab8b4bf47 100644
--- a/code/modules/admin/admin_verb_lists_vr.dm
+++ b/code/modules/admin/admin_verb_lists_vr.dm
@@ -159,7 +159,8 @@ var/list/admin_verbs_fun = list(
/client/proc/smite_vr, //VOREStation Add,
/client/proc/admin_lightning_strike,
/client/proc/resize, //VOREStation Add,
- /client/proc/cmd_admin_droppod_deploy
+ /client/proc/cmd_admin_droppod_deploy,
+ /client/proc/adminorbit //VOREStation Add,
)
var/list/admin_verbs_spawn = list(
diff --git a/code/modules/admin/admin_verbs_vr.dm b/code/modules/admin/admin_verbs_vr.dm
new file mode 100644
index 0000000000..6d92fde40b
--- /dev/null
+++ b/code/modules/admin/admin_verbs_vr.dm
@@ -0,0 +1,56 @@
+/client/proc/adminorbit()
+ set category = "Fun"
+ set name = "Orbit Things"
+ set desc = "Makes something orbit around something else."
+ set popup_menu = FALSE
+
+ if(!check_rights(R_FUN))
+ return
+
+ var/center
+ var/atom/movable/orbiter
+ var/input
+
+ if(holder.marked_datum)
+ input = tgui_alert(usr, "You have \n[holder.marked_datum] marked, should this be the center of the orbit, or the orbiter?", "Orbit", list("Center", "Orbiter", "Neither"))
+ switch(input)
+ if("Center")
+ center = holder.marked_datum
+ if("Orbiter")
+ orbiter = holder.marked_datum
+ var/list/possible_things = list()
+ for(var/T as mob in view(view)) //Let's do mobs before objects
+ if(ismob(T))
+ possible_things |= T
+ for(var/T as obj in view(view))
+ if(isobj(T))
+ possible_things |= T
+ if(!center)
+ center = input(usr, "What should act as the center of the orbit?", "Center") as anything in possible_things
+ possible_things -= center
+ if(!orbiter)
+ orbiter = input(usr, "What should act as the orbiter of the orbit?", "Orbiter") as anything in possible_things
+ if(!center || !orbiter)
+ to_chat(usr, "A center of orbit and an orbiter must be configured. You can also do this by marking a target.")
+ return
+ if(center == orbiter)
+ to_chat(usr, "The center of the orbit cannot also be the orbiter.")
+ return
+ if(isturf(orbiter))
+ to_chat(usr, "The orbiter cannot be a turf. It can only be used as a center.")
+ return
+ var/distance = input(usr, "How large will their orbit radius be? (In pixels. 32 is 'near around a character)", "Orbit Radius", 32) as num|null
+ var/speed = input(usr, "How fast will they orbit (negative numbers spin clockwise)", "Orbit Speed", 20) as num|null
+ var/segments = input(usr, "How many segments will they have in their orbit? (3 is a triangle, 36 is a circle, etc)", "Orbit Segments", 36) as num|null
+ var/clock = FALSE
+ if(!distance)
+ distance = 32
+ if(!speed)
+ speed = 20
+ else if (speed < 0)
+ clock = TRUE
+ speed *= -1
+ if(!segments)
+ segments = 36
+ if(tgui_alert(usr, "\The [orbiter] will orbit around [center]. Is this okay?", "Confirm Orbit", list("Yes", "No")) == "Yes")
+ orbiter.orbit(center, distance, clock, speed, segments)
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index 95442b0f82..c108bbf14b 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -10,18 +10,18 @@
set category = "Admin"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT))
return
-
+
if(!config.allow_admin_jump)
tgui_alert_async(usr, "Admin jumping disabled")
return
var/area/A
-
+
if(areaname)
A = return_sorted_areas()[areaname]
else
A = tgui_input_list(usr, "Pick an area:", "Jump to Area", return_sorted_areas())
-
+
if(!A)
return
@@ -62,7 +62,7 @@
if(!config.allow_admin_jump)
tgui_alert_async(usr, "Admin jumping disabled")
return
-
+
if(!M)
M = tgui_input_list(usr, "Pick a mob:", "Jump to Mob", mob_list)
if(!M)
@@ -78,7 +78,7 @@
feedback_add_details("admin_verb","JM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
to_chat(A, "This mob is not located in the game world.")
-
+
/client/proc/jumptocoord(tx as num, ty as num, tz as num)
set category = "Admin"
set name = "Jump to Coordinate"
@@ -94,7 +94,7 @@
if(!T)
to_chat(usr, "Those coordinates are outside the boundaries of the map.")
return
- A.forceMove(T)
+ A.forceMove(T)
feedback_add_details("admin_verb","JC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]")
@@ -124,15 +124,17 @@
else
tgui_alert_async(usr, "Admin jumping disabled")
-/client/proc/Getmob()
+/client/proc/Getmob(mob/living/M as null|anything in mob_list) //VOREStation Edit
set category = "Admin"
set name = "Get Mob"
set desc = "Mob to teleport"
+ set popup_menu = TRUE //VOREStation Edit
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT))
return
if(config.allow_admin_jump)
- var/mob/M = tgui_input_list(usr, "Pick a mob:", "Get Mob", mob_list)
+ if(!M) //VOREStation Edit
+ M = tgui_input_list(usr, "Pick a mob:", "Get Mob", mob_list) //VOREStation Edit
if(!M)
return
log_admin("[key_name(usr)] jumped [key_name(M)] to them")
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 267871366b..fcf5d64e7e 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -9,6 +9,8 @@
return
for(var/obj/item/W in M)
+ if(istype(W, /obj/item/weapon/implant/backup) || istype(W, /obj/item/device/nif)) //VOREStation Edit - There's basically no reason to remove either of these
+ continue //VOREStation Edit
M.drop_from_inventory(W)
log_admin("[key_name(usr)] made [key_name(M)] drop everything!")
diff --git a/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm
index 121da61371..2cd0f239ff 100644
--- a/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm
+++ b/code/modules/ai/ai_holder_subtypes/slime_xenobio_ai.dm
@@ -105,6 +105,16 @@
/datum/ai_holder/simple_mob/xenobio_slime/handle_special_strategical()
discipline_decay()
+/datum/ai_holder/simple_mob/xenobio_slime/request_help()
+ if(target)
+ if(istype(target, /mob/living/simple_mob/slime/xenobio)) //Don't call reinforcements for internal disputes
+ return
+ if(istype(target, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = target
+ if(istype(H.species, /datum/species/monkey)) //Or for food
+ return
+ ..()
+
// Handles decay of discipline.
/datum/ai_holder/simple_mob/xenobio_slime/proc/discipline_decay()
if(discipline > 0 && last_discipline_decay + discipline_decay_time < world.time)
diff --git a/code/modules/mob/dead/observer/observer_vr.dm b/code/modules/mob/dead/observer/observer_vr.dm
index 1fb9d913c9..56daefb1d2 100644
--- a/code/modules/mob/dead/observer/observer_vr.dm
+++ b/code/modules/mob/dead/observer/observer_vr.dm
@@ -68,8 +68,14 @@
var/datum/transcore_db/db = SStranscore.db_by_mind_name(mind.name)
if(db)
var/datum/transhuman/mind_record/record = db.backed_up[src.mind.name]
- if(!(record.dead_state == MR_DEAD))
- to_chat(src, "Your backup is not past-due yet.")
+ if(!(record.dead_state == MR_DEAD))
+ if((world.time - timeofdeath ) > 5 MINUTES) //Allows notify transcore to be used if you have an entry but for some reason weren't marked as dead
+ record.dead_state = MR_DEAD //Such as if you got scanned but didn't take an implant. It's a little funky, but I mean, you got scanned
+ db.notify(record) //So you probably will want to let someone know if you die.
+ record.last_notification = world.time
+ to_chat(src, "New notification has been sent.")
+ else
+ to_chat(src, "Your backup is not past-due yet.")
else if((world.time - record.last_notification) < 5 MINUTES)
to_chat(src, "Too little time has passed since your last notification.")
else
@@ -78,7 +84,7 @@
to_chat(src, "New notification has been sent.")
else
to_chat(src,"No backup record could be found, sorry.")
-
+/*
/mob/observer/dead/verb/backup_delay()
set category = "Ghost"
set name = "Cancel Transcore Notification"
@@ -97,7 +103,7 @@
to_chat(src, "Overdue mind backup notification delayed successfully.")
else
to_chat(src,"No backup record could be found, sorry.")
-
+*/
/mob/observer/dead/verb/findghostpod() //Moves the ghost instead of just changing the ghosts's eye -Nodrak
set category = "Ghost"
set name = "Find Ghost Pod"
@@ -123,4 +129,32 @@
forceMove(T)
stop_following()
else
- to_chat(src, "This ghost pod is not located in the game world.")
\ No newline at end of file
+ to_chat(src, "This ghost pod is not located in the game world.")
+
+/mob/observer/dead/verb/findautoresleever()
+ set category = "Ghost"
+ set name = "Find Auto Resleever"
+ set desc = "Find a Auto Resleever"
+ set popup_menu = FALSE
+
+ if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer!
+ return
+
+ var/list/ar = list()
+ for(var/obj/machinery/transhuman/autoresleever/A in world)
+ if(A.spawntype)
+ continue
+ else
+ ar |= A
+
+ var/obj/machinery/transhuman/autoresleever/thisone = pick(ar)
+
+ if(!thisone)
+ to_chat(src, "There appears to be no auto-resleevers available.")
+ return
+ var/L = get_turf(thisone)
+ if(!L)
+ to_chat(src, "There appears to be something wrong with this auto-resleever, try again.")
+ return
+
+ forceMove(L)
diff --git a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm
index 950fc03dea..17f9012916 100644
--- a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm
@@ -383,6 +383,7 @@
blob.Weaken(2)
blob.transforming = TRUE
blob.ckey = ckey
+ blob.ooc_notes = ooc_notes
blob.transforming = FALSE
blob.name = name
blob.nutrition = nutrition
@@ -454,6 +455,7 @@
playsound(src.loc, "sound/effects/slime_squish.ogg", 15)
transforming = TRUE
ckey = blob.ckey
+ ooc_notes = blob.ooc_notes // Updating notes incase they change them in blob form.
transforming = FALSE
blob.name = "Promethean Blob"
var/obj/item/hat = blob.hat
diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
index faf6b5f29d..3ee68e62db 100644
--- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
+++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm
@@ -378,6 +378,7 @@ var/global/list/disallowed_protean_accessories = list(
//Put our owner in it (don't transfer var/mind)
blob.ckey = ckey
+ blob.ooc_notes = ooc_notes
temporary_form = blob
//Mail them to nullspace
@@ -459,6 +460,7 @@ var/global/list/disallowed_protean_accessories = list(
//Put our owner in it (don't transfer var/mind)
ckey = blob.ckey
+ ooc_notes = blob.ooc_notes // Lets give the protean any updated notes from blob form.
temporary_form = null
//Transfer vore organs
diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm
index 4623cd91c2..48213b19a4 100644
--- a/code/modules/nifsoft/nif.dm
+++ b/code/modules/nifsoft/nif.dm
@@ -171,9 +171,10 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
SC.brainmobs = list()
stat = NIF_PREINSTALL
vis_update()
- H.verbs -= /mob/living/carbon/human/proc/set_nif_examine
+ if(H)
+ H.verbs -= /mob/living/carbon/human/proc/set_nif_examine
+ H.nif = null
qdel_null(menu)
- H.nif = null
human = null
install_done = null
update_icon()
diff --git a/code/modules/nifsoft/software/10_combat.dm b/code/modules/nifsoft/software/10_combat.dm
index ef70cf1854..c2ac5ae58d 100644
--- a/code/modules/nifsoft/software/10_combat.dm
+++ b/code/modules/nifsoft/software/10_combat.dm
@@ -85,7 +85,7 @@ var/global/datum/unarmed_attack/hardclaws/unarmed_hardclaws = new()
var/mob/living/carbon/human/H = nif.human
H.adjustHalLoss(30)
- var/obj/item/weapon/gun/energy/gun/martin/dazzle/dgun = new(get_turf(H))
+ var/obj/item/weapon/gun/energy/gun/compact/dazzle/dgun = new(get_turf(H))
H.put_in_hands(dgun)
nif.notify("Weapon deployed!",TRUE)
used = TRUE
@@ -93,10 +93,6 @@ var/global/datum/unarmed_attack/hardclaws/unarmed_hardclaws = new()
uninstall()
//The gun to go with this implant
-/obj/item/weapon/gun/energy/gun/martin/dazzle
+/obj/item/weapon/gun/energy/gun/compact/dazzle
name = "Microlaser"
desc = "A tiny nanofabricated laser."
-
- icon = 'icons/obj/gun_vr.dmi'
- icon_state = "PDW"
- item_state = "gun"
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 363353c2ec..85d0720670 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -485,9 +485,10 @@ This function completely restores a damaged organ to perfect condition.
// remove embedded objects and drop them on the floor
for(var/obj/implanted_object in implants)
- if(!istype(implanted_object,/obj/item/weapon/implant) && !istype(implanted_object,/obj/item/device/nif)) // We don't want to remove REAL implants. Just shrapnel etc. //VOREStation Edit - NIFs pls
- implanted_object.loc = get_turf(src)
- implants -= implanted_object
+ if(istype(implanted_object,/obj/item/weapon/implant) || istype(implanted_object,/obj/item/device/nif)) // We don't want to remove REAL implants. Just shrapnel etc. //VOREStation Edit - NIFs pls
+ continue
+ implanted_object.loc = get_turf(src)
+ implants -= implanted_object
if(!owner.has_embedded_objects())
owner.clear_alert("embeddedobject")
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index f578b05735..7cfdc8e14b 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -108,6 +108,38 @@
name = "speedloader (.38 haywire)"
ammo_type = /obj/item/ammo_casing/a38/emp
+// Makarov
+/obj/item/ammo_magazine/m38/makarov
+ name = "makarov magazine (.38)"
+ icon_state = "45"
+ origin_tech = list(TECH_COMBAT = 2)
+ mag_type = MAGAZINE
+ matter = list(MAT_STEEL = 480)
+ caliber = ".38"
+ ammo_type = /obj/item/ammo_casing/a38
+ max_ammo = 8
+ multiple_sprites = 1
+
+/obj/item/ammo_magazine/m38/makarov/rubber
+ name = "makarov magazine (.38 rubber)"
+ ammo_type = /obj/item/ammo_casing/a38/rubber
+
+// Giskard
+/obj/item/ammo_magazine/m38/giskard
+ name = "magazine (.38)"
+ icon_state = "m91"
+ origin_tech = list(TECH_COMBAT = 2)
+ mag_type = MAGAZINE
+ matter = list(MAT_STEEL = 540)
+ caliber = ".38"
+ ammo_type = /obj/item/ammo_casing/a38
+ max_ammo = 10
+ multiple_sprites = 1
+
+/obj/item/ammo_magazine/m38/giskard/rubber
+ name = "makarov magazine (.38 rubber)"
+ ammo_type = /obj/item/ammo_casing/a38/rubber
+
///////// .45 /////////
/obj/item/ammo_magazine/m45
@@ -345,6 +377,25 @@
name = "compact magazine (9mm practice)"
ammo_type = /obj/item/ammo_casing/a9mm/practice
+// Luger
+/obj/item/ammo_magazine/m9mm/luger
+ name = "\improper \"Mäuse\" magazine (9mm)"
+ icon_state = "9x19p"
+ origin_tech = list(TECH_COMBAT = 2)
+ mag_type = MAGAZINE
+ matter = list(MAT_STEEL = 480)
+ caliber = "9mm"
+ ammo_type = /obj/item/ammo_casing/a9mm
+ max_ammo = 8
+ multiple_sprites = 1
+
+/obj/item/ammo_magazine/m9mm/luger/empty
+ initial_ammo = 0
+
+/obj/item/ammo_magazine/m9mm/luger/rubber
+ name = "\improper \"Mäuse\" magazine (9mm rubber)"
+ ammo_type = /obj/item/ammo_casing/a9mm/rubber
+
// SMG
/obj/item/ammo_magazine/m9mmt
name = "top mounted magazine (9mm)"
@@ -431,7 +482,7 @@
ammo_type = /obj/item/ammo_casing/a9mm/ap
matter = list(MAT_STEEL = 2000)
-/obj/item/ammo_magazine/m9mmR/saber/empty
+/obj/item/ammo_magazine/m9mmAdvanced/empty
initial_ammo = 0
///////// 10mm /////////
@@ -450,6 +501,45 @@
/obj/item/ammo_magazine/m10mm/empty
initial_ammo = 0
+/obj/item/ammo_magazine/m10mm/practice
+ name = "magazine (10mm practice)"
+ matter = list(MAT_STEEL = 1000)
+ ammo_type = /obj/item/ammo_casing/a10mm/practice
+
+/obj/item/ammo_magazine/m10mm/rubber
+ name = "magazine (10mm rubber)"
+ matter = list(MAT_STEEL = 1000)
+ ammo_type = /obj/item/ammo_casing/a10mm/rubber
+
+/obj/item/ammo_magazine/m10mm/emp
+ name = "magazine (10mm haywire)"
+ matter = list(MAT_STEEL = 1500, MAT_URANIUM = 2000)
+ ammo_type = /obj/item/ammo_casing/a10mm/emp
+
+// Pistol
+/obj/item/ammo_magazine/m10mm/pistol
+ icon_state = "m91"
+ matter = list(MAT_STEEL = 1000)
+ max_ammo = 12
+
+/obj/item/ammo_magazine/m10mm/pistol/practice
+ name = "magazine (10mm practice)"
+ matter = list(MAT_STEEL = 800)
+ ammo_type = /obj/item/ammo_casing/a10mm/practice
+
+/obj/item/ammo_magazine/m10mm/pistol/rubber
+ name = "magazine (10mm rubber)"
+ matter = list(MAT_STEEL = 800)
+ ammo_type = /obj/item/ammo_casing/a10mm/rubber
+
+/obj/item/ammo_magazine/m10mm/pistol/emp
+ name = "magazine (10mm haywire)"
+ matter = list(MAT_STEEL = 1000, MAT_URANIUM = 1500)
+ ammo_type = /obj/item/ammo_casing/a10mm/emp
+
+/obj/item/ammo_magazine/m10mm/pistol/empty
+ initial_ammo = 0
+
///////// 5.45mm /////////
/obj/item/ammo_magazine/m545
diff --git a/code/modules/projectiles/guns/energy/laser_vr.dm b/code/modules/projectiles/guns/energy/laser_vr.dm
index 428b0500d6..9472d512c1 100644
--- a/code/modules/projectiles/guns/energy/laser_vr.dm
+++ b/code/modules/projectiles/guns/energy/laser_vr.dm
@@ -80,21 +80,7 @@
//////////////////// Energy Weapons ////////////////////
// ------------ Energy Luger ------------
-/obj/item/weapon/gun/energy/gun/eluger
- name = "energy Luger"
- 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"
- 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=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'),
- )
+//MOVED TO nuclear.dm
//////////////////// Eris Ported Guns ////////////////////
//HoP gun
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 7062fc3f91..f7090e7ca7 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -1,52 +1,120 @@
+/*
+ * Energy Gun
+ */
/obj/item/weapon/gun/energy/gun
name = "energy gun"
- desc = "Another bestseller of Lawson Arms, the LAEP90 Perun is a versatile energy based sidearm, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
+ desc = "Another bestseller of Lawson Arms, the LAEP80 Thor is a versatile energy based pistol, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
description_fluff = "Lawson Arms is Hephaestus Industries’ main personal-energy-weapon branding, often sold alongside MarsTech projectile weapons to security and law enforcement agencies."
- icon_state = "energystun100"
- item_state = null //so the human update icon uses the icon_state instead.
- fire_delay = 10 // Handguns should be inferior to two-handed weapons.
+ icon_state = "egunstun"
+ item_state = null //so the human update icon uses the icon_state instead.
+ fire_delay = 8
projectile_type = /obj/item/projectile/beam/stun/med
origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2)
+ modifystate = "egunstun"
+
+ firemodes = list(
+ list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="egunstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240),
+ list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="egunkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480),
+ )
+
+/*
+ * Energy Rifle
+ */
+/obj/item/weapon/gun/energy/gun/rifle
+ name = "energy rifle"
+ desc = "Another bestseller of Lawson Arms, the LAEP100 Svarog is a versatile energy rifle, capable of switching between low and high capacity projectile settings. In other words: Stun or Kill."
+ icon_state = "riflestun"
+ item_state = null //so the human update icon uses the icon_state instead.
+ wielded_item_state = "riflestun-wielded"
+ force = 8
+ w_class = ITEMSIZE_LARGE
+ fire_delay = 6
+ one_handed_penalty = 30
+
+ projectile_type = /obj/item/projectile/beam/stun
+ origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 3)
+ modifystate = "riflestun"
+
+ firemodes = list(
+ list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="riflestun", fire_sound='sound/weapons/Taser.ogg', wielded_item_state="riflestun-wielded", charge_cost = 120),
+ list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="riflekill", fire_sound='sound/weapons/Laser.ogg', wielded_item_state="riflekill-wielded", charge_cost = 240),
+ )
+
+/*
+ * Energy Carbine (Burst Laser)
+ */
+/obj/item/weapon/gun/energy/gun/burst
+ name = "energy carbine"
+ desc = "The Lawson Arms FM-2t is a versatile energy based carbine made from modifying the original LAEP100 design. It is capable of switching between stun or kill with a three round burst option for both settings."
+ icon_state = "energystun"
+ item_state = null //so the human update icon uses the icon_state instead.
+ force = 8
+ w_class = ITEMSIZE_LARGE
+ fire_delay = 6
+
+ projectile_type = /obj/item/projectile/beam/stun/weak
+ origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_ILLEGAL = 3)
modifystate = "energystun"
firemodes = list(
- list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="energystun", charge_cost = 240),
- list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="energykill", charge_cost = 480),
+ list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun", charge_cost = 100),
+ list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="energystun"),
+ list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="energykill", charge_cost = 200),
+ list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="energykill"),
)
+/*
+ * Energy PDW (Martin)
+ */
+/obj/item/weapon/gun/energy/gun/compact
+ name = "personal energy weapon"
+ desc = "The RayZar EW20 \"Martin\" personal energy weapon - or PEW - is Ward-Takahasi's entry into the variable capacity energy gun market. New users are advised to 'set RayZars to stun'."
+ description_fluff = "RayZar is Ward-Takahashi’s main consumer weapons brand, known for producing and licensing a wide variety of specialist energy weapons of various types and quality primarily for the civilian market."
+ icon_state = "PDWstun"
+ fire_sound = 'sound/weapons/Taser.ogg'
+ w_class = ITEMSIZE_SMALL
+ projectile_type = /obj/item/projectile/beam/stun/med
+ origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 3)
+ modifystate = "PDWstun"
+
+ firemodes = list(
+ list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="PDWstun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 240),
+ list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="PDWkill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 480),
+ )
+
+/*
+ * Energy Luger
+ */
+/obj/item/weapon/gun/energy/gun/eluger
+ name = "energy Luger"
+ 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_state = "ep08stun"
+ item_state = "gun"
+ 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
+
+ projectile_type = /obj/item/projectile/beam/stun/med
+ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2, TECH_ILLEGAL = 2) // Illegal tech cuz Space Nazis
+ modifystate = "ep08stun"
+
+ firemodes = list(
+ list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="ep08stun", fire_sound='sound/weapons/Taser.ogg', charge_cost = 120),
+ list(mode_name="lethal", projectile_type=/obj/item/projectile/beam/eluger, modifystate="ep08kill", fire_sound='sound/weapons/Laser.ogg', charge_cost = 240),
+ )
+
+/*
+ * Mounted Energy Gun
+ */
/obj/item/weapon/gun/energy/gun/mounted
name = "mounted energy gun"
self_recharge = 1
use_external_power = 1
-
-/obj/item/weapon/gun/energy/gun/burst
- name = "burst laser"
- desc = "The Lawson Arms FM-2t is a versatile energy based weapon, capable of switching between stun or kill with a three round burst option for both settings."
- description_fluff = "Lawson Arms is Hephaestus Industries’ main personal-energy-weapon branding, often sold alongside MarsTech projectile weapons to security and law enforcement agencies."
- icon_state = "fm-2tstun100" //May resprite this to be more rifley
- item_state = null //so the human update icon uses the icon_state instead.
- charge_cost = 100
- force = 8
- w_class = ITEMSIZE_LARGE //Probably gonna make it a rifle sooner or later
- fire_delay = 6
-
- projectile_type = /obj/item/projectile/beam/stun/weak
- origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_ILLEGAL = 3)
- modifystate = "fm-2tstun"
-
-// requires_two_hands = 1
-// one_handed_penalty = 30
-
- firemodes = list(
- list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", charge_cost = 100),
- list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun"),
- list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", charge_cost = 200),
- list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill"),
- )
-
+/*
+ * Nuclear Energy Gun
+ */
/obj/item/weapon/gun/energy/gun/nuclear
name = "advanced energy gun"
desc = "An energy gun with an experimental miniaturized reactor, based on a Lawson Arms platform."
@@ -61,26 +129,7 @@
battery_lock = 1
modifystate = null
-// requires_two_hands = 1
-// one_handed_penalty = 15 // It's rather bulky, so holding it in one hand is a little harder than with two, however it's not 'required'.
-
firemodes = list(
list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun, modifystate="nucgunstun", charge_cost = 240),
list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="nucgunkill", charge_cost = 480),
- )
-
-//Functionally a Perun, but flavoured.
-/obj/item/weapon/gun/energy/gun/compact
- name = "personal energy weapon"
- desc = "The RayZar EW20 Cygnus personal energy weapon - or PEW - is Ward-Takahasi's entry into the variable capacity energy gun market. New users are advised to 'set RayZars to stun'."
- description_fluff = "RayZar is Ward-Takahashi’s main consumer weapons brand, known for producing and licensing a wide variety of specialist energy weapons of various types and quality primarily for the civilian market."
- icon_state = "PDWstun100"
-
- projectile_type = /obj/item/projectile/beam/stun/med
- origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 3)
- modifystate = "PDWstun"
-
- firemodes = list(
- list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/med, modifystate="PDWstun", charge_cost = 240),
- list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="PDWkill", charge_cost = 480),
)
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/nuclear_vr.dm b/code/modules/projectiles/guns/energy/nuclear_vr.dm
deleted file mode 100644
index 313fcd37d5..0000000000
--- a/code/modules/projectiles/guns/energy/nuclear_vr.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
-// Virgo's very own file for overriding Polaris' eguns! Should include: Regular egun, Advanced egun, burst egun, mounted egun
-//
-// NOTICE: All the eguns are child objects of the base thing. If you modify the base egun, all the other eguns will inherit it unless they explicitly override it.
-*/
-
-/obj/item/weapon/gun/energy/gun
- icon = 'icons/obj/eguns_vr.dmi' //makes the egun look for icons here instead. ALL of the eguns.
-
-/obj/item/weapon/gun/energy/gun/burst
- icon = 'icons/obj/gun.dmi' //Points it back at the default file so eguns_vr.dmi doesn't need to mirror all the sprites
-
-/obj/item/weapon/gun/energy/gun/nuclear
- icon = 'icons/obj/gun.dmi' //Points it back at the default file so eguns_vr.dmi doesn't need to mirror all the sprites
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/projectile/contender.dm b/code/modules/projectiles/guns/projectile/contender.dm
index aa07a63802..3e064da7a0 100644
--- a/code/modules/projectiles/guns/projectile/contender.dm
+++ b/code/modules/projectiles/guns/projectile/contender.dm
@@ -1,10 +1,18 @@
+/*
+ * Gram
+ */
/obj/item/weapon/gun/projectile/contender
- name = "H-H Gram"
- desc = "Hedberg-Hammarstrom's flagship one-shot hand-cannon. For when you really want to make a hole. This one has been modified to work almost like a bolt-action. Uses .357 rounds."
- description_fluff = "Sif’s largest home-grown firearms manufacturer, the Hedberg-Hammarstrom company offers a range of high-quality, high-cost hunting rifles and shotguns designed with the Sivian wilderness - and its wildlife - in mind. \
- The company operates just one production plant in Kalmar, but their weapons have found popularity on garden worlds as far afield as the Tajaran homeworld due to their excellent build quality, precision, and stopping power."
+ name = "\improper \"Gram\" Contender"
+ desc = "Hedberg-Hammarstrom's flagship one-shot hand-cannon. For when you \
+ really want to make a hole. This one has been modified to work almost like \
+ a bolt-action. Uses .357 rounds."
+ description_fluff = "The Hedberg-Hammarstrom company offers a range of high-quality, \
+ high-cost hunting rifles and shotguns designed with the Sivian wilderness - and its \
+ wildlife - in mind. The company operates just one production plant in Kalmar, but \
+ their weapons have found popularity on garden worlds as far afield as the Tajaran \
+ homeworld due to their excellent build quality, precision, and stopping power."
icon_state = "pockrifle"
- var/icon_retracted = "pockrifle-empty"
+ var/icon_retracted = "pockrifle-e"
item_state = "revolver"
caliber = ".357"
handle_casings = HOLD_CASINGS
@@ -39,8 +47,13 @@
return
..()
+/*
+ * Balmung
+ */
/obj/item/weapon/gun/projectile/contender/tacticool
- name = "H-H Balmung"
- desc = "A later model of the Hedberg-Hammarstrom Gram, reinvented with a tactical look. For when you really want to make a hole. This one has been modified to work almost like a bolt-action. Uses .357 rounds."
+ name = "\improper \"Balmung\" Contender"
+ desc = "A later model of the Hedberg-Hammarstrom \"Gram\", reinvented with a \
+ tactical look. For when you really want to make a hole. This one has been \
+ modified to work almost like a bolt-action. Uses .357 rounds."
icon_state = "pockrifle_b"
- icon_retracted = "pockrifle_b-empty"
\ No newline at end of file
+ icon_retracted = "pockrifle_b-e"
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index 892fd38f58..bfc883b5cc 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -72,14 +72,6 @@
to_chat(M, "Your gun is now sprited as [choice]. Say hello to your new friend.")
return 1
-/*//apart of reskins that have two sprites, touching may result in frustration and breaks
-/obj/item/weapon/gun/projectile/colt/detective/attack_hand(var/mob/living/user)
- if(!unique_reskin && loc == user)
- reskin_gun(user)
- return
- ..()
-*/
-
/*
* Security Sidearm
*/
@@ -104,12 +96,11 @@
icon_state = "secgun-e"
/obj/item/weapon/gun/projectile/sec/flash
- name = ".45 signal pistol"
magazine_type = /obj/item/ammo_magazine/m45/flash
/obj/item/weapon/gun/projectile/sec/wood
+ name = "custom .45 pistol"
desc = "The MT Mk58 is a cheap, ubiquitous sidearm, produced by MarsTech. This one has a sweet wooden grip. Uses .45 rounds."
- name = "custom .45 Pistol"
icon_state = "secgunb"
/obj/item/weapon/gun/projectile/sec/wood/update_icon()
@@ -140,6 +131,13 @@
/obj/item/weapon/gun/projectile/silenced/empty
magazine_type = null
+/obj/item/weapon/gun/projectile/silenced/update_icon()
+ ..()
+ if(ammo_magazine)
+ icon_state = "silenced_pistol"
+ else
+ icon_state = "silenced_pistol-e"
+
/*
* Deagle
*/
@@ -178,7 +176,7 @@
/*
* Gyro Pistol (Admin Abuse in gun form)
*/
-/obj/item/weapon/gun/projectile/gyropistol // Does this even appear anywhere outside of admin abuse?
+/obj/item/weapon/gun/projectile/gyropistol
name = "gyrojet pistol"
desc = "Speak softly, and carry a big gun. Fires rare .75 caliber self-propelled exploding bolts--because fuck you and everything around you."
icon_state = "gyropistol"
@@ -200,12 +198,22 @@
else
icon_state = "gyropistol"
+/*
+ * Silencer
+ */
+/obj/item/weapon/silencer
+ name = "silencer"
+ desc = "a silencer"
+ icon = 'icons/obj/gun.dmi'
+ icon_state = "silencer"
+ w_class = ITEMSIZE_SMALL
+
/*
* Compact Pistol
*/
/obj/item/weapon/gun/projectile/pistol
name = "compact pistol"
- desc = "The Lumoco Arms P3 Whisper. A compact, easily concealable gun, though it's only compatible with compact magazines. Uses 9mm rounds."
+ desc = "The Lumoco Arms P3 \"Whisper\". A compact, easily concealable gun, though it's only compatible with compact magazines. Uses 9mm rounds."
icon_state = "pistol"
item_state = null
w_class = ITEMSIZE_SMALL
@@ -218,7 +226,6 @@
projectile_type = /obj/item/projectile/bullet/pistol
/obj/item/weapon/gun/projectile/pistol/flash
- name = "compact signal pistol"
magazine_type = /obj/item/ammo_magazine/m9mm/compact/flash
/obj/item/weapon/gun/projectile/pistol/attack_hand(mob/living/user as mob)
@@ -250,21 +257,70 @@
..()
/obj/item/weapon/gun/projectile/pistol/update_icon()
- ..()
- if(silenced)
- icon_state = "pistol-silencer"
+ if(ammo_magazine)
+ if(silenced)
+ icon_state = "pistol-s"
+ else
+ icon_state = "pistol"
else
- icon_state = "pistol"
+ if(silenced)
+ icon_state = "pistol-s-e"
+ else
+ icon_state = "pistol-e"
/*
- * Silencer
+ * Pistol
*/
-/obj/item/weapon/silencer
- name = "silencer"
- desc = "a silencer"
- icon = 'icons/obj/gun.dmi'
- icon_state = "silencer"
- w_class = ITEMSIZE_SMALL
+/obj/item/weapon/gun/projectile/aps
+ name = "pistol"
+ desc = "The Lumoco Arms P6 \"Rustle\". A standard self-defense pistol that takes standard magazines. Uses 9mm rounds."
+ icon_state = "aps"
+ item_state = null
+ caliber = "9mm"
+ silenced = 0
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 2)
+ load_method = MAGAZINE
+ magazine_type = /obj/item/ammo_magazine/m9mm
+ allowed_magazines = list(/obj/item/ammo_magazine/m9mm)
+ projectile_type = /obj/item/projectile/bullet/pistol
+
+/obj/item/weapon/gun/projectile/aps/attack_hand(mob/living/user as mob)
+ if(user.get_inactive_hand() == src)
+ if(silenced)
+ if(!user.item_is_in_hands(src))
+ ..()
+ return
+ to_chat(user, "You unscrew [silenced] from [src].")
+ user.put_in_hands(silenced)
+ silenced = 0
+ update_icon()
+ return
+ ..()
+
+/obj/item/weapon/gun/projectile/aps/attackby(obj/item/I as obj, mob/living/user as mob)
+ if(istype(I, /obj/item/weapon/silencer))
+ if(!user.item_is_in_hands(src)) //if we're not in his hands
+ to_chat(user, "You'll need [src] in your hands to do that.")
+ return
+ user.drop_item()
+ to_chat(user, "You screw [I] onto [src].")
+ silenced = I //dodgy?
+ I.loc = src //put the silencer into the gun
+ update_icon()
+ return
+ ..()
+
+/obj/item/weapon/gun/projectile/aps/update_icon()
+ if(ammo_magazine)
+ if(silenced)
+ icon_state = "aps-s"
+ else
+ icon_state = "aps"
+ else
+ if(silenced)
+ icon_state = "aps-s-e"
+ else
+ icon_state = "aps-e"
/*
* Zip Gun (yar har)
@@ -272,7 +328,7 @@
/obj/item/weapon/gun/projectile/pirate
name = "zip gun"
desc = "Little more than a barrel, handle, and firing mechanism, cheap makeshift firearms like this one are not uncommon in frontier systems."
- icon_state = "sawnshotgun"
+ icon_state = "zipgun"
item_state = "sawnshotgun"
handle_casings = CYCLE_CASINGS //player has to take the old casing out manually before reloading
load_method = SINGLE_CASING
@@ -323,18 +379,20 @@
* Luger
*/
/obj/item/weapon/gun/projectile/luger
- name = "\improper Jindal T15 Chooha"
- desc = "Almost seventy percent guaranteed not to be a cheap rimworld knockoff! Accuracy, easy handling, and its distinctive appearance make it popular among gun collectors. Uses 9mm rounds."
+ name = "\improper Jindal T15 \"Mäuse\""
+ desc = "Almost seventy percent guaranteed not to be a cheap rimworld knockoff! Accuracy, easy handling, and its distinctive appearance \
+ make it popular among gun collectors. Uses 9mm rounds."
description_fluff = "While Jindal’s rugged, affordable weapons intended for the colonial sector are a major export of Tau Ceti, \
- the Jindal Arms company is perhaps best known for its liberal sale of production licenses to just about any fledgling rimworld venture who asks, and has cash to spare. \
- While Jindal’s 'authentic' Binma-built weapons are renowned for their reliability, the same cannot be said for the hundreds of low-grade (But technically legal) \
- copies circulating the squalid habitats and smoke-filled junk ships of the frontier."
- icon_state = "p08"
+ the Jindal Arms company is perhaps best known for its liberal sale of production licenses to just about any fledgling rimworld \
+ venture who asks, and has cash to spare. While Jindal’s 'authentic' Binma-built weapons are renowned for their reliability, the \
+ same cannot be said for the hundreds of low-grade (But technically legal) copies circulating the squalid habitats and smoke-filled \
+ junk ships of the frontier."
+ icon_state = "p08a"
origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2)
caliber = "9mm"
load_method = MAGAZINE
- magazine_type = /obj/item/ammo_magazine/m9mm/compact
- allowed_magazines = list(/obj/item/ammo_magazine/m9mm/compact)
+ magazine_type = /obj/item/ammo_magazine/m9mm/luger
+ allowed_magazines = list(/obj/item/ammo_magazine/m9mm/luger)
projectile_type = /obj/item/projectile/bullet/pistol
/obj/item/weapon/gun/projectile/luger/update_icon()
@@ -345,9 +403,10 @@
icon_state = "[initial(icon_state)]-e"
/obj/item/weapon/gun/projectile/luger/brown
- name = "\improper Jindal KP-45W"
+ name = "\improper Jindal T15b \"Mäuse\""
description_fluff = "While wholly owned by Hephaestus Industries, the Jindal Arms brand does not appear prominently in most company catalogues \
- (Perhaps owing to its less than prestigious image), instead being sold almost exclusively through retailers and advertising platforms targeting the 'independent roughneck' demographic."
+ (Perhaps owing to its less than prestigious image), instead being sold almost exclusively through retailers and advertising platforms targeting \
+ the 'independent roughneck' demographic."
icon_state = "p08b"
/*
@@ -377,4 +436,173 @@
icon_state = "p92xb"
/obj/item/weapon/gun/projectile/p92x/large
- magazine_type = /obj/item/ammo_magazine/m9mm/large // Spawns with illegal magazines.
\ No newline at end of file
+ magazine_type = /obj/item/ammo_magazine/m9mm/large // Spawns with illegal magazines.
+
+/obj/item/weapon/gun/projectile/p92x/large/preban
+ magazine_type = /obj/item/ammo_magazine/m9mm/large/preban // Spawns with big magazines that are legal.
+
+/obj/item/weapon/gun/projectile/p92x/large/preban/hp
+ magazine_type = /obj/item/ammo_magazine/m9mm/large/preban/hp // Spawns with legal hollow-point mag
+
+/*
+ * Giskard (Eris Port)
+ */
+/obj/item/weapon/gun/projectile/giskard
+ name = "\improper \"Giskard\" holdout pistol"
+ desc = "The FS HG .38 \"Giskard\" can even fit into the pocket! Uses .38 rounds."
+ icon_state = "giskardcivil"
+ item_state = "giskardcivil"
+ caliber = ".38"
+ magazine_type = /obj/item/ammo_magazine/m38
+ allowed_magazines = list(/obj/item/ammo_magazine/m38)
+ load_method = MAGAZINE
+ w_class = ITEMSIZE_SMALL
+ fire_sound = 'sound/weapons/gunshot_pathetic.ogg'
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 3)
+
+/obj/item/weapon/gun/projectile/giskard/update_icon()
+ ..()
+ if(ammo_magazine && ammo_magazine.stored_ammo.len)
+ icon_state = "giskardcivil"
+ else
+ icon_state = "giskardcivil_empty"
+
+/obj/item/weapon/gun/projectile/giskard/olivaw
+ name = "\improper \"Olivaw\" holdout burst-pistol"
+ desc = "The FS HG .38 \"Olivaw\" is a more advanced version of the \"Giskard\". \
+ This one seems to have a two-round burst-fire mode. Uses .38 rounds."
+ icon_state = "olivawcivil"
+ item_state = "giskardcivil"
+ firemodes = list(
+ list(mode_name="semiauto", burst=1, fire_delay=1.2, move_delay=null, burst_accuracy=null, dispersion=null),
+ list(mode_name="2-round bursts", burst=2, fire_delay=0.2, move_delay=4, burst_accuracy=list(0,-15), dispersion=list(1.2, 1.8)),
+ )
+
+/obj/item/weapon/gun/projectile/giskard/olivaw/update_icon()
+ ..()
+ if(ammo_magazine && ammo_magazine.stored_ammo.len)
+ icon_state = "olivawcivil"
+ else
+ icon_state = "olivawcivil-e"
+
+/*
+ * Makarov
+ */
+/obj/item/weapon/gun/projectile/makarov
+ name = "makarov"
+ desc = "A small, rugged pistol from a bygone era. Uses .38 rounds."
+ icon_state = "makarov"
+ item_state = "gun"
+ caliber = ".38"
+ magazine_type = /obj/item/ammo_magazine/m38
+ allowed_magazines = list(/obj/item/ammo_magazine/m38)
+ projectile_type = /obj/item/projectile/bullet/pistol/medium
+ load_method = MAGAZINE
+ w_class = ITEMSIZE_SMALL
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
+
+/obj/item/weapon/gun/projectile/makarov/update_icon()
+ if(ammo_magazine)
+ icon_state = "Makarov"
+ else
+ icon_state = "Makarov-e"
+
+/*
+ * N99 (Fallout)
+ */
+/obj/item/weapon/gun/projectile/n99
+ name = "promotional pistol"
+ desc = "A very robust looking pistol that was made to promote 'Radius: Legend of the Demon Core', a popular \
+ post-apocolyptic TV series. It's rare to come across as marketing swiftly switched to a toy version as \
+ opposed to a live weapon due to safety concerns. Uses 10mm rounds."
+ icon_state = "n99"
+ item_state = "gun"
+ caliber = "10mm"
+ magazine_type = /obj/item/ammo_magazine/m10mm/pistol
+ allowed_magazines = list(/obj/item/ammo_magazine/m10mm/pistol)
+ projectile_type = /obj/item/projectile/bullet/pistol/medium
+ load_method = MAGAZINE
+ w_class = ITEMSIZE_NORMAL
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
+
+/obj/item/weapon/gun/projectile/n99/update_icon()
+ if(ammo_magazine)
+ icon_state = "n99"
+ else
+ icon_state = "n99-e"
+
+/obj/item/weapon/gun/projectile/n80
+ icon_state = "n80"
+
+/obj/item/weapon/gun/projectile/n80/update_icon()
+ if(ammo_magazine)
+ icon_state = "n80"
+ else
+ icon_state = "n80-e"
+
+/*
+ * Écureuil 10mm Pistol (Skyrat Port)
+ */
+/obj/item/weapon/gun/projectile/ecureuil
+ name = "\improper \"Écureuil\" 10mm pistol"
+ desc = "The 10mm MarsTech sidearm \"Écureuil\" is a well known military grade pistol. \
+ It's mostly used by ranking members of NanoTrasen as a means of self defense. Uses 10mm rounds."
+ icon_state = "ecureuil"
+ item_state = "gun"
+ caliber = "10mm"
+ magazine_type = /obj/item/ammo_magazine/m10mm/pistol
+ allowed_magazines = list(/obj/item/ammo_magazine/m10mm/pistol)
+ projectile_type = /obj/item/projectile/bullet/pistol/medium
+ load_method = MAGAZINE
+ w_class = ITEMSIZE_NORMAL
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
+
+/obj/item/weapon/gun/projectile/ecureuil/update_icon()
+ if(ammo_magazine)
+ icon_state = "ecureuil"
+ else
+ icon_state = "ecureuil-e"
+
+/obj/item/weapon/gun/projectile/ecureuil/tac
+ name = "\improper Tactical \"Écureuil\" 10mm pistol"
+ icon_state = "tac_ecureuil"
+
+/obj/item/weapon/gun/projectile/ecureuil/tac/update_icon()
+ if(ammo_magazine)
+ icon_state = "tac_ecureuil"
+ else
+ icon_state = "tac_ecureuil-e"
+
+/obj/item/weapon/gun/projectile/ecureuil/tac2
+ name = "\improper Tactical \"Écureuil\" 10mm pistol"
+ icon_state = "tac_ecureuil"
+
+/obj/item/weapon/gun/projectile/ecureuil/tac2/update_icon()
+ if(ammo_magazine)
+ icon_state = "tac2_ecureuil"
+ else
+ icon_state = "tac2_ecureuil-e"
+
+/*
+ * Lamia (Eris Port)
+ */
+/obj/item/weapon/gun/projectile/lamia
+ name = "\improper FS HG .44 \"Lamia\""
+ desc = "The FS HG .44 \"Lamia\" is the epitome of power in a handheld device. Uses .44 rounds."
+ icon_state = "lamia"
+ item_state = "revolver"
+ caliber = ".44"
+ magazine_type = /obj/item/ammo_magazine/m44/rubber
+ allowed_magazines = list(/obj/item/ammo_magazine/m44,/obj/item/ammo_magazine/m44/rubber)
+ load_method = MAGAZINE
+ auto_eject = 1
+ auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
+ origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4)
+
+/obj/item/weapon/gun/projectile/lamia/update_icon()
+ cut_overlays()
+ if(!ammo_magazine)
+ return
+ var/ratio = ammo_magazine.stored_ammo.len * 100 / ammo_magazine.max_ammo
+ ratio = round(ratio, 33)
+ add_overlay("lamia_[ratio]")
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/projectile/pistol_vr.dm b/code/modules/projectiles/guns/projectile/pistol_vr.dm
deleted file mode 100644
index 0793c32d07..0000000000
--- a/code/modules/projectiles/guns/projectile/pistol_vr.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-/obj/item/weapon/gun/projectile/sec/flash
- name = ".45 pistol"
-
-/obj/item/weapon/gun/projectile/p92x/sec
- magazine_type = /obj/item/ammo_magazine/m9mm/rubber
-
-/obj/item/weapon/gun/projectile/p92x/large/preban
- icon_state = "p92x-brown"
- magazine_type = /obj/item/ammo_magazine/m9mm/large/preban // Spawns with big magazines that are legal.
-
-/obj/item/weapon/gun/projectile/p92x/large/preban/hp
- magazine_type = /obj/item/ammo_magazine/m9mm/large/preban/hp // Spawns with legal hollow-point mag
-
-//////////////////// Eris Ported Guns ////////////////////
-//HoS Gun
-/obj/item/weapon/gun/projectile/lamia
- name = "FS HG .44 \"Lamia\""
- desc = "Uses .44 rounds."
- icon = 'icons/obj/gun_vr.dmi'
- icon_state = "Headdeagle"
- item_state = "revolver"
- caliber = ".44"
- magazine_type = /obj/item/ammo_magazine/m44/rubber
- allowed_magazines = list(/obj/item/ammo_magazine/m44,/obj/item/ammo_magazine/m44/rubber)
- load_method = MAGAZINE
- auto_eject = 1
- auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
- origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4)
-
-/obj/item/weapon/gun/projectile/lamia/update_icon()
- cut_overlays()
- if(!ammo_magazine)
- return
- var/ratio = ammo_magazine.stored_ammo.len * 100 / ammo_magazine.max_ammo
- ratio = round(ratio, 33)
- add_overlay("deagle_[ratio]")
-
-//Civilian gun
-/obj/item/weapon/gun/projectile/giskard
- name = "\improper \"Giskard\" holdout pistol"
- desc = "The FS HG .380 \"Giskard\" can even fit into the pocket! Uses .380 rounds."
- icon = 'icons/obj/gun_vr.dmi'
- icon_override = 'icons/obj/gun_vr.dmi'
- icon_state = "giskardcivil"
- item_state = "giskardcivil"
- caliber = ".380"
- magazine_type = /obj/item/ammo_magazine/m380
- allowed_magazines = list(/obj/item/ammo_magazine/m380)
- load_method = MAGAZINE
- w_class = ITEMSIZE_SMALL
- fire_sound = 'sound/weapons/gunshot_pathetic.ogg'
- origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 3)
-
-/obj/item/weapon/gun/projectile/giskard/update_icon()
- ..()
- if(ammo_magazine && ammo_magazine.stored_ammo.len)
- icon_state = "giskardcivil"
- else
- icon_state = "giskardcivil_empty"
-
-//Not so civilian gun
-/obj/item/weapon/gun/projectile/giskard/olivaw
- name = "\improper \"Olivaw\" holdout burst-pistol"
- desc = "The FS HG .380 \"Olivaw\" is a more advanced version of the \"Giskard\". This one seems to have a two-round burst-fire mode. Uses .380 rounds."
- icon_state = "olivawcivil"
- item_state = "olivawcivil"
- firemodes = list(
- list(mode_name="semiauto", burst=1, fire_delay=1.2, move_delay=null, burst_accuracy=null, dispersion=null),
- list(mode_name="2-round bursts", burst=2, fire_delay=0.2, move_delay=4, burst_accuracy=list(0,-15), dispersion=list(1.2, 1.8)),
- )
-
-/obj/item/weapon/gun/projectile/giskard/olivaw/update_icon()
- ..()
- if(ammo_magazine && ammo_magazine.stored_ammo.len)
- icon_state = "olivawcivil"
- else
- icon_state = "olivawcivil_empty"
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index d3f30f29d2..312c92a5ea 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -52,7 +52,6 @@
damage = 30
armor_penetration = 10
-
/obj/item/projectile/beam/midlaser
damage = 40
armor_penetration = 10
diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm
index 31a575212c..2b1cda09a8 100644
--- a/code/modules/random_map/drop/droppod.dm
+++ b/code/modules/random_map/drop/droppod.dm
@@ -10,6 +10,7 @@
limit_x = 3
limit_y = 3
preserve_map = 0
+ max_attempts = 1
wall_type = /turf/simulated/wall/titanium
floor_type = /turf/simulated/floor/reinforced
diff --git a/code/modules/resleeving/autoresleever.dm b/code/modules/resleeving/autoresleever.dm
new file mode 100644
index 0000000000..0ea65aa305
--- /dev/null
+++ b/code/modules/resleeving/autoresleever.dm
@@ -0,0 +1,201 @@
+/obj/machinery/transhuman/autoresleever
+ name = "automatic resleever"
+ desc = "Uses advanced technology to detect when someone needs to be resleeved, and automatically prints and sleeves them into a new body. It even generates its own biomass!"
+ icon = 'icons/obj/machines/autoresleever.dmi'
+ icon_state = "autoresleever"
+ density = TRUE
+ anchored = TRUE
+ var/equip_body = FALSE //If true, this will spawn the person with equipment
+ var/default_job = USELESS_JOB //The job that will be assigned if equip_body is true and the ghost doesn't have a job
+ var/ghost_spawns = FALSE //If true, allows ghosts who haven't been spawned yet to spawn
+ var/vore_respawn = 15 MINUTES //The time to wait if you died from vore
+ var/respawn = 30 MINUTES //The time to wait if you didn't die from vore
+ var/spawn_slots = -1 //How many people can be spawned from this? If -1 it's unlimited
+ var/spawntype //The kind of mob that will be spawned, if set.
+
+/obj/machinery/transhuman/autoresleever/update_icon()
+ . = ..()
+ if(stat)
+ icon_state = "autoresleever-o"
+ else
+ icon_state = "autoresleever"
+
+/obj/machinery/transhuman/autoresleever/power_change()
+ . = ..()
+ update_icon()
+
+/obj/machinery/transhuman/autoresleever/attack_ghost(mob/observer/dead/user as mob)
+ update_icon()
+ if(spawn_slots == 0)
+ to_chat(user, "There are no more respawn slots.")
+ return
+ if(user.mind)
+ if(user.mind.vore_death)
+ if(vore_respawn <= world.time - user.timeofdeath)
+ autoresleeve(user)
+ else
+ to_chat(user, "You must wait [((vore_respawn - (world.time - user.timeofdeath)) * 0.1) / 60] minutes to use \the [src].")
+ return
+ else if(respawn <= world.time - user.timeofdeath)
+ autoresleeve(user)
+ else
+ to_chat(user, "You must wait [((respawn - (world.time - user.timeofdeath)) * 0.1) /60] minutes to use \the [src].")
+ return
+ else if(spawntype)
+ if(tgui_alert(user, "This [src] spawns something special, would you like to play as it?", "Creachur", list("No","Yes")) == "Yes")
+ autoresleeve(user)
+ else if(ghost_spawns)
+ if(tgui_alert(user, "Would you like to be spawned here as your presently loaded character?", "Spawn here", list("No","Yes")) == "Yes")
+ autoresleeve(user)
+ else
+ to_chat(user, "You need to have been spawned in order to respawn here.")
+
+/obj/machinery/transhuman/autoresleever/attackby(var/mob/user) //Let's not let people mess with this.
+ update_icon()
+ if(istype(user,/mob/observer/dead))
+ attack_ghost(user)
+ else
+ return
+
+/obj/machinery/transhuman/autoresleever/proc/autoresleeve(var/mob/observer/dead/ghost)
+ if(stat)
+ to_chat(ghost, "This machine is not functioning...")
+ return
+ if(!istype(ghost,/mob/observer/dead))
+ return
+
+ if(ghost.mind && ghost.mind.current && ghost.mind.current.stat != DEAD)
+ if(istype(ghost.mind.current.loc, /obj/item/device/mmi))
+ if(tgui_alert(ghost, "Your brain is still alive, using the auto-resleever will delete that brain. Are you sure?", "Delete Brain", list("No","Yes")) != "Yes")
+ return
+ if(istype(ghost.mind.current.loc, /obj/item/device/mmi))
+ qdel(ghost.mind.current.loc)
+ else
+ to_chat(ghost, "Your body is still alive, you cannot be resleeved.")
+ return
+
+ var/client/ghost_client = ghost.client
+
+ //Name matching is ugly but mind doesn't persist to look at.
+ var/charjob
+ var/datum/data/record/record_found
+ record_found = find_general_record("name",ghost_client.prefs.real_name)
+
+ //Found their record, they were spawned previously
+ if(record_found)
+ charjob = record_found.fields["real_rank"]
+ else if(equip_body || ghost_spawns)
+ charjob = default_job
+ else
+ to_chat(ghost, "It appears as though your loaded character has not been spawned this round, or has quit the round. If you died as a different character, please load them, and try again.")
+ return
+
+ //For logging later
+ var/player_key = ghost_client.key
+ var/picked_ckey = ghost_client.ckey
+ var/picked_slot = ghost_client.prefs.default_slot
+
+ var/spawnloc = get_turf(src)
+ //Did we actually get a loc to spawn them?
+ if(!spawnloc)
+ to_chat(ghost, "Could not find a valid location to spawn your character.")
+ return
+
+ if(spawntype)
+ var/spawnthing = new spawntype(spawnloc)
+ if(isliving(spawnthing))
+ var/mob/living/L = spawnthing
+ L.key = player_key
+ L.ckey = picked_ckey
+ log_admin("[L.ckey]'s has been spawned as [L] via \the [src].")
+ message_admins("[L.ckey]'s has been spawned as [L] via \the [src].")
+ else
+ to_chat(ghost, "You can't play as a [spawnthing]...")
+ return
+ if(spawn_slots == -1)
+ return
+ else if(spawn_slots == 0)
+ return
+ else
+ spawn_slots --
+ return
+
+ if(tgui_alert(ghost, "Would you like to be resleeved?", "Resleeve", list("No","Yes")) == "No")
+ return
+ var/mob/living/carbon/human/new_character
+ new_character = new(spawnloc)
+
+ //We were able to spawn them, right?
+ if(!new_character)
+ to_chat(ghost, "Something went wrong and spawning failed.")
+ return
+
+ //Write the appearance and whatnot out to the character
+ ghost_client.prefs.copy_to(new_character)
+ if(new_character.dna)
+ new_character.dna.ResetUIFrom(new_character)
+ new_character.sync_organ_dna()
+
+ new_character.key = player_key
+
+ //Were they any particular special role? If so, copy.
+ if(new_character.mind)
+ new_character.mind.loaded_from_ckey = picked_ckey
+ new_character.mind.loaded_from_slot = picked_slot
+
+ var/datum/antagonist/antag_data = get_antag_data(new_character.mind.special_role)
+ if(antag_data)
+ antag_data.add_antagonist(new_character.mind)
+ antag_data.place_mob(new_character)
+
+ for(var/lang in ghost_client.prefs.alternate_languages)
+ var/datum/language/chosen_language = GLOB.all_languages[lang]
+ if(chosen_language)
+ if(is_lang_whitelisted(src,chosen_language) || (new_character.species && (chosen_language.name in new_character.species.secondary_langs)))
+ new_character.add_language(lang)
+
+ //If desired, apply equipment.
+ if(equip_body)
+ if(charjob)
+ job_master.EquipRank(new_character, charjob, 1)
+ new_character.mind.assigned_role = charjob
+ new_character.mind.role_alt_title = job_master.GetPlayerAltTitle(new_character, charjob)
+
+ //A redraw for good measure
+ new_character.regenerate_icons()
+
+ new_character.update_transform()
+
+ log_admin("[new_character.ckey]'s character [new_character.real_name] has been auto-resleeved.")
+ message_admins("[new_character.ckey]'s character [new_character.real_name] has been auto-resleeved.")
+
+ var/obj/item/weapon/implant/backup/imp = new(src)
+
+ if(imp.handle_implant(new_character,new_character.zone_sel.selecting))
+ imp.post_implant(new_character)
+
+ var/datum/transcore_db/db = SStranscore.db_by_mind_name(new_character.mind.name)
+ if(db)
+ var/datum/transhuman/mind_record/record = db.backed_up[new_character.mind.name]
+ if((world.time - record.last_notification) < 30 MINUTES)
+ global_announcer.autosay("[new_character.name] has been resleeved by the automatic resleeving system.", "TransCore Oversight", new_character.isSynthetic() ? "Science" : "Medical")
+ spawn(0) //Wait a second for nif to do its thing if there is one
+ if(record.nif_path)
+ var/obj/item/device/nif/nif
+ if(new_character.nif)
+ nif = new_character.nif
+ else
+ nif = new record.nif_path(new_character,null,record.nif_savedata)
+ spawn(0) //Wait another second in case we just gave them a new nif
+ if(nif) //Now restore the software
+ for(var/path in record.nif_software)
+ new path(nif)
+ nif.durability = record.nif_durability
+
+ if(spawn_slots == -1)
+ return
+ else if(spawn_slots == 0)
+ return
+ else
+ spawn_slots --
+ return
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 85d4fca868..351ca2191e 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -366,9 +366,11 @@
H.held_mob.muffled = FALSE
H.held_mob.forced_psay = FALSE
+ if(isliving(M))
+ var/mob/living/slip = M
+ slip.slip_protect = world.time + 25 // This is to prevent slipping back into your pred if they stand on soap or something.
//Place them into our drop_location
M.forceMove(drop_location())
-
items_preserved -= M
//Special treatment for absorbed prey
@@ -774,7 +776,7 @@
/////////////////////////////////////////////////////////////////////////
/obj/belly/proc/handle_absorb_langs()
owner.absorb_langs()
-
+
////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 4038ed6c54..0d18a844b4 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -504,9 +504,15 @@
to_chat(user, "They aren't able to be devoured.")
log_and_message_admins("[key_name_admin(src)] attempted to devour [key_name_admin(prey)] against their prefs ([prey ? ADMIN_JMP(prey) : "null"])")
return FALSE
-
+ // Slipnoms from chompstation downstream, credit to cadyn for the original PR.
// Prepare messages
- if(user == pred) //Feeding someone to yourself
+ if(prey.is_slipping)
+ attempt_msg = "It seems like [prey] is about to slide into [pred]'s [lowertext(belly.name)]!"
+ success_msg = "[prey] suddenly slides into [pred]'s [lowertext(belly.name)]!"
+ else if(pred.is_slipping)
+ attempt_msg = "It seems like [prey] is gonna end up inside [pred]'s [lowertext(belly.name)] as [pred] comes sliding over!"
+ success_msg = "[prey] suddenly slips inside of [pred]'s [lowertext(belly.name)] as [pred] slides into them!"
+ else if(user == pred) //Feeding someone to yourself
attempt_msg = "[pred] is attempting to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!"
success_msg = "[pred] manages to [lowertext(belly.vore_verb)] [prey] into their [lowertext(belly.name)]!"
else //Feeding someone to another person
@@ -566,7 +572,7 @@
var/air_type = /datum/gas_mixture/belly_air
if(istype(lifeform)) // If this doesn't succeed, then 'lifeform' is actually a bag or capture crystal with someone inside
air_type = lifeform.get_perfect_belly_air_type() // Without any overrides/changes, its gonna be /datum/gas_mixture/belly_air
-
+
var/air = new air_type(1000)
return air
diff --git a/code/modules/vore/eating/slipvore_vr.dm b/code/modules/vore/eating/slipvore_vr.dm
new file mode 100644
index 0000000000..2adc3f757e
--- /dev/null
+++ b/code/modules/vore/eating/slipvore_vr.dm
@@ -0,0 +1,60 @@
+// Slipnoms from chompstation downstream, credit to cadyn for the original PR.
+
+/mob/living
+ var/is_slipping = FALSE
+ var/slip_vore_in_progress = FALSE
+ var/slip_protect = 1
+
+/mob/living/proc/can_slip_vore(var/mob/living/target)
+ if(!target.is_slipping) //Obviously they have to be slipping to get slip vored
+ return FALSE
+ if(world.time <= target.slip_protect)
+ return FALSE
+ if(!(src.can_be_drop_pred && target.devourable && target.can_be_drop_prey)) //Make sure both of their prefs align with what we're gonna do.
+ return FALSE
+ if(!is_vore_predator(src)) //Check their bellies and stuff
+ return FALSE
+ if(!src.vore_selected) //Gotta have one selected as well.
+ return FALSE
+ return TRUE
+
+/mob/living/proc/can_be_slip_vored_by(var/mob/living/target)
+ if(!target.is_slipping) //Obviously they have to be slipping to get slip vored
+ return FALSE
+ if(world.time <= target.slip_protect)
+ return FALSE
+ if(!(target.can_be_drop_pred && src.devourable && src.can_be_drop_prey)) //Make sure both of their prefs align with what we're gonna do.
+ return FALSE
+ if(!is_vore_predator(target)) //Check their bellies and stuff
+ return FALSE
+ if(!target.vore_selected) //Gotta have one selected as well.
+ return FALSE
+ return TRUE
+
+/mob/living/Crossed(var/atom/movable/AM)
+ ..()
+ var/mob/living/target = AM
+ if(istype(target) && !target.incorporeal_move && !src.incorporeal_move) //The slip vore begins
+ if(can_slip_vore(target) && !src.slip_vore_in_progress && !target.slip_vore_in_progress) //If we can vore them go for it
+ perform_the_nom(src,target,src,src.vore_selected,1)
+ target.slip_vore_in_progress = FALSE
+ target.is_slipping = FALSE
+ return
+ else if(can_be_slip_vored_by(target) && !src.slip_vore_in_progress && !target.slip_vore_in_progress) //Otherwise, if they can vore us, make it happen.
+ perform_the_nom(target,src,target,target.vore_selected,1)
+ slip_vore_in_progress = FALSE
+ is_slipping = FALSE
+ return
+
+
+/mob/living/carbon/slip(var/slipped_on,stun_duration=8)
+ . = ..()
+ if(.)
+ is_slipping = TRUE
+ return .
+
+/mob/living/update_canmove()
+ . = ..()
+ if(is_slipping && !lying)
+ is_slipping = FALSE
+ return .
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index d83744547d..4a17a253f3 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -981,6 +981,7 @@
return FALSE
var/new_new_damage = CLAMP(new_damage, 0, 12)
host.vore_selected.digest_oxy = new_new_damage
+ . = TRUE
if("b_emoteactive")
host.vore_selected.emote_active = !host.vore_selected.emote_active
. = TRUE
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index 5f89123303..2b1f57bca5 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/icons/obj/machines/autoresleever.dmi b/icons/obj/machines/autoresleever.dmi
new file mode 100644
index 0000000000..1c1bb50706
Binary files /dev/null and b/icons/obj/machines/autoresleever.dmi differ
diff --git a/maps/stellardelight/stellar_delight1.dmm b/maps/stellardelight/stellar_delight1.dmm
index d74e93ac79..8de74aeb86 100644
--- a/maps/stellardelight/stellar_delight1.dmm
+++ b/maps/stellardelight/stellar_delight1.dmm
@@ -2075,6 +2075,10 @@
/obj/machinery/computer/transhuman/resleeving{
dir = 8
},
+/obj/item/device/radio/intercom{
+ dir = 4;
+ pixel_x = 24
+ },
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/stellardelight/deck1/resleeving)
"ew" = (
@@ -6726,7 +6730,7 @@
dir = 5
},
/obj/machinery/button/remote/airlock{
- desc = "A remote control switch for the medbay foyer.";
+ desc = "A remote control switch for the cleaning room exit.";
dir = 4;
id = "resleeveexit";
name = "Door Control";
@@ -7381,6 +7385,14 @@
/obj/effect/floor_decal/steeldecal/steel_decals4{
dir = 1
},
+/obj/machinery/button/remote/airlock{
+ desc = "A remote control switch for the cleaning room.";
+ dir = 4;
+ id = "resleeveclean";
+ name = "Door Control";
+ pixel_x = -27;
+ pixel_y = -27
+ },
/turf/simulated/floor/tiled/eris/white/bluecorner,
/area/stellardelight/deck1/resleeving)
"pC" = (
@@ -7970,7 +7982,7 @@
/turf/simulated/floor/carpet,
/area/chapel/main)
"qR" = (
-/obj/structure/table/glass,
+/obj/machinery/transhuman/autoresleever,
/turf/simulated/floor/tiled/dark,
/area/stellardelight/deck1/resleeving)
"qS" = (
@@ -16013,16 +16025,6 @@
/obj/effect/floor_decal/milspec/color/black,
/turf/simulated/floor/tiled/dark,
/area/security/armoury)
-"Ij" = (
-/obj/structure/bed/chair{
- dir = 1
- },
-/obj/item/device/radio/intercom{
- dir = 8;
- pixel_x = -24
- },
-/turf/simulated/floor/tiled/eris/white/bluecorner,
-/area/stellardelight/deck1/resleeving)
"Ik" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -20510,8 +20512,9 @@
/obj/machinery/door/airlock/angled_bay/standard/color{
dir = 8;
door_color = "#ffffff";
+ id_tag = "resleeveclean";
name = "Cleaning Room";
- req_access = null;
+ req_access = list(5);
stripe_color = "#5a96bb"
},
/turf/simulated/floor/tiled/steel_ridged,
@@ -33859,7 +33862,7 @@ dH
oW
vb
pA
-Ij
+hv
CG
ZB
hg
diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm
index cdba4f64c5..7625227402 100644
--- a/maps/tether/tether-01-surface1.dmm
+++ b/maps/tether/tether-01-surface1.dmm
@@ -2264,6 +2264,11 @@
/obj/effect/floor_decal/steeldecal/steel_decals4{
dir = 5
},
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"adS" = (
@@ -2288,6 +2293,11 @@
name = "Mental Health";
req_one_access = list()
},
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"adV" = (
@@ -2358,6 +2368,11 @@
pixel_x = -26;
pixel_y = -26
},
+/obj/structure/cable/green{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"adY" = (
@@ -2379,6 +2394,11 @@
},
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"adZ" = (
@@ -2552,11 +2572,11 @@
/turf/simulated/floor/carpet/blue,
/area/tether/surfacebase/medical/mentalhealth)
"aem" = (
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 10
+/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
+ dir = 4
},
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
@@ -2824,6 +2844,13 @@
/obj/effect/floor_decal/corner/paleblue/bordercorner2{
dir = 5
},
+/obj/structure/disposalpipe/trunk{
+ dir = 4
+ },
+/obj/machinery/disposal/wall{
+ dir = 8;
+ name = "auto-resleeving equipment deposit"
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
"aeE" = (
@@ -3295,6 +3322,17 @@
/obj/effect/floor_decal/steeldecal/steel_decals4{
dir = 4
},
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 6
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
"afp" = (
@@ -3345,6 +3383,17 @@
/obj/effect/floor_decal/corner/paleblue/bordercorner2{
dir = 4
},
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
/turf/simulated/floor/tiled,
/area/tether/surfacebase/lowernorthhall)
"aft" = (
@@ -3381,6 +3430,7 @@
dir = 4;
pixel_x = 24
},
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"afz" = (
@@ -8206,12 +8256,6 @@
dir = 4
},
/obj/random/junk,
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 5
- },
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
- },
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"anG" = (
@@ -11278,11 +11322,13 @@
icon_state = "1-4"
},
/obj/machinery/atmospherics/pipe/manifold/hidden/supply,
-/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,
/obj/structure/disposalpipe/segment{
dir = 8;
icon_state = "pipe-c"
},
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 5
+ },
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"asU" = (
@@ -13876,6 +13922,11 @@
/obj/machinery/door/firedoor/glass/hidden/steel{
dir = 1
},
+/obj/structure/cable/green{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
"awZ" = (
@@ -15870,12 +15921,12 @@
d2 = 8;
icon_state = "2-8"
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 10
- },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 10
},
+/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{
+ dir = 4
+ },
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"azU" = (
@@ -30423,13 +30474,19 @@
/turf/simulated/floor/tiled,
/area/hallway/lower/first_west)
"bbI" = (
-/obj/item/weapon/tool/wrench{
- desc = "The lower jaw seems to keep jiggling...";
- name = "loose wrench";
- toolspeed = 3
+/obj/machinery/vending/loadout/uniform,
+/obj/machinery/light{
+ dir = 8
},
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 9
+ },
+/obj/effect/floor_decal/corner/paleblue/border{
+ dir = 9
+ },
+/obj/machinery/atmospherics/unary/vent_scrubber/on,
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"bbJ" = (
/obj/structure/cable/green,
/obj/structure/cable/green{
@@ -30470,9 +30527,15 @@
/turf/simulated/floor,
/area/maintenance/substation/SurfMedsubstation)
"bbM" = (
-/obj/random/cigarettes,
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/obj/machinery/transhuman/autoresleever,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/paleblue/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"bbN" = (
/obj/structure/cable/green{
d1 = 4;
@@ -30628,9 +30691,18 @@
/turf/simulated/floor,
/area/maintenance/substation/SurfMedsubstation)
"bbZ" = (
-/obj/random/junk,
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/obj/structure/disposalpipe/trunk{
+ dir = 2
+ },
+/obj/structure/disposaloutlet,
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 1
+ },
+/obj/effect/floor_decal/corner/paleblue/border{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"bca" = (
/obj/effect/floor_decal/borderfloor,
/obj/effect/floor_decal/corner/brown/border,
@@ -31706,12 +31778,6 @@
},
/turf/simulated/floor/plating,
/area/maintenance/lower/trash_pit)
-"bTE" = (
-/obj/structure/railing{
- dir = 1
- },
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
"bWg" = (
/obj/machinery/vending/loadout/costume{
dir = 4
@@ -31803,12 +31869,11 @@
/turf/simulated/floor/tiled/monotile,
/area/crew_quarters/locker/laundry_arrival)
"cqg" = (
-/obj/structure/railing{
- dir = 1
+/obj/structure/disposalpipe/segment{
+ dir = 4
},
-/obj/machinery/atmospherics/unary/vent_pump/on,
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/turf/simulated/wall,
+/area/tether/surfacebase/medical/autoresleeving)
"cqZ" = (
/obj/effect/floor_decal/borderfloor{
dir = 8
@@ -32326,6 +32391,10 @@
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
+"dUK" = (
+/obj/structure/disposalpipe/segment,
+/turf/simulated/wall,
+/area/tether/surfacebase/medical/autoresleeving)
"dYd" = (
/obj/machinery/firealarm{
layer = 3.3;
@@ -32773,10 +32842,24 @@
/turf/simulated/floor/plating,
/area/tether/surfacebase/funny/clownoffice)
"fKm" = (
-/obj/random/junk,
-/obj/random/maintenance/cargo,
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = -24
+ },
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 8
+ },
+/obj/effect/floor_decal/corner/paleblue/border{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"fLB" = (
/obj/effect/floor_decal/steeldecal/steel_decals6{
dir = 5
@@ -33806,13 +33889,23 @@
/turf/simulated/floor/tiled,
/area/rnd/hallway)
"idk" = (
-/obj/item/weapon/tool/wirecutters{
- desc = "It gets jammed a lot.";
- name = "janky wirecutters";
- toolspeed = 2
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 6
},
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/obj/effect/floor_decal/corner/paleblue/border{
+ dir = 6
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/obj/machinery/alarm{
+ alarm_id = "pen_nine";
+ breach_detection = 0;
+ dir = 1;
+ pixel_y = -22
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"iee" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply,
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
@@ -33895,6 +33988,25 @@
/obj/item/device/radio/beacon,
/turf/simulated/floor/tiled,
/area/tether/surfacebase/surface_one_hall)
+"itj" = (
+/obj/structure/cable/green{
+ d2 = 8;
+ icon_state = "0-8"
+ },
+/obj/machinery/power/apc{
+ dir = 4;
+ name = "east bump";
+ nightshift_setting = 2;
+ pixel_x = 24
+ },
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 6
+ },
+/obj/effect/floor_decal/corner/paleblue/border{
+ dir = 6
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"iue" = (
/turf/simulated/floor/looking_glass{
dir = 1
@@ -34049,9 +34161,6 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 5
- },
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"jhN" = (
@@ -34822,9 +34931,13 @@
/turf/simulated/floor/tiled,
/area/crew_quarters/visitor_laundry)
"lbd" = (
-/obj/random/maintenance/cargo,
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/obj/effect/floor_decal/borderfloorwhite/corner,
+/obj/effect/floor_decal/corner/paleblue/bordercorner,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"lbu" = (
/obj/effect/floor_decal/borderfloorwhite,
/obj/effect/floor_decal/corner/paleblue/border,
@@ -35003,6 +35116,25 @@
/obj/machinery/holoposter,
/turf/simulated/wall,
/area/hallway/lower/first_west)
+"lBv" = (
+/obj/machinery/door/airlock/maintenance/medical{
+ id_tag = "autor";
+ name = "Auto-Resleeving";
+ req_access = list(5)
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"lBO" = (
/obj/structure/cable{
d1 = 1;
@@ -35148,9 +35280,32 @@
/turf/simulated/floor/tiled,
/area/tether/surfacebase/surface_one_hall)
"lPQ" = (
-/obj/item/stack/cable_coil/random_belt,
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/obj/machinery/button/remote/airlock{
+ desc = "A remote control door switch.";
+ id = "autor";
+ name = "Exit Button";
+ pixel_x = -26;
+ pixel_y = -26
+ },
+/obj/structure/cable/green{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8"
+ },
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 10
+ },
+/obj/effect/floor_decal/corner/paleblue/border{
+ dir = 10
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 9
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
+ dir = 9
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"lQu" = (
/obj/item/weapon/reagent_containers/glass/bucket,
/obj/structure/table/steel,
@@ -35873,6 +36028,14 @@
/obj/effect/floor_decal/industrial/warning,
/turf/simulated/floor/tiled/dark,
/area/tether/surfacebase/security/weaponsrange)
+"nzU" = (
+/obj/machinery/door/airlock/medical{
+ id_tag = null;
+ name = "Auto Resleeving";
+ req_access = list(5)
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"nAK" = (
/turf/simulated/wall/r_wall,
/area/maintenance/engineering/atmos/airlock/gas)
@@ -36375,9 +36538,22 @@
/turf/simulated/floor/carpet/gaycarpet,
/area/tether/surfacebase/funny/clownoffice)
"oPH" = (
-/obj/random/pizzabox,
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/item/device/radio/intercom{
+ dir = 1;
+ pixel_y = 24
+ },
+/obj/effect/floor_decal/borderfloorwhite{
+ dir = 5
+ },
+/obj/effect/floor_decal/corner/paleblue/border{
+ dir = 5
+ },
+/obj/machinery/atmospherics/unary/vent_pump/on,
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"oQm" = (
/obj/effect/floor_decal/borderfloor/corner,
/obj/structure/cable{
@@ -36818,6 +36994,15 @@
"qwV" = (
/turf/simulated/wall,
/area/tether/surfacebase/security/brig)
+"qBa" = (
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 4
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/lowmedbaymaint)
"qBb" = (
/obj/machinery/atmospherics/pipe/manifold/hidden/supply{
dir = 1
@@ -37024,12 +37209,12 @@
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
"qVi" = (
-/obj/structure/railing{
- dir = 1
+/obj/structure/disposalpipe/segment{
+ dir = 8;
+ icon_state = "pipe-c"
},
-/obj/machinery/atmospherics/unary/vent_scrubber/on,
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/turf/simulated/wall,
+/area/tether/surfacebase/medical/autoresleeving)
"qWk" = (
/obj/machinery/light,
/obj/structure/disposalpipe/segment{
@@ -37649,6 +37834,10 @@
},
/turf/simulated/floor/tiled,
/area/engineering/atmos)
+"sOx" = (
+/obj/machinery/atmospherics/unary/vent_pump/on,
+/turf/simulated/floor/plating,
+/area/maintenance/lowmedbaymaint)
"sQc" = (
/obj/structure/sign/securearea{
desc = "A warning sign which reads 'HIGH VOLTAGE'";
@@ -38176,10 +38365,17 @@
/turf/simulated/floor/tiled/techfloor,
/area/maintenance/lower/xenoflora)
"utQ" = (
-/obj/fiftyspawner/steel,
-/obj/random/junk,
-/turf/simulated/floor/plating,
-/area/maintenance/lowmedbaymaint)
+/obj/structure/disposalpipe/segment,
+/obj/effect/floor_decal/borderfloorwhite,
+/obj/effect/floor_decal/corner/paleblue/border,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply{
+ dir = 8
+ },
+/obj/machinery/shower{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/tether/surfacebase/medical/autoresleeving)
"uuu" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -38318,6 +38514,9 @@
},
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lowerhall)
+"uIU" = (
+/turf/simulated/wall,
+/area/tether/surfacebase/medical/autoresleeving)
"uKS" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -38465,11 +38664,8 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
- dir = 4
+ dir = 5
},
/turf/simulated/floor/plating,
/area/maintenance/lowmedbaymaint)
@@ -53037,11 +53233,11 @@ aan
atP
awE
aeU
-aeU
-aeU
-aeU
-aef
-aef
+uIU
+uIU
+uIU
+lBv
+cqg
afE
aef
aef
@@ -53179,11 +53375,11 @@ aan
uHS
awC
aeU
-aeU
+uIU
bbI
fKm
lPQ
-bTE
+cqg
akA
aAG
tdg
@@ -53321,10 +53517,10 @@ afb
atO
awC
aeU
-aeU
+uIU
bbM
lbd
-aAI
+itj
cqg
jcT
ksK
@@ -53463,10 +53659,10 @@ afb
atO
awp
axO
-aeU
+uIU
bbZ
utQ
-lbd
+dUK
qVi
anF
ksK
@@ -53605,11 +53801,11 @@ afb
atO
awG
aed
-aeU
+uIU
oPH
idk
-bbZ
-bTE
+uIU
+sOx
vuO
ksK
tdg
@@ -53747,12 +53943,12 @@ afb
atO
awz
aeU
-aeU
+uIU
+uIU
+nzU
+uIU
axP
-axP
-axP
-axP
-vuO
+qBa
ksK
oKn
oKn
diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm
index 79250a1c3d..8d47397b50 100644
--- a/maps/tether/tether-03-surface3.dmm
+++ b/maps/tether/tether-03-surface3.dmm
@@ -39409,7 +39409,9 @@
alarms_hidden = 1;
dir = 1;
name = "north bump";
- pixel_y = 28
+ pixel_y = 28;
+ req_access = null;
+ req_one_access = list(11,67)
},
/obj/structure/cable/green{
icon_state = "0-4"
diff --git a/maps/tether/tether_areas.dm b/maps/tether/tether_areas.dm
index 7d8c998346..9718cf7ecf 100644
--- a/maps/tether/tether_areas.dm
+++ b/maps/tether/tether_areas.dm
@@ -440,6 +440,8 @@
name = "\improper Medical Central Hall"
/area/tether/surfacebase/medical/lowerhall
name = "\improper Medical Lower Hall"
+/area/tether/surfacebase/medical/autoresleeving
+ name = "\improper Medical Auto Resleeving"
//North SurfMed3-2 Stairwell
/area/tether/surfacebase/medical/uppernorthstairwell
name = "\improper Medical Stairwell"
diff --git a/vorestation.dme b/vorestation.dme
index 4c19e1d2b5..1812f3d8d0 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1692,6 +1692,7 @@
#include "code\modules\admin\admin_tools.dm"
#include "code\modules\admin\admin_verb_lists_vr.dm"
#include "code\modules\admin\admin_verbs.dm"
+#include "code\modules\admin\admin_verbs_vr.dm"
#include "code\modules\admin\admin_vr.dm"
#include "code\modules\admin\banjob.dm"
#include "code\modules\admin\ckey_vr.dm"
@@ -3619,7 +3620,6 @@
#include "code\modules\projectiles\guns\energy\netgun_vr.dm"
#include "code\modules\projectiles\guns\energy\netgun_yw.dm"
#include "code\modules\projectiles\guns\energy\nuclear.dm"
-#include "code\modules\projectiles\guns\energy\nuclear_vr.dm"
#include "code\modules\projectiles\guns\energy\nuclear_yw.dm"
#include "code\modules\projectiles\guns\energy\particle.dm"
#include "code\modules\projectiles\guns\energy\phase.dm"
@@ -3662,7 +3662,6 @@
#include "code\modules\projectiles\guns\projectile\dartgun_vr.dm"
#include "code\modules\projectiles\guns\projectile\leveraction.dm"
#include "code\modules\projectiles\guns\projectile\pistol.dm"
-#include "code\modules\projectiles\guns\projectile\pistol_vr.dm"
#include "code\modules\projectiles\guns\projectile\pistol_yw.dm"
#include "code\modules\projectiles\guns\projectile\revolver.dm"
#include "code\modules\projectiles\guns\projectile\revolver_vr.dm"
@@ -3836,6 +3835,7 @@
#include "code\modules\research\designs\circuits\circuits_vr.dm"
#include "code\modules\research\designs\circuits\circuits_yw.dm"
#include "code\modules\research\designs\circuits\disks.dm"
+#include "code\modules\resleeving\autoresleever.dm"
#include "code\modules\resleeving\circuitboards.dm"
#include "code\modules\resleeving\computers.dm"
#include "code\modules\resleeving\designer.dm"
@@ -4076,6 +4076,7 @@
#include "code\modules\vore\eating\living_vr.dm"
#include "code\modules\vore\eating\silicon_vr.dm"
#include "code\modules\vore\eating\simple_animal_vr.dm"
+#include "code\modules\vore\eating\slipvore_vr.dm"
#include "code\modules\vore\eating\transforming_vr.dm"
#include "code\modules\vore\eating\vore_vr.dm"
#include "code\modules\vore\eating\vorehooks_vr.dm"
@@ -4252,4 +4253,4 @@
#include "maps\yw\structures\closets\research.dm"
#include "maps\yw\structures\closets\security.dm"
#include "maps\~map_system\maps.dm"
-// END_INCLUDE
\ No newline at end of file
+// END_INCLUDE