diff --git a/baystation12.dme b/baystation12.dme index e3380e26203..f0cba7d213a 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -800,7 +800,7 @@ #include "code\modules\admin\verbs\deadsay.dm" #include "code\modules\admin\verbs\debug.dm" #include "code\modules\admin\verbs\diagnostics.dm" -#include "code\modules\admin\verbs\getruntimelog.dm" +#include "code\modules\admin\verbs\getlogs.dm" #include "code\modules\admin\verbs\gimmicks.dm" #include "code\modules\admin\verbs\mapping.dm" #include "code\modules\admin\verbs\massmodvar.dm" @@ -886,6 +886,7 @@ #include "code\modules\mining\money_bag.dm" #include "code\modules\mining\ores_materials_coins.dm" #include "code\modules\mining\satchel_ore_box.dm" +#include "code\modules\mob\death.dm" #include "code\modules\mob\login.dm" #include "code\modules\mob\logout.dm" #include "code\modules\mob\mob.dm" @@ -897,6 +898,7 @@ #include "code\modules\mob\say.dm" #include "code\modules\mob\screen.dm" #include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\dead\death.dm" #include "code\modules\mob\dead\observer\hud.dm" #include "code\modules\mob\dead\observer\login.dm" #include "code\modules\mob\dead\observer\observer.dm" @@ -910,6 +912,7 @@ #include "code\modules\mob\living\carbon\give.dm" #include "code\modules\mob\living\carbon\shock.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" +#include "code\modules\mob\living\carbon\alien\death.dm" #include "code\modules\mob\living\carbon\alien\say.dm" #include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" #include "code\modules\mob\living\carbon\alien\humanoid\death.dm" @@ -976,6 +979,7 @@ #include "code\modules\mob\living\carbon\monkey\npc.dm" #include "code\modules\mob\living\carbon\monkey\powers.dm" #include "code\modules\mob\living\carbon\monkey\say.dm" +#include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\say.dm" #include "code\modules\mob\living\silicon\silicon.dm" #include "code\modules\mob\living\silicon\ai\ai.dm" diff --git a/code/defines/global.dm b/code/defines/global.dm index 24e128d0f9d..1bad942d35f 100644 --- a/code/defines/global.dm +++ b/code/defines/global.dm @@ -228,4 +228,4 @@ var // For FTP requests. (i.e. downloading runtime logs.) // However it'd be ok to use for accessing attack logs and such too, which are even laggier. - fileaccess_timer = 600 //Cannot access files by ftp until the game is finished setting up and stuff. \ No newline at end of file + fileaccess_timer = 1800 //Cannot access files by ftp until the game is finished setting up and stuff. diff --git a/code/defines/turf.dm b/code/defines/turf.dm index cc12b3f315b..277abdcb898 100644 --- a/code/defines/turf.dm +++ b/code/defines/turf.dm @@ -128,7 +128,7 @@ icon = 'shuttle.dmi' thermal_conductivity = 0.05 heat_capacity = 0 - layer = 2.1 + layer = 2 /turf/simulated/shuttle/wall name = "wall" diff --git a/code/game/algorithm.dm b/code/game/algorithm.dm index 2b1740237a5..6a5e20e0058 100644 --- a/code/game/algorithm.dm +++ b/code/game/algorithm.dm @@ -6,7 +6,6 @@ Starting up. [time2text(world.timeofday, "hh:mm.ss")] --------------------- - "} diaryofmeanpeople = file("data/logs/[time2text(world.realtime, "YYYY/MM-Month/DD-Day")] Attack.log") @@ -15,13 +14,8 @@ Starting up. [time2text(world.timeofday, "hh:mm.ss")] Starting up. [time2text(world.timeofday, "hh:mm.ss")] --------------------- -Dear Diary.... -Today, these people were mean: - "} - - jobban_loadbanfile() jobban_updatelegacybans() LoadBans() diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 0cb18c5ca6c..7f5a1a431fe 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -4,7 +4,7 @@ list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide") -/proc/iscultist(mob/living/carbon/M as mob) +/proc/iscultist(mob/living/M as mob) return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult) /proc/is_convertable_to_cult(datum/mind/mind) diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm index 5120e38bed3..fda0744c647 100644 --- a/code/game/magic/cultist/runes.dm +++ b/code/game/magic/cultist/runes.dm @@ -424,7 +424,7 @@ var/list/sacrificed = list() "\red You hear faint rustle.") ghost.invisibility = 10 ghost.key = D.key - D.dust(1) + D.dust() return diff --git a/code/game/objects/gibs.dm b/code/game/objects/gibs.dm index e3325833eef..b6b1a50b0eb 100644 --- a/code/game/objects/gibs.dm +++ b/code/game/objects/gibs.dm @@ -1,6 +1,7 @@ -//HUMANS +/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) //CARN MARKER + new /obj/effect/gibspawner/generic(get_turf(location),viruses,MobDNA) -/proc/gibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) +/proc/hgibs(atom/location, var/list/viruses, var/datum/dna/MobDNA) new /obj/effect/gibspawner/human(get_turf(location),viruses,MobDNA) /proc/xgibs(atom/location, var/list/viruses) @@ -65,6 +66,14 @@ del(src) /obj/effect/gibspawner + generic + gibtypes = list(/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/core) + gibamounts = list(2,2,1) + + New() + gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list()) + ..() + human gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up,/obj/effect/decal/cleanable/blood/gibs/down,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs,/obj/effect/decal/cleanable/blood/gibs/body,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood/gibs/core) gibamounts = list(1,1,1,1,1,1,1) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index baf82a53d4c..627ece087e3 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -3195,47 +3195,6 @@ var/global/BSACooldown = 0 */ - -/obj/admins/proc/view_txt_log() - set category = "Admin" - set desc="Shows todays server log in new window" - set name="Show Server Log" - var/path = "data/logs/[time2text(world.realtime,"YYYY")]/[time2text(world.realtime,"MM")]-[time2text(world.realtime,"Month")]/[time2text(world.realtime,"DD")]-[time2text(world.realtime,"Day")].log" - var/output = {" -
-- [file2text(path)] -- - "} - usr << browse(output,"window=server_logfile") - onclose(usr,"server_logfile") - //feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return - -/obj/admins/proc/view_atk_log() - set category = "Admin" - set desc="Shows todays server attack log in new window" - set name="Show Server Attack Log" - var/path = "data/logs/[time2text(world.realtime,"YYYY")]/[time2text(world.realtime,"MM")]-[time2text(world.realtime,"Month")]/[time2text(world.realtime,"DD")]-[time2text(world.realtime,"Day")] Attack.log" - var/output = {" - -
- [file2text(path)] -- - "} - usr << browse(output,"window=server_logfile") - onclose(usr,"server_logfile") -// feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - return - /*/client/proc/unjobban_panel() set name = "Unjobban Panel" set category = "Admin" diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 17ea9b05167..afc8d7847ae 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -183,7 +183,8 @@ verbs += /obj/admins/proc/view_atk_log verbs += /obj/admins/proc/toggleaban //abandon mob verbs += /obj/admins/proc/show_traitor_panel - verbs += /client/proc/cmd_admin_remove_plasma + verbs += /client/proc/getserverlog //fetch an old serverlog to look at + //verbs += /client/proc/cmd_admin_remove_plasma --This proc is outdated, does not do anything verbs += /client/proc/admin_call_shuttle verbs += /client/proc/admin_cancel_shuttle verbs += /client/proc/cmd_admin_dress @@ -289,7 +290,7 @@ verbs += /client/proc/everyone_random verbs += /client/proc/only_one verbs += /client/proc/deadmin_self -// verbs += /client/proc/giveruntimelog //used by coders to retrieve runtime logs + verbs += /client/proc/giveruntimelog //used by coders to retrieve runtime logs verbs += /client/proc/cinematic //used by coders to retrieve runtime logs verbs += /client/proc/enable_debug_verbs verbs += /client/proc/kill_air @@ -419,9 +420,9 @@ verbs -= /client/proc/deadmin_self verbs -= /client/proc/jumptocoord verbs -= /client/proc/everyone_random -// verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs -// verbs -= /client/proc/getserverlog - verbs -= /client/proc/cinematic + verbs -= /client/proc/giveruntimelog //used by coders to retrieve runtime logs + verbs -= /client/proc/getserverlog + verbs -= /client/proc/cinematic //show a cinematic sequence verbs -= /client/proc/cmd_admin_change_custom_event verbs -= /client/proc/admin_invis verbs -= /client/proc/callprocgen @@ -433,7 +434,6 @@ verbs -= /client/proc/rnd_check_designs verbs -= /client/proc/make_tajaran verbs -= /client/proc/CarbonCopy - verbs -= /client/proc/getruntimelog //used by coders to retrieve runtime logs verbs -= /proc/possess verbs -= /proc/release //verbs -= /client/proc/give_spell --Merged with view variables diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 6fc867c966e..e999d8a614f 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -2,7 +2,6 @@ set category = "Special Verbs" set name = "Dsay" //Gave this shit a shorter name so you only have to time out "dsay" rather than "dead say" to use it --NeoFite set hidden = 1 - // All admins should be authenticated, but... what if? if(!src.holder) src << "Only administrators may use this command." return diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm new file mode 100644 index 00000000000..3c61b1c565e --- /dev/null +++ b/code/modules/admin/verbs/getlogs.dm @@ -0,0 +1,143 @@ +/* + HOW DO I LOG RUNTIMES? + Firstly, start dreamdeamon if it isn't already running. Then select "world>Log Session" (or press the F3 key) + navigate the popup window to the data/logs/runtime/ folder from where your tgstation .dmb is located. + (you may have to make this folder yourself) + + OPTIONAL: you can select the little checkbox down the bottom to make dreamdeamon save the log everytime you + start a world. Just remember to repeat these steps with a new name when you update to a new revision! + + Save it with the name of the revision your server uses (e.g. r3459.txt). + Game Masters will now be able to grant access any runtime logs you have archived this way! + This will allow us to gather information on bugs across multiple servers and make maintaining the TG + codebase for the entire /TG/station commuity a TONNE easier :3 Thanks for your help! +*/ + +#define FTPDELAY 600 //600 tick delay to discourage spam +/* + These procs have failsafes built in to prevent spamming of file requests. As such it can only be used once every + [FTPDELAY] ticks. This can be changed by modifying FTPDELAY's value above. + + PLEASE USE RESPONSIBLY, only download from the server if the log isn't already available elsewhere! + Bandwidth is expensive and lags are lame. Some log files canr each sizes of 4MB! +*/ + +//This proc allows Game Masters to grant a client access to the .getruntimelog verb +//Permissions expire at the end of each round. +//Runtimes can be used to meta or spot game-crashing exploits so it's advised to only grant coders that +//you trust access. Also, it may be wise to ensure that they are not going to play in the current round. +/client/proc/giveruntimelog() + set name = ".giveruntimelog" + set desc = "Give somebody access to any session logfiles saved to the /log/runtime/ folder." + set category = null + + if( !src.holder || holder.rank != "Game Master" ) + src << "Only Game Masters may use this command." + return + + var/list/clients = list() + for(var/client/C) + clients += C + + var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in clients + if( !target || !istype(target,/client) ) + src << "Error: giveruntimelog(): Client not found." + return + + target.verbs |= /client/proc/getruntimelog + target << "You have been granted access to runtime logs. Please use them responsibly or risk being banned." + return + +//This proc allows download of runtime logs saved within the data/logs/ folder by dreamdeamon. +//It works similarly to show-server-log. +/client/proc/getruntimelog() + set name = ".getruntimelog" + set desc = "Retrieve any session logfiles saved by dreamdeamon." + set category = null + + var/time_to_wait = fileaccess_timer - world.time + if(time_to_wait > 0) + src << "Error: getruntimelog(): spam prevention. Please wait [round(time_to_wait/10)] seconds." + return + fileaccess_timer = world.time + FTPDELAY + + var/path = "data/logs/runtime/" + + var/list/path_list = flist(path) + var/choice = input(src,"Choose a runtime-log to download:","Download",null) as null|anything in path_list + if(!choice) return + + path += "[choice]" + if(!fexists(path)) + src << "Error: getruntimelog(): Files not found/Invalid file([path])." + return + + message_admins("[src] accessed runtime log: [path]") + src << run( file(path) ) + return + +//This proc allows download of past server logs saved within the data/logs/ folder. +//It works similarly to show-server-log. +/client/proc/getserverlog() + set name = ".getserverlog" + set desc = "Like 'Show Server Log' but it fetches old logs if there are any." + set category = null + + var/time_to_wait = fileaccess_timer - world.time + if(time_to_wait > 0) + src << "Error: getserverlog(): spam prevention. Please wait [round(time_to_wait/10)] seconds." + return + fileaccess_timer = world.time + FTPDELAY + + var/path = "data/logs/" + for(var/i=0, i<4, i++) //only bother searching up to 4 sub-directories. If we don't find it by then: give up. + var/list/path_list = flist(path) + if(path_list.len) path_list -= "runtime/" + else break + + var/choice = input(src,"Choose a directory to access:","Download",null) as null|anything in path_list + if(!choice) return + + path += "[choice]" + + if( text2ascii(choice,length(choice)) != 47 ) //not a directory, finish up + if(!fexists(path)) + src << "Error: getserverlog(): File not found/Invalid file([path])." + return + src << run( file(path) ) + return + return + + +//Other log stuff put here for the sake of organisation + +//Shows today's server log +/obj/admins/proc/view_txt_log() + set category = "Admin" + set name = "Show Server Log" + set desc = "Shows today's server log." + + var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")].log" + if( fexists(path) ) + src << run( file(path) ) + else + src << "Error: view_txt_log(): File not found/Invalid path([path])." + return + feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return + +//Shows today's attack log +/obj/admins/proc/view_atk_log() + set category = "Admin" + set name = "Show Server Attack Log" + set desc = "Shows today's server attack log." + + var/path = "data/logs/[time2text(world.realtime,"YYYY/MM-Month/DD-Day")] Attack.log" + if( fexists(path) ) + src << run( file(path) ) + else + src << "Error: view_atk_log(): File not found/Invalid path([path])." + return + usr << run( file(path) ) + feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + return diff --git a/code/modules/admin/verbs/getruntimelog.dm b/code/modules/admin/verbs/getruntimelog.dm deleted file mode 100644 index 406b3d631ae..00000000000 --- a/code/modules/admin/verbs/getruntimelog.dm +++ /dev/null @@ -1,53 +0,0 @@ -/* - HOW DO I LOG RUNTIMES? - Firstly, start dreamdeamon if it isn't already running. Then select "world>Log Session" (or press the F3 key) - navigate the popup window to the log/runtime/ folder from where your tgstation .dmb is located. - - OPTIONAL: you can select the little checkbox down the bottom to make dreamdeamon save the log everytime you - start a world. Just remember to repeat these steps with a new name when you update to a new revision! - - Save it with the name of the revision your server uses (e.g. r3459.txt). - Coders with the Game Master rank will now be able to access any runtime logs you have archived this way! - This will allow us to gather information on bugs across multiple servers and make maintaining the TG - codebase for the entire /TG/station commuity a TONNE easier :3 Thanks for your help! -*/ -#define FTPDELAY 200 //20 second delay to prevent spam - -//This proc allows GameMasters to download txt files saved to the log/runtime/ folder on the server. -//In effect this means the server owner can log game sessions through DreamDeamon to that folder and -//Coders (with access) can download logs (old and current). -//To make life easier on everyone please name logfiles according to the revision number in use! - -//This proc has a failsafe built in to prevent spamming of ftp requests. As such it can only be used once every -//20 seconds. This can be changed by modifying FTPDELAY's value. - -//PLEASE USE RESPONSIBLY, only download from the server if the log isn't already available elsewhere! -//Bandwidth is expensive and lags are lame. Although txt files of a few kB shouldn't cause problems really ~Carn - -/client/proc/getruntimelog() - set name = "getruntimelog" - set desc = "Retrieve any session logfiles saved by dreamdeamon" - set category = "Debug" - set hidden = 1 - - if( !src.holder || holder.rank != "Game Master" ) - src << "Only Game Masters may use this command." - return - - var/time_to_wait = fileaccess_timer - world.time - if(time_to_wait > 0) - src << "Error: getruntimelog(): FTP-request spam prevention. Please wait [round(time_to_wait/10)] seconds." - return - fileaccess_timer = world.time + FTPDELAY - - var/list/list_of_runtimelogs = flist("log/runtime/") - var/choice = input(src,"Choose a runtime-log to download:","Download",null) in list_of_runtimelogs - - if(!choice || !fexists("log/runtime/[choice]")) - src << "Error: getruntimelog(): Files not found/Invalid file([choice])." - return - - src << ftp("log/runtime/[choice]") - - return - diff --git a/code/modules/mob/dead/death.dm b/code/modules/mob/dead/death.dm new file mode 100644 index 00000000000..48a04a834c7 --- /dev/null +++ b/code/modules/mob/dead/death.dm @@ -0,0 +1,5 @@ +/mob/dead/dust() //ghosts can't be vaporised. + return + +/mob/dead/gib() //ghosts can't be gibbed. + return diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm new file mode 100644 index 00000000000..3970dab6f09 --- /dev/null +++ b/code/modules/mob/death.dm @@ -0,0 +1,76 @@ +//This is the proc for gibbing a mob. Cannot gib ghosts. +//added different sort of gibs and animations. N +/mob/proc/gib() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + +// flick("gibbed-m", animation) + gibs(loc, viruses, dna) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + + +//This is the proc for turning a mob into ash. Mostly a copy of gib code (above). +//Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here. +//Dusting robots does not eject the MMI, so it's a bit more powerful than gib() /N +/mob/proc/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + +// flick("dust-m", animation) + new /obj/effect/decal/ash(loc) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + + +/mob/proc/death(gibbed) + timeofdeath = world.time + + var/cancel = 0 + for(var/mob/M in world) + if(M.client && (M.stat != DEAD)) + cancel = 1 + break + if(!cancel) + world << "Everyone is dead! Resetting in 30 seconds!" + + spawn(300) + for(var/mob/M in world) + if(M.client && (M.stat != DEAD)) + world << "Aborting world restart!" + return + + feedback_set_details("end_error","no live players") + + if(blackbox) + blackbox.save_all_data_to_sql() + + sleep(50) + + log_game("Rebooting because of no live players") + world.Reboot() + return + + return ..(gibbed) diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm new file mode 100644 index 00000000000..b8bdab646a9 --- /dev/null +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -0,0 +1,39 @@ +/mob/living/carbon/alien/gib() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("gibbed-a", animation) + xgibs(loc, viruses) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + +/mob/living/carbon/alien/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("dust-a", animation) + new /obj/effect/decal/remains/xeno(loc) + + spawn(15) + if(animation) del(animation) + if(src) del(src) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 6a9662adf24..c5245daa4f3 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -1,3 +1,44 @@ +/mob/living/carbon/human/gib() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("gibbed-h", animation) + hgibs(loc, viruses, dna) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + +/mob/living/carbon/human/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("dust-h", animation) + new /obj/effect/decal/remains/human(loc) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + + /mob/living/carbon/human/death(gibbed) if(halloss > 0 && (!gibbed)) //hallucination = 0 diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm index 7c836158453..63169dedad6 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/metroid/powers.dm @@ -110,7 +110,7 @@ src << "\red [pick("This subject is incompatable", \ "This subject does not have a life energy", "This subject is empty", \ "I am not satisified", "I can not feed from this subject", \ - "I do not feel nurished", "This subject is not food")]..." + "I do not feel nourished", "This subject is not food")]..." sleep(rand(15,45)) @@ -136,13 +136,7 @@ if(Victim && !rabid && !attacked) if(Victim.LAssailant && Victim.LAssailant != Victim) if(prob(50)) - var/Found = 0 - for(var/mob/F in Friends) - if(F == Victim.LAssailant) - Found = 1 - - if(!Found) - Friends += Victim.LAssailant + Friends |= Victim.LAssailant if(M.client && istype(src, /mob/living/carbon/human)) if(prob(85)) diff --git a/code/modules/mob/living/carbon/monkey/death.dm b/code/modules/mob/living/carbon/monkey/death.dm index a20b53d203c..a150d7c2bf5 100644 --- a/code/modules/mob/living/carbon/monkey/death.dm +++ b/code/modules/mob/living/carbon/monkey/death.dm @@ -1,5 +1,46 @@ +/mob/living/carbon/monkey/gib() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("gibbed-m", animation) + gibs(loc, viruses, dna) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + +/mob/living/carbon/monkey/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("dust-m", animation) + new /obj/effect/decal/ash(loc) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + + /mob/living/carbon/monkey/death(gibbed) - if(src.stat == 2) + if(src.stat == DEAD) return if (src.healths) diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm new file mode 100644 index 00000000000..1fafa8f8b7f --- /dev/null +++ b/code/modules/mob/living/silicon/death.dm @@ -0,0 +1,39 @@ +/mob/living/silicon/gib() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + +// flick("gibbed-r", animation) + robogibs(loc, viruses) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + +/mob/living/silicon/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + +// flick("dust-r", animation) + new /obj/effect/decal/remains/robot(loc) + + spawn(15) + if(animation) del(animation) + if(src) del(src) diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 9a677ac60ab..fefedcfe593 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -1,3 +1,45 @@ +/mob/living/silicon/robot/gib() + //robots don't die when gibbed. instead they drop their MMI'd brain + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("gibbed-r", animation) + robogibs(loc, viruses) + + spawn(15) + if(animation) del(animation) + if(src) del(src) + +/mob/living/silicon/robot/dust() + death(1) + var/atom/movable/overlay/animation = null + monkeyizing = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = src + + flick("dust-r", animation) + new /obj/effect/decal/remains/robot(loc) + if(mmi) del(mmi) //Delete the MMI first so that it won't go popping out. + + spawn(15) + if(animation) del(animation) + if(src) del(src) + + /mob/living/silicon/robot/death(gibbed) if (!gibbed) src.emote("deathgasp") diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index ca195daf554..63cb6cc6e68 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -103,38 +103,6 @@ /mob/proc/update_clothing() return -/mob/proc/death(gibbed) - timeofdeath = world.time - - var/cancel = 0 - for(var/mob/M in world) - if(M.client && (M.stat != DEAD)) - cancel = 1 - break - if(!cancel) - world << "Everyone is dead! Resetting in 30 seconds!" - - - - spawn(300) - for(var/mob/M in world) - if(M.client && (M.stat != DEAD)) - world << "Aborting world restart!" - return - - //feedback_set_details("end_error","no live players") - - if(blackbox) - blackbox.save_all_data_to_sql() - - sleep(50) - - log_game("Rebooting because of no live players") - world.Reboot() - return - - return ..(gibbed) - /mob/proc/restrained() if (handcuffed) return 1 @@ -841,106 +809,6 @@ for(var/mob/M in viewers()) M.see(message) -//This is the proc for gibbing a mob. Cannot gib ghosts. -//added different sort of gibs and animations. N -/mob/proc/gib() - - if (istype(src, /mob/dead/observer)) - gibs(loc, viruses) - return - if(!isrobot(src))//Cyborgs no-longer "die" when gibbed. - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'mob.dmi' - animation.master = src - if(ishuman(src)) - flick("gibbed-h", animation) - else if(ismonkey(src)) - flick("gibbed-m", animation) - else if(ismetroid(src)) - flick("gibbed-m", animation) - else if(iscrab(src)) - flick("gibbed-m", animation) - else if(iscorgi(src)) - flick("gibbed-m", animation) - else if(iscat(src)) - flick("gibbed-m", animation) //New-has monkey gib effect versus robogib - else if(isalien(src)) - flick("gibbed-a", animation) - else - flick("gibbed-r", animation) - - spawn() - if(key) - if(istype(src, /mob/living/silicon)) - robogibs(loc, viruses) - else if (istype(src, /mob/living/carbon/alien)) - xgibs(loc, viruses) - else - gibs(loc, viruses, dna) - -/* else if(key) - if(istype(src, /mob/living/simple_animals)) //Should gib all simple_animals like a monkey - gibs(loc, viruses) - else if (istype(src, /mob/living/simple_animals)) - gibs(loc, viruses) -Currently doesn't work, but should be useful later or at least as a template -*/ - - else - if(istype(src, /mob/living/silicon)) - robogibs(loc, viruses) - else if(istype(src, /mob/living/carbon/alien)) - xgibs(loc, viruses) - else - gibs(loc, viruses, dna) - sleep(15) - del(src) - -/* -This is the proc for turning a mob into ash. Mostly a copy of gib code (above). -Originally created for wizard disintegrate. I've removed the virus code since it's irrelevant here. -Dusting robots does not eject the MMI, so it's a bit more powerful than gib() /N -*/ -/mob/proc/dust() - death(1) - var/atom/movable/overlay/animation = null - monkeyizing = 1 - canmove = 0 - icon = null - invisibility = 101 - - animation = new(loc) - animation.icon_state = "blank" - animation.icon = 'mob.dmi' - animation.master = src - if(ishuman(src)) - flick("dust-h", animation) - new /obj/effect/decal/remains/human(loc) - else if(ismonkey(src)) - flick("dust-m", animation) - new /obj/effect/decal/remains/human(loc) - else if(isalien(src)) - flick("dust-a", animation) - new /obj/effect/decal/remains/xeno(loc) - else - flick("dust-r", animation) - new /obj/effect/decal/remains/robot(loc) - - sleep(15) - if(isrobot(src)&&src:mmi)//Is a robot and it has an mmi. - del(src:mmi)//Delete the MMI first so that it won't go popping out. - for(var/obj/item/I in contents) - I.loc = get_turf(src) - del(src) - /* adds a dizziness amount to a mob use this rather than directly changing var/dizziness