mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-28 06:27:26 +01:00
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:
+417
-4
@@ -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()
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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!
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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)
|
||||
..()
|
||||
|
||||
@@ -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"
|
||||
@@ -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 ))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,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
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user