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/
Wiki: http://baystation12.net/wiki/
Install Guide: http://baystation12.net/wiki/index.php/Install
Code: https://github.com/Baystation12/Baystation12
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
================================================================================
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
/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
R.my_atom = src
R.add_reagent("fuel", max_fuel)

View File

@@ -3,7 +3,7 @@
var/level = 2
var/flags = FPRINT
var/list/fingerprints = list()
var/list/fingerprintshidden = new/list()
var/list/fingerprintshidden = list()
var/fingerprintslast = null
var/list/blood_DNA = list()
var/last_bumped = 0
@@ -12,6 +12,9 @@
///Chemistry.
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
// replaced by OPENCONTAINER flags and atom/proc/is_open_container()
///Chemistry.

View File

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

View File

@@ -93,11 +93,13 @@
var/mob/living/carbon/human/H = M
if (!istype(H.dna, /datum/dna))
return 0
if (H.gloves)
if (H.gloves && H.gloves != src)
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
H.gloves.add_fingerprint(M)
if (H.dna.uni_identity)
if(H.gloves != src)
if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex))
return 0
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
if(!src.fingerprints)
src.fingerprints = list()
if(istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/M = src
M.update_clothing()
return
/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.
*/
/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.
/proc/space_ninja_arrival()

View File

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

View File

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

View File

@@ -360,9 +360,9 @@
// if (subject.suiciding == 1)
// src.temp = "Error: Subject's brain is not responding to scanning stimuli."
// return
if ((!subject.ckey) || (!subject.client))
src.temp = "Error: Mental interface failure."
return
// if ((!subject.ckey) || (!subject.client))
// src.temp = "Error: Mental interface failure."
// return
if (subject.mutations & HUSK)
src.temp = "Error: Mental interface failure."
return
@@ -372,9 +372,13 @@
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( )
R.fields["mrace"] = subject.mutantrace
R.fields["ckey"] = subject.ckey
R.fields["ckey"] = ckey
R.fields["name"] = subject.real_name
R.fields["id"] = copytext(md5(subject.real_name), 2, 6)
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>"
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
var/who = src.owner
if(prob(50))
@@ -763,8 +767,19 @@
user << "\blue Unable to locate any fingerprints on [A]!"
else
user << "\blue Isolated [A:fingerprints.len] fingerprints."
// for(var/i in L)
// user << "\blue \t [i]"
var/list/prints = A:fingerprints
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(!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
for(var/i = 1, i < (stored.len + 1), i++) //Lets see if the object is already in there!
var/list/temp = stored[i]
var/checker = temp[1]
if(checker == A) //It is! Merge!
var/atom/checker = temp[1]
if(checker.original_atom == A || checker.original_atom == A.original_atom) //It is! Merge!
merged = 1
var/list/prints = temp[2]
if(!prints)
@@ -239,7 +239,7 @@ MASS SPECTROMETER
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
blood += A.blood_DNA[j]
var/list/sum_list[4] //Pack it back up!
sum_list[1] = A
sum_list[1] = checker
sum_list[2] = prints
sum_list[3] = fibers
sum_list[4] = blood
@@ -247,7 +247,7 @@ MASS SPECTROMETER
break //We found it, we're done here.
if(!merged) //Uh, oh! New data point!
var/list/sum_list[4] //Pack it back up!
sum_list[1] = A
sum_list[1] = A.get_duplicate(src)
if(!A.fingerprints)
world << "Report this to a dev! [A] was lacking a list() for fingerprints!"
sum_list[2] = list()

View File

@@ -59,6 +59,26 @@
/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.healthcheck()
..()

View File

@@ -219,6 +219,7 @@
return
src.created_name = t
user.update_clothing()
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)
comp.current << "These are your laws now:"
comp.current.show_laws()
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
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
@@ -1222,6 +1215,13 @@ turf/simulated/floor/return_siding_icon_state()
del(A)
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 = 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]."
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
//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()
I.loc = src
else
temp = "Invalid Object Rejected."
usr << "Invalid Object Rejected."
if("card")
var/mob/M = usr
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))
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()
I.loc = src
process_card()
@@ -181,8 +204,16 @@ obj/machinery/computer/forensic_scanning
usr << "\red Invalid Object Rejected."
if("database")
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))
temp = "Database is empty."
for(var/atom/A in contents)
if(A == scanning)
continue
del(A)
else
if(files && files.len)
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>"
else
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=database'>{Return}</a>"
if("databaseprint")
@@ -305,7 +336,7 @@ obj/machinery/computer/forensic_scanning
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
else
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=database'>{Return}</a>"
if("auxiliaryprint")
@@ -427,10 +458,6 @@ obj/machinery/computer/forensic_scanning
temp = "Print Failed: No Data"
if("erase")
scan_data = ""
if("delete_aux")
delete_record(text2num(href_list["identifier"]))
if("delete")
delete_dossier(text2num(href_list["identifier"]))
if("cancel")
scan_process = 0
if("add")
@@ -448,6 +475,10 @@ obj/machinery/computer/forensic_scanning
add_fingerprint(usr)
files = list()
misc = list()
for(var/atom/A in contents)
if(A == scanning)
continue
del(A)
return
@@ -460,6 +491,9 @@ obj/machinery/computer/forensic_scanning
var/list/data = W.stored[i]
add_data(data[1],1,data[2],data[3],data[4])
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)
@@ -483,8 +517,8 @@ obj/machinery/computer/forensic_scanning
if(misc)
for(var/i = 1, i <= misc.len, i++) //Lets see if we can find it.
var/list/templist = misc[i]
var/check = templist[1]
if(check == A) //There it is!
var/atom/check = templist[1]
if(check.original_atom == A || check.original_atom == A.original_atom) //There it is!
merged = 1
var/list/fibers = templist[2]
if(!fibers)
@@ -501,14 +535,14 @@ obj/machinery/computer/forensic_scanning
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
blood += A.blood_DNA[j]
var/list/sum_list[3] //Pack it back up!
sum_list[1] = A
sum_list[1] = check
sum_list[2] = fibers
sum_list[3] = blood
misc[i] = sum_list //Store it!
break //We found it, we're done here.
if(!merged) //Nope! Guess we have to add it!
var/list/templist[3]
templist[1] = A
templist[1] = A.get_duplicate(src)
templist[2] = A.suit_fibers
templist[3] = A.blood_DNA
misc.len++
@@ -532,7 +566,8 @@ obj/machinery/computer/forensic_scanning
found_prints[m] = 1
for(var/n = 2, n <= perp_list.len, n++) //Lets see if it is already in the database
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
var/list/prints = target[2]
if(!prints)
@@ -566,7 +601,7 @@ obj/machinery/computer/forensic_scanning
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
blood += A.blood_DNA[j]
var/list/sum_list[4] //Pack it back up!
sum_list[1] = A
sum_list[1] = atom_checker
sum_list[2] = prints
sum_list[3] = fibers
sum_list[4] = blood
@@ -575,7 +610,7 @@ obj/machinery/computer/forensic_scanning
break //We found it, we're done here.
if(!found2) //Add a new datapoint to this perp!
var/list/sum_list[4]
sum_list[1] = A
sum_list[1] = A.get_duplicate(src)
sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers
sum_list[4] = A.blood_DNA
@@ -586,7 +621,7 @@ obj/machinery/computer/forensic_scanning
if(found_prints[m] == 0)
var/list/newperp[2]
var/list/sum_list[4]
sum_list[1] = A
sum_list[1] = A.get_duplicate(src)
sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers
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
//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++)
var/list/test_prints = params2list(card.fingerprints[k])
var/print = test_prints[num2text(1)]
@@ -641,6 +676,12 @@ obj/machinery/computer/forensic_scanning
files[i] = test_list
break
del(card)
else
usr << "\red ERROR: No prints/too many cards."
if(card.loc == src)
card.loc = src.loc
card = null
return
return
proc/delete_record(var/location)

View File

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

View File

@@ -1747,7 +1747,18 @@
J.spawn_positions = -1
message_admins("[key_name_admin(usr)] has removed the cap on security officers.")
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

View File

@@ -141,6 +141,7 @@
verbs += /client/proc/callprocobj
verbs += /client/proc/cmd_debug_prints
verbs += /client/proc/cmd_debug_blood
verbs += /client/proc/rnd_check_designs
if (holder.level >= 5)//Game Admin********************************************************************
verbs += /obj/admins/proc/view_txt_log
@@ -422,6 +423,7 @@
verbs -= /client/proc/radioalert
verbs -= /client/proc/cmd_debug_prints
verbs -= /client/proc/cmd_debug_blood
verbs -= /client/proc/rnd_check_designs
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
/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()
if(stat & NOPOWER) return
if(!charging_reagents) return
if(!charging_reagents || src.energy > 30) return
use_power(10000)
src.energy += 0.05
@@ -331,7 +331,7 @@
else if(href_list["pill_sprite"])
pillsprite = href_list["pill_sprite"]
else if(href_list["bottle_sprite"])
bottlesprite = href_list["bottlesprite"]
bottlesprite = href_list["bottle_sprite"]
else
usr << browse(null, "window=chem_master")
src.updateUsrDialog()

View File

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

View File

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

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

@@ -20,33 +20,51 @@
if (!src.laws)
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)
src.laws_sanity_check()
src.laws.set_zeroth_law(law)
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/add_inherent_law(var/law)
src.laws_sanity_check()
src.laws.add_inherent_law(law)
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/clear_inherent_laws()
src.laws_sanity_check()
src.laws.clear_inherent_laws()
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/add_ion_law(var/law)
src.laws_sanity_check()
src.laws.add_ion_law(law)
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/clear_ion_laws()
src.laws_sanity_check()
src.laws.clear_ion_laws()
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/add_supplied_law(var/number, var/law)
src.laws_sanity_check()
src.laws.add_supplied_law(number, law)
src.notify_linked_cyborgs()
/mob/living/silicon/ai/proc/clear_supplied_laws()
src.laws_sanity_check()
src.laws.clear_supplied_laws()
src.notify_linked_cyborgs()

View File

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

View File

@@ -170,13 +170,7 @@ datum/preferences
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 += "<hr><b>Disabilities: </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><a href=\"byond://?src=\ref[user];preferences=1;disabilities=-1\">Disabilities</a></b><br>"
dat += "<hr><b>Flavor Text</b><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)
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)
return job_alt_titles.Find(job.title) > 0 \
? job_alt_titles[job.title] \
@@ -694,7 +708,13 @@ datum/preferences
midis = 1
disabilities = 0
if(link_tags["disabilities"])
if(text2num(link_tags["disabilities"]) >= -1)
if(text2num(link_tags["disabilities"]) >= 0)
disabilities ^= (1<<text2num(link_tags["disabilities"])) //MAGIC
SetDisabilities(user)
return
else
user << browse(null, "window=disabil")
ShowChoices(user)

View File

@@ -221,8 +221,7 @@
/obj/item/proc/wrap(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/weapon/packageWrap))
var/obj/item/weapon/packageWrap/C = I
if(!istype(src.loc,/turf))
user << "\red You need to place the item on the ground or a table before wrapping it!"
if(anchored)
return
else if (C.amount > 1)
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)
build_path = "/obj/item/weapon/circuitboard/supplycomp"
/* is not a thing
mining
name = "Circuit Design (Outpost Status Display)"
desc = "Allows for the construction of circuit boards used to build an outpost status display console."
@@ -338,6 +339,7 @@ datum
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/mining"
*/
firealarm
name = "Circuit Design (Fire Alarm)"
@@ -533,30 +535,34 @@ datum
req_tech = list("programming" = 4, "engineering" = 3, "bluespace" = 2)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/telecomms/receiver"
telecomms_bus
name = "Circuit Design (Bus Mainframe)"
name = "Circuit Design (Telecom Bus Mainframe)"
desc = "Allows for the construction of Telecommunications Bus Mainframes."
id = "s-bus"
req_tech = list("programming" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/telecomms/bus"
telecomms_processor
name = "Circuit Design (Processor Unit)"
name = "Circuit Design (Telecom Processor Unit)"
desc = "Allows for the construction of Telecommunications Processor equipment."
id = "s-processor"
req_tech = list("programming" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/telecomms/processor"
telecomms_server
name = "Circuit Design (Subspace Receiver)"
name = "Circuit Design (Telecom Server)"
desc = "Allows for the construction of Telecommunications Servers."
id = "s-server"
req_tech = list("programming" = 4, "engineering" = 4)
build_type = IMPRINTER
materials = list("$glass" = 2000, "acid" = 20)
build_path = "/obj/item/weapon/circuitboard/telecomms/server"
subspace_broadcaster
name = "Circuit Design (Subspace Broadcaster)"
@@ -565,6 +571,7 @@ datum
req_tech = list("programming" = 4, "engineering" = 4, "bluespace" = 2)
build_type = IMPRINTER
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