Merge branch 'master' of github.com:Baystation12/Baystation12

Conflicts:
	baystation12.dme
This commit is contained in:
cib
2012-02-24 06:41:38 -08:00
33 changed files with 8710 additions and 8023 deletions

View File

@@ -1,72 +1,10 @@
baystation 12 Baystation 12
Website: http://baystation12.net/ Website: http://baystation12.net/
Wiki: http://baystation12.net/wiki/
Install Guide: http://baystation12.net/wiki/index.php/Install
Code: https://github.com/Baystation12/Baystation12 Code: https://github.com/Baystation12/Baystation12
IRC: irc://irc.sorcery.net/bs12 IRC: irc://irc.sorcery.net/bs12
based on the code of tgstation13, itself based on the code of goonstation13. Based on the code of tgstation13, itself based on the code of goonstation13.
tgstation13 - http://code.google.com/p/tgstation13 tgstation13 - http://code.google.com/p/tgstation13
================================================================================
INSTALLATION
================================================================================
First-time installation should be fairly straightforward. First, you'll need
BYOND installed. You can get it from http://www.byond.com/. Once you've done
that, extract the game files to wherever you want to keep them. This is a
sourcecode-only release, so the next step is to compile the server files.
Open tgstation.dme by double-clicking it, open the Build menu, and click
compile. This'll take a little while, and if everything's done right you'll get
a message like this:
saving tgstation.dmb (DEBUG mode)
tgstation.dmb - 0 errors, 0 warnings
If you see any errors or warnings, something has gone wrong - possibly a corrupt
download or the files extracted wrong.
Once that's done, open up the config folder. You'll want to edit config.txt to
set the probabilities for different gamemodes in Secret and to set your server
location so that all your players don't get disconnected at the end of each
round. It's recommended you don't turn on the gamemodes with probability 0,
except Extended, as they have various issues and aren't currently being tested,
so they may have unknown and bizarre bugs. Extended is essentially no mode, and
isn't in the Secret rotation by default as it's just not very fun.
You'll also want to edit admins.txt to remove the default admins and add your
own. "Game Master" is the highest level of access, and the other recommended admin
levels for now are "Game Admin" (a little below host) and "Moderator". The format is
byondkey - Rank
where the BYOND key must be in lowercase and the admin rank must be properly
capitalised. There are a bunch more admin ranks, but these three should be
enough for most servers, assuming you have trustworthy admins.
Finally, to start the server, run Dream Daemon and enter the path to your
compiled tgstation.dmb file. Make sure to set the port to the one you
specified in the config.txt, and set the Security box to 'Safe'. Then press GO
and the server should start up and be ready to join.
================================================================================
UPDATING
================================================================================
To update an existing installation, first back up your /config and /data folders
as these store your server configuration, player preferences and banlist.
Then, extract the new files (preferably into a clean directory, but updating in
place should work fine), copy your /config and /data folders back into the new
install, overwriting when prompted except if we've specified otherwise, and
recompile the game. Once you start the server up again, you should be running
the new version.
================================================================================
SQL Setup
================================================================================
The SQL backend for the library, karma system and stats tracking requires a
MySQL server. Your server details go in /config/dbconfig.txt, and the SQL
schema is in /SQL/tgstation_schema.sql. More detailed setup instructions are
coming soon, for now ask in our IRC channel.

View File

View File

@@ -7,7 +7,7 @@
var/max_fuel = 350 var/max_fuel = 350
/obj/item/weapon/weldpack/New() /obj/item/weapon/weldpack/New()
var/datum/reagents/R = new/datum/reagents(max_fuel) //5 refills var/datum/reagents/R = new/datum/reagents(max_fuel) //Lotsa refills
reagents = R reagents = R
R.my_atom = src R.my_atom = src
R.add_reagent("fuel", max_fuel) R.add_reagent("fuel", max_fuel)

View File

@@ -3,7 +3,7 @@
var/level = 2 var/level = 2
var/flags = FPRINT var/flags = FPRINT
var/list/fingerprints = list() var/list/fingerprints = list()
var/list/fingerprintshidden = new/list() var/list/fingerprintshidden = list()
var/fingerprintslast = null var/fingerprintslast = null
var/list/blood_DNA = list() var/list/blood_DNA = list()
var/last_bumped = 0 var/last_bumped = 0
@@ -12,6 +12,9 @@
///Chemistry. ///Chemistry.
var/datum/reagents/reagents = null var/datum/reagents/reagents = null
//Detective Work, used for the duplicate data points kept in the scanners
var/atom/original_atom = null
//var/chem_is_open_container = 0 //var/chem_is_open_container = 0
// replaced by OPENCONTAINER flags and atom/proc/is_open_container() // replaced by OPENCONTAINER flags and atom/proc/is_open_container()
///Chemistry. ///Chemistry.

View File

@@ -387,7 +387,7 @@
icon_state = "seed-carrot" icon_state = "seed-carrot"
mypath = "/obj/item/seeds/carrotseed" mypath = "/obj/item/seeds/carrotseed"
species = "carrot" species = "carrot"
plantname = "CURROTS MAN CURROTS" plantname = "Carrot"
productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/carrot" productname = "/obj/item/weapon/reagent_containers/food/snacks/grown/carrot"
lifespan = 25 lifespan = 25
endurance = 15 endurance = 15

View File

@@ -93,11 +93,13 @@
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
if (!istype(H.dna, /datum/dna)) if (!istype(H.dna, /datum/dna))
return 0 return 0
if (H.gloves) if (H.gloves && H.gloves != src)
if(src.fingerprintslast != H.key) if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key) src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key src.fingerprintslast = H.key
H.gloves.add_fingerprint(M)
if (H.dna.uni_identity) if (H.dna.uni_identity)
if(H.gloves != src)
if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex)) if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex))
return 0 return 0
else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex)) else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex))
@@ -302,6 +304,9 @@
src.fingerprints[i] = "1=" + prints["1"] + "&2=" + new_print src.fingerprints[i] = "1=" + prints["1"] + "&2=" + new_print
if(!src.fingerprints) if(!src.fingerprints)
src.fingerprints = list() src.fingerprints = list()
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/M = src
M.update_clothing()
return return
/atom/MouseDrop(atom/over_object as mob|obj|turf|area) /atom/MouseDrop(atom/over_object as mob|obj|turf|area)

View File

@@ -90,7 +90,7 @@ I decided to scrap round-specific objectives since keeping track of them would r
When I already created about 4 new objectives, this doesn't seem terribly important or needed. When I already created about 4 new objectives, this doesn't seem terribly important or needed.
*/ */
/var/global/toggle_space_ninja = 1//If ninjas can spawn or not. /var/global/toggle_space_ninja = 0//If ninjas can spawn or not.
/var/global/sent_ninja_to_station = 0//If a ninja is already on the station. /var/global/sent_ninja_to_station = 0//If a ninja is already on the station.
/proc/space_ninja_arrival() /proc/space_ninja_arrival()

View File

@@ -159,7 +159,7 @@ var/global/datum/controller/occupations/job_master
if(unassigned.len == 0) return 0 if(unassigned.len == 0) return 0
//Shuffle players and jobs //Shuffle players and jobs
unassigned = shuffle(unassigned) unassigned = shuffle(unassigned)
// occupations = shuffle(occupations) check and see if we can do this one occupations = shuffle(occupations)
//Assistants are checked first //Assistants are checked first
Debug("DO, Running Assistant Check 1") Debug("DO, Running Assistant Check 1")

View File

@@ -51,7 +51,7 @@
src.get_targets() src.get_targets()
src.icon_state = "cleanbot[src.on]" src.icon_state = "cleanbot[src.on]"
should_patrol = 0 should_patrol = 1
src.botcard = new /obj/item/weapon/card/id(src) src.botcard = new /obj/item/weapon/card/id(src)
src.botcard.access = get_access("Janitor") src.botcard.access = get_access("Janitor")

View File

@@ -360,9 +360,9 @@
// if (subject.suiciding == 1) // if (subject.suiciding == 1)
// src.temp = "Error: Subject's brain is not responding to scanning stimuli." // src.temp = "Error: Subject's brain is not responding to scanning stimuli."
// return // return
if ((!subject.ckey) || (!subject.client)) // if ((!subject.ckey) || (!subject.client))
src.temp = "Error: Mental interface failure." // src.temp = "Error: Mental interface failure."
return // return
if (subject.mutations & HUSK) if (subject.mutations & HUSK)
src.temp = "Error: Mental interface failure." src.temp = "Error: Mental interface failure."
return return
@@ -372,9 +372,13 @@
subject.dna.check_integrity() subject.dna.check_integrity()
var/ckey = subject.ckey
if(!ckey && subject && subject.mind)
ckey = subject.mind.key
var/datum/data/record/R = new /datum/data/record( ) var/datum/data/record/R = new /datum/data/record( )
R.fields["mrace"] = subject.mutantrace R.fields["mrace"] = subject.mutantrace
R.fields["ckey"] = subject.ckey R.fields["ckey"] = ckey
R.fields["name"] = subject.real_name R.fields["name"] = subject.real_name
R.fields["id"] = copytext(md5(subject.real_name), 2, 6) R.fields["id"] = copytext(md5(subject.real_name), 2, 6)
R.fields["UI"] = subject.dna.uni_identity R.fields["UI"] = subject.dna.uni_identity

View File

@@ -477,6 +477,10 @@
tnote += "<i><b>&rarr; To [P.owner]:</b></i><br>[t]<br>" tnote += "<i><b>&rarr; To [P.owner]:</b></i><br>[t]<br>"
P.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[P];choice=Message;target=\ref[src]'>[owner]</a>:</b></i><br>[t]<br>" P.tnote += "<i><b>&larr; From <a href='byond://?src=\ref[P];choice=Message;target=\ref[src]'>[owner]</a>:</b></i><br>[t]<br>"
// Give every ghost the ability to see all messages
for (var/mob/dead/observer/G in world)
G.show_message("<i>PDA message from <b>[src.owner]</b> to <b>[P:owner]</b>: [t]</i>")
if (prob(15)) //Give the AI a chance of intercepting the message if (prob(15)) //Give the AI a chance of intercepting the message
var/who = src.owner var/who = src.owner
if(prob(50)) if(prob(50))
@@ -763,8 +767,19 @@
user << "\blue Unable to locate any fingerprints on [A]!" user << "\blue Unable to locate any fingerprints on [A]!"
else else
user << "\blue Isolated [A:fingerprints.len] fingerprints." user << "\blue Isolated [A:fingerprints.len] fingerprints."
// for(var/i in L) var/list/prints = A:fingerprints
// user << "\blue \t [i]" var/list/complete_prints = list()
for(var/i in prints)
var/list/templist = params2list(i)
var/temp = stringpercent(templist["2"])
if(temp <= 6)
complete_prints += templist["2"]
if(complete_prints.len < 1)
user << "\blue No intact prints found"
else
user << "\blue Found [complete_prints.len] intact prints"
for(var/i in complete_prints)
user << "\blue " + i
if(3) if(3)
if(!isnull(A.reagents)) if(!isnull(A.reagents))

View File

@@ -1,27 +0,0 @@
/obj/item/device/geneticsanalyzer
name = "Genetics Analyser"
icon = 'device.dmi'
icon_state = "genetics"
w_class = 2
/obj/item/device/geneticsanalyzer/attack(mob/M as mob, mob/user as mob)
for(var/mob/O in viewers(M, null))
O.show_message(text("\red [] has analyzed []'s genetic code!", user, M), 1)
//Foreach goto(67)
user.show_message(text("\blue Analyzing Results for [M]: [M.dna.struc_enzymes]\n\t"), 1)
user.show_message(text("\blue \t Epilepsy: [isblockon(getblock(M.dna.struc_enzymes, HEADACHEBLOCK,3),HEADACHEBLOCK) ? "Yes" : "No"]"), 1)
user.show_message(text("\blue \t Cough: [isblockon(getblock(M.dna.struc_enzymes, COUGHBLOCK,3),COUGHBLOCK) ? "Yes" : "No"]"), 1)
user.show_message(text("\blue \t Clumsy: [isblockon(getblock(M.dna.struc_enzymes, CLUMSYBLOCK,3),CLUMSYBLOCK) ? "Yes" : "No"]"), 1)
user.show_message(text("\blue \t Twitch: [isblockon(getblock(M.dna.struc_enzymes, TWITCHBLOCK,3),TWITCHBLOCK) ? "Yes" : "No"]"), 1)
user.show_message(text("\blue \t Nervous: [isblockon(getblock(M.dna.struc_enzymes, NERVOUSBLOCK,3),NERVOUSBLOCK) ? "Yes" : "No"]"), 1)
user.show_message(text("\blue \t Blind: [isblockon(getblock(M.dna.struc_enzymes, BLINDBLOCK,3),BLINDBLOCK) ? "Yes" : "No"]"), 1)
user.show_message(text("\blue \t Deaf: [isblockon(getblock(M.dna.struc_enzymes, DEAFBLOCK,3),DEAFBLOCK) ? "Yes" : "No"]"), 1)
user.show_message(text("\blue \t Requires Glasses: [isblockon(getblock(M.dna.struc_enzymes, GLASSESBLOCK,3),GLASSESBLOCK) ? "Yes" : "No"]"), 1)
/*
var/unknow = 0
var/list/unknowns = list(HULKBLOCK,TELEBLOCK,FIREBLOCK,XRAYBLOCK,NOBREATHBLOCK,REMOTEVIEWBLOCK,REGENERATEBLOCK,INCREASERUNBLOCK,REMOTETALKBLOCK,MORPHBLOCK,BLENDBLOCK,HALLUCINATIONBLOCK,NOPRINTSBLOCK,SHOCKIMMUNITYBLOCK,SMALLSIZEBLOCK)
for(var/unknown in unknowns)
if(isblockon(getblock(M.dna.struc_enzymes, unknown,3),unknown))
unknow += 1
user.show_message(text("\blue \t Unknown Anomalies: [unknow]"))*/

View File

@@ -204,8 +204,8 @@ MASS SPECTROMETER
var/merged = 0 var/merged = 0
for(var/i = 1, i < (stored.len + 1), i++) //Lets see if the object is already in there! for(var/i = 1, i < (stored.len + 1), i++) //Lets see if the object is already in there!
var/list/temp = stored[i] var/list/temp = stored[i]
var/checker = temp[1] var/atom/checker = temp[1]
if(checker == A) //It is! Merge! if(checker.original_atom == A || checker.original_atom == A.original_atom) //It is! Merge!
merged = 1 merged = 1
var/list/prints = temp[2] var/list/prints = temp[2]
if(!prints) if(!prints)
@@ -239,7 +239,7 @@ MASS SPECTROMETER
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add! if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
blood += A.blood_DNA[j] blood += A.blood_DNA[j]
var/list/sum_list[4] //Pack it back up! var/list/sum_list[4] //Pack it back up!
sum_list[1] = A sum_list[1] = checker
sum_list[2] = prints sum_list[2] = prints
sum_list[3] = fibers sum_list[3] = fibers
sum_list[4] = blood sum_list[4] = blood
@@ -247,7 +247,7 @@ MASS SPECTROMETER
break //We found it, we're done here. break //We found it, we're done here.
if(!merged) //Uh, oh! New data point! if(!merged) //Uh, oh! New data point!
var/list/sum_list[4] //Pack it back up! var/list/sum_list[4] //Pack it back up!
sum_list[1] = A sum_list[1] = A.get_duplicate(src)
if(!A.fingerprints) if(!A.fingerprints)
world << "Report this to a dev! [A] was lacking a list() for fingerprints!" world << "Report this to a dev! [A] was lacking a list() for fingerprints!"
sum_list[2] = list() sum_list[2] = list()

View File

@@ -59,6 +59,26 @@
/obj/structure/displaycase/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/structure/displaycase/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/gun/energy/laser/captain))
if(!src.occupied)
user << "\b You put the [W] back into the display case."
del(W)
src.occupied = 1
update_icon()
return
if(istype(W, /obj/item/stack/sheet/glass))
if(src.occupied && src.destroyed)
var/obj/item/stack/sheet/glass/G = W
user << "\b You repair the display case."
G.amount--
if (G.amount <= 0)
user.update_clothing()
del(G)
src.destroyed = 0
src.density = 1
src.health = 30
update_icon()
return
src.health -= W.force src.health -= W.force
src.healthcheck() src.healthcheck()
..() ..()

View File

@@ -219,6 +219,7 @@
return return
src.created_name = t src.created_name = t
user.update_clothing()
return return

1
code/game/objects/items/weapons/AI_modules.dm Normal file → Executable file
View File

@@ -79,6 +79,7 @@ AI MODULES
src.transmitInstructions(comp.current, usr) src.transmitInstructions(comp.current, usr)
comp.current << "These are your laws now:" comp.current << "These are your laws now:"
comp.current.show_laws() comp.current.show_laws()
usr << "Upload complete. The AI's laws have been modified." usr << "Upload complete. The AI's laws have been modified."

View File

@@ -1207,13 +1207,6 @@ turf/simulated/floor/return_siding_icon_state()
if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels if(istype(A, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks travel Z levels
return return
if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear)))
if(istype(A, /mob/living))
var/mob/living/MM = A
if(MM.client)
MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is."
return
// else if(ticker.mode.name == "extended"||ticker.mode.name == "sandbox") Sandbox_Spacemove(A) // else if(ticker.mode.name == "extended"||ticker.mode.name == "sandbox") Sandbox_Spacemove(A)
else else
@@ -1222,6 +1215,13 @@ turf/simulated/floor/return_siding_icon_state()
del(A) del(A)
return return
if(!isemptylist(A.search_contents_for(/obj/item/weapon/disk/nuclear)))
if(istype(A, /mob/living))
var/mob/living/MM = A
if(MM.client)
MM << "\red Something you are carrying is preventing you from leaving. Don't play stupid; you know exactly what it is."
return
var/move_to_z_str = pickweight(accessable_z_levels) var/move_to_z_str = pickweight(accessable_z_levels)
var/move_to_z = text2num(move_to_z_str) var/move_to_z = text2num(move_to_z_str)

View File

@@ -49,6 +49,21 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
suit_fibers += "Material from a pair of [M.gloves.name]." suit_fibers += "Material from a pair of [M.gloves.name]."
if(!suit_fibers.len) del suit_fibers if(!suit_fibers.len) del suit_fibers
atom/proc/get_duplicate(var/atom/location)
var/atom/temp_atom = new src.type(location)
temp_atom.name = src.name
temp_atom.desc = src.desc
temp_atom.icon = src.icon
temp_atom.icon_state = src.icon_state
temp_atom.fingerprints = src.fingerprints
temp_atom.blood_DNA = src.blood_DNA
temp_atom.suit_fibers = src.suit_fibers
if(src.original_atom)
temp_atom.original_atom = src.original_atom
else
temp_atom.original_atom = src
return temp_atom
#define FINGERPRINT_COMPLETE 6 //This is the output of the stringpercent(print) proc, and means about 80% of #define FINGERPRINT_COMPLETE 6 //This is the output of the stringpercent(print) proc, and means about 80% of
//the print must be there for it to be complete. (Prints are 32 digits) //the print must be there for it to be complete. (Prints are 32 digits)
@@ -167,12 +182,20 @@ obj/machinery/computer/forensic_scanning
M.drop_item() M.drop_item()
I.loc = src I.loc = src
else else
temp = "Invalid Object Rejected." usr << "Invalid Object Rejected."
if("card") if("card")
var/mob/M = usr var/mob/M = usr
var/obj/item/I = M.equipped() var/obj/item/I = M.equipped()
if(!(I && istype(I,/obj/item/weapon/f_card)))
I = card
if(I && istype(I,/obj/item/weapon/f_card)) if(I && istype(I,/obj/item/weapon/f_card))
card = I card = I
if(card.amount > 1 || !card.fingerprints.len)
usr << "\red ERROR: No prints/too many cards."
if(card.loc == src)
card.loc = src.loc
card = null
return
M.drop_item() M.drop_item()
I.loc = src I.loc = src
process_card() process_card()
@@ -181,8 +204,16 @@ obj/machinery/computer/forensic_scanning
usr << "\red Invalid Object Rejected." usr << "\red Invalid Object Rejected."
if("database") if("database")
canclear = 1 canclear = 1
if(href_list["delete_record"])
delete_dossier(text2num(href_list["delete_record"]))
if(href_list["delete_aux"])
delete_record(text2num(href_list["delete_aux"]))
if((!misc || !misc.len) && (!files || !files.len)) if((!misc || !misc.len) && (!files || !files.len))
temp = "Database is empty." temp = "Database is empty."
for(var/atom/A in contents)
if(A == scanning)
continue
del(A)
else else
if(files && files.len) if(files && files.len)
temp = "<b>Criminal Evidence Database</b><br><br>" temp = "<b>Criminal Evidence Database</b><br><br>"
@@ -238,7 +269,7 @@ obj/machinery/computer/forensic_scanning
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>" temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
else else
temp = "ERROR. Database not found!<br>" temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=delete;identifier=[href_list["identifier"]]'>{delete}</a>" temp += "<br><a href='?src=\ref[src];operation=database;delete_record=[href_list["identifier"]]'>{Delete this Dossier}</a>"
temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>" temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>" temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("databaseprint") if("databaseprint")
@@ -305,7 +336,7 @@ obj/machinery/computer/forensic_scanning
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>" temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
else else
temp = "ERROR. Database not found!<br>" temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=delete_aux;identifier=[href_list["identifier"]]'>{Delete This Record}</a>" temp += "<br><a href='?src=\ref[src];operation=database;delete_aux=[href_list["identifier"]]'>{Delete This Record}</a>"
temp += "<br><a href='?src=\ref[src];operation=auxiliaryprint;identifier=[href_list["identifier"]]'>{Print}</a>" temp += "<br><a href='?src=\ref[src];operation=auxiliaryprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>" temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("auxiliaryprint") if("auxiliaryprint")
@@ -427,10 +458,6 @@ obj/machinery/computer/forensic_scanning
temp = "Print Failed: No Data" temp = "Print Failed: No Data"
if("erase") if("erase")
scan_data = "" scan_data = ""
if("delete_aux")
delete_record(text2num(href_list["identifier"]))
if("delete")
delete_dossier(text2num(href_list["identifier"]))
if("cancel") if("cancel")
scan_process = 0 scan_process = 0
if("add") if("add")
@@ -448,6 +475,10 @@ obj/machinery/computer/forensic_scanning
add_fingerprint(usr) add_fingerprint(usr)
files = list() files = list()
misc = list() misc = list()
for(var/atom/A in contents)
if(A == scanning)
continue
del(A)
return return
@@ -460,6 +491,9 @@ obj/machinery/computer/forensic_scanning
var/list/data = W.stored[i] var/list/data = W.stored[i]
add_data(data[1],1,data[2],data[3],data[4]) add_data(data[1],1,data[2],data[3],data[4])
W.stored = list() W.stored = list()
for(var/atom/A in W.contents)
del(A)
return
proc/add_data(var/atom/A, var/override = 0, var/tempfingerprints, var/tempsuit_fibers,var/tempblood_DNA) proc/add_data(var/atom/A, var/override = 0, var/tempfingerprints, var/tempsuit_fibers,var/tempblood_DNA)
@@ -483,8 +517,8 @@ obj/machinery/computer/forensic_scanning
if(misc) if(misc)
for(var/i = 1, i <= misc.len, i++) //Lets see if we can find it. for(var/i = 1, i <= misc.len, i++) //Lets see if we can find it.
var/list/templist = misc[i] var/list/templist = misc[i]
var/check = templist[1] var/atom/check = templist[1]
if(check == A) //There it is! if(check.original_atom == A || check.original_atom == A.original_atom) //There it is!
merged = 1 merged = 1
var/list/fibers = templist[2] var/list/fibers = templist[2]
if(!fibers) if(!fibers)
@@ -501,14 +535,14 @@ obj/machinery/computer/forensic_scanning
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add! if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
blood += A.blood_DNA[j] blood += A.blood_DNA[j]
var/list/sum_list[3] //Pack it back up! var/list/sum_list[3] //Pack it back up!
sum_list[1] = A sum_list[1] = check
sum_list[2] = fibers sum_list[2] = fibers
sum_list[3] = blood sum_list[3] = blood
misc[i] = sum_list //Store it! misc[i] = sum_list //Store it!
break //We found it, we're done here. break //We found it, we're done here.
if(!merged) //Nope! Guess we have to add it! if(!merged) //Nope! Guess we have to add it!
var/list/templist[3] var/list/templist[3]
templist[1] = A templist[1] = A.get_duplicate(src)
templist[2] = A.suit_fibers templist[2] = A.suit_fibers
templist[3] = A.blood_DNA templist[3] = A.blood_DNA
misc.len++ misc.len++
@@ -532,7 +566,8 @@ obj/machinery/computer/forensic_scanning
found_prints[m] = 1 found_prints[m] = 1
for(var/n = 2, n <= perp_list.len, n++) //Lets see if it is already in the database for(var/n = 2, n <= perp_list.len, n++) //Lets see if it is already in the database
var/list/target = perp_list[n] var/list/target = perp_list[n]
if(target[1] == A) //Found the original object! var/atom/atom_checker = target[1]
if(atom_checker.original_atom == A || atom_checker.original_atom == A.original_atom) //Found the original object!
found2 = 1 found2 = 1
var/list/prints = target[2] var/list/prints = target[2]
if(!prints) if(!prints)
@@ -566,7 +601,7 @@ obj/machinery/computer/forensic_scanning
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add! if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
blood += A.blood_DNA[j] blood += A.blood_DNA[j]
var/list/sum_list[4] //Pack it back up! var/list/sum_list[4] //Pack it back up!
sum_list[1] = A sum_list[1] = atom_checker
sum_list[2] = prints sum_list[2] = prints
sum_list[3] = fibers sum_list[3] = fibers
sum_list[4] = blood sum_list[4] = blood
@@ -575,7 +610,7 @@ obj/machinery/computer/forensic_scanning
break //We found it, we're done here. break //We found it, we're done here.
if(!found2) //Add a new datapoint to this perp! if(!found2) //Add a new datapoint to this perp!
var/list/sum_list[4] var/list/sum_list[4]
sum_list[1] = A sum_list[1] = A.get_duplicate(src)
sum_list[2] = A.fingerprints sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers sum_list[3] = A.suit_fibers
sum_list[4] = A.blood_DNA sum_list[4] = A.blood_DNA
@@ -586,7 +621,7 @@ obj/machinery/computer/forensic_scanning
if(found_prints[m] == 0) if(found_prints[m] == 0)
var/list/newperp[2] var/list/newperp[2]
var/list/sum_list[4] var/list/sum_list[4]
sum_list[1] = A sum_list[1] = A.get_duplicate(src)
sum_list[2] = A.fingerprints sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers sum_list[3] = A.suit_fibers
sum_list[4] = A.blood_DNA sum_list[4] = A.blood_DNA
@@ -628,7 +663,7 @@ obj/machinery/computer/forensic_scanning
proc/process_card() //I am tired, but this updates the master print from a fingerprint card proc/process_card() //I am tired, but this updates the master print from a fingerprint card
//which is used to determine completion of a print. //which is used to determine completion of a print.
if(card.fingerprints) if(card.fingerprints && !(card.amount > 1))
for(var/k = 1, k <= card.fingerprints.len, k++) for(var/k = 1, k <= card.fingerprints.len, k++)
var/list/test_prints = params2list(card.fingerprints[k]) var/list/test_prints = params2list(card.fingerprints[k])
var/print = test_prints[num2text(1)] var/print = test_prints[num2text(1)]
@@ -641,6 +676,12 @@ obj/machinery/computer/forensic_scanning
files[i] = test_list files[i] = test_list
break break
del(card) del(card)
else
usr << "\red ERROR: No prints/too many cards."
if(card.loc == src)
card.loc = src.loc
card = null
return
return return
proc/delete_record(var/location) proc/delete_record(var/location)

View File

@@ -17,7 +17,6 @@
/obj/item/weapon/evidencebag/afterattack(obj/item/O, mob/user as mob) /obj/item/weapon/evidencebag/afterattack(obj/item/O, mob/user as mob)
if(istype(O, /obj/item/weapon/storage) && O in user) if(istype(O, /obj/item/weapon/storage) && O in user)
user << "You put the evidence bag into the [O]."
return ..() return ..()
if(!(O && istype(O)) || O.anchored == 1) if(!(O && istype(O)) || O.anchored == 1)
user << "You can't put that inside the [src]!" user << "You can't put that inside the [src]!"

View File

@@ -1747,7 +1747,18 @@
J.spawn_positions = -1 J.spawn_positions = -1
message_admins("[key_name_admin(usr)] has removed the cap on security officers.") message_admins("[key_name_admin(usr)] has removed the cap on security officers.")
return return
//hahaha if (href_list["rnd_max"])
for(var/obj/machinery/computer/rdconsole/C in world)
for(var/datum/tech/T in C.files.known_tech)
T.level = 6
C.files.RefreshResearch()
for(var/obj/machinery/r_n_d/server/C in world)
for(var/datum/tech/T in C.files.known_tech)
T.level = 6
C.files.RefreshResearch()
owner:rnd_check_designs()
///////////////////////////////////////////////////////////////////////////////////////////////Panels ///////////////////////////////////////////////////////////////////////////////////////////////Panels

View File

@@ -141,6 +141,7 @@
verbs += /client/proc/callprocobj verbs += /client/proc/callprocobj
verbs += /client/proc/cmd_debug_prints verbs += /client/proc/cmd_debug_prints
verbs += /client/proc/cmd_debug_blood verbs += /client/proc/cmd_debug_blood
verbs += /client/proc/rnd_check_designs
if (holder.level >= 5)//Game Admin******************************************************************** if (holder.level >= 5)//Game Admin********************************************************************
verbs += /obj/admins/proc/view_txt_log verbs += /obj/admins/proc/view_txt_log
@@ -422,6 +423,7 @@
verbs -= /client/proc/radioalert verbs -= /client/proc/radioalert
verbs -= /client/proc/cmd_debug_prints verbs -= /client/proc/cmd_debug_prints
verbs -= /client/proc/cmd_debug_blood verbs -= /client/proc/cmd_debug_blood
verbs -= /client/proc/rnd_check_designs
return return

View File

@@ -862,4 +862,31 @@ Traitors and the like can also be revived with the previous role mostly intact.
ticker.random_players = 1 ticker.random_players = 1
/client/proc/rnd_check_designs()
set category = "Debug"
set name = "Check RnD Designs"
set desc = "Check validity of RnD data of the consoles and server."
if (!holder)
src << "Only administrators may use this command."
return
var/dat = "<head><title>RnD Check</title></head>"
for(var/obj/machinery/computer/rdconsole/C in world)
dat += "<b>[C.name] - RnD Console</b><br>"
for(var/datum/design/D in C.files.known_designs)
if(!text2path(D.build_path))
dat += "[D.name]'s has invalid build path [D.build_path]<br>"
dat += "<br>"
for(var/obj/machinery/r_n_d/server/C in world)
dat += "<b>[C.name] - Server</b><br>"
for(var/datum/design/D in C.files.known_designs)
if(!text2path(D.build_path))
dat += "[D.name]'s has invalid build path [D.build_path]<br>"
dat += "<br>"
dat += "<hr><a href='?src=\ref[holder];rnd_max=1'>Max out tech levels.</a>"
usr << browse(dat, "window=chk_design")

View File

@@ -154,7 +154,7 @@
/obj/machinery/chem_dispenser/process() /obj/machinery/chem_dispenser/process()
if(stat & NOPOWER) return if(stat & NOPOWER) return
if(!charging_reagents) return if(!charging_reagents || src.energy > 30) return
use_power(10000) use_power(10000)
src.energy += 0.05 src.energy += 0.05
@@ -331,7 +331,7 @@
else if(href_list["pill_sprite"]) else if(href_list["pill_sprite"])
pillsprite = href_list["pill_sprite"] pillsprite = href_list["pill_sprite"]
else if(href_list["bottle_sprite"]) else if(href_list["bottle_sprite"])
bottlesprite = href_list["bottlesprite"] bottlesprite = href_list["bottle_sprite"]
else else
usr << browse(null, "window=chem_master") usr << browse(null, "window=chem_master")
src.updateUsrDialog() src.updateUsrDialog()

View File

@@ -1413,6 +1413,7 @@
else user << "\red [M] finishes eating [src]." else user << "\red [M] finishes eating [src]."
del(src) del(src)
playsound(M.loc,'eatfood.ogg', rand(10,50), 1) playsound(M.loc,'eatfood.ogg', rand(10,50), 1)
user.update_clothing()
return 1 return 1
else if(istype(M, /mob/living/simple_animal/livestock)) else if(istype(M, /mob/living/simple_animal/livestock))
if(M == user) //If you're eating it yourself. if(M == user) //If you're eating it yourself.
@@ -1465,6 +1466,8 @@
if(!reagents.total_volume) if(!reagents.total_volume)
if(M == user) user << "\red You finish eating [src]." if(M == user) user << "\red You finish eating [src]."
else user << "\red [M] finishes eating [src]." else user << "\red [M] finishes eating [src]."
spawn(2)
user.update_clothing()
del(src) del(src)
playsound(M.loc,'eatfood.ogg', rand(10,50), 1) playsound(M.loc,'eatfood.ogg', rand(10,50), 1)
return 1 return 1

View File

@@ -130,7 +130,7 @@
var/pr = 50 var/pr = 50
if(prob(pr)) if(prob(pr))
adjustToxLoss(1) adjustToxLoss(1)
else else if (stat != 0)
if(!lying) if(!lying)
lying = 1 //Seriously, stay down :x lying = 1 //Seriously, stay down :x
update_clothing() update_clothing()

18
code/modules/mob/living/silicon/ai/laws.dm Normal file → Executable file
View File

@@ -20,33 +20,51 @@
if (!src.laws) if (!src.laws)
src.laws = new /datum/ai_laws/nanotrasen src.laws = new /datum/ai_laws/nanotrasen
/mob/living/silicon/ai/proc/notify_linked_cyborgs()
for (var/mob/living/silicon/robot/A in world)
if(A.stat == 2)
continue
if(!islinked(A, src))
continue
A << "These are your laws now:"
A.show_laws()
/mob/living/silicon/ai/proc/set_zeroth_law(var/law) /mob/living/silicon/ai/proc/set_zeroth_law(var/law)
src.laws_sanity_check() src.laws_sanity_check()
src.laws.set_zeroth_law(law) src.laws.set_zeroth_law(law)
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/add_inherent_law(var/law) /mob/living/silicon/ai/proc/add_inherent_law(var/law)
src.laws_sanity_check() src.laws_sanity_check()
src.laws.add_inherent_law(law) src.laws.add_inherent_law(law)
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/clear_inherent_laws() /mob/living/silicon/ai/proc/clear_inherent_laws()
src.laws_sanity_check() src.laws_sanity_check()
src.laws.clear_inherent_laws() src.laws.clear_inherent_laws()
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/add_ion_law(var/law) /mob/living/silicon/ai/proc/add_ion_law(var/law)
src.laws_sanity_check() src.laws_sanity_check()
src.laws.add_ion_law(law) src.laws.add_ion_law(law)
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/clear_ion_laws() /mob/living/silicon/ai/proc/clear_ion_laws()
src.laws_sanity_check() src.laws_sanity_check()
src.laws.clear_ion_laws() src.laws.clear_ion_laws()
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/add_supplied_law(var/number, var/law) /mob/living/silicon/ai/proc/add_supplied_law(var/number, var/law)
src.laws_sanity_check() src.laws_sanity_check()
src.laws.add_supplied_law(number, law) src.laws.add_supplied_law(number, law)
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/clear_supplied_laws() /mob/living/silicon/ai/proc/clear_supplied_laws()
src.laws_sanity_check() src.laws_sanity_check()
src.laws.clear_supplied_laws() src.laws.clear_supplied_laws()
src.notify_linked_cyborgs()

View File

@@ -188,6 +188,7 @@
var/turf/T = get_turf(loc) var/turf/T = get_turf(loc)
if (istype(T)) if (istype(T))
T.Entered(W) T.Entered(W)
update_clothing()
return return
/mob/proc/before_take_item(var/obj/item/item) /mob/proc/before_take_item(var/obj/item/item)

View File

@@ -170,13 +170,7 @@ datum/preferences
dat += "<hr><b>Eyes</b><br>" dat += "<hr><b>Eyes</b><br>"
dat += "<a href='byond://?src=\ref[user];preferences=1;eyes=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes, 2)]\"><table style='display:inline;' bgcolor=\"#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes)]\"><tr><td>__</td></tr></table></font>" dat += "<a href='byond://?src=\ref[user];preferences=1;eyes=input'>Change Color</a> <font face=\"fixedsys\" size=\"3\" color=\"#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes, 2)]\"><table style='display:inline;' bgcolor=\"#[num2hex(r_eyes, 2)][num2hex(g_eyes, 2)][num2hex(b_eyes)]\"><tr><td>__</td></tr></table></font>"
dat += "<hr><b>Disabilities: </b><br>" dat += "<hr><b><a href=\"byond://?src=\ref[user];preferences=1;disabilities=-1\">Disabilities</a></b><br>"
dat += "Need Glasses? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=0\">[disabilities & (1<<0) ? "Yes" : "No"]</a><br>"
dat += "Seizures? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=1\">[disabilities & (1<<1) ? "Yes" : "No"]</a><br>"
dat += "Coughing? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=2\">[disabilities & (1<<2) ? "Yes" : "No"]</a><br>"
dat += "Tourettes/Twitching? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=3\">[disabilities & (1<<3) ? "Yes" : "No"]</a><br>"
dat += "Nervousness? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=4\">[disabilities & (1<<4) ? "Yes" : "No"]</a><br>"
dat += "Deafness? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=5\">[disabilities & (1<<5) ? "Yes" : "No"]</a><br>"
dat += "<hr><b>Flavor Text</b><br>" dat += "<hr><b>Flavor Text</b><br>"
dat += "<a href='byond://?src=\ref[user];preferences=1;flavor_text=1'>Change</a><br>" dat += "<a href='byond://?src=\ref[user];preferences=1;flavor_text=1'>Change</a><br>"
@@ -224,6 +218,26 @@ datum/preferences
proc/closesave(mob/user) proc/closesave(mob/user)
user << browse(null, "window=saves;size=300x640") user << browse(null, "window=saves;size=300x640")
proc/SetDisabilities(mob/user)
var/HTML = "<body>"
HTML += "<tt><center>"
HTML += "<b>Choose disabilities</b><br>"
HTML += "Need Glasses? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=0\">[disabilities & (1<<0) ? "Yes" : "No"]</a><br>"
HTML += "Seizures? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=1\">[disabilities & (1<<1) ? "Yes" : "No"]</a><br>"
HTML += "Coughing? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=2\">[disabilities & (1<<2) ? "Yes" : "No"]</a><br>"
HTML += "Tourettes/Twitching? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=3\">[disabilities & (1<<3) ? "Yes" : "No"]</a><br>"
HTML += "Nervousness? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=4\">[disabilities & (1<<4) ? "Yes" : "No"]</a><br>"
HTML += "Deafness? <a href=\"byond://?src=\ref[user];preferences=1;disabilities=5\">[disabilities & (1<<5) ? "Yes" : "No"]</a><br>"
HTML += "<br>"
HTML += "<a href=\"byond://?src=\ref[user];preferences=1;disabilities=-2\">\[Done\]</a>"
HTML += "</center></tt>"
user << browse(null, "window=preferences")
user << browse(HTML, "window=disabil;size=350x300")
return
proc/GetAltTitle(datum/job/job) proc/GetAltTitle(datum/job/job)
return job_alt_titles.Find(job.title) > 0 \ return job_alt_titles.Find(job.title) > 0 \
? job_alt_titles[job.title] \ ? job_alt_titles[job.title] \
@@ -694,7 +708,13 @@ datum/preferences
midis = 1 midis = 1
disabilities = 0 disabilities = 0
if(link_tags["disabilities"]) if(link_tags["disabilities"])
if(text2num(link_tags["disabilities"]) >= -1)
if(text2num(link_tags["disabilities"]) >= 0)
disabilities ^= (1<<text2num(link_tags["disabilities"])) //MAGIC disabilities ^= (1<<text2num(link_tags["disabilities"])) //MAGIC
SetDisabilities(user)
return
else
user << browse(null, "window=disabil")
ShowChoices(user) ShowChoices(user)

View File

@@ -221,8 +221,7 @@
/obj/item/proc/wrap(obj/item/I as obj, mob/user as mob) /obj/item/proc/wrap(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/weapon/packageWrap)) if(istype(I, /obj/item/weapon/packageWrap))
var/obj/item/weapon/packageWrap/C = I var/obj/item/weapon/packageWrap/C = I
if(!istype(src.loc,/turf)) if(anchored)
user << "\red You need to place the item on the ground or a table before wrapping it!"
return return
else if (C.amount > 1) else if (C.amount > 1)
var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(src.loc)) var/obj/item/smallDelivery/P = new /obj/item/smallDelivery(get_turf(src.loc))

View File

@@ -330,6 +330,7 @@ datum
materials = list("$glass" = 2000, "acid" = 20) materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/supplycomp" build_path = "/obj/item/weapon/circuitboard/supplycomp"
/* is not a thing
mining mining
name = "Circuit Design (Outpost Status Display)" name = "Circuit Design (Outpost Status Display)"
desc = "Allows for the construction of circuit boards used to build an outpost status display console." desc = "Allows for the construction of circuit boards used to build an outpost status display console."
@@ -338,6 +339,7 @@ datum
build_type = IMPRINTER build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20) materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/mining" build_path = "/obj/item/weapon/circuitboard/mining"
*/
firealarm firealarm
name = "Circuit Design (Fire Alarm)" name = "Circuit Design (Fire Alarm)"
@@ -533,30 +535,34 @@ datum
req_tech = list("programming" = 4, "engineering" = 3, "bluespace" = 2) req_tech = list("programming" = 4, "engineering" = 3, "bluespace" = 2)
build_type = IMPRINTER build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20) materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/telecomms/receiver"
telecomms_bus telecomms_bus
name = "Circuit Design (Bus Mainframe)" name = "Circuit Design (Telecom Bus Mainframe)"
desc = "Allows for the construction of Telecommunications Bus Mainframes." desc = "Allows for the construction of Telecommunications Bus Mainframes."
id = "s-bus" id = "s-bus"
req_tech = list("programming" = 4, "engineering" = 4) req_tech = list("programming" = 4, "engineering" = 4)
build_type = IMPRINTER build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20) materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/telecomms/bus"
telecomms_processor telecomms_processor
name = "Circuit Design (Processor Unit)" name = "Circuit Design (Telecom Processor Unit)"
desc = "Allows for the construction of Telecommunications Processor equipment." desc = "Allows for the construction of Telecommunications Processor equipment."
id = "s-processor" id = "s-processor"
req_tech = list("programming" = 4, "engineering" = 4) req_tech = list("programming" = 4, "engineering" = 4)
build_type = IMPRINTER build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20) materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/telecomms/processor"
telecomms_server telecomms_server
name = "Circuit Design (Subspace Receiver)" name = "Circuit Design (Telecom Server)"
desc = "Allows for the construction of Telecommunications Servers." desc = "Allows for the construction of Telecommunications Servers."
id = "s-server" id = "s-server"
req_tech = list("programming" = 4, "engineering" = 4) req_tech = list("programming" = 4, "engineering" = 4)
build_type = IMPRINTER build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20) materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/telecomms/server"
subspace_broadcaster subspace_broadcaster
name = "Circuit Design (Subspace Broadcaster)" name = "Circuit Design (Subspace Broadcaster)"
@@ -565,6 +571,7 @@ datum
req_tech = list("programming" = 4, "engineering" = 4, "bluespace" = 2) req_tech = list("programming" = 4, "engineering" = 4, "bluespace" = 2)
build_type = IMPRINTER build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20) materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/telecomms/broadcaster"
/////////////////////////////////// ///////////////////////////////////

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 63 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff