Merge remote-tracking branch 'remotes/git-svn' into bs12_with_tgport (r4618)

Conflicts:
	baystation12.dme
	code/controllers/master_controller.dm
	code/defines/obj.dm
	code/game/gamemodes/events.dm
	code/game/machinery/newscaster.dm
	code/game/objects/items/blueprints.dm
	code/game/objects/items/stacks/sheets/sheet_types.dm
	code/game/objects/items/stacks/stack.dm
	code/game/objects/structures/stool_bed_chair_nest/bed.dm
	code/game/turfs/turf.dm
	code/modules/awaymissions/zlevel.dm
	code/modules/maps/fromdmp.dm
	code/modules/mob/living/silicon/ai/freelook/eye.dm
	code/modules/mob/living/silicon/ai/freelook/update_triggers.dm
	code/modules/mob/living/silicon/silicon.dm
	code/modules/mob/living/simple_animal/life.dm
	code/modules/mob/mob_movement.dm
	code/setup.dm
	icons/mob/uniform.dmi
	icons/obj/closet.dmi
	icons/obj/clothing/uniforms.dmi
	maps/RandomZLevels/assistantChamber.dmm
	maps/RandomZLevels/fileList.txt
	maps/tgstation.2.0.9.dmm

Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
Cael_Aislinn
2012-09-04 22:19:03 +10:00
185 changed files with 14805 additions and 13212 deletions
+417 -4
View File
@@ -1198,6 +1198,7 @@ var/global/BSACooldown = 0
var/location_description = ""
var/special_role_description = ""
var/health_description = ""
var/gender_description = ""
var/turf/T = get_turf(M)
//Location
@@ -1220,17 +1221,23 @@ var/global/BSACooldown = 0
var/status
switch (M.stat)
if (0) status = "Alive"
if (1) status = "\yellow Unconscious"
if (2) status = "\red Dead"
health_description = "Status - [status]"
if (1) status = "<font color='orange'><b>Unconscious</b></font>"
if (2) status = "<font color='red'><b>Dead</b></font>"
health_description = "Status = [status]"
health_description += "<BR>Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]"
else
// world <<"Has no health."
health_description = "This mob type has no health to speak of."
//Gener
if(M.gender in list(MALE,FEMALE))
gender_description = "[M.gender]"
else
gender_description = "<font color='red'><b>[M.gender]</b></font>"
// world <<"Displaying info about the mob..."
src.owner << "<b>Info about [M.name]:</b> "
src.owner << "Mob type = [M.type]; Damage = [health_description]"
src.owner << "Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]"
src.owner << "Name = <b>[M.name]</b>; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = <b>[M.key]</b>;"
src.owner << "Location = [location_description];"
src.owner << "[special_role_description]"
@@ -2237,6 +2244,220 @@ var/global/BSACooldown = 0
return
//hahaha
if(href_list["ac_view_wanted"]) //Admin newscaster Topic() stuff be here
src.admincaster_screen = 18 //The ac_ prefix before the hrefs stands for AdminCaster.
src.access_news_network()
if(href_list["ac_set_channel_name"])
src.admincaster_feed_channel.channel_name = strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""))
while (findtext(src.admincaster_feed_channel.channel_name," ") == 1)
src.admincaster_feed_channel.channel_name = copytext(src.admincaster_feed_channel.channel_name,2,lentext(src.admincaster_feed_channel.channel_name)+1)
src.access_news_network()
if(href_list["ac_set_channel_lock"])
src.admincaster_feed_channel.locked = !src.admincaster_feed_channel.locked
src.access_news_network()
if(href_list["ac_submit_new_channel"])
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == src.admincaster_feed_channel.channel_name)
check = 1
break
if(src.admincaster_feed_channel.channel_name == "" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]" || check )
src.admincaster_screen=7
else
var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
if(choice=="Confirm")
var/datum/feed_channel/newChannel = new /datum/feed_channel
newChannel.channel_name = src.admincaster_feed_channel.channel_name
newChannel.author = src.admincaster_signature
newChannel.locked = src.admincaster_feed_channel.locked
newChannel.is_admin_channel = 1
feedback_inc("newscaster_channels",1)
news_network.network_channels += newChannel //Adding channel to the global network
log_admin("[key_name_admin(usr)] created command feed channel: [src.admincaster_feed_channel.channel_name]!")
src.admincaster_screen=5
src.access_news_network()
if(href_list["ac_set_channel_receiving"])
var/list/available_channels = list()
for(var/datum/feed_channel/F in news_network.network_channels)
available_channels += F.channel_name
src.admincaster_feed_channel.channel_name = adminscrub(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
src.access_news_network()
if(href_list["ac_set_new_message"])
src.admincaster_feed_message.body = adminscrub(input(usr, "Write your Feed story", "Network Channel Handler", ""))
while (findtext(src.admincaster_feed_message.body," ") == 1)
src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,lentext(src.admincaster_feed_message.body)+1)
src.access_news_network()
if(href_list["ac_submit_new_message"])
if(src.admincaster_feed_message.body =="" || src.admincaster_feed_message.body =="\[REDACTED\]" || src.admincaster_feed_channel.channel_name == "" )
src.admincaster_screen = 6
else
var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = src.admincaster_signature
newMsg.body = src.admincaster_feed_message.body
newMsg.is_admin_message = 1
feedback_inc("newscaster_stories",1)
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == src.admincaster_feed_channel.channel_name)
FC.messages += newMsg //Adding message to the network's appropriate feed_channel
break
src.admincaster_screen=4
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert(src.admincaster_feed_channel.channel_name)
log_admin("[key_name_admin(usr)] submitted a feed story to channel: [src.admincaster_feed_channel.channel_name]!")
src.access_news_network()
if(href_list["ac_create_channel"])
src.admincaster_screen=2
src.access_news_network()
if(href_list["ac_create_feed_story"])
src.admincaster_screen=3
src.access_news_network()
if(href_list["ac_menu_censor_story"])
src.admincaster_screen=10
src.access_news_network()
if(href_list["ac_menu_censor_channel"])
src.admincaster_screen=11
src.access_news_network()
if(href_list["ac_menu_wanted"])
var/already_wanted = 0
if(news_network.wanted_issue)
already_wanted = 1
if(already_wanted)
src.admincaster_feed_message.author = news_network.wanted_issue.author
src.admincaster_feed_message.body = news_network.wanted_issue.body
src.admincaster_screen = 14
src.access_news_network()
if(href_list["ac_set_wanted_name"])
src.admincaster_feed_message.author = adminscrub(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
while (findtext(src.admincaster_feed_message.author," ") == 1)
src.admincaster_feed_message.author = copytext(admincaster_feed_message.author,2,lentext(admincaster_feed_message.author)+1)
src.access_news_network()
if(href_list["ac_set_wanted_desc"])
src.admincaster_feed_message.body = adminscrub(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
while (findtext(src.admincaster_feed_message.body," ") == 1)
src.admincaster_feed_message.body = copytext(src.admincaster_feed_message.body,2,lentext(src.admincaster_feed_message.body)+1)
src.access_news_network()
if(href_list["ac_submit_wanted"])
var/input_param = text2num(href_list["ac_submit_wanted"])
if(src.admincaster_feed_message.author == "" || src.admincaster_feed_message.body == "")
src.admincaster_screen = 16
else
var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below
var/datum/feed_message/WANTED = new /datum/feed_message
WANTED.author = src.admincaster_feed_message.author //Wanted name
WANTED.body = src.admincaster_feed_message.body //Wanted desc
WANTED.backup_author = src.admincaster_signature //Submitted by
WANTED.is_admin_message = 1
news_network.wanted_issue = WANTED
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.newsAlert()
NEWSCASTER.update_icon()
src.admincaster_screen = 15
else
news_network.wanted_issue.author = src.admincaster_feed_message.author
news_network.wanted_issue.body = src.admincaster_feed_message.body
news_network.wanted_issue.backup_author = src.admincaster_feed_message.backup_author
src.admincaster_screen = 19
log_admin("[key_name_admin(usr)] issued a Station-wide Wanted Notification for [src.admincaster_feed_message.author]!")
src.access_news_network()
if(href_list["ac_cancel_wanted"])
var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
if(choice=="Confirm")
news_network.wanted_issue = null
for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
NEWSCASTER.update_icon()
src.admincaster_screen=17
src.access_news_network()
if(href_list["ac_censor_channel_author"])
var/datum/feed_channel/FC = locate(href_list["ac_censor_channel_author"])
if(FC.author != "<B>\[REDACTED\]</B>")
FC.backup_author = FC.author
FC.author = "<B>\[REDACTED\]</B>"
else
FC.author = FC.backup_author
src.access_news_network()
if(href_list["ac_censor_channel_story_author"])
var/datum/feed_message/MSG = locate(href_list["ac_censor_channel_story_author"])
if(MSG.author != "<B>\[REDACTED\]</B>")
MSG.backup_author = MSG.author
MSG.author = "<B>\[REDACTED\]</B>"
else
MSG.author = MSG.backup_author
src.access_news_network()
if(href_list["ac_censor_channel_story_body"])
var/datum/feed_message/MSG = locate(href_list["ac_censor_channel_story_body"])
if(MSG.body != "<B>\[REDACTED\]</B>")
MSG.backup_body = MSG.body
MSG.body = "<B>\[REDACTED\]</B>"
else
MSG.body = MSG.backup_body
src.access_news_network()
if(href_list["ac_pick_d_notice"])
var/datum/feed_channel/FC = locate(href_list["ac_pick_d_notice"])
src.admincaster_feed_channel = FC
src.admincaster_screen=13
src.access_news_network()
if(href_list["ac_toggle_d_notice"])
var/datum/feed_channel/FC = locate(href_list["ac_toggle_d_notice"])
FC.censored = !FC.censored
src.access_news_network()
if(href_list["ac_view"])
src.admincaster_screen=1
src.access_news_network()
if(href_list["ac_setScreen"]) //Brings us to the main menu and resets all fields~
src.admincaster_screen = text2num(href_list["ac_setScreen"])
if (src.admincaster_screen == 0)
if(src.admincaster_feed_channel)
src.admincaster_feed_channel = new /datum/feed_channel
if(src.admincaster_feed_message)
src.admincaster_feed_message = new /datum/feed_message
src.access_news_network()
if(href_list["ac_show_channel"])
var/datum/feed_channel/FC = locate(href_list["ac_show_channel"])
src.admincaster_feed_channel = FC
src.admincaster_screen = 9
src.access_news_network()
if(href_list["ac_pick_censor_channel"])
var/datum/feed_channel/FC = locate(href_list["ac_pick_censor_channel"])
src.admincaster_feed_channel = FC
src.admincaster_screen = 12
src.access_news_network()
if(href_list["ac_refresh"])
src.access_news_network()
if(href_list["ac_set_signature"])
src.admincaster_signature = adminscrub(input(usr, "Provide your desired signature", "Network Identity Handler", ""))
src.access_news_network()
///////////////////////////////////////////////////////////////////////////////////////////////Panels
/obj/admins/proc/show_player_panel(var/mob/M in mob_list)
@@ -2377,6 +2598,198 @@ var/global/BSACooldown = 0
feedback_add_details("admin_verb","SPP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/obj/admins/proc/access_news_network() //MARKER
set category = "Fun"
set name = "Access Newscaster Network"
set desc = "Allows you to view, add and edit news feeds."
if (!istype(src,/obj/admins))
src = usr.client.holder
if (!istype(src,/obj/admins))
usr << "Error: you are not an admin!"
return
var/dat
dat = text("<HEAD><TITLE>Admin Newscaster</TITLE></HEAD><H3>Admin Newscaster Unit</H3>")
switch(admincaster_screen)
if(0)
dat += "Welcome to the admin newscaster.<BR> Here you can add, edit and censor every newspiece on the network."
dat += "<BR>Feed channels and stories entered through here will be uneditable and handled as official news by the rest of the units."
dat += "<BR>Note that this panel allows full freedom over the news network, there are no constrictions except the few basic ones. Don't break things!</FONT>"
if(news_network.wanted_issue)
dat+= "<HR><A href='?src=\ref[src];ac_view_wanted=1'>Read Wanted Issue</A>"
dat+= "<HR><BR><A href='?src=\ref[src];ac_create_channel=1'>Create Feed Channel</A>"
dat+= "<BR><A href='?src=\ref[src];ac_view=1'>View Feed Channels</A>"
dat+= "<BR><A href='?src=\ref[src];ac_create_feed_story=1'>Submit new Feed story</A>"
dat+= "<BR><BR><A href='?src=\ref[usr];mach_close=newscaster_main'>Exit</A>"
var/wanted_already = 0
if(news_network.wanted_issue)
wanted_already = 1
dat+="<HR><B>Feed Security functions:</B><BR>"
dat+="<BR><A href='?src=\ref[src];ac_menu_wanted=1'>[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue</A>"
dat+="<BR><A href='?src=\ref[src];ac_menu_censor_story=1'>Censor Feed Stories</A>"
dat+="<BR><A href='?src=\ref[src];ac_menu_censor_channel=1'>Mark Feed Channel with Nanotrasen D-Notice (disables and locks the channel.</A>"
dat+="<BR><HR><A href='?src=\ref[src];ac_set_signature=1'>The newscaster recognises you as:<BR> <FONT COLOR='green'>[src.admincaster_signature]</FONT></A>"
if(1)
dat+= "Station Feed Channels<HR>"
if( isemptylist(news_network.network_channels) )
dat+="<I>No active channels found...</I>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
if(CHANNEL.is_admin_channel)
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen'><A href='?src=\ref[src];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT></B><BR>"
else
dat+="<B><A href='?src=\ref[src];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>"
dat+="<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>"
if(2)
dat+="Creating new Feed Channel..."
dat+="<HR><B><A href='?src=\ref[src];ac_set_channel_name=1'>Channel Name</A>:</B> [src.admincaster_feed_channel.channel_name]<BR>"
dat+="<B><A href='?src=\ref[src];ac_set_signature=1'>Channel Author</A>:</B> <FONT COLOR='green'>[src.admincaster_signature]</FONT><BR>"
dat+="<B><A href='?src=\ref[src];ac_set_channel_lock=1'>Will Accept Public Feeds</A>:</B> [(src.admincaster_feed_channel.locked) ? ("NO") : ("YES")]<BR><BR>"
dat+="<BR><A href='?src=\ref[src];ac_submit_new_channel=1'>Submit</A><BR><BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A><BR>"
if(3)
dat+="Creating new Feed Message..."
dat+="<HR><B><A href='?src=\ref[src];ac_set_channel_receiving=1'>Receiving Channel</A>:</B> [src.admincaster_feed_channel.channel_name]<BR>" //MARK
dat+="<B>Message Author:</B> <FONT COLOR='green'>[src.admincaster_signature]</FONT><BR>"
dat+="<B><A href='?src=\ref[src];ac_set_new_message=1'>Message Body</A>:</B> [src.admincaster_feed_message.body] <BR>"
dat+="<BR><A href='?src=\ref[src];ac_submit_new_message=1'>Submit</A><BR><BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A><BR>"
if(4)
dat+="Feed story successfully submitted to [src.admincaster_feed_channel.channel_name].<BR><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
if(5)
dat+="Feed Channel [src.admincaster_feed_channel.channel_name] created successfully.<BR><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
if(6)
dat+="<B><FONT COLOR='maroon'>ERROR: Could not submit Feed story to Network.</B></FONT><HR><BR>"
if(src.admincaster_feed_channel.channel_name=="")
dat+="<FONT COLOR='maroon'>•Invalid receiving channel name.</FONT><BR>"
if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]")
dat+="<FONT COLOR='maroon'>•Invalid message body.</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[3]'>Return</A><BR>"
if(7)
dat+="<B><FONT COLOR='maroon'>ERROR: Could not submit Feed Channel to Network.</B></FONT><HR><BR>"
if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]")
dat+="<FONT COLOR='maroon'>•Invalid channel name.</FONT><BR>"
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == src.admincaster_feed_channel.channel_name)
check = 1
break
if(check)
dat+="<FONT COLOR='maroon'>•Channel name already in use.</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[2]'>Return</A><BR>"
if(9)
dat+="<B>[src.admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[created by: <FONT COLOR='maroon'>[src.admincaster_feed_channel.author]</FONT>\]</FONT><HR>"
if(src.admincaster_feed_channel.censored)
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.<BR>"
dat+="No further feed story additions are allowed while the D-Notice is in effect.</FONT><BR><BR>"
else
if( isemptylist(src.admincaster_feed_channel.messages) )
dat+="<I>No feed messages found in channel...</I><BR>"
else
for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
dat+="-[MESSAGE.body] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR><BR>"
dat+="<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[1]'>Back</A>"
if(10)
dat+="<B>Nanotrasen Feed Censorship Tool</B><BR>"
dat+="<FONT SIZE=1>NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.<BR>"
dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it.</FONT>"
dat+="<HR>Select Feed channel to get Stories from:<BR>"
if(isemptylist(news_network.network_channels))
dat+="<I>No feed channels found active...</I><BR>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=\ref[src];ac_pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A>"
if(11)
dat+="<B>Nanotrasen D-Notice Handler</B><HR>"
dat+="<FONT SIZE=1>A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's"
dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed"
dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.</FONT><HR>"
if(isemptylist(news_network.network_channels))
dat+="<I>No feed channels found active...</I><BR>"
else
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
dat+="<A href='?src=\ref[src];ac_pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>"
if(12)
dat+="<B>[src.admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[ created by: <FONT COLOR='maroon'>[src.admincaster_feed_channel.author]</FONT> \]</FONT><BR>"
dat+="<FONT SIZE=2><A href='?src=\ref[src];ac_censor_channel_author=\ref[src.admincaster_feed_channel]'>[(src.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]</A></FONT><HR>"
if( isemptylist(src.admincaster_feed_channel.messages) )
dat+="<I>No feed messages found in channel...</I><BR>"
else
for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
dat+="-[MESSAGE.body] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
dat+="<FONT SIZE=2><A href='?src=\ref[src];ac_censor_channel_story_body=\ref[MESSAGE]'>[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")]</A> - <A href='?src=\ref[src];ac_censor_channel_story_author=\ref[MESSAGE]'>[(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]</A></FONT><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[10]'>Back</A>"
if(13)
dat+="<B>[src.admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[ created by: <FONT COLOR='maroon'>[src.admincaster_feed_channel.author]</FONT> \]</FONT><BR>"
dat+="Channel messages listed below. If you deem them dangerous to the station, you can <A href='?src=\ref[src];ac_toggle_d_notice=\ref[src.admincaster_feed_channel]'>Bestow a D-Notice upon the channel</A>.<HR>"
if(src.admincaster_feed_channel.censored)
dat+="<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.<BR>"
dat+="No further feed story additions are allowed while the D-Notice is in effect.</FONT><BR><BR>"
else
if( isemptylist(src.admincaster_feed_channel.messages) )
dat+="<I>No feed messages found in channel...</I><BR>"
else
for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages)
dat+="-[MESSAGE.body] <BR><FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author]</FONT>\]</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[11]'>Back</A>"
if(14)
dat+="<B>Wanted Issue Handler:</B>"
var/wanted_already = 0
var/end_param = 1
if(news_network.wanted_issue)
wanted_already = 1
end_param = 2
if(wanted_already)
dat+="<FONT SIZE=2><BR><I>A wanted issue is already in Feed Circulation. You can edit or cancel it below.</FONT></I>"
dat+="<HR>"
dat+="<A href='?src=\ref[src];ac_set_wanted_name=1'>Criminal Name</A>: [src.admincaster_feed_message.author] <BR>"
dat+="<A href='?src=\ref[src];ac_set_wanted_desc=1'>Description</A>: [src.admincaster_feed_message.body] <BR>"
if(wanted_already)
dat+="<B>Wanted Issue created by:</B><FONT COLOR='green'> [news_network.wanted_issue.backup_author]</FONT><BR>"
else
dat+="<B>Wanted Issue will be created under prosecutor:</B><FONT COLOR='green'> [src.admincaster_signature]</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];ac_submit_wanted=[end_param]'>[(wanted_already) ? ("Edit Issue") : ("Submit")]</A>"
if(wanted_already)
dat+="<BR><A href='?src=\ref[src];ac_cancel_wanted=1'>Take down Issue</A>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A>"
if(15)
dat+="<FONT COLOR='green'>Wanted issue for [src.admincaster_feed_message.author] is now in Network Circulation.</FONT><BR><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
if(16)
dat+="<B><FONT COLOR='maroon'>ERROR: Wanted Issue rejected by Network.</B></FONT><HR><BR>"
if(src.admincaster_feed_message.author =="" || src.admincaster_feed_message.author == "\[REDACTED\]")
dat+="<FONT COLOR='maroon'>•Invalid name for person wanted.</FONT><BR>"
if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]")
dat+="<FONT COLOR='maroon'>•Invalid description.</FONT><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
if(17)
dat+="<B>Wanted Issue successfully deleted from Circulation</B><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
if(18)
dat+="<B><FONT COLOR ='maroon'>-- STATIONWIDE WANTED ISSUE --</B></FONT><BR><FONT SIZE=2>\[Submitted by: <FONT COLOR='green'>[news_network.wanted_issue.backup_author]</FONT>\]</FONT><HR>"
dat+="<B>Criminal</B>: [news_network.wanted_issue.author]<BR>"
dat+="<B>Description</B>: [news_network.wanted_issue.body]<BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A><BR>"
if(19)
dat+="<FONT COLOR='green'>Wanted issue for [src.admincaster_feed_message.author] successfully edited.</FONT><BR><BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Return</A><BR>"
else
dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
//world << "Channelname: [src.admincaster_feed_channel.channel_name] [src.admincaster_feed_channel.author]"
//world << "Msg: [src.admincaster_feed_message.author] [src.admincaster_feed_message.body]"
usr << browse(dat, "window=admincaster_main;size=400x600")
onclose(usr, "admincaster_main")
/obj/admins/proc/Jobbans()
+7 -6
View File
@@ -200,6 +200,7 @@
verbs += /obj/admins/proc/adrev //toggle admin revives
verbs += /obj/admins/proc/adspawn //toggle admin item spawning
verbs += /client/proc/debug_variables
verbs += /obj/admins/proc/access_news_network //Admin access to the newscaster network
verbs += /client/proc/cmd_modify_ticker_variables
verbs += /client/proc/Debug2 //debug toggle switch
verbs += /client/proc/toggle_view_range
@@ -223,7 +224,6 @@
//verbs += /proc/togglebuildmode --Merged with view variables
//verbs += /client/proc/cmd_modify_object_variables --Merged with view variables
verbs += /client/proc/togglebuildmodeself
verbs += /client/proc/debug_controller
else return
//Game Admin
@@ -244,9 +244,10 @@
verbs += /client/proc/make_sound
verbs += /client/proc/play_local_sound
verbs += /client/proc/send_space_ninja
verbs += /client/proc/restart_controller //Can call via aproccall --I_hate_easy_things.jpg, Mport --Agouri
verbs += /client/proc/Blobize //I need to remember to move/remove this later
verbs += /client/proc/Blobcount //I need to remember to move/remove this later
verbs += /client/proc/restart_controller //Can call via aproccall --I_hate_easy_things.jpg, Mport --Agouri
verbs += /client/proc/debug_controller
// verbs += /client/proc/Blobize //I need to remember to move/remove this later
// verbs += /client/proc/Blobcount //I need to remember to move/remove this later
verbs += /client/proc/toggle_clickproc //TODO ERRORAGE (Temporary proc while the new clickproc is being tested)
verbs += /client/proc/toggle_gravity_on
verbs += /client/proc/toggle_gravity_off
@@ -393,8 +394,8 @@
verbs -= /client/proc/play_local_sound
verbs -= /client/proc/enable_debug_verbs
verbs -= /client/proc/toggleprayers
verbs -= /client/proc/Blobize
verbs -= /client/proc/Blobcount
// verbs -= /client/proc/Blobize
// verbs -= /client/proc/Blobcount
verbs -= /client/proc/toggle_clickproc //TODO ERRORAGE (Temporary proc while the enw clickproc is being tested)
verbs -= /client/proc/toggle_hear_deadcast
verbs -= /client/proc/toggle_hear_radio
+2
View File
@@ -142,6 +142,8 @@ var/intercom_range_display_status = 0
src.verbs += /client/proc/startSinglo
src.verbs += /client/proc/ticklag //allows you to set the ticklag.
src.verbs += /client/proc/cmd_admin_grantfullaccess
src.verbs += /client/proc/kaboom
src.verbs += /client/proc/splash
//src.verbs += /client/proc/cmd_admin_rejuvenate
feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+2
View File
@@ -229,6 +229,8 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
message_admins("\blue [key_name_admin(usr)] spawned a xeno.", 1)
return
//I use this proc for respawn character too. /N
/proc/create_xeno(mob/dead/observer/G)
var/alien_caste = alert(src, "Please choose which caste to spawn.",,"Hunter","Sentinel","Drone")
+91
View File
@@ -0,0 +1,91 @@
/obj/machinery/gateway
name = "gateway"
desc = "It's a Nanotrasen approved one-way experimental teleporter that will take you places. Still has the pricetag on it."
icon = 'icons/obj/machines/gateway.dmi'
density = 1
anchored = 1
var/active = 0
/obj/machinery/gateway/initialize()
update_icon()
if(dir == 2)
density = 0
/obj/machinery/gateway/update_icon()
if(active)
icon_state = "on[dir]"
return
icon_state = "off[dir]"
/obj/machinery/gateway/attack_hand(mob/user as mob)
update_icon()
//this is da important part wot makes things go
/obj/machinery/gateway/center
density = 1
dir = 3 //this doesn't work for some reason? see below
var/list/linked = list() //a list of the connected gateway chunks
var/ready = 0
/obj/machinery/gateway/center/initialize()
dir = 3 //see above
update_icon()
/obj/machinery/gateway/center/proc/detect()
linked = list() //clear the list
var/turf/T = loc
for(var/i in alldirs)
T = get_step(loc, i)
var/obj/machinery/gateway/G = locate(/obj/machinery/gateway) in T
if(G)
linked.Add(G)
continue
//this is only done if we fail to find a part
ready = 0
toggleoff()
break
if(linked.len == 8)
ready = 1
/obj/machinery/gateway/center/proc/toggleon()
if(!ready) return
if(linked.len != 8) return
for(var/obj/machinery/gateway/G in linked)
G.active = 1
G.update_icon()
active = 1
update_icon()
density = 0
/obj/machinery/gateway/center/proc/toggleoff()
for(var/obj/machinery/gateway/G in linked)
G.active = 0
G.update_icon()
active = 0
update_icon()
density = 1
/obj/machinery/gateway/center/attack_hand(mob/user as mob)
if(!ready)
detect()
return
if(!active)
toggleon()
return
toggleoff()
//okay, here's the good teleporting stuff
/obj/machinery/gateway/center/HasEntered(mob/user as mob)
if(!ready) return
if(!active) return
var/obj/effect/landmark/dest = pick(awaydestinations)
if(dest)
user.loc = dest.loc
return
+17
View File
@@ -0,0 +1,17 @@
/obj/effect/spawner/lootdrop
icon = 'icons/mob/screen1.dmi'
icon_state = "x2"
var/lootcount = 1 //how many items will be spawned
var/lootdoubles = 0 //if the same item can be spawned twice
var/loot = "" //a list of possible items to spawn- a string of paths
/obj/effect/spawner/lootdrop/initialize()
var/list/things = params2list(loot)
if(things && things.len)
for(var/i = lootcount, i > 0, i--)
var/lootspawn = text2path(pick(things))
if(!lootdoubles)
things.Remove(lootspawn)
new lootspawn(get_turf(src))
del(src)
+7
View File
@@ -0,0 +1,7 @@
/obj/effect/step_trigger/message
var/message //the message to give to the mob
/obj/effect/step_trigger/message/Trigger(mob/M as mob)
if(M.client)
M << "<span class='info'>[message]</span>"
del(src)
@@ -7,7 +7,7 @@ proc/createRandomZlevel()
if (!text) // No random Z-levels for you.
return
world << "\red \b Reticulating Splines"
world << "\red \b Searching for away missions..."
var/list/CL = dd_text2list(text, "\n")
@@ -38,10 +38,20 @@ proc/createRandomZlevel()
if(potentialRandomZlevels.len)
world << "\red \b Loading away mission..."
var/map = pick(potentialRandomZlevels)
var/file = file(map)
if(isfile(file))
maploader.load_map(file)
for(var/obj/effect/landmark/L in world)
if (L.name != "awaystart")
continue
awaydestinations.Add(L)
world << "\red \b Away mission loaded."
else
world << "\red \b No away missions found."
return
+34 -1
View File
@@ -144,7 +144,22 @@ BLIND // can't see anything
2 = Report detailed damages
3 = Report location
*/
var/obj/item/clothing/tie/hastie = null
/obj/item/clothing/under/attackby(obj/item/I, mob/user)
if(!hastie && istype(I, /obj/item/clothing/tie))
user.drop_item()
hastie = I
I.loc = src
user << "<span class='notice'>You attach [I] to [src].</span>"
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform()
return
..()
/obj/item/clothing/under/examine()
set src in view()
@@ -158,6 +173,8 @@ BLIND // can't see anything
usr << "Its vital tracker appears to be enabled."
if(3)
usr << "Its vital tracker and tracking beacon appear to be enabled."
if(hastie)
usr << "[hastie] is clipped to it."
/obj/item/clothing/under/verb/toggle()
set name = "Toggle Suit Sensors"
@@ -170,7 +187,7 @@ BLIND // can't see anything
usr << "The controls are locked."
return 0
if(src.has_sensor <= 0)
usr << "This suit does not have any sensors"
usr << "This suit does not have any sensors."
return 0
src.sensor_mode += 1
if(src.sensor_mode > 3)
@@ -186,6 +203,22 @@ BLIND // can't see anything
usr << "Your suit will now report your vital lifesigns as well as your coordinate position."
..()
/obj/item/clothing/under/verb/removetie()
set name = "Remove Tie"
set category = "Object"
set src in usr
var/mob/M = usr
if (istype(M, /mob/dead/)) return
if (usr.stat) return
if(hastie)
hastie.loc = get_turf(src.loc)
hastie = null
if(istype(loc, /mob/living/carbon/human))
var/mob/living/carbon/human/H = loc
H.update_inv_w_uniform()
/obj/item/clothing/under/rank/New()
sensor_mode = pick(0,1,2,3)
..()
+26
View File
@@ -0,0 +1,26 @@
/obj/item/clothing/tie
name = "tie"
desc = "A neosilk clip-on tie."
icon = 'icons/obj/clothing/ties.dmi'
icon_state = "bluetie"
item_state = "" //no inhands
color = "bluetie"
flags = FPRINT | TABLEPASS
slot_flags = SLOT_ICLOTHING | SLOT_HEAD
w_class = 2.0
/obj/item/clothing/tie/blue
name = "blue tie"
icon_state = "bluetie"
color = "bluetie"
/obj/item/clothing/tie/red
name = "red tie"
icon_state = "redtie"
color = "redtie"
/obj/item/clothing/tie/horrible
name = "horrible tie"
desc = "A neosilk clip-on tie. This one is disgusting."
icon_state = "horribletie"
color = "horribletie"
+202
View File
@@ -0,0 +1,202 @@
#define LIQUID_TRANSFER_THRESHOLD 0.05
var/liquid_delay = 4
var/list/datum/puddle/puddles = list()
datum/puddle
var/list/obj/effect/liquid/liquid_objects = list()
datum/puddle/proc/process()
//world << "DEBUG: Puddle process!"
for(var/obj/effect/liquid/L in liquid_objects)
L.spread()
for(var/obj/effect/liquid/L in liquid_objects)
L.apply_calculated_effect()
if(liquid_objects.len == 0)
del(src)
datum/puddle/New()
..()
puddles += src
datum/puddle/Del()
puddles -= src
for(var/obj/O in liquid_objects)
del(O)
..()
client/proc/splash()
var/volume = input("Volume?","Volume?", 0 ) as num
if(!isnum(volume)) return
if(volume <= LIQUID_TRANSFER_THRESHOLD) return
var/turf/T = get_turf(src.mob)
if(!isturf(T)) return
trigger_splash(T, volume)
proc/trigger_splash(turf/epicenter as turf, volume as num)
if(!epicenter)
return
if(volume <= 0)
return
var/obj/effect/liquid/L = new/obj/effect/liquid(epicenter)
L.volume = volume
L.update_icon2()
var/datum/puddle/P = new/datum/puddle()
P.liquid_objects.Add(L)
L.controller = P
obj/effect/liquid
icon = 'icons/effects/liquid.dmi'
icon_state = "0"
name = "liquid"
var/volume = 0
var/new_volume = 0
var/datum/puddle/controller
obj/effect/liquid/New()
..()
if( !isturf(loc) )
del(src)
for( var/obj/effect/liquid/L in loc )
if(L != src)
del(L)
obj/effect/liquid/proc/spread()
//world << "DEBUG: liquid spread!"
var/surrounding_volume = 0
var/list/spread_directions = list(1,2,4,8)
var/turf/loc_turf = loc
for(var/direction in spread_directions)
var/turf/T = get_step(src,direction)
if(!T)
spread_directions.Remove(direction)
//world << "ERROR: Map edge!"
continue //Map edge
if(!loc_turf.can_leave_liquid(direction)) //Check if this liquid can leave the tile in the direction
spread_directions.Remove(direction)
continue
if(!T.can_accept_liquid(turn(direction,180))) //Check if this liquid can enter the tile
spread_directions.Remove(direction)
continue
var/obj/effect/liquid/L = locate(/obj/effect/liquid) in T
if(L)
if(L.volume >= src.volume)
spread_directions.Remove(direction)
continue
surrounding_volume += L.volume //If liquid already exists, add it's volume to our sum
else
var/obj/effect/liquid/NL = new(T) //Otherwise create a new object which we'll spread to.
NL.controller = src.controller
controller.liquid_objects.Add(NL)
if(!spread_directions.len)
//world << "ERROR: No candidate to spread to."
return //No suitable candidate to spread to
var/average_volume = (src.volume + surrounding_volume) / (spread_directions.len + 1) //Average amount of volume on this and the surrounding tiles.
var/volume_difference = src.volume - average_volume //How much more/less volume this tile has than the surrounding tiles.
if(volume_difference <= (spread_directions.len*LIQUID_TRANSFER_THRESHOLD)) //If we have less than the threshold excess liquid - then there is nothing to do as other tiles will be giving us volume.or the liquid is just still.
//world << "ERROR: transfer volume lower than THRESHOLD!"
return
var/volume_per_tile = volume_difference / spread_directions.len
for(var/direction in spread_directions)
var/turf/T = get_step(src,direction)
if(!T)
//world << "ERROR: Map edge 2!"
continue //Map edge
var/obj/effect/liquid/L = locate(/obj/effect/liquid) in T
if(L)
src.volume -= volume_per_tile //Remove the volume from this tile
L.new_volume = L.new_volume + volume_per_tile //Add it to the volume to the other tile
obj/effect/liquid/proc/apply_calculated_effect()
volume += new_volume
if(volume < LIQUID_TRANSFER_THRESHOLD)
del(src)
new_volume = 0
update_icon2()
obj/effect/liquid/Move()
return 0
obj/effect/liquid/Del()
src.controller.liquid_objects.Remove(src)
..()
obj/effect/liquid/proc/update_icon2()
//icon_state = num2text( max(1,min(7,(floor(volume),10)/10)) )
switch(volume)
if(0 to 0.1)
del(src)
if(0.1 to 5)
icon_state = "1"
if(5 to 10)
icon_state = "2"
if(10 to 20)
icon_state = "3"
if(20 to 30)
icon_state = "4"
if(30 to 40)
icon_state = "5"
if(40 to 50)
icon_state = "6"
if(50 to INFINITY)
icon_state = "7"
turf/proc/can_accept_liquid(from_direction)
return 0
turf/proc/can_leave_liquid(from_direction)
return 0
turf/space/can_accept_liquid(from_direction)
return 1
turf/space/can_leave_liquid(from_direction)
return 1
turf/simulated/floor/can_accept_liquid(from_direction)
for(var/obj/structure/window/W in src)
if(W.dir in list(5,6,9,10))
return 0
if(W.dir & from_direction)
return 0
for(var/obj/O in src)
if(!O.liquid_pass())
return 0
return 1
turf/simulated/floor/can_leave_liquid(to_direction)
for(var/obj/structure/window/W in src)
if(W.dir in list(5,6,9,10))
return 0
if(W.dir & to_direction)
return 0
for(var/obj/O in src)
if(!O.liquid_pass())
return 0
return 1
turf/simulated/wall/can_accept_liquid(from_direction)
return 0
turf/simulated/wall/can_leave_liquid(from_direction)
return 0
obj/proc/liquid_pass()
return 1
obj/machinery/door/liquid_pass()
return !density
#undef LIQUID_TRANSFER_THRESHOLD
@@ -58,7 +58,7 @@
tally += 1
if (istype(src, /mob/living/carbon/alien/humanoid/hunter))
tally = -1 // hunters go supersuperfast
return tally + move_delay_add
return (tally + move_delay_add + config.alien_delay)
//This needs to be fixed
/mob/living/carbon/alien/humanoid/Stat()
@@ -23,10 +23,10 @@
var/obj/item/W = get_active_hand()
if(W)
if(!istype(W)) return
switch(text)
switch(slot_id)
// if("o_clothing")
// if("head")
if("storage1")
if(slot_l_store)
if(l_store)
return
if(W.w_class > 3)
@@ -34,7 +34,7 @@
u_equip(W)
l_store = W
update_inv_pockets()
if("storage2")
if(slot_r_store)
if(r_store)
return
if(W.w_class > 3)
@@ -43,12 +43,12 @@
r_store = W
update_inv_pockets()
else
switch(text)
if("o_clothing")
switch(slot_id)
if(slot_wear_suit)
if(wear_suit) wear_suit.attack_alien(src)
if("head")
if(slot_head)
if(head) head.attack_alien(src)
if("storage1")
if(slot_l_store)
if(l_store) l_store.attack_alien(src)
if("storage2")
if(slot_r_store)
if(r_store) r_store.attack_alien(src)
@@ -8,6 +8,7 @@
health = 25
var/amount_grown = 0
var/max_grown = 200
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/larva/New()
@@ -64,7 +65,7 @@
stat(null, "Move Mode: [m_intent]")
if (client.statpanel == "Status")
stat(null, "Progress: [amount_grown]/200")
stat(null, "Progress: [amount_grown]/[max_grown]")
stat(null, "Plasma Stored: [getPlasma()]")
@@ -64,7 +64,7 @@
proc/handle_mutations_and_radiation()
//grow!! but not if metroid or dead
if(health>-100 && amount_grown < 200)
if(health>-100 && amount_grown < max_grown)
amount_grown++
if (radiation)
@@ -235,7 +235,7 @@
mutations.Add(FAT)
else
if(nutrition > 500)
if(prob(5 + round((nutrition - 200) / 2)))
if(prob(5 + round((nutrition - max_grown) / 2)))
src << "\red You suddenly feel blubbery!"
mutations.Add(FAT)
@@ -22,7 +22,7 @@
set desc = "Evolve into a fully grown Alien."
set category = "Alien"
if(amount_grown >= 200) //TODO ~Carn
if(amount_grown >= max_grown) //TODO ~Carn
src << "\green You are growing into a beautiful alien! It is time to choose a caste."
src << "\green There are three to choose from:"
src << "\green <B>Hunters</B> are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves."
@@ -1,3 +1,40 @@
/obj/item/brain
name = "brain"
desc = "A piece of juicy meat found in a persons head."
icon = 'icons/obj/surgery.dmi'
icon_state = "brain2"
flags = TABLEPASS
force = 1.0
w_class = 1.0
throwforce = 1.0
throw_speed = 3
throw_range = 5
origin_tech = "biotech=3"
attack_verb = list("attacked", "slapped", "whacked")
var/mob/living/carbon/brain/brainmob = null
New()
..()
//Shifting the brain "mob" over to the brain object so it's easier to keep track of. --NEO
//WASSSSSUUUPPPP /N
spawn(5)
if(brainmob && brainmob.client)
brainmob.client.screen.len = null //clear the hud
proc
transfer_identity(var/mob/living/carbon/human/H)
name = "[H]'s brain"
brainmob = new(src)
brainmob.name = H.real_name
brainmob.real_name = H.real_name
brainmob.dna = H.dna
brainmob.timeofhostdeath = H.timeofdeath
if(H.mind)
H.mind.transfer_to(brainmob)
brainmob << "\blue You might feel slightly disoriented. That's normal when your brain gets cut out."
return
/obj/item/brain/examine() // -- TLE
set src in oview(12)
if (!( usr ))
+1 -28
View File
@@ -107,34 +107,6 @@
return
return
/mob/living/carbon/human/movement_delay()
var/tally = 0
if(reagents.has_reagent("hyperzine")) return -1
if(reagents.has_reagent("nuka_cola")) return -1
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
var/health_deficiency = (100 - health - halloss)
if(health_deficiency >= 40) tally += (health_deficiency / 25)
var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
if (hungry >= 70) tally += hungry/50
if(wear_suit)
tally += wear_suit.slowdown
if(shoes)
tally += shoes.slowdown
if(FAT in src.mutations)
tally += 1.5
if (bodytemperature < 283.222)
tally += (283.222 - bodytemperature) / 10 * 1.75
return tally
/mob/living/carbon/human/Stat()
..()
statpanel("Status")
@@ -165,6 +137,7 @@
if (istype(wear_suit, /obj/item/clothing/suit/space/space_ninja)&&wear_suit:s_initialized)
stat("Energy Charge", round(wear_suit:cell:charge/100))
/mob/living/carbon/human/ex_act(severity)
if(!blinded)
flick("flash", flash)
@@ -1,3 +1,30 @@
/mob/living/carbon/human/movement_delay()
var/tally = 0
if(reagents.has_reagent("hyperzine")) return -1
if(reagents.has_reagent("nuka_cola")) return -1
if (istype(loc, /turf/space)) return -1 // It's hard to be slowed down in space by... anything
var/health_deficiency = (100 - health - halloss)
if(health_deficiency >= 40) tally += (health_deficiency / 25)
var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80
if (hungry >= 70) tally += hungry/50
if(wear_suit)
tally += wear_suit.slowdown
if(shoes)
tally += shoes.slowdown
if(FAT in src.mutations)
tally += 1.5
if (bodytemperature < 283.222)
tally += (283.222 - bodytemperature) / 10 * 1.75
return (tally+config.human_delay)
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)
//Can we act
+40 -2
View File
@@ -38,10 +38,12 @@
..()
//This code is here to try to determine what causes the gender switch to plural error. Once the error is tracked down and fixed, this code should be deleted
//Also delete var/prev_gender once this is removed.
if(prev_gender != gender)
prev_gender = gender
if(gender in list(PLURAL, NEUTER))
message_admins("[src] ([ckey]) gender has been changed to plural or neuter. Please record what has happened recently to the person and then notify coders.")
message_admins("[src] ([ckey]) gender has been changed to plural or neuter. Please record what has happened recently to the person and then notify coders. (<A HREF='?src=%holder_ref%;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?src=%holder_ref%;adminplayervars=\ref[src]'>VV</A>) (<A HREF='?src=%admin_ref%;priv_msg=\ref[src]'>PM</A>) (<A HREF='?src=%holder_ref%;adminplayerobservejump=\ref[src]'>JMP</A>)",1,1) //The 1,1 at the end is there to make '%holder_ref%' get replaced with the actual ref object
//Apparently, the person who wrote this code designed it so that
//blinded get reset each cycle and then get activated later in the
@@ -925,7 +927,9 @@
update_action_buttons()
if(src.oxyloss)
if(!src.oxyloss)
damageoverlay.icon_state = "oxydamageoverlay0"
else
switch(oxyloss)
if(0 to 10)
damageoverlay.icon_state = "oxydamageoverlay0"
@@ -944,6 +948,40 @@
if(45 to INFINITY)
damageoverlay.icon_state = "oxydamageoverlay7"
if(damageoverlay.overlays)
damageoverlay.overlays = list()
var/hurtdamage = src.getBruteLoss() + src.getFireLoss()
if(hurtdamage)
var/image/I
switch(hurtdamage)
if(10 to 20)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay1")
if(20 to 30)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay2")
if(30 to 40)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay3")
if(40 to 45)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay4")
if(45 to 50)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay5")
if(50 to 56)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay6")
if(56 to 62)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay7")
if(62 to 68)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay8")
if(68 to 74)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay9")
if(74 to 80)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay10")
if(80 to 86)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay11")
if(86 to 92)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay12")
if(92 to INFINITY)
I = image("icon" = 'icons/mob/screen1_full.dmi', "icon_state" = "brutedamageoverlay13")
damageoverlay.overlays += I
if( stat == DEAD )
sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS)
see_in_dark = 8
@@ -389,6 +389,13 @@ Please contact me on #coderbus IRC. ~Carn x
if(w_uniform.blood_DNA)
lying.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood2")
standing.overlays += image("icon" = 'icons/effects/blood.dmi', "icon_state" = "uniformblood")
if(w_uniform:hastie) //WE CHECKED THE TYPE ABOVE. THIS REALLY SHOULD BE FINE.
var/tie_color = w_uniform:hastie.color
if(!tie_color) tie_color = w_uniform:hastie.icon_state
lying.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]2")
standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]")
overlays_lying[UNIFORM_LAYER] = lying
overlays_standing[UNIFORM_LAYER] = standing
else
@@ -92,7 +92,7 @@
if (bodytemperature >= 330.23) // 135 F
return -1 // Metroids become supercharged at high temperatures
return tally
return tally+config.metroid_delay
/mob/living/carbon/metroid/Bump(atom/movable/AM as mob|obj, yes)
@@ -51,7 +51,7 @@
if (bodytemperature < 283.222)
tally += (283.222 - bodytemperature) / 10 * 1.75
return tally
return tally+config.monkey_delay
/mob/living/carbon/monkey/Bump(atom/movable/AM as mob|obj, yes)
+30 -18
View File
@@ -11,7 +11,7 @@
var/list/connected_robots = list()
var/aiRestorePowerRoutine = 0
//var/list/laws = list()
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list())
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list())
var/viewalerts = 0
var/lawcheck[1]
var/ioncheck[1]
@@ -206,11 +206,11 @@
/mob/living/silicon/ai/proc/ai_call_shuttle()
set category = "AI Commands"
set name = "Call Emergency Shuttle"
if(usr.stat == 2)
usr << "You can't call the shuttle because you are dead!"
if(src.stat == 2)
src << "You can't call the shuttle because you are dead!"
return
if(istype(usr,/mob/living/silicon/ai))
var/mob/living/silicon/ai/AI = usr
var/mob/living/silicon/ai/AI = src
if(AI.control_disabled)
usr << "Wireless control is disabled!"
return
@@ -230,13 +230,13 @@
/mob/living/silicon/ai/proc/ai_cancel_call()
set category = "AI Commands"
if(usr.stat == 2)
usr << "You can't send the shuttle back because you are dead!"
if(src.stat == 2)
src << "You can't send the shuttle back because you are dead!"
return
if(istype(usr,/mob/living/silicon/ai))
var/mob/living/silicon/ai/AI = usr
var/mob/living/silicon/ai/AI = src
if(AI.control_disabled)
usr << "Wireless control is disabled!"
src << "Wireless control is disabled!"
return
cancel_call_proc(src)
return
@@ -261,7 +261,7 @@
if (prob(30))
switch(pick(1,2))
if(1)
cancel_camera()
core()
if(2)
ai_call_shuttle()
..()
@@ -440,11 +440,13 @@
/mob/living/silicon/ai/proc/switchCamera(var/obj/machinery/camera/C)
src.cameraFollow = null
if (!C || stat == 2 || !C.can_use())
//machine = null
//reset_view(null)
if (!C || stat == 2) //C.can_use())
return 0
if(!src.eyeobj)
core()
return
// ok, we're alive, camera is good and in our network...
eyeobj.setLoc(get_turf(C))
//machine = src
@@ -543,6 +545,11 @@
cameralist[C.network] = C.network
var/old_network = network
network = input(U, "Which network would you like to view?") as null|anything in cameralist
if(!U.eyeobj)
U.core()
return
if(isnull(network))
network = old_network // If nothing is selected
else
@@ -653,15 +660,20 @@
/mob/living/silicon/ai/proc/lightNearbyCamera()
if(camera_light_on && camera_light_on < world.timeofday)
if(src.current)
var/camera = near_range_camera(src.eyeobj)
var/obj/machinery/camera/camera = near_range_camera(src.eyeobj)
if(camera && src.current != camera)
src.current.SetLuminosity(0)
src.current = camera
src.current.SetLuminosity(AI_CAMERA_LUMINOSITY)
if(!camera.light_disabled)
src.current = camera
src.current.SetLuminosity(AI_CAMERA_LUMINOSITY)
else
src.current = null
else if(isnull(camera))
src.current.SetLuminosity(0)
src.current = null
camera_light_on = world.timeofday + 1 * 20 // Update the light every 2 seconds.
else
src.current = near_range_camera(src.eyeobj)
if(src.current) src.current.SetLuminosity(AI_CAMERA_LUMINOSITY)
var/obj/machinery/camera/camera = near_range_camera(src.eyeobj)
if(camera && !camera.light_disabled)
src.current = camera
src.current.SetLuminosity(AI_CAMERA_LUMINOSITY)
camera_light_on = world.timeofday + 1 * 20 // Update the light every 2 seconds.
+2 -1
View File
@@ -4,7 +4,8 @@
icon_state = "ai-crash"
update_canmove()
src.eyeobj.setLoc(get_turf(src))
if(src.eyeobj)
src.eyeobj.setLoc(get_turf(src))
if(blind) blind.layer = 0
sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS
see_in_dark = 8
@@ -1,4 +1,4 @@
#define UPDATE_BUFFER 15
#define UPDATE_BUFFER 20 // 2 seconds
// CAMERA CHUNK
//
@@ -67,11 +67,10 @@
for(var/obj/machinery/camera/c in cameras)
if(!c.can_use())
continue
var/turf/pos = get_turf(c)
if(pos)
for(var/turf/t in range(7, pos))
if(t in turfs)
newVisibleTurfs += t
for(var/turf/t in c.can_see())
if(t in turfs)
newVisibleTurfs += t
var/list/visAdded = newVisibleTurfs - visibleTurfs
var/list/visRemoved = visibleTurfs - newVisibleTurfs
@@ -119,11 +118,10 @@
for(var/obj/machinery/camera/c in cameras)
if(!c.can_use())
continue
var/turf/pos = get_turf(c)
if(pos)
for(var/turf/t in range(7, pos))
if(t in turfs)
visibleTurfs += t
for(var/turf/t in c.can_see())
if(t in turfs)
visibleTurfs += t
obscuredTurfs = turfs - visibleTurfs
@@ -68,7 +68,7 @@
/atom/proc/move_camera_by_click()
if(istype(usr, /mob/living/silicon/ai))
var/mob/living/silicon/ai/AI = usr
if(AI.client.eye == AI.eyeobj)
if(AI.eyeobj && AI.client.eye == AI.eyeobj)
AI.eyeobj.setLoc(src)
// This will move the AIEye. It will also cause lights near the eye to light up, if toggled.
@@ -106,7 +106,13 @@
current = null
cameraFollow = null
machine = null
src.eyeobj.loc = src.loc
if(src.eyeobj)
src.eyeobj.loc = src.loc
else
src << "ERROR: Eyeobj not found. Please report this to Giacom. Creating new eye..."
src.eyeobj = new(src.loc)
if(client && client.eye)
client.eye = src
for(var/datum/camerachunk/c in eyeobj.visibleCameraChunks)
@@ -1,3 +1,5 @@
#define BORG_CAMERA_BUFFER 30
//UPDATE TRIGGERS, when the chunk (and the surrounding chunks) should update.
// TURFS
@@ -6,7 +8,8 @@
var/image/obscured
/turf/proc/visibilityChanged()
cameranet.updateVisibility(src)
if(ticker)
cameranet.updateVisibility(src)
/turf/simulated/Del()
visibilityChanged()
@@ -16,17 +19,19 @@
..()
visibilityChanged()
/*
// STRUCTURES
/obj/structure/Del()
cameranet.updateVisibility(src)
if(ticker)
cameranet.updateVisibility(src)
..()
/obj/structure/New()
..()
cameranet.updateVisibility(src)
if(ticker)
cameranet.updateVisibility(src)
// DOORS
@@ -35,21 +40,25 @@
. = ..(need_rebuild)
// Glass door glass = 1
// don't check then?
if(!glass)
if(!glass && cameranet)
cameranet.updateVisibility(src, 0)
*/
// ROBOT MOVEMENT
// Update the portable camera everytime the Robot moves.
// This might be laggy, comment it out if there are problems.
/mob/living/silicon/robot/var/updating = 0
/mob/living/silicon/robot/Move()
. = ..()
if(.)
if(src.camera)
cameranet.updatePortableCamera(src.camera)
if(!updating)
updating = 1
spawn(BORG_CAMERA_BUFFER)
cameranet.updatePortableCamera(src.camera)
updating = 0
// CAMERA
@@ -71,4 +80,6 @@
/obj/machinery/camera/Del()
cameranet.cameras -= src
cameranet.removeCamera(src)
..()
..()
#undef BORG_CAMERA_BUFFER
@@ -36,7 +36,7 @@
var/list/req_access = list(access_robotics)
var/ident = 0
//var/list/laws = list()
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list())
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list())
var/viewalerts = 0
var/modtype = "robot"
var/lower_mod = 0
@@ -12,4 +12,4 @@
tally = speed
return tally
return tally+config.robot_delay
+16 -10
View File
@@ -8,8 +8,8 @@
var/list/alarms_to_clear = list()
var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0)
var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0)
var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0)
var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0)
/mob/living/silicon/proc/cancelAlarm()
return
@@ -43,7 +43,7 @@
msg += "MOTION: [alarm_types_show["Motion"]] alarms detected. - "
if(alarm_types_show["Fire"])
msg += "FIRE: [alarm_types_show["Fire"]] Fire alarms detected. - "
msg += "FIRE: [alarm_types_show["Fire"]] alarms detected. - "
if(alarm_types_show["Atmosphere"])
msg += "ATMOSPHERE: [alarm_types_show["Atmosphere"]] alarms detected. - "
@@ -51,6 +51,9 @@
if(alarm_types_show["Power"])
msg += "POWER: [alarm_types_show["Power"]] alarms detected. - "
if(alarm_types_show["Camera"])
msg += "CAMERA: [alarm_types_show["Power"]] alarms detected. - "
msg += "<A href=?src=\ref[src];showalerts=1'>\[Show Alerts\]</a>"
src << msg
@@ -65,7 +68,7 @@
msg += "MOTION: [alarm_types_clear["Motion"]] alarms cleared. - "
if(alarm_types_clear["Fire"])
msg += "FIRE: [alarm_types_clear["Fire"]] Fire alarms cleared. - "
msg += "FIRE: [alarm_types_clear["Fire"]] alarms cleared. - "
if(alarm_types_clear["Atmosphere"])
msg += "ATMOSPHERE: [alarm_types_clear["Atmosphere"]] alarms cleared. - "
@@ -73,14 +76,19 @@
if(alarm_types_clear["Power"])
msg += "POWER: [alarm_types_clear["Power"]] alarms cleared. - "
if(alarm_types_show["Camera"])
msg += "CAMERA: [alarm_types_show["Power"]] alarms detected. - "
msg += "<A href=?src=\ref[src];showalerts=1'>\[Show Alerts\]</a>"
src << msg
alarms_to_show = list()
alarms_to_clear = list()
alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0)
alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0)
for(var/i = 1; i < alarm_types_show.len; i++)
alarm_types_show[i] = 0
for(var/i = 1; i < alarm_types_clear.len; i++)
alarm_types_clear[i] = 0
/mob/living/silicon/drop_item()
return
@@ -88,10 +96,10 @@
/mob/living/silicon/emp_act(severity)
switch(severity)
if(1)
src.take_organ_damage(40)
src.take_organ_damage(20)
Stun(rand(5,10))
if(2)
src.take_organ_damage(20)
src.take_organ_damage(10)
Stun(rand(1,5))
flick("noise", src:flash)
src << "\red <B>*BZZZT*</B>"
@@ -124,8 +132,6 @@
radiation += min((effect - (effect*getarmor(null, "rad"))), 0)//Rads auto check armor
if(STUTTER)
stuttering = max(stuttering,(effect/(blocked+1)))
if(SLUR)
slurring = max(slurring, (effefct/(blocked+1)))
if(EYE_BLUR)
eye_blurry = max(eye_blurry,(effect/(blocked+1)))
if(DROWSY)
@@ -52,6 +52,9 @@
/mob/living/simple_animal/bear/Life()
..()
if(client) return //Player controlled bears shouldnt be processing AI stuff
if(stat)
walk(src,0)//Stops the movement
+66 -47
View File
@@ -1,16 +1,19 @@
/mob/living/simple_animal
name = "animal"
icon = 'icons/mob/animal.dmi'
health = 20
maxHealth = 20
var/icon_living = ""
var/icon_dead = ""
var/icon_gib = null //We only try to show a gibbing animation if this exists.
maxHealth = 20
var/list/speak = list()
var/list/speak_emote = list()// Emotes while speaking IE: Ian [emote], [text] -- Ian barks, "WOOF!". Spoken text is generated from the speak variable.
var/speak_chance = 0
var/list/emote_hear = list() //Hearable emotes
var/list/emote_see = list() //Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
health = 20
var/turns_per_move = 1
var/turns_since_move = 0
universal_speak = 1
@@ -82,40 +85,8 @@
if(health > maxHealth)
health = maxHealth
/*
// Stun/Weaken
if (paralysis || stunned || weakened) //Stunned etc.
if (stunned > 0)
AdjustStunned(-1)
stat = 0
if (weakened > 0)
AdjustWeakened(-1)
lying = 1
stat = 0
if (paralysis > 0)
AdjustParalysis(-1)
blinded = 1
lying = 1
stat = 1
var/h = hand
hand = 0
drop_item()
hand = 1
drop_item()
hand = h
else //Not stunned.
lying = 0
stat = 0
if(paralysis || stunned || weakened || buckled)
canmove = 0
else
canmove = 1
*/
//Movement
if(!ckey && !stop_automated_movement)
if(!client && !stop_automated_movement)
if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
@@ -123,14 +94,8 @@
Move(get_step(src,pick(cardinal)))
turns_since_move = 0
//Speaking
if(speak_chance)
if(!client && speak_chance)
if(rand(0,200) < speak_chance)
if(speak && speak.len)
if((emote_hear && emote_hear.len) || (emote_see && emote_see.len))
@@ -316,6 +281,63 @@
return
/mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M as mob)
switch(M.a_intent)
if ("help")
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\blue [M] caresses [src] with its scythe like arm."), 1)
if ("grab")
if(M == src)
return
if (nopush)
return
var/obj/item/weapon/grab/G = new /obj/item/weapon/grab( M )
G.assailant = M
G.affecting = src
M.put_in_active_hand(G)
grabbed_by += G
G.synch()
LAssailant = M
playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
for(var/mob/O in viewers(src, null))
if ((O.client && !( O.blinded )))
O.show_message(text("\red [] has grabbed [] passively!", M, src), 1)
if("hurt")
var/damage = rand(15, 30)
visible_message("\red <B>[M] has slashed at [src]!</B>")
src.health -= damage
if("disarm")
var/damage = rand(15, 30)
visible_message("\red <B>[M] has slashed at [src]!</B>")
src.health -= damage
return
/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L as mob)
switch(L.a_intent)
if("help")
visible_message("\blue [L] rubs it's head against [src]")
else
var/damage = rand(5, 10)
visible_message("\red <B>[L] bites [src]!</B>")
if(stat != DEAD)
src.health -= damage
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
/mob/living/simple_animal/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri
if(istype(O, /obj/item/stack/medical))
if(stat != DEAD)
@@ -356,7 +378,7 @@
tally = speed
return tally
return tally+config.animal_delay
/mob/living/simple_animal/Stat()
..()
@@ -389,7 +411,4 @@
health -= 30
/mob/living/simple_animal/adjustBruteLoss(damage)
health -= damage
/proc/issimpleanimal(var/mob/AM)
return istype(AM,/mob/living/simple_animal)
health -= damage
+26 -21
View File
@@ -31,19 +31,8 @@
for(var/mob/M in view())
M << 'sound/effects/mousesqueek.ogg'
/mob/living/simple_animal/mouse/white
color = "white"
icon_state = "mouse_white"
/mob/living/simple_animal/mouse/gray
color = "gray"
icon_state = "mouse_gray"
/mob/living/simple_animal/mouse/brown
color = "brown"
icon_state = "mouse_brown"
/mob/living/simple_animal/mouse/New()
..()
if(!color)
color = pick( list("brown","gray","white") )
icon_state = "mouse_[color]"
@@ -51,14 +40,6 @@
icon_dead = "mouse_[color]_dead"
desc = "It's a small [color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
//TOM IS ALIVE! SQUEEEEEEEE~K :)
/mob/living/simple_animal/mouse/brown/Tom
name = "Tom"
desc = "Jerry the cat is not amused."
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "splats"
/mob/living/simple_animal/mouse/proc/splat()
src.health = 0
@@ -163,4 +144,28 @@ mob/living/simple_animal/mouse/restrained() //Hotfix to stop mice from doing thi
var/mob/M = AM
M << "\blue \icon[src] Squeek!"
M << 'sound/effects/mousesqueek.ogg'
..()
..()
/*
* Mouse types
*/
/mob/living/simple_animal/mouse/white
color = "white"
icon_state = "mouse_white"
/mob/living/simple_animal/mouse/gray
color = "gray"
icon_state = "mouse_gray"
/mob/living/simple_animal/mouse/brown
color = "brown"
icon_state = "mouse_brown"
//TOM IS ALIVE! SQUEEEEEEEE~K :)
/mob/living/simple_animal/mouse/brown/Tom
name = "Tom"
desc = "Jerry the cat is not amused."
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "splats"
+25 -11
View File
@@ -72,13 +72,17 @@
M.show_message( message, 1, blind_message, 2)
//What the fuck is this code
//This is aweful
/mob/attackby(obj/item/weapon/W as obj, mob/user as mob)
//Holding a balloon will shield you from an item that is_sharp() ... cause that makes sense
if (user.intent != "harm")
if (istype(src.l_hand,/obj/item/latexballon) && src.l_hand:air_contents && is_sharp(W))
return src.l_hand.attackby(W)
if (istype(src.r_hand,/obj/item/latexballon) && src.r_hand:air_contents && is_sharp(W))
return src.r_hand.attackby(W)
//If src is grabbing someone and facing the attacker, the src will use the grabbed person as a shield
var/shielded = 0
if (locate(/obj/item/weapon/grab, src))
var/mob/safe = null
@@ -92,7 +96,9 @@
safe = G.affecting
if (safe)
return safe.attackby(W, user)
if ((!( shielded ) || !( W.flags ) & 32))
//If the mob is not wearing a shield or otherwise is not shielded
if ((!( shielded ) || !( W.flags ) & NOSHIELD))
spawn( 0 )
if (W)
W.attack(src, user)
@@ -659,18 +665,26 @@ note dizziness decrements automatically in the mob's Life() proc.
/mob/Stat()
..()
statpanel("Status")
if(statpanel("Status")) //not looking at that panel
if (client && client.holder)
stat(null, "([x], [y], [z])")
stat(null, "CPU: [world.cpu]")
if (master_controller)
stat(null, "Current Iteration: [controller_iteration]")
stat(null, "Time between ticks: [last_tick_duration]")
if(client && client.holder)
stat(null,"Location: \t ([x], [y], [z])")
stat(null,"CPU: \t [world.cpu]")
if(master_controller)
stat(null,"MasterController-[last_tick_duration] ([master_controller.processing?"On":"Off"]-[controller_iteration])")
stat(null,"Air-[master_controller.air_cost]\t Sun-[master_controller.sun_cost]")
stat(null,"Mob-[master_controller.mobs_cost]\t #[mob_list.len]")
stat(null,"Dis-[master_controller.diseases_cost]\t #[active_diseases.len]")
stat(null,"Mch-[master_controller.machines_cost]\t #[machines.len]")
stat(null,"Obj-[master_controller.objects_cost]\t #[processing_objects.len]")
stat(null,"Net-[master_controller.networks_cost]\t Pnet-[master_controller.powernets_cost]")
stat(null,"Tick-[master_controller.ticker_cost]\t ALL-[master_controller.total_cost]")
else
stat(null,"MasterController-ERROR")
if (spell_list.len)
if(spell_list.len)
for(var/obj/effect/proc_holder/spell/S in spell_list)
switch(S.charge_type)
if("recharge")
+2 -2
View File
@@ -112,8 +112,8 @@
killing = 0
hud1.icon_state = "disarm/kill"
return
affecting.Weaken(3)
affecting.Stun(3) // It will hamper your voice, being choked and all.
affecting.Weaken(5) // Should keep you down unless you get help.
affecting.Stun(5) // It will hamper your voice, being choked and all.
affecting.losebreath = min(affecting.losebreath + 2, 3)
return
+12 -24
View File
@@ -263,7 +263,9 @@
if(moving) return 0
if(world.time < move_delay) return
if(move_delay >= 864000) move_delay -= 864000
if(world.timeofday < move_delay) return
if(!mob) return
@@ -287,13 +289,6 @@
if(Process_Grab()) return
if(!mob.canmove) return
//Making mob movememnt changes instant.
if(mob.paralysis || mob.stunned || mob.resting || mob.weakened || mob.buckled /*|| (mob.changeling && mob.changeling.changeling_fakedeath)*/)
mob.canmove = 0
return
else
mob.canmove = 1
//if(istype(mob.loc, /turf/space) || (mob.flags & NOGRAV))
// if(!mob.Process_Spacemove(0)) return 0
@@ -313,23 +308,19 @@
if(mob.restrained())//Why being pulled while cuffed prevents you from moving
for(var/mob/M in range(mob, 1))
if(((M.pulling == mob && (!( M.restrained() ) && M.stat == 0)) || locate(/obj/item/weapon/grab, mob.grabbed_by.len)))
if(M.pulling == mob && !M.restrained() && M.stat == 0 && M.canmove)
src << "\blue You're restrained! You can't move!"
return 0
move_delay = world.time//set move delay
move_delay = world.timeofday//set move delay
switch(mob.m_intent)
if("run")
if(mob.drowsyness > 0)
move_delay += 5
// if(mob.organStructure && mob.organStructure.legs)
// move_delay += mob.organStructure.legs.moveRunDelay
move_delay += 2
move_delay += 6
move_delay += 1+config.run_speed
if("walk")
// if(mob.organStructure && mob.organStructure.legs)
// move_delay += mob.organStructure.legs.moveWalkDelay
move_delay += 5
move_delay += 7+config.walk_speed
move_delay += mob.movement_delay()
if(config.Tickcomp)
@@ -344,7 +335,7 @@
moving = 1
//Something with pulling things
if(locate(/obj/item/weapon/grab, mob))
move_delay = max(move_delay, world.time + 7)
move_delay = max(move_delay, world.timeofday + 7)
var/list/L = mob.ret_grab()
if(istype(L, /list))
if(L.len == 2)
@@ -375,13 +366,10 @@
M.animate_movement = 2
return
else if(mob.confused && prob(30))
else if(mob.confused)
step(mob, pick(cardinal))
else
. = ..()
for(var/obj/effect/speech_bubble/S in range(1, mob))
if(S.parent == mob)
S.loc = mob.loc
moving = 0
@@ -405,12 +393,12 @@
for(var/obj/item/weapon/grab/G in mob.grabbed_by)
if((G.state == 1)&&(!grabbing.Find(G.assailant))) del(G)
if(G.state == 2)
move_delay = world.time + 10
move_delay = world.timeofday + 10
if(!prob(25)) return 1
mob.visible_message("\red [mob] has broken free of [G.assailant]'s grip!")
del(G)
if(G.state == 3)
move_delay = world.time + 10
move_delay = world.timeofday + 10
if(!prob(5)) return 1
mob.visible_message("\red [mob] has broken free of [G.assailant]'s headlock!")
del(G)
+4 -4
View File
@@ -4,11 +4,11 @@
var/name = "organ"
var/mob/owner = null
/datum/organ/proc/process()
return 0
///datum/organ/proc/process()
// return 0
/datum/organ/proc/receive_chem(chemical as obj)
return 0
///datum/organ/proc/receive_chem(chemical as obj)
// return 0
+48 -23
View File
@@ -276,7 +276,7 @@
var/list/mobtypes = typesof(/mob/living/simple_animal)
var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes
if(bad_animal(mobpath))
if(!safe_animal(mobpath))
usr << "\red Sorry but this mob type is currently unavailable."
return
@@ -311,7 +311,7 @@
var/list/mobtypes = typesof(/mob/living/simple_animal)
var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes
if(bad_animal(mobpath))
if(!safe_animal(mobpath))
usr << "\red Sorry but this mob type is currently unavailable."
return
@@ -324,32 +324,57 @@
del(src)
//Certain mob types either do not work, or have major problems and should now be allowed to be controlled by players.
/mob/proc/bad_animal(var/MP)
/* Certain mob types have problems and should not be allowed to be controlled by players.
*
* This proc is here to force coders to manually place their mob in this list, hopefully tested.
* This also gives a place to explain -why- players shouldnt be turn into certain mobs and hopefully someone can fix them.
*/
/mob/proc/safe_animal(var/MP)
//Sanity, this should never happen.
if(!MP || !ispath(MP, /mob/living/simple_animal))
//Bad mobs! - Remember to add a comment explaining what's wrong with the mob
if(!MP)
return 0 //Sanity, this should never happen.
if(ispath(MP, /mob/living/simple_animal/parrot))
return 0 //Parrots are unfinished, they have no sprite, movement, ect...(Working on this - Nodrak)
if(ispath(MP, /mob/living/simple_animal/space_worm))
return 0 //Unfinished. Very buggy, they seem to just spawn additional space worms everywhere and eating your own tail results in new worms spawning.
if(ispath(MP, /mob/living/simple_animal/constructbehemoth))
return 0 //I think this may have been an unfinished WiP or something. These constructs should really have their own class simple_animal/construct/subtype
if(ispath(MP, /mob/living/simple_animal/constructarmoured))
return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype
if(ispath(MP, /mob/living/simple_animal/constructwraith))
return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype
if(ispath(MP, /mob/living/simple_animal/constructbuilder))
return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype
//Good mobs!
if(ispath(MP, /mob/living/simple_animal/cat))
return 1
if(ispath(MP, /mob/living/simple_animal/corgi))
return 1
if(ispath(MP, /mob/living/simple_animal/crab))
return 1
if(ispath(MP, /mob/living/simple_animal/carp))
return 1
if(ispath(MP, /mob/living/simple_animal/mushroom))
return 1
if(ispath(MP, /mob/living/simple_animal/shade))
return 1
if(ispath(MP, /mob/living/simple_animal/tomato))
return 1
//It is impossible to pull up the player panel for mice
if(ispath(MP, /mob/living/simple_animal/mouse))
return 1
//Bears will auto-attack mobs, even if they're player controlled
return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak)
if(ispath(MP, /mob/living/simple_animal/bear))
return 1
return 1 //Bears will auto-attack mobs, even if they're player controlled (Fixed! - Nodrak)
//Parrots are unfinished, they have no sprite, movement, ect...
else if(ispath(MP, /mob/living/simple_animal/parrot))
return 1
//Very buggy, they seem to just spawn additional space worms everywhere and eating your own tail results in new worms spawning.
else if(ispath(MP, /mob/living/simple_animal/space_worm))
return 1
//No problems found!
else
return 0
//Not in here? Must be untested!
return 0
+1 -2
View File
@@ -80,7 +80,7 @@ proc/cardinalrange(var/center)
/obj/machinery/am_shielding/process()
if(!processing) ..()
if(!processing) . = PROCESS_KILL
//TODO: core functions and stability
//TODO: think about checking the airmix for plasma and increasing power output
return
@@ -174,7 +174,6 @@ proc/cardinalrange(var/center)
/obj/machinery/am_shielding/proc/shutdown_core()
processing = 0
machines.Remove(src)
if(!control_unit) return
control_unit.linked_cores.Remove(src)
control_unit.reported_core_efficiency -= efficiency
+1 -1
View File
@@ -573,7 +573,7 @@
#define LIGHTING_POWER_FACTOR 20 //20W per unit luminosity
/obj/machinery/light/process()
/obj/machinery/light/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY
if(on)
use_power(luminosity * LIGHTING_POWER_FACTOR, LIGHT)
+14 -16
View File
@@ -105,22 +105,20 @@
s.set_up(5, 1, src)
s.start()
A.dir = src.dir
if(src.dir == 1)//Up
A.yo = 20
A.xo = 0
else if(src.dir == 2)//Down
A.yo = -20
A.xo = 0
else if(src.dir == 4)//Right
A.yo = 0
A.xo = 20
else if(src.dir == 8)//Left
A.yo = 0
A.xo = -20
else // Any other
A.yo = -20
A.xo = 0
A.process()
switch(dir)
if(NORTH)
A.yo = 20
A.xo = 0
if(EAST)
A.yo = 0
A.xo = 20
if(WEST)
A.yo = 0
A.xo = -20
else // Any other
A.yo = -20
A.xo = 0
A.process() //TODO: Carn: check this out
/obj/machinery/emitter/attackby(obj/item/W, mob/user)
+1 -3
View File
@@ -13,9 +13,7 @@
var/turf/T = get_turf(src)
if(src.energy >= 200)
new /obj/machinery/singularity/(T, 50)
spawn(0)
del(src)
return
if(src) del(src)
/obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/weapon/wrench))
+2 -2
View File
@@ -83,7 +83,7 @@
sunfrac = cos(p_angle) ** 2
/obj/machinery/power/solar/process()
/obj/machinery/power/solar/process()//TODO: remove/add this from machines to save on processing as needed ~Carn PRIORITY
if(stat & BROKEN) return
if(!control) return
if(obscured) return
@@ -141,7 +141,7 @@
/obj/machinery/power/solar/fake/process()
machines.Remove(src)
. = PROCESS_KILL
return
+13 -10
View File
@@ -6,16 +6,6 @@
max_ammo = 7
multiple_sprites = 1
/obj/item/ammo_magazine/a75
name = "ammo magazine (.75)"
icon_state = "gyro"
ammo_type = "/obj/item/ammo_casing/a75"
max_ammo = 8
/obj/item/ammo_magazine/c38
name = "speed loader (.38)"
icon_state = "38"
@@ -89,3 +79,16 @@
icon_state = "50ae"
ammo_type = "/obj/item/ammo_casing/a50"
max_ammo = 0
/obj/item/ammo_magazine/a75
name = "ammo magazine (.75)"
icon_state = "75"
ammo_type = "/obj/item/ammo_casing/a75"
multiple_sprites = 1
max_ammo = 8
/obj/item/ammo_magazine/a75/empty
name = "ammo magazine (.75)"
icon_state = "75"
ammo_type = "/obj/item/ammo_casing/a75"
max_ammo = 0
@@ -36,9 +36,6 @@
update_icon()
return
update_icon()
..()
return
/obj/item/weapon/gun/projectile/deagle/gold
name = "Desert Eagle"
desc = "A gold plated gun folded over a million times by superior martian gunsmiths. Uses .50 AE ammo."
@@ -60,7 +57,31 @@
desc = "A bulky pistol designed to fire self propelled rounds"
icon_state = "gyropistol"
max_shells = 8
caliber = "a75"
caliber = "75"
fire_sound = 'sound/effects/Explosion1.ogg'
origin_tech = "combat=3"
ammo_type = "/obj/item/ammo_casing/a75"
load_method = 2
New()
..()
empty_mag = new /obj/item/ammo_magazine/a75/empty(src)
update_icon()
return
afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)
..()
if(!loaded.len && empty_mag)
empty_mag.loc = get_turf(src.loc)
empty_mag = null
playsound(user, 'sound/weapons/smg_empty_alarm.ogg', 40, 1)
update_icon()
return
update_icon()
..()
if(empty_mag)
icon_state = "gyropistolloaded"
else
icon_state = "gyropistol"
return
+39 -26
View File
@@ -124,6 +124,7 @@ datum
if(!istype(T)) return
var/datum/reagent/blood/self = src
src = null
if(!(volume >= 3)) return
//var/datum/disease/D = self.data["virus"]
if(!self.data["donor"] || istype(self.data["donor"], /mob/living/carbon/human))
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here
@@ -262,15 +263,16 @@ datum
reaction_turf(var/turf/simulated/T, var/volume)
if (!istype(T)) return
src = null
if(T.wet >= 2) return
T.wet = 2
spawn(800)
if (!istype(T)) return
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
return
if(volume >= 1)
if(T.wet >= 2) return
T.wet = 2
spawn(800)
if (!istype(T)) return
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
return
anti_toxin
name = "Anti-Toxin (Dylovene)"
@@ -773,9 +775,10 @@ datum
reaction_turf(var/turf/T, var/volume)
src = null
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/greenglow(T)
return
if(volume >= 3)
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/greenglow(T)
return
ryetalyn
@@ -802,10 +805,17 @@ datum
reaction_turf(var/turf/T, var/volume)
src = null
if(istype(T, /turf/simulated/wall))
T:thermite = 1
T.overlays = null
T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
if(volume >= 5)
if(istype(T, /turf/simulated/wall))
T:thermite = 1
T.overlays = null
T.overlays = image('icons/effects/effects.dmi',icon_state = "thermite")
return
on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustFireLoss(1)
..()
return
mutagen
@@ -921,8 +931,9 @@ datum
reaction_turf(var/turf/T, var/volume)
src = null
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/greenglow(T)
if(volume >= 3)
if(!istype(T, /turf/space))
new /obj/effect/decal/cleanable/greenglow(T)
aluminum
name = "Aluminum"
@@ -986,13 +997,14 @@ datum
if(O)
O.clean_blood()
reaction_turf(var/turf/T, var/volume)
T.overlays = null
T.clean_blood()
for(var/obj/effect/decal/cleanable/C in src)
del(C)
if(volume >= 1)
T.overlays = null
T.clean_blood()
for(var/obj/effect/decal/cleanable/C in src)
del(C)
for(var/mob/living/carbon/metroid/M in T)
M.adjustToxLoss(rand(5,10))
for(var/mob/living/carbon/metroid/M in T)
M.adjustToxLoss(rand(5,10))
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if(iscarbon(M))
@@ -2626,8 +2638,9 @@ datum
return
reaction_turf(var/turf/simulated/T, var/volume)
if(!istype(T)) return
T.Bless()
if(volume >= 3)
if(!istype(T)) return
T.Bless()
tequilla
name = "Tequila"
@@ -31,7 +31,20 @@ datum
var/datum/effect/effect/system/reagents_explosion/e = new()
e.set_up(round (created_volume/10, 1), location, 0, 0)
e.start()
holder.clear_reagents()
return
emp_pulse
name = "EMP Pulse"
id = "emp_pulse"
result = null
required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense
result_amount = 2
on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
// 100 created volume = 10 heavy range & 20 light range = same as normal EMP grenade
empulse(location, round(created_volume / 10), round(created_volume / 5), 1)
holder.clear_reagents()
return
/*
@@ -128,7 +128,9 @@
attack_verb = list("stabbed", "slashed", "attacked")
var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken")
/obj/item/weapon/broken_bottle/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
/obj/item/weapon/reagent_containers/food/drinks/bottle/gin
+1 -1
View File
@@ -76,7 +76,7 @@
use_power(100)
affecting = loc.contents - src // moved items will be all in loc
spawn(1) // slight delay to prevent infinite propagation due to map order
spawn(1) // slight delay to prevent infinite propagation due to map order //TODO: please no spawn() in process(). It's a very bad idea
var/items_moved = 0
for(var/atom/movable/A in affecting)
if(!A.anchored)
+1 -1
View File
@@ -82,7 +82,7 @@ var/global/list/obj/machinery/message_server/message_servers = list()
/obj/machinery/message_server/process()
//if(decryptkey == "password")
// decryptkey = generateKey()
if((stat & (BROKEN|NOPOWER)) && active)
if(active && (stat & (BROKEN|NOPOWER)))
active = 0
return
update_icon()
+2 -2
View File
@@ -90,7 +90,7 @@
..()
/obj/machinery/r_n_d/server/proc/
//Backup files to centcomm to help admins recover data after greifer attacks
/obj/machinery/r_n_d/server/proc/griefProtection()
for(var/obj/machinery/r_n_d/server/centcom/C in world)
@@ -190,7 +190,7 @@
no_id_servers -= S
/obj/machinery/r_n_d/server/centcom/process()
return
return PROCESS_KILL //don't need process()
/obj/machinery/computer/rdservercontrol