diff --git a/baystation12.dme b/baystation12.dme
index 5a034ff343b..8b4d64ba6ff 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -784,10 +784,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/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index e73cfeb9422..e5be5d60a7a 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -271,21 +271,7 @@ var/list/sacrificed = list()
usr << "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."
return fizzle()
- for(var/datum/organ/external/affecting in corpse_to_raise.organs)
- affecting.heal_damage(1000, 1000)
- corpse_to_raise.setToxLoss(0)
- corpse_to_raise.setOxyLoss(0)
- corpse_to_raise.SetParalysis(0)
- corpse_to_raise.SetStunned(0)
- corpse_to_raise.SetWeakened(0)
- corpse_to_raise.radiation = 0
-// corpse_to_raise.buckled = null
-// if(corpse_to_raise.handcuffed)
-// del(corpse_to_raise.handcuffed)
-// corpse_to_raise.update_inv_handcuffed(0)
- corpse_to_raise.stat = CONSCIOUS
- corpse_to_raise.updatehealth()
- corpse_to_raise.UpdateDamageIcon()
+ corpse_to_raise.revive()
corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed)
//This means, should that player leave the body, the original may re-enter
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 33fc438c4ac..378d08f880d 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -288,7 +288,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
return 0
var/mob/M = loc
- if(!M.canmove)
+ if(M.stat || M.restrained() || M.paralysis || M.stunned || M.weakened)
return 0
if((src in M.contents) || ( istype(loc, /turf) && in_range(src, M) ))
return 1
@@ -306,7 +306,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/MouseDrop(obj/over_object as obj, src_location, over_location)
var/mob/M = usr
- if((!istype(over_object, /obj/screen)) && !M.restrained() && !M.stat && can_use())
+ if((!istype(over_object, /obj/screen)) && can_use())
return attack_self(M)
return
@@ -520,231 +520,226 @@ var/global/list/obj/item/device/pda/PDAs = list()
//if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) ) )
if(can_use()) //Why reinvent the wheel? There's a proc that does exactly that.
- if ( !(U.stat || U.restrained()) )
- add_fingerprint(U)
- U.set_machine(src)
+ add_fingerprint(U)
+ U.set_machine(src)
- switch(href_list["choice"])
+ switch(href_list["choice"])
//BASIC FUNCTIONS===================================
- if("Close")//Self explanatory
- U.unset_machine()
- U << browse(null, "window=pda")
- return
- if("Refresh")//Refresh, goes to the end of the proc.
- if("Return")//Return
- if(mode<=9)
+ if("Close")//Self explanatory
+ U.unset_machine()
+ U << browse(null, "window=pda")
+ return
+ if("Refresh")//Refresh, goes to the end of the proc.
+ if("Return")//Return
+ if(mode<=9)
+ mode = 0
+ else
+ mode = round(mode/10)
+ if(mode==4)//Fix for cartridges. Redirects to hub.
mode = 0
- else
- mode = round(mode/10)
- if(mode==4)//Fix for cartridges. Redirects to hub.
- mode = 0
- else if(mode >= 40 && mode <= 49)//Fix for cartridges. Redirects to refresh the menu.
- cartridge.mode = mode
- cartridge.unlock()
- if ("Authenticate")//Checks for ID
- id_check(U, 1)
- if("UpdateInfo")
- ownjob = id.assignment
- name = "PDA-[owner] ([ownjob])"
- if("Eject")//Ejects the cart, only done from hub.
- if (!isnull(cartridge))
- var/turf/T = loc
- if(ismob(T))
- T = T.loc
- cartridge.loc = T
- scanmode = 0
- if (cartridge.radio)
- cartridge.radio.hostpda = null
- cartridge = null
+ else if(mode >= 40 && mode <= 49)//Fix for cartridges. Redirects to refresh the menu.
+ cartridge.mode = mode
+ cartridge.unlock()
+ if ("Authenticate")//Checks for ID
+ id_check(U, 1)
+ if("UpdateInfo")
+ ownjob = id.assignment
+ name = "PDA-[owner] ([ownjob])"
+ if("Eject")//Ejects the cart, only done from hub.
+ if (!isnull(cartridge))
+ var/turf/T = loc
+ if(ismob(T))
+ T = T.loc
+ cartridge.loc = T
+ scanmode = 0
+ if (cartridge.radio)
+ cartridge.radio.hostpda = null
+ cartridge = null
//MENU FUNCTIONS===================================
- if("0")//Hub
- mode = 0
- if("1")//Notes
- mode = 1
- if("2")//Messenger
- mode = 2
- if("21")//Read messeges
- mode = 21
- if("3")//Atmos scan
- mode = 3
- if("4")//Redirects to hub
- mode = 0
- if("chatroom") // chatroom hub
- mode = 5
- if("41") //Manifest
- mode = 41
+ if("0")//Hub
+ mode = 0
+ if("1")//Notes
+ mode = 1
+ if("2")//Messenger
+ mode = 2
+ if("21")//Read messeges
+ mode = 21
+ if("3")//Atmos scan
+ mode = 3
+ if("4")//Redirects to hub
+ mode = 0
+ if("chatroom") // chatroom hub
+ mode = 5
+ if("41") //Manifest
+ mode = 41
//MAIN FUNCTIONS===================================
- if("Light")
- if(fon)
- fon = 0
- if(src in U.contents) U.SetLuminosity(U.luminosity - f_lum)
- else SetLuminosity(0)
- else
- fon = 1
- if(src in U.contents) U.SetLuminosity(U.luminosity + f_lum)
- else SetLuminosity(f_lum)
- if("Medical Scan")
- if(scanmode == 1)
- scanmode = 0
- else if((!isnull(cartridge)) && (cartridge.access_medical))
- scanmode = 1
- if("Reagent Scan")
- if(scanmode == 3)
- scanmode = 0
- else if((!isnull(cartridge)) && (cartridge.access_reagent_scanner))
- scanmode = 3
- if("Halogen Counter")
- if(scanmode == 4)
- scanmode = 0
- else if((!isnull(cartridge)) && (cartridge.access_engine))
- scanmode = 4
- if("Honk")
- if ( !(last_honk && world.time < last_honk + 20) )
- playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
- last_honk = world.time
- if("Gas Scan")
- if(scanmode == 5)
- scanmode = 0
- else if((!isnull(cartridge)) && (cartridge.access_atmos))
- scanmode = 5
+ if("Light")
+ if(fon)
+ fon = 0
+ if(src in U.contents) U.SetLuminosity(U.luminosity - f_lum)
+ else SetLuminosity(0)
+ else
+ fon = 1
+ if(src in U.contents) U.SetLuminosity(U.luminosity + f_lum)
+ else SetLuminosity(f_lum)
+ if("Medical Scan")
+ if(scanmode == 1)
+ scanmode = 0
+ else if((!isnull(cartridge)) && (cartridge.access_medical))
+ scanmode = 1
+ if("Reagent Scan")
+ if(scanmode == 3)
+ scanmode = 0
+ else if((!isnull(cartridge)) && (cartridge.access_reagent_scanner))
+ scanmode = 3
+ if("Halogen Counter")
+ if(scanmode == 4)
+ scanmode = 0
+ else if((!isnull(cartridge)) && (cartridge.access_engine))
+ scanmode = 4
+ if("Honk")
+ if ( !(last_honk && world.time < last_honk + 20) )
+ playsound(loc, 'sound/items/bikehorn.ogg', 50, 1)
+ last_honk = world.time
+ if("Gas Scan")
+ if(scanmode == 5)
+ scanmode = 0
+ else if((!isnull(cartridge)) && (cartridge.access_atmos))
+ scanmode = 5
//MESSENGER/NOTE FUNCTIONS===================================
- if ("Edit")
- var/n = input(U, "Please enter message", name, notehtml) as message
- if (in_range(src, U) && loc == U)
- n = copytext(adminscrub(n), 1, MAX_MESSAGE_LEN)
- if (mode == 1)
- note = replacetext(n, "\n", "
")
- notehtml = n
- else
- U << browse(null, "window=pda")
- return
- if("Toggle Messenger")
- toff = !toff
- if("Toggle Ringer")//If viewing texts then erase them, if not then toggle silent status
- silent = !silent
- if("Clear")//Clears messages
- tnote = null
- if("Ringtone")
- var/t = input(U, "Please enter new ringtone", name, ttone) as text
- if (in_range(src, U) && loc == U)
- if (t)
- if(src.hidden_uplink && hidden_uplink.check_trigger(U, lowertext(t), lowertext(lock_code)))
- U << "The PDA softly beeps."
- U << browse(null, "window=pda")
- else
- t = copytext(sanitize(t), 1, 20)
- ttone = t
- else
- U << browse(null, "window=pda")
- return
- if("Message")
- var/obj/item/device/pda/P = locate(href_list["target"])
- src.create_message(U, P)
+ if ("Edit")
+ var/n = input(U, "Please enter message", name, notehtml) as message
+ if (in_range(src, U) && loc == U)
+ n = copytext(adminscrub(n), 1, MAX_MESSAGE_LEN)
+ if (mode == 1)
+ note = replacetext(n, "\n", "
")
+ notehtml = n
+ else
+ U << browse(null, "window=pda")
+ return
+ if("Toggle Messenger")
+ toff = !toff
+ if("Toggle Ringer")//If viewing texts then erase them, if not then toggle silent status
+ silent = !silent
+ if("Clear")//Clears messages
+ tnote = null
+ if("Ringtone")
+ var/t = input(U, "Please enter new ringtone", name, ttone) as text
+ if (in_range(src, U) && loc == U)
+ if (t)
+ if(src.hidden_uplink && hidden_uplink.check_trigger(U, lowertext(t), lowertext(lock_code)))
+ U << "The PDA softly beeps."
+ U << browse(null, "window=pda")
+ else
+ t = copytext(sanitize(t), 1, 20)
+ ttone = t
+ else
+ U << browse(null, "window=pda")
+ return
+ if("Message")
+ var/obj/item/device/pda/P = locate(href_list["target"])
+ src.create_message(U, P)
- if("Send Honk")//Honk virus
- if(istype(cartridge, /obj/item/weapon/cartridge/clown))//Cartridge checks are kind of unnecessary since everything is done through switch.
- var/obj/item/device/pda/P = locate(href_list["target"])//Leaving it alone in case it may do something useful, I guess.
- if(!isnull(P))
- if (!P.toff && cartridge:honk_charges > 0)
- cartridge:honk_charges--
- U.show_message("\blue Virus sent!", 1)
- P.honkamt = (rand(15,20))
- else
- U << "PDA not found."
+ if("Send Honk")//Honk virus
+ if(istype(cartridge, /obj/item/weapon/cartridge/clown))//Cartridge checks are kind of unnecessary since everything is done through switch.
+ var/obj/item/device/pda/P = locate(href_list["target"])//Leaving it alone in case it may do something useful, I guess.
+ if(!isnull(P))
+ if (!P.toff && cartridge:honk_charges > 0)
+ cartridge:honk_charges--
+ U.show_message("\blue Virus sent!", 1)
+ P.honkamt = (rand(15,20))
else
- U << browse(null, "window=pda")
- return
- if("Send Silence")//Silent virus
- if(istype(cartridge, /obj/item/weapon/cartridge/mime))
- var/obj/item/device/pda/P = locate(href_list["target"])
- if(!isnull(P))
- if (!P.toff && cartridge:mime_charges > 0)
- cartridge:mime_charges--
- U.show_message("\blue Virus sent!", 1)
- P.silent = 1
- P.ttone = "silence"
- else
- U << "PDA not found."
+ U << "PDA not found."
+ else
+ U << browse(null, "window=pda")
+ return
+ if("Send Silence")//Silent virus
+ if(istype(cartridge, /obj/item/weapon/cartridge/mime))
+ var/obj/item/device/pda/P = locate(href_list["target"])
+ if(!isnull(P))
+ if (!P.toff && cartridge:mime_charges > 0)
+ cartridge:mime_charges--
+ U.show_message("\blue Virus sent!", 1)
+ P.silent = 1
+ P.ttone = "silence"
else
- U << browse(null, "window=pda")
- return
+ U << "PDA not found."
+ else
+ U << browse(null, "window=pda")
+ return
//SYNDICATE FUNCTIONS===================================
- if("Toggle Door")
- if(cartridge && cartridge.access_remote_door)
- for(var/obj/machinery/door/poddoor/M in world)
- if(M.id == cartridge.remote_door_id)
- if(M.density)
- M.open()
- else
- M.close()
+ if("Toggle Door")
+ if(cartridge && cartridge.access_remote_door)
+ for(var/obj/machinery/door/poddoor/M in world)
+ if(M.id == cartridge.remote_door_id)
+ if(M.density)
+ M.open()
+ else
+ M.close()
- if("Detonate")//Detonate PDA
- if(istype(cartridge, /obj/item/weapon/cartridge/syndicate))
- var/obj/item/device/pda/P = locate(href_list["target"])
- if(!isnull(P))
- if (!P.toff && cartridge:shock_charges > 0)
- cartridge:shock_charges--
+ if("Detonate")//Detonate PDA
+ if(istype(cartridge, /obj/item/weapon/cartridge/syndicate))
+ var/obj/item/device/pda/P = locate(href_list["target"])
+ if(!isnull(P))
+ if (!P.toff && cartridge:shock_charges > 0)
+ cartridge:shock_charges--
- var/difficulty = 0
+ var/difficulty = 0
- if(P.cartridge)
- difficulty += P.cartridge.access_medical
- difficulty += P.cartridge.access_security
- difficulty += P.cartridge.access_engine
- difficulty += P.cartridge.access_clown
- difficulty += P.cartridge.access_janitor
- else
- difficulty += 2
+ if(P.cartridge)
+ difficulty += P.cartridge.access_medical
+ difficulty += P.cartridge.access_security
+ difficulty += P.cartridge.access_engine
+ difficulty += P.cartridge.access_clown
+ difficulty += P.cartridge.access_janitor
+ else
+ difficulty += 2
- if(prob(difficulty * 12) || (P.hidden_uplink))
- U.show_message("\red An error flashes on your [src].", 1)
- else if (prob(difficulty * 3))
- U.show_message("\red Energy feeds back into your [src]!", 1)
- U << browse(null, "window=pda")
- explode()
- else
- U.show_message("\blue Success!", 1)
- P.explode()
- else
- U << "PDA not found."
+ if(prob(difficulty * 12) || (P.hidden_uplink))
+ U.show_message("\red An error flashes on your [src].", 1)
+ else if (prob(difficulty * 3))
+ U.show_message("\red Energy feeds back into your [src]!", 1)
+ U << browse(null, "window=pda")
+ explode()
+ else
+ U.show_message("\blue Success!", 1)
+ P.explode()
else
- U.unset_machine()
- U << browse(null, "window=pda")
- return
+ U << "PDA not found."
+ else
+ U.unset_machine()
+ U << browse(null, "window=pda")
+ return
//pAI FUNCTIONS===================================
- if("pai")
- switch(href_list["option"])
- if("1") // Configure pAI device
- pai.attack_self(U)
- if("2") // Eject pAI device
- var/turf/T = get_turf_or_move(src.loc)
- if(T)
- pai.loc = T
+ if("pai")
+ switch(href_list["option"])
+ if("1") // Configure pAI device
+ pai.attack_self(U)
+ if("2") // Eject pAI device
+ var/turf/T = get_turf_or_move(src.loc)
+ if(T)
+ pai.loc = T
//LINK FUNCTIONS===================================
- else//Cartridge menu linking
- mode = text2num(href_list["choice"])
- cartridge.mode = mode
- cartridge.unlock()
- else//If can't interact.
- U.unset_machine()
- U << browse(null, "window=pda")
- return
+ else//Cartridge menu linking
+ mode = text2num(href_list["choice"])
+ cartridge.mode = mode
+ cartridge.unlock()
else//If not in range or not using the pda.
U.unset_machine()
U << browse(null, "window=pda")
@@ -866,7 +861,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(issilicon(usr))
return
- if ( !(usr.stat || usr.restrained()) )
+ if ( can_use(usr) )
if(id)
remove_id()
else
@@ -883,7 +878,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(issilicon(usr))
return
- if ( !(usr.stat || usr.restrained()) )
+ if ( can_use(usr) )
var/obj/item/weapon/pen/O = locate() in src
if(O)
if (istype(loc, /mob))
@@ -943,7 +938,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
//Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand.
if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) )
- if(!(user.stat || user.restrained()) )//If they can still act.
+ if( can_use(user) )//If they can still act.
id_check(user, 2)
user << "You put the ID into \the [src]'s slot."
updateSelfDialog()//Update self dialog on success.
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 6020cc834a2..9fccf2e0604 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -30,6 +30,7 @@
R.uneq_all()
R.hands.icon_state = "nomod"
R.icon_state = "robot"
+ R.base_icon = "robot"
del(R.module)
R.module = null
R.updatename("Default")
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 1bd4b34547a..803f2b12545 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -2029,17 +2029,13 @@
if("virus")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","V")
- var/answer = alert("Do you want this to be a random disease or do you have something in mind?",,"Make Your Own","Random","Choose")
- if(answer=="Random")
- viral_outbreak()
- message_admins("[key_name_admin(usr)] has triggered a virus outbreak", 1)
- else if(answer == "Choose")
- var/list/viruses = list("fake gbs","gbs","magnitis","wizarditis",/*"beesease",*/"brain rot","cold","retrovirus","flu","pierrot's throat","rhumba beat")
- var/V = input("Choose the virus to spread", "BIOHAZARD") in viruses
- viral_outbreak(V)
- message_admins("[key_name_admin(usr)] has triggered a virus outbreak of [V]", 1)
+ var/answer = alert("Do you want this to be a greater disease or a lesser one?",,"Greater","Lesser")
+ if(answer=="Lesser")
+ virus2_lesser_infection()
+ message_admins("[key_name_admin(usr)] has triggered a lesser virus outbreak.", 1)
else
- AdminCreateVirus(usr)
+ virus2_greater_infection()
+ message_admins("[key_name_admin(usr)] has triggered a greater virus outbreak.", 1)
if("retardify")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","RET")
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 162a69b49c7..245a372d2a0 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -269,6 +269,15 @@
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/virus2/disease2.dm b/code/modules/virus2/disease2.dm
index 84fcf486e4f..8efff4f1ca4 100644
--- a/code/modules/virus2/disease2.dm
+++ b/code/modules/virus2/disease2.dm
@@ -162,3 +162,27 @@ var/global/list/virusDB = list()
v.fields["spread type"] = spreadtype
virusDB["[uniqueID]"] = v
return 1
+
+proc/virus2_lesser_infection()
+ var/list/candidates = list() //list of candidate keys
+
+ for(var/mob/living/carbon/human/G in player_list)
+ if(G.client && G.stat != DEAD)
+ candidates += G
+ if(!candidates.len) return
+
+ candidates = shuffle(candidates)
+
+ infect_mob_random_lesser(candidates[1])
+
+proc/virus2_greater_infection()
+ var/list/candidates = list() //list of candidate keys
+
+ for(var/mob/living/carbon/human/G in player_list)
+ if(G.client && G.stat != DEAD)
+ candidates += G
+ if(!candidates.len) return
+
+ candidates = shuffle(candidates)
+
+ infect_mob_random_greater(candidates[1])
diff --git a/html/changelog.html b/html/changelog.html
index 6f635fef91d..1b7d6690d0b 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,15 @@ Changelog Section
Stuff which is in development and not yet visible to players or just code related
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit though. Thanks. -->
+