Merge remote-tracking branch 'upstream/master' into dev

This commit is contained in:
Mloc-Argent
2014-05-05 22:22:01 +01:00
25 changed files with 1335 additions and 1105 deletions

View File

@@ -205,6 +205,9 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, forc
else
total_fuel += liquid.amount
if(total_fuel == 0)
return 0
//Calculate the firelevel.
var/firelevel = calculate_firelevel(liquid)

View File

@@ -108,10 +108,57 @@
header += "<hr>"
var/jobs_all = ""
var/list/alljobs = (istype(src,/obj/machinery/computer/card/centcom)? get_all_centcom_jobs() : joblist) + "Custom"
for(var/job in alljobs)
jobs_all += "<a href='?src=\ref[src];choice=assign;assign_target=[job]'>[replacetext(job, " ", "&nbsp")]</a> " //make sure there isn't a line break in the middle of a job
var/counter = 0
jobs_all += "<table><tr><td></td><td><b>Command</b></td>"
jobs_all += "</tr><tr height='20'><td><b>Special</b></font></td>"//Captain in special because he is head of heads ~Intercross21
jobs_all += "<td weight='100'><a href='?src=\ref[src];choice=assign;assign_target=Captain'>Captain</a></td>"
jobs_all += "<td weight='100'><a href='?src=\ref[src];choice=assign;assign_target=Custom'>Custom</a></td>"
counter = 0
jobs_all += "</tr><tr><td><font color='#FFA500'><b>Engineering</b></font></td>"//Orange
for(var/job in engineering_positions)
counter++
if(counter >= 6)
jobs_all += "</tr><tr height='20'><td></td><td></td>"
counter = 0
jobs_all += "<td height='20' weight='100'><a href='?src=\ref[src];choice=assign;assign_target=[job]'>[replacetext(job, " ", "&nbsp")]</a></td>"
counter = 0
jobs_all += "</tr><tr height='20'><td><font color='#008000'><b>Medical</b></font></td>"//Green
for(var/job in medical_positions)
counter++
if(counter >= 6)
jobs_all += "</tr><tr height='20'><td></td><td></td>"
counter = 0
jobs_all += "<td weight='100'><a href='?src=\ref[src];choice=assign;assign_target=[job]'>[replacetext(job, " ", "&nbsp")]</a></td>"
counter = 0
jobs_all += "</tr><tr height='20'><td><font color='#800080'><b>Science</b></font></td>"//Purple
for(var/job in science_positions)
counter++
if(counter >= 6)
jobs_all += "</tr><tr height='20'><td></td><td></td>"
counter = 0
jobs_all += "<td weight='100'><a href='?src=\ref[src];choice=assign;assign_target=[job]'>[replacetext(job, " ", "&nbsp")]</a></td>"
counter = 0
jobs_all += "</tr><tr height='20'><td><font color='#808080'><b>Civilian</b></font></td>"//Grey
for(var/job in civilian_positions)
counter++
if(counter >= 6)
jobs_all += "</tr><tr height='20'><td></td><td></td>"
counter = 0
jobs_all += "<td weight='100'><a href='?src=\ref[src];choice=assign;assign_target=[job]'>[replacetext(job, " ", "&nbsp")]</a></td>"
if(istype(src,/obj/machinery/computer/card/centcom))
counter = 0
jobs_all += "</tr><tr><td><font color='#A52A2A'><b>CentComm</b></font></td>"//Brown
for(var/job in get_all_centcom_jobs())
if(counter >= 6)
jobs_all += "</tr><tr><td></td><td></td>"
counter = 0
jobs_all += "<td><a href='?src=\ref[src];choice=assign;assign_target=[job]'>[replacetext(job, " ", "&nbsp")]</a></td>"
var/body
if (authenticated && modify)
@@ -138,7 +185,7 @@
}
function hideAll(){
var allJobsSlot = document.getElementById('alljobsslot');
allJobsSlot.innerHTML = "<a href='#' onclick='showAll()'>show</a>";
allJobsSlot.innerHTML = "<a href='#' onclick='showAll()'>[(modify.assignment) ? modify.assignment : "Unassgied"]</a>";
}
</script>"}
carddesc += "<form name='cardcomp' action='?src=\ref[src]' method='get'>"

View File

@@ -47,12 +47,15 @@
/obj/item/borg/sight/thermal
name = "\proper thermal vision"
sight_mode = BORGTHERM
icon_state = "thermal"
icon = 'icons/obj/clothing/glasses.dmi'
/obj/item/borg/sight/meson
name = "\proper meson vision"
sight_mode = BORGMESON
icon_state = "meson"
icon = 'icons/obj/clothing/glasses.dmi'
/obj/item/borg/sight/hud
name = "hud"
@@ -61,7 +64,8 @@
/obj/item/borg/sight/hud/med
name = "medical hud"
icon_state = "healthhud"
icon = 'icons/obj/clothing/glasses.dmi'
New()
..()
@@ -71,7 +75,8 @@
/obj/item/borg/sight/hud/sec
name = "security hud"
icon_state = "securityhud"
icon = 'icons/obj/clothing/glasses.dmi'
New()
..()

View File

@@ -285,11 +285,14 @@
playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
return
if( !H.shoes && ( !H.wear_suit || !(H.wear_suit.body_parts_covered & FEET) ) )
var/datum/organ/external/affecting = H.get_organ(pick("l_foot", "r_foot"))
if(affecting.status & ORGAN_ROBOT)
return
H.Weaken(3)
if(affecting.take_damage(5, 0))
H.UpdateDamageIcon()

View File

@@ -449,11 +449,15 @@
item_state = "crowbar_red"
/obj/item/weapon/weldingtool/attack(mob/M as mob, mob/user as mob)
if(hasorgans(M))
var/datum/organ/external/S = M:organs_by_name[user.zone_sel.selecting]
if (!S) return
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
return ..()
if(S.brute_dam)
S.heal_damage(15,0,0,1)
if(user != M)
@@ -464,7 +468,26 @@
user.visible_message("\red \The [user] patches some dents on their [S.display_name] with \the [src]",\
"\red You patch some dents on your [S.display_name]",\
"You hear a welder.")
else
user << "Nothing to fix!"
return
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
if(H.getBruteLoss() > 0)
if(M == user)
user << "\red You can't repair damage to your own body - it's against OH&S."
return
user.visible_message("\red \The [user] patches some dents on \the [M] with \the [src]",\
"\red You patch some of the dents on \the [M].",\
"You hear a welder.")
H.heal_overall_damage(5,0)
return
user << "Nothing to fix!"
else
return ..()

View File

@@ -1099,6 +1099,30 @@ var/global/floorIsLava = 0
if(istype(H))
H.regenerate_icons()
proc/get_options_bar(whom, detail = 2, name = 0, link = 1)
if(!whom)
return "<b>(*null*)</b>"
var/mob/M
var/client/C
if(istype(whom, /client))
C = whom
M = C.mob
else if(istype(whom, /mob))
M = whom
C = M.client
else
return "<b>(*not an mob*)</b>"
switch(detail)
if(0)
return "<b>[key_name(C, link, name)]</b>"
if(1)
return "<b>[key_name(C, link, name)](<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</A>)</b>"
if(2)
var/ref_mob = "\ref[M]"
return "<b>[key_name(C, link, name)](<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=[ref_mob]'>JMP</A>) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>)</b>"
//
//
//ALL DONE

View File

@@ -15,8 +15,9 @@
var/quick_create_object_html = null
var/pathtext = null
pathtext = input("Select the path of the object you wish to create.", "Path", "/obj") in list("/obj","/obj/structure","/obj/item","/obj/item/weapon","/obj/machinery")
pathtext = input("Select the path of the object you wish to create.", "Path", "/obj") as null|anything in list("/obj","/obj/structure","/obj/item","/obj/item/weapon","/obj/item/clothing","/obj/machinery","/obj/mecha")
if(!pathtext)
return
var path = text2path(pathtext)
if (!quick_create_object_html)

View File

@@ -87,7 +87,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(!mob) return //this doesn't happen
var/ref_mob = "\ref[mob]"
msg = "\blue <b><font color=red>HELP: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) (<A HREF='?_src_=holder;adminplayerobservejump=[ref_mob]'>JMP</A>) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""]:</b> [msg]"
msg = "\blue <b><font color=red>HELP: </font>[get_options_bar(mob, 2, 1, 1)][ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""]:</b> [msg]"
//send this msg to all admins
var/admin_number_afk = 0

View File

@@ -109,9 +109,9 @@
adminhelp(reply) //sender has left, adminhelp instead
return
recieve_message = "<font color='[recieve_color]'>[recieve_pm_type] PM from-<b>[key_name(src, C, C.holder ? 1 : 0)]</b>: [msg]</font>"
recieve_message = "<font color='[recieve_color]'>[recieve_pm_type] PM from-<b>[get_options_bar(C, 1, 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>"
src << "<font color='blue'>[send_pm_type]PM to-<b>[get_options_bar(C, 1, holder ? 1 : 0, 1)]</b>: [msg]</font>"
/*if(holder && !C.holder)
C.last_pm_recieved = world.time
@@ -189,6 +189,10 @@
return
var/msg = input(src,"Message:", "Private message to admins on IRC / 400 character limit") as text|null
if(!msg)
return
sanitize(msg)
if(length(msg) > 400) // TODO: if message length is over 400, divide it up into seperate messages, the message length restriction is based on IRC limitations. Probably easier to do this on the bots ends.
@@ -205,5 +209,5 @@
if(X == src)
continue
if((X.holder.rights & R_ADMIN) || (X.holder.rights & R_MOD))
X << "<B><font color='blue'>PM: [key_name(src, X, 0)]-&gt;IRC-Admins:</B> \blue [msg]</font>"
X << "<B><font color='blue'>PM: [key_name(src, X, 0)]-&gt;IRC-Admins:</B> \blue [msg]</font>"

View File

@@ -410,9 +410,9 @@ datum/preferences
dat += "<a href='?_src_=prefs;preference=reset_all'>Reset Setup</a>"
dat += "</center></body></html>"
user << browse(dat, "window=preferences;size=560x580")
user << browse(dat, "window=preferences;size=560x736")
proc/SetChoices(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer"), width = 550, height = 550)
proc/SetChoices(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer"), width = 550, height = 660)
if(!job_master)
return

View File

@@ -32,7 +32,7 @@
if(istype(src, /mob/dead/observer))
if(italics && client.prefs.toggles & CHAT_GHOSTRADIO)
return
if(speaker_name != speaker.real_name)
if(speaker_name != speaker.real_name && speaker.real_name)
speaker_name = "[speaker.real_name] ([speaker_name])"
track = "(<a href='byond://?src=\ref[src];track=\ref[speaker]'>follow</a>) "
if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src))

View File

@@ -60,7 +60,7 @@
hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank")
hud_list[STATUS_HUD_OOC] = image('icons/mob/hud.dmi', src, "hudhealthy")
..()
@@ -856,6 +856,10 @@
return
/mob/living/carbon/human/proc/vomit()
if(species.flags & IS_SYNTHETIC)
return //Machines don't throw up.
if(!lastpuke)
lastpuke = 1
src << "<spawn class='warning'>You feel nauseous..."

View File

@@ -73,6 +73,10 @@
/mob/living/carbon/human/adjustCloneLoss(var/amount)
..()
if(species.flags & IS_SYNTHETIC)
return
var/heal_prob = max(0, 80 - getCloneLoss())
var/mut_prob = min(80, getCloneLoss()+10)
if (amount > 0)

View File

@@ -225,6 +225,9 @@
proc/handle_mutations_and_radiation()
if(species.flags & IS_SYNTHETIC) //Robots don't suffer from mutations or radloss.
return
if(getFireLoss())
if((COLD_RESISTANCE in mutations) || (prob(1)))
heal_organ_damage(0,1)
@@ -249,6 +252,7 @@
radiation = 0
else
if(species.flags & RAD_ABSORB)
var/rads = radiation/25
radiation -= rads
@@ -258,8 +262,6 @@
adjustToxLoss(-(rads))
updatehealth()
return
if(species.flags & IS_SYNTHETIC)
return
var/damage = 0
switch(radiation)

View File

@@ -9,6 +9,8 @@
src << "\red You cannot speak in IC (Muted)."
return
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if(stat == 2)
return say_dead(message)
@@ -146,6 +148,10 @@
if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak.
return 1
if (istype(other, /mob/living/carbon/monkey/diona) && !speaking)
if(other.languages.len >= 2) //They've sucked down some blood and can speak common now.
return 1
if (istype(other, /mob/living/silicon))
return 1
if (istype(other, /mob/living/carbon/brain))

View File

@@ -252,3 +252,51 @@
src << "\green You feel your awareness expand, and realize you know how to understand the creatures around you."
else
src << "\green The blood seeps into your small form, and you draw out the echoes of memories and personality from it, working them into your budding mind."
/mob/living/carbon/monkey/diona/say_understands(var/mob/other,var/datum/language/speaking = null)
if (istype(other, /mob/living/carbon/human) && !speaking)
if(languages.len >= 2) // They have sucked down some blood.
return 1
return ..()
/mob/living/carbon/monkey/diona/say(var/message)
var/verb = "says"
var/message_range = world.view
if(client)
if(client.prefs.muted & MUTE_IC)
src << "\red You cannot speak in IC (Muted)."
return
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if(stat == 2)
return say_dead(message)
var/datum/language/speaking = null
if(length(message) >= 2)
var/channel_prefix = copytext(message, 1 ,3)
if(languages.len)
for(var/datum/language/L in languages)
if(lowertext(channel_prefix) == ":[L.key]")
verb = L.speech_verb
speaking = L
break
if(speaking)
message = trim(copytext(message,3))
message = capitalize(trim_left(message))
if(!message || stat)
return
..(message, speaking, verb, null, null, message_range, null)

View File

@@ -515,7 +515,7 @@
/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools
return 0
/mob/living/carbon/monkey/say(var/message)
/mob/living/carbon/monkey/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/italics=0, var/message_range = world.view, var/list/used_radios = list())
if(stat)
return
@@ -525,11 +525,9 @@
if(stat)
return
var/verb = "says"
if(speak_emote.len)
verb = pick(speak_emote)
message = capitalize(trim_left(message))
..(message, null, verb)
..(message, speaking, verb, alt_name, italics, message_range, used_radios)

View File

@@ -105,7 +105,7 @@ var/list/department_radio_keys = list(
objects |= O
for(var/mob/M in player_list)
if(M.stat == DEAD && client && (M.client.prefs.toggles & CHAT_GHOSTEARS))
if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS))
listening |= M
continue
if(M.loc && M.locs[1] in hearturfs)

View File

@@ -23,8 +23,9 @@
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
if (stat == 2)
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
return say_dead(message)
if(copytext(message,1,2) == "*")

View File

@@ -515,8 +515,6 @@ This function completely restores a damaged organ to perfect condition.
var/obj/organ //Dropped limb object
switch(body_part)
if(LOWER_TORSO)
owner << "\red You are now sterile."
if(HEAD)
if(owner.species.flags & IS_SYNTHETIC)
organ= new /obj/item/weapon/organ/head/posi(owner.loc, owner)

View File

@@ -638,11 +638,14 @@ obj/structure/cable/proc/cableColor(var/colorC)
/obj/item/weapon/cable_coil/attack(mob/M as mob, mob/user as mob)
if(hasorgans(M))
var/datum/organ/external/S = M:get_organ(user.zone_sel.selecting)
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help")
return ..()
if(S.burn_dam > 0 && use(1))
S.heal_damage(0,15,0,1)
if(user != M)
user.visible_message("<span class='notice'>\The [user] repairs some burn damage on [M]'s [S.display_name] with \the [src]</span>",\
"<span class='notice'>\The [user] repairs some burn damage on your [S.display_name]</span>",\
@@ -651,7 +654,28 @@ obj/structure/cable/proc/cableColor(var/colorC)
user.visible_message("<span class='notice'>\The [user] repairs some burn damage on their [S.display_name] with \the [src]</span>",\
"<span class='notice'>You repair some burn damage on your [S.display_name]</span>",\
"You hear wires being cut.")
else
user << "Nothing to fix!"
return
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
if(H.getFireLoss() > 0)
if(M == user)
user << "\red You can't repair damage to your own body - it's against OH&S."
return
user.visible_message("<span class='notice'>\The [user] repairs some burn damage on [M] with \the [src]</span>",\
"<span class='notice'>You repair some of \the [M]'s burn damage.</span>",\
"You hear wires being cut.")
H.heal_overall_damage(0,5)
return
user << "Nothing to fix!"
else
return ..()

View File

@@ -27,6 +27,13 @@
return 0
if(M == user)
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
H << "\red You have a monitor for a head, where do you think you're going to put that?"
return
M << "\blue You swallow a gulp of [src]."
if(reagents.total_volume)
reagents.trans_to_ingest(M, gulp_size)
@@ -35,6 +42,11 @@
return 1
else if( istype(M, /mob/living/carbon/human) )
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
H << "\red They have a monitor for a head, where do you think you're going to put that?"
return
for(var/mob/O in viewers(world.view, user))
O.show_message("\red [user] attempts to feed [M] [src].", 1)
if(!do_mob(user, M)) return

View File

@@ -37,9 +37,15 @@
M.drop_from_inventory(src) //so icons update :[
del(src)
return 0
if(istype(M, /mob/living/carbon))
if(M == user) //If you're eating it yourself.
var/fullness = M.nutrition + (M.reagents.get_reagent_amount("nutriment") * 25)
var/fullness = M.nutrition + (M.reagents.get_reagent_amount("nutriment") * 25)
if(M == user) //If you're eating it yourself
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
H << "\red You have a monitor for a head, where do you think you're going to put that?"
return
if (fullness <= 50)
M << "\red You hungrily chew out a piece of [src] and gobble it!"
if (fullness > 50 && fullness <= 150)
@@ -52,8 +58,14 @@
M << "\red You cannot force any more of [src] to go down your throat."
return 0
else
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
H << "\red They have a monitor for a head, where do you think you're going to put that?"
return
if(!istype(M, /mob/living/carbon/slime)) //If you're feeding it to someone else.
var/fullness = M.nutrition + (M.reagents.get_reagent_amount("nutriment") * 25)
if (fullness <= (550 * (1 + M.overeatduration / 1000)))
for(var/mob/O in viewers(world.view, user))
O.show_message("\red [user] attempts to feed [M] [src].", 1)

View File

@@ -20,6 +20,13 @@
return
attack(mob/M as mob, mob/user as mob, def_zone)
if(M == user)
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
H << "\red You have a monitor for a head, where do you think you're going to put that?"
return
M << "\blue You swallow [src]."
M.drop_from_inventory(src) //icon update
if(reagents.total_volume)
@@ -31,6 +38,11 @@
else if(istype(M, /mob/living/carbon/human) )
var/mob/living/carbon/human/H = M
if(H.species.flags & IS_SYNTHETIC)
H << "\red They have a monitor for a head, where do you think you're going to put that?"
return
for(var/mob/O in viewers(world.view, user))
O.show_message("\red [user] attempts to force [M] to swallow [src].", 1)

File diff suppressed because it is too large Load Diff