diff --git a/baystation12.dme b/baystation12.dme
index 8afc68318e4..b82ce97a578 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -787,10 +787,10 @@
#include "code\modules\customitems\item_defines.dm"
#include "code\modules\customitems\item_spawning.dm"
#include "code\modules\destilery\main.dm"
-#include "code\modules\detectivework\detective_work.dm"
-#include "code\modules\detectivework\evidence.dm"
-#include "code\modules\detectivework\footprints_and_rag.dm"
-#include "code\modules\detectivework\scanner.dm"
+#include "code\modules\DetectiveWork\detective_work.dm"
+#include "code\modules\DetectiveWork\evidence.dm"
+#include "code\modules\DetectiveWork\footprints_and_rag.dm"
+#include "code\modules\DetectiveWork\scanner.dm"
#include "code\modules\events\alien_infestation.dm"
#include "code\modules\events\blob.dm"
#include "code\modules\events\brand_intelligence.dm"
diff --git a/code/WorkInProgress/carn/Explosion2.dm b/code/WorkInProgress/carn/Explosion2.dm
index a1f2687cc85..06b85690024 100644
--- a/code/WorkInProgress/carn/Explosion2.dm
+++ b/code/WorkInProgress/carn/Explosion2.dm
@@ -9,7 +9,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
if(!epicenter) return
if(adminlog)
- message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ")
+ message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z] - JMP)")
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ")
playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(devastation_range*2,1) )
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index d160e662e84..784ba44c188 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -490,7 +490,7 @@ its easier to just keep the beam vertical.
var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblClickNew() proc is being tested)
-/*/atom/proc/DblClickNew()
+/atom/proc/DblClickNew()
if(!usr) return
// TODO DOOHL: Intergrate params to new proc. Saved for another time because var/valid_place is a fucking brainfuck
@@ -792,7 +792,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
if (in_range)
if ( !animal.restrained() )
- attack_animal(animal)*/
+ attack_animal(animal)
/atom/DblClick(location, control, params) //TODO: DEFERRED: REWRITE
if(!usr) return
@@ -943,9 +943,9 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// ------- ( CAN USE ITEM OR HAS 1 SECOND USE DELAY ) AND NOT CLICKING ON SCREEN -------
- if (usr.last_click + usr.click_delay < world.time)
- usr.last_click = world.time
- usr.click_delay = 0
+ if (usr.next_move < world.time)
+ usr.prev_move = usr.next_move
+ usr.next_move = world.time + 10
else
// ------- ALREADY USED ONE ITEM WITH USE DELAY IN THE PREVIOUS SECOND -------
return
@@ -1109,9 +1109,10 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// ------- ITEM INACESSIBLE OR CLICKING ON SCREEN -------
if (istype(src, /obj/screen))
// ------- IT'S THE HUD YOU'RE CLICKING ON -------
- usr.delay_click(2)
- if (usr.last_click + usr.click_delay < world.time)
- usr.last_click = world.time
+ usr.prev_move = usr.next_move
+ usr:lastDblClick = world.time + 2
+ if (usr.next_move < world.time)
+ usr.next_move = world.time + 2
else
return
@@ -1143,7 +1144,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
src.hand_al(usr, usr.hand)
else
// ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD -------
- if((LASER in usr:mutations) && usr:a_intent == "hurt" && usr.last_click + usr.click_delay < world.time)
+ if((LASER in usr:mutations) && usr:a_intent == "hurt" && world.time >= usr.next_move)
// ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED -------
var/turf/T = get_turf(usr)
@@ -1168,7 +1169,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
spawn( 1 )
A.process()
- usr.delay_click(6)
+ usr.next_move = world.time + 6
return
/atom/proc/ShiftClick(var/mob/M as mob)
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 5a1e12a191b..0f1fd97b36f 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -102,9 +102,11 @@ var/global/vox_kills = 0 //Used to check the Inviolate.
vox.age = rand(12,20)
vox.dna.mutantrace = "vox"
vox.set_species("Vox")
+ vox.languages = list() // Removing language from chargen.
+ vox.flavor_text = ""
vox.add_language("Vox-pidgin")
vox.h_style = "Short Vox Quills"
- vox.flavor_text = ""
+ vox.f_style = "Shaved"
for(var/datum/organ/external/limb in vox.organs)
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
vox.equip_vox_raider()
diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm
index 1e8eb4e5368..730f69e6643 100644
--- a/code/game/machinery/podmen.dm
+++ b/code/game/machinery/podmen.dm
@@ -74,17 +74,16 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
ghost = source
else // If no sample was injected or revival is not allowed, we grab an interested observer.
for(var/mob/dead/observer/O in player_list)
- if(O.client)
- var/response = alert(O, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No")
+ if(O.client && O.client.prefs.be_special & BE_PLANT)
+ var/response = alert(O, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No", "Never for this round.")
if(response == "Yes")
candidates += O
+ else if(response == "Never for this round")
+ O.client.prefs.be_special ^= BE_PLANT
if(!do_after(user, 100))
return
- if(!src || !user)
- return
-
if(candidates.len)
ghost = pick(candidates)
diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm
index 91ea8124393..cc4d766f25a 100644
--- a/code/game/objects/explosion.dm
+++ b/code/game/objects/explosion.dm
@@ -19,10 +19,10 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
epicenter = get_turf(epicenter)
if(!epicenter) return
-
+
playsound(epicenter, 'sound/effects/explosionfar.ogg', 100, 1, round(devastation_range*2,1) )
playsound(epicenter, "explosion", 100, 1, round(devastation_range,1) )
-
+
var/close = range(world.view+round(devastation_range,1), epicenter)
// to all distanced mobs play a different sound
for(var/mob/M in world) if(M.z == epicenter.z) if(!(M in close))
@@ -30,7 +30,7 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
if(M.ear_deaf <= 0 || !M.ear_deaf) if(!istype(M.loc,/turf/space))
M << 'explosionfar.ogg'
if(adminlog)
- message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])")
+ message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (JMP)")
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ")
var/lighting_controller_was_processing = lighting_controller.processing //Pause the lighting updates for a bit
@@ -85,4 +85,4 @@ proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impa
proc/secondaryexplosion(turf/epicenter, range)
for(var/turf/tile in range(range, epicenter))
- tile.ex_act(2)
+ tile.ex_act(2)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 281c23f0fd0..c55684eb197 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -131,7 +131,8 @@
else
if(isliving(src.loc))
return
- user.delay_click(2)
+ user.lastDblClick = world.time + 2
+ user.next_move = world.time + 2
src.pickup(user)
add_fingerprint(user)
user.put_in_active_hand(src)
@@ -165,7 +166,8 @@
if(istype(src.loc, /mob/living))
return
src.pickup(user)
- user.delay_click(2)
+ user.lastDblClick = world.time + 2
+ user.next_move = world.time + 2
user.put_in_active_hand(src)
return
@@ -227,8 +229,6 @@
log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" )
msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG
- user.delay_click(10)
-
//spawn(1800) // this wont work right
// M.lastattacker = null
/////////////////////////
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 6a26f70e1f5..77cf343de21 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -14,6 +14,7 @@
m_amt = 90
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
var/max_water = 50
+ var/last_use = 1.0
var/safety = 1
var/sprite_name = "fire_extinguisher"
@@ -66,6 +67,11 @@
usr << "\red \The [src] is empty."
return
+ if (world.time < src.last_use + 20)
+ return
+
+ src.last_use = world.time
+
playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3)
var/direction = get_dir(src,target)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 38d07024feb..a6c3b2fede4 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -159,9 +159,14 @@ Implant Specifics:
"}
return
if(istype(imp_in, /mob/))
var/mob/T = imp_in
+
+ message_admins("Explosive implant triggered in [T] ([T.key]). (JMP) ")
+ log_game("Explosive implant triggered in [T] ([T.key]).")
+
T.gib()
explosion(get_turf(imp_in), 1, 3, 4, 6, 3)
var/turf/t = get_turf(imp_in)
+
if(t)
t.hotspot_expose(3500,125)
@@ -464,4 +469,4 @@ the implant may become unstable and either pre-maturely inject the subject or si
/obj/item/weapon/implant/cortical
name = "cortical stack"
- desc = "A fist-sized mass of biocircuits and chips."
+ desc = "A fist-sized mass of biocircuits and chips."
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 48c51cdacff..c2514a11241 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -35,7 +35,6 @@
user.visible_message("[user] kicks [src].", \
"You kick [src].", \
"You hear twisting metal.")
- user.delay_click(10)
if(shock(user, 70))
return
@@ -52,7 +51,6 @@
user.visible_message("[user] mangles [src].", \
"You mangle [src].", \
"You hear twisting metal.")
- user.delay_click(10)
if(!shock(user, 70))
health -= 5
@@ -66,7 +64,6 @@
user.visible_message("[user] smashes against [src].", \
"You smash against [src].", \
"You hear twisting metal.")
- user.delay_click(10)
health -= rand(2,3)
healthcheck()
@@ -79,7 +76,6 @@
M.visible_message("[M] smashes against [src].", \
"You smash against [src].", \
"You hear twisting metal.")
- M.delay_click(10)
health -= M.melee_damage_upper
healthcheck()
@@ -164,10 +160,8 @@
else if(istype(W, /obj/item/weapon/shard))
health -= W.force * 0.1
- user.delay_click(10)
else if(!shock(user, 70))
playsound(loc, 'sound/effects/grillehit.ogg', 80, 1)
- user.delay_click(10)
switch(W.damtype)
if("fire")
health -= W.force
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 65fefec03c7..28791229725 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -104,19 +104,16 @@
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
- usr.delay_click(10)
else if (usr.a_intent == "hurt")
playsound(src.loc, 'glassknock.ogg', 80, 1)
usr.visible_message("\red [usr.name] bangs against the [src.name]!", \
"\red You bang against the [src.name]!", \
"You hear a banging sound.")
- usr.delay_click(5)
else
playsound(src.loc, 'glassknock.ogg', 80, 1)
usr.visible_message("[usr.name] knocks on the [src.name].", \
"You knock on the [src.name].", \
"You hear a knocking sound.")
- usr.delay_click(5)
return
@@ -131,11 +128,9 @@
new /obj/item/weapon/shard(loc)
if(reinf) new /obj/item/stack/rods(loc)
del(src)
- user.delay_click(10)
else //for nicer text~
user.visible_message("[user] smashes into [src]!")
playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
- user.delay_click(10)
/obj/structure/window/attack_alien(mob/user as mob)
@@ -163,7 +158,6 @@
var/mob/living/M = G.affecting
var/state = G.state
del(W) //gotta delete it here because if window breaks, it won't get deleted
- user.delay_click(10)
switch (state)
if(1)
M.apply_damage(7)
@@ -203,7 +197,6 @@
else
if(W.damtype == BRUTE || W.damtype == BURN)
hit(W.force)
- user.delay_click(10)
if(health <= 7)
anchored = 0
update_nearby_icons()
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 44f1cfdd820..1b55ca6b039 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -470,12 +470,15 @@
dat += ""
if(ticker.mode.raiders.len > 0)
+ dat += "
| Raiders | | |
"
for(var/datum/mind/raider in ticker.mode.raiders)
var/mob/M = raider.current
if(M)
dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "Show Objective |
"
+ dat += "
"
+
/*
if(ticker.mode.ninjas.len > 0)
dat += "
| Ninjas | | |
"
diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm
index dad75f8219a..1e328970fd8 100644
--- a/code/modules/admin/verbs/diagnostics.dm
+++ b/code/modules/admin/verbs/diagnostics.dm
@@ -62,7 +62,7 @@
*/
/client/proc/fix_next_move()
-/* set category = "Debug"
+ set category = "Debug"
set name = "Unfreeze Everyone"
var/largest_move_time = 0
var/largest_click_time = 0
@@ -90,7 +90,6 @@
message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!", 1)
message_admins("world.time = [world.time]", 1)
feedback_add_details("admin_verb","UFE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
- */
return
/client/proc/radio_report()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 00c468ce7fe..71dbdcddffd 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -16,6 +16,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"infested monkey" = IS_MODE_COMPILED("monkey"), // 9
"ninja" = "true", // 10
"vox raider" = IS_MODE_COMPILED("heist"), // 11
+ "diona" = 1, // 12
)
var/const/MAX_SAVE_SLOTS = 10
@@ -806,7 +807,7 @@ datum/preferences
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
for(var/S in whitelisted_species)
- if(is_alien_whitelisted(user,S))
+ if(is_alien_whitelisted(user,S) || (S == "Unathi" && is_alien_whitelisted(user,"Soghun")))
new_species += S
whitelisted = 1
if(!whitelisted)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index f70d3956b03..8c41ec8c9a3 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1030,6 +1030,7 @@
if (!O.amputated)
O.status &= ~ORGAN_DESTROYED
O.wounds.Cut()
+ O.heal_damage(1000,1000,1,1)
var/datum/organ/external/head/h = organs_by_name["head"]
h.disfigured = 0
@@ -1049,6 +1050,10 @@
for (var/datum/disease/virus in viruses)
virus.cure()
+ for (var/ID in virus2)
+ var/datum/disease2/disease/V = virus2[ID]
+ V.cure(src)
+
..()
/mob/living/carbon/human/proc/is_lung_ruptured()
@@ -1116,9 +1121,9 @@ mob/living/carbon/human/yank_out_object()
set desc = "Remove an embedded item at the cost of bleeding and pain."
set src in view(1)
- if(!isliving(usr) || usr.last_click + usr.click_delay > world.time)
+ if(!isliving(usr) || usr.next_move > world.time)
return
- usr.delay_click(20)
+ usr.next_move = world.time + 20
if(usr.stat == 1)
usr << "You are unconcious and cannot do that!"
@@ -1353,4 +1358,4 @@ mob/living/carbon/human/yank_out_object()
else
src << "You do not have enough chemicals stored to reproduce."
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 0c6b8172a28..cb161b9d944 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -12,8 +12,6 @@
..()
- M.delay_click(10)
-
if((M != src) && check_shields(0, M.name))
visible_message("\red [M] attempted to touch [src]!")
return 0
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 245a372d2a0..162a69b49c7 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -269,15 +269,6 @@
if(iscarbon(src))
var/mob/living/carbon/C = src
C.handcuffed = initial(C.handcuffed)
- if(ishuman(src))
- var/mob/living/carbon/human/H = src
- for(var/datum/organ/external/O in H.organs)
- O.heal_damage(1000,1000,1,1)
- for(var/datum/organ/internal/I in H.internal_organs)
- I.damage = 0
- for (var/ID in H.virus2)
- var/datum/disease2/disease/V = H.virus2[ID]
- V.cure(src)
for(var/datum/disease/D in viruses)
D.cure(0)
if(stat == 2)
diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm
index 647f9318afa..4ea4a23553f 100644
--- a/code/modules/mob/living/simple_animal/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer.dm
@@ -38,6 +38,7 @@
attacktext = "nips"
friendly = "prods"
wander = 0
+ pass_flags = PASSTABLE
var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin.
var/mob/living/carbon/human/host // Human host for the brain worm.
@@ -109,6 +110,21 @@
src << "You drop words into [host]'s mind: \"[message]\""
host << "Your own thoughts speak: \"[message]\""
+/mob/living/simple_animal/borer/Stat()
+ ..()
+ statpanel("Status")
+
+ if(emergency_shuttle)
+ if(emergency_shuttle.online && emergency_shuttle.location < 2)
+ var/timeleft = emergency_shuttle.timeleft()
+ if (timeleft)
+ stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
+
+ if (client.statpanel == "Status")
+ stat("Chemicals", chemicals)
+
+// VERBS!
+
/mob/living/simple_animal/borer/proc/borer_speak(var/message)
if(!message)
return
@@ -148,7 +164,31 @@
host.verbs += /mob/living/carbon/human/proc/punish_host
host.verbs += /mob/living/carbon/human/proc/spawn_larvae
-mob/living/simple_animal/borer/verb/release_host()
+/mob/living/simple_animal/borer/verb/secrete_chemicals()
+ set category = "Alien"
+ set name = "Secrete Chemicals"
+ set desc = "Push some chemicals into your host's bloodstream."
+
+ if(!host)
+ src << "You are not inside a host body."
+ return
+
+ if(stat)
+ src << "You cannot secrete chemicals in your current state."
+
+ if(chemicals < 50)
+ src << "You don't have enough chemicals!"
+
+ var/chem = input("Select a chemical to secrete.", "Chemicals") in list("bicaridine","tramadol","hyperzine")
+
+ if(chemicals < 50 || !host || controlling || !src || stat) //Sanity check.
+ return
+
+ src << "\red You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream."
+ host.reagents.add_reagent(chem, 15)
+ chemicals -= 50
+
+/mob/living/simple_animal/borer/verb/release_host()
set category = "Alien"
set name = "Release Host"
set desc = "Slither out of your host."
@@ -269,4 +309,62 @@ mob/living/simple_animal/borer/proc/detatch()
return
else
src << "They are no longer in range!"
- return
\ No newline at end of file
+ return
+
+/mob/living/simple_animal/borer/verb/ventcrawl()
+ set name = "Crawl through Vent"
+ set desc = "Enter an air vent and crawl through the pipe system."
+ set category = "Alien"
+
+// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
+// return
+ var/obj/machinery/atmospherics/unary/vent_pump/vent_found
+ var/welded = 0
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
+ if(!v.welded)
+ vent_found = v
+ break
+ else
+ welded = 1
+ if(vent_found)
+ if(vent_found.network&&vent_found.network.normal_members.len)
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
+ if(temp_vent.loc == loc)
+ continue
+ vents.Add(temp_vent)
+ var/list/choices = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
+ if(vent.loc.z != loc.z)
+ continue
+ var/atom/a = get_turf(vent)
+ choices.Add(a.loc)
+ var/turf/startloc = loc
+ var/obj/selection = input("Select a destination.", "Duct System") in choices
+ var/selection_position = choices.Find(selection)
+ if(loc==startloc)
+ var/obj/target_vent = vents[selection_position]
+ if(target_vent)
+ loc = target_vent.loc
+ else
+ src << "\blue You need to remain still while entering a vent."
+ else
+ src << "\blue This vent is not connected to anything."
+ else if(welded)
+ src << "\red That vent is welded."
+ else
+ src << "\blue You must be standing on or beside an air vent to enter it."
+ return
+
+//copy paste from alien/larva, if that func is updated please update this one alsoghost
+/mob/living/simple_animal/borer/verb/hide()
+ set name = "Hide"
+ set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
+ set category = "Alien"
+
+ if (layer != TURF_LAYER+0.2)
+ layer = TURF_LAYER+0.2
+ src << text("\blue You are now hiding.")
+ else
+ layer = MOB_LAYER
+ src << text("\blue You have stopped hiding.")
\ No newline at end of file
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index be1fb566b7a..1c3498802d1 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -33,7 +33,7 @@
if(hud_used) del(hud_used) //remove the hud objects
hud_used = new /datum/hud(src)
- last_click = world.time
+ next_move = 1
sight |= SEE_SELF
..()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 3600b8b0f7b..08aad3d7ad6 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -905,9 +905,9 @@ mob/verb/yank_out_object()
set desc = "Remove an embedded item at the cost of bleeding and pain."
set src in view(1)
- if(!isliving(usr) || usr.last_click + usr.click_delay > world.time)
+ if(!isliving(usr) || usr.next_move > world.time)
return
- usr.delay_click(20)
+ usr.next_move = world.time + 20
if(usr.stat == 1)
usr << "You are unconcious and cannot do that!"
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 6cbd091c0c1..b82f6736bbe 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -54,8 +54,8 @@
var/sdisabilities = 0 //Carbon
var/disabilities = 0 //Carbon
var/atom/movable/pulling = null
- var/last_click = null
- var/click_delay = 0
+ var/next_move = null
+ var/prev_move = null
var/monkeyizing = null //Carbon
var/other = 0.0
var/hand = null
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 07a07500083..5363c05a116 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -128,7 +128,7 @@
return
if(killing)
return
- if (assailant.last_click + assailant.click_delay > world.time)
+ if (assailant.next_move > world.time)
return
if ((!( assailant.canmove ) || assailant.lying))
//SN src = null
@@ -140,7 +140,7 @@
if (!( killing ))
assailant.visible_message("\red [assailant] has temporarily tightened \his grip on [affecting]!")
//Foreach goto(97)
- assailant.delay_click(10)
+ assailant.next_move = world.time + 10
//affecting.stunned = max(2, affecting.stunned)
//affecting.paralysis = max(1, affecting.paralysis)
affecting.losebreath = min(affecting.losebreath + 1, 3)
@@ -162,8 +162,6 @@
if(killing)
return
- assailant.delay_click(10)
-
switch(S.id)
if(1.0)
if (state < 2)
@@ -237,7 +235,7 @@
assailant.attack_log += text("\[[time_stamp()]\] Strangled (kill intent) [affecting.name] ([affecting.ckey])")
log_attack("[assailant.name] ([assailant.ckey]) Strangled (kill intent) [affecting.name] ([affecting.ckey])")
- assailant.delay_click(10)
+ assailant.next_move = world.time + 10
affecting.losebreath += 1
else
assailant.visible_message("\red [assailant] was unable to tighten \his grip on [affecting]'s neck!")
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 981d03962e7..29b2bfeac3c 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -454,7 +454,3 @@ var/list/intents = list("help","disarm","grab","hurt")
hud_used.action_intent.icon_state = "harm"
else
hud_used.action_intent.icon_state = "help"
-
-/mob/proc/delay_click(var/delay)
- src.click_delay = max(src.click_delay, delay)
- return src.click_delay
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index e74e2558628..6e6463fce45 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -351,7 +351,7 @@
if(client.prefs.species)
chosen_species = all_species[client.prefs.species]
if(chosen_species)
- if(is_alien_whitelisted(src, client.prefs.species) || !config.usealienwhitelist || !(chosen_species.flags & WHITELISTED))
+ if(is_alien_whitelisted(src, client.prefs.species) || (client.prefs.species == "Unathi" && is_alien_whitelisted(src, "Soghun")) || !config.usealienwhitelist || !(chosen_species.flags & WHITELISTED))
new_character.set_species(client.prefs.species)
if(chosen_species.language)
new_character.add_language(chosen_species.language)
diff --git a/code/modules/mob/screen.dm b/code/modules/mob/screen.dm
index 441a0d961fe..5742b95cb2d 100644
--- a/code/modules/mob/screen.dm
+++ b/code/modules/mob/screen.dm
@@ -600,9 +600,9 @@
set name = "Resist"
set category = "IC"
- if(!isliving(usr) || usr.last_click + usr.click_delay > world.time)
+ if(!isliving(usr) || usr.next_move > world.time)
return
- usr.delay_click(20)
+ usr.next_move = world.time + 20
var/mob/living/L = usr
@@ -670,7 +670,7 @@
if(iscarbon(L))
var/mob/living/carbon/C = L
if( C.handcuffed )
- C.delay_click(100)
+ C.next_move = world.time + 100
C.last_special = world.time + 100
C << "\red You attempt to unbuckle yourself. (This will take around 2 minutes and you need to stand still)"
for(var/mob/O in viewers(L))
@@ -704,7 +704,7 @@
// breakout_time++ //Harder to get out of welded lockers than locked lockers
//okay, so the closet is either welded or locked... resist!!!
- usr.delay_click(100)
+ usr.next_move = world.time + 100
L.last_special = world.time + 100
L << "\red You lean on the back of \the [C] and start pushing the door open. (this will take about [breakout_time] minutes)"
for(var/mob/O in viewers(usr.loc))
@@ -757,7 +757,7 @@
else if(iscarbon(L))
var/mob/living/carbon/CM = L
if(CM.handcuffed && CM.canmove && (CM.last_special <= world.time))
- CM.delay_click(100)
+ CM.next_move = world.time + 100
CM.last_special = world.time + 100
if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here.
usr << "\red You attempt to break your handcuffs. (This will take around 5 seconds and you need to stand still)"
@@ -795,7 +795,7 @@
CM.handcuffed = null
CM.update_inv_handcuffed()
else if(CM.legcuffed && CM.canmove && (CM.last_special <= world.time))
- CM.delay_click(100)
+ CM.next_move = world.time + 100
CM.last_special = world.time + 100
if(isalienadult(CM) || (HULK in usr.mutations))//Don't want to do a lot of logic gating here.
usr << "\red You attempt to break your legcuffs. (This will take around 5 seconds and you need to stand still)"
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 7eabd7e59c2..35af50877cb 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -131,7 +131,7 @@
in_chamber.loc = get_turf(user)
in_chamber.starting = get_turf(user)
in_chamber.shot_from = src
- usr.delay_click(4)
+ user.next_move = world.time + 4
in_chamber.silenced = silenced
in_chamber.current = curloc
in_chamber.yo = targloc.y - curloc.y
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index a70ba4ab8ea..0b4a3c1e7e9 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -68,7 +68,7 @@
/obj/item/weapon/reagent_containers/hypospray/autoinjector/attack(mob/M as mob, mob/user as mob)
..()
- if(reagents.total_volume <= 0)
+ if(reagents.total_volume <= 0) //Prevents autoinjectors to be refilled.
flags &= ~OPENCONTAINER
update_icon()
return
@@ -84,6 +84,4 @@
if(reagents && reagents.reagent_list.len)
usr << "\blue It is currently loaded."
else
- usr << "\blue It is spent."
-
-
+ usr << "\blue It is spent."
\ No newline at end of file
diff --git a/code/setup.dm b/code/setup.dm
index 83a4ae01619..7395595cee5 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -641,6 +641,7 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define BE_MONKEY 512
#define BE_NINJA 1024
#define BE_RAIDER 2048
+#define BE_PLANT 4096
var/list/be_special_flags = list(
"Traitor" = BE_TRAITOR,
@@ -654,7 +655,8 @@ var/list/be_special_flags = list(
"Cultist" = BE_CULTIST,
"Monkey" = BE_MONKEY,
"Ninja" = BE_NINJA,
- "Raider" = BE_RAIDER
+ "Raider" = BE_RAIDER,
+ "Diona" = BE_PLANT
)
#define AGE_MIN 17 //youngest a character can be
@@ -720,4 +722,4 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
//Language flags.
#define WHITELISTED 1 // Language is available if the speaker is whitelisted.
-#define RESTRICTED 2 // Language can only be accquired by spawning or an admin.
\ No newline at end of file
+#define RESTRICTED 2 // Language can only be accquired by spawning or an admin.
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index c6bf1e373e2..169f3c49f16 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index ec08cf37e78..253cf851a83 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/maps/RandomZLevels/fileList.txt b/maps/RandomZLevels/fileList.txt
index 10fbb9562ff..007837dc532 100644
--- a/maps/RandomZLevels/fileList.txt
+++ b/maps/RandomZLevels/fileList.txt
@@ -2,3 +2,5 @@
#Maps must be the full path to them
#Maps should be 255x255 or smaller and be bounded. Falling off the edge of the map will result in undefined behavior.
#SPECIFYING AN INVALID MAP WILL RESULT IN RUNTIMES ON GAME START
+
+#maps/RandomZLevels/awaymission.dmm
diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm
index 8b8b458a7f0..46c011d459d 100644
--- a/maps/tgstation.2.1.0.0.1.dmm
+++ b/maps/tgstation.2.1.0.0.1.dmm
@@ -2288,7 +2288,7 @@
"aRZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"aSa" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/kitchen)
"aSb" = (/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
-"aSc" = (/obj/machinery/door/airlock/maintenance,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
+"aSc" = (/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"aSd" = (/obj/machinery/vending/dinnerware,/obj/item/device/radio/intercom{pixel_y = 25},/obj/machinery/camera{c_tag = "Kitchen"; dir = 2},/turf/simulated/floor{icon_state = "cafeteria"; dir = 2},/area/crew_quarters/kitchen)
"aSe" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)
"aSf" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor{icon_state = "cafeteria"; dir = 5},/area/crew_quarters/kitchen)