Merge remote-tracking branch 'ParadiseSS13/master' into GoOnYourFeet

This commit is contained in:
Aurorablade
2015-08-29 20:12:41 -04:00
75 changed files with 1333 additions and 1026 deletions
+8 -5
View File
@@ -846,10 +846,13 @@ var/list/admin_verbs_mentor = list(
set category = "Admin"
set name = "Man Up Global"
set desc = "Tells everyone to man up and deal with it."
var/confirm = alert("Are you sure you want to send the global message?", "Confirm Man Up Global", "Yes", "No")
for (var/mob/T as mob in mob_list)
T << "<br><center><span class='notice'><b><font size=4>Man up.<br> Deal with it.</font></b><br>Move on.</span></center><br>"
T << 'sound/voice/ManUp1.ogg'
if(confirm == "Yes")
for (var/mob/T as mob in mob_list)
T << "<br><center><span class='notice'><b><font size=4>Man up.<br> Deal with it.</font></b><br>Move on.</span></center><br>"
T << 'sound/voice/ManUp1.ogg'
log_admin("[key_name(usr)] told everyone to man up and deal with it.")
message_admins("\blue [key_name_admin(usr)] told everyone to man up and deal with it.", 1)
log_admin("[key_name(usr)] told everyone to man up and deal with it.")
message_admins("\blue [key_name_admin(usr)] told everyone to man up and deal with it.", 1)
+1 -1
View File
@@ -131,7 +131,7 @@
usr.loc = M.loc
feedback_add_details("admin_verb","GK") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/sendmob(var/mob/M in sortmobs())
/client/proc/sendmob(var/mob/M in mob_list)
set category = "Admin"
set name = "Send Mob"
+2 -2
View File
@@ -29,7 +29,7 @@
loose = 4
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
"Vox" = 'icons/mob/species/vox/head.dmi'
)
/obj/item/clothing/head/welding/attack_self()
@@ -191,4 +191,4 @@
mob.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD)
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mouseyinner")
mob.Blend(earbit, ICON_OVERLAY)
mob.Blend(earbit, ICON_OVERLAY)
+3
View File
@@ -49,6 +49,9 @@
_color = "grey"
flags = ONESIZEFITSALL
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi'
)
/obj/item/clothing/under/color/grey/greytide
flags = ONESIZEFITSALL | NODROP
+1 -1
View File
@@ -371,7 +371,7 @@
if(!P.owner || P.toff || P.hidden) continue
sendPDAs += P
if(PDAs && PDAs.len > 0)
customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortAtom(sendPDAs)
customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sendPDAs
else
customrecepient = null
+1 -1
View File
@@ -29,7 +29,7 @@
// /obj/machinery/message_server/proc/send_pda_message(var/recipient = "",var/sender = "",var/message = "")
var/obj/item/device/pda/P
var/list/viables = list()
for(var/obj/item/device/pda/check_pda in sortAtom(PDAs))
for(var/obj/item/device/pda/check_pda in PDAs)
if (!check_pda.owner||check_pda.toff||check_pda == src||check_pda.hidden)
continue
viables.Add(check_pda)
@@ -140,6 +140,15 @@ var/global/datum/controller/process/garbage_collector/garbageCollector
// world << "WARNING GC DID NOT GET A RETURN VALUE FOR [D], [D.type]!"
garbageCollector.addTrash(D)
// Returns 1 if the object has been queued for deletion.
/proc/qdeleted(var/datum/D)
if (!istype(D))
return 0
if (!isnull(D.gcDestroyed))
return 1
return 0
/*
* Like Del(), but for qdel.
* Called BEFORE qdel moves shit.
+8
View File
@@ -261,3 +261,11 @@
qdel(W)
return equipped
/mob/proc/get_all_slots()
return list(wear_mask, back, l_hand, r_hand)
/mob/proc/get_id_card()
for(var/obj/item/I in src.get_all_slots())
. = I.GetID()
if(.)
break
+7 -4
View File
@@ -246,13 +246,14 @@
key = "5"
flags = RESTRICTED | WHITELISTED
syllables = list("02011","01222","10100","10210","21012","02011","21200","1002","2001","0002","0012","0012","000","120","121","201","220","10","11","0")
/datum/language/machine/get_random_name()
var/new_name
if(prob(70))
name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
new_name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
else
name = pick(ai_names)
return name
new_name = pick(ai_names)
return new_name
/datum/language/kidan
name = "Chittin"
@@ -333,6 +334,8 @@
name = "Gutter"
desc = "Much like Standard, this crude pidgin tongue descended from numerous languages and serves as Tradeband for criminal elements."
speech_verb = "growls"
ask_verb = "gnarls"
exclaim_verb = "snarls"
colour = "rough"
key = "3"
syllables = list ("gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra")
@@ -110,6 +110,7 @@
if(leaping)
leaping = 0
update_icons()
update_canmove()
@@ -114,8 +114,12 @@
Paralyse(2)
message = text("<B>[]</B> collapses!", src)
m_type = 2
if ("flip")
m_type = 1
message = "<B>[src]</B> does a flip!"
src.SpinAnimation(5,1)
if("help")
src << "burp, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper"
src << "burp, flip, deathgasp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roar, roll, scratch,\nscretch, shake, sign-#, sit, sulk, sway, tail, twitch, whimper"
else
src << text("Invalid Emote: []", act)
if ((message && src.stat == 0))
@@ -132,4 +136,4 @@
for(var/mob/O in hearers(src, null))
O.show_message(message, m_type)
//Foreach goto(746)
return
return
@@ -7,11 +7,14 @@
var/obj/item/weapon/r_store = null
var/obj/item/weapon/l_store = null
var/caste = ""
var/alt_icon = 'icons/mob/alienleap.dmi' //used to switch between the two alien icon files.
var/next_attack = 0
var/pounce_cooldown = 0
var/pounce_cooldown_time = 30
update_icon = 1
var/leap_on_click = 0
var/custom_pixel_x_offset = 0 //for admin fuckery.
var/custom_pixel_y_offset = 0
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
@@ -336,4 +339,20 @@ In all, this is a lot like the monkey code. /N
/mob/living/carbon/alien/humanoid/canBeHandcuffed()
return 1
return 1
/mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0)
if(leaping)
return -32
else if(custom_pixel_y_offset)
return custom_pixel_y_offset
else
return initial(pixel_y)
/mob/living/carbon/alien/humanoid/get_standard_pixel_x_offset(lying = 0)
if(leaping)
return -32
else if(custom_pixel_x_offset)
return custom_pixel_x_offset
else
return initial(pixel_x)
@@ -41,14 +41,20 @@
icon_state = "alien[caste]_s"
if(leaping)
icon = 'icons/mob/alienleap.dmi'
if(alt_icon == initial(alt_icon))
var/old_icon = icon
icon = alt_icon
alt_icon = old_icon
icon_state = "alien[caste]_leap"
pixel_x = -32
pixel_y = -32
else if(icon == 'icons/mob/alienleap.dmi' && pixel_x == -32 && pixel_y == -32)
icon = initial(icon)// ^ this looks odd, but in theory it will prevent the icon and pixel_xy from being reset unless it needs to be
pixel_x = initial(pixel_x)
pixel_y = initial(pixel_y)
else
if(alt_icon != initial(alt_icon))
var/old_icon = icon
icon = alt_icon
alt_icon = old_icon
pixel_x = get_standard_pixel_x_offset(lying)
pixel_y = get_standard_pixel_y_offset(lying)
/mob/living/carbon/alien/humanoid/regenerate_icons()
..()
+9 -1
View File
@@ -683,4 +683,12 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(buckled) return initial(pixel_y)
return -6
else
return initial(pixel_y)
return initial(pixel_y)
/mob/living/carbon/get_all_slots()
return list(l_hand,
r_hand,
handcuffed,
legcuffed,
back,
wear_mask)
@@ -38,7 +38,6 @@
var/obj/item/organ/brain/sponge = internal_organs_by_name["brain"]
if(sponge)
sponge.take_damage(amount)
sponge.damage = min(max(sponge.damage, 0),(maxHealth*2))
brainloss = sponge.damage
else
brainloss = 200
@@ -884,3 +884,33 @@ It can still be worn/put on as normal.
if(slot_s_store)
return s_store
return null
/mob/living/carbon/human/get_all_slots()
. = get_head_slots() | get_body_slots()
/mob/living/carbon/human/proc/get_body_slots()
return list(
l_hand,
r_hand,
back,
s_store,
handcuffed,
legcuffed,
wear_suit,
gloves,
shoes,
belt,
wear_id,
l_store,
r_store,
w_uniform
)
/mob/living/carbon/human/proc/get_head_slots()
return list(
head,
wear_mask,
glasses,
r_ear,
l_ear,
)
+3 -7
View File
@@ -27,7 +27,7 @@
return emote(copytext(message,2))
if(name != GetVoice())
alt_name = "(as [get_id_name("Unknown")])"
alt_name = " (as [get_id_name("Unknown")])"
//parse the radio code and consume it
if (message_mode)
@@ -214,17 +214,13 @@
continue
var/obj/item/voice_changer/changer = locate() in gear
if(changer && changer.active && changer.voice)
return changer
return changer.voice
return 0
/mob/living/carbon/human/GetVoice()
var/voice_sub
var/has_changer = HasVoiceChanger()
if(has_changer)
voice_sub = has_changer
if(voice_sub)
return voice_sub
return has_changer
if(mind && mind.changeling && mind.changeling.mimicing)
return mind.changeling.mimicing
if(GetSpecialVoice())
+2 -1
View File
@@ -936,4 +936,5 @@
return initial(pixel_y)
/mob/living/proc/spawn_dust()
new /obj/effect/decal/cleanable/ash(loc)
new /obj/effect/decal/cleanable/ash(loc)
@@ -231,7 +231,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
M << browse(dat, "window=paiRecruit;size=580x580;")
proc/findPAI(var/obj/item/device/paicard/p, var/mob/user)
requestRecruits()
requestRecruits(p)
var/list/available = list()
for(var/datum/paiCandidate/c in paiController.pai_candidates)
if(c.ready)
@@ -346,12 +346,12 @@ var/datum/paiController/paiController // Global handler for pAI candidates
user << browse(dat, "window=findPai")
proc/requestRecruits()
proc/requestRecruits(var/obj/item/device/paicard/P)
for(var/mob/dead/observer/O in player_list)
if(O.client && O.client.prefs.be_special & BE_PAI)
if(player_old_enough_antag(O.client,BE_PAI))
if(check_recruit(O))
O << "\blue <b>A pAI card is looking for personalities. (<a href='?src=\ref[O];jump=\ref[src]'>Teleport</a> | <a href='?src=\ref[src];signup=\ref[O]'>Sign Up</a>)</b>"
O << "\blue <b>A pAI card is looking for personalities. (<a href='?src=\ref[O];jump=\ref[P]'>Teleport</a> | <a href='?src=\ref[src];signup=\ref[O]'>Sign Up</a>)</b>"
//question(O.client)
proc/check_recruit(var/mob/dead/observer/O)
if(jobban_isbanned(O, "pAI") || jobban_isbanned(O,"nonhumandept"))
@@ -149,7 +149,7 @@
var/pdas[0]
if(!user.pda.toff)
for(var/obj/item/device/pda/P in sortAtom(PDAs))
for(var/obj/item/device/pda/P in PDAs)
if(!P.owner || P.toff || P == user.pda || P.hidden) continue
var/pda[0]
pda["name"] = "[P]"
@@ -5,7 +5,8 @@
/mob/living/silicon/robot/get_active_hand()
return module_active
/mob/living/silicon/robot/get_all_slots()
return list(module_state_1, module_state_2, module_state_3)
/*-------TODOOOOOOOOOO--------*/
/mob/living/silicon/robot/proc/uneq_module(obj/item/O)
+4 -11
View File
@@ -81,6 +81,7 @@ var/list/robot_verbs_default = list(
var/lamp_recharging = 0 //Flag for if the lamp is on cooldown after being forcibly disabled.
var/jetpackoverlay = 0
var/magpulse = 0
var/obj/item/borg/sight/hud/sec/sechud = null
var/obj/item/borg/sight/hud/med/healthhud = null
@@ -229,21 +230,12 @@ var/list/robot_verbs_default = list(
module_sprites["Bro"] = "Brobot"
module_sprites["Rich"] = "maximillion"
module_sprites["Default"] = "Service2"
/*
if("Clerical")
module = new /obj/item/weapon/robot_module/clerical(src)
module.channels = list("Service" = 1)
module_sprites["Waitress"] = "Service"
module_sprites["Kent"] = "toiletbot"
module_sprites["Bro"] = "Brobot"
module_sprites["Rich"] = "maximillion"
module_sprites["Default"] = "Service2"
*/
if("Miner")
module = new /obj/item/weapon/robot_module/miner(src)
module.channels = list("Supply" = 1)
if(camera && "Robots" in camera.network)
camera.network.Add("MINE")
camera.network.Add("Mining Outpost")
module_sprites["Basic"] = "Miner_old"
module_sprites["Advanced Droid"] = "droid-miner"
module_sprites["Treadhead"] = "Miner"
@@ -276,6 +268,7 @@ var/list/robot_verbs_default = list(
module_sprites["Basic"] = "Engineering"
module_sprites["Antique"] = "engineerrobot"
module_sprites["Landmate"] = "landmate"
magpulse = 1
if("Janitor")
module = new /obj/item/weapon/robot_module/janitor(src)
@@ -226,7 +226,6 @@
fix_modules()
/obj/item/weapon/robot_module/janitor
name = "janitorial robot module"
@@ -23,4 +23,14 @@
return tally+config.robot_delay
/mob/living/silicon/robot/Move()
..()
..()
/mob/living/silicon/robot/mob_negates_gravity()
return magpulse
/mob/living/silicon/robot/mob_has_gravity()
return ..() || mob_negates_gravity()
/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction)
if(!magpulse)
return ..()
@@ -62,40 +62,6 @@
usr << msg
return
/mob/living/simple_animal/construct/Bump(atom/movable/AM as mob|obj, yes)
spawn( 0 )
if ((!( yes ) || now_pushing))
return
now_pushing = 1
if(ismob(AM))
var/mob/tmob = AM
if(istype(tmob, /mob/living/carbon/human) && (FAT in tmob.mutations))
if(prob(5))
src << "\red <B>You fail to push [tmob]'s fat ass out of the way.</B>"
now_pushing = 0
return
if(!(tmob.status_flags & CANPUSH))
now_pushing = 0
return
tmob.LAssailant = src
now_pushing = 0
..()
if (!( istype(AM, /atom/movable) ))
return
if (!( now_pushing ))
now_pushing = 1
if (!( AM.anchored ))
var/t = get_dir(src, AM)
if (istype(AM, /obj/structure/window/full))
for(var/obj/structure/window/win in get_step(AM,t))
now_pushing = 0
return
step(AM, t)
now_pushing = null
return
return
/mob/living/simple_animal/construct/attack_animal(mob/living/simple_animal/M as mob)
if(istype(M, /mob/living/simple_animal/construct/builder))
health += 5
+5
View File
@@ -17,6 +17,11 @@
else if (restrained() || lying || stat || stunned || weakened)
return STATUS_UPDATE // update only (orange visibility)
return STATUS_INTERACTIVE
/mob/dead/observer/shared_nano_interaction()
if(check_rights(R_ADMIN, 0, src))
return STATUS_INTERACTIVE // Admins are more equal
return STATUS_UPDATE // Ghosts can view updates
/mob/living/silicon/ai/shared_nano_interaction()
if(lacks_power())
+1 -1
View File
@@ -347,7 +347,7 @@ nanoui is used to open and update nano browser uis
template_data_json = list2json(templates)
var/list/send_data = get_send_data(initial_data)
var/initial_data_json = replacetext(list2json_usecache(send_data), "'", "&#39;")
var/initial_data_json = replacetext(replacetext(list2json_usecache(send_data), "&#34;", "&amp;#34;"), "'", "&#39;")
var/url_parameters_json = list2json(list("src" = "\ref[src]"))
+9 -7
View File
@@ -178,16 +178,18 @@ var/list/organ_cache = list()
W.damage += damage
W.time_inflicted = world.time
//Note: external organs have their own version of this proc
/obj/item/organ/proc/take_damage(amount, var/silent=0)
if(src.robotic == 2)
src.damage += (amount * 0.8)
if(src.status & ORGAN_ROBOT)
src.damage = between(0, src.damage + (amount * 0.8), max_damage)
else
src.damage += amount
src.damage = between(0, src.damage + amount, max_damage)
if(owner && parent_organ)
var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
if(parent && !silent)
owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
//only show this if the organ is not robotic
if(owner && parent_organ && amount > 0)
var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
if(parent && !silent)
owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
robotic = 2
+3
View File
@@ -115,6 +115,8 @@
/obj/machinery/power/apc/New(turf/loc, var/ndir, var/building=0)
..()
apcs += src
apcs = sortAtom(apcs)
wires = new(src)
var/tmp/obj/item/weapon/stock_parts/cell/tmp_cell = new
standard_max_charge = tmp_cell.maxcharge
@@ -143,6 +145,7 @@
src.update()
/obj/machinery/power/apc/Destroy()
apcs -= src
if(malfai && operating)
if (ticker.mode.config_tag == "malfunction")
if (src.z == ZLEVEL_STATION)
+9 -6
View File
@@ -432,12 +432,15 @@ obj/structure/cable/proc/cableColor(var/colorC)
P.disconnect_from_network() //remove from current network (and delete powernet)
return
var/obj/O = P_list[1]
// remove the cut cable from its turf and powernet, so that it doesn't get count in propagate_network worklist
loc = null
powernet.remove_cable(src) //remove the cut cable from its powernet
var/datum/powernet/newPN = new()// creates a new powernet...
propagate_network(P_list[1], newPN)//... and propagates it to the other side of the cable
spawn(0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
if(O && !qdeleted(O))
var/datum/powernet/newPN = new()// creates a new powernet...
propagate_network(O, newPN)//... and propagates it to the other side of the cable
// Disconnect machines connected to nodes
if(d1 == 0) // if we cut a node (O-X) cable
@@ -501,9 +504,9 @@ obj/structure/cable/proc/cableColor(var/colorC)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/S = H.organs_by_name[user.zone_sel.selecting]
if(!S)
return
if(!S)
return
if(!(S.status & ORGAN_ROBOT) || user.a_intent != "help" || S.open == 2)
return ..()
@@ -892,4 +895,4 @@ obj/structure/cable/proc/cableColor(var/colorC)
/obj/item/stack/cable_coil/cyborg/attack_self(mob/user)
var/cablecolor = input(user,"Pick a cable color.","Cable Color") in list("red","yellow","green","blue","pink","orange","cyan","white")
color = cablecolor
update_icon()
update_icon()
+3 -5
View File
@@ -702,14 +702,12 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/area/my_area = get_area(T)
var/message = "A [reaction_name] reaction has occured in [my_area.name]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</A>)"
message += " (<A HREF='?_src_=vars;Vars=\ref[A]'>VV</A>)"
var/message = "A [reaction_name] reaction has occured in (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[my_area.name]</A>)"
var/mob/M = get(A, /mob)
if(M)
message += " - Carried By: [M.real_name] ([M.key]) (<A HREF='?_src_=holder;adminplayeropts=\ref[M]'>PP</A>) (<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</A>)"
message += " - carried by: [key_name_admin(M)]"
else
message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
message += " - last fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]"
message_admins(message, 0, 1)
@@ -366,6 +366,7 @@
New()
..()
reagents.add_reagent("nutriment", 3)
reagents.add_reagent("sodiumchloride", 1)
bitesize = 1
/obj/item/weapon/reagent_containers/food/snacks/cornchips
@@ -1228,6 +1229,7 @@
New()
..()
reagents.add_reagent("plantmatter", 6)
reagents.add_reagent("sodiumchloride", 1)
/obj/item/weapon/reagent_containers/food/snacks/no_raisin
name = "4no Raisins"
+2 -1
View File
@@ -442,6 +442,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
var/obj/item/weapon/storage/lockbox/L = new/obj/item/weapon/storage/lockbox(linked_lathe.loc)
new_item.loc = L
L.name += " ([new_item.name])"
L.origin_tech = new_item.origin_tech
else
new_item.loc = linked_lathe.loc
linked_lathe.busy = 0
@@ -771,7 +772,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "<span class='linkOn'>Disconnect from Research Network</span><BR>"
dat += "<A href='?src=\ref[src];menu=1.7'>Device Linkage Menu</A><BR>"
dat += "<A href='?src=\ref[src];lock=0.2'>Lock Console</A><BR>"
if(check_rights(R_ADMIN))
if(check_rights(R_ADMIN,0))
dat += "<A href='?src=\ref[src];maxresearch=1'>\[ADMIN\] Maximize Research Levels</A><BR>"
dat += "<A href='?src=\ref[src];reset=1'>Reset R&D Database</A></div>"
+1 -1
View File
@@ -223,7 +223,7 @@ datum/tech/magnets
name = "Electromagnetic Spectrum Research"
desc = "Research into the electromagnetic spectrum. No clue how they actually work, though."
id = "magnets"
max_level = 5
max_level = 6
datum/tech/programming
name = "Data Theory Research"