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:
"
+
+
+
+
+ | Name |
+ ID |
+ Rank |
+ Fingerprints |
+ Physical Status |
+ Mental Status |
+
"}
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 += "
"
+ 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("| Search Results for '[]': | ", tempname)
+ dat += {"
+
+
+
+
+ | Name |
+ ID |
+ Rank |
+ Fingerprints |
+ Physical Status |
+ Mental Status |
+
"}
+ 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 += "
"
+ 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("| (U)(E) Key: [Banlist["key"]] | ([Banlist["temp"] ? "[GetExp(Banlist["minutes"]) ? GetExp(Banlist["minutes"]) : "Removal pending" ]" : "Permaban"]) | (By: [Banlist["bannedby"]]) | (Reason: [Banlist["reason"]]) |
")
+ dat += text("| (U)(E)(K) Key: [Banlist["key"]] | ([Banlist["temp"] ? "[GetBanExp(Banlist["minutes"]) ? GetBanExp(Banlist["minutes"]) : "Removal pending" ]" : "Permaban"]) | (By: [Banlist["bannedby"]]) | (Reason: [Banlist["reason"]]) |
")
dat += "
"
- 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("| (U) Key: [Banlistjob["key"]] Rank: [Banlistjob["rank"]] | ([Banlistjob["temp"] ? "[GetExpjob(Banlistjob["minutes"]) ? GetExpjob(Banlistjob["minutes"]) : "Removal pending" ]" : "Permaban"]) | (By: [Banlistjob["bannedby"]]) | (Reason: [Banlistjob["reason"]]) |
")
+ dat += text("| (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 += "
"
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