Merge pull request #116 from skull132/master

Update 12JUN2014
This commit is contained in:
skull132
2014-06-12 15:02:44 +03:00
45 changed files with 20418 additions and 20284 deletions
+17 -2
View File
@@ -80,7 +80,7 @@ var/global/floorIsLava = 0
<A href='?src=\ref[src];getmob=\ref[M]'>Get</A> |
<A href='?src=\ref[src];sendmob=\ref[M]'>Send To</A>
<br><br>
<A href='?src=\ref[src];traitor=\ref[M]'>Traitor panel</A> |
[check_rights(R_ADMIN|R_MOD,0) ? "<A href='?src=\ref[src];traitor=\ref[M]'>Traitor panel</A> | " : "" ]
<A href='?src=\ref[src];narrateto=\ref[M]'>Narrate to</A> |
<A href='?src=\ref[src];subtlemessage=\ref[M]'>Subtle message</A>
"}
@@ -1114,7 +1114,22 @@ var/global/floorIsLava = 0
if(istype(H))
H.regenerate_icons()
proc/get_options_bar(whom, detail = 2, name = 0, link = 1)
/*
helper proc to test if someone is a mentor or not. Got tired of writing this same check all over the place.
/proc/is_mentor(client/C)
if(!istype(C))
return 0
if(!C.holder)
return 0
if(C.holder.rights == R_MENTOR)
return 1
return 0
*/
/proc/get_options_bar(whom, detail = 2, name = 0, link = 1)
if(!whom)
return "<b>(*null*)</b>"
var/mob/M
+11 -2
View File
@@ -1,6 +1,7 @@
//admin verb groups - They can overlap if you so wish. Only one of each verb will exist in the verbs list regardless
var/list/admin_verbs_default = list(
/datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/
/client/proc/player_panel,
/client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
/client/proc/hide_verbs, /*hides all our adminverbs*/
@@ -49,6 +50,7 @@ var/list/admin_verbs_admin = list(
/client/proc/cmd_admin_create_centcom_report,
/client/proc/check_words, /*displays cult-words*/
/client/proc/check_ai_laws, /*shows AI and borg laws*/
/client/proc/check_antagonists,
/client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
/client/proc/toggleprayers, /*toggles prayers on/off*/
@@ -381,9 +383,16 @@ var/list/admin_verbs_mod = list(
if(istype(mob,/mob/dead/observer))
//re-enter
var/mob/dead/observer/ghost = mob
ghost.can_reenter_corpse = 1 //just in-case.
ghost.reenter_corpse()
// if(!is_mentor(usr.client))
// ghost.can_reenter_corpse = 1
if(ghost.can_reenter_corpse)
ghost.reenter_corpse()
else
ghost << "<font color='red'>Error: Aghost: Can't reenter corpse, mentors that use adminHUD while aghosting are not permitted to enter their corpse again</font>"
return
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else if(istype(mob,/mob/new_player))
src << "<font color='red'>Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.</font>"
else
+1 -5
View File
@@ -110,11 +110,7 @@
recieve_message = "<font color='[recieve_color]'>[recieve_pm_type] PM from-<b>[get_options_bar(src, C.holder ? 1 : 0, C.holder ? 1 : 0, 1)]</b>: [msg]</font>"
C << recieve_message
src << "<font color='blue'>[send_pm_type]PM to-<b>[key_name(C, src, holder ? 1 : 0)]</b>: [msg]</font>"
/*if(holder && !C.holder)
C.last_pm_recieved = world.time
C.ckey_last_pm = ckey*/
src << "<font color='blue'>[send_pm_type]PM to-<b>[get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1)]</b>: [msg]</font>"
//play the recieving admin the adminhelp sound (if they have them enabled)
//non-admins shouldn't be able to disable this
+19 -14
View File
@@ -73,20 +73,25 @@
var/age = alert(src, "Age check", "Show accounts yonger then _____ days","7", "30" , "All")
if(age == "All")
if(age == "All")
age = 9999999
else
age = text2num(age)
var/missing_ages = 0
var/msg = ""
var/highlight_special_characters = 1
// if(is_mentor(usr.client))
// highlight_special_characters = 0
for(var/client/C in clients)
if(C.player_age == "Requires database")
missing_ages = 1
continue
if(C.player_age < age)
msg += "[key_name_admin(C)]: account is [C.player_age] days old<br>"
msg += "[key_name(C, 1, 1, highlight_special_characters)]: account is [C.player_age] days old<br>"
if(missing_ages)
src << "Some accounts did not have proper ages set in their clients. This function requires database to be present"
@@ -259,7 +264,7 @@ Ccomp's first proc.
/client/proc/get_ghosts(var/notify = 0,var/what = 2)
// what = 1, return ghosts ass list.
// what = 2, return mob list
// what = 2, return mob list
var/list/mobs = list()
var/list/ghosts = list()
@@ -295,22 +300,22 @@ Ccomp's first proc.
src << "Hrm, appears you didn't select a ghost" // Sanity check, if no ghosts in the list we don't want to edit a null variable and cause a runtime error.
return
var/mob/dead/observer/G = ghosts[target]
if(G.has_enabled_antagHUD && config.antag_hud_restricted)
var/mob/dead/observer/G = ghosts[target]
if(G.has_enabled_antagHUD && config.antag_hud_restricted)
var/response = alert(src, "Are you sure you wish to allow this individual to play?","Ghost has used AntagHUD","Yes","No")
if(response == "No") return
if(response == "No") return
G.timeofdeath=-19999 /* time of death is checked in /mob/verb/abandon_mob() which is the Respawn verb.
timeofdeath is used for bodies on autopsy but since we're messing with a ghost I'm pretty sure
there won't be an autopsy.
*/
G.has_enabled_antagHUD = 2
G.has_enabled_antagHUD = 2
G.can_reenter_corpse = 1
G:show_message(text("\blue <B>You may now respawn. You should roleplay as if you learned nothing about the round during your time with the dead.</B>"), 1)
log_admin("[key_name(usr)] allowed [key_name(G)] to bypass the 30 minute respawn limit")
message_admins("Admin [key_name_admin(usr)] allowed [key_name_admin(G)] to bypass the 30 minute respawn limit", 1)
/client/proc/toggle_antagHUD_use()
set category = "Server"
set name = "Toggle antagHUD usage"
@@ -326,7 +331,7 @@ Ccomp's first proc.
if(g.antagHUD)
g.antagHUD = 0 // Disable it on those that have it enabled
g.has_enabled_antagHUD = 2 // We'll allow them to respawn
g << "\red <B>The Administrator has disabled AntagHUD </B>"
g << "\red <B>The Administrator has disabled AntagHUD </B>"
config.antag_hud_allowed = 0
src << "\red <B>AntagHUD usage has been disabled</B>"
action = "disabled"
@@ -338,8 +343,8 @@ Ccomp's first proc.
config.antag_hud_allowed = 1
action = "enabled"
src << "\blue <B>AntagHUD usage has been enabled</B>"
log_admin("[key_name(usr)] has [action] antagHUD usage for observers")
message_admins("Admin [key_name_admin(usr)] has [action] antagHUD usage for observers", 1)
@@ -356,7 +361,7 @@ Ccomp's first proc.
for(var/mob/dead/observer/g in get_ghosts())
g << "\blue <B>The administrator has lifted restrictions on joining the round if you use AntagHUD</B>"
action = "lifted restrictions"
config.antag_hud_restricted = 0
config.antag_hud_restricted = 0
src << "\blue <B>AntagHUD restrictions have been lifted</B>"
else
for(var/mob/dead/observer/g in get_ghosts())
@@ -370,7 +375,7 @@ Ccomp's first proc.
log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD")
message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1)
-1
View File
@@ -172,7 +172,6 @@ BLIND // can't see anything
icon = 'icons/obj/clothing/shoes.dmi'
desc = "Comfortable-looking shoes."
gender = PLURAL //Carn: for grammarically correct text-parsing
var/chained = 0
siemens_coefficient = 0.9
body_parts_covered = FEET
slot_flags = SLOT_FEET
+1 -1
View File
@@ -43,7 +43,7 @@
icon_state = "voxmask"
item_state = "voxmask"
permeability_coefficient = 0.01
species_restricted = ("Vox")
species_restricted = list("Vox")
toggle()
set category = "Object"
+17 -17
View File
@@ -85,21 +85,21 @@
icon_state = "orange"
item_color = "orange"
/obj/item/clothing/shoes/orange/attack_self(mob/user as mob)
if (src.chained)
src.chained = null
src.slowdown = SHOES_SLOWDOWN
new /obj/item/weapon/handcuffs( user.loc )
src.icon_state = "orange"
return
///obj/item/clothing/shoes/orange/attack_self(mob/user as mob)
// if (src.chained)
// src.chained = null
// src.slowdown = SHOES_SLOWDOWN
// new /obj/item/weapon/handcuffs( user.loc )
// src.icon_state = "orange"
// return
/obj/item/clothing/shoes/orange/attackby(H as obj, loc)
..()
if ((istype(H, /obj/item/weapon/handcuffs) && !( src.chained )))
//H = null
if (src.icon_state != "orange") return
del(H)
src.chained = 1
src.slowdown = 15
src.icon_state = "orange1"
return
///obj/item/clothing/shoes/orange/attackby(H as obj, loc)
// ..()
// if ((istype(H, /obj/item/weapon/handcuffs) && !( src.chained )))
// //H = null
// if (src.icon_state != "orange") return
// del(H)
// src.chained = 1
// src.slowdown = 15
// src.icon_state = "orange1"
// return
+2
View File
@@ -207,9 +207,11 @@
/obj/item/clothing/tie/holster/proc/holster(obj/item/I, mob/user as mob)
if(holstered)
user << "\red There is already a [holstered] holstered here!"
return
if (!istype(I, /obj/item/weapon/gun))
user << "\red Only guns can be holstered!"
return
var/obj/item/weapon/gun/W = I
if (!can_holster(W))
+3 -3
View File
@@ -262,7 +262,7 @@ obj/machinery/computer/forensic_scanning
var/obj/item/weapon/paper/P = new(loc)
var/list/dossier = files[href_list["identifier"]]
P.name = "\improper Database File ([dossier[2]])"
P.overlays += "paper_words"
P.icon_state = "paper_words"
P.info = "<b>Criminal Evidence Database</b><br><br>"
P.info += "Consolidated data points: [dossier[2]]<br>"
var/print_string = "Fingerprints: Print not complete!<br>"
@@ -338,7 +338,7 @@ obj/machinery/computer/forensic_scanning
var/obj/item/weapon/paper/P = new(loc)
var/list/outputs = misc[href_list["identifier"]]
P.name = "\improper Auxiliary Database File ([outputs[3]])"
P.overlays += "paper_words"
P.icon_state = "paper_words"
P.info = "<b>Auxiliary Evidence Database</b><br><br>"
P.info += "<big><b>Consolidated data points:</b> [outputs[3]]</big><br>"
var/list/prints = outputs[4]
@@ -433,7 +433,7 @@ obj/machinery/computer/forensic_scanning
var/obj/item/weapon/paper/P = new(loc)
P.name = "\improper Scan Data ([scan_name])"
P.info = "<tt>[scan_data]</tt>"
P.overlays += "paper_words"
P.icon_state = "paper_words"
else
temp = "Print Failed: No Data"
if("erase")
+3
View File
@@ -51,6 +51,9 @@
stampoverlay.icon_state = "paper_stamp-cent"
if(!R.stamped)
R.stamped = new
R.offset_x += 0
R.offset_y += 0
R.ico += "paper_stamp-cent"
R.stamped += /obj/item/weapon/stamp
R.overlays += stampoverlay
R.stamps += "<HR><i>This paper has been stamped by the EFTPOS device.</i>"
@@ -392,7 +392,7 @@
if (! target.w_uniform )
del(src)
if("internal")
if ((!( (istype(target.wear_mask, /obj/item/clothing/mask) && istype(target.back, /obj/item/weapon/tank) && !( target.internal )) ) && !( target.internal )))
if ((!( (istype(target.wear_mask, /obj/item/clothing/mask) && (istype(target.back, /obj/item/weapon/tank) || istype(target.belt, /obj/item/weapon/tank) || istype(target.s_store, /obj/item/weapon/tank)) && !( target.internal )) ) && !( target.internal )))
del(src)
var/list/L = list( "syringe", "pill", "drink", "dnainjector", "fuel", "sensor", "internal", "tie")
@@ -12,6 +12,7 @@
braintype = "Robot"
lawupdate = 0
density = 1
req_access = list(access_engine, access_robotics)
// We need to keep track of a few module items so we don't need to do list operations
// every time we need them. These get set in New() after the module is chosen.
@@ -22,7 +23,7 @@
var/obj/item/weapon/matter_decompiler/decompiler = null
//Used for self-mailing.
var/mail_destination = 0
var/mail_destination = ""
//Used for pulling.
@@ -30,6 +31,9 @@
..()
if(camera && "Robots" in camera.network)
camera.network.Add("Engineering")
//They are unable to be upgraded, so let's give them a bit of a better battery.
cell.maxcharge = 10000
cell.charge = 10000
@@ -55,7 +59,7 @@
decompiler = locate(/obj/item/weapon/matter_decompiler) in src.module
//Some tidying-up.
flavor_text = "It's a tiny little repair drone. The casing is stamped with an NT log and the subscript: 'NanoTrasen Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'"
flavor_text = "It's a tiny little repair drone. The casing is stamped with an NT logo and the subscript: 'NanoTrasen Recursive Repair Systems: Fixing Tomorrow's Problem, Today!'"
updatename()
updateicon()
@@ -108,7 +112,7 @@
robot_talk(trim(copytext(message,3)))
else if(copytext(message, 1 ,3) == ":d" || copytext(message, 1 ,3) == ":d")
else if(copytext(message, 1 ,3) == ":d" || copytext(message, 1 ,3) == ":D")
if(!is_component_functioning("radio"))
src << "\red Your radio transmitter isn't functional."
@@ -116,11 +120,11 @@
for (var/mob/living/S in living_mob_list)
if(istype(S, /mob/living/silicon/robot/drone))
S << "<i><span class='game say'>Drone Talk, <span class='name'>[name]</span><span class='message'> transmits, \"[message]\"</span></span></i>"
S << "<i><span class='game say'>Drone Talk, <span class='name'>[name]</span><span class='message'> transmits, \"[trim(copytext(message,3))]\"</span></span></i>"
for (var/mob/M in dead_mob_list)
if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain))
M << "<i><span class='game say'>Drone Talk, <span class='name'>[name]</span><span class='message'> transmits, \"[message]\"</span></span></i>"
M << "<i><span class='game say'>Drone Talk, <span class='name'>[name]</span><span class='message'> transmits, \"[trim(copytext(message,3))]\"</span></span></i>"
else
@@ -198,11 +202,15 @@
if(stat == 2)
user << "\red You swipe your ID card through [src], attempting to reboot it."
if(!config.allow_drone_spawn || emagged || health < -35) //It's dead, Dave.
user << "\red The interface is fried, and a distressing burned smell wafts from the robot's interior. You're not rebooting this one."
return
if(!allowed(usr))
user << "\red Access denied."
return
user.visible_message("\red \the [user] swipes \his ID card through \the [src], attempting to reboot it.", "\red You swipe your ID card through \the [src], attempting to reboot it.")
var/drones = 0
for(var/mob/living/silicon/robot/drone/D in world)
if(D.key && D.client)
@@ -212,14 +220,15 @@
return
else
src << "\red [user] swipes an ID card through your card reader."
user << "\red You swipe your ID card through [src], attempting to shut it down."
user.visible_message("\red \the [user] swipes \his ID card through \the [src], attempting to shut it down.", "\red You swipe your ID card through \the [src], attempting to shut it down.")
if(emagged)
return
if(allowed(usr))
shut_down()
else
user << "\red Access denied."
return
@@ -320,13 +329,13 @@
full_law_reset()
src << "<br><b>You are a maintenance drone, a tiny-brained robotic repair machine</b>."
src << "You have no individual will, no personality, and no drives or urges other than your laws."
src << "Use <b>:b</b> to talk to your fellow synthetics, or use <b>say</b> to speak silently to other drones nearby."
src << "Use <b>:b</b> to talk to your fellow synthetics, <b>:d</b> to talk to other drones, and <b>say</b> to speak silently to your nearby fellows."
src << "Remember, you are <b>lawed against interference with the crew</b>."
src << "<b>Don't invade their worksites, don't steal their resources, don't tell them about the changeling in the toilets.</b>"
src << "<b>If a crewmember has noticed you, <i>you are probably breaking your third law</i></b>."
/mob/living/silicon/robot/drone/Bump(atom/movable/AM as mob|obj, yes)
if (!yes || (!istype(AM,/obj/machinery/door) && !istype(AM,/obj/machinery/recharge_station)) ) return
if (!yes || ( !istype(AM,/obj/machinery/door) && !istype(AM,/obj/machinery/recharge_station) && !istype(AM,/obj/machinery/disposal/deliveryChute) ) ) return
..()
return
@@ -4,14 +4,14 @@
set desc = "Tag yourself for delivery through the disposals system."
set category = "Drone"
var/tag = input("Select the desired destination.", "Set Mail Tag", null) as null|anything in TAGGERLOCATIONS
var/new_tag = input("Select the desired destination.", "Set Mail Tag", null) as null|anything in tagger_locations
if(!tag || TAGGERLOCATIONS[tag])
mail_destination = 0
if(!new_tag)
mail_destination = ""
return
src << "\blue You configure your internal beacon, tagging yourself for delivery to '[tag]'."
mail_destination = TAGGERLOCATIONS.Find(tag)
src << "\blue You configure your internal beacon, tagging yourself for delivery to '[new_tag]'."
mail_destination = new_tag
//Auto flush if we use this verb inside a disposal chute.
var/obj/machinery/disposal/D = src.loc
@@ -60,9 +60,9 @@
if (href_list["setarea"])
//Probably should consider using another list, but this one will do.
var/t_area = input("Select the area to ping.", "Set Target Area", null) as null|anything in TAGGERLOCATIONS
var/t_area = input("Select the area to ping.", "Set Target Area", null) as null|anything in tagger_locations
if(!t_area || TAGGERLOCATIONS[t_area])
if(!t_area)
return
drone_call_area = t_area
@@ -968,9 +968,9 @@
if(!I || !istype(I, /obj/item/weapon/card/id) || !I.access) //not ID or no access
return 0
for(var/req in req_access)
if(!(req in I.access)) //doesn't have this access
return 0
return 1
if(req in I.access) //have one of the required accesses
return 1
return 0
/mob/living/silicon/robot/proc/updateicon()
@@ -45,7 +45,8 @@
name = "standard robot module"
New()
..()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/melee/baton(src)
src.modules += new /obj/item/weapon/extinguisher(src)
src.modules += new /obj/item/weapon/wrench(src)
@@ -63,7 +64,8 @@
name = "medical robot module"
New()
..()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/hud/med(src)
src.modules += new /obj/item/device/healthanalyzer(src)
src.modules += new /obj/item/device/reagent_scanner/adv(src)
@@ -94,7 +96,8 @@
New()
..()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.emag = new /obj/item/borg/stun(src)
src.modules += new /obj/item/weapon/rcd/borg(src)
@@ -146,7 +149,8 @@
name = "security robot module"
New()
..()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/hud/sec(src)
src.modules += new /obj/item/weapon/handcuffs/cyborg(src)
src.modules += new /obj/item/weapon/melee/baton(src)
@@ -177,7 +181,8 @@
name = "janitorial robot module"
New()
..()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/soap/nanotrasen(src)
src.modules += new /obj/item/weapon/storage/bag/trash(src)
src.modules += new /obj/item/weapon/mop(src)
@@ -199,7 +204,8 @@
name = "service robot module"
New()
..()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src)
src.modules += new /obj/item/weapon/pen/robopen(src)
@@ -236,7 +242,8 @@
name = "miner robot module"
New()
..()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/meson(src)
src.emag = new /obj/item/borg/stun(src)
src.modules += new /obj/item/weapon/storage/bag/ore(src)
@@ -249,6 +256,8 @@
name = "syndicate robot module"
New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/weapon/melee/energy/sword(src)
src.modules += new /obj/item/weapon/gun/energy/pulse_rifle/destroyer(src)
src.modules += new /obj/item/weapon/card/emag(src)
@@ -258,6 +267,8 @@
name = "combat robot module"
New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash(src)
src.modules += new /obj/item/borg/sight/thermal(src)
src.modules += new /obj/item/weapon/gun/energy/laser/cyborg(src)
src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src)
@@ -283,8 +294,7 @@
)
New()
//TODO: Replace with shittier flashlight and work out why we can't remove the flash. ~Z
..()
src.modules += new /obj/item/device/flashlight/drone(src)
src.modules += new /obj/item/weapon/weldingtool(src)
src.modules += new /obj/item/weapon/screwdriver(src)
src.modules += new /obj/item/weapon/wrench(src)
+7 -4
View File
@@ -58,11 +58,14 @@
for(var/mob/M in player_list)
if(istype(M, /mob/new_player))
continue
if(M.client && M.client.holder && (M.client.holder.rights & R_ADMIN|R_MOD) && (M.client.prefs.toggles & CHAT_DEAD)) // Show the message to admins/mods with deadchat toggled on
if(M.client && M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD))
M << rendered
continue
if(M.client && M.client.holder /*&& !is_mentor(M.client) */&& (M.client.prefs.toggles & CHAT_DEAD) ) // Show the message to admins/mods with deadchat toggled on
M << rendered //Admins can hear deadchat, if they choose to, no matter if they're blind/deaf or not.
else if(M.client && M.stat == DEAD && (M.client.prefs.toggles & CHAT_DEAD)) // Show the message to regular ghosts with deadchat toggled on.
M.show_message(rendered, 2) //Takes into account blindness and such.
return
/mob/proc/say_understands(var/mob/other,var/datum/language/speaking = null)
@@ -154,7 +157,7 @@
if(length(message) >= 2)
var/channel_prefix = copytext(message, 1 ,3)
return department_radio_keys[channel_prefix]
return null
//parses the language code (e.g. :j) from text, such as that supplied to say.
+2 -5
View File
@@ -377,16 +377,13 @@ This function completely restores a damaged organ to perfect condition.
// Internal wounds get worse over time. Low temperatures (cryo) stop them.
if(W.internal && !W.is_treated() && owner.bodytemperature >= 170)
var/bicardose = owner.reagents.get_reagent_amount("bicaridine")
if(!bicardose) //bicard stops internal wounds from growing bigger with time, and also stop bleeding
var/inaprovaline = owner.reagents.get_reagent_amount("inaprovaline")
if(!bicardose || !inaprovaline) //bicaridine and inaprovaline stop internal wounds from growing bigger with time, and also stop bleeding
W.open_wound(0.1 * wound_update_accuracy)
owner.vessel.remove_reagent("blood",0.05 * W.damage * wound_update_accuracy)
if(bicardose >= 30) //overdose of bicaridine begins healing IB
W.damage = max(0, W.damage - 0.2)
if(!owner.reagents.has_reagent("inaprovaline")) //This little copypaste will allow inaprovaline to work too, giving it a much needed buff to help medical.
W.open_wound(0.1 * wound_update_accuracy)
owner.vessel.remove_reagent("blood",0.05 * W.damage * wound_update_accuracy)
owner.vessel.remove_reagent("blood",0.02 * W.damage * wound_update_accuracy)
if(prob(1 * wound_update_accuracy))
owner.custom_pain("You feel a stabbing pain in your [display_name]!",1)
+7 -2
View File
@@ -376,8 +376,13 @@
stamps += (stamps=="" ? "<HR>" : "<BR>") + "<i>This paper has been stamped with the [P.name].</i>"
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
var/x = rand(-2, 2)
var/y = rand(-3, 2)
var/{x; y;}
if(istype(P, /obj/item/weapon/stamp/captain) || istype(P, /obj/item/weapon/stamp/centcomm))
x = rand(-2, 0)
y = rand(-1, 2)
else
x = rand(-2, 2)
y = rand(-3, 2)
offset_x += x
offset_y += y
stampoverlay.pixel_x = x
+1
View File
@@ -80,6 +80,7 @@
p.loc = src.loc
p.update_icon()
p.icon_state = "paper_words"
p.name = bundle.name
p.pixel_y = rand(-8, 8)
p.pixel_x = rand(-9, 9)
sleep(15*j)
@@ -16,7 +16,7 @@
if(!reagents.total_volume)
if(M == usr)
usr << "<span class='notice'>You finish eating \the [src].</span>"
usr.visible_message("<span class='notice'>[usr] finishes eating \the [src].</span>")
M.visible_message("<span class='notice'>[M] finishes eating \the [src].</span>")
usr.drop_from_inventory(src) //so icons update :[
if(trash)
@@ -73,6 +73,12 @@
base_state = "pipe-d"
dpdir = dir
///// Z-Level stuff
if(13)
base_state = "pipe-tagger"
dpdir = dir | flip
if(14)
base_state = "pipe-tagger-partial"
dpdir = dir | flip
///// Z-Level stuff
@@ -83,7 +89,7 @@
icon_state = base_state
if(invisibility) // if invisible, fade icon
icon -= rgb(0,0,0,128)
alpha = 128
// hide called by levelupdate if turf intact status changes
// change visibility status and force update of icon
@@ -147,14 +153,20 @@
return /obj/structure/disposaloutlet
if(8)
return /obj/machinery/disposal/deliveryChute
if(9,10)
if(9)
return /obj/structure/disposalpipe/sortjunction
if(10)
return /obj/structure/disposalpipe/sortjunction/flipped
///// Z-Level stuff
if(11)
return /obj/structure/disposalpipe/up
if(12)
return /obj/structure/disposalpipe/down
///// Z-Level stuff
if(13)
return /obj/structure/disposalpipe/tagger
if(14)
return /obj/structure/disposalpipe/tagger/partial
return
@@ -177,6 +189,12 @@
if(9, 10)
nicetype = "sorting pipe"
ispipe = 1
if(13)
nicetype = "tagging pipe"
ispipe = 1
if(14)
nicetype = "partial tagging pipe"
ispipe = 1
else
nicetype = "pipe"
ispipe = 1
+130 -93
View File
@@ -487,12 +487,14 @@
var/datum/gas_mixture/gas = null // gas used to flush, will appear at exit point
var/active = 0 // true if the holder is moving, otherwise inactive
dir = 0
var/count = 1000 //*** can travel 1000 steps before going inactive (in case of loops)
var/count = 2048 //*** can travel 2048 steps before going inactive (in case of loops)
var/has_fat_guy = 0 // true if contains a fat person
var/destinationTag = 0 // changes if contains a delivery container
var/destinationTag = "" // changes if contains a delivery container
var/tomail = 0 //changes if contains wrapped package
var/hasmob = 0 //If it contains a mob
var/partialTag = "" //set by a partial tagger the first time round, then put in destinationTag if it goes through again.
// initialize a holder from the contents of a disposal unit
proc/init(var/obj/machinery/disposal/D)
@@ -608,6 +610,17 @@
del(other)
proc/settag(var/new_tag)
destinationTag = new_tag
proc/setpartialtag(var/new_tag)
if(partialTag == new_tag)
destinationTag = new_tag
partialTag = ""
else
partialTag = new_tag
// called when player tries to move while in a pipe
relaymove(mob/user as mob)
@@ -901,6 +914,10 @@
if("pipe-d")
C.ptype = 12
///// Z-Level stuff
if("pipe-tagger")
C.ptype = 13
if("pipe-tagger-partial")
C.ptype = 14
src.transfer_fingerprints_to(C)
C.dir = dir
C.density = 0
@@ -1080,39 +1097,31 @@
else
return mask & (~setbit)
//a three-way junction that sorts objects
/obj/structure/disposalpipe/sortjunction
icon_state = "pipe-j1s"
var/sortType = 0 //Look at the list called TAGGERLOCATIONS in setup.dm
var/posdir = 0
var/negdir = 0
var/sortdir = 0
/obj/structure/disposalpipe/tagger
name = "package tagger"
icon_state = "pipe-tagger"
var/sort_tag = ""
var/partial = 0
proc/updatedesc()
desc = "An underfloor disposal pipe with a package sorting mechanism."
if(sortType>0)
var/tag = uppertext(TAGGERLOCATIONS[sortType])
desc += "\nIt's tagged with [tag]"
desc = initial(desc)
if(sort_tag)
desc += "\nIt's tagging objects with the '[sort_tag]' tag."
proc/updatedir()
posdir = dir
negdir = turn(posdir, 180)
if(icon_state == "pipe-j1s")
sortdir = turn(posdir, -90)
proc/updatename()
if(sort_tag)
name = "[initial(name)] ([sort_tag])"
else
icon_state = "pipe-j2s"
sortdir = turn(posdir, 90)
dpdir = sortdir | posdir | negdir
name = initial(name)
New()
..()
updatedir()
. = ..()
dpdir = dir | turn(dir, 180)
if(sort_tag) tagger_locations |= sort_tag
updatename()
updatedesc()
update()
return
attackby(var/obj/item/I, var/mob/user)
if(..())
@@ -1121,13 +1130,84 @@
if(istype(I, /obj/item/device/destTagger))
var/obj/item/device/destTagger/O = I
if(O.currTag > 0)// Tag set
sortType = O.currTag
if(O.currTag)// Tag set
sort_tag = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
var/tag = uppertext(TAGGERLOCATIONS[O.currTag])
user << "\blue Changed filter to [tag]"
user << "\blue Changed tag to '[sort_tag]'."
updatename()
updatedesc()
transfer(var/obj/structure/disposalholder/H)
if(sort_tag)
if(partial)
H.setpartialtag(sort_tag)
else
H.settag(sort_tag)
return ..()
/obj/structure/disposalpipe/tagger/partial //needs two passes to tag
name = "partial package tagger"
icon_state = "pipe-tagger-partial"
partial = 1
//a three-way junction that sorts objects
/obj/structure/disposalpipe/sortjunction
name = "sorting junction"
icon_state = "pipe-j1s"
desc = "An underfloor disposal pipe with a package sorting mechanism."
var/sortType = ""
var/posdir = 0
var/negdir = 0
var/sortdir = 0
proc/updatedesc()
desc = initial(desc)
if(sortType)
desc += "\nIt's filtering objects with the '[sortType]' tag."
proc/updatename()
if(sortType)
name = "[initial(name)] ([sortType])"
else
name = initial(name)
proc/updatedir()
posdir = dir
negdir = turn(posdir, 180)
if(icon_state == "pipe-j1s")
sortdir = turn(posdir, -90)
else if(icon_state == "pipe-j2s")
sortdir = turn(posdir, 90)
dpdir = sortdir | posdir | negdir
New()
. = ..()
if(sortType) tagger_locations |= sortType
updatedir()
updatename()
updatedesc()
update()
attackby(var/obj/item/I, var/mob/user)
if(..())
return
if(istype(I, /obj/item/device/destTagger))
var/obj/item/device/destTagger/O = I
if(O.currTag)// Tag set
sortType = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
user << "\blue Changed filter to '[sortType]'."
updatename()
updatedesc()
proc/divert_check(var/checkTag)
return sortType == checkTag
// next direction to move
// if coming in from negdir, then next is primary dir or sortdir
@@ -1135,11 +1215,9 @@
// if coming in from sortdir, go to posdir
nextdir(var/fromdir, var/sortTag)
//var/flipdir = turn(fromdir, 180)
if(fromdir != sortdir) // probably came from the negdir
if(src.sortType == sortTag) //if destination matches filtered type...
return sortdir // exit through sortdirection
if(divert_check(sortTag))
return sortdir
else
return posdir
else // came from sortdir
@@ -1165,71 +1243,30 @@
return P
//a three-way junction that filters all wrapped and tagged items
/obj/structure/disposalpipe/sortjunction/wildcard
name = "wildcard sorting junction"
desc = "An underfloor disposal pipe which filters all wrapped and tagged items."
//a three-way junction that sorts objects destined for the mail office mail table (tomail = 1)
/obj/structure/disposalpipe/wrapsortjunction
divert_check(var/checkTag)
return checkTag != ""
desc = "An underfloor disposal pipe which sorts wrapped and unwrapped objects."
icon_state = "pipe-j1s"
var/posdir = 0
var/negdir = 0
var/sortdir = 0
New()
..()
posdir = dir
if(icon_state == "pipe-j1s")
sortdir = turn(posdir, -90)
negdir = turn(posdir, 180)
else
icon_state = "pipe-j2s"
sortdir = turn(posdir, 90)
negdir = turn(posdir, 180)
dpdir = sortdir | posdir | negdir
update()
return
// next direction to move
// if coming in from negdir, then next is primary dir or sortdir
// if coming in from posdir, then flip around and go back to posdir
// if coming in from sortdir, go to posdir
nextdir(var/fromdir, var/istomail)
//var/flipdir = turn(fromdir, 180)
if(fromdir != sortdir) // probably came from the negdir
if(istomail) //if destination matches filtered type...
return sortdir // exit through sortdirection
else
return posdir
else // came from sortdir
// so go with the flow to positive direction
return posdir
transfer(var/obj/structure/disposalholder/H)
var/nextdir = nextdir(H.dir, H.tomail)
H.dir = nextdir
var/turf/T = H.nextloc()
var/obj/structure/disposalpipe/P = H.findpipe(T)
if(P)
// find other holder in next loc, if inactive merge it with current
var/obj/structure/disposalholder/H2 = locate() in P
if(H2 && !H2.active)
H.merge(H2)
H.loc = P
else // if wasn't a pipe, then set loc to turf
H.loc = T
return null
return P
//junction that filters all untagged items
/obj/structure/disposalpipe/sortjunction/untagged
name = "untagged sorting junction"
desc = "An underfloor disposal pipe which filters all untagged items."
divert_check(var/checkTag)
return checkTag == ""
/obj/structure/disposalpipe/sortjunction/flipped //for easier and cleaner mapping
icon_state = "pipe-j2s"
/obj/structure/disposalpipe/sortjunction/wildcard/flipped
icon_state = "pipe-j2s"
/obj/structure/disposalpipe/sortjunction/untagged/flipped
icon_state = "pipe-j2s"
//a trunk joining to a disposal bin or outlet on the same turf
/obj/structure/disposalpipe/trunk
+10 -18
View File
@@ -5,7 +5,7 @@
icon_state = "deliverycloset"
var/obj/wrapped = null
density = 1
var/sortTag = 0
var/sortTag = ""
flags = FPRINT | NOBLUDGEON
mouse_drag_pointer = MOUSE_ACTIVE_POINTER
@@ -23,8 +23,7 @@
var/obj/item/device/destTagger/O = W
if(src.sortTag != O.currTag)
var/tag = uppertext(TAGGERLOCATIONS[O.currTag])
user << "\blue *[tag]*"
user << "\blue *[O.currTag]*"
src.sortTag = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
@@ -44,7 +43,7 @@
icon = 'icons/obj/storage.dmi'
icon_state = "deliverycrateSmall"
var/obj/item/wrapped = null
var/sortTag = 0
var/sortTag = ""
flags = FPRINT
@@ -64,8 +63,7 @@
var/obj/item/device/destTagger/O = W
if(src.sortTag != O.currTag)
var/tag = uppertext(TAGGERLOCATIONS[O.currTag])
user << "\blue *[tag]*"
user << "\blue *[O.currTag]*"
src.sortTag = O.currTag
playsound(src.loc, 'sound/machines/twobeep.ogg', 100, 1)
@@ -161,11 +159,6 @@
desc = "Used to set the destination of properly wrapped packages."
icon_state = "dest_tagger"
var/currTag = 0
//The whole system for the sorttype var is determined based on the order of this list,
//disposals must always be 1, since anything that's untagged will automatically go to disposals, or sorttype = 1 --Superxpdude
//If you don't want to fuck up disposals, add to this list, and don't change the order.
//If you insist on changing the order, you'll have to change every sort junction to reflect the new order. --Pete
w_class = 2
item_state = "electronic"
@@ -173,16 +166,16 @@
slot_flags = SLOT_BELT
proc/openwindow(mob/user as mob)
var/dat = "<tt><center><h1><b>TagMaster 2.2</b></h1></center>"
var/dat = "<tt><center><h1><b>TagMaster 2.3</b></h1></center>"
dat += "<table style='width:100%; padding:4px;'><tr>"
for (var/i = 1, i <= TAGGERLOCATIONS.len, i++)
dat += "<td><a href='?src=\ref[src];nextTag=[i]'>[TAGGERLOCATIONS[i]]</a></td>"
for(var/i = 1, i <= tagger_locations.len, i++)
dat += "<td><a href='?src=\ref[src];nextTag=[tagger_locations[i]]'>[tagger_locations[i]]</a></td>"
if (i%4==0)
dat += "</tr><tr>"
dat += "</tr></table><br>Current Selection: [currTag ? TAGGERLOCATIONS[currTag] : "None"]</tt>"
dat += "</tr></table><br>Current Selection: [currTag ? currTag : "None"]</tt>"
user << browse(dat, "window=destTagScreen;size=450x350")
onclose(user, "destTagScreen")
@@ -193,9 +186,8 @@
Topic(href, href_list)
src.add_fingerprint(usr)
if(href_list["nextTag"])
var/n = text2num(href_list["nextTag"])
src.currTag = n
if(href_list["nextTag"] && href_list["nextTag"] in tagger_locations)
src.currTag = href_list["nextTag"]
openwindow(usr)
/obj/machinery/disposal/deliveryChute