From f0e33d09e9f578f9f518ecaf3d65c3f6046447b1 Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 07:13:18 -0700 Subject: [PATCH 01/15] Added a joke item scalpel. --- code/defines/obj/weapon.dm | 5 +++++ icons/obj/surgery.dmi | Bin 7848 -> 8010 bytes 2 files changed, 5 insertions(+) diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index 29fec512a38..7d9c7e55209 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -1650,6 +1650,11 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") sharp = 1 +/obj/item/weapon/scalpel/stabslash + name = "\proper Stabslash The Pains of Healing" + desc = "All craftsmanship is of highest quality. On it is image of doctor and patient. Doctor is panicing. Patien is asleep." + icon_state = "stabslash" + /obj/item/weapon/retractor name = "retractor" desc = "Retracts stuff." diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 4a093d06abc7ef2b9efbf221aa165723caa0b435..2cabb9bfd583f3cf7539da614cda81bdb097c978 100644 GIT binary patch literal 8010 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 E7f$BQGXMYp literal 7848 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 From 46f2864cd374d99b9861e173c68da1dad6ce688b Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 07:47:05 -0700 Subject: [PATCH 02/15] Ported BS12 player info system. --- code/modules/admin/NewBan.dm | 1 - code/modules/admin/admin.dm | 92 +++++++++++++++++---- code/modules/admin/admin_investigate.dm | 2 - code/modules/admin/admin_verbs.dm | 2 + code/modules/admin/holder2.dm | 102 +++++++++++++++++++----- code/modules/admin/player_notes.dm | 83 ------------------- 6 files changed, 161 insertions(+), 121 deletions(-) diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 883e05a68a9..83447d1a239 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -116,7 +116,6 @@ var/savefile/Banlist Banlist["temp"] << temp if (temp) Banlist["minutes"] << bantimestamp - notes_add(ckey, "Banned - [reason]") return 1 /proc/RemoveBan(foldername) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 3d69ce4bca9..35c600dcd53 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -168,6 +168,83 @@ var/global/floorIsLava = 0 feedback_add_details("admin_verb","SPP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! +/datum/player_info/var/author // admin who authored the information +/datum/player_info/var/rank //rank of admin who made the notes +/datum/player_info/var/content // text content of the information +/datum/player_info/var/timestamp // Because this is bloody annoying + +/datum/admins/proc/PlayerNotes() + set category = "Admin" + set name = "Player Notes" + var/dat = "Player notes
" + if (!istype(src,/datum/admins)) + src = usr.client.holder + if (!istype(src,/datum/admins)) + usr << "Error: you are not an admin!" + return + + var/savefile/S=new("data/player_notes.sav") + var/list/note_keys + S >> note_keys + if(!note_keys) + dat += "No notes found." + else + sortList(note_keys) + for(var/t in note_keys) + dat += "" + dat += "
[t]
" + usr << browse(dat, "window=player_notes;size=400x400") + + +/datum/admins/proc/player_has_info(var/key as text) + var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") + var/list/infos + info >> infos + if(!infos || !infos.len) return 0 + else return 1 + + +/datum/admins/proc/show_player_info(var/key as text) + set category = "Admin" + set name = "Show Player Info" + if (!istype(src,/datum/admins)) + src = usr.client.holder + if (!istype(src,/datum/admins)) + usr << "Error: you are not an admin!" + return + var/dat = "Info on [key]" + dat += "" + + var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") + var/list/infos + info >> infos + if(!infos) + dat += "No information found on the given key.
" + else + var/update_file = 0 + var/i = 0 + for(var/datum/player_info/I in infos) + i += 1 + if(!I.timestamp) + I.timestamp = "Pre-4/3/2012" + update_file = 1 + if(!I.rank) + I.rank = "N/A" + update_file = 1 + dat += "[I.content] by [I.author] ([I.rank]) on [I.timestamp] " + if(I.author == usr.key) + dat += "Remove" + dat += "

" + if(update_file) info << infos + + dat += "
" + dat += "Add Comment
" + + dat += "" + usr << browse(dat, "window=adminplayerinfo;size=480x480") + + + /datum/admins/proc/access_news_network() //MARKER set category = "Fun" set name = "Access Newscaster Network" @@ -979,21 +1056,6 @@ var/global/floorIsLava = 0 if(istype(H)) H.regenerate_icons() -/datum/admins/proc/PlayerNotes() - var/dat = "Player notes
" - - var/savefile/S=new("data/player_notes.sav") - var/list/note_keys - S >> note_keys - if(!note_keys) - dat += "No notes found." - else - sortList(note_keys) - for(var/t in note_keys) - dat += text("") - dat += "
[t]
" - usr << browse(dat, "window=player_notes;size=400x400") - // // //ALL DONE diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 131130c298c..e601f069c68 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -44,5 +44,3 @@ else src << "Error: admin_investigate: Href Logging is not on." return - if("notes") - holder.notes_show() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a7bbd38abff..0e18f44f29a 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -130,6 +130,8 @@ verbs += /client/proc/display_admin_reports verbs += /datum/admins/proc/show_skills verbs += /client/proc/admin_ghost + verbs += /datum/admins/proc/show_player_info + verbs += /datum/admins/proc/PlayerNotes else return //Extra moderator commands diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index ffb47bea84c..4fba430ea6c 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -594,7 +594,6 @@ var/list/admin_datums = list() jobban_fullban(M, job, "[reason]; By [usr.ckey] on [time2text(world.realtime)]") if(!msg) msg = job else msg += ", [job]" - notes_add(M.ckey, "Banned from [msg] - [reason]") message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1) M << "\redYou have been jobbanned by [usr.client.ckey] from: [msg]." M << "\red The reason is: [reason]" @@ -641,25 +640,6 @@ var/list/admin_datums = list() //M.client = null del(M.client) - //Player Notes - if(href_list["notes"]) - var/ckey = href_list["ckey"] - if(!ckey) - var/mob/M = locate(href_list["mob"]) - if(ismob(M)) - ckey = M.ckey - - switch(href_list["notes"]) - if("show") - notes_show(ckey) - if("add") - notes_add(ckey,href_list["text"]) - notes_show(ckey) - if("remove") - notes_remove(ckey,text2num(href_list["from"]),text2num(href_list["to"])) - notes_show(ckey) - return - if (href_list["removejobban"]) if ((src.rank in list("Game Admin", "Game Master" ))) @@ -2590,3 +2570,85 @@ var/list/admin_datums = list() vsc.ChangeSettingsDialog(usr,vsc.plc.settings) if(href_list["vsc"] == "default") vsc.SetDefault(usr) + + // player info stuff + + if(href_list["add_player_info"]) + var/key = href_list["add_player_info"] + var/add = input("Add Player Info") as null|text + if(!add) return + + var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") + var/list/infos + info >> infos + if(!infos) infos = list() + + var/datum/player_info/P = new + P.author = usr.key + P.rank = usr.client.holder.rank + P.content = add + var/modifyer = "th" + switch(time2text(world.timeofday, "DD")) + if("01","21","31") + modifyer = "st" + if("02","22",) + modifyer = "nd" + if("03","23") + modifyer = "rd" + var/day_string = "[time2text(world.timeofday, "DD")][modifyer]" + if(copytext(day_string,1,2) == "0") + day_string = copytext(day_string,2) + var/full_date = time2text(world.timeofday, "DDD, Month DD of YYYY") + var/day_loc = findtext(full_date, time2text(world.timeofday, "DD")) + P.timestamp = "[copytext(full_date,1,day_loc)][day_string][copytext(full_date,day_loc+2)]" + + infos += P + + info << infos + + message_admins("\blue [key_name_admin(usr)] has edited [key]'s notes.") + log_admin("[key_name(usr)] has edited [key]'s notes.") + + del info + + var/savefile/note_list = new("data/player_notes.sav") + var/list/note_keys + note_list >> note_keys + if(!note_keys) note_keys = list() + if(!note_keys.Find(key)) note_keys += key + note_list << note_keys + del note_list + + show_player_info(key) + + if(href_list["remove_player_info"]) + var/key = href_list["remove_player_info"] + var/index = text2num(href_list["remove_index"]) + + var/savefile/info = new("data/player_saves/[copytext(key, 1, 2)]/[key]/info.sav") + var/list/infos + info >> infos + if(!infos || infos.len < index) return + + var/datum/player_info/item = infos[index] + infos.Remove(item) + info << infos + + message_admins("\blue [key_name_admin(usr)] deleted one of [key]'s notes.") + log_admin("[key_name(usr)] deleted one of [key]'s notes.") + + del info + + show_player_info(key) + + if(href_list["notes"]) + var/ckey = href_list["ckey"] + if(!ckey) + var/mob/M = locate(href_list["mob"]) + if(ismob(M)) + ckey = M.ckey + + switch(href_list["notes"]) + if("show") + show_player_info(ckey) + return \ No newline at end of file diff --git a/code/modules/admin/player_notes.dm b/code/modules/admin/player_notes.dm index 70de3b1c125..e69de29bb2d 100644 --- a/code/modules/admin/player_notes.dm +++ b/code/modules/admin/player_notes.dm @@ -1,83 +0,0 @@ -//This stuff was originally intended to be integrated into the ban-system I was working on -//but it's safe to say that'll never be finished. So I've merged it into the current player panel. -//enjoy ~Carn - -#define NOTESFILE "data/player_notes.sav" //where the player notes are saved - -datum/admins/proc/notes_show(var/ckey) - usr << browse("Player Notes[notes_gethtml(ckey)]","window=player_notes;size=700x400") - - -datum/admins/proc/notes_gethtml(var/ckey) - var/savefile/notesfile = new(NOTESFILE) - if(!notesfile) return "Error: Cannot access [NOTESFILE]" - if(ckey) - . = "Notes for [ckey]: \[+\] \[-\]
" - notesfile.cd = "/[ckey]" - var/index = 1 - while( !notesfile.eof ) - var/note - notesfile >> note - . += "[note] \[-\]
" - index++ - else - . = "All Notes: \[+\] \[-\]
" - notesfile.cd = "/" - for(var/dir in notesfile.dir) - . += "[dir]
" - return - - -//handles adding notes to the end of a ckey's buffer -//originally had seperate entries such as var/by to record who left the note and when -//but the current bansystem is a heap of dung. -/proc/notes_add(var/ckey, var/note) - if(!ckey) - ckey = ckey(input(usr,"Who would you like to add notes for?","Enter a ckey",null) as text|null) - if(!ckey) return - - if(!note) - note = html_encode(input(usr,"Enter your note:","Enter some text",null) as message|null) - if(!note) return - - var/savefile/notesfile = new(NOTESFILE) - if(!notesfile) return - notesfile.cd = "/[ckey]" - notesfile.eof = 1 //move to the end of the buffer - notesfile << "[time2text(world.realtime,"DD-MMM-YYYY")] | [note][(usr && usr.ckey)?" ~[usr.ckey]":""]" - return - -//handles removing entries from the buffer, or removing the entire directory if no start_index is given -/proc/notes_remove(var/ckey, var/start_index, var/end_index) - var/savefile/notesfile = new(NOTESFILE) - if(!notesfile) return - - if(!ckey) - notesfile.cd = "/" - ckey = ckey(input(usr,"Who would you like to remove notes for?","Enter a ckey",null) as null|anything in notesfile.dir) - if(!ckey) return - - if(start_index) - notesfile.cd = "/[ckey]" - var/list/noteslist = list() - if(!end_index) end_index = start_index - var/index = 0 - while( !notesfile.eof ) - index++ - var/temp - notesfile >> temp - if( (start_index <= index) && (index <= end_index) ) - continue - noteslist += temp - - notesfile.eof = -2 //Move to the start of the buffer and then erase. - - for( var/note in noteslist ) - notesfile << note - else - notesfile.cd = "/" - if(alert(usr,"Are you sure you want to remove all their notes?","Confirmation","No","Yes - Remove all notes") == "Yes - Remove all notes") - notesfile.dir.Remove(ckey) - return - -#undef NOTESFILE \ No newline at end of file From d63d24077cfd62b1f38e9a3581a6fa691a29bd20 Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 08:43:02 -0700 Subject: [PATCH 03/15] Added changelog. --- html/changelog.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/html/changelog.html b/html/changelog.html index a127d32e5a5..07289c35996 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,12 +56,20 @@ Stuff which is in development and not yet visible to players or just code relate should be listed in the changelog upon commit though. Thanks. --> +

October 13th, 2012

Cael_Aislinn updated:

  • Moderators are now being loaded correctly, and all broken admin and mod verbs should be functioning correctly. Misc other fixes and improvements.
+

CIB updated:

+
    +
  • Medical stack items(ointment, bandages) aren't instant anymore, but instead stop bleeding and speed up healing.
  • +
  • Cyborgs can now use :h to use their department channel.
  • +
  • Ported BS12 medbots. This means you now have to load them with a chemical, or otherwise they only have inaprovaline.
  • +
  • Ported the BS12 player info features.
  • +
From 4f1d301880f43782b2a1e0127fbcc8d0ed316342 Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 08:48:25 -0700 Subject: [PATCH 04/15] Examine now only reveals you're dead by checking pulse. --- .../mob/living/carbon/human/examine.dm | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 824062cf039..0dc518f992a 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -193,24 +193,33 @@ if(suiciding) msg += "[t_He] [t_has] bitten off [t_his] own tongue and [t_has] suffered major bloodloss!\n" - if(stat == DEAD || (status_flags & FAKEDEATH)) - if(brain_op_stage != 4)//Only perform these checks if there is no brain - msg += "[t_He] [t_is] limp and unresponsive; there are no signs of life" - if(!key) + var/distance = get_dist(usr,src) + if(istype(usr, /mob/dead/observer) || usr.stat == 2) // ghosts can see anything + distance = 1 + if (src.stat == 1 || stat == 2) + msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n" + if((stat == 2 || src.health < config.health_threshold_crit) && distance <= 3) + msg += "[t_He] does not appear to be breathing.\n" + if(istype(usr, /mob/living/carbon/human) && usr.stat == 0 && src.stat == 1 && distance <= 1) + for(var/mob/O in viewers(usr.loc, null)) + O.show_message("[usr] checks [src]'s pulse.", 1) + spawn(15) + usr << "\blue [t_He] has a pulse!" + + if (src.stat == 2 || (status_flags & FAKEDEATH)) + if(distance <= 1) + if(istype(usr, /mob/living/carbon/human) && usr.stat == 0) + for(var/mob/O in viewers(usr.loc, null)) + O.show_message("[usr] checks [src]'s pulse.", 1) + spawn(15) var/foundghost = 0 - if(mind) - for(var/mob/dead/observer/G in player_list) - if(G.mind == mind) - foundghost = 1 - if (G.can_reenter_corpse == 0) - foundghost = 0 - break + if(src.client) + foundghost = 1 if(!foundghost) - msg += " and [t_his] soul has departed" - msg += "...\n" - else//Brain is gone, doesn't matter if they are AFK or present - msg += "It appears that [t_his] brain is missing...\n" + usr << "[t_He] has no pulse and [t_his] soul has departed..." + else + usr << "[t_He] has no pulse..." msg += "" From e77afd5ab9d573daf559c9e194c6dad3ac91eda3 Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 09:09:11 -0700 Subject: [PATCH 05/15] Added bleeding and blood transfusion. --- code/modules/mob/living/carbon/human/human.dm | 40 +++++++++++ code/modules/mob/living/carbon/human/life.dm | 68 +++++++++++++++++++ .../reagents/reagent_containers/syringes.dm | 19 +++++- code/modules/recycling/disposal.dm | 10 +++ 4 files changed, 136 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3cce88cde48..5ba2955e55f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -5,6 +5,10 @@ icon = 'icons/mob/human.dmi' icon_state = "body_m_s" + var/datum/reagents/vessel + // TODO: make this actually affect the way the mob is rendered + var/pale = 0 + /mob/living/carbon/human/dummy real_name = "Test Dummy" @@ -72,6 +76,42 @@ prev_gender = gender // Debug for plural genders + vessel = new/datum/reagents(600) + vessel.my_atom = src + vessel.add_reagent("blood",560) + spawn(1) + fixblood() + +/mob/living/carbon/human/proc/drip(var/amt as num) + if(!amt) + return + + var/amm = 0.1 * amt + var/turf/T = get_turf(src) + var/list/obj/effect/decal/cleanable/blood/drip/nums = list() + var/list/iconL = list("1","2","3","4","5") + + vessel.remove_reagent("blood",amm) + + for(var/obj/effect/decal/cleanable/blood/drip/G in T) + nums += G + iconL.Remove(G.icon_state) + if(nums.len >= 3) + var/obj/effect/decal/cleanable/blood/drip/D = pick(nums) + D.blood_DNA[dna.unique_enzymes] = dna.b_type + return + + var/obj/effect/decal/cleanable/blood/drip/this = new(T) + this.icon_state = pick(iconL) + this.blood_DNA = list() + this.blood_DNA[dna.unique_enzymes] = dna.b_type + +/mob/living/carbon/human/proc/fixblood() + for(var/datum/reagent/blood/B in vessel.reagent_list) + if(B.id == "blood") + B.data = list("donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.b_type,"resistances"=null,"trace_chem"=null) + + /mob/living/carbon/human/Bump(atom/movable/AM as mob|obj, yes) if ((!( yes ) || now_pushing)) return diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4d5f22160b6..f15a26ece40 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -123,6 +123,73 @@ /mob/living/carbon/human + proc/handle_blood() + // take care of blood and blood loss + if(stat < 2) + var/blood_volume = round(vessel.get_reagent_amount("blood")) + if(blood_volume < 560 && blood_volume) + var/datum/reagent/blood/B = locate() in vessel.reagent_list //Grab some blood + if(B) // Make sure there's some blood at all + if(B.data["donor"] != src) //If it's not theirs, then we look for theirs + for(var/datum/reagent/blood/D in vessel.reagent_list) + if(D.data["donor"] == src) + B = D + break + var/datum/reagent/nutriment/F = locate() in vessel.reagent_list + if(F != null) + if(F.volume >= 1) + // nutriment speeds it up quite a bit + B.volume += 0.4 + F.volume -= 0.1 + else + //At this point, we dun care which blood we are adding to, as long as they get more blood. + B.volume = B.volume + 0.1 // regenerate blood VERY slowly + + + switch(blood_volume) + if(501 to 10000) + if(pale) + pale = 0 + update_body() + if(336 to 500) + if(!pale) + pale = 1 + update_body() + var/word = pick("dizzy","woosey","faint") + src << "\red You feel [word]" + if(prob(1)) + var/word = pick("dizzy","woosey","faint") + src << "\red You feel [word]" + if(oxyloss < 20) + // hint that they're getting close to suffocation + oxyloss += 3 + if(224 to 335) + if(!pale) + pale = 1 + update_body() + eye_blurry += 6 + if(oxyloss < 50) + oxyloss += 10 + oxyloss += 1 + if(prob(15)) + Paralyse(rand(1,3)) + if(122 to 244) + oxyloss += 5 + toxloss += 5 + if(0 to 122) + death() + + + var/blood_max = 0 + for(var/datum/organ/external/temp in organs) + if(!(temp.status & ORGAN_BLEEDING) || temp.status & ORGAN_ROBOT) + continue + for(var/datum/wound/W in temp.wounds) if(W.bleeding()) + blood_max += W.damage / 2 + if(temp.status & ORGAN_DESTROYED && !(temp.status & ORGAN_GAUZED)) + blood_max += 20 //Yer missing a fucking limb. + drip(blood_max) + proc/handle_disabilities() if (disabilities & EPILEPSY) if ((prob(1) && paralysis < 1)) @@ -888,6 +955,7 @@ else //ALIVE. LIGHTS ARE ON updatehealth() //TODO handle_organs() + handle_blood() if(health <= config.health_threshold_dead || brain_op_stage == 4.0) death() blinded = 1 diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 3e0d85d766a..48249a67f93 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -75,6 +75,9 @@ if(NOCLONE in T.mutations) //target done been et, no more blood in him user << "\red You are unable to locate any blood." return + if(ishuman(T)) + if(T:vessel.get_reagent_amount("blood") < amount) + return B.holder = src B.volume = amount //set reagent data @@ -106,6 +109,9 @@ temp_chem[R.name] = R.volume B.data["trace_chem"] = list2params(temp_chem) + if(ishuman(T)) + T:vessel.remove_reagent("blood",amount) // Removes blood if human + src.reagents.reagent_list += B src.reagents.update_total() src.on_reagent_change() @@ -158,7 +164,18 @@ if(ismob(target) && target == user) src.reagents.reaction(target, INGEST) spawn(5) - var/trans = src.reagents.trans_to(target, amount_per_transfer_from_this) + var/datum/reagent/blood/B + for(var/datum/reagent/blood/d in src.reagents.reagent_list) + B = d + break + var/trans + if(B && ishuman(target)) + var/mob/living/carbon/human/H = target + trans = B.volume > 5? 5 : B.volume + H.vessel.add_reagent("blood",trans,B.data) + src.reagents.remove_reagent("blood",trans) + else + trans = src.reagents.trans_to(target, amount_per_transfer_from_this) user << "\blue You inject [trans] units of the solution. The syringe now contains [src.reagents.total_volume] units." if (reagents.total_volume <= 0 && mode==SYRINGE_INJECT) mode = SYRINGE_DRAW diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 6343b00685f..76e4beb0ce6 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -1335,3 +1335,13 @@ dirs = alldirs.Copy() src.streak(dirs) + +/obj/effect/decal/cleanable/blood/drip + name = "drips of blood" + desc = "It's red." + gender = PLURAL + density = 0 + anchored = 1 + layer = 2 + icon = 'drip.dmi' + icon_state = "1" \ No newline at end of file From 31093ce666b6577af2f2eff47180a4ab343ad019 Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 09:59:17 -0700 Subject: [PATCH 06/15] More messages for low blood. --- code/modules/mob/living/carbon/human/life.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index f15a26ece40..bb38be8b039 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -173,9 +173,14 @@ oxyloss += 1 if(prob(15)) Paralyse(rand(1,3)) + var/word = pick("dizzy","woosey","faint") + src << "\red You feel extremely [word]" if(122 to 244) oxyloss += 5 toxloss += 5 + if(prob(15)) + var/word = pick("dizzy","woosey","faint") + src << "\red You feel extremely [word]" if(0 to 122) death() From 160328741e59364a0cd5ac4f2c97bacb466c9303 Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 10:08:12 -0700 Subject: [PATCH 07/15] Made the human/drip() proc produce larger pools. --- code/modules/mob/living/carbon/human/human.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 5ba2955e55f..8470c058c4e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -106,6 +106,13 @@ this.blood_DNA = list() this.blood_DNA[dna.unique_enzymes] = dna.b_type + // replace many drips with something larger + if(nums.len > 3) + for(var/obj/effect/decal/cleanable/blood/drip/G in nums) + del G + T.add_blood(src) + + /mob/living/carbon/human/proc/fixblood() for(var/datum/reagent/blood/B in vessel.reagent_list) if(B.id == "blood") From 0b5a06f3e34e6c926ab004c92966252da0ba7085 Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 10:10:19 -0700 Subject: [PATCH 08/15] Removed pointless ORGAN_BANDAGED flag. --- code/datums/organs/organ_external.dm | 1 - code/setup.dm | 1 - 2 files changed, 2 deletions(-) diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index 641d1b7c061..30d1bd2a2a5 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -187,7 +187,6 @@ proc/bandage() var/rval = 0 - status |= ORGAN_BANDAGED for(var/datum/wound/W in wounds) rval |= !W.bandaged W.bandaged = 1 diff --git a/code/setup.dm b/code/setup.dm index 71342dcd138..a500e309132 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -557,7 +557,6 @@ var/list/TAGGERLOCATIONS = list("Disposals", #define ORGAN_GAUZED 2 #define ORGAN_ATTACHABLE 4 #define ORGAN_BLEEDING 8 -#define ORGAN_BANDAGED 16 #define ORGAN_BROKEN 32 #define ORGAN_DESTROYED 64 #define ORGAN_ROBOT 128 From d5ffce8e258464cae6e18192fa21fd4698460532 Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 10:31:37 -0700 Subject: [PATCH 09/15] Fixed a bug with blood drips being limited to 1 per turf rather than 3. --- code/game/objects/effects/decals/Cleanable/humans.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 2ee5374ec58..72660368143 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -20,10 +20,11 @@ ..() if(istype(src, /obj/effect/decal/cleanable/blood/gibs)) return - if(src.loc && isturf(src.loc)) - for(var/obj/effect/decal/cleanable/blood/B in src.loc) - if(B != src) - del(B) + if(src.type == /obj/effect/decal/cleanable/blood) + if(src.loc && isturf(src.loc)) + for(var/obj/effect/decal/cleanable/blood/B in src.loc) + if(B != src) + del(B) /obj/effect/decal/cleanable/blood/splatter random_icon_states = list("gibbl1", "gibbl2", "gibbl3", "gibbl4", "gibbl5") From c747e5e56e712a51a3f20406ea38031105fe51bd Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 10:51:08 -0700 Subject: [PATCH 10/15] Chloral hydrate and sleep toxin now have a small delay before taking effect. --- code/modules/reagents/Chemistry-Reagents.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 39d3c50595c..efbb2aceb91 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -362,11 +362,11 @@ datum if(!M) M = holder.my_atom if(!data) data = 1 switch(data) - if(1 to 15) + if(10 to 20) M.eye_blurry = max(M.eye_blurry, 10) - if(15 to 25) + if(20 to 30) M.drowsyness = max(M.drowsyness, 20) - if(25 to INFINITY) + if(30 to INFINITY) M.Paralyse(20) M.drowsyness = max(M.drowsyness, 30) data++ @@ -1689,12 +1689,12 @@ datum if(!data) data = 1 data++ switch(data) - if(1) + if(15 to 25) M.confused += 2 M.drowsyness += 2 - if(2 to 50) + if(25 to 60) M.sleeping += 1 - if(51 to INFINITY) + if(61 to INFINITY) M.sleeping += 1 M.adjustToxLoss(data - 50) ..() From f3514e488793c732579ee5da0d733e10f444c91c Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 10:54:44 -0700 Subject: [PATCH 11/15] Fix to macros. --- interface/skin.dmf | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/interface/skin.dmf b/interface/skin.dmf index ca8afba7cbd..1c18ae6b720 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -147,13 +147,17 @@ macro "macro" name = "SHIFT+F2+REP" command = ".screenshot" is-disabled = false + elem + name = "F3" + command = "say" + is-disabled = false elem name = "F4" - command = "asay" + command = "me" is-disabled = false elem name = "F5" - command = "Aghost" + command = "asay" is-disabled = false elem name = "F6" @@ -389,13 +393,17 @@ macro "hotkeymode" name = "SHIFT+F2+REP" command = ".screenshot" is-disabled = false + elem + name = "F3" + command = "say" + is-disabled = false elem name = "F4" - command = "asay" + command = "me" is-disabled = false elem name = "F5" - command = "msay" + command = "asay" is-disabled = false elem name = "F6" From 83ff9c29641ffe5ba8708857775eee1df6b5d66a Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 10:58:50 -0700 Subject: [PATCH 12/15] Updated changelog. --- html/changelog.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/html/changelog.html b/html/changelog.html index 07289c35996..8e28f43da13 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -69,6 +69,9 @@ should be listed in the changelog upon commit though. Thanks. -->
  • Cyborgs can now use :h to use their department channel.
  • Ported BS12 medbots. This means you now have to load them with a chemical, or otherwise they only have inaprovaline.
  • Ported the BS12 player info features.
  • +
  • Examine now only reveals whether someone is breathing(need to be 3 tiles away or closer). Check pulse from 1 tile distance.
  • +
  • Ported bleeding. Bleeding can be stopped by applying a bandage.
  • +
  • Small delay for chloral hydrate and sleep toxin to take effect.
  • From 415e1c47d9b2e3ba9ab6fcae838996240cecda6e Mon Sep 17 00:00:00 2001 From: cib Date: Sat, 13 Oct 2012 11:11:57 -0700 Subject: [PATCH 13/15] Made nudge.py script location configurable. --- code/controllers/configuration.dm | 5 +++++ code/modules/admin/verbs/adminhelp.dm | 2 +- config/config.txt | 5 ++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index acd85c1ab7a..74f0bbd499e 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -2,6 +2,8 @@ var/server_name = null // server name (for world name / status) var/server_suffix = 0 // generate numeric suffix based on server port + var/nudge_script_path = "nudge.py" // where the nudge.py script is located + var/log_ooc = 0 // log OOC channel var/log_access = 0 // log login/logout var/log_say = 0 // log client say @@ -238,6 +240,9 @@ if ("serversuffix") config.server_suffix = 1 + if ("nudge_script_path") + config.nudge_script_path = value + if ("hostedby") config.hostedby = value diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 235a41ae6e9..9023d34e9f6 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -133,5 +133,5 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "ali proc/send2irc(msg,msg2) if(config.useircbot) - shell("python nudge.py [msg] [msg2]") + shell("python [config.nudge_script_path] [msg] [msg2]") return \ No newline at end of file diff --git a/config/config.txt b/config/config.txt index 95a3791a135..803d975a80f 100644 --- a/config/config.txt +++ b/config/config.txt @@ -173,4 +173,7 @@ SOCKET_TALK 0 #AUTOMUTE_ON ## Uncomment to restrict non-admins from using humanoid alien races -USEALIENWHITELIST \ No newline at end of file +USEALIENWHITELIST + +## Location of the nudge.py script +NUDGE_SCRIPT_PATH nudge.py \ No newline at end of file From c03977ba96b3208768273a9a06f05aed50a45518 Mon Sep 17 00:00:00 2001 From: Mloc Date: Sat, 13 Oct 2012 23:12:59 +0200 Subject: [PATCH 14/15] Fixed NT's status. --- code/world.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/world.dm b/code/world.dm index aedc3137ceb..1819bd212f1 100644 --- a/code/world.dm +++ b/code/world.dm @@ -146,7 +146,7 @@ Starting up. [time2text(world.timeofday, "hh:mm.ss")] if(revdata) s["revision"] = revdata.revision s["admins"] = admins - + s["end"] = "#end" return list2params(s) From 085d357b4be636289872f4c74b676a0addf39301 Mon Sep 17 00:00:00 2001 From: Head Date: Sun, 14 Oct 2012 00:43:23 +0200 Subject: [PATCH 15/15] Hopefully fixed organ spam. --- code/datums/organs/organ_external.dm | 10 +++++++- code/modules/mob/living/carbon/human/human.dm | 25 ++++++++++--------- code/modules/mob/new_player/savefile.dm | 1 + 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/code/datums/organs/organ_external.dm b/code/datums/organs/organ_external.dm index aba465b3a14..a6b25f525a0 100644 --- a/code/datums/organs/organ_external.dm +++ b/code/datums/organs/organ_external.dm @@ -33,8 +33,16 @@ var/open = 0 var/stage = 0 - // how often wounds should be updated, a higher number means less often + // how often wounds should be updated, a higher number means less often var/wound_update_accuracy = 20 // update every 20 ticks(roughly every minute) + New(var/datum/organ/external/P) + if(P) + parent = P + if(!parent.children) + parent.children = list() + parent.children.Add(src) + return ..() + proc/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list()) // TODO: this proc needs to be rewritten to not update damages directly diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3cce88cde48..108a71e59cc 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -23,19 +23,20 @@ //initialise organs organs = list() organs_by_name["chest"] = new/datum/organ/external/chest() - organs_by_name["head"] = new/datum/organ/external/head() - organs_by_name["l_arm"] = new/datum/organ/external/l_arm() - organs_by_name["r_arm"] = new/datum/organ/external/r_arm() - organs_by_name["r_leg"] = new/datum/organ/external/r_leg() - organs_by_name["l_leg"] = new/datum/organ/external/l_leg() - organs_by_name["l_hand"] = new/datum/organ/external/l_hand() - organs_by_name["r_hand"] = new/datum/organ/external/r_hand() - organs_by_name["l_foot"] = new/datum/organ/external/l_foot() - organs_by_name["r_foot"] = new/datum/organ/external/r_foot() - organs_by_name["groin"] = new/datum/organ/external/groin() + organs_by_name["groin"] = new/datum/organ/external/groin(organs_by_name["chest"]) + organs_by_name["head"] = new/datum/organ/external/head(organs_by_name["chest"]) + organs_by_name["l_arm"] = new/datum/organ/external/l_arm(organs_by_name["chest"]) + organs_by_name["r_arm"] = new/datum/organ/external/r_arm(organs_by_name["chest"]) + organs_by_name["r_leg"] = new/datum/organ/external/r_leg(organs_by_name["groin"]) + organs_by_name["l_leg"] = new/datum/organ/external/l_leg(organs_by_name["groin"]) + organs_by_name["l_hand"] = new/datum/organ/external/l_hand(organs_by_name["l_arm"]) + organs_by_name["r_hand"] = new/datum/organ/external/r_hand(organs_by_name["r_arm"]) + organs_by_name["l_foot"] = new/datum/organ/external/l_foot(organs_by_name["l_leg"]) + organs_by_name["r_foot"] = new/datum/organ/external/r_foot(organs_by_name["r_leg"]) + // connect feet to legs and hands to arms - var/datum/organ/external/organ = organs_by_name["l_hand"] +/* var/datum/organ/external/organ = organs_by_name["l_hand"] organ.parent = organs_by_name["l_arm"] organ = organs_by_name["r_hand"] organ.parent = organs_by_name["r_arm"] @@ -57,7 +58,7 @@ organ.parent = organs_by_name["chest"] organ = organs_by_name["l_arm"] organ.parent = organs_by_name["chest"] - + */ for(var/name in organs_by_name) organs += organs_by_name[name] diff --git a/code/modules/mob/new_player/savefile.dm b/code/modules/mob/new_player/savefile.dm index 92caa3f98b0..e63714935b8 100644 --- a/code/modules/mob/new_player/savefile.dm +++ b/code/modules/mob/new_player/savefile.dm @@ -135,6 +135,7 @@ datum/preferences/proc/savefile_save(mob/user) // returns 0 if savefile did not exist datum/preferences/proc/savefile_load(mob/user) + if(user.client == null) return 0 if(IsGuestKey(user.key)) return 0 var/path = savefile_path(user)