Merge branch 'incremental_tg' r5067 into bs12_with_tgport

removed extraneous admin attack messages, temporarily disabled much moderator stuff (will be re-enabled in future updates)

Conflicts:
	baystation12.dme
	code/__HELPERS/type2type.dm
	code/controllers/configuration.dm
	code/datums/datumvars.dm
	code/datums/helper_datums/getrev.dm
	code/defines/obj.dm
	code/game/gamemodes/events/black_hole.dm
	code/game/gamemodes/events/space_ninja.dm
	code/game/gamemodes/wizard/rightandwrong.dm
	code/game/jobs/job/captain.dm
	code/game/jobs/job/job.dm
	code/game/jobs/job_controller.dm
	code/game/machinery/bots/medbot.dm
	code/game/machinery/computer/card.dm
	code/game/machinery/telecomms/traffic_control.dm
	code/game/machinery/turrets.dm
	code/game/machinery/wishgranter.dm
	code/game/objects/items/blueprints.dm
	code/game/objects/items/devices/uplinks.dm
	code/game/objects/items/stacks/stack.dm
	code/game/objects/items/weapons/surgery_tools.dm
	code/game/turfs/turf.dm
	code/game/verbs/ooc.dm
	code/global.dm
	code/modules/admin/IsBanned.dm
	code/modules/admin/admin.dm
	code/modules/admin/admin_memo.dm
	code/modules/admin/admin_verbs.dm
	code/modules/admin/holder2.dm
	code/modules/admin/player_panel.dm
	code/modules/admin/verbs/adminpm.dm
	code/modules/admin/verbs/diagnostics.dm
	code/modules/assembly/igniter.dm
	code/modules/client/client defines.dm
	code/modules/client/client procs.dm
	code/modules/clothing/spacesuits/miscellaneous.dm
	code/modules/clothing/suits/armor.dm
	code/modules/clothing/suits/jobs.dm
	code/modules/mining/mine_turfs.dm
	code/modules/mob/living/carbon/human/say.dm
	code/modules/mob/living/carbon/human/update_icons.dm
	code/modules/mob/living/living.dm
	code/modules/mob/living/living_defense.dm
	code/modules/mob/living/silicon/robot/emote.dm
	code/modules/mob/living/silicon/robot/life.dm
	code/modules/mob/mob_cleanup.dm
	code/modules/mob/new_player/new_player.dm
	code/modules/mob/new_player/preferences.dm
	code/modules/paperwork/paper.dm
	code/modules/paperwork/photocopier.dm
	code/modules/projectiles/guns/projectile/automatic.dm
	code/modules/reagents/Chemistry-Machinery.dm
	code/setup.dm
	code/stylesheet.dm
	code/world.dm
	config/admins.txt
	config/config.txt
	html/changelog.html
	icons/mob/items_lefthand.dmi
	icons/mob/items_righthand.dmi
	icons/mob/suit.dmi
	icons/obj/clothing/suits.dmi
	icons/turf/areas.dmi

Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
Cael_Aislinn
2012-12-28 14:13:11 +10:00
341 changed files with 17940 additions and 16947 deletions
+288 -345
View File
@@ -180,12 +180,12 @@ client
body += "<br><font size='1'><a href='byond://?src=\ref[src];datumedit=\ref[D];varnameedit=ckey'>[M.ckey ? M.ckey : "No ckey"]</a> / <a href='byond://?src=\ref[src];datumedit=\ref[D];varnameedit=real_name'>[M.real_name ? M.real_name : "No real name"]</a></font>"
body += {"
<br><font size='1'>
BRUTE:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=\ref["brute"]'>[M.getBruteLoss()]</a>
FIRE:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=\ref["fire"]'>[M.getFireLoss()]</a>
TOXIN:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=\ref["toxin"]'>[M.getToxLoss()]</a>
OXY:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=\ref["oxygen"]'>[M.getOxyLoss()]</a>
CLONE:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=\ref["clone"]'>[M.getCloneLoss()]</a>
BRAIN:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=\ref["brain"]'>[M.getBrainLoss()]</a>
BRUTE:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=brute'>[M.getBruteLoss()]</a>
FIRE:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=fire'>[M.getFireLoss()]</a>
TOXIN:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=toxin'>[M.getToxLoss()]</a>
OXY:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=oxygen'>[M.getOxyLoss()]</a>
CLONE:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=clone'>[M.getCloneLoss()]</a>
BRAIN:<font size='1'><a href='byond://?src=\ref[src];mobToDamage=\ref[D];adjustDamage=brain'>[M.getBrainLoss()]</a>
</font>
@@ -402,14 +402,18 @@ client
//This should all be moved over to datum/admins/Topic() or something ~Carn
if( (usr.client == src) && src.holder )
. = 1 //default return
if (href_list["Vars"])
if(href_list["Vars"])
debug_variables(locate(href_list["Vars"]))
//~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
else if (href_list["rename"])
else if(href_list["rename"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["rename"])
if(!istype(M)) return
if(!admin_rank_check(src.holder.level, 3)) return
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
if( !new_name || !M ) return
@@ -417,431 +421,370 @@ client
M.fully_replace_character_name(M.real_name,new_name)
href_list["datumrefresh"] = href_list["rename"]
else if (href_list["varnameedit"])
if(!href_list["datumedit"] || !href_list["varnameedit"])
usr << "Varedit error: Not all information has been sent. Contact a coder."
return
var/DAT = locate(href_list["datumedit"])
if(!DAT)
usr << "Item not found"
return
if(!istype(DAT,/datum) && !istype(DAT,/client))
usr << "Can't edit an item of this type. Type must be /datum or /client, so anything except simple variables."
return
modify_variables(DAT, href_list["varnameedit"], 1)
else if (href_list["varnamechange"])
if(!href_list["datumchange"] || !href_list["varnamechange"])
usr << "Varedit error: Not all information has been sent. Contact a coder."
return
var/DAT = locate(href_list["datumchange"])
if(!DAT)
usr << "Item not found"
return
if(!istype(DAT,/datum) && !istype(DAT,/client))
usr << "Can't edit an item of this type. Type must be /datum or /client, so anything except simple variables."
return
modify_variables(DAT, href_list["varnamechange"], 0)
else if (href_list["varnamemass"])
if(!href_list["datummass"] || !href_list["varnamemass"])
usr << "Varedit error: Not all information has been sent. Contact a coder."
return
var/atom/A = locate(href_list["datummass"])
if(!A)
usr << "Item not found"
return
if(!istype(A,/atom))
usr << "Can't mass edit an item of this type. Type must be /atom, so an object, turf, mob or area. You cannot mass edit clients!"
return
cmd_mass_modify_object_variables(A, href_list["varnamemass"])
else if (href_list["mob_player_panel"])
if(!href_list["mob_player_panel"])
return
var/mob/MOB = locate(href_list["mob_player_panel"])
if(!MOB)
return
if(!ismob(MOB))
return
if(!src.holder)
return
src.holder.show_player_panel(MOB)
href_list["datumrefresh"] = href_list["mob_player_panel"]
else if (href_list["give_spell"])
if(!href_list["give_spell"])
return
var/mob/MOB = locate(href_list["give_spell"])
if(!MOB)
return
if(!ismob(MOB))
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.give_spell(MOB)
href_list["datumrefresh"] = href_list["give_spell"]
else if (href_list["give_disease"])
if(!href_list["give_disease"])
return
var/mob/MOB = locate(href_list["give_disease"])
if(!MOB)
return
if(!ismob(MOB))
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.give_disease(MOB)
href_list["datumrefresh"] = href_list["give_spell"]
else if (href_list["ninja"])
if(!href_list["ninja"])
return
var/mob/MOB = locate(href_list["ninja"])
if(!MOB)
return
if(!ismob(MOB))
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_ninjafy(MOB)
href_list["datumrefresh"] = href_list["ninja"]
else if (href_list["godmode"])
if(!href_list["godmode"])
return
var/mob/MOB = locate(href_list["godmode"])
if(!MOB)
return
if(!ismob(MOB))
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_godmode(MOB)
href_list["datumrefresh"] = href_list["godmode"]
else if (href_list["gib"])
if(!href_list["gib"])
return
var/mob/MOB = locate(href_list["gib"])
if(!MOB)
return
if(!ismob(MOB))
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_gib(MOB)
else if(href_list["varnameedit"] && href_list["datumedit"])
if(!check_rights(0)) return
else if (href_list["build_mode"])
if(!href_list["build_mode"])
var/D = locate(href_list["datumedit"])
if(!istype(D,/datum) && !istype(D,/client))
usr << "This can only be used on instances of types /client or /datum"
return
var/mob/MOB = locate(href_list["build_mode"])
if(!MOB)
modify_variables(D, href_list["varnameedit"], 1)
else if(href_list["varnamechange"] && href_list["datumchange"])
if(!check_rights(0)) return
var/D = locate(href_list["datumchange"])
if(!istype(D,/datum) && !istype(D,/client))
usr << "This can only be used on instances of types /client or /datum"
return
if(!ismob(MOB))
modify_variables(D, href_list["varnamechange"], 0)
else if(href_list["varnamemass"] && href_list["datummass"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["datummass"])
if(!istype(A))
usr << "This can only be used on instances of type /atom"
return
if(!src.holder)
cmd_mass_modify_object_variables(A, href_list["varnamemass"])
else if(href_list["mob_player_panel"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["mob_player_panel"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
if(!admin_rank_check(src.holder.level, 3)) return
togglebuildmode(MOB)
src.holder.show_player_panel(M)
href_list["datumrefresh"] = href_list["mob_player_panel"]
else if(href_list["give_spell"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["give_spell"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.give_spell(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["give_disease"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["give_disease"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.give_disease(M)
href_list["datumrefresh"] = href_list["give_spell"]
else if(href_list["ninja"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["ninja"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.cmd_admin_ninjafy(M)
href_list["datumrefresh"] = href_list["ninja"]
else if(href_list["godmode"])
if(!check_rights(R_REJUVINATE)) return
var/mob/M = locate(href_list["godmode"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.cmd_admin_godmode(M)
href_list["datumrefresh"] = href_list["godmode"]
else if(href_list["gib"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["gib"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
src.cmd_admin_gib(M)
else if(href_list["build_mode"])
if(!check_rights(R_BUILDMODE)) return
var/mob/M = locate(href_list["build_mode"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
togglebuildmode(M)
href_list["datumrefresh"] = href_list["build_mode"]
else if (href_list["drop_everything"])
if(!href_list["drop_everything"])
return
var/mob/MOB = locate(href_list["drop_everything"])
if(!MOB)
return
if(!ismob(MOB))
return
if(!src.holder)
else if(href_list["drop_everything"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["drop_everything"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
if(usr.client)
if(!admin_rank_check(src.holder.level, 3)) return
usr.client.cmd_admin_drop_everything(MOB)
usr.client.cmd_admin_drop_everything(M)
else if (href_list["direct_control"])
if(!href_list["direct_control"])
return
var/mob/MOB = locate(href_list["direct_control"])
if(!MOB)
return
if(!ismob(MOB))
return
if(!src.holder)
else if(href_list["direct_control"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["direct_control"])
if(!istype(M))
usr << "This can only be used on instances of type /mob"
return
if(usr.client)
if(!admin_rank_check(src.holder.level, 3)) return
usr.client.cmd_assume_direct_control(MOB)
usr.client.cmd_assume_direct_control(M)
else if (href_list["make_skeleton"])
if(!href_list["make_skeleton"])
return
var/mob/MOB = locate(href_list["make_skeleton"])
if(!MOB)
return
if(!ismob(MOB))
return
if(!src.holder)
else if(href_list["make_skeleton"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["make_skeleton"])
if(!istype(H))
usr << "This can only be used on instances of type /mob/living/carbon/human"
return
if(ishuman(MOB))
if(!admin_rank_check(src.holder.level, 3)) return
var/mob/living/carbon/human/HUMANMOB = MOB
HUMANMOB.makeSkeleton()
H.makeSkeleton()
href_list["datumrefresh"] = href_list["make_skeleton"]
else if (href_list["delall"])
if(!href_list["delall"])
else if(href_list["delall"])
if(!check_rights(R_DEBUG|R_SERVER)) return
var/obj/O = locate(href_list["delall"])
if(!isobj(O))
usr << "This can only be used on instances of type /obj"
return
var/atom/A = locate(href_list["delall"])
if(!admin_rank_check(src.holder.level, 3)) return
if(!A)
var/action_type = alert("Strict type ([O.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
if(action_type == "Cancel" || !action_type)
return
if(!isobj(A))
usr << "This can only be used on objects (of type /obj)"
return
if(!A.type)
return
var/action_type = alert("Strict type ([A.type]) or type and all subtypes?",,"Strict type","Type and subtypes","Cancel")
if(!action_type || action_type == "Cancel")
return
if(alert("Are you really sure you want to delete all objects of type [A.type]?",,"Yes","No") != "Yes")
if(alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No") != "Yes")
return
if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes")
return
var/a_type = A.type
if(action_type == "Strict type")
var/i = 0
for(var/obj/O in world)
if(O.type == a_type)
i++
del(O)
if(!i)
usr << "No objects of this type exist"
return
log_admin("[key_name(usr)] deleted all objects of scrict type [a_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of scrict type [a_type] ([i] objects deleted) ", 1)
else if(action_type == "Type and subtypes")
var/i = 0
for(var/obj/O in world)
if(istype(O,a_type))
i++
del(O)
if(!i)
usr << "No objects of this type exist"
return
log_admin("[key_name(usr)] deleted all objects of scrict type with subtypes [a_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type with subtypes [a_type] ([i] objects deleted) ", 1)
else if (href_list["explode"])
if(!href_list["explode"])
return
var/O_type = O.type
switch(action_type)
if("Strict type")
var/i = 0
for(var/obj/Obj in world)
if(Obj.type == O_type)
i++
del(Obj)
if(!i)
usr << "No objects of this type exist"
return
log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ", 1)
if("Type and subtypes")
var/i = 0
for(var/obj/Obj in world)
if(istype(Obj,O_type))
i++
del(Obj)
if(!i)
usr << "No objects of this type exist"
return
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ", 1)
else if(href_list["explode"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["explode"])
if(!A)
return
if(!isobj(A) && !ismob(A) && !isturf(A))
usr << "This can only be done to instances of type /obj, /mob and /turf"
return
if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_explosion(A)
href_list["datumrefresh"] = href_list["explode"]
else if (href_list["emp"])
if(!href_list["emp"])
return
else if(href_list["emp"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["emp"])
if(!A)
return
if(!isobj(A) && !ismob(A) && !isturf(A))
usr << "This can only be done to instances of type /obj, /mob and /turf"
return
if(!admin_rank_check(src.holder.level, 3)) return
src.cmd_admin_emp(A)
href_list["datumrefresh"] = href_list["emp"]
else if (href_list["mark_object"])
if(!href_list["mark_object"])
return
else if(href_list["mark_object"])
if(!check_rights(0)) return
var/datum/D = locate(href_list["mark_object"])
if(!D)
if(!istype(D))
usr << "This can only be done to instances of type /datum"
return
if(!src.holder)
return
if(!admin_rank_check(src.holder.level, 3)) return
src.holder.marked_datum = D
href_list["datumrefresh"] = href_list["mark_object"]
else if (href_list["rotatedatum"])
if(!admin_rank_check(src.holder.level, 3)) return
if(!href_list["rotatedir"])
return
else if(href_list["rotatedatum"])
if(!check_rights(0)) return
var/atom/A = locate(href_list["rotatedatum"])
if(!A)
return
if(!istype(A,/atom))
usr << "This can only be done to objects of type /atom"
return
if(!src.holder)
if(!istype(A))
usr << "This can only be done to instances of type /atom"
return
switch(href_list["rotatedir"])
if("right")
A.dir = turn(A.dir, -45)
if("left")
A.dir = turn(A.dir, 45)
if("right") A.dir = turn(A.dir, -45)
if("left") A.dir = turn(A.dir, 45)
href_list["datumrefresh"] = href_list["rotatedatum"]
else if (href_list["makemonkey"])
var/mob/M = locate(href_list["makemonkey"])
if(!M)
else if(href_list["makemonkey"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["makemonkey"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
if(!src.holder)
usr << "You are not an administrator."
return
var/action_type = alert("Confirm mob type change?",,"Transform","Cancel")
if(!action_type || action_type == "Cancel")
return
if(!M)
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("monkeyone"=href_list["makemonkey"]))
else if (href_list["makerobot"])
var/mob/M = locate(href_list["makerobot"])
if(!M)
else if(href_list["makerobot"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["makerobot"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
if(!src.holder)
usr << "You are not an administrator."
return
var/action_type = alert("Confirm mob type change?",,"Transform","Cancel")
if(!action_type || action_type == "Cancel")
return
if(!M)
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makerobot"=href_list["makerobot"]))
else if (href_list["makealien"])
var/mob/M = locate(href_list["makealien"])
if(!M)
else if(href_list["makealien"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["makealien"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
if(!src.holder)
usr << "You are not an administrator."
return
var/action_type = alert("Confirm mob type change?",,"Transform","Cancel")
if(!action_type || action_type == "Cancel")
return
if(!M)
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makealien"=href_list["makealien"]))
else if (href_list["makemetroid"])
var/mob/M = locate(href_list["makemetroid"])
if(!M)
else if(href_list["makemetroid"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["makemetroid"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
if(!src.holder)
usr << "You are not an administrator."
return
var/action_type = alert("Confirm mob type change?",,"Transform","Cancel")
if(!action_type || action_type == "Cancel")
return
if(!M)
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makemetroid"=href_list["makemetroid"]))
else if (href_list["makeai"])
var/mob/M = locate(href_list["makeai"])
if(!M)
else if(href_list["makeai"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["makeai"])
if(!istype(H))
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
if(!admin_rank_check(src.holder.level, 3)) return
if(!ishuman(M))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
if(!src.holder)
usr << "You are not an administrator."
return
var/action_type = alert("Confirm mob type change?",,"Transform","Cancel")
if(!action_type || action_type == "Cancel")
return
if(!M)
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform") return
if(!H)
usr << "Mob doesn't exist anymore"
return
holder.Topic(href, list("makeai"=href_list["makeai"]))
else if (href_list["setmutantrace"])
else if(href_list["setmutantrace"])
if(!check_rights(0)) return
var/mob/living/carbon/human/H = locate(href_list["setmutantrace"])
if(!admin_rank_check(src.holder.level, 3)) return
if(!istype(H))
usr << "This can only be done to objects of type /mob/living/carbon/human"
return
if(!src.holder)
usr << "You are not an administrator."
usr << "This can only be done to instances of type /mob/living/carbon/human"
return
var/new_mutantrace = input("Please choose a new mutantrace","Mutantrace",null) as null|anything in list("NONE","golem","lizard","metroid","plant","tajaran","skrell") //BS12 EDIT TAJ EDIT SKR
switch(new_mutantrace)
if(null) return
if("NONE") new_mutantrace = ""
if(!H || !istype(H))
if(!H)
usr << "Mob doesn't exist anymore"
return
if(H.dna)
H.dna.mutantrace = new_mutantrace
H.update_mutantrace()
else if (href_list["regenerateicons"])
else if(href_list["regenerateicons"])
if(!check_rights(0)) return
var/mob/M = locate(href_list["regenerateicons"])
if(!admin_rank_check(src.holder.level, 3)) return
if(!istype(M))
usr << "This can only be done to objects of type /mob"
return
if(!src.holder)
usr << "You are not an administrator."
if(!ismob(M))
usr << "This can only be done to instances of type /mob"
return
M.regenerate_icons()
else if (href_list["adjustDamage"] && href_list["mobToDamage"])
var/mob/M = locate(href_list["mobToDamage"])
var/Text = locate(href_list["adjustDamage"])
if(!isliving(M)) return
var/mob/living/L = M
else if(href_list["adjustDamage"] && href_list["mobToDamage"])
if(!check_rights(0)) return
if(!admin_rank_check(src.holder.level, 3)) return
var/mob/living/L = locate(href_list["mobToDamage"])
if(!istype(L)) return
var/Text = href_list["adjustDamage"]
var/amount = input("Deal how much damage to mob? (Negative values here heal)","Adjust [Text]loss",0) as num
if(Text == "brute")
L.adjustBruteLoss(amount)
else if(Text == "fire")
L.adjustFireLoss(amount)
else if(Text == "toxin")
L.adjustToxLoss(amount)
else if(Text == "oxygen")
L.adjustOxyLoss(amount)
else if(Text == "brain")
L.adjustBrainLoss(amount)
else if(Text == "clone")
L.adjustCloneLoss(amount)
else
usr << "You caused an error. DEBUG: Text:[Text] Mob:[M]"
if(!L)
usr << "Mob doesn't exist anymore"
return
switch(Text)
if("brute") L.adjustBruteLoss(amount)
if("fire") L.adjustFireLoss(amount)
if("toxin") L.adjustToxLoss(amount)
if("oxygen")L.adjustOxyLoss(amount)
if("brain") L.adjustBrainLoss(amount)
if("clone") L.adjustCloneLoss(amount)
else
usr << "You caused an error. DEBUG: Text:[Text] Mob:[L]"
return
if(amount != 0)
log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [M] ")
message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [M] ", 1)
log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ", 1)
href_list["datumrefresh"] = href_list["mobToDamage"]
else
. = 0
if (href_list["datumrefresh"])
if(href_list["datumrefresh"])
var/datum/DAT = locate(href_list["datumrefresh"])
if(!DAT)
return
if(!istype(DAT,/datum))
if(!istype(DAT, /datum))
return
src.debug_variables(DAT)
. = 1
return
+39 -18
View File
@@ -1,10 +1,10 @@
#define NON_CONTAGIOUS -1
#define SPECIAL 0
#define CONTACT_GENERAL 1
#define CONTACT_HANDS 2
#define CONTACT_FEET 3
#define AIRBORNE 4
#define BLOOD 5
#define SPECIAL -1
#define NON_CONTAGIOUS 0
#define BLOOD 1
#define CONTACT_FEET 2
#define CONTACT_HANDS 3
#define CONTACT_GENERAL 4
#define AIRBORNE 5
#define SCANNER 1
#define PANDEMIC 2
@@ -30,6 +30,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
var/cure_list = null // allows for multiple possible cure combinations
var/cure_chance = 8//chance for the cure to do its job
var/spread = null //spread type description
var/initial_spread = null
var/spread_type = AIRBORNE
var/contagious_period = 0//the disease stage when it can be spread
var/list/affected_species = list()
@@ -60,7 +61,7 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
//world << "[affected_mob] is carrier"
return
spread = (cure_present?"Remissive":initial(spread))
spread = (cure_present?"Remissive":initial_spread)
if(stage > max_stages)
stage = max_stages
@@ -96,10 +97,15 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
return result
/datum/disease/proc/spread(var/atom/source=null)
/datum/disease/proc/spread(var/atom/source=null, var/airborne_range = 2, var/force_spread)
//world << "Disease [src] proc spread was called from holder [source]"
if(spread_type == SPECIAL || spread_type == NON_CONTAGIOUS)//does not spread
// If we're overriding how we spread, say so here
var/how_spread = spread_type
if(force_spread)
how_spread = force_spread
if(how_spread == SPECIAL || how_spread == NON_CONTAGIOUS)//does not spread
return
if(stage < contagious_period) //the disease is not contagious at this stage
@@ -112,26 +118,32 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
return
var/check_range = AIRBORNE//defaults to airborne - range 4
var/check_range = airborne_range//defaults to airborne - range 2
if(spread_type != AIRBORNE && spread_type != SPECIAL)
check_range = 0 // everything else, like infect-on-contact things, only infect things on top of it
if(how_spread != AIRBORNE && how_spread != SPECIAL)
check_range = 1 // everything else, like infect-on-contact things, only infect things on top of it
for(var/mob/living/carbon/M in oview(check_range, source)) //I have no idea why oview works when oviewers doesn't. -Pete
M.contract_disease(src)
if(isturf(source.loc))
for(var/mob/living/carbon/M in oview(check_range, source))
if(isturf(M.loc))
if(AStar(source.loc, M.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, check_range))
M.contract_disease(src, 0, 1, force_spread)
return
/datum/disease/proc/process()
if(!holder) return
if(!holder)
active_diseases -= src
return
if(prob(65))
spread(holder)
if(affected_mob)
for(var/datum/disease/D in affected_mob.viruses)
if(D != src)
if(istype(src, D.type))
if(IsSame(D))
//error("Deleting [D.name] because it's the same as [src.name].")
del(D) // if there are somehow two viruses of the same kind in the system, delete the other one
if(holder == affected_mob)
@@ -161,10 +173,19 @@ var/list/diseases = typesof(/datum/disease) - /datum/disease
return
/datum/disease/New(var/process=1)//process = 1 - adding the object to global list. List is processed by master controller.
/datum/disease/New(var/process=1, var/datum/disease/D)//process = 1 - adding the object to global list. List is processed by master controller.
cure_list = list(cure_id) // to add more cures, add more vars to this list in the actual disease's New()
if(process) // Viruses in list are considered active.
active_diseases += src
initial_spread = spread
/datum/disease/proc/IsSame(var/datum/disease/D)
if(istype(src, D.type))
return 1
return 0
/datum/disease/proc/Copy()
return new type(0, src)
/*
/datum/disease/Del()
+379
View File
@@ -0,0 +1,379 @@
/*
Advance Disease is a system for Virologist to Engineer their own disease with symptoms that have effects and properties
which add onto the overall disease.
If you need help with creating new symptoms or expanding the advance disease, ask for Giacom on #coderbus.
*/
#define RANDOM_STARTING_LEVEL 2
var/list/archive_diseases = list()
/*
PROPERTIES
*/
/datum/disease/advance
name = "Unknown" // We will always let our Virologist name our disease.
desc = "An engineered disease which can contain a multitude of symptoms."
form = "Advance Disease" // Will let med-scanners know that this disease was engineered.
agent = "advance microbes"
max_stages = 5
spread = "Unknown"
affected_species = list("Human","Monkey")
// NEW VARS
var/list/symptoms = list() // The symptoms of the disease.
/*
OLD PROCS
*/
/datum/disease/advance/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
// Setup our dictionary if it hasn't already.
if(!dictionary_symptoms.len)
for(var/symp in list_symptoms)
var/datum/symptom/S = new symp
dictionary_symptoms[S.id] = symp
if(!istype(D))
D = null
// Generate symptoms if we weren't given any.
if(!symptoms || !symptoms.len)
if(!D || !D.symptoms || !D.symptoms.len)
symptoms = GenerateSymptoms()
else
for(var/datum/symptom/S in D.symptoms)
symptoms += new S.type
name = D.name
Refresh(!copy)
..(process, D)
return
// Randomly pick a symptom to activate.
/datum/disease/advance/stage_act()
..()
if(symptoms && symptoms.len)
for(var/datum/symptom/S in symptoms)
S.Activate(src)
else
CRASH("We do not have any symptoms during stage_act()!")
// Compares type then ID.
/datum/disease/advance/IsSame(var/datum/disease/advance/D)
if(!(istype(D, /datum/disease/advance)))
//error("Returning 0 because not same type.")
return 0
//error("Comparing [src.GetDiseaseID()] [D.GetDiseaseID()]")
if(src.GetDiseaseID() != D.GetDiseaseID())
//error("Returing 0")
return 0
//error("Returning 1")
return 1
// To add special resistances.
/datum/disease/advance/cure(var/resistance=1)
if(affected_mob)
var/id = "[GetDiseaseID()]"
if(resistance && !(id in affected_mob.resistances))
affected_mob.resistances[id] = id
affected_mob.viruses -= src //remove the datum from the list
del(src) //delete the datum to stop it processing
return
// Returns the advance disease with a different reference memory.
/datum/disease/advance/Copy()
return new /datum/disease/advance(0, src, 1)
/*
NEW PROCS
*/
// Mix the symptoms of two diseases (the src and the argument)
/datum/disease/advance/proc/Mix(var/datum/disease/advance/D)
if(!(src.IsSame(D)))
var/list/possible_symptoms = shuffle(D.symptoms)
for(var/datum/symptom/S in possible_symptoms)
AddSymptom(new S.type)
/datum/disease/advance/proc/HasSymptom(var/datum/symptom/S)
for(var/datum/symptom/symp in symptoms)
if(symp.id == S.id)
return 1
return 0
// Will generate new unique symptoms, use this if there are none. Returns a list of symptoms that were generated.
/datum/disease/advance/proc/GenerateSymptoms(var/type_level_limit = RANDOM_STARTING_LEVEL, var/amount_get = 0)
var/list/generated = list() // Symptoms we generated.
// Generate symptoms. By default, we only choose non-deadly symptoms.
var/list/possible_symptoms = list()
for(var/symp in list_symptoms)
var/datum/symptom/S = new symp
if(S.level <= type_level_limit)
if(!HasSymptom(S))
possible_symptoms += S
if(!possible_symptoms.len)
return
//error("Advance Disease - We weren't able to get any possible symptoms in GenerateSymptoms([type_level_limit], [amount_get])")
// Random chance to get more than one symptom
var/number_of = amount_get
if(!amount_get)
number_of = 1
while(prob(20))
number_of += 1
for(var/i = 1; number_of >= i; i++)
var/datum/symptom/S = pick(possible_symptoms)
generated += S
possible_symptoms -= S
return generated
/datum/disease/advance/proc/Refresh(var/save = 1)
//world << "[src.name] \ref[src] - REFRESH!"
var/list/properties = GenerateProperties()
AssignProperties(properties)
if(save)
archive_diseases[GetDiseaseID()] = new /datum/disease/advance(0, src, 1)
//Generate disease properties based on the effects. Returns an associated list.
/datum/disease/advance/proc/GenerateProperties()
if(!symptoms || !symptoms.len)
CRASH("We did not have any symptoms before generating properties.")
return
var/list/properties = list("resistance" = 1, "stealth" = 1, "stage_rate" = 1, "transmittable" = 1, "severity" = 1)
for(var/datum/symptom/S in symptoms)
properties["resistance"] += S.resistance
properties["stealth"] += S.stealth
properties["stage_rate"] += S.stage_speed
properties["transmittable"] += S.transmittable
properties["severity"] = max(properties["severity"], S.level) // severity is based on the highest level symptom
return properties
// Assign the properties that are in the list.
/datum/disease/advance/proc/AssignProperties(var/list/properties = list())
if(properties && properties.len)
hidden = list( (properties["stealth"] > 2), (properties["stealth"] > 3) )
// The more symptoms we have, the less transmittable it is but some symptoms can make up for it.
SetSpread(max(BLOOD, min(properties["transmittable"] - symptoms.len, AIRBORNE)))
permeability_mod = max(round(0.5 * properties["transmittable"]), 1)
stage_prob = max(properties["stage_rate"], 1)
SetSeverity(properties["severity"])
GenerateCure(properties)
else
CRASH("Our properties were empty or null!")
// Assign the spread type and give it the correct description.
/datum/disease/advance/proc/SetSpread(var/spread_id)
switch(spread_id)
if(NON_CONTAGIOUS)
spread = "None"
if(SPECIAL)
spread = "None"
if(CONTACT_GENERAL, CONTACT_HANDS, CONTACT_FEET)
spread = "On contact"
if(AIRBORNE)
spread = "Airborne"
if(BLOOD)
spread = "Blood"
spread_type = spread_id
//world << "Setting spread type to [spread_id]/[spread]"
/datum/disease/advance/proc/SetSeverity(var/level_sev)
switch(level_sev)
if(0)
severity = "Non-Threat"
if(1)
severity = "Minor"
if(2)
severity = "Medium"
if(3)
severity = "Harmful"
if(4)
severity = "Dangerous!"
if(5)
severity = "BIOHAZARD THREAT!"
else
severity = "Unknown"
// Will generate a random cure, the less resistance the symptoms have, the harder the cure.
/datum/disease/advance/proc/GenerateCure(var/list/properties = list())
if(properties && properties.len)
var/res = max(properties["resistance"] - (symptoms.len / 2), 0)
//world << "Res = [res]"
switch(round(res))
// Due to complications, I cannot randomly generate cures or randomly give cures.
if(0)
cure_id = "nutriment"
if(1)
cure_id = "sodiumchloride"
if(2)
cure_id = "orangejuice"
if(3)
cure_id = "spaceacillin"
if(4)
cure_id = "ethanol"
if(5)
cure_id = "ethylredoxrazine"
if(6)
cure_id = "synaptizine"
if(7)
cure_id = "silver"
if(8)
cure_id = "gold"
if(9)
cure_id = "mindbreaker"
else
cure_id = "plasma"
// Get the cure name from the cure_id
var/datum/reagent/D = chemical_reagents_list[cure_id]
cure = D.name
return
// Randomly generate a symptom, has a chance to lose or gain a symptom.
/datum/disease/advance/proc/Evolve(var/level = 2)
var/s = safepick(GenerateSymptoms(level, 1))
if(s)
AddSymptom(s)
Refresh()
return
// Randomly remove a symptom.
/datum/disease/advance/proc/Devolve()
if(symptoms.len > 1)
var/s = safepick(symptoms)
if(s)
RemoveSymptom(s)
Refresh()
return
// Name the disease.
/datum/disease/advance/proc/AssignName(var/name = "Unknown")
src.name = name
return
// Return a unique ID of the disease.
/datum/disease/advance/proc/GetDiseaseID()
var/list/L = list()
for(var/datum/symptom/S in symptoms)
L += S.id
L = sortList(L) // Sort the list so it doesn't matter which order the symptoms are in.
return dd_list2text(L, ":")
// Add a symptom, if it is over the limit (with a small chance to be able to go over)
// we take a random symptom away and add the new one.
/datum/disease/advance/proc/AddSymptom(var/datum/symptom/S)
if(HasSymptom(S))
return
if(symptoms.len < 3 + rand(-1, 1))
symptoms += S
else
RemoveSymptom(pick(symptoms))
symptoms += S
return
// Simply removes the symptom.
/datum/disease/advance/proc/RemoveSymptom(var/datum/symptom/S)
symptoms -= S
return
/*
Static Procs
*/
// Mix a list of advance diseases and return the mixed result.
/proc/Advance_Mix(var/list/D_list)
//world << "Mixing!!!!"
var/list/diseases = list()
for(var/datum/disease/advance/A in D_list.Copy())
diseases += A.Copy()
if(!diseases.len)
return null
if(diseases.len <= 1)
return pick(diseases) // Just return the only entry.
var/i = 0
// Mix our diseases until we are left with only one result.
while(i < 20 && diseases.len > 1)
i++
var/datum/disease/advance/D1 = pick(diseases)
diseases -= D1
var/datum/disease/advance/D2 = pick(diseases)
D2.Mix(D1)
// Should be only 1 entry left, but if not let's only return a single entry
//world << "END MIXING!!!!!"
var/datum/disease/advance/to_return = pick(diseases)
to_return.Refresh()
return to_return
/proc/SetViruses(var/datum/reagent/R, var/list/data)
if(data)
var/list/preserve = list()
if(istype(data) && data["viruses"])
for(var/datum/disease/A in data["viruses"])
preserve += A.Copy()
R.data = data.Copy()
else
R.data = data
if(preserve.len)
R.data["viruses"] = preserve
#undef RANDOM_STARTING_LEVEL
+5
View File
@@ -0,0 +1,5 @@
/datum/disease/advance/cold/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
if(!D)
name = "Cold"
symptoms = list(new/datum/symptom/sneeze)
..(process, D, copy)
+5
View File
@@ -0,0 +1,5 @@
/datum/disease/advance/flu/New(var/process = 1, var/datum/disease/advance/D, var/copy = 0)
if(!D)
name = "Flu"
symptoms = list(new/datum/symptom/cough)
..(process, D, copy)
@@ -0,0 +1,39 @@
/*
//////////////////////////////////////
Confusion
Little bit hidden.
Lowers resistance.
Decreases stage speed.
Not very transmittable.
Intense Level.
Bonus
Makes the affected mob be confused for short periods of time.
//////////////////////////////////////
*/
/datum/symptom/confusion
name = "Confusion"
stealth = 1
resistance = -1
stage_speed = -3
transmittable = 0
level = 4
/datum/symptom/confusion/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='notice'>[pick("You feel confused.", "You forgot what you were thinking about.")]</span>"
else
M << "<span class='notice'>You are unable to think straight!</span>"
M.confused = min(100, M.confused + 2)
return
@@ -0,0 +1,37 @@
/*
//////////////////////////////////////
Coughing
Noticable.
No Resistance.
Doesn't increase stage speed.
Transmittable.
Low Level.
BONUS
Will force the affected mob to drop items!
//////////////////////////////////////
*/
/datum/symptom/cough
name = "Cough"
stealth = -1
resistance = 0
stage_speed = 0
transmittable = 2
level = 1
/datum/symptom/cough/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
M << "<span notice='notice'>[pick("You swallow excess mucus.", "You lightly cough.")]</span>"
else
M.emote("cough")
M.drop_item()
return
@@ -0,0 +1,43 @@
/*
//////////////////////////////////////
Damage Converter
Little bit hidden.
Lowers resistance tremendously.
Decreases stage speed tremendously.
Reduced transmittablity
Intense Level.
Bonus
Slowly converts brute/fire damage to toxin.
//////////////////////////////////////
*/
/datum/symptom/damage_converter // Not the egg
name = "Toxic Compensation"
stealth = 1
resistance = -4
stage_speed = -4
transmittable = -2
level = 4
/datum/symptom/damage_converter/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(5)
Convert(M)
return
/datum/symptom/damage_converter/proc/Convert(var/mob/living/M)
if(M.getFireLoss() < M.getMaxHealth() || M.getBruteLoss() < M.getMaxHealth())
var/get_damage = rand(1, 2)
M.adjustFireLoss(-get_damage)
M.adjustBruteLoss(-get_damage)
M.adjustToxLoss(get_damage * 2)
return 1
@@ -0,0 +1,37 @@
/*
//////////////////////////////////////
Dizziness
Little bit hidden.
Lowers resistance considerably.
Decreases stage speed.
Reduced transmittability
Intense Level.
Bonus
Shakes the affected mob's screen for short periods.
//////////////////////////////////////
*/
/datum/symptom/dizzy // Not the egg
name = "Dizziness"
stealth = 1
resistance = -2
stage_speed = -3
transmittable = -1
level = 4
/datum/symptom/dizzy/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='notice'>[pick("You feel dizzy.", "Your head starts spinning.")]</span>"
else
M << "<span class='notice'>You are unable to look straight!</span>"
M.make_dizzy(5)
return
@@ -0,0 +1,34 @@
/*
//////////////////////////////////////
Fever
No change to hidden.
Increases resistance.
Increases stage speed.
Little transmittable.
Low level.
Bonus
Heats up your body.
//////////////////////////////////////
*/
/datum/symptom/fever
name = "Fever"
stealth = 0
resistance = 3
stage_speed = 3
transmittable = 1
level = 2
/datum/symptom/fever/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
M << "<span class='notice'>[pick("You feel hot.", "You feel like you're burning.")]</span>"
M.bodytemperature += 20 * A.stage
return
@@ -0,0 +1,37 @@
/*
//////////////////////////////////////
Hallucigen
Very noticable.
Lowers resistance considerably.
Decreases stage speed.
Reduced transmittable.
Critical Level.
Bonus
Makes the affected mob be hallucinated for short periods of time.
//////////////////////////////////////
*/
/datum/symptom/hallucigen
name = "Hallucigen"
stealth = -2
resistance = -3
stage_speed = -3
transmittable = -1
level = 5
/datum/symptom/hallucigen/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='notice'>[pick("You notice someone in the corner of your eye.", "Is that footsteps?.")]</span>"
else
M.hallucination += 5
return
@@ -0,0 +1,33 @@
/*
//////////////////////////////////////
Headache
Noticable.
Highly resistant.
Increases stage speed.
Not transmittable.
Low Level.
BONUS
Displays an annoying message!
Should be used for buffing your disease.
//////////////////////////////////////
*/
/datum/symptom/headache
name = "Headache"
stealth = -1
resistance = 4
stage_speed = 2
transmittable = 0
level = 1
/datum/symptom/headache/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
M << "<span class='notice'>[pick("Your head hurts.", "Your head starts pounding.")]</span>"
return
@@ -0,0 +1,33 @@
/*
//////////////////////////////////////
Itching
Not noticable or unnoticable.
Resistant.
Increases stage speed.
Little transmittable.
Low Level.
BONUS
Displays an annoying message!
Should be used for buffing your disease.
//////////////////////////////////////
*/
/datum/symptom/itching
name = "Itching"
stealth = 0
resistance = 3
stage_speed = 3
transmittable = 1
level = 1
/datum/symptom/itching/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
M << "<span class='notice'>Your [pick("back", "arm", "leg", "elbow", "head")] itches.</span>"
return
@@ -0,0 +1,34 @@
/*
//////////////////////////////////////
Shivering
No change to hidden.
Increases resistance.
Increases stage speed.
Little transmittable.
Low level.
Bonus
Cools down your body.
//////////////////////////////////////
*/
/datum/symptom/shivering
name = "Shivering"
stealth = 0
resistance = 2
stage_speed = 2
transmittable = 1
level = 2
/datum/symptom/shivering/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/carbon/M = A.affected_mob
M << "<span class='notice'>[pick("You feel cold.", "You start shaking from the cold.")]</span>"
M.bodytemperature -= 20 * A.stage
return
@@ -0,0 +1,38 @@
/*
//////////////////////////////////////
Sneezing
Very Noticable.
Increases resistance.
Doesn't increase stage speed.
Very transmittable.
Low Level.
Bonus
Forces a spread type of AIRBORNE
with extra range!
//////////////////////////////////////
*/
/datum/symptom/sneeze
name = "Sneezing"
stealth = -2
resistance = 2
stage_speed = 0
transmittable = 3
level = 1
/datum/symptom/sneeze/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3)
M.emote("sniff")
else
M.emote("sneeze")
A.spread(A.holder, 5, AIRBORNE)
return
@@ -0,0 +1,31 @@
// Symptoms are the effects that engineered advanced diseases do.
var/list/list_symptoms = typesof(/datum/symptom) - /datum/symptom
var/list/dictionary_symptoms = list()
var/global/const/SYMPTOM_ACTIVATION_PROB = 3
/datum/symptom
// Buffs/Debuffs the symptom has to the overall engineered disease.
var/name = ""
var/stealth = 0
var/resistance = 0
var/stage_speed = 0
var/transmittable = 0
// The type level of the symptom. Higher is more lethal and harder to generate.
var/level = 0
// The hash tag for our diseases, we will add it up with our other symptoms to get a unique id! ID MUST BE UNIQUE!!!
var/id = ""
/datum/symptom/New()
var/list/S = list_symptoms
for(var/i = 1; i <= S.len; i++)
if(src.type == S[i])
id = "[i]"
return
CRASH("We couldn't assign an ID!")
/datum/symptom/proc/Activate(var/mob/living/M, var/stage)
return
@@ -0,0 +1,95 @@
/*
//////////////////////////////////////
Vomiting
Very Very Noticable.
Decreases resistance.
Doesn't increase stage speed.
Little transmittable.
Medium Level.
Bonus
Forces the affected mob to vomit!
Meaning your disease can spread via
people walking on vomit.
Makes the affected mob lose nutrition and
heal toxin damage.
//////////////////////////////////////
*/
/datum/symptom/vomit
name = "Vomiting"
stealth = -2
resistance = -1
stage_speed = 0
transmittable = 1
level = 3
/datum/symptom/vomit/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='notice'>[pick("You feel nauseous.", "You feel like you're going to throw up!")]</span>"
else
Vomit(M)
return
/datum/symptom/vomit/proc/Vomit(var/mob/living/M)
M.Stun(5)
M.visible_message("<B>[M]</B> vomits on the floor!")
M.nutrition -= 20
M.adjustToxLoss(-3)
var/turf/pos = get_turf(M)
pos.add_vomit_floor(M)
playsound(pos, 'sound/effects/splat.ogg', 50, 1)
/*
//////////////////////////////////////
Vomiting Blood
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Little transmittable.
Intense level.
Bonus
Forces the affected mob to vomit blood!
Meaning your disease can spread via
people walking on the blood.
Makes the affected mob lose health.
//////////////////////////////////////
*/
/datum/symptom/vomit/blood
name = "Blood Vomiting"
stealth = -2
resistance = -1
stage_speed = -1
transmittable = 1
level = 4
/datum/symptom/vomit/blood/Vomit(var/mob/living/M)
M.Stun(5)
M.visible_message("<B>[M]</B> vomits on the floor!")
// They lose blood and health.
var/brute_dam = M.getBruteLoss()
if(brute_dam >= 50)
M.adjustBruteLoss(3)
var/turf/pos = get_turf(M)
pos.add_blood_floor(M)
playsound(pos, 'sound/effects/splat.ogg', 50, 1)
@@ -0,0 +1,119 @@
/*
//////////////////////////////////////
Weight Gain
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced transmittable.
Intense Level.
Bonus
Increases the weight gain of the mob,
forcing it to eventually turn fat.
//////////////////////////////////////
*/
/datum/symptom/weight_gain
name = "Weight Gain"
stealth = -3
resistance = -3
stage_speed = -2
transmittable = -2
level = 4
/datum/symptom/weight_gain/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='notice'>[pick("You feel blubbery.", "You feel full.")]</span>"
else
M.overeatduration = min(M.overeatduration + 100, 600)
M.nutrition = min(M.nutrition + 100, 500)
return
/*
//////////////////////////////////////
Weight Loss
Very Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced Transmittable.
High level.
Bonus
Decreases the weight of the mob,
forcing it to be skinny.
//////////////////////////////////////
*/
/datum/symptom/weight_loss
name = "Weight Loss"
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -2
level = 3
/datum/symptom/weight_loss/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1, 2, 3, 4)
M << "<span class='notice'>[pick("You feel hungry.", "You crave for food.")]</span>"
else
M << "<span class='notice'>Your stomach rumbles.</span>"
M.overeatduration = max(M.overeatduration - 100, 0)
M.nutrition = max(M.nutrition - 100, 0)
return
/*
//////////////////////////////////////
Weight Even
Very Noticable.
Decreases resistance.
Decreases stage speed.
Reduced transmittable.
High level.
Bonus
Causes the weight of the mob to
be even, meaning eating isn't
required anymore.
//////////////////////////////////////
*/
/datum/symptom/weight_even
name = "Weight Even"
stealth = -3
resistance = -2
stage_speed = -2
transmittable = -2
level = 4
/datum/symptom/weight_loss/Activate(var/datum/disease/advance/A)
..()
if(prob(SYMPTOM_ACTIVATION_PROB))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(5)
M.overeatduration = 0
M.nutrition = 400
return
+18 -6
View File
@@ -34,10 +34,11 @@
spread_type = SPECIAL
cure = "Unknown"
cure_id = list("lexorin","toxin","gargleblaster")
cure_chance = 20
cure_chance = 50
affected_species = list("Human", "Monkey")
permeability_mod = 15//likely to infect
can_carry = 0
stage_prob = 3
var/gibbed = 0
stage_minimum_age = 300
@@ -74,12 +75,23 @@
if(prob(50))
if(gibbed != 0) return 0
var/list/candidates = get_alien_candidates()
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
if(candidates.len)
new_xeno.key = pick(candidates)
else
new_xeno.key = affected_mob.key
var/picked = null
// To stop clientless larva, we will check that our host has a client
// if we find no ghosts to become the alien. If the host has a client
// he will become the alien but if he doesn't then we will set the stage
// to 2, so we don't do a process heavy check everytime.
if(candidates.len)
picked = pick(candidates)
else if(affected_mob.client)
picked = affected_mob.key
else
stage = 2 // Let's try again later.
return
var/mob/living/carbon/alien/larva/new_xeno = new(affected_mob.loc)
new_xeno.key = picked
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
affected_mob.gib()
src.cure(0)
+17 -4
View File
@@ -46,10 +46,23 @@ var/global/datum/getrev/revdata = new("config/svndir.txt")
if(svndirpath && fexists(svndirpath) && fexists("[svndirpath]/entries") && isfile(file("[svndirpath]/entries")))
var/list/filelist = file2list("[svndirpath]/entries")
if(filelist.len < 4)
return abort()
revision = filelist[4]
commiter = filelist[12]
var/s_archive = "" //Stores the previous line so the revision owner can be assigned.
//This thing doesn't count blank lines, so doing filelist[4] isn't working.
for(var/s in filelist)
if(!commiter)
if(s == "has-props")//The line before this is the committer.
commiter = s_archive
if(!revision)
var/n = text2num(s)
if(isnum(n))
if(n > 5000 && n < 99999) //Do you think we'll still be up and running at r100000? :) ~Errorage
revision = s
if(revision && commiter)
break
s_archive = s
if(!revision)
abort()
diary << "Revision info loaded succesfully"
return
return abort()
+13 -1
View File
@@ -161,6 +161,7 @@
if(istype(teleatom, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite
teleatom.visible_message("\red <B>The [teleatom] bounces off of the portal!</B>")
return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/disk/nuclear)))
if(istype(teleatom, /mob/living))
var/mob/living/MM = teleatom
@@ -168,6 +169,17 @@
else
teleatom.visible_message("\red <B>The [teleatom] bounces off of the portal!</B>")
return 0
if(destination.z > 7)
if(destination.z == 2) //centcomm z-level
if(istype(teleatom, /obj/mecha))
var/obj/mecha/MM = teleatom
MM.occupant << "\red <B>The mech would not survive the jump to a location so far away!</B>"
return 0
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)))
teleatom.visible_message("\red <B>The Bag of Holding bounces off of the portal!</B>")
return 0
if(destination.z > 7) //Away mission z-levels
return 0
return 1
+6 -15
View File
@@ -68,6 +68,7 @@ datum/mind
if(current) //remove ourself from our old body's mind variable
if(changeling)
current.remove_changeling_powers()
current.verbs -= /datum/changeling/proc/EvolutionMenu
current.mind = null
if(new_character.mind) //remove any mind currently in our new body's mind variable
new_character.mind.current = null
@@ -312,7 +313,7 @@ datum/mind
crystals = suplink.uses
if (suplink)
text += "|<a href='?src=\ref[src];common=takeuplink'>take</a>"
if (usr.client.holder.level >= 3)
if (usr.client.holder.rights & R_FUN)
text += ", <a href='?src=\ref[src];common=crystals'>[crystals]</a> crystals"
else
text += ", [crystals] crystals"
@@ -339,17 +340,7 @@ datum/mind
usr << browse(out, "window=edit_memory[src]")
Topic(href, href_list)
if(!usr || !usr.client)
return
if(!usr.client.holder)
message_admins("\red [key_name(usr)] tried to access [current]'s mind without authorization.")
log_admin("[key_name(usr)] tried to access [current]'s mind without authorization.")
return
if (!(usr.client.holder.rank in list("Trial Admin", "Badmin", "Game Admin", "Game Master")))
alert("You cannot perform this action. You must be of a higher administrative rank!")
return
if(!check_rights(R_ADMIN)) return
if (href_list["role_edit"])
var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs()
@@ -761,7 +752,7 @@ datum/mind
return
switch(href_list["monkey"])
if("healthy")
if (usr.client.holder.level >= 3)
if (usr.client.holder.rights & R_ADMIN)
var/mob/living/carbon/human/H = current
var/mob/living/carbon/monkey/M = current
if (istype(H))
@@ -776,7 +767,7 @@ datum/mind
D.cure(0)
sleep(0) //because deleting of virus is done through spawn(0)
if("infected")
if (usr.client.holder.level >= 3)
if (usr.client.holder.rights & R_ADMIN)
var/mob/living/carbon/human/H = current
var/mob/living/carbon/monkey/M = current
if (istype(H))
@@ -880,7 +871,7 @@ datum/mind
take_uplink()
memory = null//Remove any memory they may have had.
if("crystals")
if (usr.client.holder.level >= 3)
if (usr.client.holder.rights & R_FUN)
var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink()
var/crystals
if (suplink)
+7 -2
View File
@@ -64,6 +64,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
usr << "Not when you're incapacitated."
return 0
if(ishuman(usr) || ismonkey(usr))
if(istype(usr.wear_mask, /obj/item/clothing/mask/muzzle))
usr << "Mmmf mrrfff!"
return 0
if(clothes_req) //clothes check
if(!istype(usr, /mob/living/carbon/human))
usr << "You aren't a human, Why are you trying to cast a human spell, silly non-human? Casting human spells is for humans."
@@ -96,7 +101,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(prob(50))//Auto-mute? Fuck that noise
usr.say(invocation)
else
usr.say(dd_replacetext(invocation," ","`"))
usr.say(replacetext(invocation," ","`"))
if(usr.gender==MALE)
playsound(usr.loc, pick('sound/misc/null.ogg','sound/misc/null.ogg'), 100, 1)
else
@@ -105,7 +110,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(prob(50))
usr.whisper(invocation)
else
usr.whisper(dd_replacetext(invocation," ","`"))
usr.whisper(replacetext(invocation," ","`"))
/obj/effect/proc_holder/spell/New()
..()
+13 -8
View File
@@ -29,16 +29,21 @@
var/spawn_place = pick(targets)
if(summon_ignore_prev_spawn_points)
targets -= spawn_place
var/atom/summoned_object = new summoned_object_type(spawn_place)
if(ispath(summoned_object_type,/turf))
var/turf/O = spawn_place
var/turf/N = summoned_object_type
O.ChangeTurf(N)
else
var/atom/summoned_object = new summoned_object_type(spawn_place)
for(var/varName in newVars)
if(varName in summoned_object.vars)
summoned_object.vars[varName] = newVars[varName]
for(var/varName in newVars)
if(varName in summoned_object.vars)
summoned_object.vars[varName] = newVars[varName]
if(summon_lifespan)
spawn(summon_lifespan)
if(summoned_object)
del(summoned_object)
if(summon_lifespan)
spawn(summon_lifespan)
if(summoned_object)
del(summoned_object)
else
switch(charge_type)
if("recharge")
-21
View File
@@ -73,26 +73,5 @@
S.update_solar_exposure()
//returns the north-zero clockwise angle in degrees, given a direction
/proc/dir2angle(var/D)
switch(D)
if(1)
return 0
if(2)
return 180
if(4)
return 90
if(8)
return 270
if(5)
return 45
if(6)
return 135
if(9)
return 315
if(10)
return 225
else
return null
+7
View File
@@ -202,6 +202,13 @@
containertype = /obj/structure/largecrate/mule
containername = "MULEbot Crate"
/datum/supply_packs/lisa
name = "Corgi Crate"
contains = list()
cost = 50
containertype = /obj/structure/largecrate/lisa
containername = "Corgi Crate"
/datum/supply_packs/hydroponics // -- Skie
name = "Hydroponics Supply Crate"
contains = list(/obj/item/weapon/reagent_containers/spray/plantbgone,