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

Signed-off-by: Mloc-Hibernia <colmohici@gmail.com>

Conflicts:
	code/game/objects/effects/spawners/bombspawner.dm
This commit is contained in:
Mloc-Hibernia
2014-05-11 13:19:09 +00:00
30 changed files with 1576 additions and 1471 deletions

View File

@@ -11,6 +11,7 @@ var/list/admin_verbs_default = list(
// /client/proc/deadchat /*toggles deadchat on/off*/
)
var/list/admin_verbs_admin = list(
/datum/admins/proc/show_player_panel,
/client/proc/player_panel, /*shows an interface for all players, with links to various panels (old style)*/
/client/proc/player_panel_new, /*shows an interface for all players, with links to various panels*/
/client/proc/invisimin, /*allows our mob to go invisible/visible*/
@@ -243,6 +244,7 @@ var/list/admin_verbs_mod = list(
/client/proc/player_panel_new,
/client/proc/dsay,
/datum/admins/proc/show_skills,
/datum/admins/proc/show_player_panel,
/client/proc/jobbans,
/client/proc/cmd_admin_subtle_message /*send an message to somebody as a 'voice in their head'*/
)

View File

@@ -197,7 +197,7 @@ BLIND // can't see anything
name = "Space helmet"
icon_state = "space"
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
item_state = "space"
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
@@ -215,7 +215,7 @@ BLIND // can't see anything
w_class = 4//bulky item
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.02
flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE
flags = FPRINT | TABLEPASS | STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 3

View File

@@ -2,7 +2,7 @@
name = "helmet"
desc = "Standard Security gear. Protects the head from impacts."
icon_state = "helmet"
flags = FPRINT | TABLEPASS | HEADCOVERSEYES
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | THICKMATERIAL
item_state = "helmet"
armor = list(melee = 50, bullet = 15, laser = 50,energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEEARS|HIDEEYES

View File

@@ -2,7 +2,7 @@
/obj/item/clothing/suit/armor
allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs)
body_parts_covered = UPPER_TORSO|LOWER_TORSO
flags = FPRINT | TABLEPASS
flags = FPRINT | TABLEPASS | THICKMATERIAL
cold_protection = UPPER_TORSO|LOWER_TORSO
min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECTION_TEMPERATURE

View File

@@ -13,7 +13,7 @@ var/list/artifact_spawn = list() // Runtime fix for geometry loading before cont
opacity = 1
density = 1
blocks_air = 1
temperature = TCMB
temperature = T0C
var/mineral/mineral
var/mined_ore = 0
var/last_act = 0
@@ -389,7 +389,7 @@ var/list/artifact_spawn = list() // Runtime fix for geometry loading before cont
icon_state = "asteroid"
oxygen = 0.01
nitrogen = 0.01
temperature = TCMB
temperature = T0C
icon_plating = "asteroid"
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug

View File

@@ -10,7 +10,8 @@
/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (istype(W, /obj/item/weapon/ore))
src.contents += W;
user.u_equip(W)
src.contents += W
if (istype(W, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = W
S.hide_from(usr)

View File

@@ -48,6 +48,12 @@
/mob/proc/death(gibbed)
//Quick fix for corpses kept propped up in chairs. ~Z
drop_r_hand()
drop_l_hand()
//End of fix.
timeofdeath = world.time
living_mob_list -= src

View File

@@ -19,7 +19,7 @@
if(language)
verb = language.speech_verb
style = language.colour
var/speaker_name = speaker.name
if(istype(speaker, /mob/living/carbon/human))
var/mob/living/carbon/human/H = speaker
@@ -71,7 +71,7 @@
verb = language.speech_verb
style = language.colour
if(hard_to_hear)
message = stars(message)
@@ -89,11 +89,28 @@
if(hard_to_hear)
speaker_name = "unknown"
var/changed_voice
if(istype(src, /mob/living/silicon/ai) && !hard_to_hear)
var/jobname // the mob's "job"
var/mob/living/carbon/human/impersonating //The crewmember being impersonated, if any.
if (ishuman(speaker))
var/mob/living/carbon/human/H = speaker
jobname = H.get_assignment()
if((H.wear_id && istype(H.wear_id,/obj/item/weapon/card/id/syndicate)) && (H.wear_mask && istype(H.wear_mask,/obj/item/clothing/mask/gas/voice)))
changed_voice = 1
var/mob/living/carbon/human/I = locate(speaker_name)
if(I)
impersonating = I
jobname = impersonating.get_assignment()
else
jobname = "Unknown"
else
jobname = H.get_assignment()
else if (iscarbon(speaker)) // Nonhuman carbon mob
jobname = "No id"
else if (isAI(speaker))
@@ -105,7 +122,13 @@
else
jobname = "Unknown"
track = "<a href='byond://?src=\ref[src];track=\ref[speaker]'>[speaker_name] ([jobname])</a>"
if(changed_voice)
if(impersonating)
track = "<a href='byond://?src=\ref[src];trackname=[html_encode(speaker_name)];track=\ref[impersonating]'>[speaker_name] ([jobname])</a>"
else
track = "[speaker_name] ([jobname])"
else
track = "<a href='byond://?src=\ref[src];trackname=[html_encode(speaker_name)];track=\ref[speaker]'>[speaker_name] ([jobname])</a>"
if(istype(src, /mob/dead/observer))
if(speaker_name != speaker.real_name && !isAI(speaker)) //Announce computer and various stuff that broadcasts doesn't use it's real name but AI's can't pretend to be other mobs.

View File

@@ -1290,3 +1290,22 @@
W.update_icon()
W.message = message
W.add_fingerprint(src)
/mob/living/carbon/human/can_inject(var/mob/user, var/error_msg, var/target_zone)
. = 1
if(!user)
target_zone = pick("chest","chest","chest","left leg","right leg","left arm", "right arm", "head")
else if(!target_zone)
target_zone = user.zone_sel.selecting
switch(target_zone)
if("head")
if(head && head.flags & THICKMATERIAL)
. = 0
else
if(wear_suit && wear_suit.flags & THICKMATERIAL)
. = 0
if(!. && error_msg && user)
// Might need re-wording.
user << "<span class='alert'>There is no exposed flesh or thin material [target_zone == "head" ? "on their head" : "on their body"] to inject into.</span>"

View File

@@ -52,7 +52,7 @@ emp_act
return -1 // complete projectile permutation
if(check_shields(P.damage, "the [P.name]"))
P.on_hit(src, 2)
P.on_hit(src, 2, def_zone)
return 2
//BEGIN BOOK'S TASER NERF.

View File

@@ -211,6 +211,9 @@
O.emp_act(severity)
..()
/mob/living/proc/can_inject()
return 1
/mob/living/proc/get_organ_target()
var/mob/shooter = src
var/t = shooter:zone_sel.selecting

View File

@@ -58,7 +58,7 @@
return 2
if(!P.nodamage)
apply_damage((P.damage/(absorb+1)), P.damage_type, def_zone, absorb, 0, P)
P.on_hit(src, absorb)
P.on_hit(src, absorb, def_zone)
return absorb
/mob/living/hitby(atom/movable/AM as mob|obj,var/speed = 5)//Standardization and logging -Sieve

View File

@@ -94,7 +94,7 @@ var/list/ai_list = list()
/mob/living/silicon/ai/proc/ai_camera_list, /mob/living/silicon/ai/proc/ai_network_change, \
/mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \
/mob/living/silicon/ai/proc/toggle_camera_light)
if(!safety)//Only used by AIize() to successfully spawn an AI.
if (!B)//If there is no player/brain inside.
@@ -146,7 +146,7 @@ var/list/ai_list = list()
/obj/machinery/ai_powersupply
name="Power Supply"
active_power_usage=1000
use_power = 2
use_power = 2
power_channel = EQUIP
var/mob/living/silicon/ai/powered_ai = null
invisibility = 100
@@ -155,12 +155,12 @@ var/list/ai_list = list()
powered_ai = ai
if(isnull(powered_ai))
Del()
loc = powered_ai.loc
use_power(1) // Just incase we need to wake up the power system.
..()
/obj/machinery/ai_powersupply/process()
if(!powered_ai || powered_ai.stat & DEAD)
Del()
@@ -410,8 +410,18 @@ var/list/ai_list = list()
if(A && target)
A.ai_actual_track(target)
*/
if(target)
//Strip off any "(as Derplord)".
//If there's a way to do this via a var that doesn't give the AI extra info, please let me know.
var/seeking = target.name
var/index = findtext(seeking, "(as ")
if(index)
seeking = copytext(seeking, 1, index-1)
if(target && html_decode(href_list["trackname"]) == seeking)
ai_actual_track(target)
else
src << "\red System error. Cannot locate [html_decode(href_list["trackname"])]."
return
else if (href_list["faketrack"])

View File

@@ -201,3 +201,9 @@
dat += "<br>"
src << browse(dat, "window=airoster")
onclose(src, "airoster")
//can't inject synths
/mob/living/silicon/can_inject(var/mob/user, var/error_msg)
if(error_msg)
user << "<span class='alert'>The armoured plating is too tough.</span>"
return 0

View File

@@ -139,7 +139,6 @@
return
if(client.prefs.species != "Human")
if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist)
src << alert("You are currently not whitelisted to play [client.prefs.species].")
return 0
@@ -155,9 +154,10 @@
usr << "\blue There is an administrative lock on entering the game!"
return
if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist)
src << alert("You are currently not whitelisted to play [client.prefs.species].")
return 0
if(client.prefs.species != "Human")
if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist)
src << alert("You are currently not whitelisted to play [client.prefs.species].")
return 0
AttemptLateSpawn(href_list["SelectedJob"])
return

View File

@@ -90,12 +90,17 @@
origin_tech = "materials=2;syndicate=5"
/obj/item/weapon/pen/paralysis/attack(mob/M as mob, mob/user as mob)
/obj/item/weapon/pen/paralysis/attack(mob/living/M as mob, mob/user as mob)
if(!(istype(M,/mob)))
return
..()
if(reagents.total_volume)
if(M.reagents) reagents.trans_to(M, 50)
if(M.can_inject(user,1))
if(reagents.total_volume)
if(M.reagents) reagents.trans_to(M, 50)
return

View File

@@ -35,29 +35,29 @@
var/d1 = 0
var/d2 = 1
layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4
var/cable_color = COLOR_RED
color = COLOR_RED
var/obj/structure/powerswitch/power_switch
/obj/structure/cable/yellow
cable_color = COLOR_YELLOW
color = COLOR_YELLOW
/obj/structure/cable/green
cable_color = COLOR_GREEN
color = COLOR_GREEN
/obj/structure/cable/blue
cable_color = COLOR_BLUE
color = COLOR_BLUE
/obj/structure/cable/pink
cable_color = COLOR_PINK
color = COLOR_PINK
/obj/structure/cable/orange
cable_color = COLOR_ORANGE
color = COLOR_ORANGE
/obj/structure/cable/cyan
cable_color = COLOR_CYAN
color = COLOR_CYAN
/obj/structure/cable/white
cable_color = COLOR_WHITE
color = COLOR_WHITE
/obj/structure/cable/New()
..()
@@ -94,7 +94,6 @@
/obj/structure/cable/proc/updateicon()
icon_state = "[d1]-[d2]"
alpha = invisibility ? 127 : 255
color = cable_color
// returns the powernet this cable belongs to
@@ -126,9 +125,9 @@
return
if(src.d1) // 0-X cables are 1 unit, X-X cables are 2 units long
new/obj/item/weapon/cable_coil(T, 2, cable_color)
new/obj/item/weapon/cable_coil(T, 2, color)
else
new/obj/item/weapon/cable_coil(T, 1, cable_color)
new/obj/item/weapon/cable_coil(T, 1, color)
for(var/mob/O in viewers(src, null))
O.show_message("<span class='warning'>[user] cuts the cable.</span>", 1)
@@ -190,12 +189,12 @@
del(src)
if(2.0)
if (prob(50))
new/obj/item/weapon/cable_coil(src.loc, src.d1 ? 2 : 1, cable_color)
new/obj/item/weapon/cable_coil(src.loc, src.d1 ? 2 : 1, color)
del(src)
if(3.0)
if (prob(25))
new/obj/item/weapon/cable_coil(src.loc, src.d1 ? 2 : 1, cable_color)
new/obj/item/weapon/cable_coil(src.loc, src.d1 ? 2 : 1, color)
del(src)
return
@@ -229,16 +228,15 @@
..()
src.amount = length
if (param_color)
item_color = param_color
color = param_color
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
updateicon()
update_wclass()
/obj/item/weapon/cable_coil/proc/updateicon()
if (!item_color)
item_color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
color = item_color
if (!color)
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
if(amount == 1)
icon_state = "coil1"
name = "cable piece"
@@ -422,7 +420,7 @@
use(1)
if (C.shock(user, 50))
if (prob(50)) //fail
new/obj/item/weapon/cable_coil(C.loc, 1, C.cable_color)
new/obj/item/weapon/cable_coil(C.loc, 1, C.color)
del(C)
//src.laying = 1
//last = C
@@ -482,7 +480,7 @@
use(1)
if (NC.shock(user, 50))
if (prob(50)) //fail
new/obj/item/weapon/cable_coil(NC.loc, 1, NC.cable_color)
new/obj/item/weapon/cable_coil(NC.loc, 1, NC.color)
del(NC)
return
@@ -521,7 +519,7 @@
use(1)
if (C.shock(user, 50))
if (prob(50)) //fail
new/obj/item/weapon/cable_coil(C.loc, 2, C.cable_color)
new/obj/item/weapon/cable_coil(C.loc, 2, C.color)
del(C)
return
@@ -597,7 +595,6 @@ obj/structure/cable/proc/cableColor(var/colorC)
var/color_n = "#DD0000"
if(colorC)
color_n = colorC
cable_color = color_n
color = color_n
/obj/item/weapon/cable_coil/cut

View File

@@ -1,8 +1,10 @@
/obj/item/weapon/gun/verb/toggle_firerate()
set name = "Toggle Firerate"
set category = "Object"
firerate = !firerate
if (firerate == 0)
if (firerate)
loc << "You will now continue firing when your target moves."
else
loc << "You will now only fire once, then lower your aim, when your target moves."

View File

@@ -62,14 +62,15 @@
var/datum/reagents/R = reagent_list[reagent_list.len]
R.add_reagent(reagent, 30)
/obj/item/weapon/reagent_containers/borghypo/attack(mob/M as mob, mob/user as mob)
/obj/item/weapon/reagent_containers/borghypo/attack(mob/living/M as mob, mob/user as mob)
var/datum/reagents/R = reagent_list[mode]
if(!R.total_volume)
user << "\red The injector is empty."
return
if (!( istype(M, /mob) ))
if (!(istype(M)))
return
if (R.total_volume)
if (R.total_volume && M.can_inject(user,1))
user << "\blue You inject [M] with the injector."
M << "\red You feel a tiny prick!"

View File

@@ -140,11 +140,23 @@
return
if(ismob(target) && target != user)
var/time = 30 //Injecting through a hardsuit takes longer due to needing to find a port.
if(istype(target,/mob/living/carbon/human))
var/mob/living/carbon/human/H = target
if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space))
time = 60
if(H.wear_suit)
if(istype(H.wear_suit,/obj/item/clothing/suit/space))
time = 60
else if(!H.can_inject(user, 1))
return
else if(isliving(target))
var/mob/living/M = target
if(!M.can_inject(user, 1))
return
for(var/mob/O in viewers(world.view, user))
if(time == 30)

View File

@@ -93,10 +93,18 @@
M.attack_log += "\[[time_stamp()]\] <b>UNKNOWN SUBJECT (No longer exists)</b> shot <b>[M]/[M.ckey]</b> with a <b>syringegun</b> ([R])"
msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a <b>syringegun</b> ([R]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
if(D.reagents)
D.reagents.trans_to(M, 15)
var/mob/living/T
if(istype(M,/mob/living))
T = M
M.visible_message("<span class='danger'>[M] is hit by the syringe!</span>")
if(T && istype(T) && T.can_inject())
if(D.reagents)
D.reagents.trans_to(M, 15)
else
M.visible_message("<span class='danger'>The syringe bounces off [M]!</span>")
del(D)
break
if(D)