Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into OrganRefactor

This commit is contained in:
Aurorablade
2016-01-15 08:10:24 -05:00
349 changed files with 23852 additions and 21659 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ world/IsBanned(key,address,computer_id)
log_access("Failed Login (invalid data): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, please try again. Error message: Your computer provided invalid or blank information to the server on connection (BYOND Username, IP, and Computer ID). Provided information for reference: Username: '[key]' IP: '[address]' Computer ID: '[computer_id]'. If you continue to get this error, please restart byond or contact byond support.")
if (computer_id == 2147483647) //this cid causes stickybans to go haywire
if (text2num(computer_id) == 2147483647) //this cid causes stickybans to go haywire
log_access("Failed Login (invalid cid): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided an invalid Computer ID.")
var/admin = 0
@@ -144,7 +144,8 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back)
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762, slot_in_backpack)
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762/buckshot, slot_in_backpack)
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m762/he, slot_in_backpack)
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
@@ -162,7 +163,7 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(src), slot_s_store)
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/pistol/m2411(src), slot_belt)
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw(src), slot_r_hand)
equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/automatic/l6_saw/devastator(src), slot_r_hand)
var/obj/item/weapon/card/id/syndicate/W = new(src) //Untrackable by AI
W.name = "[real_name]'s ID Card"
+15 -16
View File
@@ -187,21 +187,21 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
//DEFINITIONS FOR ASSET DATUMS START HERE.
/datum/asset/simple/paper
assets = list(
"large_stamp-clown.png" = 'icons/paper_icons/large_stamp-clown.png',
"large_stamp-deny.png" = 'icons/paper_icons/large_stamp-deny.png',
"large_stamp-ok.png" = 'icons/paper_icons/large_stamp-ok.png',
"large_stamp-hop.png" = 'icons/paper_icons/large_stamp-hop.png',
"large_stamp-cmo.png" = 'icons/paper_icons/large_stamp-cmo.png',
"large_stamp-ce.png" = 'icons/paper_icons/large_stamp-ce.png',
"large_stamp-hos.png" = 'icons/paper_icons/large_stamp-hos.png',
"large_stamp-rd.png" = 'icons/paper_icons/large_stamp-rd.png',
"large_stamp-cap.png" = 'icons/paper_icons/large_stamp-cap.png',
"large_stamp-qm.png" = 'icons/paper_icons/large_stamp-qm.png',
"large_stamp-law.png" = 'icons/paper_icons/large_stamp-law.png',
"large_stamp-cent.png" = 'icons/paper_icons/large_stamp-cent.png',
"large_stamp-clown.png" = 'icons/paper_icons/large_stamp-clown.png',
"large_stamp-deny.png" = 'icons/paper_icons/large_stamp-deny.png',
"large_stamp-ok.png" = 'icons/paper_icons/large_stamp-ok.png',
"large_stamp-hop.png" = 'icons/paper_icons/large_stamp-hop.png',
"large_stamp-cmo.png" = 'icons/paper_icons/large_stamp-cmo.png',
"large_stamp-ce.png" = 'icons/paper_icons/large_stamp-ce.png',
"large_stamp-hos.png" = 'icons/paper_icons/large_stamp-hos.png',
"large_stamp-rd.png" = 'icons/paper_icons/large_stamp-rd.png',
"large_stamp-cap.png" = 'icons/paper_icons/large_stamp-cap.png',
"large_stamp-qm.png" = 'icons/paper_icons/large_stamp-qm.png',
"large_stamp-law.png" = 'icons/paper_icons/large_stamp-law.png',
"large_stamp-cent.png" = 'icons/paper_icons/large_stamp-cent.png',
"large_stamp-syndicate.png" = 'icons/paper_icons/large_stamp-syndicate.png',
"talisman.png" = 'icons/paper_icons/talisman.png',
"ntlogo.png" = 'icons/paper_icons/ntlogo.png'
"talisman.png" = 'icons/paper_icons/talisman.png',
"ntlogo.png" = 'icons/paper_icons/ntlogo.png'
)
/datum/asset/nanoui
@@ -209,8 +209,7 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
var/list/common_dirs = list(
"nano/assets/",
"nano/css/",
"nano/js/",
"nano/codemirror/",
"nano/images/",
"nano/layouts/"
)
+4 -2
View File
@@ -48,7 +48,7 @@
preload_rsc = 1 // This is 0 so we can set it to an URL once the player logs in and have them download the resources from a different server.
var/global/obj/screen/click_catcher/void
var/karma = 0
var/karma_spent = 0
var/karma_tab = 0
@@ -76,4 +76,6 @@
"off" = "borgmacro")
)
var/reset_stretch = 0 //Used by things that fiddle with client's stretch-to-fit.
var/reset_stretch = 0 //Used by things that fiddle with client's stretch-to-fit.
var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier
+3 -2
View File
@@ -29,11 +29,12 @@
#if defined(TOPIC_DEBUGGING)
world << "[src]'s Topic: [href] destined for [hsrc]."
#endif
if(href_list["nano_err"]) //nano throwing errors
world << "## NanoUI, Subject [src]: " + html_decode(href_list["nano_err"]) //NANO DEBUG HOOK
if(topic_debugging)
src << "## NanoUI: " + html_decode(href_list["nano_err"]) //NANO DEBUG HOOK
#endif
if(href_list["asset_cache_confirm_arrival"])
//src << "ASSET JOB [href_list["asset_cache_confirm_arrival"]] ARRIVED."
+81 -1
View File
@@ -97,6 +97,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/undershirt = "Nude" //undershirt type
var/socks = "Nude" //socks type
var/backbag = 2 //backpack type
var/ha_style = "None" //Head accessory style
var/r_headacc = 0 //Head accessory colour
var/g_headacc = 0 //Head accessory colour
var/b_headacc = 0 //Head accessory colour
var/m_style = "None" //Marking style
var/r_markings = 0 //Marking colour
var/g_markings = 0 //Marking colour
var/b_markings = 0 //Marking colour
var/h_style = "Bald" //Hair type
var/r_hair = 0 //Hair color
var/g_hair = 0 //Hair color
@@ -341,6 +349,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "[TextPreview(flavor_text)]...<br>"
dat += "<br>"
if((species in list("Unathi", "Vulpkanin", "Tajaran"))) //Species that have head accessories.
var/headaccessoryname = "Head Accessory"
if(species == "Unathi")
headaccessoryname = "Horns"
dat += "<br><b>[headaccessoryname]</b><br>"
dat += "<a href='?_src_=prefs;preference=headaccessory;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_headacc, 2)][num2hex(g_headacc, 2)][num2hex(b_headacc, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_headacc, 2)][num2hex(g_headacc, 2)][num2hex(b_headacc)]'><tr><td>__</td></tr></table></font> "
dat += "Style: <a href='?_src_=prefs;preference=ha_style;task=input'>[ha_style]</a><br>"
dat += "<br><b>Body Markings</b><br>"
dat += "<a href='?_src_=prefs;preference=markings;task=input'>Change Color</a> <font face='fixedsys' size='3' color='#[num2hex(r_markings, 2)][num2hex(g_markings, 2)][num2hex(b_markings, 2)]'><table style='display:inline;' bgcolor='#[num2hex(r_markings, 2)][num2hex(g_markings, 2)][num2hex(b_markings)]'><tr><td>__</td></tr></table></font> "
dat += "<br>Style: <a href='?_src_=prefs;preference=m_style;task=input'>[m_style]</a><br>"
var/hairname = "Hair"
if(species == "Machine")
hairname = "Frame Color"
@@ -1112,7 +1132,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
s_tone = 0
body_accessory = null //no vulpatail on humans damnit
ha_style = "None" // No Vulp ears on Unathi
m_style = "None" // No Unathi markings on Tajara
body_accessory = null //no vulptail on humans damnit
if("speciesprefs")//oldvox code
speciesprefs = !speciesprefs
@@ -1172,6 +1195,52 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(new_h_style)
h_style = new_h_style
if("headaccessory")
if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with head accessories
var/input = "Choose the colour of your your character's head accessory:"
var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null
if(new_head_accessory)
r_headacc = hex2num(copytext(new_head_accessory, 2, 4))
g_headacc = hex2num(copytext(new_head_accessory, 4, 6))
b_headacc = hex2num(copytext(new_head_accessory, 6, 8))
if("ha_style")
if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with head accessories
var/list/valid_head_accessory_styles = list()
for(var/head_accessory_style in head_accessory_styles_list)
var/datum/sprite_accessory/H = head_accessory_styles_list[head_accessory_style]
if( !(species in H.species_allowed))
continue
valid_head_accessory_styles[head_accessory_style] = head_accessory_styles_list[head_accessory_style]
var/new_head_accessory_style = input(user, "Choose the style of your character's head accessory:", "Character Preference") as null|anything in valid_head_accessory_styles
if(new_head_accessory_style)
ha_style = new_head_accessory_style
if("markings")
if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with markings
var/input = "Choose the colour of your your character's body markings:"
var/new_markings = input(user, input, "Character Preference", rgb(r_markings, g_markings, b_markings)) as color|null
if(new_markings)
r_markings = hex2num(copytext(new_markings, 2, 4))
g_markings = hex2num(copytext(new_markings, 4, 6))
b_markings = hex2num(copytext(new_markings, 6, 8))
if("m_style")
if((species in list("Unathi", "Vulpkanin", "Tajaran"))) // Species with markings
var/list/valid_markings = list()
for(var/markingstyle in marking_styles_list)
var/datum/sprite_accessory/M = marking_styles_list[markingstyle]
if( !(species in M.species_allowed))
continue
valid_markings[markingstyle] = marking_styles_list[markingstyle]
var/new_marking_style = input(user, "Choose the style of your character's body markings:", "Character Preference") as null|anything in valid_markings
if(new_marking_style)
m_style = new_marking_style
if("body_accessory")
var/list/possible_body_accessories = list()
if(check_rights(R_ADMIN, 1, user))
@@ -1597,6 +1666,17 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.undershirt = undershirt
character.socks = socks
if(character.species.bodyflags & HAS_HEAD_ACCESSORY)
character.r_headacc = r_headacc
character.g_headacc = g_headacc
character.b_headacc = b_headacc
character.ha_style = ha_style
if(character.species.bodyflags & HAS_MARKINGS)
character.r_markings = r_markings
character.g_markings = g_markings
character.b_markings = b_markings
character.m_style = m_style
if(body_accessory)
character.body_accessory = body_accessory_by_name["[body_accessory]"]
+72 -130
View File
@@ -35,8 +35,6 @@
randomslot = text2num(query.item[9])
volume = text2num(query.item[10])
old_roles_to_new(C)
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
// lastchangelog = sanitize_text(lastchangelog, initial(lastchangelog))
@@ -108,8 +106,16 @@
skin_red,
skin_green,
skin_blue,
markings_red,
markings_green,
markings_blue,
head_accessory_red,
head_accessory_green,
head_accessory_blue,
hair_style_name,
facial_style_name,
marking_style_name,
head_accessory_style_name,
eyes_red,
eyes_green,
eyes_blue,
@@ -170,47 +176,55 @@
r_skin = text2num(query.item[15])
g_skin = text2num(query.item[16])
b_skin = text2num(query.item[17])
h_style = query.item[18]
f_style = query.item[19]
r_eyes = text2num(query.item[20])
g_eyes = text2num(query.item[21])
b_eyes = text2num(query.item[22])
underwear = query.item[23]
undershirt = query.item[24]
backbag = text2num(query.item[25])
b_type = query.item[26]
r_markings = text2num(query.item[18])
g_markings = text2num(query.item[19])
b_markings = text2num(query.item[20])
r_headacc = text2num(query.item[21])
g_headacc = text2num(query.item[22])
b_headacc = text2num(query.item[23])
h_style = query.item[24]
f_style = query.item[25]
m_style = query.item[26]
ha_style = query.item[27]
r_eyes = text2num(query.item[28])
g_eyes = text2num(query.item[29])
b_eyes = text2num(query.item[30])
underwear = query.item[31]
undershirt = query.item[32]
backbag = text2num(query.item[33])
b_type = query.item[34]
//Jobs
alternate_option = text2num(query.item[27])
job_support_high = text2num(query.item[28])
job_support_med = text2num(query.item[29])
job_support_low = text2num(query.item[30])
job_medsci_high = text2num(query.item[31])
job_medsci_med = text2num(query.item[32])
job_medsci_low = text2num(query.item[33])
job_engsec_high = text2num(query.item[34])
job_engsec_med = text2num(query.item[35])
job_engsec_low = text2num(query.item[36])
job_karma_high = text2num(query.item[37])
job_karma_med = text2num(query.item[38])
job_karma_low = text2num(query.item[39])
alternate_option = text2num(query.item[35])
job_support_high = text2num(query.item[36])
job_support_med = text2num(query.item[37])
job_support_low = text2num(query.item[38])
job_medsci_high = text2num(query.item[39])
job_medsci_med = text2num(query.item[40])
job_medsci_low = text2num(query.item[41])
job_engsec_high = text2num(query.item[42])
job_engsec_med = text2num(query.item[43])
job_engsec_low = text2num(query.item[44])
job_karma_high = text2num(query.item[45])
job_karma_med = text2num(query.item[46])
job_karma_low = text2num(query.item[47])
//Miscellaneous
flavor_text = query.item[40]
med_record = query.item[41]
sec_record = query.item[42]
gen_record = query.item[43]
disabilities = text2num(query.item[44])
player_alt_titles = params2list(query.item[45])
organ_data = params2list(query.item[46])
rlimb_data = params2list(query.item[47])
nanotrasen_relation = query.item[48]
speciesprefs = text2num(query.item[49])
flavor_text = query.item[48]
med_record = query.item[49]
sec_record = query.item[50]
gen_record = query.item[51]
disabilities = text2num(query.item[52])
player_alt_titles = params2list(query.item[53])
organ_data = params2list(query.item[54])
rlimb_data = params2list(query.item[55])
nanotrasen_relation = query.item[56]
speciesprefs = text2num(query.item[57])
//socks
socks = query.item[50]
body_accessory = query.item[51]
socks = query.item[58]
body_accessory = query.item[59]
//Sanitize
metadata = sanitize_text(metadata, initial(metadata))
@@ -233,8 +247,16 @@
r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin))
g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin))
b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin))
r_markings = sanitize_integer(r_markings, 0, 255, initial(r_markings))
g_markings = sanitize_integer(g_markings, 0, 255, initial(g_markings))
b_markings = sanitize_integer(b_markings, 0, 255, initial(b_markings))
r_headacc = sanitize_integer(r_headacc, 0, 255, initial(r_headacc))
g_headacc = sanitize_integer(g_headacc, 0, 255, initial(g_headacc))
b_headacc = sanitize_integer(b_headacc, 0, 255, initial(b_headacc))
h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style))
f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style))
m_style = sanitize_inlist(m_style, marking_styles_list, initial(m_style))
ha_style = sanitize_inlist(ha_style, head_accessory_styles_list, initial(ha_style))
r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes))
g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes))
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
@@ -300,8 +322,16 @@
skin_red='[r_skin]',
skin_green='[g_skin]',
skin_blue='[b_skin]',
markings_red='[r_markings]',
markings_green='[g_markings]',
markings_blue='[b_markings]',
head_accessory_red='[r_headacc]',
head_accessory_green='[g_headacc]',
head_accessory_blue='[b_headacc]',
hair_style_name='[sql_sanitize_text(h_style)]',
facial_style_name='[sql_sanitize_text(f_style)]',
marking_style_name='[sql_sanitize_text(m_style)]',
head_accessory_style_name='[sql_sanitize_text(ha_style)]',
eyes_red='[r_eyes]',
eyes_green='[g_eyes]',
eyes_blue='[b_eyes]',
@@ -351,7 +381,9 @@
hair_red, hair_green, hair_blue,
facial_red, facial_green, facial_blue,
skin_tone, skin_red, skin_green, skin_blue,
hair_style_name, facial_style_name,
markings_red, markings_green, markings_blue,
head_accessory_red, head_accessory_green, head_accessory_blue,
hair_style_name, facial_style_name, marking_style_name, head_accessory_style_name,
eyes_red, eyes_green, eyes_blue,
underwear, undershirt,
backbag, b_type, alternate_option,
@@ -370,7 +402,9 @@
'[r_hair]', '[g_hair]', '[b_hair]',
'[r_facial]', '[g_facial]', '[b_facial]',
'[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]',
'[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]',
'[r_markings]', '[g_markings]', '[b_markings]',
'[r_headacc]', '[g_headacc]', '[b_headacc]',
'[sql_sanitize_text(h_style)]', '[sql_sanitize_text(f_style)]', '[sql_sanitize_text(m_style)]', '[sql_sanitize_text(ha_style)]',
'[r_eyes]', '[g_eyes]', '[b_eyes]',
'[underwear]', '[undershirt]',
'[backbag]', '[b_type]', '[alternate_option]',
@@ -393,98 +427,6 @@
return
return 1
// If you see this proc lying around and don't know why it's there, expunge it, as this is for a short-term DB update, starting 27/12/2015
// 0 on failed update, 1 on success
/datum/preferences/proc/old_roles_to_new(var/client/C)
var/DBQuery/query = dbcon.NewQuery({"
SELECT be_special
FROM [format_table_name("player")]
WHERE ckey='[C.ckey]'"})
if(!query.Execute())
return 0
var/old_be_special
while(query.NextRow())
old_be_special = text2num(query.item[1])
if(isnull(old_be_special))
message_admins("SQL NOTICE: be_special has been purged from the database, bug the coders.\n")
return 0
old_be_special = sanitize_integer(old_be_special, 0, 65535)
var/B_traitor = 1
var/B_operative = 2
var/B_changeling = 4
var/B_wizard = 8
var/B_malf = 16
var/B_rev = 32
var/B_alien = 64
var/B_pai = 128
var/B_cultist = 256
var/B_ninja = 512
var/B_raider = 1024
var/B_vampire = 2048
var/B_mutineer = 4096
var/B_blob = 8192
var/B_shadowling = 16384
var/B_revenant = 32768
var/list/archived = list(B_traitor,B_operative,B_changeling,B_wizard,B_malf,B_rev,B_alien,B_pai,B_cultist,B_ninja,B_raider,B_vampire,B_mutineer,B_blob,B_shadowling,B_revenant)
// meow meow I am the copy cat
for(var/flag in archived)
if(old_be_special & flag)
switch(flag)
// hello i am byond i think constant variables r dumm
if(1)
be_special |= ROLE_TRAITOR
if(2)
be_special |= ROLE_OPERATIVE
if(4)
be_special |= ROLE_CHANGELING
if(8)
be_special |= ROLE_WIZARD
if(16)
be_special |= ROLE_MALF
if(32)
be_special |= ROLE_REV
if(64)
be_special |= ROLE_ALIEN
be_special |= ROLE_SENTIENT
be_special |= ROLE_DEMON
be_special |= ROLE_BORER
if(128)
be_special |= ROLE_PAI
be_special |= ROLE_POSIBRAIN
be_special |= ROLE_GUARDIAN
if(256)
be_special |= ROLE_CULTIST
if(512)
be_special |= ROLE_NINJA
if(1024)
be_special |= ROLE_RAIDER
if(2048)
be_special |= ROLE_VAMPIRE
if(4096)
be_special |= ROLE_MUTINEER
if(8192)
be_special |= ROLE_BLOB
if(16384)
be_special |= ROLE_SHADOWLING
if(32768)
be_special |= ROLE_REVENANT
var/DBQuery/query2 = dbcon.NewQuery({"UPDATE [format_table_name("player")]
SET
be_role='[list2params(sql_sanitize_text_list(be_special))]'
WHERE ckey='[C.ckey]'"}
)
if(!query2.Execute())
var/err = query2.ErrorMsg()
log_game("SQL ERROR during saving player preferences. Error : \[[err]\]\n")
message_admins("SQL ERROR during saving player preferences. Error : \[[err]\]\n")
return
return 1
/*
/datum/preferences/proc/random_character(client/C)
var/DBQuery/query = dbcon.NewQuery("SELECT slot FROM [format_table_name("characters")] WHERE ckey='[C.ckey]' ORDER BY slot")
+7 -1
View File
@@ -24,15 +24,21 @@
flags = BLOCKHAIR
flags_inv = HIDEFACE
w_class = 2
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi'
)
/obj/item/clothing/mask/luchador/tecnicos
name = "Tecnicos Mask"
desc = "Worn by robust fighters who uphold justice and fight honorably."
icon_state = "luchador"
item_state = "luchador"
species_fit = list("Vox")
/obj/item/clothing/mask/luchador/rudos
name = "Rudos Mask"
desc = "Worn by robust fighters who are willing to do anything to win."
icon_state = "luchar"
item_state = "luchar"
item_state = "luchar"
species_fit = list("Vox")
+2
View File
@@ -25,6 +25,7 @@
flash_protect = 2
tint = 2
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
species_fit = list("Vox")
origin_tech = "materials=2;engineering=2"
action_button_name = "Toggle Welding Helmet"
@@ -207,6 +208,7 @@
var/safety = 1
ignore_maskadjust = 0
species_fit = list()
species_fit = list("Vox")
action_button_name = "HALT!"
/obj/item/clothing/mask/gas/sechailer/swat
+16 -1
View File
@@ -49,6 +49,10 @@
desc = "moustache is totally real."
icon_state = "fake-moustache"
flags_inv = HIDEFACE
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi'
)
/obj/item/clothing/mask/fakemoustache/verb/pontificate()
set name = "Pontificate Evilly"
@@ -171,6 +175,10 @@
ignore_maskadjust = 0
adjusted_flags = SLOT_HEAD
icon_state = "bandbotany"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi'
)
action_button_name = "Adjust Bandana"
/obj/item/clothing/mask/bandana/attack_self(var/mob/user)
@@ -179,30 +187,37 @@
obj/item/clothing/mask/bandana/red
name = "red bandana"
icon_state = "bandred"
species_fit = list("Vox")
obj/item/clothing/mask/bandana/blue
name = "blue bandana"
icon_state = "bandblue"
species_fit = list("Vox")
obj/item/clothing/mask/bandana/gold
name = "gold bandana"
icon_state = "bandgold"
species_fit = list("Vox")
obj/item/clothing/mask/bandana/green
name = "green bandana"
icon_state = "bandgreen"
species_fit = list("Vox")
/obj/item/clothing/mask/bandana/botany
name = "botany bandana"
desc = "It's a green bandana with some fine nanotech lining."
icon_state = "bandbotany"
species_fit = list("Vox")
/obj/item/clothing/mask/bandana/skull
name = "skull bandana"
desc = "It's a black bandana with a skull pattern."
icon_state = "bandskull"
species_fit = list("Vox")
/obj/item/clothing/mask/bandana/black
name = "black bandana"
desc = "It's a black bandana."
icon_state = "bandblack"
icon_state = "bandblack"
species_fit = list("Vox")
@@ -57,6 +57,16 @@
put_on_delay = 50
species_restricted = null
/obj/item/clothing/shoes/galoshes/dry
name = "absorbent galoshes"
desc = "A pair of purple rubber boots, designed to prevent slipping on wet surfaces while also drying them."
icon_state = "galoshes_dry"
/obj/item/clothing/shoes/galoshes/dry/step_action()
var/turf/simulated/t_loc = get_turf(src)
if(istype(t_loc) && t_loc.wet)
t_loc.MakeDry(TURF_WET_WATER)
/obj/item/clothing/shoes/clown_shoes
desc = "The prankster's standard-issue clowning shoes. Damn they're huge!"
name = "clown shoes"
@@ -66,6 +76,7 @@
item_color = "clown"
var/footstep = 1 //used for squeeks whilst walking
species_restricted = null
silence_steps = 1
/obj/item/clothing/shoes/clown_shoes/step_action(var/mob/living/carbon/human/H)
if(!istype(H)) return 0
@@ -88,6 +99,7 @@
strip_delay = 50
put_on_delay = 50
var/footstep = 1
silence_steps = 1
/obj/item/clothing/shoes/jackboots/step_action(var/mob/living/carbon/human/H)
if(!istype(H)) return 0
+3 -3
View File
@@ -7,7 +7,7 @@
/obj/item/toy/blink = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
/obj/item/toy/sword = 2,
/obj/item/toy/gun = 2,
/obj/item/weapon/gun/projectile/revolver/capgun = 2,
/obj/item/toy/crossbow = 2,
/obj/item/clothing/suit/syndicatefake = 2,
/obj/item/weapon/storage/fancy/crayons = 2,
@@ -28,8 +28,8 @@
if(computer && !computer.stat)
var/prizeselect = pickweight(prizes)
new prizeselect(computer.loc)
if(istype(prizeselect, /obj/item/toy/gun)) //Ammo comes with the gun
new /obj/item/toy/ammo/gun(computer.loc)
if(istype(prizeselect, /obj/item/weapon/gun/projectile/revolver/capgun)) //Ammo comes with the gun
new /obj/item/ammo_box/caps(computer.loc)
else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
new /obj/item/clothing/head/syndicatefake(computer.loc)
feedback_inc("arcade_win_normal")
+1 -1
View File
@@ -7,7 +7,7 @@
severity = rand(1, 3)
/datum/event/viral_infection/announce()
command_announcement.Announce("Confirmed outbreak of level five viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak5.ogg')
command_announcement.Announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
/datum/event/viral_infection/start()
var/list/candidates = list() //list of candidate keys
+1 -1
View File
@@ -7,7 +7,7 @@
severity = rand(2, 4)
/datum/event/viral_outbreak/announce()
command_announcement.Announce("Confirmed outbreak of level 7 viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
command_announcement.Announce("Confirmed outbreak of level 7 major viral biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
/datum/event/viral_outbreak/start()
var/list/candidates = list() //list of candidate keys
+3 -3
View File
@@ -178,7 +178,7 @@
fish_count = 0
for(var/fish in fish_list)
if(fish)
fish_count ++
fish_count++
//Check if the water level can support the current number of fish
if((fish_count * 50) > water_level)
@@ -196,7 +196,7 @@
if(fish_count >=2 && egg_count < max_fish) //Need at least 2 fish to breed, but won't breed if there are as many eggs as max_fish
if(food_level > 2 && filth_level <=5) //Breeding is going to use extra food, and the filth_level shouldn't be too high
if(prob(((fish_count - 2) * 5)+10)) //Chances increase with each additional fish, 10% base + 5% per additional fish
egg_count ++ //A new set of eggs were laid, increase egg_count
egg_count++ //A new set of eggs were laid, increase egg_count
egg_list.Add(select_egg_type()) //Add the new egg to the egg_list for storage
food_level -= 2 //Remove extra food for the breeding process
@@ -305,7 +305,7 @@
//Check if we were passed a fish type
if(type)
fish_list.Add("[type]") //Add a fish of the specified type
fish_count ++ //Increase fish_count to reflect the introduction of a fish, so the everything else works fine
fish_count++ //Increase fish_count to reflect the introduction of a fish, so the everything else works fine
//Announce the new fish
src.visible_message("A new [type] has hatched in \the [src]!")
//Null type fish are dud eggs, give a message to inform the player
+6
View File
@@ -33,6 +33,7 @@
// Mechanical concerns.
var/health = 0 // Plant health.
var/lastproduce = 0 // Last time tray was harvested
var/current_cycle = 0 // Used for tracking number of cycles for aging
var/lastcycle = 0 // Cycle timing/tracking var.
var/cycledelay = 150 // Delay per cycle.
var/closed_system // If set, the tray will attempt to take atmos from a pipe.
@@ -350,6 +351,7 @@
seed = null
dead = 0
age = 0
lastproduce = 0
sampled = 0
mutation_mod = 0
@@ -369,6 +371,7 @@
sampled = 0
age = 0
lastproduce = 0
yield_mod = 0
mutation_mod = 0
@@ -389,6 +392,7 @@
health = seed.get_trait(TRAIT_ENDURANCE)
lastcycle = world.time
harvest = 0
lastproduce = 0
weedlevel = 0
pestlevel = 0
sampled = 0
@@ -544,6 +548,7 @@
age = 0
health = seed.get_trait(TRAIT_ENDURANCE)
lastcycle = world.time
lastproduce = 0
harvest = 0
weedlevel = 0
@@ -705,6 +710,7 @@
seed = S.seed //Grab the seed datum.
dead = 0
age = 1
lastproduce = 0
//Snowflakey, maybe move this to the seed datum
health = (istype(S, /obj/item/seeds/cutting) ? round(seed.get_trait(TRAIT_ENDURANCE)/rand(2,5)) : seed.get_trait(TRAIT_ENDURANCE))
lastcycle = world.time
+12 -4
View File
@@ -19,7 +19,7 @@
// Weeds like water and nutrients, there's a chance the weed population will increase.
// Bonus chance if the tray is unoccupied.
if(waterlevel > 10 && nutrilevel > 2 && prob(isnull(seed) ? 5 : 1))
if(waterlevel > 10 && nutrilevel > 2 && prob(isnull(seed) ? 6 : 3))
weedlevel += 1 * HYDRO_SPEED_MULTIPLIER
// There's a chance for a weed explosion to happen if the weeds take over.
@@ -35,7 +35,10 @@
return
// Advance plant age.
if(prob(30)) age += 1 * HYDRO_SPEED_MULTIPLIER
current_cycle++
if(current_cycle == 3)
age += 1 * HYDRO_SPEED_MULTIPLIER
current_cycle = 0
//Highly mutable plants have a chance of mutating every tick.
if(seed.get_trait(TRAIT_IMMUTABLE) == -1)
@@ -107,6 +110,11 @@
health -= HYDRO_SPEED_MULTIPLIER
// Handle life and death.
// If the plant gets too old, begin killing it each cycle
var/lifespan = 5 * seed.get_trait(TRAIT_MATURATION)
if(age > lifespan)
health -= rand(5,10) * HYDRO_SPEED_MULTIPLIER
// When the plant dies, weeds thrive and pests die off.
check_health()
@@ -117,8 +125,8 @@
harvest = 1
lastproduce = age
if(prob(3)) // On each tick, there's a chance the pest population will increase
pestlevel += 0.1 * HYDRO_SPEED_MULTIPLIER
if(prob(5)) // On each tick, there's a chance the pest population will increase
pestlevel += 0.5 * HYDRO_SPEED_MULTIPLIER
// Some seeds will self-harvest if you don't keep a lid on them.
if(seed && seed.can_self_harvest && harvest && !closed_system && prob(5))
+1 -1
View File
@@ -160,7 +160,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(stat == DEAD)
ghostize(1)
else
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost, you won't be able to play this round for another 30 minutes! You can't change your mind so choose wisely!)","Are you sure you want to ghost?","Ghost","Stay in body")
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost now, you probably won't be able to rejoin the round! You can't change your mind, so choose wisely!)","Are you sure you want to ghost?","Ghost","Stay in body")
if(response != "Ghost") return //didn't want to ghost after-all
resting = 1
var/mob/dead/observer/ghost = ghostize(0) //0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3
@@ -207,7 +207,7 @@
var/damage = rand(1, 9)
if (prob(90))
if (HULK in M.mutations)//HULK SMASH
damage += 14
damage = 15
spawn(0)
Paralyse(1)
step_away(src,M,15)
@@ -87,7 +87,7 @@
/mob/living/carbon/alien/humanoid/update_fire()
overlays -= overlays_standing[X_FIRE_LAYER]
if(on_fire)
overlays_standing[X_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing", "layer"= -X_FIRE_LAYER)
overlays_standing[X_FIRE_LAYER] = image("icon"='icons/mob/OnFire.dmi', "icon_state"="Generic_mob_burning", "layer"= -X_FIRE_LAYER)
overlays += overlays_standing[X_FIRE_LAYER]
return
else
@@ -1,6 +1,6 @@
/obj/item/device/mmi/posibrain
name = "positronic brain"
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'on'."
icon = 'icons/obj/assemblies.dmi'
icon_state = "posibrain"
w_class = 3
@@ -12,6 +12,7 @@
var/list/ghost_volunteers[0]
req_access = list(access_robotics)
mecha = null//This does not appear to be used outside of reference in mecha.dm.
var/silenced = 0 //if set to 1, they can't talk.
/obj/item/device/mmi/posibrain/attack_self(mob/user as mob)
@@ -28,6 +29,19 @@
if(check_observer(O))
transfer_personality(O)
reset_search()
else
if(silenced)
silenced = 0
user << "<span class='notice'>You toggle the speaker to 'on', on the [src].</span>"
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'on'."
if(brainmob && brainmob.key)
brainmob << "<span class='warning'>Your internal speaker has been toggled to 'on'.</span>"
else
silenced = 1
user << "<span class='notice'>You toggle the speaker to 'off', on the [src].</span>"
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'off'."
if(brainmob && brainmob.key)
brainmob << "<span class='warning'>Your internal speaker has been toggled to 'off'.</span>"
/obj/item/device/mmi/posibrain/proc/request_player()
for(var/mob/dead/observer/O in player_list)
@@ -169,7 +183,6 @@
src.brainmob.real_name = src.brainmob.name
src.brainmob.loc = src
src.brainmob.container = src
src.brainmob.robot_talk_understand = 1
src.brainmob.stat = 0
src.brainmob.silent = 0
src.brainmob.brain_op_stage = 4.0
@@ -184,3 +197,7 @@
var/turf/T = get_turf_or_move(src.loc)
for (var/mob/M in viewers(T))
M.show_message("\blue The positronic brain pings softly.")
/obj/item/device/mmi/posibrain/ipc
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves. The speaker switch is set to 'off'."
silenced = 1
+6 -10
View File
@@ -3,9 +3,14 @@
if (silent)
return
if(!(container && (istype(container, /obj/item/device/mmi) || istype(container, /obj/item/device/mmi/posibrain))))
if(!(container && istype(container, /obj/item/device/mmi)))
return //No MMI, can't speak, bucko./N
else
if(container && istype(container, /obj/item/device/mmi/posibrain))
var/obj/item/device/mmi/posibrain/P = container
if(P && P.silenced)
usr << "<span class='warning'>You cannot speak, as your internal speaker has been toggled to 'off'.</span>"
return
if(prob(emp_damage*4))
if(prob(10))//10% chane to drop the message entirely
return
@@ -14,15 +19,6 @@
..(message)
/mob/living/carbon/brain/can_speak(var/datum/language/speaking)
if(speaking == all_languages["Robot Talk"] && (container && istype(container, /obj/item/device/mmi/posibrain))) //so posibrains can speak binary; less messy than adding the language
return 1
else return ..()
/mob/living/carbon/brain/binarycheck()
return (container && istype(container, /obj/item/device/mmi/posibrain))
/mob/living/carbon/brain/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name)
switch(message_mode)
if("headset")
@@ -54,7 +54,7 @@
f_style = facial_hair_style
update_hair()
update_fhair()
return 1
/mob/living/carbon/human/proc/reset_hair()
@@ -74,6 +74,7 @@
f_style = "Shaved"
update_hair()
update_fhair()
/mob/living/carbon/human/proc/change_eye_color(var/red, var/green, var/blue)
if(red == r_eyes && green == g_eyes && blue == b_eyes)
@@ -106,7 +107,7 @@
g_facial = green
b_facial = blue
update_hair()
update_fhair()
return 1
/mob/living/carbon/human/proc/change_skin_color(var/red, var/green, var/blue)
@@ -91,6 +91,8 @@ var/global/list/body_accessory_by_species = list("None" = null)
icon = 'icons/mob/body_accessory.dmi'
animated_icon = 'icons/mob/body_accessory.dmi'
blend_mode = ICON_ADD
icon_state = "null"
animated_icon_state = "null"
/datum/body_accessory/tail/try_restrictions(var/mob/living/carbon/human/H)
if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL) && !istype(H.wear_suit, /obj/item/clothing/suit/space))
@@ -98,7 +100,7 @@ var/global/list/body_accessory_by_species = list("None" = null)
return 0
//vulpakin
//Vulpkanin
/datum/body_accessory/tail/vulpkanin_2
name = "Vulpkanin Alt 1 (Bushy)"
@@ -125,4 +127,4 @@ var/global/list/body_accessory_by_species = list("None" = null)
icon_state = "vulptail5"
animated_icon_state = "vulptail5_a"
allowed_species = list("Vulpkanin")
allowed_species = list("Vulpkanin")
@@ -150,6 +150,7 @@
f_style = "Shaved"
if(h_style)
h_style = "Bald"
update_fhair(0)
update_hair(0)
mutations.Add(SKELETON)
@@ -166,6 +167,7 @@
f_style = "Shaved" //we only change the icon_state of the hair datum, so it doesn't mess up their UI/UE
if(h_style)
h_style = "Bald"
update_fhair(0)
update_hair(0)
mutations.Add(HUSK)
@@ -189,7 +189,7 @@
if ("choke")
if(miming)
message = "<B>[src]</B> clutches his throat desperately!"
message = "<B>[src]</B> clutches \his throat desperately!"
m_type = 1
else
if (!muzzled)
@@ -218,7 +218,7 @@
m_type = 1
if ("flap")
if (!src.restrained())
message = "<B>[src]</B> flaps his wings."
message = "<B>[src]</B> flaps \his wings."
m_type = 2
if(miming)
m_type = 1
@@ -250,7 +250,7 @@
if ("aflap")
if (!src.restrained())
message = "<B>[src]</B> flaps his wings ANGRILY!"
message = "<B>[src]</B> flaps \his wings ANGRILY!"
m_type = 2
if(miming)
m_type = 1
@@ -485,7 +485,7 @@
message = "<B>[src]</B> takes a drag from a cigarette and blows \"[M]\" out in smoke."
m_type = 1
else
message = "<B>[src]</B> says, \"[M], please. He had a family.\" [src.name] takes a drag from a cigarette and blows his name out in smoke."
message = "<B>[src]</B> says, \"[M], please. They had a family.\" [src.name] takes a drag from a cigarette and blows their name out in smoke."
m_type = 2
if ("point")
+90 -5
View File
@@ -18,9 +18,9 @@
if(!species)
if(new_species)
set_species(new_species, 1)
set_species(new_species, 1, delay_icon_update = 1)
else
set_species()
set_species(delay_icon_update = 1)
if(species)
name = species.get_random_name(gender)
@@ -69,7 +69,7 @@
..(new_loc, "Skrell")
/mob/living/carbon/human/tajaran/New(var/new_loc)
h_style = "Tajaran Ears"
ha_style = "Tajaran Ears"
..(new_loc, "Tajaran")
/mob/living/carbon/human/vulpkanin/New(var/new_loc)
@@ -1467,7 +1467,7 @@
else
usr << "\blue [self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)]."
/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour)
/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0)
var/datum/species/oldspecies = species
if(!dna)
@@ -1538,7 +1538,8 @@
regenerate_icons()
fixblood()
UpdateAppearance()
if(!delay_icon_update)
UpdateAppearance()
if(species)
return 1
@@ -1873,3 +1874,87 @@
for(var/obj/item/clothing/C in src) //If they have some clothing equipped that lets them see reagents, they can see reagents
if(C.scan_reagents)
return 1
// ugh this is so hackish
// but why don't we have a proc for this already
/proc/create_human_for_client_from_prefs(var/client/C)
var/turf/start = pick(latejoin)
var/mob/living/carbon/human/new_character
var/datum/species/chosen_species
if(C.prefs.species)
chosen_species = all_species[C.prefs.species]
if(chosen_species)
// Have to recheck admin due to no usr at roundstart. Latejoins are fine though.
if(is_alien_whitelisted(C, chosen_species) || check_rights_for(C, R_ADMIN))
new_character = new(start, C.prefs.species)
if(!new_character)
new_character = new(start)
new_character.lastarea = get_area(start)
var/datum/language/chosen_language
if(C.prefs.language)
chosen_language = all_languages[C.prefs.language]
if(chosen_language)
if(is_alien_whitelisted(C, C.prefs.language) || !config.usealienwhitelist || !(chosen_language.flags & WHITELISTED))
new_character.add_language(C.prefs.language)
if(ticker.random_players || appearance_isbanned(new_character))
C.prefs.random_character()
C.prefs.real_name = random_name(new_character.gender)
C.prefs.copy_to(new_character)
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS cant last forever yo
var/datum/mind/M = new/datum/mind(C.key)
M.active = 0
M.original = new_character
M.current = new_character
M.transfer_to(new_character) //won't transfer key since the mind is not active
new_character.name = C.prefs.real_name
new_character.dna.ready_dna(new_character)
new_character.dna.b_type = C.prefs.b_type
if(C.prefs.disabilities & DISABILITY_FLAG_NEARSIGHTED)
new_character.dna.SetSEState(GLASSESBLOCK,1,1)
new_character.disabilities |= NEARSIGHTED
if(C.prefs.disabilities & DISABILITY_FLAG_FAT)
new_character.mutations += FAT
new_character.overeatduration = 600 // Max overeat
if(C.prefs.disabilities & DISABILITY_FLAG_EPILEPTIC)
new_character.dna.SetSEState(EPILEPSYBLOCK,1,1)
new_character.disabilities |= EPILEPSY
if(C.prefs.disabilities & DISABILITY_FLAG_DEAF)
new_character.dna.SetSEState(DEAFBLOCK,1,1)
new_character.sdisabilities |= DEAF
if(C.prefs.disabilities & DISABILITY_FLAG_BLIND)
new_character.dna.SetSEState(BLINDBLOCK,1,1)
new_character.sdisabilities |= BLIND
if(C.prefs.disabilities & DISABILITY_FLAG_MUTE)
new_character.dna.SetSEState(MUTEBLOCK,1,1)
new_character.sdisabilities |= MUTE
chosen_species.handle_dna(new_character)
domutcheck(new_character)
new_character.dna.UpdateSE()
new_character.sync_organ_dna() //just fucking incase I guess
// Do the initial caching of the player's body icons.
new_character.force_update_limbs()
new_character.update_eyes()
new_character.regenerate_icons()
new_character.key = C.key //Manually transfer the key to log them in
return new_character
@@ -151,8 +151,7 @@
var/armor_block = run_armor_check(affecting, "melee")
if(HULK in M.mutations)
damage += 5
Weaken(4)
adjustBruteLoss(15)
playsound(loc, attack.attack_sound, 25, 1, -1)
@@ -142,7 +142,7 @@
/mob/living/carbon/human/adjustCloneLoss(var/amount)
..()
if(species.flags & (NO_SCAN))
if(species.flags & (NO_DNA_RAD))
cloneloss = 0
return
@@ -291,17 +291,22 @@
var/update = 0
while(parts.len && (brute>0 || burn>0) )
var/obj/item/organ/external/picked = pick(parts)
var/brute_per_part = brute/parts.len
var/burn_per_part = burn/parts.len
var/brute_was = picked.brute_dam
var/burn_was = picked.burn_dam
update |= picked.take_damage(brute,burn,sharp,edge,used_weapon)
update |= picked.take_damage(brute_per_part,burn_per_part,sharp,edge,used_weapon)
brute -= (picked.brute_dam - brute_was)
burn -= (picked.burn_dam - burn_was)
parts -= picked
updatehealth()
if(update)
UpdateDamageIcon()
@@ -1,12 +1,25 @@
/mob/living/carbon/human
hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,SPECIALROLE_HUD,NATIONS_HUD)
//Marking colour and style
var/r_markings = 0
var/g_markings = 0
var/b_markings = 0
var/m_style = "None"
//Hair colour and style
var/r_hair = 0
var/g_hair = 0
var/b_hair = 0
var/h_style = "Bald"
//Head accessory colour and style
var/r_headacc = 0
var/g_headacc = 0
var/b_headacc = 0
var/ha_style = "None"
//Facial hair colour and style
var/r_facial = 0
var/g_facial = 0
@@ -47,8 +47,6 @@
if(RUN in mutations)
tally = -1
if(HULK in mutations)
tally += 1
if(status_flags & IGNORESLOWDOWN) // make sure this is always at the end so we don't have ignore slowdown getting ignored itself
tally = -1
@@ -143,6 +143,7 @@
head = null
if(I.flags & BLOCKHAIR || I.flags & BLOCKHEADHAIR)
update_hair() //rebuild hair
update_fhair()
update_inv_head()
else if(I == r_ear)
r_ear = null
@@ -160,6 +161,7 @@
wear_mask = null
if(I.flags & BLOCKHAIR || I.flags & BLOCKHEADHAIR)
update_hair() //rebuild hair
update_fhair()
if(internal)
if(internals)
internals.icon_state = "internal0"
@@ -827,10 +827,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
. = ..()
//SSD check, if a logged player is awake put them back to sleep!
if(player_logged && sleeping < 2)
sleeping = 2
if(.) //alive
if(REGEN in mutations)
if(nutrition)
@@ -865,11 +861,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
else if(sleeping)
speech_problem_flag = 1
if(mind)
//Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of ether or similar.
if(player_logged)
sleeping = max(sleeping - 1, 2)
blinded = 1
stat = UNCONSCIOUS
+3 -2
View File
@@ -150,8 +150,9 @@
/mob/living/carbon/human/handle_message_mode(var/message_mode, var/message, var/verb, var/speaking, var/used_radios, var/alt_name)
switch(message_mode)
if("intercom")
for(var/obj/item/device/radio/intercom/I in view(1, null))
I.talk_into(src, message, verb, speaking)
for(var/obj/item/device/radio/intercom/I in view(1, src))
spawn(0)
I.talk_into(src, message, null, verb, speaking)
used_radios += I
if("headset")
@@ -24,8 +24,6 @@
return message
/datum/species/plasmaman/equip(var/mob/living/carbon/human/H)
H.fire_sprite = "Plasmaman"
// Unequip existing suits and hats.
H.unEquip(H.wear_suit)
H.unEquip(H.head)
@@ -40,7 +40,7 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_CLAWS | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_CARN
cold_level_1 = 280 //Default 260 - Lower is better
@@ -95,7 +95,7 @@
flags = HAS_LIPS | CAN_BE_FAT
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
flesh_color = "#AFA59E"
@@ -111,7 +111,7 @@
/datum/species/vulpkanin
name = "Vulpkanin"
name_plural = "Vulpakanin"
name_plural = "Vulpkanin"
icobase = 'icons/mob/human_races/r_vulpkanin.dmi'
deform = 'icons/mob/human_races/r_vulpkanin.dmi'
path = /mob/living/carbon/human/vulpkanin
@@ -130,11 +130,11 @@
flags = HAS_LIPS
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = FEET_PADDED | HAS_TAIL | HAS_SKIN_COLOR | TAIL_WAGGING
bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
flesh_color = "#966464"
base_color = "#BE8264"
base_color = "#B43214"
/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
@@ -173,6 +173,7 @@
default_language = "Galactic Common"
language = "Vox-pidgin"
tail = "voxtail"
speech_sounds = list('sound/voice/shriek1.ogg')
speech_chance = 20
unarmed_type = /datum/unarmed_attack/claws //I dont think it will hurt to give vox claws too.
@@ -199,12 +200,16 @@
flags = NO_SCAN | IS_WHITELISTED
clothing_flags = HAS_SOCKS
dietflags = DIET_OMNI
bodyflags = HAS_TAIL | TAIL_WAGGING
blood_color = "#2299FC"
flesh_color = "#808D11"
reagent_tag = PROCESS_ORG
/datum/species/vox/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
/datum/species/vox/makeName(var/gender,var/mob/living/carbon/human/H=null)
var/sounds = rand(2,8)
var/i = 0
+13 -9
View File
@@ -295,15 +295,6 @@
CheckStamina()
if(sleeping)
handle_dreams()
adjustStaminaLoss(-10)
sleeping = max(sleeping - 1, 0)
if(prob(10) && health && !hal_crit)
spawn(0)
emote("snore")
var/restingpwr = 1 + 4 * resting
//Dizziness
@@ -375,6 +366,19 @@
else
hallucination -= 2
/mob/living/carbon/handle_sleeping()
if(..())
handle_dreams()
adjustStaminaLoss(-10)
if(prob(10) && health && !hal_crit)
spawn(0)
emote("snore")
// Keep SSD people asleep
if(player_logged && sleeping < 2)
sleeping = 2
return sleeping
//this handles hud updates. Calls update_vision() and handle_hud_icons()
/mob/living/carbon/handle_regular_hud_updates()
if(!client) return 0
@@ -1,29 +1,29 @@
/mob/living/carbon/slime/death(gibbed)
if(!gibbed)
if(is_adult)
var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc)
M.colour = colour
M.rabid = 1
is_adult = 0
maxHealth = 150
revive()
regenerate_icons()
number = rand(1, 1000)
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
return
if(stat == DEAD) return
stat = DEAD
icon_state = "[colour] baby slime dead"
overlays.len = 0
for(var/mob/O in viewers(src, null))
O.show_message("<b>The [name]</b> seizes up and falls limp...", 1) //ded -- Urist
update_canmove()
if(blind)
blind.layer = 0
if(ticker && ticker.mode)
ticker.mode.check_win()
/mob/living/carbon/slime/death(gibbed)
if(!gibbed)
if(is_adult)
var/mob/living/carbon/slime/M = new /mob/living/carbon/slime(loc)
M.colour = colour
M.rabid = 1
is_adult = 0
maxHealth = 150
revive()
regenerate_icons()
number = rand(1, 1000)
name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])"
return
if(stat == DEAD) return
stat = DEAD
icon_state = "[colour] baby slime dead"
overlays.len = 0
for(var/mob/O in viewers(src, null))
O.show_message("<b>The [name]</b> seizes up and falls limp...", 1) //ded -- Urist
update_canmove()
if(blind)
blind.layer = 0
if(ticker && ticker.mode)
ticker.mode.check_win()
return ..(gibbed)
@@ -1,74 +1,74 @@
/mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null)
if (findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
//param = copytext(act, t1 + 1, length(act) + 1)
act = copytext(act, 1, t1)
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
switch(act) //Alphabetical please
if ("me")
if(silent)
return
if (src.client)
if (client.prefs.muted & MUTE_IC)
src << "\red You cannot send IC messages (muted)."
return
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
if (stat)
return
if(!(message))
return
return custom_emote(m_type, message)
if("bounce")
message = "<B>The [src.name]</B> bounces in place."
m_type = 1
if ("custom")
return custom_emote(m_type, message)
if("jiggle")
message = "<B>The [src.name]</B> jiggles!"
m_type = 1
if("light")
message = "<B>The [src.name]</B> lights up for a bit, then stops."
m_type = 1
if("moan")
message = "<B>The [src.name]</B> moans."
m_type = 2
if("shiver")
message = "<B>The [src.name]</B> shivers."
m_type = 2
if("sway")
message = "<B>The [src.name]</B> sways around dizzily."
m_type = 1
if("twitch")
message = "<B>The [src.name]</B> twitches."
m_type = 1
if("vibrate")
message = "<B>The [src.name]</B> vibrates!"
m_type = 1
if ("help") //This is an exception
src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate"
else
src << "\blue Unusable emote '[act]'. Say *help for a list."
if ((message && src.stat == 0))
if (m_type & 1)
for(var/mob/O in viewers(src, null))
O.show_message(message, m_type)
//Foreach goto(703)
else
for(var/mob/O in hearers(src, null))
O.show_message(message, m_type)
//Foreach goto(746)
/mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null)
if (findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
//param = copytext(act, t1 + 1, length(act) + 1)
act = copytext(act, 1, t1)
if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_'
act = copytext(act,1,length(act))
switch(act) //Alphabetical please
if ("me")
if(silent)
return
if (src.client)
if (client.prefs.muted & MUTE_IC)
src << "\red You cannot send IC messages (muted)."
return
if (src.client.handle_spam_prevention(message,MUTE_IC))
return
if (stat)
return
if(!(message))
return
return custom_emote(m_type, message)
if("bounce")
message = "<B>The [src.name]</B> bounces in place."
m_type = 1
if ("custom")
return custom_emote(m_type, message)
if("jiggle")
message = "<B>The [src.name]</B> jiggles!"
m_type = 1
if("light")
message = "<B>The [src.name]</B> lights up for a bit, then stops."
m_type = 1
if("moan")
message = "<B>The [src.name]</B> moans."
m_type = 2
if("shiver")
message = "<B>The [src.name]</B> shivers."
m_type = 2
if("sway")
message = "<B>The [src.name]</B> sways around dizzily."
m_type = 1
if("twitch")
message = "<B>The [src.name]</B> twitches."
m_type = 1
if("vibrate")
message = "<B>The [src.name]</B> vibrates!"
m_type = 1
if ("help") //This is an exception
src << "Help for slime emotes. You can use these emotes with say \"*emote\":\n\nbounce, custom, jiggle, light, moan, shiver, sway, twitch, vibrate"
else
src << "\blue Unusable emote '[act]'. Say *help for a list."
if ((message && src.stat == 0))
if (m_type & 1)
for(var/mob/O in viewers(src, null))
O.show_message(message, m_type)
//Foreach goto(703)
else
for(var/mob/O in hearers(src, null))
O.show_message(message, m_type)
//Foreach goto(746)
return
@@ -1,44 +1,44 @@
/mob/living/carbon/slime/examine(mob/user)
..(user)
var/msg = ""
if (src.stat == DEAD)
msg += "<span class='deadsay'>It is limp and unresponsive.</span>\n"
else
if (src.getBruteLoss())
msg += "<span class='warning'>"
if (src.getBruteLoss() < 40)
msg += "It has some punctures in its flesh!"
else
msg += "<B>It has severe punctures and tears in its flesh!</B>"
msg += "</span>\n"
switch(powerlevel)
if(2 to 3)
msg += "It is flickering gently with a little electrical activity.\n"
if(4 to 5)
msg += "It is glowing gently with moderate levels of electrical activity.\n"
if(6 to 9)
msg += "<span class='warning'>It is glowing brightly with high levels of electrical activity.</span>\n"
if(10)
msg += "<span class='warning'><B>It is radiating with massive levels of electrical activity!</B></span>\n"
msg += "<span class='warning'>"
switch(wetlevel)
if(1)
msg += "It looks a bit damp.\n"
if(2)
msg += "It looks a little bit wet.\n"
if(3)
msg += "It looks wet.\n"
if(4)
msg += "It looks very wet.\n"
if(5)
msg += "It looks absolutely soaked.\n"
msg += "</span>"
msg += "*---------*</span>"
/mob/living/carbon/slime/examine(mob/user)
..(user)
var/msg = ""
if (src.stat == DEAD)
msg += "<span class='deadsay'>It is limp and unresponsive.</span>\n"
else
if (src.getBruteLoss())
msg += "<span class='warning'>"
if (src.getBruteLoss() < 40)
msg += "It has some punctures in its flesh!"
else
msg += "<B>It has severe punctures and tears in its flesh!</B>"
msg += "</span>\n"
switch(powerlevel)
if(2 to 3)
msg += "It is flickering gently with a little electrical activity.\n"
if(4 to 5)
msg += "It is glowing gently with moderate levels of electrical activity.\n"
if(6 to 9)
msg += "<span class='warning'>It is glowing brightly with high levels of electrical activity.</span>\n"
if(10)
msg += "<span class='warning'><B>It is radiating with massive levels of electrical activity!</B></span>\n"
msg += "<span class='warning'>"
switch(wetlevel)
if(1)
msg += "It looks a bit damp.\n"
if(2)
msg += "It looks a little bit wet.\n"
if(3)
msg += "It looks wet.\n"
if(4)
msg += "It looks very wet.\n"
if(5)
msg += "It looks absolutely soaked.\n"
msg += "</span>"
msg += "*---------*</span>"
user << msg
@@ -1,4 +1,4 @@
/mob/living/carbon/slime/Login()
..()
update_hud()
return
/mob/living/carbon/slime/Login()
..()
update_hud()
return
@@ -1,228 +1,228 @@
/mob/living/carbon/slime/verb/Feed()
set category = "Slime"
set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process."
if(Victim)
Feedstop()
return
if(stat)
src << "<i>I must be conscious to do this...</i>"
return
var/list/choices = list()
for(var/mob/living/C in view(1,src))
if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C))
choices += C
var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices
if(!M) return
if(Adjacent(M))
if(!istype(src, /mob/living/carbon/brain))
if(!istype(M, /mob/living/carbon/slime))
if(stat != 2)
if(health > -70)
for(var/mob/living/carbon/slime/met in view())
if(met.Victim == M && met != src)
src << "<i>The [met.name] is already feeding on this subject...</i>"
return
src << "\blue <i>I have latched onto the subject and begun feeding...</i>"
M << "\red <b>The [src.name] has latched onto your head!</b>"
Feedon(M)
else
src << "<i>This subject does not have a strong enough life energy...</i>"
else
src << "<i>This subject does not have an edible life energy...</i>"
else
src << "<i>I must not feed on my brothers...</i>"
else
src << "<i>This subject does not have an edible life energy...</i>"
/mob/living/carbon/slime/proc/Feedon(var/mob/living/M)
Victim = M
src.loc = M.loc
canmove = 0
anchored = 1
var/lastnut = nutrition
var/fed_succesfully = 0
if(is_adult)
icon_state = "[colour] adult slime eat"
else
icon_state = "[colour] baby slime eat"
while(Victim && M.health > -70 && M.stat != DEAD && stat != DEAD)
canmove = 0
if(Adjacent(M))
loc = M.loc
if(prob(15) && M.client && istype(M, /mob/living/carbon))
M << "<span class='danger'>[pick("You can feel your body becoming weak!", \
"You feel like you're about to die!", \
"You feel every part of your body screaming in agony!", \
"A low, rolling pain passes through your body!", \
"Your body feels as if it's falling apart!", \
"You feel extremely weak!", \
"A sharp, deep pain bathes every inch of your body!")]</span>"
if(istype(M, /mob/living/carbon))
Victim.adjustCloneLoss(rand(5,6))
Victim.adjustToxLoss(rand(1,2))
if(Victim.health <= 0)
Victim.adjustToxLoss(rand(2,4))
fed_succesfully = 1
else if(istype(M, /mob/living/simple_animal))
Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12))
fed_succesfully = 1
else
if(prob(25))
src << "<span class='warning'>[pick("This subject is incompatable", \
"This subject does not have a life energy", "This subject is empty", \
"I am not satisified", "I can not feed from this subject", \
"I do not feel nourished", "This subject is not food")]...</span>"
if(fed_succesfully)
//I have no idea why this is not in handle_nutrition()
nutrition += rand(15,30)
if(nutrition >= lastnut + 50)
if(prob(80))
lastnut = nutrition
powerlevel++
if(powerlevel > 10)
powerlevel = 10
adjustToxLoss(-10)
//Heal yourself.
adjustOxyLoss(-10)
adjustBruteLoss(-10)
adjustFireLoss(-10)
adjustCloneLoss(-10)
updatehealth()
if(Victim)
Victim.updatehealth()
sleep(rand(15,45))
else
break
if(stat == 2)
if(!is_adult)
icon_state = "[colour] baby slime dead"
else
if(is_adult)
icon_state = "[colour] adult slime"
else
icon_state = "[colour] baby slime"
canmove = 1
anchored = 0
if(M)
if(M.health <= -70)
M.canmove = 0
if(!client)
if(Victim && !rabid && !attacked)
if(Victim.LAssailant && Victim.LAssailant != Victim)
if(prob(50))
if(!(Victim.LAssailant in Friends))
Friends[Victim.LAssailant] = 1
//Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator
else
++Friends[Victim.LAssailant]
if(M.client && istype(src, /mob/living/carbon/human))
if(prob(85))
rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU
if(client) src << "<i>This subject does not have a strong enough life energy anymore...</i>"
else
M.canmove = 1
if(client) src << "<i>I have stopped feeding...</i>"
else
if(client) src << "<i>I have stopped feeding...</i>"
Victim = null
/mob/living/carbon/slime/proc/Feedstop()
if(Victim)
if(Victim.client) Victim << "[src] has let go of your head!"
Victim = null
/mob/living/carbon/slime/proc/UpdateFeed(var/mob/M)
if(Victim)
if(Victim == M)
loc = M.loc // simple "attach to head" effect!
/mob/living/carbon/slime/verb/Evolve()
set category = "Slime"
set desc = "This will let you evolve from baby to adult slime."
if(stat)
src << "<i>I must be conscious to do this...</i>"
return
if(!is_adult)
if(amount_grown >= 10)
is_adult = 1
maxHealth = 200
amount_grown = 0
regenerate_icons()
name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])")
else
src << "<i>I am not ready to evolve yet...</i>"
else
src << "<i>I have already evolved...</i>"
/mob/living/carbon/slime/verb/Reproduce()
set category = "Slime"
set desc = "This will make you split into four Slimes."
if(stat)
src << "<i>I must be conscious to do this...</i>"
return
if(is_adult)
if(amount_grown >= 10)
if(stat)
src << "<i>I must be conscious to do this...</i>"
return
var/list/babies = list()
var/new_nutrition = round(nutrition * 0.9)
var/new_powerlevel = round(powerlevel / 4)
for(var/i=1,i<=4,i++)
var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc)
if(prob(mutation_chance))
M.colour = slime_mutation[rand(1,4)]
else
M.colour = colour
if(ckey) M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature!
M.powerlevel = new_powerlevel
if(i != 1) step_away(M,src)
M.Friends = Friends.Copy()
babies += M
feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]")
var/mob/living/carbon/slime/new_slime = pick(babies)
new_slime.universal_speak = universal_speak
if(src.mind)
src.mind.transfer_to(new_slime)
else
new_slime.key = src.key
qdel(src)
else
src << "<i>I am not ready to reproduce yet...</i>"
else
/mob/living/carbon/slime/verb/Feed()
set category = "Slime"
set desc = "This will let you feed on any valid creature in the surrounding area. This should also be used to halt the feeding process."
if(Victim)
Feedstop()
return
if(stat)
src << "<i>I must be conscious to do this...</i>"
return
var/list/choices = list()
for(var/mob/living/C in view(1,src))
if(C!=src && !istype(C,/mob/living/carbon/slime) && Adjacent(C))
choices += C
var/mob/living/M = input(src,"Who do you wish to feed on?") in null|choices
if(!M) return
if(Adjacent(M))
if(!istype(src, /mob/living/carbon/brain))
if(!istype(M, /mob/living/carbon/slime))
if(stat != 2)
if(health > -70)
for(var/mob/living/carbon/slime/met in view())
if(met.Victim == M && met != src)
src << "<i>The [met.name] is already feeding on this subject...</i>"
return
src << "\blue <i>I have latched onto the subject and begun feeding...</i>"
M << "\red <b>The [src.name] has latched onto your head!</b>"
Feedon(M)
else
src << "<i>This subject does not have a strong enough life energy...</i>"
else
src << "<i>This subject does not have an edible life energy...</i>"
else
src << "<i>I must not feed on my brothers...</i>"
else
src << "<i>This subject does not have an edible life energy...</i>"
/mob/living/carbon/slime/proc/Feedon(var/mob/living/M)
Victim = M
src.loc = M.loc
canmove = 0
anchored = 1
var/lastnut = nutrition
var/fed_succesfully = 0
if(is_adult)
icon_state = "[colour] adult slime eat"
else
icon_state = "[colour] baby slime eat"
while(Victim && M.health > -70 && M.stat != DEAD && stat != DEAD)
canmove = 0
if(Adjacent(M))
loc = M.loc
if(prob(15) && M.client && istype(M, /mob/living/carbon))
M << "<span class='danger'>[pick("You can feel your body becoming weak!", \
"You feel like you're about to die!", \
"You feel every part of your body screaming in agony!", \
"A low, rolling pain passes through your body!", \
"Your body feels as if it's falling apart!", \
"You feel extremely weak!", \
"A sharp, deep pain bathes every inch of your body!")]</span>"
if(istype(M, /mob/living/carbon))
Victim.adjustCloneLoss(rand(5,6))
Victim.adjustToxLoss(rand(1,2))
if(Victim.health <= 0)
Victim.adjustToxLoss(rand(2,4))
fed_succesfully = 1
else if(istype(M, /mob/living/simple_animal))
Victim.adjustBruteLoss(is_adult ? rand(7, 15) : rand(4, 12))
fed_succesfully = 1
else
if(prob(25))
src << "<span class='warning'>[pick("This subject is incompatable", \
"This subject does not have a life energy", "This subject is empty", \
"I am not satisified", "I can not feed from this subject", \
"I do not feel nourished", "This subject is not food")]...</span>"
if(fed_succesfully)
//I have no idea why this is not in handle_nutrition()
nutrition += rand(15,30)
if(nutrition >= lastnut + 50)
if(prob(80))
lastnut = nutrition
powerlevel++
if(powerlevel > 10)
powerlevel = 10
adjustToxLoss(-10)
//Heal yourself.
adjustOxyLoss(-10)
adjustBruteLoss(-10)
adjustFireLoss(-10)
adjustCloneLoss(-10)
updatehealth()
if(Victim)
Victim.updatehealth()
sleep(rand(15,45))
else
break
if(stat == 2)
if(!is_adult)
icon_state = "[colour] baby slime dead"
else
if(is_adult)
icon_state = "[colour] adult slime"
else
icon_state = "[colour] baby slime"
canmove = 1
anchored = 0
if(M)
if(M.health <= -70)
M.canmove = 0
if(!client)
if(Victim && !rabid && !attacked)
if(Victim.LAssailant && Victim.LAssailant != Victim)
if(prob(50))
if(!(Victim.LAssailant in Friends))
Friends[Victim.LAssailant] = 1
//Friends.Add(Victim.LAssailant) // no idea why i was using the |= operator
else
++Friends[Victim.LAssailant]
if(M.client && istype(src, /mob/living/carbon/human))
if(prob(85))
rabid = 1 // UUUNNBGHHHH GONNA EAT JUUUUUU
if(client) src << "<i>This subject does not have a strong enough life energy anymore...</i>"
else
M.canmove = 1
if(client) src << "<i>I have stopped feeding...</i>"
else
if(client) src << "<i>I have stopped feeding...</i>"
Victim = null
/mob/living/carbon/slime/proc/Feedstop()
if(Victim)
if(Victim.client) Victim << "[src] has let go of your head!"
Victim = null
/mob/living/carbon/slime/proc/UpdateFeed(var/mob/M)
if(Victim)
if(Victim == M)
loc = M.loc // simple "attach to head" effect!
/mob/living/carbon/slime/verb/Evolve()
set category = "Slime"
set desc = "This will let you evolve from baby to adult slime."
if(stat)
src << "<i>I must be conscious to do this...</i>"
return
if(!is_adult)
if(amount_grown >= 10)
is_adult = 1
maxHealth = 200
amount_grown = 0
regenerate_icons()
name = text("[colour] [is_adult ? "adult" : "baby"] slime ([number])")
else
src << "<i>I am not ready to evolve yet...</i>"
else
src << "<i>I have already evolved...</i>"
/mob/living/carbon/slime/verb/Reproduce()
set category = "Slime"
set desc = "This will make you split into four Slimes."
if(stat)
src << "<i>I must be conscious to do this...</i>"
return
if(is_adult)
if(amount_grown >= 10)
if(stat)
src << "<i>I must be conscious to do this...</i>"
return
var/list/babies = list()
var/new_nutrition = round(nutrition * 0.9)
var/new_powerlevel = round(powerlevel / 4)
for(var/i=1,i<=4,i++)
var/mob/living/carbon/slime/M = new /mob/living/carbon/slime/(loc)
if(prob(mutation_chance))
M.colour = slime_mutation[rand(1,4)]
else
M.colour = colour
if(ckey) M.nutrition = new_nutrition //Player slimes are more robust at spliting. Once an oversight of poor copypasta, now a feature!
M.powerlevel = new_powerlevel
if(i != 1) step_away(M,src)
M.Friends = Friends.Copy()
babies += M
feedback_add_details("slime_babies_born","slimebirth_[replacetext(M.colour," ","_")]")
var/mob/living/carbon/slime/new_slime = pick(babies)
new_slime.universal_speak = universal_speak
if(src.mind)
src.mind.transfer_to(new_slime)
else
new_slime.key = src.key
qdel(src)
else
src << "<i>I am not ready to reproduce yet...</i>"
else
src << "<i>I am not old enough to reproduce yet...</i>"
@@ -1,79 +1,79 @@
proc/mutation_table(var/colour)
var/list/slime_mutation[4]
switch(colour)
//Tier 1
if("grey")
slime_mutation[1] = "orange"
slime_mutation[2] = "metal"
slime_mutation[3] = "blue"
slime_mutation[4] = "purple"
//Tier 2
if("purple")
slime_mutation[1] = "dark purple"
slime_mutation[2] = "dark blue"
slime_mutation[3] = "green"
slime_mutation[4] = "green"
if("metal")
slime_mutation[1] = "silver"
slime_mutation[2] = "yellow"
slime_mutation[3] = "gold"
slime_mutation[4] = "gold"
if("orange")
slime_mutation[1] = "dark purple"
slime_mutation[2] = "yellow"
slime_mutation[3] = "red"
slime_mutation[4] = "red"
if("blue")
slime_mutation[1] = "dark blue"
slime_mutation[2] = "silver"
slime_mutation[3] = "pink"
slime_mutation[4] = "pink"
//Tier 3
if("dark blue")
slime_mutation[1] = "purple"
slime_mutation[2] = "blue"
slime_mutation[3] = "cerulean"
slime_mutation[4] = "cerulean"
if("dark purple")
slime_mutation[1] = "purple"
slime_mutation[2] = "orange"
slime_mutation[3] = "sepia"
slime_mutation[4] = "sepia"
if("yellow")
slime_mutation[1] = "metal"
slime_mutation[2] = "orange"
slime_mutation[3] = "bluespace"
slime_mutation[4] = "bluespace"
if("silver")
slime_mutation[1] = "metal"
slime_mutation[2] = "blue"
slime_mutation[3] = "pyrite"
slime_mutation[4] = "pyrite"
//Tier 4
if("pink")
slime_mutation[1] = "pink"
slime_mutation[2] = "pink"
slime_mutation[3] = "light pink"
slime_mutation[4] = "light pink"
if("red")
slime_mutation[1] = "red"
slime_mutation[2] = "red"
slime_mutation[3] = "oil"
slime_mutation[4] = "oil"
if("gold")
slime_mutation[1] = "gold"
slime_mutation[2] = "gold"
slime_mutation[3] = "adamantine"
slime_mutation[4] = "adamantine"
if("green")
slime_mutation[1] = "green"
slime_mutation[2] = "green"
slime_mutation[3] = "black"
slime_mutation[4] = "black"
// Tier 5
else
slime_mutation[1] = colour
slime_mutation[2] = colour
slime_mutation[3] = colour
slime_mutation[4] = colour
proc/mutation_table(var/colour)
var/list/slime_mutation[4]
switch(colour)
//Tier 1
if("grey")
slime_mutation[1] = "orange"
slime_mutation[2] = "metal"
slime_mutation[3] = "blue"
slime_mutation[4] = "purple"
//Tier 2
if("purple")
slime_mutation[1] = "dark purple"
slime_mutation[2] = "dark blue"
slime_mutation[3] = "green"
slime_mutation[4] = "green"
if("metal")
slime_mutation[1] = "silver"
slime_mutation[2] = "yellow"
slime_mutation[3] = "gold"
slime_mutation[4] = "gold"
if("orange")
slime_mutation[1] = "dark purple"
slime_mutation[2] = "yellow"
slime_mutation[3] = "red"
slime_mutation[4] = "red"
if("blue")
slime_mutation[1] = "dark blue"
slime_mutation[2] = "silver"
slime_mutation[3] = "pink"
slime_mutation[4] = "pink"
//Tier 3
if("dark blue")
slime_mutation[1] = "purple"
slime_mutation[2] = "blue"
slime_mutation[3] = "cerulean"
slime_mutation[4] = "cerulean"
if("dark purple")
slime_mutation[1] = "purple"
slime_mutation[2] = "orange"
slime_mutation[3] = "sepia"
slime_mutation[4] = "sepia"
if("yellow")
slime_mutation[1] = "metal"
slime_mutation[2] = "orange"
slime_mutation[3] = "bluespace"
slime_mutation[4] = "bluespace"
if("silver")
slime_mutation[1] = "metal"
slime_mutation[2] = "blue"
slime_mutation[3] = "pyrite"
slime_mutation[4] = "pyrite"
//Tier 4
if("pink")
slime_mutation[1] = "pink"
slime_mutation[2] = "pink"
slime_mutation[3] = "light pink"
slime_mutation[4] = "light pink"
if("red")
slime_mutation[1] = "red"
slime_mutation[2] = "red"
slime_mutation[3] = "oil"
slime_mutation[4] = "oil"
if("gold")
slime_mutation[1] = "gold"
slime_mutation[2] = "gold"
slime_mutation[3] = "adamantine"
slime_mutation[4] = "adamantine"
if("green")
slime_mutation[1] = "green"
slime_mutation[2] = "green"
slime_mutation[3] = "black"
slime_mutation[4] = "black"
// Tier 5
else
slime_mutation[1] = colour
slime_mutation[2] = colour
slime_mutation[3] = colour
slime_mutation[4] = colour
return(slime_mutation)
@@ -1 +1 @@
//no special icon processing
//no special icon processing
+6
View File
@@ -110,6 +110,7 @@
handle_drugged()
handle_slurring()
handle_paralysed()
handle_sleeping()
/mob/living/proc/handle_stunned()
@@ -151,6 +152,11 @@
AdjustParalysis(-1)
return paralysis
/mob/living/proc/handle_sleeping()
if(sleeping)
sleeping = max(sleeping - 1, 0)
return sleeping
/mob/living/proc/handle_disabilities()
+1
View File
@@ -97,6 +97,7 @@
// ++++ROCKDTBEN++++ MOB PROCS -- Ask me before touching.
// Stop! ... Hammertime! ~Carn
// I touched them without asking... I'm soooo edgy ~Erro (added nodamage checks)
// no ~Tigerkitty
/mob/living/proc/getBruteLoss()
return bruteloss
@@ -64,12 +64,12 @@
m_type = 2
if ("flap")
if (!src.restrained())
message = "<B>[src]</B> flaps his wings."
message = "<B>[src]</B> flaps its wings."
m_type = 2
if ("aflap")
if (!src.restrained())
message = "<B>[src]</B> flaps his wings ANGRILY!"
message = "<B>[src]</B> flaps its wings ANGRILY!"
m_type = 2
if ("twitch")
@@ -305,9 +305,9 @@
return
/mob/living/silicon/robot/update_fire()
overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing")
overlays -= image("icon"='icons/mob/OnFire.dmi', "icon_state"="Generic_mob_burning")
if(on_fire)
overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Standing")
overlays += image("icon"='icons/mob/OnFire.dmi', "icon_state"="Generic_mob_burning")
/mob/living/silicon/robot/fire_act()
if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them
@@ -1,23 +1,20 @@
// A special pen for service droids. Can be toggled to switch between normal writing mode, and paper rename mode
// Allows service droids to rename paper items.
/obj/item/weapon/pen/robopen
/obj/item/weapon/pen/multi/robopen
desc = "A black ink printing attachment with a paper naming mode."
name = "Printing Pen"
var/mode = 1
/obj/item/weapon/pen/robopen/attack_self(mob/user as mob)
/obj/item/weapon/pen/multi/robopen/attack_self(mob/user as mob)
var/choice = input("Would you like to change colour or mode?") as null|anything in list("Colour","Mode")
if(!choice) return
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
switch(choice)
if("Colour")
var/newcolour = input("Which colour would you like to use?") as null|anything in list("black","blue","red","green","yellow")
if(newcolour) colour = newcolour
select_colour(user)
if("Mode")
if (mode == 1)
@@ -25,13 +22,14 @@
else
mode = 1
user << "Changed printing mode to '[mode == 2 ? "Rename Paper" : "Write Paper"]'"
playsound(src.loc, 'sound/effects/pop.ogg', 50, 0)
return
// Copied over from paper's rename verb
// see code\modules\paperwork\paper.dm line 62
/obj/item/weapon/pen/robopen/proc/RenamePaper(mob/user as mob,obj/paper as obj)
/obj/item/weapon/pen/multi/robopen/proc/RenamePaper(mob/user as mob,obj/paper as obj)
if ( !user || !paper )
return
var/n_name = input(user, "What would you like to label the paper?", "Paper Labelling", null) as text
@@ -314,7 +314,7 @@
New()
src.modules += new /obj/item/device/flashlight(src)
src.modules += new /obj/item/device/flash/cyborg(src)
src.modules += new /obj/item/weapon/pen/robopen(src)
src.modules += new /obj/item/weapon/pen/multi/robopen(src)
src.modules += new /obj/item/weapon/form_printer(src)
src.modules += new /obj/item/device/taperecorder(src)
src.modules += new /obj/item/weapon/gripper/paperwork(src)
@@ -32,6 +32,7 @@
melee_damage_lower = 15
melee_damage_upper = 15
AIStatus = AI_OFF
var/summoned = FALSE
var/animated_manifest = FALSE
var/cooldown = 0
var/damage_transfer = 1 //how much damage from each attack we transfer to the owner
@@ -59,6 +60,10 @@
src << "You moved out of range, and were pulled back! You can only move [range] meters from [summoner.real_name]"
visible_message("<span class='danger'>The [src] jumps back to its user.</span>")
Recall()
if(summoned && !summoner)
src << "<span class='danger'>You somehow lack a summoner! As a result, you dispel!</span>"
ghostize()
qdel()
/mob/living/simple_animal/hostile/guardian/Move() //Returns to summoner if they move out of range
..()
@@ -559,17 +564,19 @@
if(!istype(A))
return
if(src.loc == summoner)
src << "<span class='danger'><B>You must be manifested to create bombs!</span></B>"
src << "<span class='danger'><B>You must be manifested to create bombs!</B></span>"
return
if(istype(A, /obj/))
if(bomb_cooldown <= world.time && !stat)
var/obj/item/weapon/guardian_bomb/B = new /obj/item/weapon/guardian_bomb(get_turf(A))
src << "<span class='danger'><B>Success! Bomb armed!</span></B>"
src << "<span class='danger'><B>Success! Bomb on \the [A] armed!</B></span>"
if(summoner)
summoner << "<span class='warning'>Your guardian has primed \the [A] to explode!</span>"
bomb_cooldown = world.time + 200
B.spawner = src
B.disguise (A)
else
src << "<span class='danger'><B>Your powers are on cooldown! You must wait 20 seconds between bombs.</span></B>"
src << "<span class='danger'><B>Your powers are on cooldown! You must wait 20 seconds between bombs.</B></span>"
/obj/item/weapon/guardian_bomb
name = "bomb"
@@ -585,13 +592,21 @@
density = A.density
appearance = A.appearance
spawn(600)
stored_obj.loc = get_turf(src.loc)
spawner << "<span class='danger'><B>Failure! Your trap didn't catch anyone this time.</span></B>"
qdel(src)
if(src)
stored_obj.loc = get_turf(src.loc)
spawner << "<span class='danger'><B>Failure! Your trap on \the [stored_obj] didn't catch anyone this time.</B></span>"
qdel(src)
/obj/item/weapon/guardian_bomb/proc/detonate(var/mob/living/user)
user << "<span class='danger'><B>The [src] was boobytrapped!</span></B>"
spawner << "<span class='danger'><B>Success! Your trap caught [user]</span></B>"
user << "<span class='danger'><B>The [src] was boobytrapped!</B></span>"
if(istype(spawner, /mob/living/simple_animal/hostile/guardian))
var/mob/living/simple_animal/hostile/guardian/G = spawner
if(user == G.summoner)
user << "<span class='danger'>You knew this because of your link with your guardian, so you smartly defuse the bomb.</span>"
stored_obj.loc = get_turf(src.loc)
qdel(src)
return
spawner << "<span class='danger'><B>Success! Your trap on \the [src] caught [user]!</B></span>"
stored_obj.loc = get_turf(src.loc)
playsound(get_turf(src),'sound/effects/Explosion2.ogg', 200, 1)
user.ex_act(2)
@@ -679,6 +694,7 @@
var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user)
G.summoner = user
G.summoned = TRUE
G.key = key
G << "You are a [mob_name] bound to serve [user.real_name]."
G << "You are capable of manifesting or recalling to your master with verbs in the Guardian tab. You will also find a verb to communicate with them privately there."
+2 -1
View File
@@ -112,7 +112,7 @@
if(self_message && M==src)
msg = self_message
M.show_message(msg, 2, deaf_message, 1)
// based on say code
var/omsg = replacetext(message, "<B>[src]</B> ", "")
var/list/listening_obj = new
@@ -177,6 +177,7 @@
if(ishuman(src) && W == src:head)
src:update_hair()
src:update_fhair()
/mob/proc/put_in_any_hand_if_possible(obj/item/W as obj, del_on_fail = 0, disable_warning = 1, redraw_mob = 1)
if(equip_to_slot_if_possible(W, slot_l_hand, del_on_fail, disable_warning, redraw_mob))
+2 -1
View File
@@ -236,7 +236,9 @@
src << "\blue You're pinned to a wall by [mob.pinned[1]]!"
return 0
var/turf/T = mob.loc
move_delay = world.time//set move delay
move_delay += T.slowdown
mob.last_movement = world.time
mob.last_move_intent = world.time + 10
switch(mob.m_intent)
@@ -265,7 +267,6 @@
var/mob/M = L[1]
if(M)
if ((get_dist(mob, M) <= 1 || M.loc == mob.loc))
var/turf/T = mob.loc
. = ..()
if (isturf(M.loc))
var/diag = get_dir(mob, M)
+1 -1
View File
@@ -113,7 +113,7 @@
if(href_list["observe"])
if(alert(src,"Are you sure you wish to observe? You will have to wait 30 minutes before being able to respawn!","Player Setup","Yes","No") == "Yes")
if(alert(src,"Are you sure you wish to observe? You cannot normally join the round after doing this!","Player Setup","Yes","No") == "Yes")
if(!client) return 1
var/mob/dead/observer/observer = new()
src << browse(null, "window=playersetup")
@@ -248,36 +248,53 @@ datum/preferences
else
preview_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
//Body Markings
if(current_species && (current_species.bodyflags & HAS_MARKINGS))
var/datum/sprite_accessory/marking_style = marking_styles_list[m_style]
if(marking_style && marking_style.species_allowed)
var/icon/markings_s = new/icon("icon" = marking_style.icon, "icon_state" = "[marking_style.icon_state]_s")
markings_s.Blend(rgb(r_markings, g_markings, b_markings), ICON_ADD)
preview_icon.Blend(markings_s, ICON_OVERLAY)
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s")
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
if(hair_style)
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
eyes_s.Blend(hair_s, ICON_OVERLAY)
//Head Accessory
if(current_species && (current_species.bodyflags & HAS_HEAD_ACCESSORY))
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style]
if(head_accessory_style && head_accessory_style.species_allowed)
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
head_accessory_s.Blend(rgb(r_headacc, g_headacc, b_headacc), ICON_ADD)
eyes_s.Blend(head_accessory_s, ICON_OVERLAY)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
if(facial_hair_style)
if(facial_hair_style && facial_hair_style.species_allowed)
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
eyes_s.Blend(facial_s, ICON_OVERLAY)
var/icon/underwear_s = null
if(underwear && current_species.clothing_flags & HAS_UNDERWEAR)
if(underwear && (current_species.clothing_flags & HAS_UNDERWEAR))
var/datum/sprite_accessory/underwear/U = underwear_list[underwear]
if(U)
underwear_s = new/icon(U.icon, "uw_[U.icon_state]_s", ICON_OVERLAY)
var/icon/undershirt_s = null
if(undershirt && current_species.clothing_flags & HAS_UNDERSHIRT)
if(undershirt && (current_species.clothing_flags & HAS_UNDERSHIRT))
var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt]
if(U2)
undershirt_s = new/icon(U2.icon, "us_[U2.icon_state]_s", ICON_OVERLAY)
var/icon/socks_s = null
if(socks && current_species.clothing_flags & HAS_SOCKS)
if(socks && (current_species.clothing_flags & HAS_SOCKS))
var/datum/sprite_accessory/socks/U3 = socks_list[socks]
if(U3)
socks_s = new/icon(U3.icon, "sk_[U3.icon_state]_s", ICON_OVERLAY)
@@ -804,8 +821,6 @@ datum/preferences
else if(backbag == 3 || backbag == 4)
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
if(!(current_species.bodyflags & NO_EYES))
preview_icon.Blend(eyes_s, ICON_OVERLAY)
if(underwear_s)
preview_icon.Blend(underwear_s, ICON_OVERLAY)
if(undershirt_s)
@@ -814,6 +829,8 @@ datum/preferences
preview_icon.Blend(socks_s, ICON_OVERLAY)
if(clothes_s)
preview_icon.Blend(clothes_s, ICON_OVERLAY)
if(!(current_species.bodyflags & NO_EYES))
preview_icon.Blend(eyes_s, ICON_OVERLAY)
preview_icon_front = new(preview_icon, dir = SOUTH)
preview_icon_side = new(preview_icon, dir = WEST)
+187 -28
View File
@@ -584,25 +584,6 @@
*/
/datum/sprite_accessory/hair
una_spines_long
name = "Long Unathi Spines"
icon_state = "soghun_longspines"
species_allowed = list("Unathi")
una_spines_short
name = "Short Unathi Spines"
icon_state = "soghun_shortspines"
species_allowed = list("Unathi")
una_frills_long
name = "Long Unathi Frills"
icon_state = "soghun_longfrills"
species_allowed = list("Unathi")
una_frills_short
name = "Short Unathi Frills"
icon_state = "soghun_shortfrills"
species_allowed = list("Unathi")
una_horns
name = "Unathi Horns"
@@ -645,11 +626,6 @@
species_allowed = list("Skrell")
gender = FEMALE
taj_ears
name = "Tajaran Ears"
icon_state = "ears_plain"
species_allowed = list("Tajaran")
taj_ears_clean
name = "Tajara Clean"
icon_state = "hair_clean"
@@ -892,6 +868,8 @@
/datum/sprite_accessory/facial_hair
//Tajara
taj_sideburns
name = "Tajara Sideburns"
icon_state = "facial_sideburns"
@@ -922,6 +900,8 @@
icon_state = "facial_smallstache"
species_allowed = list("Tajaran")
//Vox
vox_colonel
name = "Vox Colonel Beard"
icon_state = "vox_colonel"
@@ -957,9 +937,9 @@
species_allowed = list("Vulpkanin")
gender = NEUTER
vulp_earfluff
name = "Earfluff"
icon_state = "vulp_facial_earfluff"
vulp_vulpine_fluff
name = "Vulpine and Earfluff"
icon_state = "vulp_facial_vulpine_fluff"
species_allowed = list("Vulpkanin")
gender = NEUTER
@@ -993,6 +973,51 @@
species_allowed = list("Vulpkanin")
gender = NEUTER
//Unathi
una_spines_long
name = "Long Spines"
icon_state = "soghun_longspines"
species_allowed = list("Unathi")
gender = NEUTER
una_spines_short
name = "Short Spines"
icon_state = "soghun_shortspines"
species_allowed = list("Unathi")
gender = NEUTER
una_frills_long
name = "Long Frills"
icon_state = "soghun_longfrills"
species_allowed = list("Unathi")
gender = NEUTER
una_frills_short
name = "Short Frills"
icon_state = "soghun_shortfrills"
species_allowed = list("Unathi")
gender = NEUTER
una_frills_webbed_long
name = "Long Webbed Frills"
icon_state = "soghun_longfrills_webbed"
species_allowed = list("Unathi")
gender = NEUTER
una_frills_webbed_short
name = "Short Webbed Frills"
icon_state = "soghun_shortfrills_webbed"
species_allowed = list("Unathi")
gender = NEUTER
una_frills_webbed_aquatic
name = "Aquatic Frills"
icon_state = "soghun_aquaticfrills_webbed"
species_allowed = list("Unathi")
gender = NEUTER
//skin styles - WIP
//going to have to re-integrate this with surgery
//let the icon_state hold an icon preview for now
@@ -1518,4 +1543,138 @@
name = "Vox Fishnets"
icon_state = "vox_fishnet"
gender = NEUTER
species_allowed = list("Vox")
species_allowed = list("Vox")
/* HEAD ACCESSORY */
/datum/sprite_accessory/head_accessory
icon = 'icons/mob/body_accessory.dmi'
species_allowed = list("Unathi", "Vulpkanin", "Tajaran")
icon_state = "accessory_none"
/datum/sprite_accessory/head_accessory/none
name = "None"
species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington","Vox")
icon_state = "accessory_none"
/datum/sprite_accessory/head_accessory/simple
name = "Simple"
species_allowed = list("Unathi")
icon_state = "horns_simple"
/datum/sprite_accessory/head_accessory/short
name = "Short"
species_allowed = list("Unathi")
icon_state = "horns_short"
/datum/sprite_accessory/head_accessory/curled
name = "Curled"
species_allowed = list("Unathi")
icon_state = "horns_curled"
/datum/sprite_accessory/head_accessory/ram
name = "Ram"
species_allowed = list("Unathi")
icon_state = "horns_ram"
/datum/sprite_accessory/head_accessory/vulp_earfluff
icon = 'icons/mob/human_face.dmi'
name = "Vulpkanin Earfluff"
icon_state = "vulp_facial_earfluff"
species_allowed = list("Vulpkanin")
/datum/sprite_accessory/head_accessory/vulp_blaze
icon = 'icons/mob/human_face.dmi'
name = "Blaze"
icon_state = "vulp_facial_blaze"
species_allowed = list("Vulpkanin")
/datum/sprite_accessory/head_accessory/vulp_vulpine
icon = 'icons/mob/human_face.dmi'
name = "Vulpine"
icon_state = "vulp_facial_vulpine"
species_allowed = list("Vulpkanin")
/datum/sprite_accessory/head_accessory/vulp_vulpine_fluff
icon = 'icons/mob/human_face.dmi'
name = "Vulpine and Earfluff"
icon_state = "vulp_facial_vulpine_fluff"
species_allowed = list("Vulpkanin")
/datum/sprite_accessory/head_accessory/vulp_mask
icon = 'icons/mob/human_face.dmi'
name = "Mask"
icon_state = "vulp_facial_mask"
species_allowed = list("Vulpkanin")
/datum/sprite_accessory/head_accessory/vulp_patch
icon = 'icons/mob/human_face.dmi'
name = "Patch"
icon_state = "vulp_facial_patch"
species_allowed = list("Vulpkanin")
/datum/sprite_accessory/head_accessory/vulp_ruff
icon = 'icons/mob/human_face.dmi'
name = "Ruff"
icon_state = "vulp_facial_ruff"
species_allowed = list("Vulpkanin")
/datum/sprite_accessory/head_accessory/vulp_kita
icon = 'icons/mob/human_face.dmi'
name = "Kita"
icon_state = "vulp_facial_kita"
species_allowed = list("Vulpkanin")
/datum/sprite_accessory/head_accessory/vulp_swift
icon = 'icons/mob/human_face.dmi'
name = "Swift"
icon_state = "vulp_facial_swift"
species_allowed = list("Vulpkanin")
/datum/sprite_accessory/head_accessory/taj_ears
icon = 'icons/mob/human_face.dmi'
name = "Tajaran Ears"
icon_state = "ears_plain"
species_allowed = list("Tajaran")
/* BODY MARKINGS */
/datum/sprite_accessory/body_markings
icon = 'icons/mob/body_accessory.dmi'
species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
icon_state = "accessory_none"
/datum/sprite_accessory/body_markings/none
name = "None"
species_allowed = list("Human","Unathi","Diona","Grey","Machine","Tajaran","Vulpkanin","Slime People","Skellington","Vox")
icon_state = "accessory_none"
/datum/sprite_accessory/body_markings/stripe
name = "Stripe"
species_allowed = list("Unathi")
icon_state = "markings_stripe"
/datum/sprite_accessory/body_markings/tiger
name = "Tiger Body"
species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
icon_state = "markings_tiger"
/datum/sprite_accessory/body_markings/tigerhead
name = "Tiger Body + Head"
species_allowed = list("Unathi", "Tajaran", "Vulpkanin")
icon_state = "markings_tigerhead"
/datum/sprite_accessory/body_markings/tigerheadface_taj
name = "Tajaran Tiger Body + Head + Face"
species_allowed = list("Tajaran")
icon_state = "markings_tigerheadface_taj"
/datum/sprite_accessory/body_markings/tigerheadface_vulp
name = "Vulpkanin Tiger Body + Head + Face"
species_allowed = list("Vulpkanin")
icon_state = "markings_tigerheadface_vulp"
/datum/sprite_accessory/body_markings/tigerheadface_una
name = "Unathi Tiger Body + Head + Face"
species_allowed = list("Unathi")
icon_state = "markings_tigerheadface_una"
+9 -10
View File
@@ -106,14 +106,13 @@ nanoui is used to open and update nano browser uis
*/
/datum/nanoui/proc/add_common_assets()
add_script("libraries.min.js") // A JS file comprising of jQuery, doT.js and jQuery Timer libraries (compressed together)
add_script("nano.js") // A JS file of the NanoUI JavaScript concatenated into one file.
add_stylesheet("shared.css") // this CSS sheet is common to all UIs
add_stylesheet("icons.css") // this CSS sheet is common to all UIs
add_script("nano.js") // A JS file of the NanoUI JavaScript compressed into one file.
add_stylesheet("nanoui.css") // Concatenated CSS sheet common to all UIs, contains all of the standard NanoUI styling.
//codemirror
add_script("codemirror-compressed.js") // A custom compressed JS file of codemirror, with CSS highlighting
add_stylesheet("codemirror.css") // this CSS sheet is common to all UIs, so all UIs can use codemirror
add_stylesheet("cm_lesser-dark.css") //CSS styling for codemirror, dark theme
// CodeMirror
add_script("codemirror-compressed.js") // A custom minified JavaScript file of CodeMirror, with the following plugins: CSS Mode, NTSL Mode, CSS-hint addon, Search addon, Sublime Keymap.
add_stylesheet("codemirror.css") // A CSS sheet containing the basic stylings and formatting information for CodeMirror.
add_stylesheet("cm_lesser-dark.css") // A theme for CodeMirror to use, which closely resembles the rest of the NanoUI style.
/**
* Set the current status (also known as visibility) of this ui.
@@ -383,9 +382,9 @@ nanoui is used to open and update nano browser uis
</div>
<noscript>
<div id='uiNoScript'>
<h2>JAVASCRIPT REQUIRED</h2>
<p>Your Internet Explorer's Javascript is disabled (or broken).<br/>
Enable Javascript and then open this UI again.</p>
<h1>Javascript Required</h1>
<p>Javascript is required in order to use this NanoUI interface.</p>
<p>Please enable Javascript in Internet Explorer, and restart your game.</p>
</div>
</noscript>
</body>
+4 -4
View File
@@ -416,8 +416,8 @@
B.update_icon()
else if(istype(P, /obj/item/weapon/pen) || istype(P, /obj/item/toy/crayon))
var/obj/item/weapon/pen/robopen/RP = P
if(istype(P, /obj/item/weapon/pen/robopen) && RP.mode == 2)
var/obj/item/weapon/pen/multi/robopen/RP = P
if(istype(P, /obj/item/weapon/pen/multi/robopen) && RP.mode == 2)
RP.RenamePaper(user,src)
else
show_content(user, infolinks = 1)
@@ -563,11 +563,11 @@
/obj/item/weapon/paper/blueshield
name = "paper- 'Blueshield Mission Briefing'"
info = "<b>Blueshield Mission Briefing</b><br>You are charged with the defence of any persons of importance within the station. This includes but is not limited to The Captain, The Heads of Staff and Central Command staff. You answer directly to the Head of Security who will assist you in achieving your mission.<br>Where required to achieve your primary responsibility you should liaise with security and share resources, however the day to day security operations of the station are outside of your jurisdiction.<br>Monitor the health and safety of your principals, identify any potential risks and threats then alert the proper departments to resolve the situation. You are authorized to act as bodyguard to any of the station heads that you determine are most in need of protection, however additional access to their departments shall be granted solely at their discretion.<br>Observe the station alert system and carry your armaments only as required by the situation or when authorized by the Head of Security or Captain in exceptional cases.<br>Remember, as an agent of Nanotrasen it is your responsibility to conduct yourself appropriately and you will be held to the highest standard. You will be held accountable for your actions. Security is authorized to search, interrogate or detain you as required by their own procedures. Internal affairs will also monitor and observe your conduct and their mandate applies equally to security and Blueshield operations."
info = "<b>Blueshield Mission Briefing</b><br>You are charged with the defence of any persons of importance within the station. This includes, but is not limited to, The Captain, The Heads of Staff and Central Command staff. You answer directly to the Nanotrasen Representative who will assist you in achieving your mission.<br>When required to achieve your primary responsibility, you should liaise with security and share resources; however, the day to day security operations of the station are outside of your jurisdiction.<br>Monitor the health and safety of your principals, identify any potential risks and threats, then alert the proper departments to resolve the situation. You are authorized to act as bodyguard to any of the station heads that you determine are most in need of protection; however, additional access to their departments shall be granted solely at their discretion.<br>Observe the station alert system and carry your armaments only as required by the situation, or when authorized by the Head of Security or Captain in exceptional cases.<br>Remember, as an agent of Nanotrasen it is your responsibility to conduct yourself appropriately and you will be held to the highest standard. You will be held accountable for your actions. Security is authorized to search, interrogate or detain you as required by their own procedures. Internal affairs will also monitor and observe your conduct, and their mandate applies equally to security and Blueshield operations."
/obj/item/weapon/paper/ntrep
name = "paper- 'Nanotrasen Representative Mission Briefing'"
info = "<b>Nanotrasen Representative Mission Briefing</b><br><br>Nanotrasen Central Command has dispatched you to this station in order to liaise with command staff on their behalf. As experienced field officers, the staff on the station are experts in handling their own fields. It is your job however to consider the bigger picture and to direct the staff towards Nanotrasen's corporate interests.<br>As a civilian, you should consider yourself an advisor, diplomat and intermediary. The command staff do not answer to you directly and are not required to follow your orders nor do you have disciplinary authority over personnel. In all station internal matters you answer to the Head of Personnel who will direct you in your conduct within the station. However you also answer to Central Command who may, as required, direct you in acting on company interests.<br>Central Command may dispatch orders to the staff through you which you are responsible to communicate, however enforcement of these orders is not your mandate and will be handled directly by Central Command or authorized Nanotrasen personnel. When not specifically directed by Central Command, assist the head of personnel in evaluation of the station and receiving departmental reports.<br>Your office has been provided with a direct link to Central Command, through which you can issue any urgent reports or requests for Nanotrasen intervention. Remember that any direct intervention is a costly exercise and should be used only when the situation justifies the request. You will be held accountable for any unnecessary usage of Nanotrasen resources.<br>"
info = "<b>Nanotrasen Representative Mission Briefing</b><br><br>Nanotrasen Central Command has dispatched you to this station in order to liaise with command staff on their behalf. As experienced field officers, the staff on the station are experts in handling their own fields. It is your job, however, to consider the bigger picture and to direct the staff towards Nanotrasen's corporate interests.<br>As a civilian, you should consider yourself an advisor, diplomat and intermediary. The command staff do not answer to you directly and are not required to follow your orders, nor do you have disciplinary authority over personnel. In all station internal matters you answer to the Head of Personnel who will direct you in your conduct within the station. However, you also answer to Central Command who may, as required, direct you in acting on company interests.<br>Central Command may dispatch orders to the staff through you which you are responsible to communicate; however, enforcement of these orders is not your mandate and will be handled directly by Central Command or authorized Nanotrasen personnel. When not specifically directed by Central Command, assist the Head of Personnel in evaluation of the station and receiving departmental reports.<br>Your office has been provided with a direct link to Central Command, through which you can issue any urgent reports or requests for Nanotrasen intervention. Remember that any direct intervention is a costly exercise and should be used only when the situation justifies the request. You will be held accountable for any unnecessary usage of Nanotrasen resources.<br>"
/obj/item/weapon/paper/armory
name = "paper- 'Armory Inventory'"
+40 -5
View File
@@ -50,24 +50,59 @@
icon_state = "pen"
colour = "white"
/obj/item/weapon/pen/multi //spaceman96: Trenna Seber
/obj/item/weapon/pen/multi
name = "multicolor pen"
desc = "It's a cool looking pen. Lots of colors!"
// these values are for the overlay
var/list/colour_choices = list(
"black" = list(0.25, 0.25, 0.25),
"red" = list(1, 0.25, 0.25),
"green" = list(0, 1, 0),
"blue" = list(0.5, 0.5, 1),
"yellow" = list(1, 1, 0))
var/pen_color_iconstate = "pencolor"
var/pen_color_shift = 3
/obj/item/weapon/pen/multi/New()
..()
update_icon()
/obj/item/weapon/pen/multi/proc/select_colour(mob/user as mob)
var/newcolour = input(user, "Which colour would you like to use?", name, colour) as null|anything in colour_choices
if(newcolour)
colour = newcolour
playsound(loc, 'sound/effects/pop.ogg', 50, 1)
update_icon()
/obj/item/weapon/pen/multi/attack_self(mob/living/user as mob)
select_colour(user)
/obj/item/weapon/pen/multi/update_icon()
overlays.Cut()
var/icon/o = new(icon, pen_color_iconstate)
var/list/c = colour_choices[colour]
o.SetIntensity(c[1], c[2], c[3])
if(pen_color_shift)
o.Shift(SOUTH, pen_color_shift)
overlays += o
/obj/item/weapon/pen/fancy
name = "fancy pen"
desc = "A fancy metal pen. It uses blue ink. An inscription on one side reads,\"L.L. - L.R.\""
icon_state = "fancypen"
/obj/item/weapon/pen/gold
/obj/item/weapon/pen/multi/gold
name = "Gilded Pen"
desc = "A golden pen that is gilded with a meager amount of gold material. The word 'Nanotrasen' is etched on the clip of the pen."
icon_state = "goldpen"
/obj/item/weapon/pen/fountain
pen_color_shift = 0
/obj/item/weapon/pen/multi/fountain
name = "Engraved Fountain Pen"
desc = "An expensive looking pen."
icon_state = "fountainpen"
icon_state = "fountainpen"
pen_color_shift = 0
/obj/item/weapon/pen/attack(mob/living/M, mob/user)
if(!istype(M))
+14
View File
@@ -102,6 +102,8 @@
var/report_power_alarm = 1
var/shock_proof = 0 //if set to 1, this APC will not arc bolts of electricity if it's overloaded.
/obj/machinery/power/apc/noalarm
report_power_alarm = 0
@@ -1252,6 +1254,18 @@
charging = 0
chargecount = 0
if(excess >= 5000000 && !shock_proof) //If there's more than 5,000,000 watts in the grid, start arcing and shocking people.
if(prob(5))
var/list/shock_mobs = list()
for(var/C in view(get_turf(src), 5)) //We only want to shock a single random mob in range, not every one.
if(iscarbon(C))
shock_mobs +=C
if(shock_mobs.len)
var/mob/living/carbon/S = pick(shock_mobs)
S.electrocute_act(rand(5,25), "electrical arc")
playsound(get_turf(S), 'sound/effects/eleczap.ogg', 75, 1)
Beam(S,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5)
else // no cell, switch everything off
charging = 0
+22 -59
View File
@@ -634,81 +634,43 @@ obj/structure/cable/proc/cableColor(var/colorC)
// Cable laying procedures
//////////////////////////////////////////////
/obj/item/stack/cable_coil/proc/get_new_cable(location)
var/obj/structure/cable/C = new(location)
C.cableColor(color)
return C
// called when cable_coil is clicked on a turf/simulated/floor
/obj/item/stack/cable_coil/proc/turf_place(turf/simulated/floor/F, mob/user)
/obj/item/stack/cable_coil/proc/place_turf(turf/T, mob/user)
if(!isturf(user.loc))
return
if(!T.can_have_cabling())
user << "<span class='warning'>You can only lay cables on catwalks and plating!</span>"
return
if(get_amount() < 1) // Out of cable
user << "There is no cable left."
user << "<span class='warning'>There is no cable left!</span>"
return
if(get_dist(F,user) > 1) // Too far
user << "You can't lay cable at a place that far away."
return
if(F.intact) // Ff floor is intact, complain
user << "You can't lay cable there unless the floor tiles are removed."
if(get_dist(T,user) > 1) // Too far
user << "<span class='warning'>You can't lay cable at a place that far away!</span>"
return
else
var/dirn
if(user.loc == F)
if(user.loc == T)
dirn = user.dir // if laying on the tile we're on, lay in the direction we're facing
else
dirn = get_dir(F, user)
dirn = get_dir(T, user)
for(var/obj/structure/cable/LC in F)
if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0))
user << "<span class='warning'>There's already a cable at that position.</span>"
return
///// Z-Level Stuff
// check if the target is open space
/* if(istype(F, /turf/simulated/floor/open))
for(var/obj/structure/cable/LC in F)
if((LC.d1 == dirn && LC.d2 == 11 ) || ( LC.d2 == dirn && LC.d1 == 11))
user << "<span class='warning'>There's already a cable at that position.</span>"
return
var/turf/simulated/floor/open/temp = F
var/obj/structure/cable/C = new(F)
var/obj/structure/cable/D = new(temp.floorbelow)
C.cableColor(color)
C.d1 = 11
C.d2 = dirn
C.add_fingerprint(user)
C.updateicon()
var/datum/powernet/PN = new()
PN.add_cable(C)
C.mergeConnectedNetworks(C.d2)
C.mergeConnectedNetworksOnTurf()
D.cableColor(color)
D.d1 = 12
D.d2 = 0
D.add_fingerprint(user)
D.updateicon()
PN.add_cable(D)
D.mergeConnectedNetworksOnTurf()
// do the normal stuff
else */
///// Z-Level Stuff
for(var/obj/structure/cable/LC in F)
if((LC.d1 == dirn && LC.d2 == 0 ) || ( LC.d2 == dirn && LC.d1 == 0))
user << "There's already a cable at that position."
for(var/obj/structure/cable/LC in T)
if(LC.d2 == dirn && LC.d1 == 0)
user << "<span class='warning'>There's already a cable at that position!</span>"
return
var/obj/structure/cable/C = new(F)
C.cableColor(color)
var/obj/structure/cable/C = get_new_cable(T)
//set up the new cable
C.d1 = 0 //it's a O-X node cable
@@ -728,6 +690,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
use(1)
if (C.shock(user, 50))
if (prob(50)) //fail
new/obj/item/stack/cable_coil(C.loc, 1, C.color)
@@ -751,7 +714,7 @@ obj/structure/cable/proc/cableColor(var/colorC)
if(U == T) //if clicked on the turf we're standing on, try to put a cable in the direction we're facing
turf_place(T,user)
place_turf(T,user)
return
var/dirn = get_dir(C, user)
+1 -1
View File
@@ -132,7 +132,7 @@
if(get_dist(src, user) > 1)
return
coil.turf_place(T, user)
coil.place_turf(T, user)
return
else
..()
+1 -1
View File
@@ -186,7 +186,7 @@
src.last_shot = world.time
if(src.shot_number < 3)
src.fire_delay = 2
src.shot_number ++
src.shot_number++
else
src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay)
src.shot_number = 0
@@ -98,7 +98,7 @@
var/stability = num2text(round((damage / explosion_point) * 100))
if(damage > emergency_point)
radio.autosay("[emergency_alert] Instability: [stability]%", src)
radio.autosay("[emergency_alert] Instability: [stability]%", src.name)
lastwarning = world.timeofday
if(!has_reached_emergency)
investigate_log("has reached the emergency point for the first time.", "supermatter")
@@ -106,11 +106,11 @@
has_reached_emergency = 1
else if(damage >= damage_archived) // The damage is still going up
radio.autosay("[warning_alert] Instability: [stability]%", src)
radio.autosay("[warning_alert] Instability: [stability]%", src.name)
lastwarning = world.timeofday - 150
else // Phew, we're safe
radio.autosay("[safe_alert]", src)
radio.autosay("[safe_alert]", src.name)
lastwarning = world.timeofday
if(damage > explosion_point)
+3 -3
View File
@@ -44,7 +44,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
move_the_basket_ball(amount_to_move)
pixel_x = 0
pixel_y = 0
playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, 1, extrarange = 5)
playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, 1, extrarange = 15)
tesla_zap(src, 7, what_does_the_scouter_say_about_the_balls_power_level)
pixel_x = -32
pixel_y = -32
@@ -69,7 +69,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
/obj/singularity/energy_ball/proc/handle_energy()
if(energy >= 300)
energy -= 300
playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 5)
playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, 1, extrarange = 15)
spawn(100)
var/obj/singularity/energy_ball/EB = new(loc)
orbiting_balls.Add(EB)
@@ -113,7 +113,7 @@ var/list/blacklisted_tesla_types = list(/obj/machinery/atmospherics,
return closest_atom
/proc/tesla_zap(var/atom/source, zap_range = 3, power)
if(power < 500)
if(power < 1000)
return
var/list/tesla_coils = list()
var/list/grounding_rods = list()
@@ -13,6 +13,11 @@
caliber = "38"
projectile_type = "/obj/item/projectile/bullet/weakbullet2/rubber"
/obj/item/ammo_casing/cap
desc = "A cap for children toys."
caliber = "caps"
projectile_type = "/obj/item/projectile/bullet/cap"
/obj/item/ammo_casing/c10mm
desc = "A 10mm bullet casing."
@@ -28,17 +33,37 @@
/obj/item/ammo_casing/c9mmap
desc = "A 9mm bullet casing."
caliber = "9mm"
projectile_type =/obj/item/projectile/bullet/armourpiercing
projectile_type = "/obj/item/projectile/bullet/armourpiercing"
/obj/item/ammo_casing/c9mmtox
desc = "A 9mm bullet casing."
caliber = "9mm"
projectile_type = /obj/item/projectile/bullet/toxinbullet
projectile_type = "/obj/item/projectile/bullet/toxinbullet"
/obj/item/ammo_casing/c9mminc
desc = "A 9mm bullet casing."
caliber = "9mm"
projectile_type = /obj/item/projectile/bullet/incendiary/firebullet
projectile_type = "/obj/item/projectile/bullet/incendiary/firebullet"
/obj/item/ammo_casing/c46x30mm
desc = "A 4.6x30mm bullet casing."
caliber = "4.6x30mm"
projectile_type = "/obj/item/projectile/bullet/weakbullet3"
/obj/item/ammo_casing/c46x30mmap
desc = "A 4.6x30mm bullet casing."
caliber = "4.6x30mm"
projectile_type = "/obj/item/projectile/bullet/armourpiercing"
/obj/item/ammo_casing/c46x30mmtox
desc = "A 4.6x30mm bullet casing."
caliber = "4.6x30mm"
projectile_type = "/obj/item/projectile/bullet/toxinbullet"
/obj/item/ammo_casing/c46x30mminc
desc = "A 4.6x30mm bullet casing."
caliber = "4.6x30mm"
projectile_type = "/obj/item/projectile/bullet/incendiary/firebullet"
/obj/item/ammo_casing/c45
desc = "A .45 bullet casing."
@@ -60,7 +85,7 @@
desc = "A 12 gauge buckshot shell."
icon_state = "gshell"
projectile_type = "/obj/item/projectile/bullet/pellet"
pellets = 5
pellets = 6
deviation = 30
/obj/item/ammo_casing/shotgun/rubbershot
@@ -68,7 +93,7 @@
desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
icon_state = "bshell"
projectile_type = "/obj/item/projectile/bullet/rpellet"
pellets = 5
pellets = 6
deviation = 30
materials = list(MAT_METAL=4000)
@@ -94,7 +119,7 @@
desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards. This one has been packed with even more \
propellant. It's like playing russian roulette, with a shotgun."
icon_state = "improvshell"
projectile_type = /obj/item/projectile/bullet/pellet/random
projectile_type = "/obj/item/projectile/bullet/pellet/random"
materials = list(MAT_METAL=250)
pellets = 5
deviation = 30
@@ -135,7 +160,7 @@
name = "FRAG-12 slug"
desc = "A high explosive breaching round for a 12 gauge shotgun."
icon_state = "heshell"
projectile_type = /obj/item/projectile/bullet/frag12
projectile_type = "/obj/item/projectile/bullet/frag12"
/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
name = "dragonsbreath shell"
@@ -150,7 +175,7 @@
desc = "An advanced shotgun shell which uses a subspace ansible crystal to produce an effect similar to a standard ion rifle. \
The unique properties of the crystal splot the pulse into a spread of individually weaker bolts."
icon_state = "ionshell"
projectile_type = /obj/item/projectile/ion/weak
projectile_type = "/obj/item/projectile/ion/weak"
pellets = 4
deviation = 30
@@ -158,7 +183,7 @@
name = "laser slug"
desc = "An advanced shotgun shell that uses a micro laser to replicate the effects of a laser weapon in a ballistic package."
icon_state = "lshell"
projectile_type = /obj/item/projectile/beam
projectile_type = "/obj/item/projectile/beam"
/obj/item/ammo_casing/shotgun/techshell
name = "unloaded technological shell"
+17 -5
View File
@@ -12,6 +12,13 @@
max_ammo = 6
multiple_sprites = 1
/obj/item/ammo_box/caps
name = "speed loader (caps)"
icon_state = "357"
ammo_type = /obj/item/ammo_casing/cap
max_ammo = 7
multiple_sprites = 1
/obj/item/ammo_box/c9mm
name = "ammo box (9mm)"
icon_state = "9mmbox"
@@ -53,8 +60,8 @@
icon_state = "9mmbox"
origin_tech = "combat=2"
ammo_type = /obj/item/ammo_casing/shotgun
max_ammo = 8
materials = list(MAT_METAL=32000)
max_ammo = 7
materials = list(MAT_METAL=28000)
/obj/item/ammo_box/shotgun/buck
name = "Ammunition Box (buckshot)"
@@ -63,15 +70,20 @@
/obj/item/ammo_box/shotgun/stun
name = "Ammunition Box (stun shells)"
ammo_type = /obj/item/ammo_casing/shotgun/stunslug
materials = list(MAT_METAL=2000)
materials = list(MAT_METAL=1750)
/obj/item/ammo_box/shotgun/beanbag
name = "Ammunition Box (beanbag shells)"
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
materials = list(MAT_METAL=2000)
materials = list(MAT_METAL=1750)
/obj/item/ammo_box/shotgun/rubbershot
name = "Ammunition Box (rubbershot shells)"
ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
materials = list(MAT_METAL=28000)
/obj/item/ammo_box/shotgun/tranquilizer
name = "Ammunition Box (tranquilizer darts)"
icon_state = "45box"
ammo_type = /obj/item/ammo_casing/shotgun/tranquilizer
materials = list(MAT_METAL=2000)
materials = list(MAT_METAL=1750)
@@ -36,6 +36,13 @@
caliber = "38"
max_ammo = 6
/obj/item/ammo_box/magazine/internal/cylinder/cap
name = "cap gun revolver cylinder"
desc = "Oh god, this shouldn't be here"
ammo_type = "/obj/item/ammo_casing/cap"
caliber = "cap"
max_ammo = 7
/obj/item/ammo_box/magazine/internal/shot
name = "shotgun internal magazine"
desc = "Oh god, this shouldn't be here"
@@ -49,7 +56,7 @@
desc = "Oh god, this shouldn't be here"
ammo_type = "/obj/item/ammo_casing/shotgun/buckshot"
caliber = "shotgun"
max_ammo = 8
max_ammo = 6
multiload = 0
/obj/item/ammo_box/magazine/internal/cylinder/dualshot
@@ -116,10 +123,33 @@
..()
icon_state = "[initial(icon_state)]-[ammo_count() ? "8" : "0"]"
/obj/item/ammo_box/magazine/wt550m9
name = "wt550 magazine (4.6x30mm)"
icon_state = "46x30mmt-20"
ammo_type = "/obj/item/ammo_casing/c46x30mm"
caliber = "4.6x30mm"
max_ammo = 20
/obj/item/ammo_box/magazine/wt550m9/update_icon()
..()
icon_state = "46x30mmt-[round(ammo_count(),4)]"
/obj/item/ammo_box/magazine/wt550m9/wtap
name = "wt550 magazine (Armour Piercing 4.6x30mm)"
ammo_type = "/obj/item/ammo_casing/c46x30mmap"
/obj/item/ammo_box/magazine/wt550m9/wttx
name = "wt550 magazine (Toxin Tipped 4.6x30mm)"
ammo_type = "/obj/item/ammo_casing/c46x30mmtox"
/obj/item/ammo_box/magazine/wt550m9/wtic
name = "wt550 magazine (Incindiary 4.6x30mm)"
ammo_type = "/obj/item/ammo_casing/c46x30mminc"
/obj/item/ammo_box/magazine/uzim9mm
name = "uzi magazine (9mm)"
icon_state = "uzi9mm-32"
ammo_type = /obj/item/ammo_casing/c9mm
ammo_type = "/obj/item/ammo_casing/c9mm"
caliber = "9mm"
max_ammo = 32
@@ -137,17 +167,17 @@
/obj/item/ammo_box/magazine/smgm9mm/ap
name = "SMG magazine (Armour Piercing 9mm)"
ammo_type = /obj/item/ammo_casing/c9mmap
ammo_type = "/obj/item/ammo_casing/c9mmap"
materials = list(MAT_METAL = 3000)
/obj/item/ammo_box/magazine/smgm9mm/toxin
name = "SMG magazine (Toxin Tipped 9mm)"
ammo_type = /obj/item/ammo_casing/c9mmtox
ammo_type = "/obj/item/ammo_casing/c9mmtox"
materials = list(MAT_METAL = 3000)
/obj/item/ammo_box/magazine/smgm9mm/fire
name = "SMG Magazine (Incendiary 9mm)"
ammo_type = /obj/item/ammo_casing/c9mminc
ammo_type = "/obj/item/ammo_casing/c9mminc"
materials = list(MAT_METAL = 3000)
/obj/item/ammo_box/magazine/smgm9mm/update_icon()
@@ -194,7 +224,7 @@
name = "toploader magazine (5.56mm)"
icon_state = "5.56m"
origin_tech = "combat=5;syndicate=1"
ammo_type = /obj/item/ammo_casing/a556
ammo_type = "/obj/item/ammo_casing/a556"
caliber = "a556"
max_ammo = 30
multiple_sprites = 2
@@ -211,6 +241,29 @@
..()
icon_state = "[initial(icon_state)]-[round(ammo_count(),10)]"
/obj/item/ammo_box/magazine/m762/buckshot
name = "box magazine (buckshot)"
icon_state = "b762"
caliber = "shotgun"
ammo_type ="/obj/item/ammo_casing/shotgun/buckshot"
max_ammo = 300 // Bluespace!
/obj/item/ammo_box/magazine/m762/buckshot/update_icon()
..()
icon_state = "[initial(icon_state)]-[round(ammo_count(),60)]"
/obj/item/ammo_box/magazine/m762/he // I am not a good person.
name = "box magazine (40mm high explosive)"
icon_state = "g762"
caliber = "40mm"
ammo_type ="/obj/item/ammo_casing/a40mm"
max_ammo = 25
/obj/item/ammo_box/magazine/m762/he/update_icon()
..()
icon_state = "[initial(icon_state)]-[round(ammo_count(),5)]"
/obj/item/ammo_box/magazine/m12g
name = "shotgun magazine (12g slugs)"
icon_state = "m12gb"
@@ -357,6 +357,9 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
use_external_power = 1
recharge_time = 5
/obj/item/weapon/gun/energy/printer/update_icon()
return
/obj/item/weapon/gun/energy/wormhole_projector
name = "bluespace wormhole projector"
desc = "A projector that emits high density quantum-coupled bluespace beams."
@@ -6,11 +6,11 @@
can_suppress = 1
burst_size = 3
fire_delay = 2
action_button_name = "Toggle Firemode"
action_button_name = "Toggle Firemode"
/obj/item/weapon/gun/projectile/automatic/isHandgun()
return 0
/obj/item/weapon/gun/projectile/automatic/proto
name = "\improper Nanotrasen Saber SMG"
desc = "A prototype three-round burst 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors."
@@ -49,10 +49,10 @@
A.update_icon()
update_icon()
return 1
/obj/item/weapon/gun/projectile/automatic/ui_action_click()
burst_select()
/obj/item/weapon/gun/projectile/automatic/verb/burst_select()
var/mob/living/carbon/human/user = usr
select = !select
@@ -102,14 +102,30 @@
icon_state = "c20r[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""][chambered ? "" : "-e"][silenced ? "-suppressed" : ""]"
return
/obj/item/weapon/gun/projectile/automatic/wt550
name = "security auto rifle"
desc = "An outdated personal defense weapon utilized by law enforcement. The WT-550 Automatic Rifle fires 4.6x30mm rounds."
icon_state = "wt550"
item_state = "arg"
mag_type = "/obj/item/ammo_box/magazine/wt550m9"
fire_delay = 2
can_suppress = 0
burst_size = 1
action_button_name = null
/obj/item/weapon/gun/projectile/automatic/wt550/update_icon()
..()
icon_state = "wt550[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""]"
return
/obj/item/weapon/gun/projectile/automatic/mini_uzi
name = "\improper 'Type U3' Uzi"
desc = "A lightweight, burst-fire submachine gun, for when you really want someone dead. Uses 9mm rounds."
icon_state = "mini-uzi"
origin_tech = "combat=5;materials=2;syndicate=8"
mag_type = "/obj/item/ammo_box/magazine/uzim9mm"
burst_size = 2
burst_size = 2
/obj/item/weapon/gun/projectile/automatic/l6_saw
name = "\improper L6 SAW"
desc = "A heavily modified 7.62 light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the reciever below the designation."
@@ -125,13 +141,15 @@
can_suppress = 0
burst_size = 5
fire_delay = 3
/obj/item/weapon/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob)
cover_open = !cover_open
user << "<span class='notice'>You [cover_open ? "open" : "close"] [src]'s cover.</span>"
update_icon()
/obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon()
if(magazine && magazine.caliber != "a762")
icon_state = "l6[cover_open ? "open" : "closed"]0"
icon_state = "l6[cover_open ? "open" : "closed"][magazine ? round(magazine.ammo_count() * 2, 25) : "-empty"]"
/obj/item/weapon/gun/projectile/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) //what I tried to do here is just add a check to see if the cover is open or not and add an icon_state change because I can't figure out how c-20rs do it with overlays
@@ -163,6 +181,15 @@
return
..()
/obj/item/weapon/gun/projectile/automatic/l6_saw/devastator
name = "\improper 'Devastator' LMG"
desc = "A heavily modified L6 SAW designed to chamber wide rounds. Commonly used by elite Syndicate boarding teams "
mag_type = "/obj/item/ammo_box/magazine/m762/buckshot"
/obj/item/weapon/gun/projectile/automatic/l6_saw/devastator/New()
..()
mag_type = "/obj/item/ammo_box/magazine/m762" // Workaround so it spawns with a shotgun mag loaded, but can still load regular LMG mags.
/obj/item/weapon/gun/projectile/automatic/m90
name = "\improper M-90gl Carbine"
desc = "A three-round burst 5.56 toploading carbine, designated 'M-90gl'. Has an attached underbarrel grenade launcher which can be toggled on and off."
@@ -190,7 +217,7 @@
..()
empty_alarm()
return
/obj/item/weapon/gun/projectile/automatic/m90/attackby(var/obj/item/A, mob/user, params)
if(istype(A, /obj/item/ammo_casing))
if(istype(A, text2path(underbarrel.magazine.ammo_type)))
@@ -258,4 +285,3 @@
can_suppress = 0
burst_size = 3
fire_delay = 1
@@ -64,10 +64,31 @@
..(user)
user << "[get_ammo(0,0)] of those are live rounds."
/obj/item/weapon/gun/projectile/revolver/verb/spin_revolver()
set name = "Spin cylinder"
set desc = "Fun when you're bored out of your skull."
set category = "Object"
usr.visible_message("<span class='warning'>[usr] spins the chamber of the revolver.</span>", "<span class='warning'>You spin the revolver's chamber.</span>")
playsound(src.loc, 'sound/weapons/revolver_spin.ogg', 100, 1)
Spin()
/obj/item/weapon/gun/projectile/revolver/proc/Spin()
chambered = null
var/random = rand(1, magazine.max_ammo)
if(random <= get_ammo(0,0))
chamber_round()
update_icon()
/obj/item/weapon/gun/projectile/revolver/capgun
name = "cap gun"
desc = "Looks almost like the real thing! Ages 8 and up."
origin_tech = "combat=1;materials=1"
mag_type = "/obj/item/ammo_box/magazine/internal/cylinder/cap"
/obj/item/weapon/gun/projectile/revolver/detective
name = "\improper .38 Mars Special"
desc = "A cheap Martian knock-off of a classic law enforcement firearm. Uses .38-special rounds."
name = "revolver"
name = "\improper .38 Mars Special"
icon_state = "detective"
origin_tech = "combat=2;materials=2"
mag_type = "/obj/item/ammo_box/magazine/internal/cylinder/rev38"
@@ -168,43 +189,11 @@
desc = "A Russian-made revolver for drinking games. Uses .357 ammo, and has a mechanism that spins the chamber before each trigger pull."
origin_tech = "combat=2;materials=2"
mag_type = "/obj/item/ammo_box/magazine/internal/cylinder/rus357"
var/spun = 0
/obj/item/weapon/gun/projectile/revolver/russian/New()
..()
Spin()
update_icon()
/obj/item/weapon/gun/projectile/revolver/russian/proc/Spin()
chambered = null
var/random = rand(1, magazine.max_ammo)
if(random <= get_ammo(0,0))
chamber_round()
spun = 1
/obj/item/weapon/gun/projectile/revolver/russian/attackby(var/obj/item/A as obj, mob/user as mob, params)
..()
user.visible_message("<span class='warning'>[user] spins the chamber of the revolver.</span>", "<span class='warning'>You spin the revolver's chamber.</span>")
if(get_ammo() > 0)
Spin()
update_icon()
A.update_icon()
return
/obj/item/weapon/gun/projectile/revolver/russian/attack_self(mob/user as mob)
if(!spun && get_ammo(0,0))
user.visible_message("<span class='warning'>[user] spins the chamber of the revolver.</span>", "<span class='warning'>You spin the revolver's chamber.</span>")
Spin()
else
..()
/obj/item/weapon/gun/projectile/revolver/russian/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params)
if (!spun)
Spin()
return
..()
spun = 0
/obj/item/weapon/gun/projectile/revolver/russian/attack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj)
@@ -229,6 +218,5 @@
user.apply_damage(300, BRUTE, affecting, sharp=1) // You are dead, dead, dead.
return
spun = 0
..()
@@ -74,16 +74,6 @@
if (chambered)
user << "A [chambered.BB ? "live" : "spent"] one is in the chamber."
// COMBAT SHOTGUN //
/obj/item/weapon/gun/projectile/shotgun/combat
name = "combat shotgun"
desc = "A traditional shotgun with tactical furniture and an eight-shell capacity underneath."
icon_state = "cshotgun"
origin_tech = "combat=5;materials=2"
mag_type = "/obj/item/ammo_box/magazine/internal/shotcom"
w_class = 5
// RIOT SHOTGUN //
/obj/item/weapon/gun/projectile/shotgun/riot //for spawn in the armory
@@ -237,7 +227,7 @@
return
else
sawn_state = SAWN_INTACT
/obj/item/weapon/gun/projectile/automatic/shotgun/bulldog
name = "\improper 'Bulldog' Shotgun"
desc = "A compact, mag-fed semi-automatic shotgun for combat in narrow corridors, nicknamed 'Bulldog' by boarding parties. Compatible only with specialized 8-round drum magazines."
@@ -273,3 +263,17 @@
..()
empty_alarm()
return
/obj/item/weapon/gun/projectile/shotgun/automatic/Fire(mob/living/user as mob|obj)
..()
pump(user)
// COMBAT SHOTGUN //
/obj/item/weapon/gun/projectile/shotgun/automatic/combat
name = "combat shotgun"
desc = "A semi automatic shotgun with tactical furniture and a six-shell capacity underneath."
icon_state = "cshotgun"
origin_tech = "combat=5;materials=2"
mag_type = "/obj/item/ammo_box/magazine/internal/shotcom"
w_class = 5
+77 -74
View File
@@ -31,6 +31,7 @@
var/atom/original = null // the original target clicked
var/turf/starting = null // the projectile's starting turf
var/list/permutated = list() // we've passed through these atoms, don't try to hit them again
var/paused = FALSE //for suspending the projectile midair
var/p_x = 16
var/p_y = 16 // the pixel location of the tile that the player clicked. Default is the center
@@ -202,73 +203,74 @@
if(kill_count < 1)
del(src)
return
kill_count--
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
if(!paused)
kill_count--
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
if(!Angle)
Angle=round(Get_Angle(src,current))
//world << "[Angle] angle"
//overlays.Cut()
//var/icon/I=new(initial(icon),icon_state) //using initial(icon) makes sure that the angle for that is reset as well
//I.Turn(Angle)
//I.DrawBox(rgb(255,0,0,50),1,1,32,32)
//icon = I
if(spread) //Chaotic spread
Angle += (rand() - 0.5) * spread
var/matrix/M = new//matrix(transform)
M.Turn(Angle)
transform = M
if(!Angle)
Angle=round(Get_Angle(src,current))
//world << "[Angle] angle"
//overlays.Cut()
//var/icon/I=new(initial(icon),icon_state) //using initial(icon) makes sure that the angle for that is reset as well
//I.Turn(Angle)
//I.DrawBox(rgb(255,0,0,50),1,1,32,32)
//icon = I
if(spread) //Chaotic spread
Angle += (rand() - 0.5) * spread
var/matrix/M = new//matrix(transform)
M.Turn(Angle)
transform = M
var/Pixel_x=round(sin(Angle)+16*sin(Angle)*2)
var/Pixel_y=round(cos(Angle)+16*cos(Angle)*2)
var/pixel_x_offset = pixel_x + Pixel_x
var/pixel_y_offset = pixel_y + Pixel_y
var/new_x = x
var/new_y = y
//Not sure if using whiles for this is good
while(pixel_x_offset > 16)
//world << "Pre-adjust coords (x++): xy [pixel_x] xy offset [pixel_x_offset]"
pixel_x_offset -= 32
pixel_x -= 32
new_x++// x++
while(pixel_x_offset < -16)
//world << "Pre-adjust coords (x--): xy [pixel_x] xy offset [pixel_x_offset]"
pixel_x_offset += 32
pixel_x += 32
new_x--
var/Pixel_x=round(sin(Angle)+16*sin(Angle)*2)
var/Pixel_y=round(cos(Angle)+16*cos(Angle)*2)
var/pixel_x_offset = pixel_x + Pixel_x
var/pixel_y_offset = pixel_y + Pixel_y
var/new_x = x
var/new_y = y
//Not sure if using whiles for this is good
while(pixel_x_offset > 16)
//world << "Pre-adjust coords (x++): xy [pixel_x] xy offset [pixel_x_offset]"
pixel_x_offset -= 32
pixel_x -= 32
new_x++// x++
while(pixel_x_offset < -16)
//world << "Pre-adjust coords (x--): xy [pixel_x] xy offset [pixel_x_offset]"
pixel_x_offset += 32
pixel_x += 32
new_x--
while(pixel_y_offset > 16)
//world << "Pre-adjust coords (y++): py [pixel_y] py offset [pixel_y_offset]"
pixel_y_offset -= 32
pixel_y -= 32
new_y++
while(pixel_y_offset < -16)
//world << "Pre-adjust coords (y--): py [pixel_y] py offset [pixel_y_offset]"
pixel_y_offset += 32
pixel_y += 32
new_y--
while(pixel_y_offset > 16)
//world << "Pre-adjust coords (y++): py [pixel_y] py offset [pixel_y_offset]"
pixel_y_offset -= 32
pixel_y -= 32
new_y++
while(pixel_y_offset < -16)
//world << "Pre-adjust coords (y--): py [pixel_y] py offset [pixel_y_offset]"
pixel_y_offset += 32
pixel_y += 32
new_y--
speed = round(speed) //Just in case.
step_towards(src, locate(new_x, new_y, z)) //Original projectiles stepped towards 'current'
if(speed <= 1) //We should really only animate at speed 2
pixel_x = pixel_x_offset
pixel_y = pixel_y_offset
else
animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (speed <= 3 ? speed - 1 : speed)))
speed = round(speed) //Just in case.
step_towards(src, locate(new_x, new_y, z)) //Original projectiles stepped towards 'current'
if(speed <= 1) //We should really only animate at speed 2
pixel_x = pixel_x_offset
pixel_y = pixel_y_offset
else
animate(src, pixel_x = pixel_x_offset, pixel_y = pixel_y_offset, time = max(1, (speed <= 3 ? speed - 1 : speed)))
/*
var/turf/T = get_turf(src)
if(T)
T.color = "#6666FF"
spawn(10)
T.color = initial(T.color)
*/
/*
var/turf/T = get_turf(src)
if(T)
T.color = "#6666FF"
spawn(10)
T.color = initial(T.color)
*/
if(!bumped && ((original && original.layer>=2.75) || ismob(original)))
if(loc == get_turf(original))
if(!(original in permutated))
Bump(original)
if(!bumped && ((original && original.layer>=2.75) || ismob(original)))
if(loc == get_turf(original))
if(!(original in permutated))
Bump(original)
Range()
sleep(max(1, speed))
else
@@ -277,19 +279,20 @@
if(kill_count < 1)
del(src)
return
kill_count--
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
if(!Angle)
Angle=round(Get_Angle(src,current))
var/matrix/M = new//matrix(transform)
M.Turn(Angle)
transform = M //So there's no need to give icons directions again
step_towards(src, current)
if(!bumped && ((original && original.layer>=2.75) || ismob(original)))
if(loc == get_turf(original))
if(!(original in permutated))
Bump(original)
if(!paused)
kill_count--
if((!( current ) || loc == current))
current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z)
if(!Angle)
Angle=round(Get_Angle(src,current))
var/matrix/M = new//matrix(transform)
M.Turn(Angle)
transform = M //So there's no need to give icons directions again
step_towards(src, current)
if(!bumped && ((original && original.layer>=2.75) || ismob(original)))
if(loc == get_turf(original))
if(!(original in permutated))
Bump(original)
Range()
sleep(1)
+13 -2
View File
@@ -8,6 +8,17 @@
embed = 1
sharp = 1
/obj/item/projectile/bullet/cap
name = "cap"
damage = 0
nodamage = 1
embed = 0
sharp = 0
/obj/item/projectile/bullet/cap/process()
loc = null
del(src)
/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage
damage = 5
stamina = 80
@@ -17,9 +28,9 @@
sharp = 0
/obj/item/projectile/bullet/weakbullet2 //detective revolver instastuns, but multiple shots are better for keeping punks down
damage = 15
damage = 5
weaken = 3
stamina = 50
stamina = 60
/obj/item/projectile/bullet/weakbullet2/rubber //detective's bullets that don't embed
embed = 0
+47 -9
View File
@@ -14,7 +14,7 @@
var/energy = 100
var/max_energy = 100
var/amount = 30
var/beaker = null
var/obj/item/weapon/reagent_containers/beaker = null
var/recharged = 0
var/hackedcheck = 0
var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine",
@@ -123,15 +123,15 @@
var beakerContents[0]
var beakerCurrentVolume = 0
if(beaker && beaker:reagents && beaker:reagents.reagent_list.len)
for(var/datum/reagent/R in beaker:reagents.reagent_list)
if(beaker && beaker.reagents && beaker.reagents.reagent_list.len)
for(var/datum/reagent/R in beaker.reagents.reagent_list)
beakerContents.Add(list(list("name" = R.name, "id"=R.id, "volume" = R.volume))) // list in a list because Byond merges the first list...
beakerCurrentVolume += R.volume
data["beakerContents"] = beakerContents
if (beaker)
data["beakerCurrentVolume"] = beakerCurrentVolume
data["beakerMaxVolume"] = beaker:volume
data["beakerMaxVolume"] = beaker.volume
else
data["beakerCurrentVolume"] = null
data["beakerMaxVolume"] = null
@@ -385,7 +385,7 @@
icon_state = "mixer0"
use_power = 1
idle_power_usage = 20
var/beaker = null
var/obj/item/weapon/reagent_containers/beaker = null
var/obj/item/weapon/storage/pill_bottle/loaded_pill_bottle = null
var/mode = 0
var/condi = 0
@@ -483,7 +483,7 @@
P.info += "<b>Time of analysis:</b> [worldtime2text(world.time)]<br><br>"
P.info += "<b>Chemical name:</b> [href_list["name"]]<br>"
if(href_list["name"] == "Blood")
var/datum/reagents/R = beaker:reagents
var/datum/reagents/R = beaker.reagents
var/datum/reagent/blood/G
for(var/datum/reagent/F in R.reagent_list)
if(F.name == href_list["name"])
@@ -499,7 +499,7 @@
src.printing = null
if(beaker)
var/datum/reagents/R = beaker:reagents
var/datum/reagents/R = beaker.reagents
if (href_list["analyze"])
var/dat = ""
if(!condi)
@@ -562,7 +562,7 @@
return
else if (href_list["eject"])
if(beaker)
beaker:loc = src.loc
beaker.forceMove(get_turf(src))
beaker = null
reagents.clear_reagents()
icon_state = "mixer0"
@@ -695,7 +695,7 @@
dat += "No pill bottle inserted.<BR><BR>"
dat += "<A href='?src=\ref[src];close=1'>Close</A>"
else
var/datum/reagents/R = beaker:reagents
var/datum/reagents/R = beaker.reagents
dat += "<A href='?src=\ref[src];eject=1'>Eject beaker and Clear Buffer</A><BR>"
if(src.loaded_pill_bottle)
dat += "<A href='?src=\ref[src];ejectp=1'>Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]</A><BR><BR>"
@@ -759,6 +759,44 @@
name = "\improper CondiMaster 3000"
condi = 1
/obj/machinery/chem_master/constructable
name = "ChemMaster 2999"
desc = "Used to seperate chemicals and distribute them in a variety of forms."
/obj/machinery/chem_master/constructable/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/chem_master(null)
component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(null)
/obj/machinery/chem_master/constructable/attackby(obj/item/B, mob/user, params)
if(default_deconstruction_screwdriver(user, "mixer0_nopower", "mixer0", B))
if(beaker)
beaker.forceMove(get_turf(src))
beaker = null
reagents.clear_reagents()
if(loaded_pill_bottle)
loaded_pill_bottle.forceMove(get_turf(src))
loaded_pill_bottle = null
return
if(exchange_parts(user, B))
return
if(panel_open)
if(istype(B, /obj/item/weapon/crowbar))
default_deconstruction_crowbar(B)
return 1
else
user << "<span class='warning'>You can't use the [src.name] while it's panel is opened!</span>"
return 1
else
..()
/obj/machinery/reagentgrinder
name = "\improper All-In-One Grinder"
+14 -18
View File
@@ -650,8 +650,7 @@ datum/reagent/strange_reagent/reaction_mob(var/mob/living/M as mob, var/method=T
if(istype(M, /mob/living/simple_animal))
if(method == TOUCH)
if(M.stat == DEAD)
M.health = M.maxHealth
M.update_revive()
M.revive()
M.visible_message("<span class='warning'>[M] seems to rise from the dead!</span>")
if(istype(M, /mob/living/carbon))
if(method == INGEST)
@@ -761,19 +760,20 @@ proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reac
/datum/reagent/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob)
M.jitteriness = 0
var/needs_update = 1 //M.mutations.len > 0
var/needs_update = M.mutations.len > 0 || M.disabilities > 0 || M.sdisabilities > 0
for(var/block=1;block<=DNA_SE_LENGTH;block++)
M.dna.SetSEState(block,0)
genemutcheck(M,block,null,MUTCHK_FORCED)
M.update_mutations()
if(needs_update)
for(var/block=1;block<=DNA_SE_LENGTH;block++)
M.dna.SetSEState(block,0, 1)
genemutcheck(M,block,null,MUTCHK_FORCED)
M.dna.UpdateSE()
M.dna.struc_enzymes = M.dna.struc_enzymes_original
M.dna.struc_enzymes = M.dna.struc_enzymes_original
// Might need to update appearance for hulk etc.
if(needs_update && ishuman(M))
var/mob/living/carbon/human/H = M
H.update_mutations()
// Might need to update appearance for hulk etc.
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.update_mutations()
..()
return
@@ -1016,12 +1016,8 @@ datum/reagent/haloperidol/on_mob_life(var/mob/living/M as mob)
if (!istype(T)) return
src = null
if(volume >= 1)
if(T.wet >= 2) //Clears lube! Fight back against the slipping, and WIN!
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
return
if(istype(T) && T.wet)
T.MakeDry(TURF_WET_LUBE)
/datum/reagent/degreaser/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
+4 -1
View File
@@ -27,7 +27,7 @@ datum/reagent/carpet
color = "#701345"
/datum/reagent/carpet/reaction_turf(var/turf/simulated/T, var/volume)
if(T.is_plating() || T.is_plasteel_floor())
if(istype(T, /turf/simulated/floor/plating) || istype(T, /turf/simulated/floor/plasteel))
var/turf/simulated/floor/F = T
F.ChangeTurf(/turf/simulated/floor/carpet)
..()
@@ -204,6 +204,7 @@ datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume)
H.g_hair = rand(0,255)
H.b_hair = rand(0,255)
H.update_hair()
H.update_fhair()
..()
return
@@ -229,6 +230,7 @@ datum/reagent/hairgrownium/reaction_mob(var/mob/living/M, var/volume)
H.h_style = random_hair_style(H.gender, H.species)
H.f_style = random_facial_hair_style(H.gender, H.species)
H.update_hair()
H.update_fhair()
..()
return
@@ -256,6 +258,7 @@ datum/reagent/super_hairgrownium/on_mob_life(var/mob/living/M as mob)
H.h_style = "Very Long Hair"
H.f_style = "Very Long Beard"
H.update_hair()
H.update_fhair()
if(!H.wear_mask || H.wear_mask && !istype(H.wear_mask, /obj/item/clothing/mask/fakemoustache))
if(H.wear_mask)
H.unEquip(H.wear_mask)
+1 -1
View File
@@ -622,7 +622,7 @@ datum/reagent/firefighting_foam/reaction_obj(var/obj/O, var/volume)
var/turf/T = get_turf(holder.my_atom)
for(var/mob/living/carbon/C in view(6, T))
C.Beam(T,icon_state="lightning[rand(1,12)]",icon='icons/effects/effects.dmi',time=5) //What? Why are we beaming from the mob to the turf? Turf to mob generates really odd results.
C.electrocute_act(1, "electrical blast")
C.electrocute_act(3.5, "electrical blast")
holder.del_reagent("teslium") //Clear all remaining Teslium and Uranium, but leave all other reagents untouched.
holder.del_reagent("uranium")
return
@@ -196,4 +196,11 @@
result = "lsd"
required_reagents = list("diethylamine" = 1, "fungus" = 1)
result_amount = 3
mix_message = "The mixture turns a rather unassuming color and settles."
mix_message = "The mixture turns a rather unassuming color and settles."
drying_agent
name = "Drying agent"
id = "drying_agent"
result = "drying_agent"
required_reagents = list("plasma" = 2, "ethanol" = 1, "sodium" = 1)
result_amount = 3
@@ -450,11 +450,25 @@
Z.loc = get_turf(holder.my_atom)
Z.announce_to_ghosts()
//Bluespace
slimefloor2
name = "Bluespace Floor"
id = "m_floor2"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/bluespace
required_other = 1
on_reaction(datum/reagents/holder, created_volume)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/stack/tile/bluespace/P = new /obj/item/stack/tile/bluespace
P.amount = 25
P.loc = get_turf(holder.my_atom)
slimecrystal
name = "Slime Crystal"
id = "m_crystal"
result = null
required_reagents = list("blood" = 1)
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/bluespace
required_other = 1
@@ -477,11 +491,28 @@
var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2
P.loc = get_turf(holder.my_atom)
//Sepia
slimestop
name = "Slime Stop"
id = "m_stop"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
spawn(0) //otherwise the reagent won't be used up until after the full timstop is gone through.
var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast)
var/obj/effect/timestop/T = new (get_turf(holder.my_atom))
T.immune += mob
T.timestop()
slimecamera
name = "Slime Camera"
id = "m_camera"
result = null
required_reagents = list("plasma" = 1)
required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
@@ -489,20 +520,23 @@
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
var/obj/item/device/camera/P = new /obj/item/device/camera
P.loc = get_turf(holder.my_atom)
var/obj/item/device/camera_film/Z = new /obj/item/device/camera_film
Z.loc = get_turf(holder.my_atom)
slimefilm
name = "Slime Film"
id = "m_film"
slimefloor
name = "Sepia Floor"
id = "m_floor"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
var/obj/item/device/camera_film/P = new /obj/item/device/camera_film
on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/stack/tile/sepia/P = new /obj/item/stack/tile/sepia
P.amount = 25
P.loc = get_turf(holder.my_atom)
//Pyrite
slimepaint
name = "Slime Paint"
@@ -281,21 +281,7 @@
if (!istype(T)) return
src = null
if(volume >= 3)
if(T.wet >= 1) return
T.wet = 1
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
T.overlays += T.wet_overlay
spawn(800)
if (!istype(T)) return
if(T.wet >= 2) return
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.MakeSlippery()
var/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot)
var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles() )
@@ -113,6 +113,7 @@
/datum/reagent/rezadone/on_mob_life(mob/living/M)
M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that.
M.adjustCloneLoss(-1) //What? We just set cloneloss to 0. Why? Simple; this is so external organs properly unmutate.
M.heal_organ_damage(1,1)
M.status_flags &= ~DISFIGURED
..()
@@ -31,21 +31,7 @@
if (!istype(T)) return
src = null
if(volume >= 3)
if(T.wet >= 1) return
T.wet = 1
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
T.overlays += T.wet_overlay
spawn(800)
if (!istype(T)) return
if(T.wet >= 2) return
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.MakeSlippery()
for(var/mob/living/carbon/slime/M in T)
M.apply_water()
@@ -91,15 +77,7 @@
if (!istype(T)) return
src = null
if(volume >= 1)
if(T.wet >= 2) return
T.wet = 2
spawn(800)
if (!istype(T)) return
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
return
T.MakeSlippery(TURF_WET_LUBE)
/datum/reagent/space_cleaner
@@ -122,7 +100,6 @@
if(volume >= 1)
if(T)
T.color = initial(T.color)
T.overlays.Cut()
T.clean_blood()
for(var/obj/effect/decal/cleanable/C in src)
qdel(C)
@@ -350,6 +327,23 @@
reagent_state = LIQUID
color = "#FFFFD6" // very very light yellow
/datum/reagent/drying_agent
name = "Drying agent"
id = "drying_agent"
description = "Can be used to dry things."
reagent_state = LIQUID
color = "#A70FFF"
/datum/reagent/drying_agent/reaction_turf(turf/simulated/T, reac_volume)
if(istype(T) && T.wet)
T.MakeDry(TURF_WET_WATER)
/datum/reagent/drying_agent/reaction_obj(obj/O, reac_volume)
if(istype(O, /obj/item/clothing/shoes/galoshes))
var/t_loc = get_turf(O)
qdel(O)
new /obj/item/clothing/shoes/galoshes/dry(t_loc)
/*
/datum/reagent/vaccine
//data must contain virus type
@@ -1680,8 +1680,7 @@
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand()
visible_message("<span class='notice'>[src] expands!</span>")
var/mob/living/carbon/human/H = new (get_turf(src))
H.set_species(monkey_type)
new/mob/living/carbon/human(get_turf(src),monkey_type)
qdel(src)
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Unwrap(mob/user)
@@ -358,3 +358,33 @@ datum/design/AAC
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/atmos_automation
//Shield Generators//
/datum/design/shield_gen_ex
name = "Circuit Design (Experimental hull shield generator)"
desc = "Allows for the construction of circuit boards used to build an experimental hull shield generator."
id = "shield_gen_ex"
req_tech = list("bluespace" = 4, "plasmatech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_DIAMOND = 10000, MAT_GOLD = 10000)
build_path = /obj/item/weapon/circuitboard/shield_gen_ex
/datum/design/shield_gen
name = "Circuit Design (Experimental shield generator)"
desc = "Allows for the construction of circuit boards used to build an experimental shield generator."
id = "shield_gen"
req_tech = list("bluespace" = 4, "plasmatech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_DIAMOND = 10000, MAT_GOLD = 10000)
build_path = /obj/item/weapon/circuitboard/shield_gen
/datum/design/shield_cap
name = "Circuit Design (Experimental shield capacitor)"
desc = "Allows for the construction of circuit boards used to build an experimental shielding capacitor."
id = "shield_cap"
req_tech = list("magnets" = 3, "powerstorage" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_DIAMOND = 10000, MAT_GOLD = 10000)
build_path = /obj/item/weapon/circuitboard/shield_cap
@@ -152,6 +152,16 @@
build_path = /obj/item/weapon/circuitboard/chem_dispenser
category = list("Medical Machinery")
/datum/design/chem_master
name = "Machine Design (Chem Master Board)"
desc = "The circuit board for a Chem Master 2999."
id = "chem_master"
req_tech = list("biotech" = 1, "materials" = 2, "programming" = 2)
build_type = IMPRINTER
materials = list(MAT_GLASS = 1000, "sacid" = 20)
build_path = /obj/item/weapon/circuitboard/chem_master
category = list("Medical Machinery")
/datum/design/chem_heater
name = "Machine Design (Chemical Heater Board)"
desc = "The circuit board for a chemical heater."
@@ -167,6 +167,39 @@
materials = list(MAT_METAL = 3000, MAT_GLASS = 200, MAT_URANIUM = 1000)
build_path = /obj/item/ammo_box/magazine/smgm9mm/toxin
//WT550 Mags
/datum/design/mag_oldsmg
name = "WT-550 Auto Gun Magazine (4.6×30mm)"
desc = "A 20 round magazine for the out of date security WT-550 Auto Rifle"
id = "mag_oldsmg"
req_tech = list("combat" = 1, "materials" = 1)
build_type = PROTOLATHE
materials = list(MAT_METAL = 4000)
build_path = /obj/item/ammo_box/magazine/wt550m9
category = list("Weapons")
/datum/design/mag_oldsmg/ap_mag
name = "WT-550 Auto Gun Armour Piercing Magazine (4.6×30mm AP)"
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle"
id = "mag_oldsmg_ap"
materials = list(MAT_METAL = 6000, MAT_SILVER = 600)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtap
/datum/design/mag_oldsmg/ic_mag
name = "WT-550 Auto Gun Incendiary Magazine (4.6×30mm IC)"
desc = "A 20 round armour piercing magazine for the out of date security WT-550 Auto Rifle"
id = "mag_oldsmg_ic"
materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_GLASS = 1000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wtic
/datum/design/mag_oldsmg/tx_mag
name = "WT-550 Auto Gun Urnaium Magazine (4.6×30mm TX)"
desc = "A 20 round urnaium tipped magazine for the out of date security WT-550 Auto Rifle"
id = "mag_oldsmg_tx"
materials = list(MAT_METAL = 6000, MAT_SILVER = 600, MAT_URANIUM = 2000)
build_path = /obj/item/ammo_box/magazine/wt550m9/wttx
/datum/design/rapidsyringe
name = "Rapid Syringe Gun"
desc = "A gun that fires many syringes."
+1 -5
View File
@@ -518,11 +518,7 @@
visible_message("<span class='warning'>[src] improves [exp_on], drawing the life essence of those nearby!</span>")
for(var/mob/living/m in view(4,src))
m << "<span class='danger'>You feel your flesh being torn from you, mists of blood drifting to [src]!</span>"
m.apply_damage(10,"brute","head")
m.apply_damage(10,"brute","chest")
m.apply_damage(10,"brute","groin")
m.apply_damage(10,"brute","r_leg")
m.apply_damage(10,"brute","l_leg")
m.take_overall_damage(50)
investigate_log("Experimentor has taken 50 brute a blood sacrifice from [m]", "experimentor")
var/list/reqs = ConvertReqString2List(exp_on.origin_tech)
for(var/T in reqs)
@@ -0,0 +1,549 @@
/// Slime Extracts ///
/obj/item/slime_extract
name = "slime extract"
desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"."
icon = 'icons/mob/slimes.dmi'
icon_state = "grey slime extract"
force = 1.0
w_class = 1.0
throwforce = 0
throw_speed = 3
throw_range = 6
origin_tech = "biotech=4"
item_color = "grey"
var/Uses = 1 // uses before it goes inert
var/enhanced = 0 //has it been enhanced before?
attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/slimesteroid2))
if(enhanced == 1)
user << "<span class='warning'> This extract has already been enhanced!</span>"
return ..()
if(Uses == 0)
user << "<span class='warning'> You can't enhance a used extract!</span>"
return ..()
user <<"You apply the enhancer. It now has triple the amount of uses."
Uses = 3
enhanced = 1
qdel(O)
if(istype(O,/obj/item/weapon/storage/bag))
..()
/obj/item/slime_extract/New()
..()
create_reagents(100)
/obj/item/slime_extract/grey
name = "grey slime extract"
icon_state = "grey slime extract"
item_color = "grey"
/obj/item/slime_extract/gold
name = "gold slime extract"
icon_state = "gold slime extract"
item_color = "gold"
/obj/item/slime_extract/silver
name = "silver slime extract"
icon_state = "silver slime extract"
item_color = "silver"
/obj/item/slime_extract/metal
name = "metal slime extract"
icon_state = "metal slime extract"
item_color = "metal"
/obj/item/slime_extract/purple
name = "purple slime extract"
icon_state = "purple slime extract"
item_color = "purple"
/obj/item/slime_extract/darkpurple
name = "dark purple slime extract"
icon_state = "dark purple slime extract"
item_color = "darkpurple"
/obj/item/slime_extract/orange
name = "orange slime extract"
icon_state = "orange slime extract"
item_color = "orange"
/obj/item/slime_extract/yellow
name = "yellow slime extract"
icon_state = "yellow slime extract"
item_color = "yellow"
/obj/item/slime_extract/red
name = "red slime extract"
icon_state = "red slime extract"
item_color = "red"
/obj/item/slime_extract/blue
name = "blue slime extract"
icon_state = "blue slime extract"
item_color = "blue"
/obj/item/slime_extract/darkblue
name = "dark blue slime extract"
icon_state = "dark blue slime extract"
item_color = "darkblue"
/obj/item/slime_extract/pink
name = "pink slime extract"
icon_state = "pink slime extract"
item_color = "pink"
/obj/item/slime_extract/green
name = "green slime extract"
icon_state = "green slime extract"
item_color = "green"
/obj/item/slime_extract/lightpink
name = "light pink slime extract"
icon_state = "light pink slime extract"
item_color = "lightpink"
/obj/item/slime_extract/black
name = "black slime extract"
icon_state = "black slime extract"
item_color = "black"
/obj/item/slime_extract/oil
name = "oil slime extract"
icon_state = "oil slime extract"
item_color = "oil"
/obj/item/slime_extract/adamantine
name = "adamantine slime extract"
icon_state = "adamantine slime extract"
item_color = "adamantine"
/obj/item/slime_extract/bluespace
name = "bluespace slime extract"
icon_state = "bluespace slime extract"
/obj/item/slime_extract/pyrite
name = "pyrite slime extract"
icon_state = "pyrite slime extract"
/obj/item/slime_extract/cerulean
name = "cerulean slime extract"
icon_state = "cerulean slime extract"
/obj/item/slime_extract/sepia
name = "sepia slime extract"
icon_state = "sepia slime extract"
/obj/item/slime_extract/rainbow
name = "rainbow slime extract"
icon_state = "rainbow slime extract"
////Pet Slime Creation///
/obj/item/weapon/slimepotion
name = "docility potion"
desc = "A potent chemical mix that will nullify a slime's powers, causing it to become docile and tame."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
w_class = 1
origin_tech = "biotech=4"
attack(mob/living/carbon/slime/M as mob, mob/user as mob)
if(!istype(M, /mob/living/carbon/slime))//If target is not a slime.
user << "<span class='warning'> The potion only works on slimes!</span>"
return ..()
if(M.stat)
user << "<span class='warning'> The slime is dead!</span>"
return..()
if(M.mind)
user << "<span class='warning'> The slime resists!</span>"
return ..()
if(M.is_adult)
var/mob/living/simple_animal/adultslime/pet = new /mob/living/simple_animal/adultslime(M.loc)
pet.icon_state = "[M.colour] adult slime"
pet.icon_living = "[M.colour] adult slime"
pet.icon_dead = "[M.colour] baby slime dead"
pet.colour = "[M.colour]"
qdel(M)
var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN))
if (!newname)
newname = "pet slime"
pet.name = newname
pet.real_name = newname
qdel(src)
else
var/mob/living/simple_animal/slime/pet = new /mob/living/simple_animal/slime(M.loc)
pet.icon_state = "[M.colour] baby slime"
pet.icon_living = "[M.colour] baby slime"
pet.icon_dead = "[M.colour] baby slime dead"
pet.colour = "[M.colour]"
qdel(M)
var/newname = sanitize(copytext(input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime") as null|text,1,MAX_NAME_LEN))
if (!newname)
newname = "pet slime"
pet.name = newname
pet.real_name = newname
qdel(src)
user <<"You feed the slime the potion, removing it's powers and calming it."
/obj/item/weapon/sentience_potion
name = "sentience potion"
desc = "A miraculous chemical mix that can raise the intelligence of creatures to human levels. Unlike normal slime potions, it can be absorbed by any nonsentient being."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle19"
origin_tech = "biotech=5"
var/list/not_interested = list()
var/being_used = 0
w_class = 1
/obj/item/weapon/sentience_potion/afterattack(mob/living/M, mob/user)
if(being_used || !ismob(M))
return
if(!isanimal(M) || M.ckey) //only works on animals that aren't player controlled
user << "<span class='warning'>[M] is already too intelligent for this to work!</span>"
return ..()
if(M.stat)
user << "<span class='warning'>[M] is dead!</span>"
return..()
user << "<span class='notice'>You offer the sentience potion to [M]...</span>"
being_used = 1
var/list/candidates = get_candidates(ROLE_SENTIENT, ALIEN_AFK_BRACKET)
shuffle(candidates)
var/time_passed = world.time
var/list/consenting_candidates = list()
for(var/candidate in candidates)
if(candidate in not_interested)
continue
spawn(0)
switch(alert(candidate, "Would you like to play as [M.name]? Please choose quickly!","Confirmation","Yes","No"))
if("Yes")
if((world.time-time_passed)>=50 || !src)
return
consenting_candidates += candidate
if("No")
if(!src)
return
not_interested += candidate
sleep(50)
if(!src)
return
listclearnulls(consenting_candidates) //some candidates might have left during sleep(50)
if(consenting_candidates.len)
var/client/C = null
C = pick(consenting_candidates)
M.key = C.key
M.universal_speak = 1
M.faction |= "sentient"
M << "<span class='warning'>All at once it makes sense: you know what you are and who you are! Self awareness is yours!</span>"
M << "<span class='userdanger'>You are grateful to be self aware and owe [user] a great debt. Serve [user], and assist them in completing their goals at any cost.</span>"
user << "<span class='notice'>[M] accepts the potion and suddenly becomes attentive and aware. It worked!</span>"
if(isanimal(M))
var/mob/living/simple_animal/S = M
S.master_commander = user
qdel(src)
else
user << "<span class='notice'>[M] looks interested for a moment, but then looks back down. Maybe you should try again later.</span>"
being_used = 0
..()
/obj/item/weapon/slimesteroid
name = "slime steroid"
desc = "A potent chemical mix that will cause a slime to generate more extract."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
w_class = 1
origin_tech = "biotech=4"
attack(mob/living/carbon/slime/M as mob, mob/user as mob)
if(!istype(M, /mob/living/carbon/slime))//If target is not a slime.
user << "<span class='warning'> The steroid only works on baby slimes!</span>"
return ..()
if(M.is_adult) //Can't tame adults
user << "<span class='warning'> Only baby slimes can use the steroid!</span>"
return..()
if(M.stat)
user << "<span class='warning'> The slime is dead!</span>"
return..()
if(M.cores == 3)
user <<"<span class='warning'> The slime already has the maximum amount of extract!</span>"
return..()
user <<"You feed the slime the steroid. It now has triple the amount of extract."
M.cores = 3
qdel(src)
/obj/item/weapon/slimesteroid2
name = "extract enhancer"
desc = "A potent chemical mix that will give a slime extract three uses."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
w_class = 1
origin_tech = "biotech=4"
/obj/item/weapon/slimespeed
name = "slime speed potion"
desc = "A potent chemical mix that will remove the slowdown from any item."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle3"
w_class = 1
origin_tech = "biotech=4"
/obj/item/weapon/slimespeed/afterattack(obj/item/C, mob/user)
..()
if(!istype(C))
user << "<span class='warning'>The potion can only be used on items!</span>"
return
if(C.slowdown <= 0)
user << "<span class='warning'>The [C] can't be made any faster!</span>"
return..()
user <<"<span class='notice'>You slather the red gunk over the [C], making it faster.</span>"
C.color = "#FF0000"
C.slowdown = 0
qdel(src)
/obj/item/weapon/slimefireproof
name = "slime chill potion"
desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle17"
var/uses = 3
w_class = 1
origin_tech = "biotech=4"
/obj/item/weapon/slimefireproof/afterattack(obj/item/clothing/C, mob/user)
..()
if(!uses)
qdel(src)
return
if(!istype(C))
user << "<span class='warning'>The potion can only be used on clothing!</span>"
return
if(C.max_heat_protection_temperature == FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
user << "<span class='warning'>The [C] is already fireproof!</span>"
return..()
user <<"<span class='notice'>You slather the blue gunk over the [C], fireproofing it.</span>"
C.name = "fireproofed [C.name]"
C.color = "#000080"
C.max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
C.heat_protection = C.body_parts_covered
uses --
if(!uses)
qdel(src)
/obj/effect/timestop
anchored = 1
name = "chronofield"
desc = "ZA WARUDO"
icon = 'icons/effects/160x160.dmi'
icon_state = "time"
layer = FLY_LAYER
pixel_x = -64
pixel_y = -64
unacidable = 1
mouse_opacity = 0
var/mob/living/immune = list() // the one who creates the timestop is immune
var/list/stopped_atoms = list()
var/freezerange = 2
var/duration = 140
alpha = 125
/obj/effect/timestop/New()
..()
for(var/mob/living/M in player_list)
for(var/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop/T in M.mind.spell_list) //People who can stop time are immune to timestop
immune |= M
/obj/effect/timestop/proc/timestop()
playsound(get_turf(src), 'sound/magic/TIMEPARADOX2.ogg', 100, 1, -1)
for(var/i in 1 to duration-1)
for(var/A in orange (freezerange, src.loc))
if(istype(A, /mob/living))
var/mob/living/M = A
if(M in immune)
continue
M.stunned = 10
M.anchored = 1
if(istype(M, /mob/living/simple_animal/hostile))
var/mob/living/simple_animal/hostile/H = M
H.AIStatus = AI_OFF
H.LoseTarget()
stopped_atoms |= M
else if(istype(A, /obj/item/projectile))
var/obj/item/projectile/P = A
P.paused = TRUE
stopped_atoms |= P
for(var/mob/living/M in stopped_atoms)
if(get_dist(get_turf(M),get_turf(src)) > freezerange) //If they lagged/ran past the timestop somehow, just ignore them
unfreeze_mob(M)
stopped_atoms -= M
sleep(1)
//End
for(var/mob/living/M in stopped_atoms)
unfreeze_mob(M)
for(var/obj/item/projectile/P in stopped_atoms)
P.paused = FALSE
qdel(src)
return
/obj/effect/timestop/proc/unfreeze_mob(mob/living/M)
M.stunned = 0
M.anchored = 0
if(istype(M, /mob/living/simple_animal/hostile))
var/mob/living/simple_animal/hostile/H = M
H.AIStatus = initial(H.AIStatus)
/obj/effect/timestop/wizard
duration = 100
/obj/effect/timestop/wizard/New()
..()
timestop()
/obj/item/stack/tile/bluespace
name = "bluespace floor tile"
singular_name = "floor tile"
desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds."
icon_state = "tile-bluespace"
w_class = 3
force = 6
materials = list(MAT_METAL=500)
throwforce = 10
throw_speed = 3
throw_range = 7
flags = CONDUCT
max_amount = 60
turf_type = /turf/simulated/floor/bluespace
/turf/simulated/floor/bluespace
slowdown = -1
icon_state = "bluespace"
desc = "Through a series of micro-teleports, these tiles let people move at incredible speeds."
floor_tile = /obj/item/stack/tile/bluespace
/obj/item/stack/tile/sepia
name = "sepia floor tile"
singular_name = "floor tile"
desc = "Time seems to flow very slowly around these tiles."
icon_state = "tile-sepia"
w_class = 3
force = 6
materials = list(MAT_METAL=500)
throwforce = 10
throw_speed = 3
throw_range = 7
flags = CONDUCT
max_amount = 60
turf_type = /turf/simulated/floor/sepia
/turf/simulated/floor/sepia
slowdown = 2
icon_state = "sepia"
desc = "Time seems to flow very slowly around these tiles."
floor_tile = /obj/item/stack/tile/sepia
/obj/effect/goleRUNe
anchored = 1
desc = "a strange rune used to create golems. It glows when spirits are nearby."
name = "rune"
icon = 'icons/obj/rune.dmi'
icon_state = "golem"
unacidable = 1
layer = TURF_LAYER
var/list/mob/dead/observer/ghosts[0]
New()
..()
processing_objects.Add(src)
process()
if(ghosts.len>0)
icon_state = "golem2"
else
icon_state = "golem"
attack_hand(mob/living/user as mob)
var/mob/dead/observer/ghost
for(var/mob/dead/observer/O in src.loc)
if(!check_observer(O))
O << "\red You are not eligible to become a golem."
continue
ghost = O
break
if(!ghost)
user << "The rune fizzles uselessly. There is no spirit nearby."
return
var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem
if(prob(50)) G.gender = "female"
G.loc = src.loc
G.key = ghost.key
G << "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. Serve [user], and assist them in completing their goals at any cost."
qdel(src)
proc/announce_to_ghosts()
for(var/mob/dead/observer/O in player_list)
if(O.client)
var/area/A = get_area(src)
if(A)
O << "\blue <b>Golem rune created in [A.name]. (<a href='?src=\ref[O];jump=\ref[src]'>Teleport</a> | <a href='?src=\ref[src];signup=\ref[O]'>Sign Up</a>)</b>"
Topic(href,href_list)
if("signup" in href_list)
var/mob/dead/observer/O = locate(href_list["signup"])
volunteer(O)
attack_ghost(var/mob/dead/observer/O)
if(!O) return
volunteer(O)
proc/check_observer(var/mob/dead/observer/O)
if(!O)
return 0
if(!O.client)
return 0
if(O.mind && O.mind.current && O.mind.current.stat != DEAD)
return 0
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
return 0
return 1
proc/volunteer(var/mob/dead/observer/O)
if(O in ghosts)
ghosts.Remove(O)
O << "\red You are no longer signed up to be a golem."
else
if(!check_observer(O))
O << "\red You are not eligible to become a golem."
return
ghosts.Add(O)
O << "\blue You are signed up to be a golem."
@@ -16,15 +16,6 @@
"/obj/item/weapon/stock_parts/console_screen" = 1,
"/obj/item/stack/cable_coil" = 5)
datum/design/shield_gen_ex
name = "Circuit Design (Experimental hull shield generator)"
desc = "Allows for the construction of circuit boards used to build an experimental hull shield generator."
id = "shield_gen"
req_tech = list("bluespace" = 4, "plasmatech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_PLASMA = 10000, MAT_DIAMOND = 5000, MAT_GOLD = 10000)
build_path = "/obj/machinery/shield_gen/external"
////////////////////////////////////////
// Shield Generator
@@ -42,15 +33,6 @@ datum/design/shield_gen_ex
"/obj/item/weapon/stock_parts/console_screen" = 1,
"/obj/item/stack/cable_coil" = 5)
datum/design/shield_gen
name = "Circuit Design (Experimental shield generator)"
desc = "Allows for the construction of circuit boards used to build an experimental shield generator."
id = "shield_gen"
req_tech = list("bluespace" = 4, "plasmatech" = 3)
build_type = IMPRINTER
materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_PLASMA = 10000, MAT_DIAMOND = 5000, MAT_GOLD = 10000)
build_path = "/obj/machinery/shield_gen/external"
////////////////////////////////////////
// Shield Capacitor
@@ -67,12 +49,3 @@ datum/design/shield_gen
"/obj/item/weapon/stock_parts/subspace/analyzer" = 1,
"/obj/item/weapon/stock_parts/console_screen" = 1,
"/obj/item/stack/cable_coil" = 5)
datum/design/shield_cap
name = "Circuit Design (Experimental shield capacitor)"
desc = "Allows for the construction of circuit boards used to build an experimental shielding capacitor."
id = "shield_cap"
req_tech = list("magnets" = 3, "powerstorage" = 4)
build_type = IMPRINTER
materials = list(MAT_GLASS = 2000, "sacid" = 20, MAT_PLASMA = 10000, MAT_DIAMOND = 5000, MAT_SILVER = 10000)
build_path = "/obj/machinery/shield_gen/external"
+4
View File
@@ -301,6 +301,10 @@
//rotate our direction
dir = angle2dir(rotation+dir2angle(dir))
//resmooth if need be.
if(smooth)
smooth_icon(src)
//rotate the pixel offsets too.
if (pixel_x || pixel_y)
if (rotation < 0)
+6 -1
View File
@@ -35,9 +35,14 @@ var/global/datum/robolimb/basic_robolimb
company = "Xion Manufacturing Group"
desc = "This limb has a minimalist black and red casing."
icon = 'icons/mob/human_races/cyberlimbs/xion.dmi'
/datum/robolimb/ipc
company = "Morpheus Cyberkinetics"
desc = "This limb is simple and functional; no effort has been made to make it look human."
icon = 'icons/mob/human_races/cyberlimbs/ipc.dmi'
unavailable_at_chargen = 1
/datum/robolimb/wardtakahashi
company = "Ward-Takahashi"
desc = "This limb features sleek black and white polymers."
icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi.dmi'
@@ -127,7 +127,7 @@
/obj/item/organ/internal/brain/mmi_holder/posibrain/New()
robotize()
stored_mmi = new /obj/item/device/mmi/posibrain(src)
stored_mmi = new /obj/item/device/mmi/posibrain/ipc(src)
..()
spawn(1)
if(owner)
@@ -147,6 +147,7 @@
owner.unEquip(owner.wear_mask)
spawn(1)
owner.update_hair()
owner.update_fhair()
..()
/obj/item/organ/external/head/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list())
+4 -15
View File
@@ -556,19 +556,8 @@
if(istype(mob.loc,/turf/simulated))
var/turf/simulated/T = mob.loc
if(T.wet < 1)
T.wet = 1
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
T.overlays += T.wet_overlay
spawn(800)
if (istype(T) && T.wet < 2)
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
if(T.wet < TURF_WET_WATER)
T.MakeSlippery()
@@ -593,7 +582,7 @@
if(H.species.name == "Human" && !(H.f_style == "Elvis Sideburns"))
spawn(50)
H.f_style = "Elvis Sideburns"
H.update_hair()
H.update_fhair()
/obj/item/clothing/glasses/virussunglasses
@@ -805,7 +794,7 @@ var/list/compatible_mobs = list(/mob/living/carbon/human)
H << "<span class='warning'>Your chin and neck itch!.</span>"
spawn(50)
H.f_style = "Full Beard"
H.update_hair()
H.update_fhair()
/datum/disease2/effect/bloodynose
name = "Intranasal Hemorrhage"