Merge pull request #5 from Neerti/4/8/2015_bay_sync

Syncs to Bay (4/8/2015)
This commit is contained in:
Neerti
2015-04-10 09:41:51 -04:00
57 changed files with 714 additions and 671 deletions

View File

@@ -383,7 +383,6 @@
user << "You are too far away to read the gauge." user << "You are too far away to read the gauge."
if(welded) if(welded)
user << "It seems welded shut." user << "It seems welded shut."
..()
/obj/machinery/atmospherics/unary/vent_pump/power_change() /obj/machinery/atmospherics/unary/vent_pump/power_change()
var/old_stat = stat var/old_stat = stat

View File

@@ -277,7 +277,6 @@
user << "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W" user << "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W"
else else
user << "You are too far away to read the gauge." user << "You are too far away to read the gauge."
..()
/obj/machinery/atmospherics/unary/vent_scrubber/Del() /obj/machinery/atmospherics/unary/vent_scrubber/Del()
if(initial_loc) if(initial_loc)

View File

@@ -91,9 +91,11 @@
/obj/item/weapon/cane/concealed/New() /obj/item/weapon/cane/concealed/New()
..() ..()
concealed_blade = new/obj/item/weapon/butterfly/switchblade(src) var/obj/item/weapon/butterfly/switchblade/temp_blade = new(src)
concealed_blade = temp_blade
temp_blade.attack_self()
/obj/item/weapon/cane/concealed/attack_self(mob/user) /obj/item/weapon/cane/concealed/attack_self(var/mob/user)
if(concealed_blade) if(concealed_blade)
user.visible_message("<span class='warning'>[user] has unsheathed \a [concealed_blade] from \his [src]!</span>", "You unsheathe \the [concealed_blade] from \the [src].") user.visible_message("<span class='warning'>[user] has unsheathed \a [concealed_blade] from \his [src]!</span>", "You unsheathe \the [concealed_blade] from \the [src].")
// Calling drop/put in hands to properly call item drop/pickup procs // Calling drop/put in hands to properly call item drop/pickup procs
@@ -101,8 +103,9 @@
user.drop_from_inventory(src) user.drop_from_inventory(src)
user.put_in_hands(concealed_blade) user.put_in_hands(concealed_blade)
user.put_in_hands(src) user.put_in_hands(src)
user.update_inv_l_hand(0)
user.update_inv_r_hand()
concealed_blade = null concealed_blade = null
update_icon()
else else
..() ..()

View File

@@ -2,12 +2,30 @@ proc/log_and_message_admins(var/message as text)
log_admin(usr ? "[key_name(usr)] [message]" : "EVENT [message]") log_admin(usr ? "[key_name(usr)] [message]" : "EVENT [message]")
message_admins(usr ? "[key_name(usr)] [message]" : "EVENT [message]") message_admins(usr ? "[key_name(usr)] [message]" : "EVENT [message]")
proc/log_and_message_admins_many(var/list/mob/users, var/message)
if(!users || !users.len)
return
var/list/user_keys = list()
for(var/mob/user in users)
user_keys += key_name(user)
log_admin("[english_list(user_keys)] [message]")
message_admins("[english_list(user_keys)] [message]")
proc/admin_log_and_message_admins(var/message as text) proc/admin_log_and_message_admins(var/message as text)
log_admin(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]") log_admin(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]")
message_admins(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]", 1) message_admins(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]", 1)
proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, var/victim_message, var/admin_message) proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, var/victim_message, var/admin_message)
victim.attack_log += text("\[[time_stamp()]\] <font color='orange'>[victim_message] [key_name(attacker)]</font>") victim.attack_log += text("\[[time_stamp()]\] <font color='orange'>[key_name(attacker)] - [victim_message]</font>")
attacker.attack_log += text("\[[time_stamp()]\] <font color='red'>[attacker_message] [key_name(victim)]</font>") attacker.attack_log += text("\[[time_stamp()]\] <font color='red'>[key_name(victim)] - [attacker_message]</font>")
msg_admin_attack("[key_name(attacker)] [admin_message] [key_name(victim)] (INTENT: [uppertext(attacker.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[attacker.x];Y=[attacker.y];Z=[attacker.z]'>JMP</a>)") msg_admin_attack("[key_name(attacker)] [admin_message] [key_name(victim)] (INTENT: [uppertext(attacker.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[attacker.x];Y=[attacker.y];Z=[attacker.z]'>JMP</a>)")
proc/admin_attacker_log_many_victims(var/mob/attacker, var/list/mob/victims, var/attacker_message, var/victim_message, var/admin_message)
if(!victims || !victims.len)
return
for(var/mob/victim in victims)
admin_attack_log(attacker, victim, attacker_message, victim_message, admin_message)

View File

@@ -1362,35 +1362,35 @@ area/space/atmosalert()
icon_state = "security" icon_state = "security"
/area/security/lobby /area/security/lobby
name = "\improper Security lobby" name = "\improper Security Lobby"
icon_state = "security" icon_state = "security"
/area/security/brig /area/security/brig
name = "\improper Brig" name = "\improper Security - Brig"
icon_state = "brig" icon_state = "brig"
/area/security/prison /area/security/prison
name = "\improper Prison Wing" name = "\improper Security - Prison Wing"
icon_state = "sec_prison" icon_state = "sec_prison"
/area/security/warden /area/security/warden
name = "\improper Warden" name = "\improper Security - Warden's Office"
icon_state = "Warden" icon_state = "Warden"
/area/security/armoury /area/security/armoury
name = "\improper Armory" name = "\improper Security - Armory"
icon_state = "Warden" icon_state = "Warden"
/area/security/detectives_office /area/security/detectives_office
name = "\improper Detective's Office" name = "\improper Security - Forensic Office"
icon_state = "detective" icon_state = "detective"
/area/security/range /area/security/range
name = "\improper Firing Range" name = "\improper Security - Firing Range"
icon_state = "firingrange" icon_state = "firingrange"
/area/security/tactical /area/security/tactical
name = "\improper Tactical Equipment" name = "\improper Security - Tactical Equipment"
icon_state = "Tactical" icon_state = "Tactical"

View File

@@ -166,6 +166,7 @@
H.f_style = facial_hair_styles_list[beard] H.f_style = facial_hair_styles_list[beard]
H.force_update_limbs() H.force_update_limbs()
H.update_eyes()
H.update_hair() H.update_hair()
return 1 return 1

View File

@@ -235,9 +235,9 @@
H.r_eyes = hex2num(getblock(structure,8,3)) H.r_eyes = hex2num(getblock(structure,8,3))
H.g_eyes = hex2num(getblock(structure,9,3)) H.g_eyes = hex2num(getblock(structure,9,3))
H.b_eyes = hex2num(getblock(structure,10,3)) H.b_eyes = hex2num(getblock(structure,10,3))
if(H.internal_organs_by_name["eyes"]) if(H.internal_organs_by_name["eyes"])
var/obj/item/organ/eyes/eyes = H.internal_organs_by_name["eyes"] H.update_eyes()
eyes.eye_colour = list(H.r_eyes,H.g_eyes,H.b_eyes)
if (isblockon(getblock(structure, 11,3),11 , 1)) if (isblockon(getblock(structure, 11,3),11 , 1))
H.gender = FEMALE H.gender = FEMALE

View File

@@ -463,7 +463,6 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
// sending display messages // sending display messages
C << "<span class='notice'>We have regenerated.</span>" C << "<span class='notice'>We have regenerated.</span>"
C.visible_message("<span class='warning'>[src] appears to wake from the dead, having healed all wounds.</span>")
feedback_add_details("changeling_powers","FD") feedback_add_details("changeling_powers","FD")

View File

@@ -457,6 +457,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world." user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world."
user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage
if(do_after(user, 50)) if(do_after(user, 50))
var/area/A = get_area(user)
log_and_message_admins("created \an [chosen_rune] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].")
if(usr.get_active_hand() != src) if(usr.get_active_hand() != src)
return return
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
@@ -514,6 +516,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
R.blood_DNA = list() R.blood_DNA = list()
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
var/area/A = get_area(user)
log_and_message_admins("created \an [r] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].")
switch(r) switch(r)
if("teleport") if("teleport")
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")

View File

@@ -99,6 +99,7 @@ var/list/sacrificed = list()
/////////////////////////////////////////THIRD RUNE /////////////////////////////////////////THIRD RUNE
convert() convert()
var/mob/attacker = usr
var/mob/living/carbon/target = null var/mob/living/carbon/target = null
for(var/mob/living/carbon/M in src.loc) for(var/mob/living/carbon/M in src.loc)
if(!iscultist(M) && M.stat < DEAD && !(M in converting)) if(!iscultist(M) && M.stat < DEAD && !(M in converting))
@@ -123,10 +124,10 @@ var/list/sacrificed = list()
if(target.getFireLoss() < 100) if(target.getFireLoss() < 100)
target.hallucination = min(target.hallucination, 500) target.hallucination = min(target.hallucination, 500)
return 0 return 0
target.take_overall_damage(0, rand(5, 20)) // You dirty resister cannot handle the damage to your mind. Easily. - even cultists who accept right away should experience some effects target.take_overall_damage(0, rand(5, 20)) // You dirty resister cannot handle the damage to your mind. Easily. - even cultists who accept right away should experience some effects
// Resist messages go! // Resist messages go!
if(initial_message) //don't do this stuff right away, only if they resist or hesitate. if(initial_message) //don't do this stuff right away, only if they resist or hesitate.
admin_attack_log(attacker, target, "Used a convert rune", "Was subjected to a convert rune", "used a convert rune on")
switch(target.getFireLoss()) switch(target.getFireLoss())
if(0 to 25) if(0 to 25)
target << "<span class='danger'>Your blood boils as you force yourself to resist the corruption invading every corner of your mind.</span>" target << "<span class='danger'>Your blood boils as you force yourself to resist the corruption invading every corner of your mind.</span>"
@@ -176,12 +177,13 @@ var/list/sacrificed = list()
/////////////////////////////////////////FOURTH RUNE /////////////////////////////////////////FOURTH RUNE
tearreality() tearreality()
var/cultist_count = 0 var/list/cultists = new()
for(var/mob/M in range(1,src)) for(var/mob/M in range(1,src))
if(iscultist(M) && !M.stat) if(iscultist(M) && !M.stat)
M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
cultist_count += 1 cultists += 1
if(cultist_count >= 9) if(cultists.len >= 9)
log_and_message_admins_many(cultists, "summoned Nar-sie.")
new /obj/machinery/singularity/narsie/large(src.loc) new /obj/machinery/singularity/narsie/large(src.loc)
return return
else else
@@ -190,6 +192,7 @@ var/list/sacrificed = list()
/////////////////////////////////////////FIFTH RUNE /////////////////////////////////////////FIFTH RUNE
emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist
log_and_message_admins("activated an EMP rune.")
if(istype(src,/obj/effect/rune)) if(istype(src,/obj/effect/rune))
usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!") usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
else else
@@ -211,6 +214,7 @@ var/list/sacrificed = list()
if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"]) if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"])
for(var/mob/living/carbon/D in R.loc) for(var/mob/living/carbon/D in R.loc)
if(D.stat!=2) if(D.stat!=2)
admin_attack_log(usr, D, "Used a blood drain rune.", "Was victim of a blood drain rune.", "used a blood drain rune on")
var/bdrain = rand(1,25) var/bdrain = rand(1,25)
D << "\red You feel weakened." D << "\red You feel weakened."
D.take_overall_damage(bdrain, 0) D.take_overall_damage(bdrain, 0)
@@ -443,6 +447,7 @@ var/list/sacrificed = list()
D.real_name += " " D.real_name += " "
D.real_name += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith") D.real_name += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith")
log_and_message_admins("used a manifest rune.")
var/mob/living/user = usr var/mob/living/user = usr
while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc) while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc)
user.take_organ_damage(1, 0) user.take_organ_damage(1, 0)
@@ -657,6 +662,7 @@ var/list/sacrificed = list()
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed." usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
else else
if(prob(40)) if(prob(40))
usr << "\red The Geometer of blood accepts this sacrifice." usr << "\red The Geometer of blood accepts this sacrifice."
cult.grant_runeword(usr) cult.grant_runeword(usr)
else else
@@ -853,7 +859,7 @@ var/list/sacrificed = list()
deafen() deafen()
if(istype(src,/obj/effect/rune)) if(istype(src,/obj/effect/rune))
var/affected = 0 var/list/affected = new()
for(var/mob/living/carbon/C in range(7,src)) for(var/mob/living/carbon/C in range(7,src))
if (iscultist(C)) if (iscultist(C))
continue continue
@@ -862,17 +868,18 @@ var/list/sacrificed = list()
continue continue
C.ear_deaf += 50 C.ear_deaf += 50
C.show_message("\red The world around you suddenly becomes quiet.", 3) C.show_message("\red The world around you suddenly becomes quiet.", 3)
affected++ affected += C
if(prob(1)) if(prob(1))
C.sdisabilities |= DEAF C.sdisabilities |= DEAF
if(affected) if(affected.len)
usr.say("Sti[pick("'","`")] kaliedir!") usr.say("Sti[pick("'","`")] kaliedir!")
usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust." usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust."
admin_attacker_log_many_victims(usr, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on")
del(src) del(src)
else else
return fizzle() return fizzle()
else else
var/affected = 0 var/list/affected = new()
for(var/mob/living/carbon/C in range(7,usr)) for(var/mob/living/carbon/C in range(7,usr))
if (iscultist(C)) if (iscultist(C))
continue continue
@@ -882,10 +889,11 @@ var/list/sacrificed = list()
C.ear_deaf += 30 C.ear_deaf += 30
//talismans is weaker. //talismans is weaker.
C.show_message("\red The world around you suddenly becomes quiet.", 3) C.show_message("\red The world around you suddenly becomes quiet.", 3)
affected++ affected += C
if(affected) if(affected.len)
usr.whisper("Sti[pick("'","`")] kaliedir!") usr.whisper("Sti[pick("'","`")] kaliedir!")
usr << "\red Your talisman turns into gray dust, deafening everyone around." usr << "\red Your talisman turns into gray dust, deafening everyone around."
admin_attacker_log_many_victims(usr, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on")
for (var/mob/V in orange(1,src)) for (var/mob/V in orange(1,src))
if(!(iscultist(V))) if(!(iscultist(V)))
V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3)
@@ -893,7 +901,7 @@ var/list/sacrificed = list()
blind() blind()
if(istype(src,/obj/effect/rune)) if(istype(src,/obj/effect/rune))
var/affected = 0 var/list/affected = new()
for(var/mob/living/carbon/C in viewers(src)) for(var/mob/living/carbon/C in viewers(src))
if (iscultist(C)) if (iscultist(C))
continue continue
@@ -907,15 +915,16 @@ var/list/sacrificed = list()
if(prob(10)) if(prob(10))
C.sdisabilities |= BLIND C.sdisabilities |= BLIND
C.show_message("\red Suddenly you see red flash that blinds you.", 3) C.show_message("\red Suddenly you see red flash that blinds you.", 3)
affected++ affected += C
if(affected) if(affected.len)
usr.say("Sti[pick("'","`")] kaliesin!") usr.say("Sti[pick("'","`")] kaliesin!")
usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust." usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."
admin_attacker_log_many_victims(usr, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on")
del(src) del(src)
else else
return fizzle() return fizzle()
else else
var/affected = 0 var/list/affected = new()
for(var/mob/living/carbon/C in view(2,usr)) for(var/mob/living/carbon/C in view(2,usr))
if (iscultist(C)) if (iscultist(C))
continue continue
@@ -925,11 +934,12 @@ var/list/sacrificed = list()
C.eye_blurry += 30 C.eye_blurry += 30
C.eye_blind += 10 C.eye_blind += 10
//talismans is weaker. //talismans is weaker.
affected++ affected += C
C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3) C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3)
if(affected) if(affected.len)
usr.whisper("Sti[pick("'","`")] kaliesin!") usr.whisper("Sti[pick("'","`")] kaliesin!")
usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie." usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie."
admin_attacker_log_many_victims(usr, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on")
return return
@@ -940,12 +950,13 @@ var/list/sacrificed = list()
if (istype(H.current,/mob/living/carbon)) if (istype(H.current,/mob/living/carbon))
cultists+=H.current cultists+=H.current
*/ */
var/culcount = 0 //also, wording for it is old wording for obscure rune, which is now hide-see-blood. var/list/cultists = new //also, wording for it is old wording for obscure rune, which is now hide-see-blood.
var/list/victims = new
// var/list/cultboil = list(cultists-usr) //and for this words are destroy-see-blood. // var/list/cultboil = list(cultists-usr) //and for this words are destroy-see-blood.
for(var/mob/living/carbon/C in orange(1,src)) for(var/mob/living/carbon/C in orange(1,src))
if(iscultist(C) && !C.stat) if(iscultist(C) && !C.stat)
culcount++ cultists+=C
if(culcount>=3) if(cultists.len>=3)
for(var/mob/living/carbon/M in viewers(usr)) for(var/mob/living/carbon/M in viewers(usr))
if(iscultist(M)) if(iscultist(M))
continue continue
@@ -954,6 +965,7 @@ var/list/sacrificed = list()
continue continue
M.take_overall_damage(51,51) M.take_overall_damage(51,51)
M << "\red Your blood boils!" M << "\red Your blood boils!"
victims += M
if(prob(5)) if(prob(5))
spawn(5) spawn(5)
M.gib() M.gib()
@@ -964,6 +976,8 @@ var/list/sacrificed = list()
if(iscultist(C) && !C.stat) if(iscultist(C) && !C.stat)
C.say("Dedo ol[pick("'","`")]btoh!") C.say("Dedo ol[pick("'","`")]btoh!")
C.take_overall_damage(15, 0) C.take_overall_damage(15, 0)
admin_attacker_log_many_victims(usr, victims, "Used a blood boil rune.", "Was the victim of a blood boil rune.", "used a blood boil rune on")
log_and_message_admins_many(cultists - usr, "assisted activating a blood boil rune.")
del(src) del(src)
else else
return fizzle() return fizzle()
@@ -1003,7 +1017,6 @@ var/list/sacrificed = list()
if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around. if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around.
usr.say("Fuu ma[pick("'","`")]jin!") usr.say("Fuu ma[pick("'","`")]jin!")
for(var/mob/living/L in viewers(src)) for(var/mob/living/L in viewers(src))
if(iscarbon(L)) if(iscarbon(L))
var/mob/living/carbon/C = L var/mob/living/carbon/C = L
flick("e_flash", C.flash) flick("e_flash", C.flash)
@@ -1012,11 +1025,13 @@ var/list/sacrificed = list()
C.Weaken(1) C.Weaken(1)
C.Stun(1) C.Stun(1)
C.show_message("\red The rune explodes in a bright flash.", 3) C.show_message("\red The rune explodes in a bright flash.", 3)
admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
else if(issilicon(L)) else if(issilicon(L))
var/mob/living/silicon/S = L var/mob/living/silicon/S = L
S.Weaken(5) S.Weaken(5)
S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3) S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3)
admin_attack_log(usr, S, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
del(src) del(src)
else ///When invoked as talisman, stun and mute the target mob. else ///When invoked as talisman, stun and mute the target mob.
usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!") usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
@@ -1030,7 +1045,7 @@ var/list/sacrificed = list()
if(issilicon(T)) if(issilicon(T))
T.Weaken(15) T.Weaken(15)
admin_attack_log(usr, T, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
else if(iscarbon(T)) else if(iscarbon(T))
var/mob/living/carbon/C = T var/mob/living/carbon/C = T
flick("e_flash", C.flash) flick("e_flash", C.flash)
@@ -1038,6 +1053,7 @@ var/list/sacrificed = list()
C.silent += 15 C.silent += 15
C.Weaken(25) C.Weaken(25)
C.Stun(25) C.Stun(25)
admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
return return
/////////////////////////////////////////TWENTY-FIFTH RUNE /////////////////////////////////////////TWENTY-FIFTH RUNE

View File

@@ -1,4 +1,11 @@
// PRESETS // PRESETS
var/global/list/station_networks = list("SS13","Engineering Outpost","MINE","Research Outpost","Prison","Security")
/obj/machinery/camera/network/prison
network = list("Prison")
/obj/machinery/camera/network/security
network = list("Security")
// EMP // EMP
@@ -32,13 +39,16 @@
// AUTONAME // AUTONAME
/obj/machinery/camera/autoname/engineering_outpost /obj/machinery/camera/autoname/engineering_outpost
network = list("SS13", "Engineering Outpost") network = list("Engineering Outpost")
/obj/machinery/camera/autoname/mining_outpost /obj/machinery/camera/autoname/mining_outpost
network = list("SS13", "MINE") network = list("MINE")
/obj/machinery/camera/autoname/research_outpost /obj/machinery/camera/autoname/research_outpost
network = list("SS13", "Research Outpost") network = list("Research Outpost")
/obj/machinery/camera/autoname/security
network = list("Security")
/obj/machinery/camera/autoname /obj/machinery/camera/autoname
var/number = 0 //camera number in area var/number = 0 //camera number in area

View File

@@ -12,11 +12,16 @@
icon_state = "cameras" icon_state = "cameras"
var/obj/machinery/camera/current = null var/obj/machinery/camera/current = null
var/last_pic = 1.0 var/last_pic = 1.0
var/list/network = list("SS13") var/list/network
var/mapping = 0//For the overview file, interesting bit of code. var/mapping = 0//For the overview file, interesting bit of code.
circuit = /obj/item/weapon/circuitboard/security circuit = /obj/item/weapon/circuitboard/security
var/camera_cache = null var/camera_cache = null
New()
if(!network)
network = station_networks
..()
attack_ai(var/mob/user as mob) attack_ai(var/mob/user as mob)
return attack_hand(user) return attack_hand(user)
@@ -235,7 +240,7 @@
name = "engineering camera monitor" name = "engineering camera monitor"
desc = "Used to monitor fires and breaches." desc = "Used to monitor fires and breaches."
icon_state = "engineeringcameras" icon_state = "engineeringcameras"
network = list("Engineering","Power Alarms","Atmosphere Alarms","Fire Alarms") network = list("Engineering","Engineering Outpost","Power Alarms","Atmosphere Alarms","Fire Alarms")
circuit = /obj/item/weapon/circuitboard/security/engineering circuit = /obj/item/weapon/circuitboard/security/engineering
/obj/machinery/computer/security/nuclear /obj/machinery/computer/security/nuclear

View File

@@ -304,6 +304,17 @@
update_icon() update_icon()
return return
/obj/machinery/door/examine(mob/user)
..()
if(src.health < src.maxhealth / 4)
user << "\The [src] looks like it's about to break!"
else if(src.health < src.maxhealth / 2)
user << "\The [src] looks seriously damaged!"
else if(src.health < src.maxhealth * 3/4)
user << "\The [src] shows signs of damage!"
/obj/machinery/door/proc/set_broken() /obj/machinery/door/proc/set_broken()
stat |= BROKEN stat |= BROKEN
for (var/mob/O in viewers(src, null)) for (var/mob/O in viewers(src, null))

View File

@@ -179,12 +179,15 @@
return return
/obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/machinery/vending/attackby(obj/item/weapon/W as obj, mob/user as mob)
var/obj/item/weapon/card/id/I = W.GetID()
if (currently_vending && vendor_account && !vendor_account.suspended) if (currently_vending && vendor_account && !vendor_account.suspended)
var/paid = 0 var/paid = 0
var/handled = 0 var/handled = 0
if(istype(W, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = W if (I) //for IDs and PDAs and wallets with IDs
paid = pay_with_card(C) paid = pay_with_card(I,W)
handled = 1 handled = 1
else if (istype(W, /obj/item/weapon/spacecash/ewallet)) else if (istype(W, /obj/item/weapon/spacecash/ewallet))
var/obj/item/weapon/spacecash/ewallet/C = W var/obj/item/weapon/spacecash/ewallet/C = W
@@ -202,9 +205,12 @@
nanomanager.update_uis(src) nanomanager.update_uis(src)
return // don't smack that machine with your 2 thalers return // don't smack that machine with your 2 thalers
if (istype(W, /obj/item/weapon/card/emag)) if (I || istype(W, /obj/item/weapon/spacecash))
attack_hand(user)
return
else if (istype(W, /obj/item/weapon/card/emag))
src.emagged = 1 src.emagged = 1
user << "You short out the product lock on [src]" user << "You short out the product lock on \the [src]"
return return
else if(istype(W, /obj/item/weapon/screwdriver)) else if(istype(W, /obj/item/weapon/screwdriver))
src.panel_open = !src.panel_open src.panel_open = !src.panel_open
@@ -224,7 +230,7 @@
W.loc = src W.loc = src
coin = W coin = W
categories |= CAT_COIN categories |= CAT_COIN
user << "\blue You insert the [W] into the [src]" user << "\blue You insert \the [W] into \the [src]"
nanomanager.update_uis(src) nanomanager.update_uis(src)
return return
else if(istype(W, /obj/item/weapon/wrench)) else if(istype(W, /obj/item/weapon/wrench))
@@ -234,9 +240,9 @@
switch (anchored) switch (anchored)
if (0) if (0)
anchored = 1 anchored = 1
user.visible_message("[user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.") user.visible_message("\The [user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.")
if (1) if (1)
user.visible_message("[user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.") user.visible_message("\The [user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.")
anchored = 0 anchored = 0
return return
@@ -266,7 +272,7 @@
if(istype(cashmoney, /obj/item/weapon/spacecash/bundle)) if(istype(cashmoney, /obj/item/weapon/spacecash/bundle))
// Bundles can just have money subtracted, and will work // Bundles can just have money subtracted, and will work
visible_message("<span class='info'>[usr] inserts some cash into [src].</span>") visible_message("<span class='info'>\The [usr] inserts some cash into \the [src].</span>")
var/obj/item/weapon/spacecash/bundle/cashmoney_bundle = cashmoney var/obj/item/weapon/spacecash/bundle/cashmoney_bundle = cashmoney
cashmoney_bundle.worth -= currently_vending.price cashmoney_bundle.worth -= currently_vending.price
@@ -281,7 +287,7 @@
// This is really dirty, but there's no superclass for all bills, so we // This is really dirty, but there's no superclass for all bills, so we
// just assume that all spacecash that's not something else is a bill // just assume that all spacecash that's not something else is a bill
visible_message("<span class='info'>[usr] inserts a bill into [src].</span>") visible_message("<span class='info'>\The [usr] inserts a bill into \the [src].</span>")
var/left = cashmoney.worth - currently_vending.price var/left = cashmoney.worth - currently_vending.price
usr.drop_from_inventory(cashmoney) usr.drop_from_inventory(cashmoney)
del(cashmoney) del(cashmoney)
@@ -300,7 +306,7 @@
* successful, 0 if failed. * successful, 0 if failed.
*/ */
/obj/machinery/vending/proc/pay_with_ewallet(var/obj/item/weapon/spacecash/ewallet/wallet) /obj/machinery/vending/proc/pay_with_ewallet(var/obj/item/weapon/spacecash/ewallet/wallet)
visible_message("<span class='info'>[usr] swipes a card through [src].</span>") visible_message("<span class='info'>\The [usr] swipes \the [wallet] through \the [src].</span>")
if(currently_vending.price > wallet.worth) if(currently_vending.price > wallet.worth)
src.status_message = "Insufficient funds on chargecard." src.status_message = "Insufficient funds on chargecard."
src.status_error = 1 src.status_error = 1
@@ -316,8 +322,11 @@
* Takes payment for whatever is the currently_vending item. Returns 1 if * Takes payment for whatever is the currently_vending item. Returns 1 if
* successful, 0 if failed * successful, 0 if failed
*/ */
/obj/machinery/vending/proc/pay_with_card(var/obj/item/weapon/card/id/I) /obj/machinery/vending/proc/pay_with_card(var/obj/item/weapon/card/id/I, var/obj/item/ID_container)
visible_message("<span class='info'>[usr] swipes a card through [src].</span>") if(I==ID_container || ID_container == null)
visible_message("<span class='info'>\The [usr] swipes \the [I] through \the [src].</span>")
else
visible_message("<span class='info'>\The [usr] swipes \the [ID_container] through \the [src].</span>")
var/datum/money_account/customer_account = get_account(I.associated_account_number) var/datum/money_account/customer_account = get_account(I.associated_account_number)
if (!customer_account) if (!customer_account)
src.status_message = "Error: Unable to access account. Please contact technical support if problem persists." src.status_message = "Error: Unable to access account. Please contact technical support if problem persists."
@@ -529,7 +538,7 @@
return return
if(coin.string_attached) if(coin.string_attached)
if(prob(50)) if(prob(50))
user << "\blue You successfully pull the coin out before the [src] could swallow it." user << "\blue You successfully pull the coin out before \the [src] could swallow it."
else else
user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all." user << "\blue You weren't able to pull the coin out fast enough, the machine ate it, string and all."
del(coin) del(coin)
@@ -558,7 +567,7 @@
/obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user) /obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user)
if(src.panel_open) if(src.panel_open)
user << "\blue You stock the [src] with \a [R.product_name]" user << "\blue You stock \the [src] with \a [R.product_name]"
R.amount++ R.amount++
nanomanager.update_uis(src) nanomanager.update_uis(src)
@@ -592,7 +601,7 @@
return return
for(var/mob/O in hearers(src, null)) for(var/mob/O in hearers(src, null))
O.show_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"",2) O.show_message("<span class='game say'><span class='name'>\The [src]</span> beeps, \"[message]\"",2)
return return
/obj/machinery/vending/power_change() /obj/machinery/vending/power_change()

View File

@@ -98,7 +98,7 @@
<br> <br>
<h2>OPERATING PRINCIPLES</h2> <h2>OPERATING PRINCIPLES</h2>
<br> <br>
<li>The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and plasma. As oxygen accelerates the reaction, and plasma carries the risk of fire, these must be filtered out. NOTE: Supermatter radiation will not charge radiation collectors.</li> <li>The supermatter crystal serves as the fundamental power source of the engine. Upon being charged, it begins to emit large amounts of heat and radiation, as well and oxygen and phoron gas. As oxygen accelerates the reaction, and phoron carries the risk of fire, these must be filtered out. NOTE: Supermatter radiation will not charge radiation collectors.</li>
<br> <br>
<li>Air in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.</li> <li>Air in the reactor chamber housing the supermatter is circulated through the reactor loop, which passes through the filters and thermoelectric generators. The thermoelectric generators transfer heat from the reactor loop to the colder radiator loop, thereby generating power. Additional power is generated from internal turbines in the circulators.</li>
<br> <br>
@@ -106,7 +106,7 @@
<br> <br>
<li>The MK 1 Prototype Thermoelectric Supermatter Engine is designed to operate at reactor temperatures of 3000K to 4000K and generate up to 1MW of power. Beyond 1MW, the thermoelectric generators will begin to lose power through electrical discharge, reducing efficiency, but additional power generation remains feasible.</li> <li>The MK 1 Prototype Thermoelectric Supermatter Engine is designed to operate at reactor temperatures of 3000K to 4000K and generate up to 1MW of power. Beyond 1MW, the thermoelectric generators will begin to lose power through electrical discharge, reducing efficiency, but additional power generation remains feasible.</li>
<br> <br>
<li>The crystal structure of the supermatter will begin to liquefy if its temperature exceeds 5000K. This eventually results in a massive release of light, heat and radiation, disintegration of both the supermatter crystal and most of the surrounding area, and as as-of-yet poorly documented psychological effects on all animals within a 2km. Appropriate action should be taken to stabilize or eject the supermatter before such occurs.</li> <li>The crystal structure of the supermatter will begin to liquefy if its temperature exceeds 5000K. This eventually results in a massive release of light, heat and radiation, disintegration of both the supermatter crystal and most of the surrounding area, and as as-of-yet poorly documented psychological effects on all animals within a 2km radius. Appropriate action should be taken to stabilize or eject the supermatter before such occurs.</li>
<br> <br>
<h2>SUPERMATTER HANDLING</h2> <h2>SUPERMATTER HANDLING</h2>
<li>Do not expose supermatter to oxygen.</li> <li>Do not expose supermatter to oxygen.</li>
@@ -125,7 +125,7 @@
<ol> <ol>
<li>Ensure that radiation protection and meson goggles are worn at all times while working in the engine room.</li> <li>Ensure that radiation protection and meson goggles are worn at all times while working in the engine room.</li>
<li>Ensure that reactor and radiator loops are undamaged and unobstructed.</li> <li>Ensure that reactor and radiator loops are undamaged and unobstructed.</li>
<li>Ensure that plasma and oxygen gas exhaust from filters is properly contained or disposed. Do not allow exhaust pressure to exceed 4500 kPa.</li> <li>Ensure that phoron and oxygen gas exhaust from filters is properly contained or disposed. Do not allow exhaust pressure to exceed 4500 kPa.</li>
<li>Ensure that engine room Area Power Controller (APC) and engine Superconducting Magnetic Energy Storage unit (SMES) are properly charged.</li> <li>Ensure that engine room Area Power Controller (APC) and engine Superconducting Magnetic Energy Storage unit (SMES) are properly charged.</li>
<li>Ensure that reactor temperature does not exceed 5000K. In event of reactor temperature exceeding 5000K, see EMERGENCY COOLING PROCEDURE.</li> <li>Ensure that reactor temperature does not exceed 5000K. In event of reactor temperature exceeding 5000K, see EMERGENCY COOLING PROCEDURE.</li>
<li>In event of imminent and/or unavoidable delamination, see EJECTION PROCEDURE.</li> <li>In event of imminent and/or unavoidable delamination, see EJECTION PROCEDURE.</li>

View File

@@ -296,7 +296,7 @@ var/list/admin_verbs_mentor = list(
if(holder.rights & R_SERVER) verbs += admin_verbs_server if(holder.rights & R_SERVER) verbs += admin_verbs_server
if(holder.rights & R_DEBUG) if(holder.rights & R_DEBUG)
verbs += admin_verbs_debug verbs += admin_verbs_debug
if(config.debugparanoid && !check_rights(R_ADMIN)) if(config.debugparanoid && !(holder.rights & R_ADMIN))
verbs.Remove(admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on. verbs.Remove(admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on.
if(holder.rights & R_POSSESS) verbs += admin_verbs_possess if(holder.rights & R_POSSESS) verbs += admin_verbs_possess
if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions

View File

@@ -661,6 +661,12 @@ var/global/list/gear_datums = list()
cost = 2 cost = 2
slot = slot_shoes slot = slot_shoes
/datum/gear/toeless_jackboots
display_name = "toe-less jackboots"
path = /obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran //permisson of owner of custom item was granted
cost = 2
slot = slot_shoes
/datum/gear/sandal /datum/gear/sandal
display_name = "sandals" display_name = "sandals"
path = /obj/item/clothing/shoes/sandal path = /obj/item/clothing/shoes/sandal

View File

@@ -105,6 +105,13 @@
// Okay, it wasn't a terminal being touched, check for all the simple insertions. // Okay, it wasn't a terminal being touched, check for all the simple insertions.
if(input_device.type in list(/obj/item/device/paicard, /obj/item/device/mmi, /obj/item/device/mmi/digital/posibrain)) if(input_device.type in list(/obj/item/device/paicard, /obj/item/device/mmi, /obj/item/device/mmi/digital/posibrain))
if(integrated_ai)
integrated_ai.attackby(input_device,user)
// If the transfer was successful, we can clear out our vars.
if(integrated_ai.loc != src)
integrated_ai = null
eject_ai()
else
integrate_ai(input_device,user) integrate_ai(input_device,user)
return 1 return 1

View File

@@ -1,5 +1,5 @@
/obj/item/device/eftpos /obj/item/device/eftpos
name = "EFTPOS scanner" name = "\improper EFTPOS scanner"
desc = "Swipe your ID card to make purchases electronically." desc = "Swipe your ID card to make purchases electronically."
icon = 'icons/obj/device.dmi' icon = 'icons/obj/device.dmi'
icon_state = "eftpos" icon_state = "eftpos"
@@ -110,11 +110,13 @@
else else
user << browse(null,"window=eftpos") user << browse(null,"window=eftpos")
/obj/item/device/eftpos/attackby(O as obj, user as mob) /obj/item/device/eftpos/attackby(obj/item/O as obj, user as mob)
if(istype(O, /obj/item/weapon/card))
var/obj/item/weapon/card/id/I = O.GetID()
if(I)
if(linked_account) if(linked_account)
var/obj/item/weapon/card/I = O scan_card(I, O)
scan_card(I)
else else
usr << "\icon[src]<span class='warning'>Unable to connect to linked account.</span>" usr << "\icon[src]<span class='warning'>Unable to connect to linked account.</span>"
else if (istype(O, /obj/item/weapon/spacecash/ewallet)) else if (istype(O, /obj/item/weapon/spacecash/ewallet))
@@ -124,7 +126,7 @@
if(transaction_locked && !transaction_paid) if(transaction_locked && !transaction_paid)
if(transaction_amount <= E.worth) if(transaction_amount <= E.worth)
playsound(src, 'sound/machines/chime.ogg', 50, 1) playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("\icon[src] The [src] chimes.") src.visible_message("\icon[src] \The [src] chimes.")
transaction_paid = 1 transaction_paid = 1
//transfer the money //transfer the money
@@ -141,7 +143,7 @@
T.time = worldtime2text() T.time = worldtime2text()
linked_account.transaction_log.Add(T) linked_account.transaction_log.Add(T)
else else
usr << "\icon[src]<span class='warning'>The charge card doesn't have that much money!</span>" usr << "\icon[src]<span class='warning'>\The [O] doesn't have that much money!</span>"
else else
usr << "\icon[src]<span class='warning'>Connected account has been suspended.</span>" usr << "\icon[src]<span class='warning'>Connected account has been suspended.</span>"
else else
@@ -225,10 +227,13 @@
src.attack_self(usr) src.attack_self(usr)
/obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I) /obj/item/device/eftpos/proc/scan_card(var/obj/item/weapon/card/I, var/obj/item/ID_container)
if (istype(I, /obj/item/weapon/card/id)) if (istype(I, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/C = I var/obj/item/weapon/card/id/C = I
visible_message("<span class='info'>[usr] swipes a card through [src].</span>") if(I==ID_container || ID_container == null)
usr.visible_message("<span class='info'>\The [usr] swipes a card through \the [src].</span>")
else
usr.visible_message("<span class='info'>\The [usr] swipes \the [ID_container] through \the [src].</span>")
if(transaction_locked && !transaction_paid) if(transaction_locked && !transaction_paid)
if(linked_account) if(linked_account)
if(!linked_account.suspended) if(!linked_account.suspended)
@@ -242,7 +247,7 @@
if(!D.suspended) if(!D.suspended)
if(transaction_amount <= D.money) if(transaction_amount <= D.money)
playsound(src, 'sound/machines/chime.ogg', 50, 1) playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("\icon[src] The [src] chimes.") src.visible_message("\icon[src] \The [src] chimes.")
transaction_paid = 1 transaction_paid = 1
//transfer the money //transfer the money
@@ -283,13 +288,13 @@
else if (istype(I, /obj/item/weapon/card/emag)) else if (istype(I, /obj/item/weapon/card/emag))
if(transaction_locked) if(transaction_locked)
if(transaction_paid) if(transaction_paid)
usr << "\icon[src]<span class='info'>You stealthily swipe [I] through [src].</span>" usr << "\icon[src]<span class='info'>You stealthily swipe \the [I] through \the [src].</span>"
transaction_locked = 0 transaction_locked = 0
transaction_paid = 0 transaction_paid = 0
else else
visible_message("<span class='info'>[usr] swipes a card through [src].</span>") usr.visible_message("<span class='info'>\The [usr] swipes a card through \the [src].</span>")
playsound(src, 'sound/machines/chime.ogg', 50, 1) playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("\icon[src] The [src] chimes.") src.visible_message("\icon[src] \The [src] chimes.")
transaction_paid = 1 transaction_paid = 1
else else
..() ..()

View File

@@ -62,7 +62,7 @@
matter = list("metal" = 3750) matter = list("metal" = 3750)
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
origin_tech = "materials=1;engineering=1" origin_tech = "materials=1;engineering=1"
attack_verb = list("hit", "pierced", "sliced", "attacked", "drilled") attack_verb = list("hit", "pierced", "sliced", "attacked")
var/drill_sound = 'sound/weapons/Genhit.ogg' var/drill_sound = 'sound/weapons/Genhit.ogg'
var/drill_verb = "drilling" var/drill_verb = "drilling"
sharp = 1 sharp = 1
@@ -107,6 +107,7 @@
digspeed = 20 digspeed = 20
origin_tech = "materials=4" origin_tech = "materials=4"
desc = "This makes no metallurgic sense." desc = "This makes no metallurgic sense."
drill_verb = "picking"
/obj/item/weapon/pickaxe/plasmacutter /obj/item/weapon/pickaxe/plasmacutter
name = "plasma cutter" name = "plasma cutter"
@@ -127,7 +128,8 @@
item_state = "dpickaxe" item_state = "dpickaxe"
digspeed = 10 digspeed = 10
origin_tech = "materials=6;engineering=4" origin_tech = "materials=6;engineering=4"
desc = "A pickaxe with a diamond pick head, this is just like minecraft." desc = "A pickaxe with a diamond pick head."
drill_verb = "picking"
/obj/item/weapon/pickaxe/diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME! /obj/item/weapon/pickaxe/diamonddrill //When people ask about the badass leader of the mining tools, they are talking about ME!
name = "diamond mining drill" name = "diamond mining drill"

View File

@@ -134,6 +134,12 @@
. = (L in languages) . = (L in languages)
languages.Remove(L) languages.Remove(L)
/mob/living/remove_language(rem_language)
var/datum/language/L = all_languages[rem_language]
if(default_language == L)
default_language = null
return ..()
// Can we speak this language, as opposed to just understanding it? // Can we speak this language, as opposed to just understanding it?
/mob/proc/can_speak(datum/language/speaking) /mob/proc/can_speak(datum/language/speaking)
@@ -154,4 +160,32 @@
src << browse(dat, "window=checklanguage") src << browse(dat, "window=checklanguage")
return return
/mob/living/check_languages()
var/dat = "<b><font size = 5>Known Languages</font></b><br/><br/>"
if(default_language)
dat += "Current default language: [default_language] - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br/><br/>"
for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL))
if(L == default_language)
dat += "<b>[L.name] (:[L.key])</b> - default - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br/>[L.desc]<br/><br/>"
else
dat += "<b>[L.name] (:[L.key])</b> - <a href='byond://?src=\ref[src];default_lang=[L]'>set default</a><br/>[L.desc]<br/><br/>"
src << browse(dat, "window=checklanguage")
/mob/living/Topic(href, href_list)
if(href_list["default_lang"])
if(href_list["default_lang"] == "reset")
set_default_language(null)
else
var/datum/language/L = all_languages[href_list["default_lang"]]
if(L)
set_default_language(L)
check_languages()
return 1
else
return ..()
#undef SCRAMBLE_CACHE_LEN #undef SCRAMBLE_CACHE_LEN

View File

@@ -456,6 +456,9 @@
return 1 return 1
/mob/living/carbon/get_default_language() /mob/living/carbon/get_default_language()
if(default_language)
return default_language
if(!species) if(!species)
return null return null
return species.default_language ? all_languages[species.default_language] : null return species.default_language ? all_languages[species.default_language] : null

View File

@@ -74,7 +74,7 @@
mutations.Add(HUSK) mutations.Add(HUSK)
status_flags |= DISFIGURED //makes them unknown without fucking up other stuff like admintools status_flags |= DISFIGURED //makes them unknown without fucking up other stuff like admintools
update_body(0) update_body(1)
return return
/mob/living/carbon/human/proc/Drain() /mob/living/carbon/human/proc/Drain()

View File

@@ -21,7 +21,10 @@
set_species() set_species()
if(species) if(species)
name = species.get_random_name(gender) real_name = species.get_random_name(gender)
name = real_name
if(mind)
mind.name = real_name
var/datum/reagents/R = new/datum/reagents(1000) var/datum/reagents/R = new/datum/reagents(1000)
reagents = R reagents = R
@@ -926,23 +929,12 @@
germ_level += n germ_level += n
/mob/living/carbon/human/revive() /mob/living/carbon/human/revive()
for (var/obj/item/organ/external/O in organs)
O.status &= ~ORGAN_BROKEN
O.status &= ~ORGAN_BLEEDING
O.status &= ~ORGAN_SPLINTED
O.status &= ~ORGAN_CUT_AWAY
O.status &= ~ORGAN_ATTACHABLE
O.wounds.Cut()
O.heal_damage(1000,1000,1,1)
var/obj/item/organ/external/head/h = organs_by_name["head"]
h.disfigured = 0
if(species && !(species.flags & NO_BLOOD)) if(species && !(species.flags & NO_BLOOD))
vessel.add_reagent("blood",560-vessel.total_volume) vessel.add_reagent("blood",560-vessel.total_volume)
fixblood() fixblood()
// Fix up any missing organs. // Fix up all organs.
// This will ignore any prosthetics in the prefs currently. // This will ignore any prosthetics in the prefs currently.
species.create_organs(src) species.create_organs(src)
@@ -954,11 +946,9 @@
H.brainmob.mind.transfer_to(src) H.brainmob.mind.transfer_to(src)
del(H) del(H)
for(var/obj/item/organ/I in internal_organs)
I.damage = 0
for (var/datum/disease/virus in viruses) for (var/datum/disease/virus in viruses)
virus.cure() virus.cure()
for (var/ID in virus2) for (var/ID in virus2)
var/datum/disease2/disease/V = virus2[ID] var/datum/disease2/disease/V = virus2[ID]
V.cure(src) V.cure(src)

View File

@@ -100,9 +100,9 @@
var/hit_zone = H.zone_sel.selecting var/hit_zone = H.zone_sel.selecting
var/obj/item/organ/external/affecting = get_organ(hit_zone) var/obj/item/organ/external/affecting = get_organ(hit_zone)
if(!affecting || affecting.status & ORGAN_DESTROYED) if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED))
M << "<span class='danger'>They are missing that limb!</span>" M << "<span class='danger'>They are missing that limb!</span>"
return return 1
switch(src.a_intent) switch(src.a_intent)
if(I_HELP) if(I_HELP)
@@ -220,14 +220,14 @@
if (istype(l_hand,/obj/item/weapon/gun)) if (istype(l_hand,/obj/item/weapon/gun))
W = l_hand W = l_hand
chance = hand ? 40 : 20 chance += hand ? 40 : 20
if (istype(r_hand,/obj/item/weapon/gun)) else if (istype(r_hand,/obj/item/weapon/gun))
W = r_hand W = r_hand
chance = !hand ? 40 : 20 chance += !hand ? 40 : 20
if (prob(chance)) if (prob(chance))
visible_message("<span class='danger'>[src]'s [W] goes off during struggle!</span>") visible_message("<span class='danger'>[src]'s [W.name] goes off during struggle!")
var/list/turfs = list() var/list/turfs = list()
for(var/turf/T in view()) for(var/turf/T in view())
turfs += T turfs += T
@@ -308,7 +308,7 @@
if(!target_zone) if(!target_zone)
return null return null
var/obj/item/organ/external/organ = get_organ(check_zone(target_zone)) var/obj/item/organ/external/organ = get_organ(check_zone(target_zone))
if(!organ || organ.is_dislocated() || organ.dislocated == -1) if(!organ || (organ.dislocated == 2) || (organ.dislocated == -1))
return null return null
var/dislocation_str var/dislocation_str
if(prob(W.force)) if(prob(W.force))

View File

@@ -1,7 +1,7 @@
/mob/living/carbon/human/proc/update_eyes() /mob/living/carbon/human/proc/update_eyes()
if(internal_organs_by_name["eyes"])
var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"] var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
eyes.eye_colour = list(r_eyes,g_eyes,b_eyes) if(eyes)
eyes.update_colour()
regenerate_icons() regenerate_icons()
/mob/living/carbon/var/list/internal_organs = list() /mob/living/carbon/var/list/internal_organs = list()
@@ -70,12 +70,12 @@
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot")) for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
var/obj/item/organ/external/E = organs_by_name[limb_tag] var/obj/item/organ/external/E = organs_by_name[limb_tag]
if(!E) if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD)))
stance_damage += 2
else if (E.status & ORGAN_DESTROYED)
stance_damage += 2 // let it fail even if just foot&leg stance_damage += 2 // let it fail even if just foot&leg
else if (E.is_malfunctioning() || (E.is_broken() && !(E.status & ORGAN_SPLINTED)) || !E.is_usable()) else if (E.is_malfunctioning() || (E.is_broken() && !(E.status & ORGAN_SPLINTED)) || (E.status & ORGAN_MUTATED))
stance_damage += 1 stance_damage += 1
else if (E.is_dislocated())
stance_damage += 0.5
// Canes and crutches help you stand (if the latter is ever added) // Canes and crutches help you stand (if the latter is ever added)
// One cane mitigates a broken leg+foot, or a missing foot. // One cane mitigates a broken leg+foot, or a missing foot.
@@ -102,10 +102,14 @@
if(!E || !E.can_grasp || (E.status & ORGAN_SPLINTED)) if(!E || !E.can_grasp || (E.status & ORGAN_SPLINTED))
continue continue
if(E.is_broken()) if(E.is_broken() || E.is_dislocated())
if(E.body_part == HAND_LEFT) if(E.body_part == HAND_LEFT)
if(!l_hand)
continue
drop_from_inventory(l_hand) drop_from_inventory(l_hand)
else else
if(!r_hand)
continue
drop_from_inventory(r_hand) drop_from_inventory(r_hand)
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ") var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")

View File

@@ -389,7 +389,7 @@
// Lung damage increases the minimum safe pressure. // Lung damage increases the minimum safe pressure.
if(species.has_organ["lungs"]) if(species.has_organ["lungs"])
var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"] var/obj/item/organ/lungs/L = internal_organs_by_name["lungs"]
if(!L) if(isnull(L))
safe_pressure_min = INFINITY //No lungs, how are you breathing? safe_pressure_min = INFINITY //No lungs, how are you breathing?
else if(L.is_broken()) else if(L.is_broken())
safe_pressure_min *= 1.5 safe_pressure_min *= 1.5

View File

@@ -168,6 +168,10 @@
/datum/species/proc/get_random_name(var/gender) /datum/species/proc/get_random_name(var/gender)
var/datum/language/species_language = all_languages[language] var/datum/language/species_language = all_languages[language]
if(!species_language)
species_language = all_languages[default_language]
if(!species_language)
return "unknown"
return species_language.get_random_name(gender) return species_language.get_random_name(gender)
/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs. /datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.

View File

@@ -45,11 +45,8 @@
if(prob(1)) if(prob(1))
H.emote(pick("scratch","jump","roll","tail")) H.emote(pick("scratch","jump","roll","tail"))
/datum/species/monkey/handle_post_spawn(var/mob/living/carbon/human/H) /datum/species/monkey/get_random_name()
H.real_name = "[lowertext(name)] ([rand(100,999)])" return "[lowertext(name)] ([rand(100,999)])"
H.name = H.real_name
..()
/datum/species/monkey/tajaran /datum/species/monkey/tajaran
name = "Farwa" name = "Farwa"

View File

@@ -61,6 +61,9 @@
var/weeds_heal_rate = 1 // Health regen on weeds. var/weeds_heal_rate = 1 // Health regen on weeds.
var/weeds_plasma_rate = 5 // Plasma regen on weeds. var/weeds_plasma_rate = 5 // Plasma regen on weeds.
/datum/species/xenos/get_random_name()
return "alien [caste_name] ([alien_number])"
/datum/species/xenos/can_understand(var/mob/other) /datum/species/xenos/can_understand(var/mob/other)
if(istype(other,/mob/living/carbon/alien/larva)) if(istype(other,/mob/living/carbon/alien/larva))

View File

@@ -41,12 +41,12 @@
if (target.l_hand) if (target.l_hand)
// Disarm left hand // Disarm left hand
//Urist McAssistant dropped the macguffin with a scream just sounds odd. Plus it doesn't work with NO_PAIN //Urist McAssistant dropped the macguffin with a scream just sounds odd. Plus it doesn't work with NO_PAIN
target.visible_message("<span class='danger'>\The [target.l_hand] was knocked right out of [src]'s grasp!</span>") target.visible_message("<span class='danger'>\The [target.l_hand] was knocked right out of [target]'s grasp!</span>")
target.drop_l_hand() target.drop_l_hand()
if("r_arm", "r_hand") if("r_arm", "r_hand")
if (target.r_hand) if (target.r_hand)
// Disarm right hand // Disarm right hand
target.visible_message("<span class='danger'>\The [target.r_hand] was knocked right out of [src]'s grasp!</span>") target.visible_message("<span class='danger'>\The [target.r_hand] was knocked right out of [target]'s grasp!</span>")
target.drop_r_hand() target.drop_r_hand()
if("chest") if("chest")
if(!target.lying) if(!target.lying)

View File

@@ -237,24 +237,30 @@ var/global/list/damage_icon_parts = list()
//CACHING: Generate an index key from visible bodyparts. //CACHING: Generate an index key from visible bodyparts.
//0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
//Create a new, blank icon for our mob to use. //Create a new, blank icon for our mob to use.
if(stand_icon) if(stand_icon)
del(stand_icon) del(stand_icon)
stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank") stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank")
var/icon_key = "[species.race_key][g][s_tone][r_skin][g_skin][b_skin]"
var/obj/item/organ/eyes/eyes = internal_organs_by_name["eyes"]
var/icon_key = "[species.race_key][g][s_tone]" if(eyes)
for(var/obj/item/organ/external/part in organs) icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]"
if(part.is_stump() || (part.status & ORGAN_DESTROYED))
icon_key = "[icon_key]0"
else if(part.status & ORGAN_ROBOT)
icon_key = "[icon_key]2[part.model ? "-[part.model]": ""]"
else if(part.status & ORGAN_DEAD)
icon_key = "[icon_key]3"
else else
icon_key = "[icon_key]1" icon_key += "#000000"
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0][s_tone]" for(var/organ_tag in species.has_limbs)
var/obj/item/organ/external/part = organs_by_name[organ_tag]
if(isnull(part) || part.is_stump() || (part.status & ORGAN_DESTROYED))
icon_key += "0"
else if(part.status & ORGAN_ROBOT)
icon_key += "2[part.model ? "-[part.model]": ""]"
else if(part.status & ORGAN_DEAD)
icon_key += "3"
else
icon_key += "1"
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon var/icon/base_icon
if(human_icon_cache[icon_key]) if(human_icon_cache[icon_key])

View File

@@ -10,14 +10,13 @@
is_adult = 0 is_adult = 0
maxHealth = 150 maxHealth = 150
revive() revive()
regenerate_icons()
if (!client) rabid = 1 if (!client) rabid = 1
number = rand(1, 1000) number = rand(1, 1000)
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
return return
. = ..(gibbed, "seizes up and falls limp...") . = ..(gibbed, "seizes up and falls limp...")
mood = null
regenerate_icons() regenerate_icons()
return return

View File

@@ -71,6 +71,7 @@
mutation_chance = rand(25, 35) mutation_chance = rand(25, 35)
var/sanitizedcolour = replacetext(colour, " ", "") var/sanitizedcolour = replacetext(colour, " ", "")
coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]")
regenerate_icons()
..(location) ..(location)
/mob/living/carbon/slime/movement_delay() /mob/living/carbon/slime/movement_delay()

View File

@@ -1,141 +0,0 @@
//Monkey Overlays Indexes////////
#define M_MASK_LAYER 1
#define M_BACK_LAYER 2
#define M_HANDCUFF_LAYER 3
#define M_L_HAND_LAYER 4
#define M_R_HAND_LAYER 5
#define TARGETED_LAYER 6
#define M_FIRE_LAYER 6
#define M_TOTAL_LAYERS 7
/////////////////////////////////
/mob/living/carbon/monkey
var/list/overlays_lying[M_TOTAL_LAYERS]
var/list/overlays_standing[M_TOTAL_LAYERS]
/mob/living/carbon/monkey/regenerate_icons()
..()
update_inv_wear_mask(0)
update_inv_back(0)
update_inv_r_hand(0)
update_inv_l_hand(0)
update_inv_handcuffed(0)
update_fire(0)
update_icons()
//Hud Stuff
update_hud()
return
/mob/living/carbon/monkey/update_icons()
update_hud()
lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again
overlays.Cut()
for(var/image/I in overlays_standing)
overlays += I
if(lying)
var/matrix/M = matrix()
M.Turn(90)
M.Translate(1,-6)
src.transform = M
else
var/matrix/M = matrix()
src.transform = M
////////
/mob/living/carbon/monkey/update_inv_wear_mask(var/update_icons=1)
if( wear_mask && istype(wear_mask, /obj/item/clothing/mask) )
overlays_standing[M_MASK_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "[wear_mask.icon_state]")
wear_mask.screen_loc = ui_monkey_mask
else
overlays_standing[M_MASK_LAYER] = null
if(update_icons) update_icons()
/mob/living/carbon/monkey/update_inv_r_hand(var/update_icons=1)
if(r_hand)
var/t_icon = INV_R_HAND_DEF_ICON
if(r_hand.item_icons && (icon_r_hand in r_hand.item_icons))
t_icon = r_hand.item_icons[icon_r_hand]
var/t_state = r_hand.item_state
if(!t_state) t_state = r_hand.icon_state
overlays_standing[M_R_HAND_LAYER] = image("icon" = t_icon, "icon_state" = t_state)
r_hand.screen_loc = ui_rhand
if (handcuffed) drop_r_hand()
else
overlays_standing[M_R_HAND_LAYER] = null
if(update_icons) update_icons()
/mob/living/carbon/monkey/update_inv_l_hand(var/update_icons=1)
if(l_hand)
var/t_icon = INV_L_HAND_DEF_ICON
if(l_hand.item_icons && (icon_l_hand in l_hand.item_icons))
t_icon = l_hand.item_icons[icon_l_hand]
var/t_state = l_hand.item_state
if(!t_state) t_state = l_hand.icon_state
overlays_standing[M_L_HAND_LAYER] = image("icon" = t_icon, "icon_state" = t_state)
l_hand.screen_loc = ui_lhand
if (handcuffed) drop_l_hand()
else
overlays_standing[M_L_HAND_LAYER] = null
if(update_icons) update_icons()
/mob/living/carbon/monkey/update_inv_back(var/update_icons=1)
if(back)
overlays_standing[M_BACK_LAYER] = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]")
back.screen_loc = ui_monkey_back
else
overlays_standing[M_BACK_LAYER] = null
if(update_icons) update_icons()
/mob/living/carbon/monkey/update_inv_handcuffed(var/update_icons=1)
if(handcuffed)
drop_r_hand()
drop_l_hand()
stop_pulling()
overlays_standing[M_HANDCUFF_LAYER] = image("icon" = 'icons/mob/monkey.dmi', "icon_state" = "handcuff1")
else
overlays_standing[M_HANDCUFF_LAYER] = null
if(update_icons) update_icons()
/mob/living/carbon/monkey/update_hud()
if (client)
client.screen |= contents
//Call when target overlay should be added/removed
/mob/living/carbon/monkey/update_targeted(var/update_icons=1)
if (targeted_by && target_locked)
overlays_standing[TARGETED_LAYER] = target_locked
else if (!targeted_by && target_locked)
del(target_locked)
if (!targeted_by)
overlays_standing[TARGETED_LAYER] = null
if(update_icons) update_icons()
/mob/living/carbon/monkey/update_fire(var/update_icons=1)
if(on_fire)
overlays_standing[M_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -M_FIRE_LAYER)
else
overlays_standing[M_FIRE_LAYER] = null
if(update_icons) update_icons()
//Monkey Overlays Indexes////////
#undef M_MASK_LAYER
#undef M_BACK_LAYER
#undef M_HANDCUFF_LAYER
#undef M_L_HAND_LAYER
#undef M_R_HAND_LAYER
#undef TARGETED_LAYER
#undef M_FIRE_LAYER
#undef M_TOTAL_LAYERS

View File

@@ -0,0 +1,25 @@
/mob/living
var/datum/language/default_language
/mob/living/verb/set_default_language(language as null|anything in languages)
set name = "Set Default Language"
set category = "IC"
if(language)
src << "<span class='notice'>You will now speak [language] if you do not specify a language when speaking.</span>"
else
src << "<span class='notice'>You will now speak whatever your standard default language is if you do not specify one when speaking.</span>"
default_language = language
// Silicons can't neccessarily speak everything in their languages list
/mob/living/silicon/set_default_language(language as null|anything in speech_synthesizer_langs)
..()
/mob/living/verb/check_default_language()
set name = "Check Default Language"
set category = "IC"
if(default_language)
src << "<span class='notice'>You are currently speaking [default_language] by default.</span>"
else
src << "<span class='notice'>Your current default language is your species or mob type default.</span>"

View File

@@ -80,7 +80,7 @@ proc/get_radio_key_from_channel(var/channel)
if(dongle.translate_binary) return 1 if(dongle.translate_binary) return 1
/mob/living/proc/get_default_language() /mob/living/proc/get_default_language()
return null return default_language
/mob/living/proc/handle_speech_problems(var/message, var/verb) /mob/living/proc/handle_speech_problems(var/message, var/verb)
var/list/returns[3] var/list/returns[3]

View File

@@ -478,40 +478,38 @@ var/list/ai_verbs_default = list(
//Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm //Replaces /mob/living/silicon/ai/verb/change_network() in ai.dm & camera.dm
//Adds in /mob/living/silicon/ai/proc/ai_network_change() instead //Adds in /mob/living/silicon/ai/proc/ai_network_change() instead
//Addition by Mord_Sith to define AI's network change ability //Addition by Mord_Sith to define AI's network change ability
/mob/living/silicon/ai/proc/ai_network_change() /mob/living/silicon/ai/proc/get_camera_network_list()
set category = "AI Commands"
set name = "Jump To Network"
unset_machine()
var/cameralist[0]
if(check_unable()) if(check_unable())
return return
var/mob/living/silicon/ai/U = usr var/list/cameralist = new()
for (var/obj/machinery/camera/C in cameranet.cameras) for (var/obj/machinery/camera/C in cameranet.cameras)
if(!C.can_use()) if(!C.can_use())
continue continue
var/list/tempnetwork = difflist(C.network,restricted_camera_networks,1) var/list/tempnetwork = difflist(C.network,restricted_camera_networks,1)
if(tempnetwork.len)
for(var/i in tempnetwork) for(var/i in tempnetwork)
cameralist[i] = i cameralist[i] = i
var/old_network = network
network = input(U, "Which network would you like to view?") as null|anything in cameralist
if(!U.eyeobj) cameralist = sortAssoc(cameralist)
U.view_core() return cameralist
/mob/living/silicon/ai/proc/ai_network_change(var/network in get_camera_network_list())
set category = "AI Commands"
set name = "Jump To Network"
unset_machine()
if(!network)
return
if(!eyeobj)
view_core()
return return
if(isnull(network))
network = old_network // If nothing is selected
else
for(var/obj/machinery/camera/C in cameranet.cameras) for(var/obj/machinery/camera/C in cameranet.cameras)
if(!C.can_use()) if(!C.can_use())
continue continue
if(network in C.network) if(network in C.network)
U.eyeobj.setLoc(get_turf(C)) eyeobj.setLoc(get_turf(C))
break break
src << "\blue Switched to [network] camera network." src << "\blue Switched to [network] camera network."
//End of code by Mord_Sith //End of code by Mord_Sith

View File

@@ -210,9 +210,19 @@
var/dat = "<b><font size = 5>Known Languages</font></b><br/><br/>" var/dat = "<b><font size = 5>Known Languages</font></b><br/><br/>"
if(default_language)
dat += "Current default language: [default_language] - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a><br/><br/>"
for(var/datum/language/L in languages) for(var/datum/language/L in languages)
if(!(L.flags & NONGLOBAL)) if(!(L.flags & NONGLOBAL))
dat += "<b>[L.name] (:[L.key])</b><br/>Speech Synthesizer: <i>[(L in speech_synthesizer_langs)? "YES":"NOT SUPPORTED"]</i><br/>[L.desc]<br/><br/>" var/default_str
if(L == default_language)
default_str = " - default - <a href='byond://?src=\ref[src];default_lang=reset'>reset</a>"
else
default_str = " - <a href='byond://?src=\ref[src];default_lang=[L]'>set default</a>"
var/synth = (L in speech_synthesizer_langs)
dat += "<b>[L.name] (:[L.key])</b>[synth ? default_str : null]<br/>Speech Synthesizer: <i>[synth ? "YES" : "NOT SUPPORTED"]</i><br/>[L.desc]<br/><br/>"
src << browse(dat, "window=checklanguage") src << browse(dat, "window=checklanguage")
return return

View File

@@ -474,6 +474,7 @@
// Do the initial caching of the player's body icons. // Do the initial caching of the player's body icons.
new_character.force_update_limbs() new_character.force_update_limbs()
new_character.update_eyes()
new_character.regenerate_icons() new_character.regenerate_icons()
new_character.key = key //Manually transfer the key to log them in new_character.key = key //Manually transfer the key to log them in

View File

@@ -3,7 +3,7 @@ var/list/organ_cache = list()
/obj/item/organ /obj/item/organ
name = "organ" name = "organ"
icon = 'icons/obj/surgery.dmi' icon = 'icons/obj/surgery.dmi'
var/dead_icon
var/mob/living/carbon/human/owner = null var/mob/living/carbon/human/owner = null
var/status = 0 var/status = 0
var/vital //Lose a vital limb, die immediately. var/vital //Lose a vital limb, die immediately.
@@ -50,11 +50,12 @@ var/list/organ_cache = list()
holder.internal_organs |= src holder.internal_organs |= src
/obj/item/organ/proc/die() /obj/item/organ/proc/die()
name = "dead [initial(name)]" if(status & ORGAN_ROBOT)
health = 0 return
damage = max_damage
processing_objects -= src processing_objects -= src
//TODO: Grey out the icon state. if(dead_icon)
//TODO: Inject an organ with peridaxon to make it alive again. icon_state = dead_icon
/obj/item/organ/process() /obj/item/organ/process()
@@ -75,10 +76,10 @@ var/list/organ_cache = list()
if(B && prob(40)) if(B && prob(40))
reagents.remove_reagent("blood",0.1) reagents.remove_reagent("blood",0.1)
blood_splatter(src,B,1) blood_splatter(src,B,1)
damage += rand(1,3)
health -= rand(1,3) if(damage >= max_damage)
if(health <= 0)
die() die()
else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs else if(owner.bodytemperature >= 170) //cryo stops germs from moving and doing their bad stuffs
//** Handle antibiotics and curing infections //** Handle antibiotics and curing infections
handle_antibiotics() handle_antibiotics()
@@ -179,8 +180,9 @@ var/list/organ_cache = list()
else else
src.damage += amount src.damage += amount
if(owner && parent_organ)
var/obj/item/organ/external/parent = owner.get_organ(parent_organ) var/obj/item/organ/external/parent = owner.get_organ(parent_organ)
if (!silent) if(parent && !silent)
owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1) owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1)
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc /obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
@@ -241,7 +243,7 @@ var/list/organ_cache = list()
var/obj/item/organ/external/affected = owner.get_organ(parent_organ) var/obj/item/organ/external/affected = owner.get_organ(parent_organ)
if(affected) affected.internal_organs -= src if(affected) affected.internal_organs -= src
loc = owner.loc loc = get_turf(owner)
processing_objects |= src processing_objects |= src
rejecting = null rejecting = null
var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list var/datum/reagent/blood/organ_blood = locate(/datum/reagent/blood) in reagents.reagent_list
@@ -255,6 +257,8 @@ var/list/organ_cache = list()
msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)") msg_admin_attack("[user.name] ([user.ckey]) removed a vital organ ([src]) from [owner.name] ([owner.ckey]) (INTENT: [uppertext(user.a_intent)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)")
owner.death() owner.death()
owner = null
/obj/item/organ/proc/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected) /obj/item/organ/proc/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected)
if(!istype(target)) return if(!istype(target)) return
@@ -271,13 +275,13 @@ var/list/organ_cache = list()
transplant_data["blood_DNA"] = transplant_blood.data["blood_DNA"] transplant_data["blood_DNA"] = transplant_blood.data["blood_DNA"]
owner = target owner = target
loc = owner
processing_objects -= src processing_objects -= src
target.internal_organs |= src target.internal_organs |= src
affected.internal_organs |= src affected.internal_organs |= src
target.internal_organs_by_name[organ_tag] = src target.internal_organs_by_name[organ_tag] = src
status |= ORGAN_CUT_AWAY if(robotic)
status |= ORGAN_ROBOT
del(src)
/obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target) /obj/item/organ/eyes/replaced(var/mob/living/carbon/human/target)
@@ -286,7 +290,7 @@ var/list/organ_cache = list()
target.r_eyes = eye_colour[1] target.r_eyes = eye_colour[1]
target.g_eyes = eye_colour[2] target.g_eyes = eye_colour[2]
target.b_eyes = eye_colour[3] target.b_eyes = eye_colour[3]
target.update_body() target.update_eyes()
..() ..()
/obj/item/organ/proc/bitten(mob/user) /obj/item/organ/proc/bitten(mob/user)
@@ -298,7 +302,6 @@ var/list/organ_cache = list()
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list var/datum/reagent/blood/B = locate(/datum/reagent/blood) in reagents.reagent_list
blood_splatter(src,B,1) blood_splatter(src,B,1)
user.drop_from_inventory(src) user.drop_from_inventory(src)
var/obj/item/weapon/reagent_containers/food/snacks/organ/O = new(get_turf(src)) var/obj/item/weapon/reagent_containers/food/snacks/organ/O = new(get_turf(src))
O.name = name O.name = name

View File

@@ -96,9 +96,14 @@
dislocated = 0 dislocated = 0
if(children && children.len) if(children && children.len)
for(var/obj/item/organ/external/child in children) for(var/obj/item/organ/external/child in children)
if(child.dislocated == 1)
child.undislocate() child.undislocate()
if(owner) if(owner)
owner.shock_stage += 20 owner.shock_stage += 20
for(var/obj/item/organ/external/limb in owner.organs)
if(limb.dislocated == 2)
return
owner.verbs -= /mob/living/carbon/human/proc/undislocate
/obj/item/organ/external/update_health() /obj/item/organ/external/update_health()
damage = min(max_damage, (brute_dam + burn_dam)) damage = min(max_damage, (brute_dam + burn_dam))
@@ -110,6 +115,8 @@
if(owner) if(owner)
replaced(owner) replaced(owner)
sync_colour_to_human(owner) sync_colour_to_human(owner)
spawn(1)
get_icon()
/obj/item/organ/external/replaced(var/mob/living/carbon/human/target) /obj/item/organ/external/replaced(var/mob/living/carbon/human/target)
owner = target owner = target
@@ -243,10 +250,10 @@
status &= ~ORGAN_BROKEN status &= ~ORGAN_BROKEN
perma_injury = 0 perma_injury = 0
if((brute || burn) && children && children.len && (owner.species.flags & REGENERATES_LIMBS)) /*if((brute || burn) && children && children.len && (owner.species.flags & REGENERATES_LIMBS))
var/obj/item/organ/external/stump/S = locate() in children var/obj/item/organ/external/stump/S = locate() in children
if(S) if(S)
world << "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb." world << "Extra healing to go around ([brute+burn]) and [owner] needs a replacement limb."*/
//Sync the organ's damage with its wounds //Sync the organ's damage with its wounds
src.update_damages() src.update_damages()
@@ -634,8 +641,9 @@ Note that amputating the affected organ does in fact remove the infection from t
"<span class='moderate'><b>Your [src.name] explodes in a shower of gore!</b></span>",\ "<span class='moderate'><b>Your [src.name] explodes in a shower of gore!</b></span>",\
"<span class='danger'>You hear the sickening splatter of gore.</span>") "<span class='danger'>You hear the sickening splatter of gore.</span>")
src.removed(null, ignore_children) var/mob/living/carbon/human/victim = owner //Keep a reference for post-removed().
owner.traumatic_shock += 60 removed(null, ignore_children)
victim.traumatic_shock += 60
wounds.Cut() wounds.Cut()
if(parent) if(parent)
@@ -649,22 +657,22 @@ Note that amputating the affected organ does in fact remove the infection from t
parent.wounds |= W parent.wounds |= W
parent.update_damages() parent.update_damages()
else else
var/obj/item/organ/external/stump/stump = new (owner, 0, src) var/obj/item/organ/external/stump/stump = new (victim, 0, src)
stump.wounds |= W stump.wounds |= W
owner.organs |= stump victim.organs |= stump
stump.update_damages() stump.update_damages()
parent = null parent = null
spawn(1) spawn(1)
owner.update_body() victim.updatehealth()
owner.updatehealth() victim.UpdateDamageIcon()
owner.UpdateDamageIcon() victim.regenerate_icons()
dir = 2 dir = 2
switch(disintegrate) switch(disintegrate)
if(DROPLIMB_EDGE) if(DROPLIMB_EDGE)
compile_icon() compile_icon()
add_blood(owner) add_blood(victim)
var/matrix/M = matrix() var/matrix/M = matrix()
M.Turn(rand(180)) M.Turn(rand(180))
src.transform = M src.transform = M
@@ -675,13 +683,13 @@ Note that amputating the affected organ does in fact remove the infection from t
dir = 2 dir = 2
return return
if(DROPLIMB_BURN) if(DROPLIMB_BURN)
new /obj/effect/decal/cleanable/ash(get_turf(owner)) new /obj/effect/decal/cleanable/ash(get_turf(victim))
if(DROPLIMB_BLUNT) if(DROPLIMB_BLUNT)
var/obj/effect/decal/cleanable/blood/gibs/gore = new owner.species.single_gib_type(get_turf(owner)) var/obj/effect/decal/cleanable/blood/gibs/gore = new owner.species.single_gib_type(get_turf(victim))
if(owner.species.flesh_color) if(victim.species.flesh_color)
gore.fleshcolor = owner.species.flesh_color gore.fleshcolor = victim.species.flesh_color
if(owner.species.blood_color) if(victim.species.blood_color)
gore.basecolor = owner.species.blood_color gore.basecolor = victim.species.blood_color
gore.update_icon() gore.update_icon()
gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) gore.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
@@ -699,25 +707,21 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/proc/is_stump() /obj/item/organ/external/proc/is_stump()
return 0 return 0
/obj/item/organ/external/replaced() /obj/item/organ/external/proc/release_restraints(var/mob/living/carbon/human/holder)
get_icon() if(!holder)
icon = mob_icon holder = owner
return ..() if(!holder)
return
/obj/item/organ/external/proc/release_restraints() if (holder.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT))
if (owner.handcuffed && body_part in list(ARM_LEFT, ARM_RIGHT, HAND_LEFT, HAND_RIGHT)) holder.visible_message(\
owner.visible_message(\ "\The [holder.handcuffed.name] falls off of [holder.name].",\
"\The [owner.handcuffed.name] falls off of [owner.name].",\ "\The [holder.handcuffed.name] falls off you.")
"\The [owner.handcuffed.name] falls off you.") holder.drop_from_inventory(holder.handcuffed)
if (holder.legcuffed && body_part in list(FOOT_LEFT, FOOT_RIGHT, LEG_LEFT, LEG_RIGHT))
owner.drop_from_inventory(owner.handcuffed) holder.visible_message(\
"\The [holder.legcuffed.name] falls off of [holder.name].",\
if (owner.legcuffed && body_part in list(FOOT_LEFT, FOOT_RIGHT, LEG_LEFT, LEG_RIGHT)) "\The [holder.legcuffed.name] falls off you.")
owner.visible_message(\ holder.drop_from_inventory(holder.legcuffed)
"\The [owner.legcuffed.name] falls off of [owner.name].",\
"\The [owner.legcuffed.name] falls off you.")
owner.drop_from_inventory(owner.legcuffed)
/obj/item/organ/external/proc/bandage() /obj/item/organ/external/proc/bandage()
var/rval = 0 var/rval = 0
@@ -838,7 +842,7 @@ Note that amputating the affected organ does in fact remove the infection from t
return 0 return 0
/obj/item/organ/external/proc/is_usable() /obj/item/organ/external/proc/is_usable()
return !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD)) return !is_dislocated() && !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD))
/obj/item/organ/external/proc/is_malfunctioning() /obj/item/organ/external/proc/is_malfunctioning()
return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam)) return ((status & ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam))
@@ -859,11 +863,15 @@ Note that amputating the affected organ does in fact remove the infection from t
/obj/item/organ/external/removed(var/mob/living/user, var/ignore_children) /obj/item/organ/external/removed(var/mob/living/user, var/ignore_children)
if(!owner)
return
var/is_robotic = status & ORGAN_ROBOT var/is_robotic = status & ORGAN_ROBOT
var/mob/living/carbon/human/victim = owner
..() ..()
status |= ORGAN_DESTROYED status |= ORGAN_DESTROYED
owner.bad_external_organs -= src victim.bad_external_organs -= src
for(var/implant in implants) //todo: check if this can be left alone for(var/implant in implants) //todo: check if this can be left alone
del(implant) del(implant)
@@ -880,19 +888,19 @@ Note that amputating the affected organ does in fact remove the infection from t
organ.removed() organ.removed()
organ.loc = src organ.loc = src
release_restraints() release_restraints(victim)
owner.organs -= src victim.organs -= src
owner.organs_by_name[limb_name] = null // Remove from owner's vars. victim.organs_by_name[limb_name] = null // Remove from owner's vars.
//Robotic limbs explode if sabotaged. //Robotic limbs explode if sabotaged.
if(is_robotic && sabotaged) if(is_robotic && sabotaged)
owner.visible_message( victim.visible_message(
"<span class='danger'>\The [owner]'s [src.name] explodes violently!</span>",\ "<span class='danger'>\The [victim]'s [src.name] explodes violently!</span>",\
"<span class='danger'>Your [src.name] explodes!</span>",\ "<span class='danger'>Your [src.name] explodes!</span>",\
"<span class='danger'>You hear an explosion!</span>") "<span class='danger'>You hear an explosion!</span>")
explosion(get_turf(owner),-1,-1,2,3) explosion(get_turf(owner),-1,-1,2,3)
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, owner) spark_system.set_up(5, 0, victim)
spark_system.attach(owner) spark_system.attach(owner)
spark_system.start() spark_system.start()
spawn(10) spawn(10)

View File

@@ -5,13 +5,12 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/proc/compile_icon() /obj/item/organ/external/proc/compile_icon()
overlays.Cut() overlays.Cut()
get_icon()
// This is a kludge, only one icon has more than one generation of children though. // This is a kludge, only one icon has more than one generation of children though.
for(var/obj/item/organ/external/organ in contents) for(var/obj/item/organ/external/organ in contents)
if(organ.children && organ.children.len) if(organ.children && organ.children.len)
for(var/obj/item/organ/external/child in organ.children) for(var/obj/item/organ/external/child in organ.children)
overlays += child.get_icon() overlays += child.mob_icon
overlays += organ.get_icon() overlays += organ.mob_icon
/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human) /obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/human)
s_tone = null s_tone = null
@@ -23,6 +22,49 @@ var/global/list/limb_icon_cache = list()
if(human.species.flags & HAS_SKIN_COLOR) if(human.species.flags & HAS_SKIN_COLOR)
s_col = list(human.r_skin, human.g_skin, human.b_skin) s_col = list(human.r_skin, human.g_skin, human.b_skin)
/obj/item/organ/external/head/sync_colour_to_human(var/mob/living/carbon/human/human)
..()
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
if(eyes) eyes.update_colour()
/obj/item/organ/external/head/removed()
get_icon()
..()
/obj/item/organ/external/head/get_icon()
..()
if(owner.species.has_organ["eyes"])
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
if(owner.species.eyes)
var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', owner.species.eyes)
if(eyes)
eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
else
eyes_icon.Blend(rgb(128,0,0), ICON_ADD)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
if(owner.lip_style && (owner.species && (owner.species.flags & HAS_LIPS)))
mob_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s"), ICON_OVERLAY)
if(owner.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
if(facial_hair_style && facial_hair_style.species_allowed && (owner.species.name in facial_hair_style.species_allowed))
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(facial_hair_style.do_colouration)
facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD)
overlays |= facial_s
if(owner.h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
if(hair_style && (owner.species.name in hair_style.species_allowed))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration)
hair_s.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD)
overlays |= hair_s
return mob_icon
/obj/item/organ/external/proc/get_icon(var/skeletal) /obj/item/organ/external/proc/get_icon(var/skeletal)
var/gender var/gender
@@ -66,43 +108,6 @@ var/global/list/limb_icon_cache = list()
return mob_icon return mob_icon
/obj/item/organ/external/head/get_icon(var/skeletal)
if(skeletal || !owner)
return
..()
if(owner.species.has_organ["eyes"])
var/obj/item/organ/eyes/eyes = owner.internal_organs_by_name["eyes"]
if(eyes && owner.species.eyes)
var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', owner.species.eyes)
eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
if(owner.lip_style && (owner.species && (owner.species.flags & HAS_LIPS)))
mob_icon.Blend(new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s"), ICON_OVERLAY)
if(owner.f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
if(facial_hair_style)
var/icon/facial = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
if(facial_hair_style.do_colouration)
facial.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD)
mob_icon.Blend(facial, ICON_OVERLAY)
if(owner.h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
if(hair_style)
var/icon/hair = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
if(hair_style.do_colouration)
hair.Blend(rgb(owner.r_hair, owner.g_hair, owner.b_hair), ICON_ADD)
mob_icon.Blend(hair, ICON_OVERLAY)
icon = mob_icon
return mob_icon
// new damage icon system // new damage icon system
// adjusted to set damage_state to brute/burn code only (without r_name0 as before) // adjusted to set damage_state to brute/burn code only (without r_name0 as before)
/obj/item/organ/external/update_icon() /obj/item/organ/external/update_icon()

View File

@@ -11,6 +11,7 @@
icon_state = "heart-on" icon_state = "heart-on"
organ_tag = "heart" organ_tag = "heart"
parent_organ = "chest" parent_organ = "chest"
dead_icon = "heart-off"
/obj/item/organ/lungs /obj/item/organ/lungs
name = "lungs" name = "lungs"
@@ -69,6 +70,15 @@
parent_organ = "head" parent_organ = "head"
var/list/eye_colour = list(0,0,0) var/list/eye_colour = list(0,0,0)
/obj/item/organ/eyes/proc/update_colour()
if(!owner)
return
eye_colour = list(
owner.r_eyes ? owner.r_eyes : 0,
owner.g_eyes ? owner.g_eyes : 0,
owner.b_eyes ? owner.b_eyes : 0
)
/obj/item/organ/eyes/process() //Eye damage replaces the old eye_stat var. /obj/item/organ/eyes/process() //Eye damage replaces the old eye_stat var.
..() ..()
if(!owner) if(!owner)
@@ -78,36 +88,6 @@
if(is_broken()) if(is_broken())
owner.eye_blind = 20 owner.eye_blind = 20
/obj/item/organ/eyes/New()
..()
if(owner)
eye_colour = list(
owner.r_eyes ? owner.r_eyes : 0,
owner.g_eyes ? owner.g_eyes : 0,
owner.b_eyes ? owner.b_eyes : 0
)
/obj/item/organ/eyes/removed(var/mob/living/target,var/mob/living/user)
if(!eye_colour)
eye_colour = list(0,0,0)
..() //Make sure target is set so we can steal their eye colour for later.
var/mob/living/carbon/human/H = target
if(istype(H))
eye_colour = list(
H.r_eyes ? H.r_eyes : 0,
H.g_eyes ? H.g_eyes : 0,
H.b_eyes ? H.b_eyes : 0
)
// Leave bloody red pits behind!
H.r_eyes = 128
H.g_eyes = 0
H.b_eyes = 0
H.update_body()
/obj/item/organ/liver /obj/item/organ/liver
name = "liver" name = "liver"
icon_state = "liver" icon_state = "liver"
@@ -178,14 +158,13 @@
/obj/item/organ/appendix/removed() /obj/item/organ/appendix/removed()
..() if(owner)
var/inflamed = 0 var/inflamed = 0
for(var/datum/disease/appendicitis/appendicitis in owner.viruses) for(var/datum/disease/appendicitis/appendicitis in owner.viruses)
inflamed = 1 inflamed = 1
appendicitis.cure() appendicitis.cure()
owner.resistances += appendicitis owner.resistances += appendicitis
if(inflamed) if(inflamed)
icon_state = "appendixinflamed" icon_state = "appendixinflamed"
name = "inflamed appendix" name = "inflamed appendix"
..()

View File

@@ -323,4 +323,4 @@ datum/wound/cut/massive
return 0 //cannot be merged return 0 //cannot be merged
/datum/wound/lost_limb/small /datum/wound/lost_limb/small
stages = list("ripped stump" = 40, "bloody stump" = 30, "clotted stump" = 15, "scarred stump" = 0) stages = list("ripped hole" = 40, "bloody hole" = 30, "clotted hole" = 15, "scarred hole" = 0)

View File

@@ -194,7 +194,7 @@
update_icon() update_icon()
/obj/item/weapon/paper/proc/get_signature(var/obj/item/weapon/pen/P, mob/user as mob) /obj/item/weapon/paper/proc/get_signature(var/obj/item/weapon/pen/P, mob/user as mob)
if(P) if(P && istype(P, /obj/item/weapon/pen))
return P.get_signature(user) return P.get_signature(user)
return (user && user.real_name) ? user.real_name : "Anonymous" return (user && user.real_name) ? user.real_name : "Anonymous"
@@ -351,6 +351,11 @@
t = replacetext(t, "\n", "<BR>") t = replacetext(t, "\n", "<BR>")
t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html
if(fields > 50)//large amount of fields creates a heavy load on the server, see updateinfolinks() and addtofield()
usr << "<span class='warning'>Too many fields. Sorry, you can't do this.</span>"
return
if(id!="end") if(id!="end")
addtofield(text2num(id), t) // He wants to edit a field, let him. addtofield(text2num(id), t) // He wants to edit a field, let him.
else else

View File

@@ -8,7 +8,7 @@
load_method = MAGAZINE load_method = MAGAZINE
/obj/item/weapon/gun/projectile/colt/detective /obj/item/weapon/gun/projectile/colt/detective
desc = "A cheap Martian knock-off of a Colt M1911. Uses less-than-lethal .45 rounds." desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
magazine_type = /obj/item/ammo_magazine/c45m/rubber magazine_type = /obj/item/ammo_magazine/c45m/rubber
/obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun() /obj/item/weapon/gun/projectile/colt/detective/verb/rename_gun()
@@ -30,7 +30,7 @@
return 1 return 1
/obj/item/weapon/gun/projectile/sec /obj/item/weapon/gun/projectile/sec
desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses less-than-lethal .45 rounds." desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses .45 rounds."
name = "\improper NT Mk58" name = "\improper NT Mk58"
icon_state = "secguncomp" icon_state = "secguncomp"
magazine_type = /obj/item/ammo_magazine/c45m/rubber magazine_type = /obj/item/ammo_magazine/c45m/rubber
@@ -40,11 +40,10 @@
/obj/item/weapon/gun/projectile/sec/flash /obj/item/weapon/gun/projectile/sec/flash
name = "\improper NT Mk58 signal pistol" name = "\improper NT Mk58 signal pistol"
desc = "A NanoTrasen designed sidearm, found pretty much everywhere humans are. Uses .45 signal flash rounds."
magazine_type = /obj/item/ammo_magazine/c45m/flash magazine_type = /obj/item/ammo_magazine/c45m/flash
/obj/item/weapon/gun/projectile/sec/wood /obj/item/weapon/gun/projectile/sec/wood
desc = "A Nanotrasen designed sidearm, this one has a sweet wooden grip. Uses less-than-lethal .45 rounds." desc = "A Nanotrasen designed sidearm, this one has a sweet wooden grip. Uses .45 rounds."
name = "\improper Custom NT Mk58" name = "\improper Custom NT Mk58"
icon_state = "secgundark" icon_state = "secgundark"
@@ -118,7 +117,7 @@
/obj/item/weapon/gun/projectile/pistol/flash /obj/item/weapon/gun/projectile/pistol/flash
name = "\improper Stechtkin signal pistol" name = "\improper Stechtkin signal pistol"
desc = "A small, easily concealable gun. Uses 9mm signal flash rounds." desc = "A small, easily concealable gun. Uses 9mm rounds."
magazine_type = /obj/item/ammo_magazine/mc9mm/flash magazine_type = /obj/item/ammo_magazine/mc9mm/flash
/obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob) /obj/item/weapon/gun/projectile/pistol/attack_hand(mob/user as mob)

View File

@@ -149,6 +149,8 @@
//Called when the projectile intercepts a mob. Returns 1 if the projectile hit the mob, 0 if it missed and should keep flying. //Called when the projectile intercepts a mob. Returns 1 if the projectile hit the mob, 0 if it missed and should keep flying.
/obj/item/projectile/proc/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier=0) /obj/item/projectile/proc/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier=0)
if(!istype(target_mob))
return
//accuracy bonus from aiming //accuracy bonus from aiming
if (istype(shot_from, /obj/item/weapon/gun)) if (istype(shot_from, /obj/item/weapon/gun))
var/obj/item/weapon/gun/daddy = shot_from var/obj/item/weapon/gun/daddy = shot_from
@@ -227,7 +229,7 @@
if(isturf(A)) if(isturf(A))
for(var/obj/O in A) for(var/obj/O in A)
O.bullet_act(src) O.bullet_act(src)
for(var/mob/M in A) for(var/mob/living/M in A)
attack_mob(M, distance) attack_mob(M, distance)
//penetrating projectiles can pass through things that otherwise would not let them //penetrating projectiles can pass through things that otherwise would not let them

View File

@@ -57,7 +57,7 @@ Also, you never added distance checking after target is selected. I've went ahea
var/mob/caster = user//The wizard/whomever doing the body transferring. var/mob/caster = user//The wizard/whomever doing the body transferring.
//SPELL LOSS BEGIN //SPELL LOSS BEGIN
admin_attack_log(caster, victim, "Used mind transfer on", "Had mind transfer used on him by", "used mind transfer on") admin_attack_log(caster, victim, "Used mind transfer", "Was the victim of mind transfer", "used mind transfer on")
//NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost. //NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost.
var/obj/effect/proc_holder/spell/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly. var/obj/effect/proc_holder/spell/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly.

View File

@@ -1,5 +1,6 @@
//This is an uguu head restoration surgery TOTALLY not yoinked from chinsky's limb reattacher //This is an uguu head restoration surgery TOTALLY not yoinked from chinsky's limb reattacher
/datum/surgery_step/attach_head/ /datum/surgery_step/attach_head/
priority = 3 // Must be higher than /datum/surgery_step/internal
allowed_tools = list(/obj/item/organ/external/head = 100) allowed_tools = list(/obj/item/organ/external/head = 100)
can_infect = 0 can_infect = 0
@@ -7,20 +8,20 @@
max_duration = 100 max_duration = 100
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
if(..())
var/obj/item/organ/external/head = target.get_organ(target_zone) var/obj/item/organ/external/head = target.get_organ(target_zone)
return !head && target_zone == "head" return isnull(head) && target_zone == "head" && !isnull(target.species.has_limbs["head"])
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("[user] starts attaching [tool] to [target]'s reshaped neck.", \ user.visible_message("[user] starts attaching [tool] to [target]'s neck.", \
"You start attaching [tool] to [target]'s reshaped neck.") "You start attaching [tool] to [target]'s neck.")
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
user.visible_message("\blue [user] has attached [target]'s head to the body.", \ user.visible_message("\blue [user] has attached [target]'s head to the body.", \
"\blue You have attached [target]'s head to the body.") "\blue You have attached [target]'s head to the body.")
var/obj/item/organ/external/head = tool var/obj/item/organ/external/head = tool
head.loc = target user.drop_from_inventory(head)
head.replaced(target) head.replaced(target)
head.loc = target
head.status = 0 head.status = 0
target.update_body() target.update_body()
target.updatehealth() target.updatehealth()

View File

@@ -228,7 +228,7 @@
var/list/attached_organs = list() var/list/attached_organs = list()
for(var/organ in target.internal_organs_by_name) for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ] var/obj/item/organ/I = target.internal_organs_by_name[organ]
if(!I.status && I.parent_organ == target_zone) if(I && !I.status && I.parent_organ == target_zone)
attached_organs |= organ attached_organs |= organ
var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs var/organ_to_remove = input(user, "Which organ do you want to prepare for removal?") as null|anything in attached_organs
@@ -347,7 +347,7 @@
return 0 return 0
else if(target.species.has_organ[O.organ_tag]) else if(target.species.has_organ[O.organ_tag])
if(O.is_damaged()) if(O.damage > (O.max_damage * 0.75))
user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted." user << "\red \The [O.organ_tag] [o_is] in no state to be transplanted."
return 2 return 2
@@ -410,7 +410,7 @@
var/list/removable_organs = list() var/list/removable_organs = list()
for(var/organ in target.internal_organs_by_name) for(var/organ in target.internal_organs_by_name)
var/obj/item/organ/I = target.internal_organs_by_name[organ] var/obj/item/organ/I = target.internal_organs_by_name[organ]
if(I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone) if(I && I.status & ORGAN_CUT_AWAY && I.parent_organ == target_zone)
removable_organs |= organ removable_organs |= organ
var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs var/organ_to_replace = input(user, "Which organ do you want to reattach?") as null|anything in removable_organs

View File

@@ -41,7 +41,7 @@
for(var/part_name in L.part) for(var/part_name in L.part)
if(!isnull(target.get_organ(part_name))) if(!isnull(target.get_organ(part_name)))
continue continue
var/list/organ_data = target.species.has_limbs["[target_zone]"] var/list/organ_data = target.species.has_limbs["[part_name]"]
if(!organ_data) if(!organ_data)
continue continue
var/new_limb_type = organ_data["path"] var/new_limb_type = organ_data["path"]

View File

@@ -56,6 +56,15 @@ should be listed in the changelog upon commit though. Thanks. -->
<!-- DO NOT REMOVE, MOVE, OR COPY THIS COMMENT! THIS MUST BE THE LAST NON-EMPTY LINE BEFORE THE LOGS #ADDTOCHANGELOGMARKER# --> <!-- DO NOT REMOVE, MOVE, OR COPY THIS COMMENT! THIS MUST BE THE LAST NON-EMPTY LINE BEFORE THE LOGS #ADDTOCHANGELOGMARKER# -->
<div class='commit sansserif'>
<h2 class='date'>7 April 2015</h2>
<h3 class='author'>RavingManiac updated:</h3>
<ul class='changes bgimages16'>
<li class='tweak'>You can now pay vending machines and EFTPOS scanners without removing your ID from your PDA or wallet. Clicking on the vending machine with your ID/PDA/wallet/cash also brings up the menu now instead of attacking the vending machine.</li>
</ul>
</div>
<div class='commit sansserif'> <div class='commit sansserif'>
<h2 class='date'>24 February 2015</h2> <h2 class='date'>24 February 2015</h2>
<h3 class='author'>Zuhayr updated:</h3> <h3 class='author'>Zuhayr updated:</h3>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 63 KiB

File diff suppressed because it is too large Load Diff

View File

@@ -1074,6 +1074,7 @@
#include "code\modules\mob\language\station.dm" #include "code\modules\mob\language\station.dm"
#include "code\modules\mob\language\synthetic.dm" #include "code\modules\mob\language\synthetic.dm"
#include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\damage_procs.dm"
#include "code\modules\mob\living\default_language.dm"
#include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living.dm"
#include "code\modules\mob\living\living_defense.dm" #include "code\modules\mob\living\living_defense.dm"
#include "code\modules\mob\living\living_defines.dm" #include "code\modules\mob\living\living_defines.dm"