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/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/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 5a1e12a191b..4e269152ff9 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -102,6 +102,8 @@ 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 = ""
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/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 7a76812b34e..5011f5346ee 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.camera.network.Remove(list("Medical","MINE"))
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 a0c3be517b1..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)
@@ -455,8 +460,8 @@ the implant may become unstable and either pre-maturely inject the subject or si
implanted(mob/source as mob)
src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink")
if (source.mind)
- source.mind.store_memory("Freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
- source << "The implanted freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
+ source.mind.store_memory("Compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0)
+ source << "The implanted compressed matter implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate."
return 1
islegal()
@@ -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."
\ No newline at end of file
+ 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/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/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 92f30dc8f36..8e977bbc7d1 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/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm
index 46ff70493c9..4ea4a23553f 100644
--- a/code/modules/mob/living/simple_animal/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer.dm
@@ -38,11 +38,11 @@
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.
var/truename // Name used for brainworm-speak.
- var/bonded // Var for full bonding with the host brain.
var/mob/living/captive_brain/host_brain // Used for swapping control of the body back and forth.
var/controlling // Used in human death check.
@@ -110,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
@@ -135,7 +150,7 @@
spawn(300+(host.brainloss*5))
- if(!host || !src) return
+ if(!host || !src || controlling) return
else
src << "\red You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system."
@@ -149,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."
@@ -165,7 +204,6 @@ mob/living/simple_animal/borer/verb/release_host()
if(!host || !src) return
src << "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal."
- bonded = 0
if(!host.stat)
host << "An odd, uncomfortable pressure begins to build inside your skull, behind your ear..."
@@ -193,6 +231,12 @@ mob/living/simple_animal/borer/proc/detatch()
src.loc = get_turf(host)
controlling = 0
+ reset_view(null)
+ machine = null
+
+ host.reset_view(null)
+ host.machine = null
+
host.verbs -= /mob/living/carbon/human/proc/release_control
host.verbs -= /mob/living/carbon/human/proc/punish_host
host.verbs -= /mob/living/carbon/human/proc/spawn_larvae
@@ -220,7 +264,7 @@ mob/living/simple_animal/borer/proc/detatch()
return
var/list/choices = list()
- for(var/mob/living/C in view(1,src))
+ for(var/mob/living/carbon/human/C in view(1,src))
if(istype(C,/mob/living/carbon/human) && C.stat != 2)
choices += C
@@ -230,6 +274,7 @@ mob/living/simple_animal/borer/proc/detatch()
if(M.has_brain_worms())
src << "You cannot infest someone who is already infested!"
+ return
M << "Something slimy begins probing at the opening of your ear canal..."
src << "You slither up [M] and begin probing at their ear canal..."
@@ -257,7 +302,6 @@ mob/living/simple_animal/borer/proc/detatch()
var/datum/organ/external/head = M.get_organ("head")
head.implants += src
src.loc = M
- bonded = 0
host_brain.name = M.name
host_brain.real_name = M.real_name
@@ -265,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 ded645a11ef..08aad3d7ad6 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -607,6 +607,11 @@ var/list/slot_equipment_priority = list( \
src.pulling = AM
AM.pulledby = src
+ //Attempted fix for people flying away through space when cuffed and dragged.
+ if(ismob(AM))
+ var/mob/pulled = AM
+ pulled.inertia_dir = 0
+
/mob/proc/can_use_hands()
return
@@ -900,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!"
@@ -955,4 +960,4 @@ mob/verb/yank_out_object()
pinned -= O
if(!pinned.len)
anchored = 0
- return 1
\ No newline at end of file
+ return 1
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 68941a4d090..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)
@@ -235,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 7bb662f91ea..ca9e3078246 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 c83ba829a9d..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
@@ -631,6 +631,10 @@
H.name = "host brain"
H.real_name = "host brain"
+ verbs -= /mob/living/carbon/human/proc/release_control
+ verbs -= /mob/living/carbon/human/proc/punish_host
+ verbs -= /mob/living/carbon/human/proc/spawn_larvae
+
return
//resisting grabs (as if it helps anyone...)
@@ -666,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))
@@ -700,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))
@@ -753,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)"
@@ -791,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/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index f5d3fee5bb4..5d639fc3ba1 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -1019,7 +1019,7 @@ datum
required_other = 1
on_reaction(var/datum/reagents/holder)
- var/blocked = list(/mob/living/simple_animal/hostile,
+ /*var/blocked = list(/mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/pirate,
/mob/living/simple_animal/hostile/pirate/ranged,
/mob/living/simple_animal/hostile/russian,
@@ -1051,7 +1051,9 @@ datum
C.loc = get_turf_loc(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
- step(C, pick(NORTH,SOUTH,EAST,WEST))
+ step(C, pick(NORTH,SOUTH,EAST,WEST))*/
+ for(var/mob/O in viewers(get_turf_loc(holder.my_atom), null))
+ O.show_message(text("\red The slime core fizzles disappointingly,"), 1)
//Silver
slimebork
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index a70ba4ab8ea..f14712865aa 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -68,11 +68,17 @@
/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
+/obj/item/weapon/reagent_containers/hypospray/autoinjector/attackby(obj/item/I as obj, mob/user as mob)
+ ..()
+ update_icon() //Allows the autoinjector to be reset.
+ return
+
/obj/item/weapon/reagent_containers/hypospray/autoinjector/update_icon()
if(reagents.total_volume > 0)
icon_state = "[initial(icon_state)]1"
diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm
index 7e240f737e3..edc89ac0ac2 100644
--- a/code/modules/surgery/implant.dm
+++ b/code/modules/surgery/implant.dm
@@ -184,7 +184,10 @@
//Handle possessive brain borers.
if(istype(obj,/mob/living/simple_animal/borer))
- target.release_control()
+ var/mob/living/simple_animal/borer/worm = obj
+ if(worm.controlling)
+ target.release_control()
+ worm.detatch()
obj.loc = get_turf(target)
if(istype(obj,/obj/item/weapon/implant))
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/code/setup.dm b/code/setup.dm
index 7e6f0cb7a98..e4beb3781df 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
diff --git a/html/changelog.html b/html/changelog.html
index bb4b1216868..844c8ce2bc3 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -57,7 +57,16 @@ Stuff which is in development and not yet visible to players or just code relate
(ie. code improvements for expandability, etc.) should not be listed here. They
should be listed in the changelog upon commit though. Thanks. -->
+
August 8th, 2013
+
Erthilo updated:
+
+ - Raise Dead rune now properly heals and revives dead corpse.
+ - Admin-only rejuvenate verb now heals all organs, limbs, and diseases.
+ - Cyborg sprites now correctly reset with reset boards. This means cyborg appearances can now be changed without admin intervention.
+
+
+
2013/08/4
Chinsky updated:
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)