diff --git a/code/WorkInProgress/carn/Explosion2.dm b/code/WorkInProgress/carn/Explosion2.dm
index a1f2687cc8..06b8569002 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 d160e662e8..784ba44c18 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 e73cfeb942..e5be5d60a7 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 5a1e12a191..4e269152ff 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 1e8eb4e536..730f69e664 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 91ea812439..cc4d766f25 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 281c23f0fd..c55684eb19 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 33fc438c4a..378d08f880 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 7a76812b34..5011f5346e 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 6a26f70e1f..77cf343de2 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 a0c3be517b..a6c3b2fede 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 48c51cdacf..c2514a1124 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 65fefec03c..2879122972 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 44f1cfdd82..1b55ca6b03 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 1bd4b34547..803f2b1254 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 dad75f8219..1e328970fd 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 92f30dc8f3..8e977bbc7d 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 f70d3956b0..8c41ec8c9a 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 46ff70493c..4ea4a23553 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 be1fb566b7..1c3498802d 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 ded645a11e..08aad3d7ad 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 6cbd091c0c..b82f6736bb 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 68941a4d09..5363c05a11 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 981d03962e..29b2bfeac3 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 7bb662f91e..ca9e307824 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 c83ba829a9..5742b95cb2 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 7eabd7e59c..35af50877c 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 f5d3fee5bb..5d639fc3ba 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 a70ba4ab8e..f14712865a 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 7e240f737e..edc89ac0ac 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 84fcf486e4..8efff4f1ca 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 7e6f0cb7a9..e4beb3781d 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 bb4b121686..844c8ce2bc 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 c6bf1e373e..169f3c49f1 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 ec08cf37e7..253cf851a8 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 10fbb9562f..007837dc53 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 8b8b458a7f..46c011d459 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)