diff --git a/baystation12.dme b/baystation12.dme index 2ae88b5da8..5e432fe41c 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -517,7 +517,7 @@ #include "code\game\machinery\computer\id.dm" #include "code\game\machinery\computer\lockdown.dm" #include "code\game\machinery\computer\medical.dm" -#include "code\game\machinery\computer\Operating.dm" +#include "code\game\machinery\computer\operating.dm" #include "code\game\machinery\computer\power.dm" #include "code\game\machinery\computer\robot.dm" #include "code\game\machinery\computer\security.dm" diff --git a/code/defines/obj/clothing/jumpsuit.dm b/code/defines/obj/clothing/jumpsuit.dm index 43743aabdd..960e194248 100644 --- a/code/defines/obj/clothing/jumpsuit.dm +++ b/code/defines/obj/clothing/jumpsuit.dm @@ -518,4 +518,13 @@ protective_temperature = 100000 flags = FPRINT | TABLEPASS | SUITSPACE body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100) \ No newline at end of file + armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100) + +/obj/item/clothing/under/rank/medical_sleeve + desc = "Made of a special fiber that gives special protection against biohazards. Has a cross on the chest denoting that the wearer is trained medical personnel. Has short sleeves." + name = "Short Sleeve Medical Jumpsuit" + icon_state = "medical_sleeve" + item_state = "medical_sleeve" + color = "medical_sleeve" + permeability_coefficient = 0.50 + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) \ No newline at end of file diff --git a/code/defines/obj/computer.dm b/code/defines/obj/computer.dm index a7a588842a..23148356dd 100644 --- a/code/defines/obj/computer.dm +++ b/code/defines/obj/computer.dm @@ -125,6 +125,8 @@ var/a_id = null var/temp = null var/printing = null + var/list/Perp + var/tempname = null /obj/machinery/computer/med_data/laptop diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index b8a3690adb..91f008508f 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -1257,6 +1257,7 @@ name = "fork" desc = "Pointy." icon_state = "fork" + var/obj/item/weapon/reagent_containers/food/snacks/bite /obj/item/weapon/kitchen/utensil/knife name = "knife" diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 86bc3f013a..efda6bc526 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -182,7 +182,7 @@ if("Detective") return list(access_security, access_forensics_lockers, access_morgue, access_maint_tunnels, access_court) if("Medical Doctor") - return list(access_medical, access_morgue, access_surgery) + return list(access_medical, access_morgue, access_surgery, access_virology) if("Botanist") // -- TLE return list(access_hydroponics) // Removed tox and chem access because STOP PISSING OFF THE CHEMIST GUYS // //Removed medical access because WHAT THE FUCK YOU AREN'T A DOCTOR YOU GROW WHEAT if("Librarian") // -- TLE @@ -243,8 +243,8 @@ access_tox_storage, access_chemistry, access_teleporter, access_research, access_robotics, access_xenobiology, access_RC_announce, access_keycard_auth, access_tcomsat) - if("Virologist") - return list(access_medical, access_morgue, access_virology) + /*if("Virologist") + return list(access_medical, access_morgue, access_virology)*/ if("Chief Medical Officer") return list(access_medical, access_morgue, access_medlab, access_heads, access_chemistry, access_virology, access_cmo, access_surgery, access_RC_announce, diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index ce3adee94f..f124316a24 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -444,7 +444,7 @@ break if(!selected) //Search for a ghost if dead body with client isn't found. for(var/mob/dead/observer/ghost in world) - if (ghost.corpse.mind.key == find_key) + if (ghost.corpse && ghost.corpse.mind.key == find_key) selected = ghost break return selected diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index d490f45f4b..3c200f6158 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -21,6 +21,7 @@ if(..()) return var/dat + if (src.temp) dat = text("[src.temp]

Clear Screen") else @@ -28,23 +29,94 @@ if (src.authenticated) switch(src.screen) if(1.0) + dat += "

" + dat += text("Search Records
", src) dat += {" -Search Records -
List Records -
Search DNA -
-
Virus Database -
Medbot Tracking -
-
Record Maintenance -
{Log Out}
-"} - if(2.0) - dat += "Record List:


" +

+ + + + +
Records:
+ + + + + + + + + "} for(var/datum/data/record/R in data_core.general) - dat += text("[]: []
", src, R, R.fields["id"], R.fields["name"]) - //Foreach goto(132) - dat += text("
Back", src) + var/physstat = R.fields["p_stat"] + var/background + switch(physstat) + if("*Deceased*") + background = "'background-color:#CD853F;'" + if("*Unconscious*") + background = "'background-color:#DC143C;'" + if("Physically Unfit") + background = "'background-color:#3BB9FF;'" + if("Active") + background = "'background-color:#00FF7F;'" + if("") + background = "'background-color:#FFFFFF;'" + physstat = "No Record." + dat += text("", background, src, R, R.fields["name"]) + dat += text("", R.fields["id"]) + dat += text("", R.fields["rank"]) + dat += text("", R.fields["fingerprint"]) + dat += text("", physstat) + dat += text("", R.fields["m_stat"]) + dat += "
NameIDRankFingerprintsPhysical StatusMental Status
[][][][][][]

" + dat += "Virus Database
" + dat += "Medbot Tracking
" + dat += "Record Maintenance

" + dat += "{Log Out}" + if(2.0) + if(!Perp.len) + dat += text("ERROR. String could not be located.

Back", src) + else + dat += {" + + "} + dat += text("", tempname) + dat += {" + +
Search Results for '[]':
+ + + + + + + + + "} + for(var/i=1, i<=Perp.len, i += 2) + var/datum/data/record/R = Perp[i] + var/physstat = R.fields["p_stat"] + var/background + switch(physstat) + if("*Deceased*") + background = "'background-color:#CD853F;'" + if("*Unconscious*") + background = "'background-color:#DC143C;'" + if("Physically Unfit") + background = "'background-color:#3BB9FF;'" + if("Active") + background = "'background-color:#00FF7F;'" + if("") + background = "'background-color:#FFFFFF;'" + physstat = "No Record." + dat += text("", background, src, R, R.fields["name"]) + dat += text("", R.fields["id"]) + dat += text("", R.fields["rank"]) + dat += text("", R.fields["fingerprint"]) + dat += text("", physstat) + dat += text("", R.fields["m_stat"]) + dat += "
NameIDRankFingerprintsPhysical StatusMental Status
[][][][][][]

" + dat += text("
Return to index.", src) if(3.0) dat += "Records Maintenance
" if(disk) @@ -81,19 +153,18 @@ else dat += "Medical Record Lost!
" dat += text("New Record

") - dat += text("\nPrint Record
\nBack
", src, src) + dat += text("\nPrint Record
\nBack
", src, src) if(5.0) - dat += "
Virus Database
" + dat += "Virus Database
" for(var/Dt in typesof(/datum/disease/)) var/datum/disease/Dis = new Dt(0) if(!Dis.desc) continue - dat += "
[Dis.name]" + dat += "[Dis.name]
" dat += "
Back" if(6.0) - dat += "
Medical Robot Monitor
" - dat += "Back" - dat += "
Medical Robots:" + dat += "Medical Robot Monitor
" + dat += "Medical Robots:
" var/bdat = null for(var/obj/machinery/bot/medbot/M in world) var/turf/bl = get_turf(M) @@ -104,14 +175,16 @@ bdat += "Using Internal Synthesizer.
" if(!bdat) - dat += "
None detected
" + dat += "None detected

" else - dat += "
[bdat]" + dat += "[bdat]
" + + dat += "Back" else else dat += text("{Log In}", src) - user << browse(text("Medical Records[]", dat), "window=med_rec") + user << browse(text("Medical Records[]", dat), "window=med_rec;size=600x400") onclose(user, "med_rec") return @@ -309,7 +382,7 @@ if("watch") src.active1.fields["m_stat"] = "*Watch*" if("stable") - src.active2.fields["m_stat"] = "Stable" + src.active1.fields["m_stat"] = "Stable" if (href_list["b_type"]) @@ -395,26 +468,33 @@ src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" if (href_list["search"]) - var/t1 = input("Search String: (Name or ID)", "Med. records", null, null) as text + var/t1 = input("Search String: (Partial Name or ID or Fingerprints or DNA or Rank)", "Med. records", null, null) as text if ((!( t1 ) || usr.stat || !( src.authenticated ) || usr.restrained() || ((!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))) return - src.active1 = null - src.active2 = null + Perp = new/list() t1 = lowertext(t1) + var/list/components = dd_text2list(t1, " ") + if(components.len > 5) + return //Lets not let them search too greedily. for(var/datum/data/record/R in data_core.general) - if ((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]))) - src.active1 = R - else - //Foreach continue //goto(3229) - if (!( src.active1 )) - src.temp = text("Could not locate record [].", t1) - else + var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["fingerprint"] + " " + R.fields["rank"] + for(var/datum/data/record/E in data_core.medical) - if ((E.fields["name"] == src.active1.fields["name"] || E.fields["id"] == src.active1.fields["id"])) - src.active2 = E - else - //Foreach continue //goto(3334) - src.screen = 4 + if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) + temptext += " " + E.fields["b_dna"] + + for(var/i = 1, i<=components.len, i++) + if(findtext(temptext,components[i])) + var/prelist = new/list(2) + prelist[1] = R + Perp += prelist + for(var/i = 1, i<=Perp.len, i+=2) + for(var/datum/data/record/E in data_core.medical) + var/datum/data/record/R = Perp[i] + if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"])) + Perp[i+1] = E + tempname = t1 + src.screen = 2 if (href_list["print_p"]) if (!( src.printing )) @@ -437,24 +517,6 @@ P.info += "" P.name = "paper - 'Medical Record'" src.printing = null - - if (href_list["search_dna"]) - var/t1 = input("Search String: (DNA)", "Medical records", null, null) as text - if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon)))) - return - active1 = null - active2 = null - t1 = lowertext(t1) - for(var/datum/data/record/R in data_core.medical) - if (lowertext(R.fields["b_dna"]) == t1) - active2 = R - if (!( active2 )) - temp = text("Could not locate record [].", t1) - else - for(var/datum/data/record/E in data_core.general) - if ((E.fields["name"] == active2.fields["name"] || E.fields["id"] == active2.fields["id"])) - active1 = E - screen = 4 if (href_list["eject_disk"]) if (!disk) return diff --git a/code/game/objects/items/clothing.dm b/code/game/objects/items/clothing.dm index 1ae417144e..679b53653d 100644 --- a/code/game/objects/items/clothing.dm +++ b/code/game/objects/items/clothing.dm @@ -355,6 +355,12 @@ THERMAL GLASSES else if(src.icon_state == "labcoat_pink") src.icon_state = "labcoat_pink_open" usr << "You unbutton the labcoat." + else if(src.icon_state == "labcoat_sleeve_open") + src.icon_state = "labcoat_sleeve" + usr << "You button up the labcoat." + else if(src.icon_state == "labcoat_sleeve") + src.icon_state = "labcoat_sleeve_open" + usr << "You unbutton the labcoat." else usr << "Sorry! The suit you're wearing doesn't have buttons!" diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm index 6866fae1a6..17915b82ef 100644 --- a/code/game/objects/items/weapons/kitchen.dm +++ b/code/game/objects/items/weapons/kitchen.dm @@ -18,28 +18,71 @@ KNIFE // FORK -/obj/item/weapon/kitchen/utensil/fork/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) - if(!istype(M)) - return ..() - - if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head") - return ..() - - if (src.icon_state == "forkloaded") //This is a poor way of handling it, but a proper rewrite of the fork to allow for a more varied foodening can happen when I'm in the mood. --NEO - if(M == user) - for(var/mob/O in viewers(M, null)) - O.show_message(text("\blue [] eats a delicious forkful of omelette!", user), 1) - M.reagents.add_reagent("nutriment", 1) +/obj/item/weapon/kitchen/utensil/fork/attack(mob/living/M as mob, mob/living/carbon/user as mob) + if(istype(M,/mob/living/carbon) || istype(M,/mob/living/simple_animal/livestock)) + if (bite) + if(M == user) + user.visible_message( \ + "\blue [user] eats a delicious forkful of [bite]!", \ + "\blue You eat a delicious forkful of [bite]!") + else + user.visible_message( \ + "\blue [user] feeds [M] a delicious forkful of [bite]!", \ + "\blue You feed [M] a delicious forkful of [bite]!") + spawn(0) + bite.reagents.reaction(M, INGEST) + bite.reagents.trans_to(M) + del(bite) + src.icon_state = "fork" + else if(user.zone_sel.selecting == "eyes") + if((user.mutations & CLUMSY) && prob(50)) + M = user + return eyestab(M, user) else - for(var/mob/O in viewers(M, null)) - O.show_message(text("\blue [] feeds [] a delicious forkful of omelette!", user, M), 1) - M.reagents.add_reagent("nutriment", 1) - src.icon_state = "fork" - return + user << "\red Your fork does not have any food on it." else - if((user.mutations & CLUMSY) && prob(50)) - M = user - return eyestab(M,user) + user << "\red You can't seem to feed [M]." + +/obj/item/weapon/kitchen/utensil/fork/afterattack(obj/item/weapon/reagent_containers/food/snacks/snack as obj, mob/living/carbon/user as mob) + if(istype(snack)) + if(bite) + user << "\red You already have [bite] on your fork." + else + bite = new snack.type(src) + icon_state = "forkloaded" + user.visible_message( \ + "[user] takes a piece of [bite] with their fork!", \ + "\blue You take a piece of [bite] with your fork!" \ + ) + if(bite.reagents && snack.reagents) //transfer bit's worth of reagents to + bite.reagents.clear_reagents() + if(snack.reagents.total_volume) + snack.reagents.reaction(src, TOUCH) // react "food" with fork + spawn(0) + if(snack.reagents.total_volume > snack.bitesize) + snack.reagents.trans_to(bite, snack.bitesize) + else + snack.reagents.trans_to(bite, snack.reagents.total_volume) + snack.bitecount++ + if(!snack.reagents.total_volume) + // due to the trash code being hard-coded to place in hand, do magic trick + // free active hand + user.drop_item(src) + + // consumption fills active hand, drop it back down + snack.On_Consume() + var/obj/trash = user.get_active_hand() + if(trash) + user.drop_item(trash) + trash.loc = get_turf(snack.loc) // move trash to snack's turf + + // put fork back in hand + user.put_in_hand(src) + user << "\red You grab the last bite of [snack]." + del(snack) + else + return ..() + diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 025a00f916..e43a05c868 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -1,6 +1,22 @@ var/CMinutes = null var/savefile/Banlist +/proc/LoadBans() + + Banlist = new("data/banlist.bdb") + log_admin("Loading banlist.") + + if (!length(Banlist.dir)) log_admin("Banlist is empty.") + + if (!Banlist.dir.Find("base")) + log_admin("Banlist missing base dir.") + Banlist.dir.Add("base") + + Banlist.cd = "/base" + + ClearTempbans() + return 1 + /proc/CheckBan(var/client/clientvar) @@ -11,11 +27,11 @@ var/savefile/Banlist if (Banlist.dir.Find("[key][id]")) Banlist.cd = "[key][id]" if (Banlist["temp"]) - if (!GetExp(Banlist["minutes"])) + if (!GetBanExp(Banlist["minutes"])) ClearTempbans() return 0 else - return "[Banlist["reason"]]\n(This ban will be automatically removed in [GetExp(Banlist["minutes"])].)" + return "[Banlist["reason"]]\n(This ban will be automatically removed in [GetBanExp(Banlist["minutes"])].)" else Banlist.cd = "/base/[key][id]" return "[Banlist["reason"]]\n(This is a permanent ban)" @@ -23,40 +39,23 @@ var/savefile/Banlist Banlist.cd = "/base" for (var/A in Banlist.dir) Banlist.cd = "/base/[A]" - if (id == Banlist["id"] || key == Banlist["key"]) + if ( key == Banlist["key"] || (id == Banlist["id"] && Banlist["skipIdCheck"] == 0) ) if(Banlist["temp"]) - if (!GetExp(Banlist["minutes"])) + if (!GetBanExp(Banlist["minutes"])) ClearTempbans() return 0 else - return "[Banlist["reason"]]\n(This ban will be automatically removed in [GetExp(Banlist["minutes"])].)" + return "[Banlist["reason"]]\n(This ban will be automatically removed in [GetBanExp(Banlist["minutes"])].)" else return "[Banlist["reason"]]\n(This is a permanent ban)" return 0 -/proc/UpdateTime() //No idea why i made this a proc. +/proc/UpdateTime() CMinutes = (world.realtime / 10) / 60 return 1 -/proc/LoadBans() - - Banlist = new("data/banlist.bdb") - log_admin("Loading Banlist") - - if (!length(Banlist.dir)) log_admin("Banlist is empty.") - - if (!Banlist.dir.Find("base")) - log_admin("Banlist missing base dir.") - Banlist.dir.Add("base") - Banlist.cd = "/base" - else if (Banlist.dir.Find("base")) - Banlist.cd = "/base" - - ClearTempbans() - return 1 - /proc/ClearTempbans() UpdateTime() @@ -92,6 +91,7 @@ var/savefile/Banlist Banlist.cd = "/base/[ckey][computerid]" Banlist["key"] << ckey Banlist["id"] << computerid + Banlist["skipIdCheck"] << 0 Banlist["reason"] << reason Banlist["bannedby"] << bannedby Banlist["temp"] << temp @@ -106,7 +106,6 @@ var/savefile/Banlist Banlist.cd = "/base/[foldername]" Banlist["key"] >> key - Banlist["id"] >> id Banlist.cd = "/base" if (!Banlist.dir.Remove(foldername)) return 0 @@ -129,7 +128,7 @@ var/savefile/Banlist return 1 -/proc/GetExp(minutes as num) +/proc/GetBanExp(minutes as num) UpdateTime() var/exp = minutes - CMinutes if (exp <= 0) @@ -147,20 +146,19 @@ var/savefile/Banlist /obj/admins/proc/unbanpanel() var/count = 0 var/dat - //var/dat = "
Unban Player: \blue(U) = Unban , (E) = Edit Ban\green (Total
" Banlist.cd = "/base" for (var/A in Banlist.dir) count++ Banlist.cd = "/base/[A]" - dat += text("") + dat += text("") dat += "
(U)(E) Key: [Banlist["key"]] ([Banlist["temp"] ? "[GetExp(Banlist["minutes"]) ? GetExp(Banlist["minutes"]) : "Removal pending" ]" : "Permaban"])(By: [Banlist["bannedby"]])(Reason: [Banlist["reason"]])
(U)(E)(K) Key: [Banlist["key"]] ([Banlist["temp"] ? "[GetBanExp(Banlist["minutes"]) ? GetBanExp(Banlist["minutes"]) : "Removal pending" ]" : "Permaban"])(By: [Banlist["bannedby"]])(Reason: [Banlist["reason"]])
" - dat = "
Bans: (U) = Unban , (E) = Edit Ban - ([count] Bans)
[dat]" + dat = "
Bans:(U) = Unban , (E) = Edit Ban , (K) = Remove Computer ID - ([count] Bans)
[dat]" usr << browse(dat, "window=unbanp;size=875x400") //////////////////////////////////// DEBUG //////////////////////////////////// -/proc/CreateBans() +/*/proc/CreateBans() UpdateTime() @@ -192,5 +190,5 @@ var/savefile/Banlist /proc/ClearAllBans() Banlist.cd = "/base" for (var/A in Banlist.dir) - RemoveBan(A) + RemoveBan(A)*/ diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 454e0df955..5a6c18b2bd 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -115,8 +115,8 @@ /////////////////////////////////////new ban stuff - if(href_list["unbanf"]) - var/banfolder = href_list["unbanf"] + if(href_list["unban_del"]) + var/banfolder = href_list["unban_del"] Banlist.cd = "/base/[banfolder]" var/key = Banlist["key"] if(alert(usr, "Are you sure you want to unban [key]?", "Confirmation", "Yes", "No") == "Yes") @@ -126,11 +126,18 @@ alert(usr,"This ban has already been lifted / does not exist.","Error","Ok") unbanpanel() - if(href_list["unbane"]) + if(href_list["unban_cid"]) + var/banfolder = href_list["unban_cid"] + Banlist.cd = "/base/[banfolder]" + var/key = Banlist["key"] + if(alert(usr, "Are you sure you want to remove the computer ID for [key]'s ban? Without the ID, a different account could get on the server from [key]'s computer.", "Confirmation", "Yes", "No") == "Yes") + Banlist["skipIdCheck"] << 1 + + if(href_list["unban_edit"]) UpdateTime() var/reason var/mins = 0 - var/banfolder = href_list["unbane"] + var/banfolder = href_list["unban_edit"] Banlist.cd = "/base/[banfolder]" var/reason2 = Banlist["reason"] var/temp = Banlist["temp"] @@ -155,10 +162,10 @@ if(!reason) return - log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [GetExp(mins)]") + log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [GetBanExp(mins)]") - ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [GetExp(mins)]") - message_admins("\blue [key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [GetExp(mins)]", 1) + ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [GetBanExp(mins)]") + message_admins("\blue [key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [GetBanExp(mins)]", 1) Banlist.cd = "/base/[banfolder]" Banlist["reason"] << reason Banlist["temp"] << temp diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm index 83a0762019..8dcb7d6bb8 100644 --- a/code/modules/admin/newbanjob.dm +++ b/code/modules/admin/newbanjob.dm @@ -20,11 +20,6 @@ var/savefile/Banlistjob return 1 return 0 - -///proc/UpdateTime() //No idea why i made this a proc. -// CMinutes = (world.realtime / 10) / 60 -// return 1 - /proc/LoadBansjob() Banlistjob = new("data/job_fullnew.bdb") @@ -189,7 +184,7 @@ var/savefile/Banlistjob return 1 -/proc/GetExpjob(minutes as num) +/proc/GetBanExpjob(minutes as num) UpdateTime() var/exp = minutes - CMinutes if (exp <= 0) @@ -212,7 +207,7 @@ var/savefile/Banlistjob for (var/A in Banlistjob.dir) count++ Banlistjob.cd = "/base/[A]" - dat += text("") + dat += text("") dat += "
(U) Key: [Banlistjob["key"]] Rank: [Banlistjob["rank"]] ([Banlistjob["temp"] ? "[GetExpjob(Banlistjob["minutes"]) ? GetExpjob(Banlistjob["minutes"]) : "Removal pending" ]" : "Permaban"])(By: [Banlistjob["bannedby"]])(Reason: [Banlistjob["reason"]])
(U) Key: [Banlistjob["key"]] Rank: [Banlistjob["rank"]] ([Banlistjob["temp"] ? "[GetBanExpjob(Banlistjob["minutes"]) ? GetBanExpjob(Banlistjob["minutes"]) : "Removal pending" ]" : "Permaban"])(By: [Banlistjob["bannedby"]])(Reason: [Banlistjob["reason"]])
" dat = "
Bans: (U) = Unban , - ([count] Bans)
[dat]" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index c7f73f9db9..55c60abafc 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -491,6 +491,7 @@ Traitors and the like can also be revived with the previous role mostly intact. M.radiation = 0 //M.health = 100 M.nutrition = 400 + M.bodytemperature = initial(M.bodytemperature) M.heal_overall_damage(1000, 1000) //M.updatehealth() M.buckled = initial(M.buckled) @@ -725,35 +726,25 @@ Traitors and the like can also be revived with the previous role mostly intact. for(var/t in L) usr << "[t]" -/client/proc/cmd_admin_remove_plasma() +/client/proc/cmd_admin_remove_plasma(area/A as area) set category = "Debug" set name = "Stabilize Atmos." + set desc = "Stabilize atmos in selected area." if(!holder) src << "Only administrators may use this command." return -// DEFERRED -/* - spawn(0) - for(var/turf/T in view()) - T.poison = 0 - T.oldpoison = 0 - T.tmppoison = 0 - T.oxygen = 755985 - T.oldoxy = 755985 - T.tmpoxy = 755985 - T.co2 = 14.8176 - T.oldco2 = 14.8176 - T.tmpco2 = 14.8176 - T.n2 = 2.844e+006 - T.on2 = 2.844e+006 - T.tn2 = 2.844e+006 - T.tsl_gas = 0 - T.osl_gas = 0 - T.sl_gas = 0 - T.temp = 293.15 - T.otemp = 293.15 - T.ttemp = 293.15 -*/ + + spawn(1) + for(var/turf/simulated/T in A) + if(T.air) + T.air.oxygen = T.oxygen + T.air.carbon_dioxide = T.carbon_dioxide + T.air.nitrogen = T.nitrogen + T.air.toxins = T.toxins + T.air.temperature = T.temperature + + // make things update properly + T.assume_air(new /datum/gas_mixture()) /client/proc/toggle_view_range() set category = "Special Verbs" diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 36b22c4ac9..0877bbbc9e 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -46,3 +46,8 @@ name = "Pink Labcoat" desc = "A suit that protects against minor chemical spills. Has a pink stripe down from the shoulders." icon_state = "labcoat_pink_open" + +/obj/item/clothing/suit/storage/labcoat/red + name = "Red Labcoat" + desc = "A suit that protects against minor chemical spills. Has a red stripe on the shoulders and rolled up sleeves." + icon_state = "labcoat_sleeve_open" \ No newline at end of file diff --git a/code/modules/critters/critter.dm b/code/modules/critters/critter.dm index 96daac131c..bd46ecaf04 100644 --- a/code/modules/critters/critter.dm +++ b/code/modules/critters/critter.dm @@ -10,6 +10,8 @@ alive = 1 health = 10 max_health = 10 + aggression = 100 + speed = 8 list/access_list = list()//accesses go here //AI things task = "thinking" @@ -119,4 +121,4 @@ -*/ \ No newline at end of file +*/ diff --git a/code/modules/critters/critter_AI.dm b/code/modules/critters/critter_AI.dm index 18e0fac6e4..169ce48974 100644 --- a/code/modules/critters/critter_AI.dm +++ b/code/modules/critters/critter_AI.dm @@ -33,7 +33,7 @@ src.target_lastloc = M.loc else var/turf/olddist = get_dist(src, src.target) - walk_to(src, src.target,1,4) + walk_to(src, src.target,1,speed) if ((get_dist(src, src.target)) >= (olddist)) src.frustration++ else @@ -106,6 +106,8 @@ seek_target() + if(!prob(aggression)) return // make them attack depending on aggression levels + src.anchored = 0 var/T = null for(var/mob/living/C in view(src.seekrange,src))//TODO: mess with this @@ -198,4 +200,4 @@ smoke.set_up(10, 0, src.loc) smoke.start() src.task = "thinking" -*/ \ No newline at end of file +*/ diff --git a/code/modules/critters/critters.dm b/code/modules/critters/critters.dm index 9d86cb5bbe..59be056737 100644 --- a/code/modules/critters/critters.dm +++ b/code/modules/critters/critters.dm @@ -135,9 +135,10 @@ name = "Spess Carp" desc = "A ferocious, fang-bearing creature that resembles a fish." icon_state = "spesscarp" - health = 25 - max_health = 25 + health = 100 + max_health = 100 aggressive = 1 + aggression = 20 defensive = 1 wanderer = 1 atkcarbon = 1 @@ -152,6 +153,7 @@ attacktext = "bites" attack_sound = 'bite.ogg' attack_speed = 10 + speed = 8 var/stunchance = 10 // chance to tackle things down @@ -185,8 +187,8 @@ /obj/effect/critter/spesscarp/elite desc = "Oh shit, you're really fucked now. It has an evil gleam in its eye." - health = 50 - max_health = 50 + health = 200 + max_health = 200 melee_damage_lower = 20 melee_damage_upper = 35 stunchance = 15 diff --git a/code/modules/food/food.dm b/code/modules/food/food.dm index f4c354d07d..13eb9a4f94 100644 --- a/code/modules/food/food.dm +++ b/code/modules/food/food.dm @@ -453,33 +453,6 @@ ..() reagents.add_reagent("nutriment", 8) bitesize = 1 - attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/weapon/kitchen/utensil/fork)) - if (W.icon_state == "forkloaded") - user << "\red You already have omelette on your fork." - return - //W.icon = 'kitchen.dmi' - W.icon_state = "forkloaded" - /*if (herp) - world << "[user] takes a piece of omelette with his fork!"*/ - //Why this unecessary check? Oh I know, because I'm bad >:C - // Yes, you are. You griefing my badmin toys. --rastaf0 - user.visible_message( \ - "[user] takes a piece of omelette with their fork!", \ - "\blue You take a piece of omelette with your fork!" \ - ) - reagents.remove_reagent("nutriment", 1) - if (reagents.total_volume <= 0) - del(src) -/* - * Unsused. -/obj/item/weapon/reagent_containers/food/snacks/omeletteforkload - name = "Omelette Du Fromage" - desc = "That's all you can say!" - New() - ..() - reagents.add_reagent("nutriment", 1) -*/ /obj/item/weapon/reagent_containers/food/snacks/muffin name = "Muffin" diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 35fc955cd2..3b4360eda1 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -185,7 +185,7 @@ proc/move_mining_shuttle() item_state = "dpickaxe" digspeed = 10 origin_tech = "materials=6;engineering=4" - desc = "A pickaxe with a diamond pick head, this is just like minecraft." + desc = "A pickaxe with a diamond pick head." diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME! name = "Diamond Mining Drill" diff --git a/config/custom_items.txt b/config/custom_items.txt index 3b481b9825..820238419f 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -3,4 +3,5 @@ spaceman96: Trenna Seber: /obj/item/weapon/pen/multi, /obj/item/clothing/suit/st asanadas: Book Berner: /obj/item/clothing/under/chameleon/psyche tastyfish: Cindy Robertson: /obj/item/weapon/wrapping_paper eternal248: Maximilian Haynes: /obj/item/weapon/paper/certificate -searif: Yuki Matsuda: /obj/item/weapon/paper/certificate \ No newline at end of file +searif: Yuki Matsuda: /obj/item/weapon/paper/certificate +erthilo: Farah Lants: /obj/item/clothing/under/rank/medical_sleeve, /obj/item/clothing/suit/storage/labcoat/red \ No newline at end of file diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index a32f3e306c..1b17141922 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 0550550e7f..7d5fbebf6c 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index ce98885241..9583224a6b 100755 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 17d403d979..3954c21503 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ