Merge branch 'master' into fluffles

This commit is contained in:
FlattestGuitar
2017-08-07 11:43:58 +02:00
412 changed files with 5325 additions and 14542 deletions
-2
View File
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
var/jobban_runonce // Updates legacy bans with new info
var/jobban_keylist[0] // Linear list of jobban strings, kept around for the legacy system
var/jobban_assoclist[0] // Associative list, for efficiency
@@ -101,7 +101,7 @@
to_chat(usr, "<span class='notice'>Admin rank changed.</span>")
/datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission)
if(config.admin_legacy_system)
if(config.admin_legacy_system)
return
if(!usr.client)
@@ -153,13 +153,15 @@
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')")
log_query.Execute()
to_chat(usr, "<span class='notice'>Permission added.</span>")
/datum/admins/proc/updateranktodb(ckey,newrank)
establish_db_connection()
if(!dbcon.IsConnected())
return
if(!check_rights(R_PERMISSIONS))
return
var/sql_ckey = sanitizeSQL(ckey)
var/sql_admin_rank = sanitizeSQL(newrank)
var/DBQuery/query_update = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastadminrank = '[sql_admin_rank]' WHERE ckey = '[sql_ckey]'")
query_update.Execute()
query_update.Execute()
+105 -42
View File
@@ -1741,6 +1741,9 @@
btypes += "Heal Over Time"
btypes += "Permanent Regeneration"
btypes += "Super Powers"
btypes += "Scarab Guardian"
btypes += "Human Protector"
btypes += "Pet"
var/blessing = input(owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes
if(!(blessing in btypes))
return
@@ -1766,6 +1769,7 @@
H.dna.SetSEState(REGENERATEBLOCK, 1)
genemutcheck(H, REGENERATEBLOCK, null, MUTCHK_FORCED)
H.update_mutations()
H.gene_stability = 100
logmsg = "permanent regeneration."
if("Super Powers")
var/list/default_genes = list(REGENERATEBLOCK, NOBREATHBLOCK, COLDBLOCK)
@@ -1773,7 +1777,44 @@
H.dna.SetSEState(gene, 1)
genemutcheck(H, gene, null, MUTCHK_FORCED)
H.update_mutations()
H.gene_stability = 100
logmsg = "superpowers."
if("Scarab Guardian")
var/obj/item/weapon/guardiancreator/biological/scarab = new /obj/item/weapon/guardiancreator/biological(H)
var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Random")
var/typechoice = input("Select Guardian Type", "Type") as null|anything in possible_guardians
if(isnull(typechoice))
return
if(typechoice != "Random")
possible_guardians -= "Random"
scarab.possible_guardians = list()
scarab.possible_guardians += typechoice
scarab.attack_self(H)
spawn(700)
qdel(scarab)
logmsg = "scarab guardian."
if("Pet")
var/pets = subtypesof(/mob/living/simple_animal/pet)
var/petchoice = input("Select pet type", "Pets") as null|anything in pets
if(isnull(petchoice))
return
var/mob/living/simple_animal/pet/P = new petchoice(H.loc)
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [P], pet of [H]?", poll_time = 100, min_hours = 10)
var/mob/dead/observer/theghost = null
if(candidates.len)
theghost = pick(candidates)
P.key = theghost.key
P.master_commander = H
spawn(30)
var/newname = sanitize(copytext(input(P, "You are [P], pet of [H]. Would you like to change your name to something else?", "Name change", P.name) as null|text,1,MAX_NAME_LEN))
if(newname && newname != P.name)
P.name = newname
if(P.mind)
P.mind.name = newname
logmsg = "pet ([P])."
if("Human Protector")
usr.client.create_eventmob_for(H, 0)
logmsg = "syndie protector."
if(logmsg)
log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a blessing: [logmsg]")
message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a blessing: [logmsg]")
@@ -1797,8 +1838,8 @@
ptypes += "Mutagen Cookie"
ptypes += "Hellwater Cookie"
ptypes += "Assassin"
ptypes += "Priest"
ptypes += "Lynch"
ptypes += "Hunter"
ptypes += "Crew Traitor"
var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
if(!(punishment in ptypes))
return
@@ -1856,47 +1897,12 @@
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a hellwater cookie."
if("Priest")
logmsg = "priest."
if("Hunter")
logmsg = "hunter."
H.mutations |= NOCLONE
message_admins("[key_name_admin(owner)] is sending a dark priest to assassinate [key_name_admin(M)]...")
var/list/candidates = pollCandidates("Do you want to play as a murderous dark priest?")
if(!candidates.len)
to_chat(usr, "ERROR: Could not create priest. No valid candidates.")
return
var/mob/C = pick(candidates)
var/key_of_priest = C.key
if(!key_of_priest)
to_chat(usr, "ERROR: Could not create priest. Could not pick key.")
return
var/datum/mind/priest_mind = new /datum/mind(key_of_priest)
priest_mind.active = 1
var/mob/living/carbon/human/priest_mob = new /mob/living/carbon/human(pick(latejoin))
priest_mind.transfer_to(priest_mob)
var/datum/outfit/admin/dark_priest/O = new /datum/outfit/admin/dark_priest
priest_mob.equipOutfit(O, FALSE)
var/obj/item/weapon/pinpointer/advpinpointer/N = new /obj/item/weapon/pinpointer/advpinpointer(priest_mob)
priest_mob.equip_to_slot_or_del(N, slot_r_store)
N.active = 1
N.mode = 2
N.target = H
N.point_at(N.target)
N.flags |= NODROP
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = priest_mind
kill_objective.target = H.mind
kill_objective.explanation_text = "Murder [H.real_name], the [H.mind.assigned_role], in the name of the dark gods."
priest_mind.objectives += kill_objective
ticker.mode.traitors |= priest_mob.mind
to_chat(priest_mob, "<span class='danger'>ATTENTION:</span> You are now a dark priest!")
to_chat(priest_mob, "<B>Goal: <span class='danger'>MURDER [H.real_name]</span>, currently in [get_area(H.loc)], in the name of the dark gods. </B>");
to_chat(priest_mob, "<B>The gods will prevent their revival.</B>");
priest_mob.mind.special_role = SPECIAL_ROLE_TRAITOR
var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
tatorhud.join_hud(priest_mob)
ticker.mode.set_antag_hud(priest_mob, "hudsyndicate")
if("Assassin")
logmsg = "assassin."
usr.client.create_eventmob_for(H, 1)
if("Crew Traitor")
logmsg = "crew traitor."
var/list/possible_traitors = list()
for(var/mob/living/player in living_mob_list)
if(player.client && player.mind && !player.mind.special_role && player.stat != DEAD && player != H)
@@ -3330,6 +3336,63 @@
// Refresh the page
src.view_flagged_books()
/client/proc/create_eventmob_for(var/mob/living/carbon/human/H, var/killthem = 0)
if(!check_rights(R_EVENT))
return
var/admin_outfits = subtypesof(/datum/outfit/admin)
var/hunter_outfits = list()
for(var/type in admin_outfits)
var/datum/outfit/admin/O = type
hunter_outfits[initial(O.name)] = type
var/dresscode = input("Select type", "Contracted Agents") as null|anything in hunter_outfits
if(isnull(dresscode))
return
var/datum/outfit/O = hunter_outfits[dresscode]
message_admins("[key_name_admin(mob)] is sending a ([dresscode]) to [killthem ? "assassinate" : "protect"] [key_name_admin(H)]...")
var/list/candidates = pollCandidates("Play as a [killthem ? "murderous" : "protective"] [dresscode]?", ROLE_TRAITOR, 1)
if(!candidates.len)
to_chat(usr, "ERROR: Could not create eventmob. No valid candidates.")
return
var/mob/C = pick(candidates)
var/key_of_hunter = C.key
if(!key_of_hunter)
to_chat(usr, "ERROR: Could not create eventmob. Could not pick key.")
return
var/datum/mind/hunter_mind = new /datum/mind(key_of_hunter)
hunter_mind.active = 1
var/mob/living/carbon/human/hunter_mob = new /mob/living/carbon/human(pick(latejoin))
hunter_mind.transfer_to(hunter_mob)
hunter_mob.equipOutfit(O, FALSE)
var/obj/item/weapon/pinpointer/advpinpointer/N = new /obj/item/weapon/pinpointer/advpinpointer(hunter_mob)
hunter_mob.equip_to_slot_or_del(N, slot_in_backpack)
N.active = 1
N.mode = 2
N.target = H
N.point_at(N.target)
if(!locate(/obj/item/weapon/implant/dust, hunter_mob))
var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(hunter_mob)
D.implant(hunter_mob)
if(killthem)
var/datum/objective/assassinate/kill_objective = new
kill_objective.owner = hunter_mind
kill_objective.target = H.mind
kill_objective.explanation_text = "Kill [H.real_name], the [H.mind.assigned_role]."
hunter_mind.objectives += kill_objective
else
var/datum/objective/protect/protect_objective = new
protect_objective.owner = hunter_mind
protect_objective.target = H.mind
protect_objective.explanation_text = "Protect [H.real_name], the [H.mind.assigned_role]."
hunter_mind.objectives += protect_objective
ticker.mode.traitors |= hunter_mob.mind
to_chat(hunter_mob, "<span class='danger'>ATTENTION:</span> You are now on a mission!")
to_chat(hunter_mob, "<B>Goal: <span class='danger'>[killthem ? "MURDER" : "PROTECT"] [H.real_name]</span>, currently in [get_area(H.loc)]. </B>");
if(killthem)
to_chat(hunter_mob, "<B>If you kill them, they cannot be revived.</B>");
hunter_mob.mind.special_role = SPECIAL_ROLE_TRAITOR
var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
tatorhud.join_hud(hunter_mob)
ticker.mode.set_antag_hud(hunter_mob, "hudsyndicate")
/proc/admin_jump_link(var/atom/target)
if(!target) return
+13 -4
View File
@@ -89,7 +89,8 @@
if("delete")
for(var/d in objs)
qdel(d)
if(!datum_is_forbidden(d))
qdel(d)
if("select")
var/text = ""
@@ -117,6 +118,9 @@
if("set" in query_tree)
var/list/set_list = query_tree["set"]
for(var/d in objs)
// Forbid explicitly modifying an admin datum's vars
if(datum_is_forbidden(d))
return
for(var/list/sets in set_list)
var/datum/temp = d
var/i = 0
@@ -124,11 +128,11 @@
if(++i == sets.len)
if(istype(temp, /turf) && (v == "x" || v == "y" || v == "z"))
continue
if(istype(temp.vars[v], /datum/admins))
continue
if(!datum_is_forbidden(temp.vars[v]))
return
temp.vars[v] = SDQL_expression(d, set_list[sets])
break
if(temp.vars.Find(v) && (istype(temp.vars[v], /datum) || istype(temp.vars[v], /client)) && !istype(temp.vars[v], /datum/admins))
if(temp.vars.Find(v) && (istype(temp.vars[v], /datum) || istype(temp.vars[v], /client)) && !datum_is_forbidden(temp.vars[v]))
temp = temp.vars[v]
else
break
@@ -436,6 +440,11 @@
for(var/arg in arguments)
new_args[++new_args.len] = SDQL_expression(source, arg)
for(var/p in forbidden_varedit_object_types)
if(istype(object, p))
to_chat(usr, "<span class='warning'>It is forbidden to run this object's procs.</span>")
return
if(object == world) // Global proc.
procname = "/proc/[procname]"
return call(procname)(arglist(new_args))
+1
View File
@@ -93,6 +93,7 @@ var/global/sent_honksquad = 0
new_honksquad.mind_initialize()
new_honksquad.mind.assigned_role = "MODE"
new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD
new_honksquad.add_language("Clownish")
ticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list.
new_honksquad.equip_honksquad(honk_leader_selected)
return new_honksquad
@@ -58,7 +58,7 @@ var/global/sent_syndicate_infiltration_team = 0
infiltrators += candidate
else
to_chat(src, "Polling candidates...")
infiltrators = pollCandidates("Do you want to play as a SYNDICATE INFILTRATOR?") // ROLE_TRAITOR, 7
infiltrators = pollCandidates("Do you want to play as a SYNDICATE INFILTRATOR?", ROLE_TRAITOR, 1)
if(!infiltrators.len)
to_chat(src, "Nobody volunteered.")
+10 -2
View File
@@ -13,6 +13,14 @@ var/list/forbidden_varedit_object_types = list(
feedback_add_details("admin_verb","EDITV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
*/
/proc/datum_is_forbidden(type)
for(var/p in forbidden_varedit_object_types)
if(istype(type, p))
to_chat(usr, "<span class='warning'>It is forbidden to tamper with this object.</span>")
return FALSE
return TRUE
/client/proc/cmd_modify_ticker_variables()
set category = "Debug"
set name = "Edit Ticker Variables"
@@ -131,7 +139,7 @@ var/list/forbidden_varedit_object_types = list(
L[var_value] = mod_list_add_ass() //haha
if("No")
L += var_value
/client/proc/mod_list(var/list/L)
if(!check_rights(R_VAREDIT)) return
@@ -497,4 +505,4 @@ var/list/forbidden_varedit_object_types = list(
to_chat(usr, "Variable type is <b>UNKNOWN</b>.")
class = null
return class
return class
+1 -1
View File
@@ -513,7 +513,7 @@ client/proc/one_click_antag()
new_vox.update_eyes()
for(var/obj/item/organ/external/limb in new_vox.bodyparts)
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
limb.status &= ~ORGAN_ROBOT
//Now apply cortical stack.
var/obj/item/weapon/implant/cortical/I = new(new_vox)
+2 -2
View File
@@ -6,7 +6,7 @@ var/list/sounds_cache = list()
if(!check_rights(R_SOUNDS))
return
var/sound/awful_sound = sound(null, repeat = 0, wait = 0, channel = 777)
var/sound/awful_sound = sound(null, repeat = 0, wait = 0, channel = CHANNEL_ADMIN)
log_admin("[key_name(src)] stopped admin sounds.")
message_admins("[key_name_admin(src)] stopped admin sounds.", 1)
@@ -18,7 +18,7 @@ var/list/sounds_cache = list()
set name = "Play Global Sound"
if(!check_rights(R_SOUNDS)) return
var/sound/uploaded_sound = sound(S, repeat = 0, wait = 1, channel = 777)
var/sound/uploaded_sound = sound(S, repeat = 0, wait = 1, channel = CHANNEL_ADMIN)
uploaded_sound.priority = 250
sounds_cache += S
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
/*
SwapMaps library by Lummox JR
developed for digitalBYOND
@@ -179,6 +179,10 @@
(the writing trails off, as if the writer was interrupted)<br>
"}
/obj/item/weapon/paper/terrorspiders9
name = "paper - 'Research Notes'"
info = "<b>The notes appear gibberish to you. Perhaps a destructive analyser in R&D could make sense of them.</b>"
origin_tech = "combat=4;materials=4;engineering=4;biotech=4"
/obj/item/weapon/gun/energy/laser/awaymission_aeg
name = "Wireless Energy Gun"
@@ -142,5 +142,17 @@
display_name = "simple necklace"
path = /obj/item/clothing/accessory/necklace
/datum/gear/accessory/corset
display_name = "corset, black"
path = /obj/item/clothing/accessory/corset
/datum/gear/accessory/corsetred
display_name = "corset, red"
path = /obj/item/clothing/accessory/corset/red
/datum/gear/accessory/corsetblue
display_name = "corset, blue"
path = /obj/item/clothing/accessory/corset/blue
@@ -147,4 +147,12 @@
/datum/gear/hat/surgicalcap_green
display_name = "surgical cap, green"
path = /obj/item/clothing/head/surgery/green
allowed_roles = list("Chief Medical Officer", "Medical Doctor")
allowed_roles = list("Chief Medical Officer", "Medical Doctor")
/datum/gear/hat/flowerpin
display_name = "hair flower"
path = /obj/item/clothing/head/hairflower
/datum/gear/hat/flowerpinpurp
display_name = "hair flower, purple"
path = /obj/item/clothing/head/hairflower/purple
@@ -8,6 +8,7 @@
display_name = "embroidered veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
path = /obj/item/clothing/glasses/tajblind
cost = 1
/datum/gear/racial/tajsec
display_name = "sleek veil"
@@ -37,4 +38,9 @@
display_name = "khaki veil"
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. It is light and comfy!"
path = /obj/item/clothing/glasses/tajblind/cargo
allowed_roles = list("Quartermaster","Cargo Technician", "Miner")
allowed_roles = list("Quartermaster","Cargo Technician", "Miner")
/datum/gear/racial/footwraps
display_name = "cloth footwraps"
path = /obj/item/clothing/shoes/footwraps
cost = 1
@@ -223,3 +223,4 @@
/datum/gear/uniform/pants/caopants
display_name = "pants, camo"
path = /obj/item/clothing/under/pants/camo
+13 -6
View File
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
var/list/preferences_datums = list()
var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles
@@ -1181,6 +1179,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
switch(href_list["preference"])
if("name")
real_name = random_name(gender,species)
if(isnewplayer(user))
var/mob/new_player/N = user
N.new_player_panel_proc()
if("age")
age = rand(AGE_MIN, AGE_MAX)
if("hair")
@@ -1268,6 +1269,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/new_name = reject_bad_name(raw_name, 1)
if(new_name)
real_name = new_name
if(isnewplayer(user))
var/mob/new_player/N = user
N.new_player_panel_proc()
else
to_chat(user, "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .</font>")
@@ -2032,10 +2036,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("lobby_music")
sound ^= SOUND_LOBBY
if(sound & SOUND_LOBBY)
user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1)
if((sound & SOUND_LOBBY) && user.client)
user.client.playtitlemusic()
else
user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)
user.stop_sound_channel(CHANNEL_LOBBYMUSIC)
if("ghost_ears")
toggles ^= CHAT_GHOSTEARS
@@ -2074,6 +2078,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
real_name = random_name(gender)
save_character(user)
close_load_dialog(user)
if(isnewplayer(user))
var/mob/new_player/N = user
N.new_player_panel_proc()
if("tab")
if(href_list["tab"])
@@ -2170,7 +2177,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
// Wheelchair necessary?
var/obj/item/organ/external/l_foot = character.get_organ("l_foot")
var/obj/item/organ/external/r_foot = character.get_organ("r_foot")
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
if(!l_foot && !r_foot)
var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc)
character.buckled = W
character.update_canmove()
@@ -95,12 +95,11 @@
prefs.save_preferences(src)
if(prefs.sound & SOUND_LOBBY)
to_chat(src, "You will now hear music in the game lobby.")
if(istype(mob, /mob/new_player))
playtitlemusic()
if(isnewplayer(usr))
usr.client.playtitlemusic()
else
to_chat(src, "You will no longer hear music in the game lobby.")
if(istype(mob, /mob/new_player))
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// stop the jamsz
usr.stop_sound_channel(CHANNEL_LOBBYMUSIC)
feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -113,9 +112,7 @@
if(prefs.sound & SOUND_MIDI)
to_chat(src, "You will now hear any sounds uploaded by admins.")
else
var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777)
break_sound.priority = 250
src << break_sound //breaks the client's sound output on channel 777
usr.stop_sound_channel(CHANNEL_ADMIN)
to_chat(src, "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled.")
feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -150,7 +147,7 @@
to_chat(src, "You will now hear ambient sounds.")
else
to_chat(src, "You will no longer hear ambient sounds.")
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
usr.stop_sound_channel(CHANNEL_AMBIENCE)
feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels.
@@ -163,7 +160,7 @@
to_chat(src, "You will now hear ambient white noise.")
else
to_chat(src, "You will no longer hear ambient white noise.")
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
usr.stop_sound_channel(CHANNEL_BUZZ)
feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -177,8 +174,7 @@
to_chat(src, "You will now hear heartbeat sounds.")
else
to_chat(src, "You will no longer hear heartbeat sounds.")
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
usr.stop_sound_channel(CHANNEL_HEARTBEAT)
feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
// This needs a toggle because you people are awful and spammed terrible music
@@ -244,3 +244,12 @@
desc = "For a Rustlin' tustlin' cowgirl."
icon_state = "cowboyboots_pink"
item_color = "cowboyboots_pink"
/obj/item/clothing/shoes/footwraps
name = "cloth footwraps"
desc = "A roll of treated canvas used for wrapping claws or paws."
icon_state = "clothwrap"
item_state = "clothwrap"
force = 0
silence_steps = TRUE
w_class = WEIGHT_CLASS_SMALL
@@ -56,20 +56,8 @@
interface_desc = "A diamond-tipped industrial drill."
suit_overlay_active = "mounted-drill"
suit_overlay_inactive = "mounted-drill"
device_type = /obj/item/weapon/pickaxe/diamonddrill
/obj/item/rig_module/device/anomaly_scanner
name = "hardsuit anomaly scanner"
desc = "You think it's called an Elder Sarsparilla or something."
icon_state = "eldersasparilla"
interface_name = "Alden-Saraspova counter"
interface_desc = "An exotic particle detector commonly used by xenoarchaeologists."
engage_string = "Begin Scan"
usable = 1
selectable = 0
device_type = /obj/item/device/ano_scanner
/obj/item/rig_module/device/orescanner
name = "ore scanner module"
desc = "A clunky old ore scanner."
@@ -156,7 +156,7 @@
helm_type = /obj/item/clothing/head/helmet/space/new_rig/ert
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/gps,/obj/item/device/radio/beacon)
req_access = list()
req_one_access = list()
@@ -167,9 +167,7 @@
initial_modules = list(
/obj/item/rig_module/ai_container,
/obj/item/rig_module/maneuvering_jets,
/obj/item/rig_module/device/anomaly_scanner
)
/obj/item/rig_module/maneuvering_jets)
/obj/item/weapon/rig/medical
@@ -550,11 +550,35 @@
icon_state = "cowboyshirt_reds"
item_state = "cowboyshirt_reds"
item_color = "cowboyshirt_reds"
species_fit = list("Vox")
species_fit = list("Vox", "Drask", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Drask" = 'icons/mob/species/drask/suit.dmi',
"Grey" = 'icons/mob/species/grey/suit.dmi'
)
/obj/item/clothing/accessory/corset
name = "black corset"
desc = "A black corset for those fancy nights out."
icon_state = "corset"
item_state = "corset"
item_color = "corset"
/obj/item/clothing/accessory/corset/red
name = "red corset"
desc = "A red corset those fancy nights out."
icon_state = "corset_red"
item_state = "corset_red"
item_color = "corset_red"
/obj/item/clothing/accessory/corset/blue
name = "blue corset"
desc = "A blue corset for those fancy nights out."
icon_state = "corset_blue"
item_state = "corset_blue"
item_color = "corset_blue"
/obj/item/clothing/accessory/petcollar
name = "pet collar"
desc = "The latest fashion accessory for your favorite pets!"
+1 -1
View File
@@ -829,4 +829,4 @@
icon_state = "medicalgown"
item_state = "medicalgown"
item_color = "medicalgown"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
body_parts_covered = UPPER_TORSO|LOWER_TORSO
+9
View File
@@ -49,8 +49,17 @@
description_holders["icon"] = "[bicon(A)]"
description_holders["desc"] = A.desc
// Byond seemingly calls stat, each tick.
// Calling things each tick can get expensive real quick.
// So we slow this down a little.
// See: http://www.byond.com/docs/ref/info.html#/client/proc/Stat
/client/Stat()
. = ..()
if(holder)
sleep(1)
else
sleep(5)
stoplag()
if(usr && statpanel("Examine"))
stat(null,"[description_holders["icon"]] <font size='5'>[description_holders["name"]]</font>") //The name, written in big letters.
stat(null,"[description_holders["desc"]]") //the default examine text.
+2 -1
View File
@@ -2,7 +2,8 @@
if(config.use_irc_bot && config.irc_bot_host.len)
for(var/IP in config.irc_bot_host)
spawn(0)
ext_python("ircbot_message.py", "[config.comms_password] [IP] [channel] [msg]")
// I have no means of trusting you, cmd
ext_python("ircbot_message.py", "[config.comms_password] [IP] [channel] [paranoid_sanitize(msg)]")
return
/proc/send2mainirc(var/msg)
+2 -2
View File
@@ -4,6 +4,6 @@
if(world.system_type == MS_WINDOWS)
script = replacetext(script, "/", "\\")
var/command = config.python_path + " " + script + " " + args
var/command = python_path + " " + script + " " + args
shell("[command]")
return
return
-2
View File
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
proc/Intoxicated(phrase)
phrase = html_decode(phrase)
var/leng=lentext(phrase)
+2 -1
View File
@@ -12,9 +12,10 @@
var/apply_method = "swallow"
var/transfer_efficiency = 1.0
var/instant_application = 0 //if we want to bypass the forcedfeed delay
var/taste = TRUE//whether you can taste eating from this
burn_state = FLAMMABLE
/obj/item/weapon/reagent_containers/food/New()
..()
pixel_x = rand(-5, 5) //Randomizes postion
pixel_y = rand(-5, 5)
pixel_y = rand(-5, 5)
+14 -1
View File
@@ -194,17 +194,22 @@
if(isanimal(M))
M.changeNext_move(CLICK_CD_MELEE)
if(iscorgi(M))
if(bitecount >= 4)
var/mob/living/simple_animal/pet/corgi/G = M
if(world.time < (G.last_eaten + 300))
to_chat(G, "<span class='notice'>You are too full to try eating [src] right now.</span>")
else if(bitecount >= 4)
M.visible_message("[M] [pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where [src] was")].","<span class='notice'>You swallow up the last part of [src].</span>")
playsound(loc,'sound/items/eatfood.ogg', rand(10,50), 1)
var/mob/living/simple_animal/pet/corgi/C = M
C.adjustBruteLoss(-5)
C.adjustFireLoss(-5)
qdel(src)
G.last_eaten = world.time
else
M.visible_message("[M] takes a bite of [src].","<span class='notice'>You take a bite of [src].</span>")
playsound(loc,'sound/items/eatfood.ogg', rand(10,50), 1)
bitecount++
G.last_eaten = world.time
else if(ismouse(M))
var/mob/living/simple_animal/mouse/N = M
to_chat(N, text("<span class='notice'>You nibble away at [src].</span>"))
@@ -2485,3 +2490,11 @@
icon_state = "tatortot"
list_reagents = list("nutriment" = 4)
filling_color = "FFD700"
/obj/item/weapon/reagent_containers/food/snacks/onionrings
name = "onion rings"
desc = "Onion slices coated in batter."
icon_state = "onionrings"
list_reagents = list("nutriment" = 3)
filling_color = "#C0C9A0"
gender = PLURAL
@@ -541,6 +541,10 @@ datum/recipe/microwave/slimesandwich
being_cooked.reagents.del_reagent("toxin")
return being_cooked
/datum/recipe/microwave/onionrings
items = list(/obj/item/weapon/reagent_containers/food/snacks/onion_slice)
result = /obj/item/weapon/reagent_containers/food/snacks/onionrings
////////////////////////////FOOD ADDITTIONS///////////////////////////////
/datum/recipe/microwave/wrap
+72 -19
View File
@@ -15,11 +15,12 @@
var/datum/plant_gene/target
var/operation = ""
var/rating = 0
var/max_extract_pot = 50
// The cap on potency gene extraction.
// This number is for T1, each upgraded part adds 5% for a tech level above T1.
// At T4, it reaches 95%.
var/max_potency = 50 // See RefreshParts() for how these work
var/max_yield = 2
var/min_production = 12
var/max_endurance = 10 // IMPT: ALSO AFFECTS LIFESPAN
var/min_wchance = 67
var/min_wrate = 10
/obj/machinery/plantgenes/New()
..()
@@ -40,13 +41,27 @@
QDEL_NULL(disk)
return ..()
/obj/machinery/plantgenes/RefreshParts()
rating = 0
for(var/I in component_parts)
if(istype(I, /obj/item/weapon/stock_parts))
var/obj/item/weapon/stock_parts/S = I
rating += S.rating-1
max_extract_pot = initial(max_extract_pot) + rating*5
/obj/machinery/plantgenes/RefreshParts() // Comments represent the max you can set per tier, respectively. seeds.dm [219] clamps these for us but we don't want to mislead the viewer.
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
if(M.rating > 3)
max_potency = 95
else
max_potency = initial(max_potency) + (M.rating**3) // 51,58,77,95 Clamps at 100
max_yield = initial(max_yield) + (M.rating*2) // 4,6,8,10 Clamps at 10
for(var/obj/item/weapon/stock_parts/scanning_module/SM in component_parts)
if(SM.rating > 3) //If you create t5 parts I'm a step ahead mwahahaha!
min_production = 1
else
min_production = 12 - (SM.rating * 3) //9,6,3,1. Requires if to avoid going below clamp [1]
max_endurance = initial(max_endurance) + (SM.rating * 25) // 35,60,85,100 Clamps at 10min 100max
for(var/obj/item/weapon/stock_parts/micro_laser/ML in component_parts)
var/wratemod = ML.rating * 2.5
min_wrate = Floor(10-wratemod) // 7,5,2,0 Clamps at 0 and 10 You want this low
min_wchance = 67-(ML.rating*16) // 48,35,19,3 Clamps at 0 and 67 You want this low
/obj/machinery/plantgenes/update_icon()
..()
@@ -133,11 +148,36 @@
if("extract")
dat += "<span class='highlight'>[target.get_name()]</span> gene from \the <span class='highlight'>[seed]</span>?<br>"
dat += "<span class='bad'>The sample will be destroyed in process!</span>"
if(istype(target, /datum/plant_gene/core/potency))
if(istype(target, /datum/plant_gene/core))
var/datum/plant_gene/core/gene = target
if(gene.value > max_extract_pot)
dat += "<br><br>This device's extraction capabilities are currently limited to [max_extract_pot] potency. "
dat += "Target gene will be degraded to [max_extract_pot] potency on extraction."
if(istype(target, /datum/plant_gene/core/potency))
if(gene.value > max_potency)
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[max_potency]</span> potency. "
dat += "Target gene will be degraded to <span class='highlight'>[max_potency]</span> potency on extraction."
else if(istype(target, /datum/plant_gene/core/lifespan))
if(gene.value > max_endurance)
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[max_endurance]</span> lifespan. "
dat += "Target gene will be degraded to <span class='highlight'>[max_endurance]</span> Lifespan on extraction."
else if(istype(target, /datum/plant_gene/core/endurance))
if(gene.value > max_endurance)
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[max_endurance]</span> endurance. "
dat += "Target gene will be degraded to <span class='highlight'>[max_endurance]</span> endurance on extraction."
else if(istype(target, /datum/plant_gene/core/yield))
if(gene.value > max_yield)
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[max_yield]</span> yield. "
dat += "Target gene will be degraded to <span class='highlight'>[max_yield]</span> yield on extraction."
else if(istype(target, /datum/plant_gene/core/production))
if(gene.value < min_production)
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[min_production]</span> production. "
dat += "Target gene will be degraded to <span class='highlight'>[min_production]</span> production on extraction."
else if(istype(target, /datum/plant_gene/core/weed_rate))
if(gene.value < min_wrate)
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[min_wrate]</span> weed rate. "
dat += "Target gene will be degraded to <span class='highlight'>[min_wrate]</span> weed rate on extraction."
else if(istype(target, /datum/plant_gene/core/weed_chance))
if(gene.value < min_wchance)
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[min_wchance]</span> weed chance. "
dat += "Target gene will be degraded to <span class='highlight'>[min_wchance]</span> weed chance on extraction."
if("replace")
dat += "<span class='highlight'>[target.get_name()]</span> gene with <span class='highlight'>[disk.gene.get_name()]</span>?<br>"
if("insert")
@@ -292,9 +332,22 @@
if("extract")
if(disk && !disk.read_only)
disk.gene = G.Copy()
if(istype(disk.gene, /datum/plant_gene/core/potency))
if(istype(disk.gene, /datum/plant_gene/core))
var/datum/plant_gene/core/gene = disk.gene
gene.value = min(gene.value, max_extract_pot)
if(istype(disk.gene, /datum/plant_gene/core/potency))
gene.value = min(gene.value, max_potency)
else if(istype(disk.gene, /datum/plant_gene/core/lifespan))
gene.value = min(gene.value, max_endurance) //INTENDED
else if(istype(disk.gene, /datum/plant_gene/core/endurance))
gene.value = min(gene.value, max_endurance)
else if(istype(disk.gene, /datum/plant_gene/core/production))
gene.value = max(gene.value, min_production)
else if(istype(disk.gene, /datum/plant_gene/core/yield))
gene.value = min(gene.value, max_yield)
else if(istype(disk.gene, /datum/plant_gene/core/weed_rate))
gene.value = max(gene.value, min_wrate)
else if(istype(disk.gene, /datum/plant_gene/core/weed_chance))
gene.value = max(gene.value, min_wchance)
disk.update_name()
QDEL_NULL(seed)
update_icon()
@@ -397,7 +450,7 @@
/obj/item/weapon/disk/plantgene/proc/update_name()
if(gene)
name = "plant data disk - '[gene.get_name()]'"
name = "[gene.get_name()] (Plant Data Disk)"
else
name = "plant data disk"
+6
View File
@@ -112,6 +112,7 @@
for(var/datum/plant_gene/trait/trait in seed.genes)
trait.on_squash(src, target)
reagents.reaction(T)
for(var/A in T)
if(reagents)
reagents.reaction(A)
@@ -131,6 +132,11 @@
T.on_cross(src, AM)
..()
/obj/item/weapon/reagent_containers/food/snacks/grown/on_trip(mob/living/carbon/human/H)
. = ..()
if(. && seed)
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_slip(src, H)
// Glow gene procs
/obj/item/weapon/reagent_containers/food/snacks/grown/generate_trash(atom/location)
+8 -5
View File
@@ -113,9 +113,12 @@
/obj/item/weapon/grown/bananapeel/specialpeel //used by /obj/item/clothing/shoes/clown_shoes/banana_shoes
name = "synthesized banana peel"
desc = "A synthetic banana peel."
trip_stun = 2
trip_weaken = 2
trip_chance = 100
trip_walksafe = FALSE
trip_verb = TV_SLIP
/obj/item/weapon/grown/bananapeel/specialpeel/Crossed(AM)
if(iscarbon(AM))
var/mob/living/carbon/carbon = AM
if(carbon.slip("[src]", 2, 2))
qdel(src)
/obj/item/weapon/grown/bananapeel/specialpeel/on_trip(mob/living/carbon/human/H)
if(..())
qdel(src)
+22 -10
View File
@@ -1,18 +1,30 @@
// Weeds
/obj/item/seeds/weeds
name = "pack of weed seeds"
desc = "Yo mang, want some weeds?"
icon_state = "seed"
species = "weeds"
// Starthistle
/obj/item/seeds/starthistle
name = "pack of starthistle seeds"
desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots"
icon_state = "seed-starthistle"
species = "starthistle"
plantname = "Starthistle"
lifespan = 100
lifespan = 70
endurance = 50 // damm pesky weeds
maturation = 5
production = 1
yield = -1
potency = -1
growthstages = 4
yield = 2
potency = 10
growthstages = 3
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
genes = list(/datum/plant_gene/trait/plant_type/weed_hardy)
mutatelist = list(/obj/item/seeds/harebell)
/obj/item/seeds/starthistle/harvest(mob/user)
var/obj/machinery/hydroponics/parent = loc
if(prob(getYield() * 20))
var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc
for(var/i in 1 to yield+1)
var/obj/item/seeds/starthistle/harvestseeds = Copy()
harvestseeds.forceMove(output_loc)
parent.update_tray()
// Cabbage
+61
View File
@@ -0,0 +1,61 @@
/obj/item/seeds/onion
name = "pack of onion seeds"
desc = "These seeds grow into onions."
icon_state = "seed-onion"
species = "onion"
plantname = "Onion Sprouts"
product = /obj/item/weapon/reagent_containers/food/snacks/grown/onion
lifespan = 20
maturation = 3
production = 4
yield = 6
endurance = 25
growthstages = 3
weed_chance = 3
growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1)
mutatelist = list(/obj/item/seeds/onion/red)
/obj/item/weapon/reagent_containers/food/snacks/grown/onion
seed = /obj/item/seeds/onion
name = "onion"
desc = "Nothing to cry over."
icon_state = "onion"
filling_color = "#C0C9A0"
bitesize_mod = 2
slice_path = /obj/item/weapon/reagent_containers/food/snacks/onion_slice
slices_num = 2
/obj/item/seeds/onion/red
name = "pack of red onion seeds"
desc = "For growing exceptionally potent onions."
icon_state = "seed-onionred"
species = "onion_red"
plantname = "Red Onion Sprouts"
weed_chance = 1
product = /obj/item/weapon/reagent_containers/food/snacks/grown/onion/red
reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1, "onionjuice" = 0.05)
/obj/item/weapon/reagent_containers/food/snacks/grown/onion/red
seed = /obj/item/seeds/onion/red
name = "red onion"
desc = "Purple despite the name."
icon_state = "onion_red"
filling_color = "#C29ACF"
slice_path = /obj/item/weapon/reagent_containers/food/snacks/onion_slice/red
/obj/item/weapon/reagent_containers/food/snacks/onion_slice
name = "onion slices"
desc = "Rings, not for wearing."
icon_state = "onionslice"
list_reagents = list("plantmatter" = 5, "vitamin" = 2)
filling_color = "#C0C9A0"
gender = PLURAL
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/onionrings
/obj/item/weapon/reagent_containers/food/snacks/onion_slice/red
name = "red onion slices"
desc = "They shine like exceptionally low quality amethyst."
icon_state = "onionslice_red"
filling_color = "#C29ACF"
list_reagents = list("plantmatter" = 5, "vitamin" = 2, "onionjuice" = 2.5)
+5 -2
View File
@@ -50,6 +50,9 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat)
/obj/item/weapon/grown/log/New()
..()
accepted = typecacheof(accepted)
/obj/item/weapon/grown/log/attackby(obj/item/weapon/W, mob/user, params)
if(is_sharp(W))
@@ -66,7 +69,7 @@
to_chat(user, "<span class='notice'>You add the newly-formed [plank_name] to the stack. It now contains [plank.amount] [plank_name].</span>")
qdel(src)
if(is_type_in_list(W,accepted))
if(is_type_in_typecache(W, accepted))
var/obj/item/weapon/reagent_containers/food/snacks/grown/leaf = W
if(leaf.dry)
user.show_message("<span class='notice'>You wrap \the [W] around the log, turning it into a torch!</span>")
@@ -138,7 +141,7 @@
/obj/structure/bonfire/proc/CheckOxygen()
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
if(G.oxygen > 16)
if(G.oxygen > 13)
return 1
return 0
+7 -1
View File
@@ -57,8 +57,14 @@
T.on_cross(src, AM)
..()
/obj/item/weapon/grown/on_trip(mob/living/carbon/human/H)
. = ..()
if(. && seed)
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_slip(src, H)
/obj/item/weapon/grown/throw_impact(atom/hit_atom)
if(!..()) //was it caught by a mob?
if(seed)
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_throw_impact(src, hit_atom)
T.on_throw_impact(src, hit_atom)
+20 -28
View File
@@ -30,6 +30,8 @@
var/lid_state = 0
var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant
var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses
var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood.
var/self_sufficiency_progress = 0
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
hud_possible = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD)
@@ -358,6 +360,9 @@
if(!self_sustaining)
to_chat(user, "<span class='info'>Water: [waterlevel]/[maxwater]</span>")
to_chat(user, "<span class='info'>Nutrient: [nutrilevel]/[maxnutri]</span>")
if(self_sufficiency_progress > 0)
var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req)
to_chat(user, "<span class='info'>Treatment for self-sustenance are [percent_progress]% complete.</span>")
else
to_chat(user, "<span class='info'>It doesn't require any water or nutrients.</span>")
@@ -392,7 +397,7 @@
if(4 to 5)
myseed = new /obj/item/seeds/plump(src)
else
myseed = new /obj/item/seeds/weeds(src)
myseed = new /obj/item/seeds/starthistle(src)
age = 0
plant_health = myseed.endurance
lastcycle = world.time
@@ -546,6 +551,14 @@
adjustNutri(round(S.get_reagent_amount("fishwater") * 0.75))
adjustWater(round(S.get_reagent_amount("fishwater") * 1))
// Ambrosia Gaia produces earthsblood.
if(S.has_reagent("earthsblood"))
self_sufficiency_progress += S.get_reagent_amount("earthsblood")
if(self_sufficiency_progress >= self_sufficiency_req)
become_self_sufficient()
else if(!self_sustaining)
to_chat(user, "<span class='notice'>[src] warms as it might on a spring day under a genuine Sun.</span>")
// Antitoxin binds shit pretty well. So the tox goes significantly down
if(S.has_reagent("charcoal", 1))
adjustToxic(-round(S.get_reagent_amount("charcoal") * 2))
@@ -720,33 +733,7 @@
/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params)
//Called when mob user "attacks" it with object O
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia)) //Checked early on so it doesn't have to deal with composting checks
if(self_sustaining)
to_chat(user, "<span class='warning'>This [name] is already self-sustaining!</span>")
return
if(myseed || weedlevel)
to_chat(user, "<span class='warning'>[src] needs to be clear of plants and weeds!</span>")
return
if(alert(user, "This will make [src] self-sustaining but consume [O] forever. Are you sure?", "[name]", "I'm Sure", "Abort") == "Abort" || !user)
return
if(!O || qdeleted(O))
return
if(!Adjacent(user))
return
if(self_sustaining)
to_chat(user, "<span class='warning'>This [name] is already self-sustaining!</span>")
return
if(myseed || weedlevel)
to_chat(user, "<span class='warning'>[src] needs to be clear of plants and weeds!</span>")
return
user.visible_message("<span class='notice'>[user] gently pulls open the soil for [O] and places it inside.</span>", "<span class='notice'>You tenderly root [O] into [src].</span>")
user.drop_item()
qdel(O)
visible_message("<span class='boldnotice'>[src] begins to glow with a beautiful light!</span>")
self_sustaining = TRUE
update_icon()
else if(istype(O, /obj/item/weapon/reagent_containers) ) // Syringe stuff (and other reagent containers now too)
if(istype(O, /obj/item/weapon/reagent_containers)) // Syringe stuff (and other reagent containers now too)
var/obj/item/weapon/reagent_containers/reagent_source = O
if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe))
@@ -988,6 +975,11 @@
var/mob/living/simple_animal/hostile/C = new chosen
C.faction = list("plants")
/obj/machinery/hydroponics/proc/become_self_sufficient() // Ambrosia Gaia effect
visible_message("<span class='boldnotice'>[src] begins to glow with a beautiful light!</span>")
self_sustaining = TRUE
update_icon()
///Diona Nymph Related Procs///
/obj/machinery/hydroponics/CanPass(atom/movable/mover, turf/target, height=0) //So nymphs can climb over top of trays.
if(height==0)
+15 -15
View File
@@ -204,24 +204,23 @@
rate = 0.1
examine_line = "<span class='info'>It has a very slippery skin.</span>"
/datum/plant_gene/trait/slip/on_cross(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
if(iscarbon(target))
var/obj/item/seeds/seed = G.seed
var/mob/living/carbon/M = target
/datum/plant_gene/trait/slip/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
. = ..()
if(istype(G) && ispath(G.trash, /obj/item/weapon/grown))
return
var/stun_len = seed.potency * rate * 0.8
if(istype(G) && ispath(G.trash, /obj/item/weapon/grown))
return
var/stun_len = G.seed.potency * rate * 0.8
if(!istype(G, /obj/item/weapon/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube")))
stun_len /= 3
if(!istype(G, /obj/item/weapon/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube")))
stun_len /= 3
var/stun = min(stun_len, 7)
var/weaken = min(stun_len, 7)
stun_len = min(stun_len, 7) // No fun allowed
if(M.slip("[G]", stun, weaken))
for(var/datum/plant_gene/trait/T in seed.genes)
T.on_slip(G, M)
G.trip_stun = stun_len
G.trip_weaken = stun_len
G.trip_chance = 100
G.trip_verb = TV_SLIP
G.trip_walksafe = FALSE
/datum/plant_gene/trait/cell_charge
// Cell recharging trait. Charges all mob's power cells to (potency*rate)% mark when eaten.
@@ -268,7 +267,7 @@
rate = 0.03
examine_line = "<span class='info'>It emits a soft glow.</span>"
trait_id = "glow"
var/glow_color = "#AAD84B"
var/glow_color = "#C3E381"
/datum/plant_gene/trait/glow/proc/glow_range(obj/item/seeds/S)
return 1.4 + S.potency*rate
@@ -285,6 +284,7 @@
//adds -potency*(rate*0.05) light power to products
name = "Shadow Emission"
rate = 0.04
glow_color = "#AAD84B"
/datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/S)
return -max(S.potency*(rate*0.05), 0.075)
+1 -8
View File
@@ -251,11 +251,4 @@
score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining asteroid (No Clown Planet)
/obj/item/weapon/ore/ex_act()
return
/obj/item/weapon/ore/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W,/obj/item/device/core_sampler))
var/obj/item/device/core_sampler/C = W
C.sample_item(src, user)
else
return ..()
return
+1 -1
View File
@@ -657,7 +657,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return FALSE
/mob/dead/observer/incapacitated()
/mob/dead/observer/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
return TRUE
//this is a mob verb instead of atom for performance reasons
+4
View File
@@ -91,6 +91,10 @@
desc = "It's a small maintenance robot."
icon_state = "drone"
/obj/item/weapon/holder/drone/emagged
name = "maintenance drone"
icon_state = "drone-emagged"
/obj/item/weapon/holder/pai
name = "pAI"
desc = "It's a little robot."
@@ -153,14 +153,10 @@
return has_fine_manipulation
/mob/living/carbon/alien/Stat()
..()
statpanel("Status")
stat(null, "Intent: [a_intent]")
stat(null, "Move Mode: [m_intent]")
..()
show_stat_emergency_shuttle_eta()
/mob/living/carbon/alien/SetStunned(amount, updating = 1, force = 0)
@@ -1,11 +1,8 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
/mob/living/carbon/alien/humanoid
oxygen_alert = 0
toxins_alert = 0
fire_alert = 0
pass_flags = PASSTABLE
var/temperature_alert = 0
/mob/living/carbon/alien/humanoid/Life()
@@ -1,8 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
/mob/living/carbon/alien/larva
var/temperature_alert = 0
/mob/living/carbon/alien/larva/Life()
if(..()) //still breathing
// GROW!
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
//TODO: Make these simple_animals
var/const/MIN_IMPREGNATION_TIME = 100 //time it takes to impregnate someone
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
/obj/item/device/mmi
name = "Man-Machine Interface"
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity."
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
/mob/living/carbon/brain
var/obj/item/container = null
var/timeofhostdeath = 0
@@ -25,12 +25,14 @@
to_chat(user, "<span class='notice'>You carefully locate the manual activation switch and start the positronic brain's boot process.</span>")
icon_state = "posibrain-searching"
ghost_volunteers.Cut()
src.searching = 1
src.request_player()
searching = 1
request_player()
spawn(600)
if(ghost_volunteers.len)
var/mob/dead/observer/O = pick(ghost_volunteers)
if(check_observer(O))
var/mob/dead/observer/O
while(!istype(O) && ghost_volunteers.len)
O = pick_n_take(ghost_volunteers)
if(istype(O) && check_observer(O))
transfer_personality(O)
reset_search()
else
+33 -21
View File
@@ -19,6 +19,10 @@
/mob/living/carbon/Destroy()
QDEL_LIST(internal_organs)
QDEL_LIST(stomach_contents)
var/mob/living/simple_animal/borer/B = has_brain_worms()
if(B)
B.leave_host()
qdel(B)
remove_from_all_data_huds()
return ..()
@@ -216,15 +220,18 @@
"<span class='notice'>You check yourself for injuries.</span>" \
)
for(var/obj/item/organ/external/org in H.bodyparts)
var/list/missing = list("head", "chest", "groin", "l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot")
for(var/X in H.bodyparts)
var/obj/item/organ/external/LB = X
missing -= LB.limb_name
var/status = ""
var/brutedamage = org.brute_dam
var/burndamage = org.burn_dam
var/brutedamage = LB.brute_dam
var/burndamage = LB.burn_dam
if(brutedamage > 0)
status = "bruised"
if(brutedamage > 20)
status = "bleeding"
status = "battered"
if(brutedamage > 40)
status = "mangled"
if(brutedamage > 0 && burndamage > 0)
@@ -236,16 +243,17 @@
status += "blistered"
else if(burndamage > 0)
status += "numb"
if(org.status & ORGAN_DESTROYED)
status = "MISSING!"
if(org.status & ORGAN_MUTATED)
if(LB.status & ORGAN_MUTATED)
status = "weirdly shapen."
if(status == "")
status = "OK"
src.show_message(text("\t []My [] is [].",status=="OK"?"<span class='notice'></span>":"<span class='warning'></span>",org.name,status),1)
to_chat(src, "\t <span class='[status == "OK" ? "notice" : "warning"]'>Your [LB.name] is [status].</span>")
for(var/obj/item/I in org.embedded_objects)
to_chat(src, "\t <a href='byond://?src=[UID()];embedded_object=[I.UID()];embedded_limb=[org.UID()]' class='warning'>There is \a [I] embedded in your [org.name]!</a>")
for(var/obj/item/I in LB.embedded_objects)
to_chat(src, "\t <a href='byond://?src=[UID()];embedded_object=[I.UID()];embedded_limb=[LB.UID()]' class='warning'>There is \a [I] embedded in your [LB.name]!</a>")
for(var/t in missing)
to_chat(src, "<span class='boldannounce'>Your [parse_zone(t)] is missing!</span>")
if(H.bleed_rate)
to_chat(src, "<span class='danger'>You are bleeding!</span>")
@@ -297,7 +305,9 @@
)
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src
if(H.w_uniform)
if(H.wear_suit)
H.wear_suit.add_fingerprint(M)
else if(H.w_uniform)
H.w_uniform.add_fingerprint(M)
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
@@ -317,15 +327,15 @@
if(1)
to_chat(src, "<span class='warning'>Your eyes sting a little.</span>")
if(prob(40)) //waiting on carbon organs
E.damage += 1
E.take_damage(1, 1)
if(2)
to_chat(src, "<span class='warning'>Your eyes burn.</span>")
E.damage += rand(2, 4)
E.take_damage(rand(2, 4), 1)
else
to_chat(src, "Your eyes itch and burn severely!</span>")
E.damage += rand(12, 16)
E.take_damage(rand(12, 16), 1)
if(E.damage > E.min_bruised_damage)
AdjustEyeBlind(damage)
@@ -887,11 +897,11 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
..()
/mob/living/carbon/Stat()
..()
if(statpanel("Status"))
var/obj/item/organ/internal/xenos/plasmavessel/vessel = get_int_organ(/obj/item/organ/internal/xenos/plasmavessel)
if(vessel)
stat(null, "Plasma Stored: [vessel.stored_plasma]/[vessel.max_plasma]")
..()
/mob/living/carbon/get_all_slots()
return list(l_hand,
@@ -930,7 +940,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
W.plane = initial(W.plane)
/mob/living/carbon/proc/slip(var/description, var/stun, var/weaken, var/tilesSlipped, var/walkSafely, var/slipAny)
/mob/living/carbon/proc/slip(description, stun, weaken, tilesSlipped, walkSafely, slipAny, slipVerb = "slip")
if(flying || buckled || (walkSafely && m_intent == MOVE_INTENT_WALK))
return 0
if((lying) && (!(tilesSlipped)))
@@ -944,10 +954,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
for(var/t = 0, t<=tilesSlipped, t++)
spawn (t) step(src, src.dir)
stop_pulling()
to_chat(src, "<span class='notice'>You slipped on [description]!</span>")
to_chat(src, "<span class='notice'>You [slipVerb]ped on [description]!</span>")
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
if(stun)
Stun(stun)
// Something something don't run with scissors
Stun(stun)
Weaken(weaken)
return 1
@@ -971,7 +981,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
else
if(!forceFed(toEat, user, fullness))
return 0
consume(toEat, bitesize_override)
consume(toEat, bitesize_override, taste = toEat.taste)
score_foodeaten++
return 1
@@ -1024,7 +1034,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/*TO DO - If/when stomach organs are introduced, override this at the human level sending the item to the stomach
so that different stomachs can handle things in different ways VB*/
/mob/living/carbon/proc/consume(var/obj/item/weapon/reagent_containers/food/toEat, var/bitesize_override)
/mob/living/carbon/proc/consume(var/obj/item/weapon/reagent_containers/food/toEat, var/bitesize_override, var/taste = TRUE)
var/this_bite = bitesize_override ? bitesize_override : toEat.bitesize
if(!toEat.reagents)
return
@@ -1033,6 +1043,8 @@ so that different stomachs can handle things in different ways VB*/
if(toEat.consume_sound)
playsound(loc, toEat.consume_sound, rand(10,50), 1)
if(toEat.reagents.total_volume)
if(taste)
taste_reagents(toEat.reagents)
var/fraction = min(this_bite/toEat.reagents.total_volume, 1)
toEat.reagents.reaction(src, toEat.apply_type, fraction)
toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency)
@@ -40,3 +40,7 @@
if(D.IsSpreadByTouch())
ContractDisease(D)
return 0
/mob/living/carbon/is_mouth_covered(head_only = FALSE, mask_only = FALSE)
if((!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)))
return TRUE
@@ -8,14 +8,14 @@
var/life_tick = 0 // The amount of life ticks that have processed on this mob.
// total amount of wounds on mob, used to spread out healing and the like over all wounds
var/number_wounds = 0
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
var/obj/item/head = null
var/obj/item/clothing/suit/wear_suit = null //TODO: necessary? Are they even used? ~Carn
var/mob/living/simple_animal/borer/borer = null
//Active emote/pose
var/pose = null
@@ -37,7 +37,7 @@
if(species.name == "Drask") //Only Drask can make whale noises
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
else
return
return
if("howl", "howls")
if (species.name == "Vulpkanin") //Only Vulpkanin can howl
on_CD = handle_emote_CD(100)
@@ -47,7 +47,7 @@
if (species.name == "Vulpkanin") //Only Vulpkanin can growl
on_CD = handle_emote_CD()
else
return
return
if("squish", "squishes")
var/found_slime_bodypart = 0
@@ -101,7 +101,7 @@
if("me") //OKAY SO RANT TIME, THIS FUCKING HAS TO BE HERE OR A SHITLOAD OF THINGS BREAK
return custom_emote(m_type, message) //DO YOU KNOW WHY SHIT BREAKS? BECAUSE SO MUCH OLDCODE CALLS mob.emote("me",1,"whatever_the_fuck_it_wants_to_emote")
//WHO THE FUCK THOUGHT THAT WAS A GOOD FUCKING IDEA!?!?
if("howl", "howls")
var/M = handle_emote_param(param) //Check to see if the param is valid (mob with the param name is in view).
message = "<B>[src]</B> howls[M ? " at [M]" : ""]!"
@@ -113,7 +113,7 @@
message = "<B>[src]</B> growls[M ? " at [M]" : ""]."
playsound(loc, "growls", 80, 0)
m_type = 2
if("ping", "pings")
var/M = handle_emote_param(param)
@@ -734,9 +734,9 @@
message = "<B>[src]</B> [species.scream_verb][M ? " at [M]" : ""]!"
m_type = 2
if(gender == FEMALE)
playsound(loc, "[species.female_scream_sound]", 80, 1, 0, pitch = get_age_pitch())
playsound(loc, "[species.female_scream_sound]", 80, 1, frequency = get_age_pitch())
else
playsound(loc, "[species.male_scream_sound]", 80, 1, 0, pitch = get_age_pitch()) //default to male screams if no gender is present.
playsound(loc, "[species.male_scream_sound]", 80, 1, frequency = get_age_pitch()) //default to male screams if no gender is present.
else
message = "<B>[src]</B> makes a very loud noise[M ? " at [M]" : ""]."
@@ -750,9 +750,9 @@
var/obj/item/organ/external/R = H.get_organ("r_hand")
var/left_hand_good = 0
var/right_hand_good = 0
if(L && (!(L.status & ORGAN_DESTROYED)) && (!(L.status & ORGAN_SPLINTED)) && (!(L.status & ORGAN_BROKEN)))
if(L && (!(L.status & ORGAN_SPLINTED)) && (!(L.status & ORGAN_BROKEN)))
left_hand_good = 1
if(R && (!(R.status & ORGAN_DESTROYED)) && (!(R.status & ORGAN_SPLINTED)) && (!(R.status & ORGAN_BROKEN)))
if(R && (!(R.status & ORGAN_SPLINTED)) && (!(R.status & ORGAN_BROKEN)))
right_hand_good = 1
if(!left_hand_good && !right_hand_good)
+108 -161
View File
@@ -191,16 +191,6 @@
//ID
if(wear_id)
/*var/id
if(istype(wear_id, /obj/item/device/pda))
var/obj/item/device/pda/pda = wear_id
id = pda.owner
else if(istype(wear_id, /obj/item/weapon/card/id)) //just in case something other than a PDA/ID card somehow gets in the ID slot :[
var/obj/item/weapon/card/id/idcard = wear_id
id = idcard.registered_name
if(id && (id != real_name) && (get_dist(src, user) <= 1) && prob(10))
msg += "<span class='warning'>[t_He] [t_is] wearing [bicon(wear_id)] \a [wear_id] yet something doesn't seem right...</span>\n"
else*/
msg += "[t_He] [t_is] wearing [bicon(wear_id)] \a [wear_id].\n"
//Jitters
@@ -212,80 +202,32 @@
if(100 to 200)
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n"
//splints
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
var/obj/item/organ/external/o = get_organ(organ)
if(o && o.status & ORGAN_SPLINTED)
msg += "<span class='warning'>[t_He] [t_has] a splint on his [o.name]!</span>\n"
if(suiciding)
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n"
if(DWARF in mutations)
msg += "[t_He] [t_is] a halfling!\n"
var/distance = get_dist(user,src)
if(istype(user, /mob/dead/observer) || user.stat == 2) // ghosts can see anything
distance = 1
if(src.stat)
msg += "<span class='warning'>[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.</span>\n"
if((stat == 2 || src.health <= config.health_threshold_crit) && distance <= 3)
msg += "<span class='warning'>[t_He] does not appear to be breathing.</span>\n"
if(istype(user, /mob/living/carbon/human) && !user.stat && distance <= 1)
for(var/mob/O in viewers(user.loc, null))
O.show_message("[user] checks [src]'s pulse.", 1)
spawn(15)
if(distance <= 1 && user.stat != 1)
if(pulse == PULSE_NONE)
to_chat(user, "<span class='deadsay'>[t_He] has no pulse[src.client ? "" : " and [t_his] soul has departed"]...</span>")
else
to_chat(user, "<span class='deadsay'>[t_He] has a pulse!</span>")
msg += "<span class='warning'>"
if(fire_stacks > 0)
msg += "[t_He] [t_is] covered in something flammable.\n"
if(fire_stacks < 0)
msg += "[t_He] looks a little soaked.\n"
switch(wetlevel)
if(1)
msg += "[t_He] looks a bit damp.\n"
if(2)
msg += "[t_He] looks a little bit wet.\n"
if(3)
msg += "[t_He] looks wet.\n"
if(4)
msg += "[t_He] looks very wet.\n"
if(5)
msg += "[t_He] looks absolutely soaked.\n"
if(nutrition < NUTRITION_LEVEL_STARVING - 50)
msg += "[t_He] [t_is] severely malnourished.\n"
else if(nutrition >= NUTRITION_LEVEL_FAT)
if(user.nutrition < NUTRITION_LEVEL_STARVING - 50)
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
else
msg += "[t_He] [t_is] quite chubby.\n"
if(reagents.has_reagent("teslium"))
msg += "[t_He] is emitting a gentle blue glow!\n"
msg += "</span>"
if(getBrainLoss() >= 60)
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
if(species.show_ssd && (!species.has_organ["brain"] || get_int_organ(/obj/item/organ/internal/brain)) && stat != DEAD)
if(istype(src, /mob/living/carbon/human/interactive))
msg += "<span class='deadsay'>[t_He] appears to be some sort of sick automaton: [t_his] eyes are glazed over and [t_his] mouth is slightly agape.</span>\n"
else if(!key)
msg += "<span class='deadsay'>[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.</span>\n"
else if(!client)
msg += "[t_He] [t_has] suddenly fallen asleep, suffering from Space Sleep Disorder.\n"
var/appears_dead = FALSE
if(stat == DEAD || (status_flags & FAKEDEATH))
appears_dead = TRUE
if(suiciding)
msg += "<span class='warning'>[t_He] appears to have committed suicide... there is no hope of recovery.</span>\n"
msg += "<span class='deadsay'>[t_He] [t_is] limp and unresponsive; there are no signs of life"
if(get_int_organ(/obj/item/organ/internal/brain))
if(!key)
var/foundghost = FALSE
if(mind)
for(var/mob/dead/observer/G in player_list)
if(G.mind == mind)
foundghost = TRUE
if(G.can_reenter_corpse == 0)
foundghost = FALSE
break
if(!foundghost)
msg += " and [t_his] soul has departed"
msg += "...</span>\n"
if(!get_int_organ(/obj/item/organ/internal/brain))
msg += "<span class='deadsay'>It appears that [t_his] brain is missing...</span>\n"
msg += "<span class='warning'>"
var/list/wound_flavor_text = list()
var/list/is_destroyed = list()
for(var/organ_tag in species.has_limbs)
@@ -296,89 +238,17 @@
var/obj/item/organ/external/E = bodyparts_by_name[organ_tag]
if(!E)
wound_flavor_text["[organ_tag]"] = "<span class='warning'><b>[t_He] [t_is] missing [t_his] [organ_descriptor].</b></span>\n"
else if(E.is_stump())
wound_flavor_text["[organ_tag]"] = "<span class='warning'><b>[t_He] [t_has] a stump where [t_his] [organ_descriptor] should be.</b></span>\n"
wound_flavor_text["[organ_tag]"] = "<B>[t_He] [t_is] missing [t_his] [organ_descriptor].</B>\n"
else
continue
if(!isSynthetic())
if(E.status & ORGAN_ROBOT)
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a robotic [E.name]!\n"
for(var/obj/item/organ/external/temp in bodyparts)
if(temp && !temp.is_stump())
if(temp.status & ORGAN_ROBOT)
if(!(temp.brute_dam + temp.burn_dam))
if(!isSynthetic())
wound_flavor_text["[temp.limb_name]"] = "<span class='warning'>[t_He] [t_has] a robotic [temp.name]!</span>\n"
continue
else
wound_flavor_text["[temp.limb_name]"] = "<span class='warning'>[t_He] [t_has] a robotic [temp.name]. It has"
if(temp.brute_dam) switch(temp.brute_dam)
if(0 to 20)
wound_flavor_text["[temp.limb_name]"] += " some dents"
if(21 to INFINITY)
wound_flavor_text["[temp.limb_name]"] += pick(" a lot of dents"," severe denting")
if(temp.brute_dam && temp.burn_dam)
wound_flavor_text["[temp.limb_name]"] += " and"
if(temp.burn_dam) switch(temp.burn_dam)
if(0 to 20)
wound_flavor_text["[temp.limb_name]"] += " some burns"
if(21 to INFINITY)
wound_flavor_text["[temp.limb_name]"] += pick(" a lot of burns"," severe melting")
if(wound_flavor_text["[temp.limb_name]"])
wound_flavor_text["[temp.limb_name]"] += "!</span>\n"
else if(temp.wounds.len > 0)
var/list/wound_descriptors = list()
for(var/datum/wound/W in temp.wounds)
if(W.internal && !temp.open) continue // can't see internal wounds
var/this_wound_desc = W.desc
if(W.damage_type == BURN && W.salved) this_wound_desc = "salved [this_wound_desc]"
if(W.germ_level > 600) this_wound_desc = "badly infected [this_wound_desc]"
else if(W.germ_level > 330) this_wound_desc = "lightly infected [this_wound_desc]"
if(this_wound_desc in wound_descriptors)
wound_descriptors[this_wound_desc] += W.amount
continue
wound_descriptors[this_wound_desc] = W.amount
if(wound_descriptors.len)
var/list/flavor_text = list()
var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
"huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
for(var/wound in wound_descriptors)
switch(wound_descriptors[wound])
if(1)
if(!flavor_text.len)
flavor_text += "<span class='warning'>[t_He] [t_has][prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
else
flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
if(2)
if(!flavor_text.len)
flavor_text += "<span class='warning'>[t_He] [t_has][prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
else
flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
if(3 to 5)
if(!flavor_text.len)
flavor_text += "<span class='warning'>[t_He] [t_has] several [wound]s"
else
flavor_text += " several [wound]s"
if(6 to INFINITY)
if(!flavor_text.len)
flavor_text += "<span class='warning'>[t_He] [t_has] a bunch of [wound]s"
else
flavor_text += " a ton of [wound]\s"
var/flavor_text_string = ""
for(var/text = 1, text <= flavor_text.len, text++)
if(text == flavor_text.len && flavor_text.len > 1)
flavor_text_string += ", and"
else if(flavor_text.len > 1 && text > 1)
flavor_text_string += ","
flavor_text_string += flavor_text[text]
flavor_text_string += " on [t_his] [temp.name].</span><br>"
wound_flavor_text["[temp.limb_name]"] = flavor_text_string
else
wound_flavor_text["[temp.limb_name]"] = ""
else
wound_flavor_text["[temp.limb_name]"] = ""
else if(E.status & ORGAN_SPLINTED)
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a splint on his [E.name]!\n"
for(var/obj/item/I in temp.embedded_objects)
msg += "<B>[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [temp.name]!</B>\n"
for(var/obj/item/I in E.embedded_objects)
msg += "<B>[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [E.name]!</B>\n"
//Handles the text strings being added to the actual description.
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
@@ -405,6 +275,55 @@
if(wound_flavor_text["r_foot"]&& (is_destroyed["right foot"] || (!shoes && !skipshoes)))
msg += wound_flavor_text["r_foot"]
var/temp = getBruteLoss() //no need to calculate each of these twice
if(temp)
var/brute_message = !isSynthetic() ? "bruising" : "denting"
if(temp < 30)
msg += "[t_He] [t_has] minor [brute_message ].\n"
else
msg += "<B>[t_He] [t_has] severe [brute_message ]!</B>\n"
temp = getFireLoss()
if(temp)
if(temp < 30)
msg += "[t_He] [t_has] minor burns.\n"
else
msg += "<B>[t_He] [t_has] severe burns!</B>\n"
temp = getCloneLoss()
if(temp)
if(temp < 30)
msg += "[t_He] [t_has] minor cellular damage.\n"
else
msg += "<B>[t_He] [t_has] severe cellular damage.</B>\n"
if(fire_stacks > 0)
msg += "[t_He] [t_is] covered in something flammable.\n"
if(fire_stacks < 0)
msg += "[t_He] looks a little soaked.\n"
switch(wetlevel)
if(1)
msg += "[t_He] looks a bit damp.\n"
if(2)
msg += "[t_He] looks a little bit wet.\n"
if(3)
msg += "[t_He] looks wet.\n"
if(4)
msg += "[t_He] looks very wet.\n"
if(5)
msg += "[t_He] looks absolutely soaked.\n"
if(nutrition < NUTRITION_LEVEL_STARVING - 50)
msg += "[t_He] [t_is] severely malnourished.\n"
else if(nutrition >= NUTRITION_LEVEL_FAT)
if(user.nutrition < NUTRITION_LEVEL_STARVING - 50)
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
else
msg += "[t_He] [t_is] quite chubby.\n"
if(blood_volume < BLOOD_VOLUME_SAFE)
msg += "[t_He] [t_has] pale skin.\n"
@@ -416,10 +335,38 @@
else
msg += "<B>[t_He] [t_is] bleeding!</B>\n"
if(digitalcamo)
msg += "[t_He] [t_is] repulsively uncanny!\n"
if(reagents.has_reagent("teslium"))
msg += "[t_He] is emitting a gentle blue glow!\n"
msg += "</span>"
if(!appears_dead)
if(stat == UNCONSCIOUS)
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n"
else if(getBrainLoss() >= 60)
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
if(get_int_organ(/obj/item/organ/internal/brain))
if(istype(src, /mob/living/carbon/human/interactive))
var/mob/living/carbon/human/interactive/auto = src
if(auto.showexaminetext)
msg += "<span class='deadsay'>[t_He] [t_is] appears to be some sort of sick automaton, [t_his] eyes are glazed over and [t_his] mouth is slightly agape.</span>\n"
if(auto.debugexamine)
var/dodebug = auto.doing2string(auto.doing)
var/interestdebug = auto.interest2string(auto.interest)
msg += "<span class='deadsay'>[t_He] [t_is] appears to be [interestdebug] and [dodebug].</span>\n"
else if(species.show_ssd)
if(!key)
msg += "<span class='deadsay'>[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.</span>\n"
else if(!client)
msg += "[t_He] [t_has] suddenly fallen asleep, suffering from Space Sleep Disorder. [t_He] may wake up soon.\n"
if(digitalcamo)
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n"
if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src))
msg += "Their features seem unnaturally tight and drawn.\n"
if(decaylevel == 1)
msg += "[t_He] [t_is] starting to smell.\n"
if(decaylevel == 2)
+10 -14
View File
@@ -32,8 +32,6 @@
create_reagents(330)
prev_gender = gender // Debug for plural genders
martial_art = default_martial_art
handcrafting = new()
@@ -609,7 +607,7 @@
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
/mob/living/carbon/human/proc/get_face_name()
var/obj/item/organ/external/head = get_organ("head")
if( !head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
if( !head || head.disfigured || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
return "Unknown"
return real_name
@@ -1208,18 +1206,10 @@
for(var/obj/item/organ/internal/I in H.internal_organs)
types_of_int_organs |= I.type //Compiling the list of organ types. It is possible for organs to be missing from this list if they are absent from the mob.
//Removing stumps.
for(var/obj/item/organ/organ in H.contents)
if(istype(organ, /obj/item/organ/external/stump)) //Get rid of all stumps.
qdel(organ)
H.contents -= organ //Making sure the list entry is removed.
for(var/obj/item/organ/organ in H.bodyparts)
if(istype(organ, /obj/item/organ/external/stump))
qdel(organ)
H.bodyparts -= organ //Making sure the list entry is removed.
//Clean up limbs
for(var/organ_name in H.bodyparts_by_name)
var/obj/item/organ/organ = H.bodyparts_by_name[organ_name]
if(istype(organ, /obj/item/organ/external/stump) || !organ) //The !organ check is to account for mechanical limb (prostheses) losses, since those are handled in a way that leaves indexed but null list entries instead of stumps.
if(!organ) //The !organ check is to account for mechanical limb (prostheses) losses, since those are handled in a way that leaves indexed but null list entries instead of stumps.
qdel(organ)
H.bodyparts_by_name -= organ_name //Making sure the list entry is removed.
@@ -1598,7 +1588,7 @@
return
var/obj/item/organ/external/head/head_organ = get_organ("head")
if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) //If the rock'em-sock'em robot's head came off during a fight, they shouldn't be able to change their screen/optics.
if(!head_organ) //If the rock'em-sock'em robot's head came off during a fight, they shouldn't be able to change their screen/optics.
to_chat(src, "<span class='warning'>Where's your head at? Can't change your monitor/display without one.</span>")
return
@@ -2058,3 +2048,9 @@
update_icons()
..()
mob/living/carbon/human/get_taste_sensitivity()
if(species)
return species.taste_sensitivity
else
return 1
@@ -201,10 +201,10 @@ emp_act
qdel(src)
var/obj/item/organ/external/affecting = get_organ(ran_zone(user.zone_sel.selecting))
if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED))
if(!affecting)
to_chat(user, "<span class='danger'>They are missing that limb!</span>")
return 1
var/hit_area = affecting.name
var/hit_area = parse_zone(affecting.limb_name)
if(user != src)
user.do_attack_animation(src)
@@ -270,7 +270,7 @@ emp_act
update_inv_glasses(0)
if("upper body")//Easier to score a stun but lasts less time
if("chest")//Easier to score a stun but lasts less time
if(stat == CONSCIOUS && I.force && prob(I.force + 10))
visible_message("<span class='combat danger'>[src] has been knocked down!</span>", \
"<span class='combat userdanger'>[src] has been knocked down!</span>")
@@ -393,3 +393,10 @@ emp_act
..()
species.water_act(src,volume,temperature,source)
/mob/living/carbon/human/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES))
return TRUE
if(check_head && head && (head.flags_cover & HEADCOVERSEYES))
return TRUE
if(check_mask && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH))
return TRUE
@@ -52,9 +52,6 @@ var/global/default_martial_art = new/datum/martial_art
var/special_voice = "" // For changing our voice. Used by a symptom.
var/last_dam = -1 //Used for determining if we need to process all organs or just some or even none.
var/list/bad_external_organs = list()// organs we check until they are good.
var/hand_blood_color
var/name_override //For temporary visible name changes
@@ -70,6 +67,8 @@ var/global/default_martial_art = new/datum/martial_art
var/check_mutations=0 // Check mutations on next life tick
var/heartbeat = 0
var/fire_dmi = 'icons/mob/OnFire.dmi'
var/fire_sprite = "Standing"
@@ -45,7 +45,7 @@
var/obj/item/organ/external/l_foot = get_organ("l_foot")
var/obj/item/organ/external/r_foot = get_organ("r_foot")
var/hasfeet = 1
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
if(!l_foot && !r_foot)
hasfeet = 0
if(shoes)
@@ -56,13 +56,7 @@
else
//No oldFP or it's a different kind of blood
S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP)
var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
FP.blood_state = S.blood_state
FP.entered_dirs |= dir
FP.bloodiness = S.bloody_shoes[S.blood_state]
FP.blood_DNA = S.blood_DNA
FP.basecolor = S.blood_color
FP.update_icon()
createFootprintsFrom(shoes, dir, T)
update_inv_shoes()
else if(hasfeet)
if(bloody_feet && bloody_feet[blood_state])
@@ -71,12 +65,7 @@
return
else
bloody_feet[blood_state] = max(0, bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP)
var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
FP.blood_state = blood_state
FP.entered_dirs |= dir
FP.bloodiness = bloody_feet[blood_state]
FP.basecolor = feet_blood_color
FP.update_icon()
createFootprintsFrom(src, dir, T)
update_inv_shoes()
//End bloody footprints
if(S)
@@ -9,52 +9,24 @@
// Takes care of organ related updates, such as broken and missing limbs
/mob/living/carbon/human/proc/handle_organs()
number_wounds = 0
var/force_process = 0
var/damage_this_tick = getBruteLoss() + getFireLoss() + getToxLoss()
if(damage_this_tick > last_dam)
force_process = 1
last_dam = damage_this_tick
if(force_process)
bad_external_organs.Cut()
for(var/obj/item/organ/external/Ex in bodyparts)
bad_external_organs |= Ex
//processing internal organs is pretty cheap, do that first.
for(var/obj/item/organ/internal/I in internal_organs)
I.process()
for(var/obj/item/organ/external/E in bodyparts)
E.process()
if(!lying && world.time - l_move_time < 15)
//Moving around with fractured ribs won't do you any good
if(E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
var/obj/item/organ/internal/I = pick(E.internal_organs)
custom_pain("You feel broken bones moving in your [E.name]!", 1)
I.take_damage(rand(3,5))
//handle_stance()
handle_grasp()
handle_stance()
if(!force_process && !bad_external_organs.len)
return
for(var/obj/item/organ/external/E in bad_external_organs)
if(!E)
continue
if(!E.need_process())
bad_external_organs -= E
continue
else
E.process()
number_wounds += E.number_wounds
if(!lying && world.time - l_move_time < 15)
//Moving around with fractured ribs won't do you any good
if(E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
var/obj/item/organ/internal/I = pick(E.internal_organs)
custom_pain("You feel broken bones moving in your [E.name]!", 1)
I.take_damage(rand(3,5))
//Moving makes open wounds get infected much faster
if(E.wounds.len)
for(var/datum/wound/W in E.wounds)
if(W.infection_check())
W.germ_level += 1
/mob/living/carbon/human/proc/handle_stance()
// Don't need to process any of this if they aren't standing anyways
@@ -71,7 +43,7 @@
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
var/obj/item/organ/external/E = bodyparts_by_name[limb_tag]
if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD)) || E.is_malfunctioning())
if(!E || (E.status & ORGAN_DEAD) || E.is_malfunctioning())
stance_damage += 2 // let it fail even if just foot&leg. Also malfunctioning happens sporadically so it should impact more when it procs
else if(E.is_broken() || !E.is_usable())
stance_damage += 1
@@ -72,6 +72,8 @@
var/forceProcess = 0
var/processTime = 10
var/speak_file = "npc_chatter.json"
var/debugexamine = FALSE //If we show debug info in our examine
var/showexaminetext = TRUE //If we show our telltale examine text
var/list/knownStrings = list()
@@ -24,8 +24,7 @@
/mob/living/carbon/human/proc/has_organ(name)
var/obj/item/organ/external/O = bodyparts_by_name[name]
return (O && !(O.status & ORGAN_DESTROYED) && !O.is_stump())
return O
/mob/living/carbon/human/proc/has_organ_for_slot(slot)
switch(slot)
+12 -92
View File
@@ -1,29 +1,10 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
/mob/living/carbon/human
var/pressure_alert = 0
var/prev_gender = null // Debug for plural genders
var/temperature_alert = 0
var/in_stasis = 0
var/exposedtimenow = 0
var/firstexposed = 0
var/heartbeat = 0
/mob/living/carbon/human/Life()
fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it.
life_tick++
in_stasis = 0
if(istype(loc, /obj/structure/closet/body_bag/cryobag))
var/obj/structure/closet/body_bag/cryobag/loc_as_cryobag = loc
if(!loc_as_cryobag.opened)
loc_as_cryobag.used++
in_stasis = 1
voice = GetVoice()
if(..() && !in_stasis)
if(..())
if(check_mutations)
domutcheck(src,null)
@@ -47,8 +28,6 @@
if(stat == DEAD)
handle_decay()
handle_stasis_bag()
if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle
return //We go ahead and process them 5 times for HUD images and other stuff though.
@@ -158,16 +137,6 @@
visible_message("<span class='alert'><B>[src]</B> goes limp, their facial expression utterly blank.</span>")
death()
/mob/living/carbon/human/proc/handle_stasis_bag()
// Handle side effects from stasis bag
if(in_stasis)
// First off, there's no oxygen supply, so the mob will slowly take brain damage
adjustBrainLoss(0.1)
// Next, the method to induce stasis has some adverse side-effects, manifesting
// as cloneloss
adjustCloneLoss(0.1)
/mob/living/carbon/human/handle_mutations_and_radiation()
for(var/datum/dna/gene/gene in dna_genes)
if(!gene.block)
@@ -892,8 +861,7 @@
if(gloves && germ_level > gloves.germ_level && prob(10))
gloves.germ_level += 1
if(!in_stasis)
handle_organs()
handle_organs()
else //dead
@@ -972,57 +940,6 @@
if(hud_used)
hud_used.lingchemdisplay.invisibility = 101
/mob/living/carbon/human/handle_shock()
..()
if(status_flags & GODMODE)
return 0 //godmode
if(NO_PAIN in species.species_traits)
return
if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse
shock_stage = max(shock_stage, 61)
if(traumatic_shock >= 100)
shock_stage += 1
else
shock_stage = min(shock_stage, 160)
shock_stage = max(shock_stage-1, 0)
return
if(shock_stage == 10)
to_chat(src, "<font color='red'><b>"+pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!"))
if(shock_stage >= 30)
if(shock_stage == 30) custom_emote(1,"is having trouble keeping their eyes open.")
EyeBlurry(2)
Stuttering(5)
if(shock_stage == 40)
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
if(shock_stage >=60)
if(shock_stage == 60) custom_emote(1,"falls limp.")
if(prob(2))
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
Weaken(20)
if(shock_stage >= 80)
if(prob(5))
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
Weaken(20)
if(shock_stage >= 120)
if(prob(2))
to_chat(src, "<font color='red'><b>"+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness."))
Paralyse(5)
if(shock_stage == 150)
custom_emote(1,"can no longer stand, collapsing!")
Weaken(20)
if(shock_stage >= 150)
Weaken(20)
/mob/living/carbon/human/proc/handle_pulse()
@@ -1091,11 +1008,11 @@
makeSkeleton()
return //No puking over skeletons, they don't smell at all!
if(!isturf(loc))
return
for(var/mob/living/carbon/human/H in range(decaylevel, src))
if(prob(2))
if(istype(loc,/obj/item/bodybag))
return
var/obj/item/clothing/mask/M = H.wear_mask
if(M && (M.flags_cover & MASKCOVERSMOUTH))
return
@@ -1124,7 +1041,7 @@
if(heartbeat >= rate)
heartbeat = 0
src << sound('sound/effects/electheart.ogg',0,0,0,30)//Credit to GhostHack (www.ghosthack.de) for sound.
src << sound('sound/effects/electheart.ogg',0,0,CHANNEL_HEARTBEAT,30)//Credit to GhostHack (www.ghosthack.de) for sound.
else
heartbeat++
@@ -1143,9 +1060,9 @@
if(heartbeat >= rate)
heartbeat = 0
if(H.status & ORGAN_ASSISTED)
src << sound('sound/effects/pacemakebeat.ogg',0,0,0,50)
src << sound('sound/effects/pacemakebeat.ogg',0,0,CHANNEL_HEARTBEAT,50)
else
src << sound('sound/effects/singlebeat.ogg',0,0,0,50)
src << sound('sound/effects/singlebeat.ogg',0,0,CHANNEL_HEARTBEAT,50)
else
heartbeat++
@@ -1189,8 +1106,11 @@
if(!can_heartattack())
return FALSE
var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart)
if(istype(heart) && heart.beating)
return FALSE
if(istype(heart))
if(heart.status & ORGAN_DEAD)
return TRUE
if(heart.beating)
return FALSE
return TRUE
/mob/living/carbon/human/proc/set_heartattack(status)
@@ -0,0 +1,75 @@
/mob/living/carbon/human/var/traumatic_shock = 0
/mob/living/carbon/human/var/shock_stage = 0
// proc to find out in how much pain the mob is at the moment
/mob/living/carbon/human/proc/updateshock()
traumatic_shock = getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()
// broken or ripped off organs will add quite a bit of pain
for(var/thing in bodyparts)
var/obj/item/organ/external/BP = thing
if(BP.status & ORGAN_BROKEN && !(BP.status & ORGAN_SPLINTED) || BP.open)
traumatic_shock += 15
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
if(R.shock_reduction)
traumatic_shock = max(0, traumatic_shock - R.shock_reduction) // now you too can varedit cyanide to reduce shock by 1000 - Iamgoofball
if(drunk)
traumatic_shock = max(0, traumatic_shock - 10)
return traumatic_shock
/mob/living/carbon/human/proc/handle_shock()
if(status_flags & GODMODE) //godmode
return
if(NO_PAIN in species.species_traits)
return
updateshock()
if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse
shock_stage = max(shock_stage, 61)
if(traumatic_shock >= 100)
shock_stage += 1
else
shock_stage = min(shock_stage, 160)
shock_stage = max(shock_stage-1, 0)
return
if(shock_stage == 10)
to_chat(src, "<font color='red'><b>"+pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!"))
if(shock_stage >= 30)
if(shock_stage == 30)
custom_emote(1,"is having trouble keeping their eyes open.")
EyeBlurry(2)
Stuttering(5)
if(shock_stage == 40)
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
if(shock_stage >=60)
if(shock_stage == 60)
custom_emote(1,"falls limp.")
if(prob(2))
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
Weaken(20)
if(shock_stage >= 80)
if(prob(5))
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
Weaken(20)
if(shock_stage >= 120)
if(prob(2))
to_chat(src, "<font color='red'><b>"+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness."))
Paralyse(5)
if(shock_stage == 150)
custom_emote(1,"can no longer stand, collapsing!")
Weaken(20)
if(shock_stage >= 150)
Weaken(20)
@@ -45,6 +45,7 @@
var/reagent_tag //Used for metabolizing reagents.
var/hunger_drain = HUNGER_FACTOR
var/digestion_ratio = 1 //How quickly the species digests/absorbs reagents.
var/taste_sensitivity = TASTE_SENSITIVITY_NORMAL //the most widely used factor; humans use a different one
var/siemens_coeff = 1 //base electrocution coefficient
@@ -468,7 +469,7 @@
// Other return values will cause weird badness
/datum/species/proc/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
if(R.id == exotic_blood)
H.blood_volume = min(H.blood_volume + round(R.volume, 0.1), BLOOD_VOLUME_MAXIMUM)
H.blood_volume = min(H.blood_volume + round(R.volume, 0.1), BLOOD_VOLUME_NORMAL)
H.reagents.del_reagent(R.id)
return 0
return 1
@@ -114,6 +114,7 @@
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_OMNI
taste_sensitivity = TASTE_SENSITIVITY_SHARP
reagent_tag = PROCESS_ORG
flesh_color = "#AFA59E"
base_color = "#424242"
@@ -164,6 +165,7 @@
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR
dietflags = DIET_OMNI
taste_sensitivity = TASTE_SENSITIVITY_SHARP
reagent_tag = PROCESS_ORG
flesh_color = "#966464"
base_color = "#CF4D2F"
@@ -215,6 +217,7 @@
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS
dietflags = DIET_HERB
taste_sensitivity = TASTE_SENSITIVITY_DULL
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
base_color = "#38b661" //RGB: 56, 182, 97.
@@ -643,12 +646,12 @@
var/list/missing_limbs = list()
for(var/l in bodyparts_by_name)
var/obj/item/organ/external/E = bodyparts_by_name[l]
if(!istype(E) || istype(E, /obj/item/organ/external/stump))
if(!istype(E))
var/list/limblist = species.has_limbs[l]
var/obj/item/organ/external/limb = limblist["path"]
var/parent_organ = initial(limb.parent_organ)
var/obj/item/organ/external/parentLimb = bodyparts_by_name[parent_organ]
if(!istype(parentLimb) || parentLimb.is_stump())
if(!istype(parentLimb))
continue
missing_limbs[initial(limb.name)] = l
@@ -674,21 +677,17 @@
var/stored_brute = 0
var/stored_burn = 0
if(istype(O))
if(!O.is_stump())
to_chat(src, "<span class='warning'>Your limb has already been replaced in some way!</span>")
return
else
to_chat(src, "<span class='warning'>You distribute the damaged tissue around your body, out of the way of your new pseudopod!</span>")
var/obj/item/organ/external/doomedStump = O
stored_brute = doomedStump.brute_dam
stored_burn = doomedStump.burn_dam
qdel(O)
to_chat(src, "<span class='warning'>You distribute the damaged tissue around your body, out of the way of your new pseudopod!</span>")
var/obj/item/organ/external/doomedStump = O
stored_brute = doomedStump.brute_dam
stored_burn = doomedStump.burn_dam
qdel(O)
var/limb_list = species.has_limbs[chosen_limb]
var/obj/item/organ/external/limb_path = limb_list["path"]
// Parent check
var/obj/item/organ/external/potential_parent = bodyparts_by_name[initial(limb_path.parent_organ)]
if(!istype(potential_parent) || potential_parent.is_stump())
if(!istype(potential_parent))
to_chat(src, "<span class='danger'>You've lost the organ that you've been growing your new part on!</span>")
return // No rayman for you
// Grah this line will leave a "not used" warning, in spite of the fact that the new() proc WILL do the thing.
@@ -804,6 +803,7 @@
species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN)
clothing_flags = HAS_SOCKS
dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
oxy_mod = 0
@@ -866,7 +866,6 @@
var/turf/T = H.loc
light_amount = min(T.get_lumcount() * 10, 5) //hardcapped so it's not abused by having a ton of flashlights
H.nutrition = min(H.nutrition+light_amount, NUTRITION_LEVEL_WELL_FED+10)
H.traumatic_shock -= light_amount
if(light_amount > 0)
H.clear_alert("nolight")
@@ -879,7 +878,6 @@
H.adjustFireLoss(-(light_amount/4))
if(H.nutrition < NUTRITION_LEVEL_STARVING+50)
H.take_overall_damage(10,0)
H.traumatic_shock++
/datum/species/machine
name = "Machine"
@@ -911,6 +909,7 @@
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS
dietflags = 0 //IPCs can't eat, so no diet
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
blood_color = "#1F181F"
flesh_color = "#AAAAAA"
//Default styles for created mobs.
@@ -172,11 +172,7 @@ var/global/list/damage_icon_parts = list()
var/damage_appearance = ""
for(var/obj/item/organ/external/O in bodyparts)
if(O.is_stump())
continue
if(O.status & ORGAN_DESTROYED) damage_appearance += "d"
else
damage_appearance += O.damage_state
damage_appearance += O.damage_state
if(damage_appearance == previous_damage_appearance)
// nothing to do here
@@ -190,22 +186,19 @@ var/global/list/damage_icon_parts = list()
// blend the individual damage states with our icons
for(var/obj/item/organ/external/O in bodyparts)
if(O.is_stump())
continue
if(!(O.status & ORGAN_DESTROYED))
O.update_icon()
if(O.damage_state == "00") continue
var/icon/DI
var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.name]"
O.update_icon()
if(O.damage_state == "00") continue
var/icon/DI
var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.name]"
if(damage_icon_parts[cache_index] == null)
DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human
DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
DI.Blend(species.blood_color, ICON_MULTIPLY)
damage_icon_parts[cache_index] = DI
else
DI = damage_icon_parts[cache_index]
standing_image.overlays += DI
if(damage_icon_parts[cache_index] == null)
DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human
DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
DI.Blend(species.blood_color, ICON_MULTIPLY)
damage_icon_parts[cache_index] = DI
else
DI = damage_icon_parts[cache_index]
standing_image.overlays += DI
overlays_standing[DAMAGE_LAYER] = standing_image
@@ -241,7 +234,7 @@ var/global/list/damage_icon_parts = list()
for(var/organ_tag in species.has_limbs)
var/obj/item/organ/external/part = bodyparts_by_name[organ_tag]
if(isnull(part) || part.is_stump() || (part.status & ORGAN_DESTROYED))
if(isnull(part))
icon_key += "0"
else if(part.status & ORGAN_ROBOT)
icon_key += "2[part.model ? "-[part.model]": ""]"
@@ -368,7 +361,7 @@ var/global/list/damage_icon_parts = list()
//Body markings.
var/obj/item/organ/external/chest/chest_organ = get_organ("chest")
if(chest_organ && !chest_organ.is_stump() && !(chest_organ.status & ORGAN_DESTROYED) && m_styles["body"])
if(chest_organ && m_styles["body"])
var/body_marking = m_styles["body"]
var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
if(body_marking_style && body_marking_style.species_allowed && (species.name in body_marking_style.species_allowed))
@@ -378,7 +371,7 @@ var/global/list/damage_icon_parts = list()
markings_standing.Blend(b_marking_s, ICON_OVERLAY)
//Head markings.
var/obj/item/organ/external/head/head_organ = get_organ("head")
if(head_organ && !head_organ.is_stump() && !(head_organ.status & ORGAN_DESTROYED) && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
if(head_organ && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
var/head_marking = m_styles["head"]
var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
if(head_marking_style && head_marking_style.species_allowed && (head_organ.species.name in head_marking_style.species_allowed))
@@ -398,7 +391,7 @@ var/global/list/damage_icon_parts = list()
overlays_standing[HEAD_ACC_OVER_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
if(!head_organ)
if(update_icons) update_icons()
return
@@ -435,7 +428,7 @@ var/global/list/damage_icon_parts = list()
overlays_standing[HAIR_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
if(!head_organ)
if(update_icons) update_icons()
return
@@ -484,7 +477,7 @@ var/global/list/damage_icon_parts = list()
overlays_standing[FHAIR_OVER_LAYER] = null
var/obj/item/organ/external/head/head_organ = get_organ("head")
if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
if(!head_organ)
if(update_icons) update_icons()
return
-38
View File
@@ -1,38 +0,0 @@
/mob/living/var/traumatic_shock = 0
/mob/living/carbon/var/shock_stage = 0
// proc to find out in how much pain the mob is at the moment
/mob/living/carbon/proc/updateshock()
src.traumatic_shock = \
1 * src.getOxyLoss() + \
1 * src.getToxLoss() + \
1 * src.getFireLoss() + \
1 * src.getBruteLoss() + \
1 * src.getCloneLoss()
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
if(R.shock_reduction)
src.traumatic_shock -= R.shock_reduction // now you too can varedit cyanide to reduce shock by 1000 - Iamgoofball
if(src.slurring)
src.traumatic_shock -= 10
// broken or ripped off organs will add quite a bit of pain
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/M = src
for(var/obj/item/organ/external/organ in M.bodyparts)
if(!organ)
continue
else if(organ.status & ORGAN_BROKEN || organ.open)
src.traumatic_shock += 15
if(organ.status & ORGAN_SPLINTED)
src.traumatic_shock -= 15
if(src.traumatic_shock < 0)
src.traumatic_shock = 0
return src.traumatic_shock
/mob/living/carbon/proc/handle_shock()
updateshock()
+45 -7
View File
@@ -168,23 +168,23 @@
//same as above
/mob/living/pointed(atom/A as mob|obj|turf in view())
if(incapacitated())
return 0
if(incapacitated(ignore_lying = TRUE))
return FALSE
if(status_flags & FAKEDEATH)
return 0
return FALSE
if(!..())
return 0
return FALSE
var/obj/item/hand_item = get_active_hand()
if(istype(hand_item, /obj/item/weapon/gun) && A != hand_item)
if(a_intent == INTENT_HELP || !ismob(A))
visible_message("<b>[src]</b> points to [A] with [hand_item]")
return 1
return TRUE
A.visible_message("<span class='danger'>[src] points [hand_item] at [A]!</span>",
"<span class='userdanger'>[src] points [hand_item] at you!</span>")
A << 'sound/weapons/TargetOn.ogg'
return 1
return TRUE
visible_message("<b>[src]</b> points to [A]")
return 1
return TRUE
/mob/living/verb/succumb()
set hidden = 1
@@ -1002,3 +1002,41 @@
to_chat(src, "<span class='warning'>You don't have the dexterity to do this!</span>")
return 0
return 1
/mob/living/proc/get_taste_sensitivity()
return 1
/mob/living/proc/taste_reagents(datum/reagents/tastes)
if(!get_taste_sensitivity())//this also works for IPCs and stuff that returns 0 here
return
var/do_not_taste_at_all = 1//so we don't spam with recent tastes
var/taste_sum = 0
var/list/taste_list = list()//associative list so we can stack stuff that tastes the same
var/list/final_taste_list = list()//final list of taste strings
for(var/datum/reagent/R in tastes.reagent_list)
taste_sum += R.volume * R.taste_strength
if(!R.taste_message)//set to null; no taste, like water
continue
taste_list[R.taste_message] += R.volume * R.taste_strength
for(var/R in taste_list)
if(recent_tastes[R] && (world.time - recent_tastes[R] < 12 SECONDS))
continue
do_not_taste_at_all = 0//something was fresh enough to taste; could still be bland enough to be unrecognizable
if(taste_list[R] / taste_sum >= 0.15 / get_taste_sensitivity())//we return earlier if the proc returns a 0; won't break the universe
final_taste_list += R
recent_tastes[R] = world.time
if(do_not_taste_at_all)
return //no message spam
if(final_taste_list.len == 0)//too many reagents - none meet their thresholds
to_chat(src, "<span class='notice'>You you can't really make out what you're tasting...</span>")
return
to_chat(src, "<span class='notice'>You can taste [english_list(final_taste_list)].</span>")
+6 -5
View File
@@ -37,6 +37,11 @@
/mob/living/proc/getarmor(var/def_zone, var/type)
return 0
/mob/living/proc/is_mouth_covered(head_only = FALSE, mask_only = FALSE)
return FALSE
/mob/living/proc/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
return FALSE
/mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone)
//Armor
@@ -260,8 +265,4 @@
if(!supress_message)
visible_message("<span class='warning'>[user] has grabbed [src] passively!</span>")
return G
/mob/living/incapacitated()
if(stat || paralysis || stunned || weakened || restrained())
return 1
return G
@@ -60,4 +60,5 @@
var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message"
var/list/recent_tastes = list()
var/blood_volume = 0 //how much blood the mob has
+5 -3
View File
@@ -66,7 +66,6 @@
*/
var/announcing_vox = 0 // Stores the time of the last announcement
var/const/VOX_CHANNEL = 200
var/const/VOX_DELAY = 100
var/const/VOX_PATH = "sound/vox_fem/"
@@ -136,11 +135,14 @@ var/const/VOX_PATH = "sound/vox_fem/"
play_vox_word(word, src.z, null)
/proc/play_vox_word(var/word, var/z_level, var/mob/only_listener)
/proc/play_vox_word(word, z_level, mob/only_listener)
word = lowertext(word)
if(vox_sounds[word])
var/sound_file = vox_sounds[word]
var/sound/voice = sound(sound_file, wait = 1, channel = VOX_CHANNEL)
var/sound/voice = sound(sound_file, wait = 1, channel = CHANNEL_VOX)
voice.status = SOUND_STREAM
// If there is no single listener, broadcast to everyone in the same z level
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
// Recruiting observers to play as pAIs
var/datum/paiController/paiController // Global handler for pAI candidates
@@ -188,6 +188,9 @@
lawchanges.Add("[time] <B>:</B> [H.name]([H.key]) emagged [name]([key])")
emagged = 1
icon_state = "repairbot-emagged"
holder_type = /obj/item/weapon/holder/drone/emagged
update_icons()
lawupdate = 0
connected_ai = null
clear_supplied_laws()
@@ -91,6 +91,9 @@
H.righthand_file = 'icons/mob/custom_synthetic/custom_righthand.dmi'
H.icon_state = "[icon_state]"
H.item_state = "[icon_state]_hand"
else if(emagged)
H.icon_state = "drone-emagged"
H.item_state = "drone-emagged"
else
H.icon_state = "drone"
H.item_state = "drone"
@@ -161,8 +161,8 @@
name = "matter decompiler"
desc = "Eating trash, bits of glass, or other debris will replenish your stores."
icon = 'icons/obj/device.dmi'
icon_state = "decompiler"
icon = 'icons/obj/toy.dmi'
icon_state = "minigibber"
//Metal, glass, wood, plastic.
var/list/stored_comms = list(
@@ -1,7 +1,7 @@
// No args for restraints because robots don't have those
/mob/living/silicon/robot/incapacitated()
/mob/living/silicon/robot/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
if(stat || lockcharge || weakened || stunned || paralysis || !is_component_functioning("actuator"))
return 1
return TRUE
/mob/living/silicon/robot/update_stat()
if(status_flags & GODMODE)
+1 -1
View File
@@ -144,11 +144,11 @@
// This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms
/mob/living/silicon/Stat()
..()
if(statpanel("Status"))
show_stat_station_time()
show_stat_emergency_shuttle_eta()
show_system_integrity()
..()
//Silicon mob language procs
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
// Mulebot - carries crates around for Quartermaster
// Navigates via floor navbeacons
// Remote Controlled from QM's PDA
@@ -22,12 +22,13 @@
see_in_dark = 5
childtype = /mob/living/simple_animal/pet/corgi/puppy
simplespecies = /mob/living/simple_animal/pet/corgi
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
var/shaved = 0
var/obj/item/inventory_head
var/obj/item/inventory_back
var/facehugger
var/default_atmos_requirements = 0
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
var/last_eaten = 0
/mob/living/simple_animal/pet/corgi/New()
..()
@@ -13,6 +13,8 @@
pass_flags = PASSTABLE | PASSMOB
mob_size = MOB_SIZE_SMALL
ventcrawler = 2
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxHealth = 50
health = 50
@@ -26,6 +26,7 @@
/obj/item/weapon/melee/energy/sword/pirate)
del_on_death = 1
faction = list("pirate")
sentience_type = SENTIENCE_OTHER
/mob/living/simple_animal/hostile/pirate/ranged
name = "Pirate Gunner"
@@ -25,7 +25,7 @@
loot = list(/obj/effect/landmark/mobcorpse/russian,
/obj/item/weapon/kitchen/knife)
del_on_death = 1
sentience_type = SENTIENCE_OTHER
/mob/living/simple_animal/hostile/russian/ranged
icon_state = "russianranged"
@@ -25,6 +25,7 @@
status_flags = CANPUSH
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier)
del_on_death = 1
sentience_type = SENTIENCE_OTHER
///////////////Sword and shield////////////
@@ -82,7 +82,7 @@
/mob/living/simple_animal/hostile/poison/terror_spider/black)
S.spider_myqueen = spider_myqueen
if(prob(sbpc))
S.stillborn = 1
S.stillborn = TRUE
if(spider_growinstantly)
S.amount_grown = 250
@@ -94,7 +94,7 @@
for(var/obj/structure/spider/eggcluster/terror_eggcluster/T in ts_egg_list)
qdel(T)
for(var/obj/structure/spider/spiderling/terror_spiderling/T in ts_spiderling_list)
T.stillborn = 1
T.stillborn = TRUE
to_chat(src, "<span class='userdanger'>All Terror Spiders, except yourself, will die off shortly.</span>")
@@ -33,12 +33,15 @@
ventsmash_action.Grant(src)
/mob/living/simple_animal/hostile/poison/terror_spider/mother/death(gibbed)
var/always_stillborn = FALSE
if(spider_awaymission && !is_away_level(z))
always_stillborn = TRUE
if(canspawn)
canspawn = 0
for(var/i in 0 to 30)
var/obj/structure/spider/spiderling/terror_spiderling/S = new /obj/structure/spider/spiderling/terror_spiderling(get_turf(src))
S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray)
if(prob(66))
if(always_stillborn || prob(66))
S.stillborn = 1
else if(prob(10))
S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/black, /mob/living/simple_animal/hostile/poison/terror_spider/green)
@@ -333,7 +333,7 @@
for(var/i in 1 to numlings)
var/obj/structure/spider/spiderling/terror_spiderling/S = new /obj/structure/spider/spiderling/terror_spiderling(get_turf(src))
S.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/red
S.stillborn = 1
S.stillborn = TRUE
S.name = "Evil-Looking Spiderling"
S.desc = "It moves very quickly, hisses loudly for its size... and has disproportionately large fangs. Hopefully it does not grow up..."
if(!spider_can_fakelings)
@@ -10,16 +10,19 @@
anchored = 0
layer = 2.75
health = 3
var/stillborn = 0
var/stillborn = FALSE
faction = list("terrorspiders")
var/spider_myqueen = null
var/use_vents = 1
var/list/enemies = list()
var/immediate_ventcrawl = 0
var/spider_awaymission = FALSE
/obj/structure/spider/spiderling/terror_spiderling/New()
..()
ts_spiderling_list += src
if(is_away_level(z))
spider_awaymission = TRUE
/obj/structure/spider/spiderling/terror_spiderling/Destroy()
ts_spiderling_list -= src
@@ -85,6 +88,8 @@
if(isturf(loc))
amount_grown += rand(0,2)
if(amount_grown >= 100)
if(spider_awaymission && !is_away_level(z))
stillborn = TRUE
if(stillborn)
die()
else
@@ -174,6 +179,6 @@
var/rnum = 5 - spiderling_number
for(var/i=0, i<rnum, i++)
var/obj/structure/spider/spiderling/terror_spiderling/S = new /obj/structure/spider/spiderling/terror_spiderling(get_turf(src))
S.stillborn = 1
S.stillborn = TRUE
// every set of eggs always spawn 5 spiderlings, but most are decoys
qdel(src)
+9 -1
View File
@@ -330,6 +330,8 @@
SetParalysis(max(paralysis, amount), updating, force)
/mob/living/SetParalysis(amount, updating = 1, force = 0)
if((!!amount) == (!!paralysis)) // We're not changing from + to 0 or vice versa
updating = FALSE
if(status_flags & CANPARALYSE || force)
paralysis = max(amount, 0)
if(updating)
@@ -358,9 +360,11 @@
SetSleeping(max(sleeping, amount), updating, no_alert)
/mob/living/SetSleeping(amount, updating = 1, no_alert = FALSE)
if((!!amount) == (!!sleeping)) // We're not changing from + to 0 or vice versa
updating = FALSE
sleeping = max(amount, 0)
update_sleeping_effects(no_alert)
if(updating)
update_sleeping_effects(no_alert)
update_stat()
update_canmove()
@@ -410,6 +414,8 @@
SetStunned(max(stunned, amount), updating, force)
/mob/living/SetStunned(amount, updating = 1, force = 0) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
if((!!amount) == (!!stunned)) // We're not changing from + to 0 or vice versa
updating = FALSE
if(status_flags & CANSTUN || force)
stunned = max(amount, 0)
if(updating)
@@ -440,6 +446,8 @@
SetWeakened(max(weakened, amount), updating, force)
/mob/living/SetWeakened(amount, updating = 1, force = 0)
if((!!amount) == (!!weakened)) // We're not changing from + to 0 or vice versa
updating = FALSE
if(status_flags & CANWEAKEN || force)
weakened = max(amount, 0)
if(updating)
+3 -3
View File
@@ -56,9 +56,9 @@
return !(weakened || paralysis || stat || (status_flags & FAKEDEATH))
// Whether the mob is capable of actions or not
/mob/living/incapacitated(ignore_restraints = 0, ignore_grab = 0, ignore_lying = 0)
if(stat || paralysis || stunned || (weakened && lying) || (!ignore_restraints && restrained()) || (!ignore_lying && lying))
return 1
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
if(stat || paralysis || stunned || weakened || (!ignore_restraints && restrained()) || (!ignore_lying && lying))
return TRUE
// wonderful proc names, I know - used to check whether the blur overlay
// should show or not
-13
View File
@@ -867,19 +867,6 @@ var/list/slot_equipment_priority = list( \
/mob/proc/stripPanelEquip(obj/item/what, mob/who)
return
/mob/proc/pull_damage()
if(ishuman(src))
var/mob/living/carbon/human/H = src
if(H.health <= config.health_threshold_softcrit)
for(var/name in H.bodyparts_by_name)
var/obj/item/organ/external/e = H.bodyparts_by_name[name]
if(e && H.lying)
if(((e.status & ORGAN_BROKEN && !(e.status & ORGAN_SPLINTED)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100))
return 1
break
return 0
/mob/MouseDrop(mob/M as mob)
..()
if(M != usr) return
+3 -5
View File
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
/mob/new_player
var/ready = 0
var/spawning = 0//Referenced when you want to delete the new_player later on in the code.
@@ -67,9 +65,9 @@
return
/mob/new_player/Stat()
..()
if((!ticker) || ticker.current_state == GAME_STATE_PREGAME)
statpanel("Lobby") // First tab during pre-game.
..()
statpanel("Status")
if(client.statpanel == "Status" && ticker)
@@ -125,7 +123,7 @@
var/mob/dead/observer/observer = new()
src << browse(null, "window=playersetup")
spawning = 1
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// MAD JAMS cant last forever yo
stop_sound_channel(CHANNEL_LOBBYMUSIC)
observer.started_as_observer = 1
@@ -453,7 +451,7 @@
client.prefs.real_name = random_name(client.prefs.gender)
client.prefs.copy_to(new_character)
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// MAD JAMS cant last forever yo
stop_sound_channel(CHANNEL_LOBBYMUSIC)
if(mind)
+1 -1
View File
@@ -20,7 +20,7 @@
/mob/proc/AIize()
if(client)
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// stop the jams for AIs
stop_sound_channel(CHANNEL_LOBBYMUSIC)
var/mob/living/silicon/ai/O = new (loc,,,1)//No MMI but safety is in effect.
O.invisibility = 0
+2 -2
View File
@@ -43,8 +43,8 @@
/mob/proc/can_speak()
return 1
/mob/proc/incapacitated(ignore_restraints, ignore_grab)
return 0
/mob/proc/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
return FALSE
/mob/proc/restrained(ignore_grab)
// All are created free
+3
View File
@@ -22,6 +22,9 @@
name = "chest drawer"
icon_state = "chestdrawer"
/obj/structure/filingcabinet/chestdrawer/autopsy
name = "autopsy reports drawer"
desc = "A large drawer for holding autopsy reports."
/obj/structure/filingcabinet/filingcabinet //not changing the path to avoid unecessary map issues, but please don't name stuff like this in the future -Pete
icon_state = "tallcabinet"
+1 -1
View File
@@ -376,7 +376,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use.
if(choice == 1)
if(id)
remove_id()
remove_id(user)
else
var/obj/item/I = user.get_active_hand()
if(istype(I, /obj/item/weapon/card/id))
+1 -1
View File
@@ -103,7 +103,7 @@
"poweravail" = powmonitor.powernet.avail,
"powerload" = num2text(powmonitor.powernet.viewload, 10),
"powerdemand" = powmonitor.powernet.load,
"apcs" = apc_repository.apc_data(powmonitor))
"apcs" = apc_repository.apc_data(powmonitor.powernet))
has_back = 1
else
data["records"] = list(
+5 -4
View File
@@ -38,10 +38,11 @@
desc = "A portable microcomputer by Thinktronic Systems, LTD. The surface is coated with polytetrafluoroethylene and banana drippings."
ttone = "honk"
/obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery.
if(istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
M.slip("pda", 8, 5, 0, 1)
trip_stun = 8
trip_weaken = 5
trip_chance = 100
trip_walksafe = TRUE
trip_verb = TV_SLIP
/obj/item/device/pda/mime
default_cartridge = /obj/item/weapon/cartridge/mime
+1 -1
View File
@@ -715,7 +715,7 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
// cable is pointing at us, we're standing on an open tile
// so create a stub pointing at the clicked cable on our tile
place_turf(T, user, turn(dirn, 180))
place_turf(U, user, turn(dirn, 180))
return
// exisiting cable doesn't point at our position, so see if it's a stub
+4 -2
View File
@@ -373,13 +373,15 @@ var/const/GRAV_NEEDS_WRENCH = 3
// Shake everyone on the z level to let them know that gravity was enagaged/disenagaged.
/obj/machinery/gravity_generator/main/proc/shake_everyone()
var/turf/our_turf = get_turf(src)
for(var/mob/M in mob_list)
var/sound/alert_sound = sound('sound/effects/alert.ogg')
for(var/shaked in mob_list)
var/mob/M = shaked
var/turf/their_turf = get_turf(M)
if(their_turf && their_turf.z == our_turf.z)
M.update_gravity(M.mob_has_gravity())
if(M.client)
shake_camera(M, 15, 1)
M.playsound_local(our_turf, 'sound/effects/alert.ogg', 100, 1, 0.5)
M.playsound_local(our_turf, null, 100, 1, 0.5, S = alert_sound)
// TODO: Make the gravity generator cooperate with the space manager
/obj/machinery/gravity_generator/main/proc/gravity_in_level()
@@ -1,4 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
var/global/list/rad_collectors = list()
/obj/machinery/power/rad_collector
@@ -1,5 +1,3 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
/obj/machinery/field/containment
name = "Containment Field"
desc = "An energy field."

Some files were not shown because too many files have changed in this diff Show More