mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-14 00:26:02 +01:00
Merge branch 'bleeding-edge-freeze' into organ
Conflicts: html/changelog.html
This commit is contained in:
@@ -499,9 +499,12 @@ var/global/floorIsLava = 0
|
||||
<A href='?src=\ref[src];quick_create_object=1'>Quick Create Object</A><br>
|
||||
<A href='?src=\ref[src];create_turf=1'>Create Turf</A><br>
|
||||
<A href='?src=\ref[src];create_mob=1'>Create Mob</A><br>
|
||||
<br><A href='?src=\ref[src];vsc=airflow'>Edit Airflow Settings</A><br>
|
||||
<A href='?src=\ref[src];vsc=plasma'>Edit Plasma Settings</A><br>
|
||||
<A href='?src=\ref[src];vsc=default'>Choose a default ZAS setting</A><br>
|
||||
"}
|
||||
|
||||
usr << browse(dat, "window=admin2;size=210x180")
|
||||
usr << browse(dat, "window=admin2;size=210x280")
|
||||
return
|
||||
|
||||
/datum/admins/proc/Secrets()
|
||||
|
||||
@@ -64,6 +64,7 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/cmd_admin_change_custom_event,
|
||||
/client/proc/cmd_admin_rejuvenate,
|
||||
/client/proc/toggleattacklogs,
|
||||
/client/proc/toggledebuglogs,
|
||||
/datum/admins/proc/show_skills,
|
||||
/client/proc/check_customitem_activity
|
||||
)
|
||||
@@ -120,7 +121,6 @@ var/list/admin_verbs_server = list(
|
||||
/client/proc/check_customitem_activity
|
||||
)
|
||||
var/list/admin_verbs_debug = list(
|
||||
/client/proc/restart_controller,
|
||||
/client/proc/cmd_admin_list_open_jobs,
|
||||
/client/proc/Debug2,
|
||||
/client/proc/kill_air,
|
||||
@@ -134,7 +134,9 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/air_report,
|
||||
/client/proc/reload_admins,
|
||||
/client/proc/restart_controller,
|
||||
/client/proc/enable_debug_verbs
|
||||
/client/proc/enable_debug_verbs,
|
||||
/client/proc/callproc,
|
||||
/client/proc/toggledebuglogs
|
||||
)
|
||||
var/list/admin_verbs_possess = list(
|
||||
/proc/possess,
|
||||
@@ -222,6 +224,7 @@ var/list/admin_verbs_mod = list(
|
||||
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
|
||||
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
|
||||
/client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/
|
||||
/client/proc/toggledebuglogs,
|
||||
/datum/admins/proc/PlayerNotes,
|
||||
/client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/
|
||||
/client/proc/cmd_mod_say,
|
||||
@@ -721,4 +724,15 @@ var/list/admin_verbs_mod = list(
|
||||
if (prefs.toggles & CHAT_ATTACKLOGS)
|
||||
usr << "You now will get attack log messages"
|
||||
else
|
||||
usr << "You now won't get attack log messages"
|
||||
usr << "You now won't get attack log messages"
|
||||
|
||||
|
||||
/client/proc/toggledebuglogs()
|
||||
set name = "Toggle Debug Log Messages"
|
||||
set category = "Preferences"
|
||||
|
||||
prefs.toggles ^= CHAT_DEBUGLOGS
|
||||
if (prefs.toggles & CHAT_DEBUGLOGS)
|
||||
usr << "You now will get debug log messages"
|
||||
else
|
||||
usr << "You now won't get debug log messages"
|
||||
@@ -10,7 +10,7 @@
|
||||
switch(href_list["makeAntag"])
|
||||
if("1")
|
||||
log_admin("[key_name(usr)] has spawned a traitor.")
|
||||
if(!src.makeTratiors())
|
||||
if(!src.makeTraitors())
|
||||
usr << "\red Unfortunatly there were no candidates available"
|
||||
if("2")
|
||||
log_admin("[key_name(usr)] has spawned a changeling.")
|
||||
@@ -2422,6 +2422,15 @@
|
||||
if(check_rights(R_ADMIN|R_SERVER))
|
||||
populate_inactive_customitems_list(src.owner)
|
||||
|
||||
else if(href_list["vsc"])
|
||||
if(check_rights(R_ADMIN|R_SERVER))
|
||||
if(href_list["vsc"] == "airflow")
|
||||
vsc.ChangeSettingsDialog(usr,vsc.settings)
|
||||
if(href_list["vsc"] == "plasma")
|
||||
vsc.ChangeSettingsDialog(usr,vsc.plc.settings)
|
||||
if(href_list["vsc"] == "default")
|
||||
vsc.SetDefault(usr)
|
||||
|
||||
// player info stuff
|
||||
|
||||
if(href_list["add_player_info"])
|
||||
|
||||
@@ -13,24 +13,24 @@
|
||||
var/list/istates = J.IconStates()
|
||||
if(!Lstates.Find(O.icon_state) && !Lstates.Find(O.item_state))
|
||||
if(O.icon_state)
|
||||
text += "[O.type] WANTS IN LEFT HAND CALLED\n\"[O.icon_state]\".\n"
|
||||
text += "[O.type] is missing left hand icon called \"[O.icon_state]\".\n"
|
||||
if(!Rstates.Find(O.icon_state) && !Rstates.Find(O.item_state))
|
||||
if(O.icon_state)
|
||||
text += "[O.type] WANTS IN RIGHT HAND CALLED\n\"[O.icon_state]\".\n"
|
||||
text += "[O.type] is missing right hand icon called \"[O.icon_state]\".\n"
|
||||
|
||||
|
||||
if(O.icon_state)
|
||||
if(!istates.Find(O.icon_state))
|
||||
text += "[O.type] MISSING NORMAL ICON CALLED\n\"[O.icon_state]\" IN \"[O.icon]\"\n"
|
||||
if(O.item_state)
|
||||
if(!istates.Find(O.item_state))
|
||||
text += "[O.type] MISSING NORMAL ICON CALLED\n\"[O.item_state]\" IN \"[O.icon]\"\n"
|
||||
text+="\n"
|
||||
text += "[O.type] is missing normal icon called \"[O.icon_state]\" in \"[O.icon]\".\n"
|
||||
//if(O.item_state)
|
||||
// if(!istates.Find(O.item_state))
|
||||
// text += "[O.type] MISSING NORMAL ICON CALLED\n\"[O.item_state]\" IN \"[O.icon]\"\n"
|
||||
//text+="\n"
|
||||
del(O)
|
||||
if(text)
|
||||
var/F = file("broken_icons.txt")
|
||||
fdel(F)
|
||||
F << text
|
||||
world << "Completely successfully and written to [F]"
|
||||
world << "Completeled successfully and written to [F]"
|
||||
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ var/inactive_keys = "None<br>"
|
||||
//run a query to get all ckeys inactive for over 2 months
|
||||
var/list/inactive_ckeys = list()
|
||||
if(ckeys_with_customitems.len)
|
||||
var/DBQuery/query_inactive = dbcon.NewQuery("SELECT ckey, lastseen FROM erro_player WHERE datediff(Now(),lastseen) > 2")
|
||||
var/DBQuery/query_inactive = dbcon.NewQuery("SELECT ckey, lastseen FROM erro_player WHERE datediff(Now(), lastseen) > 60")
|
||||
query_inactive.Execute()
|
||||
while(query_inactive.NextRow())
|
||||
var/cur_ckey = query_inactive.item[1]
|
||||
|
||||
@@ -547,13 +547,14 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
"assassin",
|
||||
"death commando",
|
||||
"syndicate commando",
|
||||
"centcom official",
|
||||
"centcom commander",
|
||||
"special ops officer",
|
||||
"blue wizard",
|
||||
"red wizard",
|
||||
"marisa wizard",
|
||||
"emergency rescue team",
|
||||
"nanotrasen representative",
|
||||
"nanotrasen officer",
|
||||
"nanotrasen captain"
|
||||
)
|
||||
var/dresscode = input("Select dress for [M]", "Robust quick dress shop") as null|anything in dresspacks
|
||||
if (isnull(dresscode))
|
||||
@@ -742,54 +743,79 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
if("syndicate commando")
|
||||
M.equip_syndicate_commando()
|
||||
|
||||
if("centcom official")
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
|
||||
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hop(M), slot_ears)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/pen(M), slot_l_store)
|
||||
if("nanotrasen representative")
|
||||
M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/representative(M), slot_w_uniform)
|
||||
M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
|
||||
M.equip_if_possible(new /obj/item/clothing/gloves/white(M), slot_gloves)
|
||||
M.equip_if_possible(new /obj/item/device/radio/headset/heads/hop(M), slot_ears)
|
||||
|
||||
var/obj/item/device/pda/heads/pda = new(M)
|
||||
pda.owner = M.real_name
|
||||
pda.ownjob = "CentCom Review Official"
|
||||
pda.ownjob = "NanoTrasen Navy Representative"
|
||||
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
|
||||
|
||||
M.equip_to_slot_or_del(pda, slot_r_store)
|
||||
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/clipboard(M), slot_l_hand)
|
||||
M.equip_if_possible(pda, slot_r_store)
|
||||
M.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
|
||||
M.equip_if_possible(new /obj/item/weapon/clipboard(M), slot_belt)
|
||||
|
||||
var/obj/item/weapon/card/id/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card"
|
||||
W.icon_state = "centcom"
|
||||
W.item_state = "id_inv"
|
||||
W.access = get_all_accesses()
|
||||
W.access += list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer")
|
||||
W.assignment = "CentCom Review Official"
|
||||
W.assignment = "NanoTrasen Navy Representative"
|
||||
W.registered_name = M.real_name
|
||||
M.equip_to_slot_or_del(W, slot_wear_id)
|
||||
M.equip_if_possible(W, slot_wear_id)
|
||||
|
||||
if("centcom commander")
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_commander(M), slot_w_uniform)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/bulletproof(M), slot_wear_suit)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(M), slot_shoes)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
|
||||
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(M), slot_ears)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/cohiba(M), slot_wear_mask)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/head/centhat(M), slot_head)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/mateba(M), slot_belt)
|
||||
M.equip_to_slot_or_del(new /obj/item/weapon/lighter/zippo(M), slot_r_store)
|
||||
M.equip_to_slot_or_del(new /obj/item/ammo_magazine/a357(M), slot_l_store)
|
||||
if("nanotrasen officer")
|
||||
M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/officer(M), slot_w_uniform)
|
||||
M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
|
||||
M.equip_if_possible(new /obj/item/clothing/gloves/white(M), slot_gloves)
|
||||
M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), slot_ears)
|
||||
M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/officer(M), slot_head)
|
||||
|
||||
var/obj/item/weapon/card/id/W = new(M)
|
||||
var/obj/item/device/pda/heads/pda = new(M)
|
||||
pda.owner = M.real_name
|
||||
pda.ownjob = "NanoTrasen Navy Officer"
|
||||
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
|
||||
|
||||
M.equip_if_possible(pda, slot_r_store)
|
||||
M.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
|
||||
M.equip_if_possible(new /obj/item/weapon/gun/energy(M), slot_belt)
|
||||
|
||||
var/obj/item/weapon/card/id/centcom/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card"
|
||||
W.icon_state = "centcom"
|
||||
W.access = get_all_accesses()
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "CentCom Commanding Officer"
|
||||
W.assignment = "NanoTrasen Navy Officer"
|
||||
W.registered_name = M.real_name
|
||||
M.equip_to_slot_or_del(W, slot_wear_id)
|
||||
M.equip_if_possible(W, slot_wear_id)
|
||||
|
||||
|
||||
if("nanotrasen captain")
|
||||
M.equip_if_possible(new /obj/item/clothing/under/rank/centcom/captain(M), slot_w_uniform)
|
||||
M.equip_if_possible(new /obj/item/clothing/shoes/centcom(M), slot_shoes)
|
||||
M.equip_if_possible(new /obj/item/clothing/gloves/white(M), slot_gloves)
|
||||
M.equip_if_possible(new /obj/item/device/radio/headset/heads/captain(M), slot_ears)
|
||||
M.equip_if_possible(new /obj/item/clothing/head/beret/centcom/captain(M), slot_head)
|
||||
|
||||
var/obj/item/device/pda/heads/pda = new(M)
|
||||
pda.owner = M.real_name
|
||||
pda.ownjob = "NanoTrasen Navy Captain"
|
||||
pda.name = "PDA-[M.real_name] ([pda.ownjob])"
|
||||
|
||||
M.equip_if_possible(pda, slot_r_store)
|
||||
M.equip_if_possible(new /obj/item/clothing/glasses/sunglasses(M), slot_l_store)
|
||||
M.equip_if_possible(new /obj/item/weapon/gun/energy(M), slot_belt)
|
||||
|
||||
var/obj/item/weapon/card/id/centcom/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card"
|
||||
W.access = get_all_accesses()
|
||||
W.access += get_all_centcom_access()
|
||||
W.assignment = "NanoTrasen Navy Captain"
|
||||
W.registered_name = M.real_name
|
||||
M.equip_if_possible(W, slot_wear_id)
|
||||
|
||||
if("emergency rescue team")
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
|
||||
|
||||
@@ -159,6 +159,8 @@ var/intercom_range_display_status = 0
|
||||
src.verbs += /client/proc/kill_air_processing
|
||||
src.verbs += /client/proc/disable_communication
|
||||
src.verbs += /client/proc/disable_movement
|
||||
src.verbs += /client/proc/Zone_Info
|
||||
src.verbs += /client/proc/Test_ZAS_Connection
|
||||
//src.verbs += /client/proc/cmd_admin_rejuvenate
|
||||
|
||||
feedback_add_details("admin_verb","mDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -11,7 +11,7 @@ client/proc/one_click_antag()
|
||||
/datum/admins/proc/one_click_antag()
|
||||
|
||||
var/dat = {"<B>One-click Antagonist</B><br>
|
||||
<a href='?src=\ref[src];makeAntag=1'>Make Tratiors</a><br>
|
||||
<a href='?src=\ref[src];makeAntag=1'>Make Traitors</a><br>
|
||||
<a href='?src=\ref[src];makeAntag=2'>Make Changlings</a><br>
|
||||
<a href='?src=\ref[src];makeAntag=3'>Make Revs</a><br>
|
||||
<a href='?src=\ref[src];makeAntag=4'>Make Cult</a><br>
|
||||
@@ -53,7 +53,7 @@ client/proc/one_click_antag()
|
||||
return 0
|
||||
|
||||
|
||||
/datum/admins/proc/makeTratiors()
|
||||
/datum/admins/proc/makeTraitors()
|
||||
var/datum/game_mode/traitor/temp = new
|
||||
|
||||
if(config.protect_roles_from_antagonist)
|
||||
|
||||
@@ -7,12 +7,18 @@
|
||||
|
||||
/obj/effect/spawner/lootdrop/initialize()
|
||||
var/list/things = params2list(loot)
|
||||
|
||||
if(things && things.len)
|
||||
for(var/i = lootcount, i > 0, i--)
|
||||
if(!things.len) return
|
||||
var/lootspawn = text2path(pick(things))
|
||||
if(!lootdoubles)
|
||||
things.Remove(lootspawn)
|
||||
if(!things.len)
|
||||
return
|
||||
|
||||
new lootspawn(get_turf(src))
|
||||
var/loot_spawn = pick(things)
|
||||
var/loot_path = text2path(loot_spawn)
|
||||
|
||||
if(!loot_path || !lootdoubles)
|
||||
things.Remove(loot_spawn)
|
||||
continue
|
||||
|
||||
new loot_path(get_turf(src))
|
||||
del(src)
|
||||
@@ -30,7 +30,7 @@
|
||||
////////////
|
||||
var/next_allowed_topic_time = 10
|
||||
// comment out the line below when debugging locally to enable the options & messages menu
|
||||
control_freak = 1
|
||||
//control_freak = 1
|
||||
|
||||
|
||||
////////////////////////////////////
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//SECURITY//
|
||||
////////////
|
||||
#define TOPIC_SPAM_DELAY 4 //4 ticks is about 3/10ths of a second
|
||||
#define UPLOAD_LIMIT 1048576 //Restricts client uploads to the server to 1MB //Could probably do with being lower.
|
||||
#define UPLOAD_LIMIT 10485760 //Restricts client uploads to the server to 10MB //Boosted this thing. What's the worst that can happen?
|
||||
#define MIN_CLIENT_VERSION 0 //Just an ambiguously low version for now, I don't want to suddenly stop people playing.
|
||||
//I would just like the code ready should it ever need to be used.
|
||||
/*
|
||||
@@ -273,5 +273,9 @@
|
||||
'icons/spideros_icons/sos_11.png',
|
||||
'icons/spideros_icons/sos_12.png',
|
||||
'icons/spideros_icons/sos_13.png',
|
||||
'icons/spideros_icons/sos_14.png'
|
||||
'icons/spideros_icons/sos_14.png',
|
||||
'icons/xenoarch_icons/chart1.jpg',
|
||||
'icons/xenoarch_icons/chart2.jpg',
|
||||
'icons/xenoarch_icons/chart3.jpg',
|
||||
'icons/xenoarch_icons/chart4.jpg'
|
||||
)
|
||||
@@ -19,6 +19,10 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
|
||||
|
||||
var/const/MAX_SAVE_SLOTS = 10
|
||||
|
||||
//used for alternate_option
|
||||
#define GET_RANDOM_JOB 0
|
||||
#define BE_ASSISTANT 1
|
||||
#define RETURN_TO_LOBBY 2
|
||||
|
||||
datum/preferences
|
||||
//doohickeys for savefiles
|
||||
@@ -32,7 +36,6 @@ datum/preferences
|
||||
var/last_ip
|
||||
var/last_id
|
||||
|
||||
|
||||
//game-preferences
|
||||
var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
|
||||
var/ooccolor = "#b82e00"
|
||||
@@ -79,9 +82,8 @@ datum/preferences
|
||||
var/job_engsec_med = 0
|
||||
var/job_engsec_low = 0
|
||||
|
||||
// Want randomjob if preferences already filled - Donkie
|
||||
var/userandomjob = 1 //defaults to 1 for fewer assistants
|
||||
|
||||
//Keeps track of preferrence for not getting any wanted jobs
|
||||
var/alternate_option = 0
|
||||
|
||||
var/used_skillpoints = 0
|
||||
var/skill_specialization = null
|
||||
@@ -252,6 +254,7 @@ datum/preferences
|
||||
dat += "Blood Type: <a href='byond://?src=\ref[user];preference=b_type;task=input'>[b_type]</a><br>"
|
||||
dat += "Skin Tone: <a href='?_src_=prefs;preference=s_tone;task=input'>[-s_tone + 35]/220<br></a>"
|
||||
//dat += "Skin pattern: <a href='byond://?src=\ref[user];preference=skin_style;task=input'>Adjust</a><br>"
|
||||
dat += "Needs Glasses: <a href='?_src_=prefs;preference=disabilities'><b>[disabilities == 0 ? "No" : "Yes"]</b></a><br>"
|
||||
dat += "Limbs: <a href='byond://?src=\ref[user];preference=limbs;task=input'>Adjust</a><br>"
|
||||
|
||||
//display limbs below
|
||||
@@ -440,7 +443,14 @@ datum/preferences
|
||||
|
||||
HTML += "</center></table>"
|
||||
|
||||
HTML += "<center><br><u><a href='?_src_=prefs;preference=job;task=random'><font color=[userandomjob ? "green>Get random job if preferences unavailable" : "red>Be assistant if preference unavailable"]</font></a></u></center><br>"
|
||||
switch(alternate_option)
|
||||
if(GET_RANDOM_JOB)
|
||||
HTML += "<center><br><u><a href='?_src_=prefs;preference=job;task=random'><font color=green>Get random job if preferences unavailable</font></a></u></center><br>"
|
||||
if(BE_ASSISTANT)
|
||||
HTML += "<center><br><u><a href='?_src_=prefs;preference=job;task=random'><font color=red>Be assistant if preference unavailable</font></a></u></center><br>"
|
||||
if(RETURN_TO_LOBBY)
|
||||
HTML += "<center><br><u><a href='?_src_=prefs;preference=job;task=random'><font color=purple>Return to lobby if prefernce unavailable</font></a></u></center><br>"
|
||||
|
||||
HTML += "<center><a href='?_src_=prefs;preference=job;task=reset'>\[Reset\]</a></center>"
|
||||
HTML += "</tt>"
|
||||
|
||||
@@ -640,7 +650,12 @@ datum/preferences
|
||||
ResetJobs()
|
||||
SetChoices(user)
|
||||
if("random")
|
||||
userandomjob = !userandomjob
|
||||
if(alternate_option == GET_RANDOM_JOB || alternate_option == BE_ASSISTANT)
|
||||
alternate_option += 1
|
||||
else if(alternate_option == RETURN_TO_LOBBY)
|
||||
alternate_option = 0
|
||||
else
|
||||
return 0
|
||||
SetChoices(user)
|
||||
if ("alt_title")
|
||||
var/datum/job/job = locate(href_list["job"])
|
||||
@@ -1008,6 +1023,9 @@ datum/preferences
|
||||
else
|
||||
gender = MALE
|
||||
|
||||
if("disabilities") //please note: current code only allows nearsightedness as a disability
|
||||
disabilities = !disabilities//if you want to add actual disabilities, code that selects them should be here
|
||||
|
||||
if("hear_adminhelps")
|
||||
toggles ^= SOUND_ADMINHELP
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#define SAVEFILE_VERSION_MIN 8
|
||||
#define SAVEFILE_VERSION_MAX 8
|
||||
#define SAVEFILE_VERSION_MAX 9
|
||||
|
||||
//handles converting savefiles to new formats
|
||||
//MAKE SURE YOU KEEP THIS UP TO DATE!
|
||||
@@ -119,9 +119,10 @@
|
||||
S["eyes_blue"] >> b_eyes
|
||||
S["underwear"] >> underwear
|
||||
S["backbag"] >> backbag
|
||||
S["b_type"] >> b_type
|
||||
|
||||
//Jobs
|
||||
S["userandomjob"] >> userandomjob
|
||||
S["alternate_option"] >> alternate_option
|
||||
S["job_civilian_high"] >> job_civilian_high
|
||||
S["job_civilian_med"] >> job_civilian_med
|
||||
S["job_civilian_low"] >> job_civilian_low
|
||||
@@ -170,8 +171,9 @@
|
||||
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
|
||||
underwear = sanitize_integer(underwear, 1, underwear_m.len, initial(underwear))
|
||||
backbag = sanitize_integer(backbag, 1, backbaglist.len, initial(backbag))
|
||||
b_type = sanitize_text(b_type, initial(b_type))
|
||||
|
||||
userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob))
|
||||
alternate_option = sanitize_integer(alternate_option, 0, 2, initial(alternate_option))
|
||||
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
|
||||
job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med))
|
||||
job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low))
|
||||
@@ -218,9 +220,10 @@
|
||||
S["eyes_blue"] << b_eyes
|
||||
S["underwear"] << underwear
|
||||
S["backbag"] << backbag
|
||||
S["b_type"] << b_type
|
||||
|
||||
//Jobs
|
||||
S["userandomjob"] << userandomjob
|
||||
S["alternate_option"] << alternate_option
|
||||
S["job_civilian_high"] << job_civilian_high
|
||||
S["job_civilian_med"] << job_civilian_med
|
||||
S["job_civilian_low"] << job_civilian_low
|
||||
@@ -237,6 +240,7 @@
|
||||
S["sec_record"] << sec_record
|
||||
S["player_alt_titles"] << player_alt_titles
|
||||
S["be_special"] << be_special
|
||||
S["disabilities"] << disabilities
|
||||
S["used_skillpoints"] << used_skillpoints
|
||||
S["skills"] << skills
|
||||
S["skill_specialization"] << skill_specialization
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/obj/item/clothing
|
||||
name = "clothing"
|
||||
|
||||
|
||||
//Ears: currently only used for headsets and earmuffs
|
||||
/obj/item/clothing/ears
|
||||
name = "ears"
|
||||
@@ -155,6 +156,7 @@ BLIND // can't see anything
|
||||
3 = Report location
|
||||
*/
|
||||
var/obj/item/clothing/tie/hastie = null
|
||||
var/displays_id = 1
|
||||
|
||||
/obj/item/clothing/under/attackby(obj/item/I, mob/user)
|
||||
if(!hastie && istype(I, /obj/item/clothing/tie))
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
vision_flags = SEE_TURFS
|
||||
|
||||
/obj/item/clothing/glasses/meson/prescription
|
||||
name = "prescription mesons"
|
||||
desc = "Optical Meson Scanner with prescription lenses."
|
||||
prescription = 1
|
||||
|
||||
/obj/item/clothing/glasses/science
|
||||
@@ -61,6 +63,7 @@
|
||||
desc = "Made by Nerd. Co."
|
||||
icon_state = "glasses"
|
||||
item_state = "glasses"
|
||||
prescription = 1
|
||||
|
||||
/obj/item/clothing/glasses/regular/hipster
|
||||
name = "Prescription Glasses"
|
||||
@@ -114,6 +117,13 @@
|
||||
|
||||
usr.update_inv_glasses()
|
||||
|
||||
/obj/item/clothing/glasses/welding/superior
|
||||
name = "superior welding goggles"
|
||||
desc = "Welding goggles made from more expensive materials, strangely smells like potatoes."
|
||||
icon_state = "rwelding-g"
|
||||
item_state = "rwelding-g"
|
||||
icon_action_button = "action_welding_g"
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/blindfold
|
||||
name = "blindfold"
|
||||
desc = "Covers the eyes, preventing sight."
|
||||
@@ -122,6 +132,7 @@
|
||||
vision_flags = BLIND
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/prescription
|
||||
name = "prescription sunglasses"
|
||||
prescription = 1
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/big
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
min_cold_protection_temperature = HELMET_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECITON_TEMPERATURE
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/head/helmet/warden
|
||||
name = "warden's hat"
|
||||
@@ -46,6 +47,7 @@
|
||||
armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0)
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
siemens_coefficient = 1
|
||||
|
||||
/obj/item/clothing/head/helmet/gladiator
|
||||
name = "gladiator helmet"
|
||||
@@ -53,4 +55,5 @@
|
||||
icon_state = "gladiator"
|
||||
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
|
||||
item_state = "gladiator"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
siemens_coefficient = 1
|
||||
@@ -7,6 +7,13 @@
|
||||
flags = FPRINT|TABLEPASS
|
||||
item_state = "centhat"
|
||||
|
||||
/obj/item/clothing/head/hairflower
|
||||
name = "hair flower pin"
|
||||
icon_state = "hairflower"
|
||||
desc = "Smells nice."
|
||||
item_state = "hairflower"
|
||||
flags = FPRINT|TABLEPASS
|
||||
|
||||
/obj/item/clothing/head/powdered_wig
|
||||
name = "powdered wig"
|
||||
desc = "A powdered wig."
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
flags = FPRINT|TABLEPASS|MASKCOVERSMOUTH
|
||||
w_class = 2
|
||||
gas_transfer_coefficient = 0.90
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/mask/pig
|
||||
name = "pig mask"
|
||||
|
||||
@@ -68,6 +68,12 @@
|
||||
permeability_coefficient = 0.01
|
||||
color = "white"
|
||||
|
||||
/obj/item/clothing/shoes/leather
|
||||
name = "leather shoes"
|
||||
desc = "A sturdy pair of leather shoes."
|
||||
icon_state = "leather"
|
||||
color = "leather"
|
||||
|
||||
/obj/item/clothing/shoes/rainbow
|
||||
name = "rainbow shoes"
|
||||
desc = "Very gay shoes."
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
flags = NOSLIP
|
||||
origin_tech = "syndicate=3"
|
||||
var/list/clothing_choices = list()
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/shoes/mime
|
||||
name = "mime shoes"
|
||||
@@ -19,6 +20,7 @@
|
||||
icon_state = "swat"
|
||||
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
|
||||
flags = NOSLIP
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/shoes/combat //Basically SWAT shoes combined with galoshes.
|
||||
name = "combat boots"
|
||||
@@ -26,6 +28,7 @@
|
||||
icon_state = "swat"
|
||||
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
|
||||
flags = NOSLIP
|
||||
siemens_coefficient = 0
|
||||
|
||||
cold_protection = FEET
|
||||
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
@@ -39,6 +42,7 @@
|
||||
permeability_coefficient = 0.01
|
||||
flags = NOSLIP
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
siemens_coefficient = 0
|
||||
|
||||
cold_protection = FEET
|
||||
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
@@ -78,6 +82,7 @@
|
||||
icon_state = "jackboots"
|
||||
item_state = "jackboots"
|
||||
color = "hosred"
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/shoes/cult
|
||||
name = "boots"
|
||||
@@ -85,6 +90,7 @@
|
||||
icon_state = "cult"
|
||||
item_state = "cult"
|
||||
color = "cult"
|
||||
siemens_coefficient = 0
|
||||
|
||||
cold_protection = FEET
|
||||
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
|
||||
@@ -26,3 +26,4 @@
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
siemens_coefficient = 0
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
icon_state = "ert_commander"
|
||||
item_state = "helm-command"
|
||||
armor = list(melee = 50, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60)
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/suit/space/ert
|
||||
name = "emergency response team suit"
|
||||
@@ -18,6 +19,7 @@
|
||||
/obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
|
||||
/obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse_rifle, \
|
||||
/obj/item/weapon/gun/energy/taser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/gun)
|
||||
siemens_coefficient = 0
|
||||
|
||||
//Commander
|
||||
/obj/item/clothing/head/helmet/space/ert/commander
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
siemens_coefficient = 0
|
||||
|
||||
//Deathsquad suit
|
||||
/obj/item/clothing/head/helmet/space/deathsquad
|
||||
@@ -33,6 +34,7 @@
|
||||
icon_state = "deathsquad"
|
||||
item_state = "deathsquad"
|
||||
armor = list(melee = 65, bullet = 55, laser = 35,energy = 20, bomb = 30, bio = 30, rad = 30)
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/head/helmet/space/deathsquad/beret
|
||||
name = "officer's beret"
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
item_state = "s-ninja_mask"
|
||||
allowed = list(/obj/item/weapon/cell)
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25)
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/space_ninja
|
||||
@@ -15,6 +16,7 @@
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/cell)
|
||||
slowdown = 0
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
siemens_coefficient = 0
|
||||
|
||||
//Important parts of the suit.
|
||||
var/mob/living/carbon/affecting = null//The wearer.
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
item_state = "syndie_helm"
|
||||
color = "syndi"
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60)
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/rig/syndi
|
||||
@@ -97,6 +98,7 @@
|
||||
w_class = 3
|
||||
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs)
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
//Wizard Rig
|
||||
@@ -108,6 +110,7 @@
|
||||
color = "wiz"
|
||||
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
|
||||
armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60)
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/suit/space/rig/wizard
|
||||
icon_state = "rig-wiz"
|
||||
@@ -118,6 +121,7 @@
|
||||
w_class = 3
|
||||
unacidable = 1
|
||||
armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60)
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
//Medical Rig
|
||||
@@ -144,6 +148,7 @@
|
||||
item_state = "sec_helm"
|
||||
color = "sec"
|
||||
armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10)
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/suit/space/rig/security
|
||||
icon_state = "rig-sec"
|
||||
@@ -152,6 +157,7 @@
|
||||
item_state = "sec_hardsuit"
|
||||
armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10)
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/melee/baton)
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
//Atmospherics Rig (BS12)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
item_state = "syndicate"
|
||||
desc = "Has a tag: Totally not property of an enemy corporation, honest."
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/suit/space/syndicate
|
||||
name = "red space suit"
|
||||
@@ -16,6 +17,7 @@
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
|
||||
slowdown = 1
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
//Green syndicate space suit
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO
|
||||
max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECITON_TEMPERATURE
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
/obj/item/clothing/suit/armor/vest
|
||||
@@ -171,9 +172,11 @@
|
||||
desc = "Reddish armor."
|
||||
icon_state = "tdred"
|
||||
item_state = "tdred"
|
||||
siemens_coefficient = 1
|
||||
|
||||
/obj/item/clothing/suit/armor/tdome/green
|
||||
name = "Thunderdome suit (green)"
|
||||
desc = "Pukish armor."
|
||||
icon_state = "tdgreen"
|
||||
item_state = "tdgreen"
|
||||
item_state = "tdgreen"
|
||||
siemens_coefficient = 1
|
||||
@@ -21,6 +21,14 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
|
||||
/obj/item/clothing/suit/captunic/capjacket
|
||||
name = "captain's uniform jacket"
|
||||
desc = "A less formal jacket for everyday captain use."
|
||||
icon_state = "capjacket"
|
||||
item_state = "bio_suit"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
|
||||
//Chaplain
|
||||
/obj/item/clothing/suit/chaplain_hoodie
|
||||
name = "chaplain hoodie"
|
||||
@@ -113,6 +121,35 @@
|
||||
blood_overlay_type = "coat"
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
|
||||
//Internal Affairs
|
||||
/obj/item/clothing/suit/storage/internalaffairs
|
||||
name = "Internal Affairs Jacket"
|
||||
desc = "A smooth black jacket."
|
||||
icon_state = "ia_jacket_open"
|
||||
item_state = "ia_jacket"
|
||||
blood_overlay_type = "coat"
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
|
||||
verb/toggle()
|
||||
set name = "Toggle Coat Buttons"
|
||||
set category = "Object"
|
||||
set src in usr
|
||||
|
||||
if(!usr.canmove || usr.stat || usr.restrained())
|
||||
return 0
|
||||
|
||||
switch(icon_state)
|
||||
if("ia_jacket_open")
|
||||
src.icon_state = "ia_jacket"
|
||||
usr << "You button up the jacket."
|
||||
if("ia_jacket")
|
||||
src.icon_state = "ia_jacket_open"
|
||||
usr << "You unbutton the jacket."
|
||||
else
|
||||
usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
|
||||
return
|
||||
usr.update_inv_wear_suit() //so our overlays update
|
||||
|
||||
//Mime
|
||||
/obj/item/clothing/suit/suspenders
|
||||
name = "suspenders"
|
||||
@@ -121,7 +158,7 @@
|
||||
icon_state = "suspenders"
|
||||
blood_overlay_type = "armor" //it's the less thing that I can put here
|
||||
|
||||
/obj/item/clothing/suit/fr_jacket
|
||||
/obj/item/clothing/suit/storage/fr_jacket
|
||||
name = "first responder jacket"
|
||||
desc = "A high-visibility jacket worn by medical first responders."
|
||||
icon_state = "fr_jacket_open"
|
||||
|
||||
@@ -287,6 +287,13 @@
|
||||
desc = "A rather skimpy green dress."
|
||||
icon_state = "stripper_g_over"
|
||||
item_state = "stripper_g"
|
||||
|
||||
/obj/item/clothing/under/stripper/mankini
|
||||
name = "the mankini"
|
||||
desc = "No honest man would wear this abomination"
|
||||
icon_state = "mankini"
|
||||
color = "mankini"
|
||||
|
||||
/obj/item/clothing/suit/xenos
|
||||
name = "xenos suit"
|
||||
desc = "A suit made out of chitinous alien hide."
|
||||
@@ -294,3 +301,35 @@
|
||||
item_state = "xenos_helm"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
|
||||
//swimsuit
|
||||
|
||||
/obj/item/clothing/under/swimsuit/black
|
||||
name = "black swimsuit"
|
||||
desc = "An oldfashioned black swimsuit."
|
||||
icon_state = "swim_black"
|
||||
color = "swim_black"
|
||||
|
||||
/obj/item/clothing/under/swimsuit/blue
|
||||
name = "blue swimsuit"
|
||||
desc = "An oldfashioned blue swimsuit."
|
||||
icon_state = "swim_blue"
|
||||
color = "swim_blue"
|
||||
|
||||
/obj/item/clothing/under/swimsuit/purple
|
||||
name = "purple swimsuit"
|
||||
desc = "An oldfashioned purple swimsuit."
|
||||
icon_state = "swim_purp"
|
||||
color = "swim_purp"
|
||||
|
||||
/obj/item/clothing/under/swimsuit/green
|
||||
name = "green swimsuit"
|
||||
desc = "An oldfashioned green swimsuit."
|
||||
icon_state = "swim_green"
|
||||
color = "swim_green"
|
||||
|
||||
/obj/item/clothing/under/swimsuit/red
|
||||
name = "red swimsuit"
|
||||
desc = "An oldfashioned red swimsuit."
|
||||
icon_state = "swim_red"
|
||||
color = "swim_red"
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
/obj/item/clothing/suit/bomb_suit
|
||||
@@ -67,6 +68,7 @@
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO
|
||||
max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECITON_TEMPERATURE
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
/obj/item/clothing/head/bomb_hood/security
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
color = "black"
|
||||
desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist."
|
||||
origin_tech = "syndicate=3"
|
||||
siemens_coefficient = 0
|
||||
var/list/clothing_choices = list()
|
||||
|
||||
New()
|
||||
|
||||
@@ -80,6 +80,15 @@
|
||||
flags = FPRINT | TABLEPASS
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/internalaffairs
|
||||
desc = "The plain, professional attire of an Internal Affairs Agent. The collar is <i>immaculately</i> starched."
|
||||
name = "Internal Affairs uniform"
|
||||
icon_state = "internalaffairs"
|
||||
item_state = "internalaffairs"
|
||||
color = "internalaffairs"
|
||||
flags = FPRINT | TABLEPASS
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/janitor
|
||||
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
|
||||
name = "janitor's jumpsuit"
|
||||
@@ -133,6 +142,13 @@
|
||||
item_state = "lawyer_purp"
|
||||
color = "lawyer_purp"
|
||||
|
||||
/obj/item/clothing/under/lawyer/oldman
|
||||
name = "Old Man's Suit"
|
||||
desc = "A classic suit for the older gentleman with built in back support."
|
||||
icon_state = "oldman"
|
||||
item_state = "oldman"
|
||||
color = "oldman"
|
||||
|
||||
|
||||
/obj/item/clothing/under/librarian
|
||||
name = "sensible suit"
|
||||
|
||||
@@ -70,6 +70,24 @@
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/nurse
|
||||
desc = "A dress commonly worn by the nursing staff in the medical department."
|
||||
name = "nurse's dress"
|
||||
icon_state = "nurse"
|
||||
item_state = "nurse"
|
||||
color = "nurse"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/orderly
|
||||
desc = "A white suit to be worn by orderly people who love orderly things."
|
||||
name = "orderly's uniform"
|
||||
icon_state = "orderly"
|
||||
item_state = "orderly"
|
||||
color = "orderly"
|
||||
permeability_coefficient = 0.50
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0)
|
||||
|
||||
/obj/item/clothing/under/rank/medical
|
||||
desc = "It's made of a special fiber that provides minor protection against biohazards. It has a cross on the chest denoting that the wearer is trained medical personnel."
|
||||
name = "medical doctor's jumpsuit"
|
||||
|
||||
@@ -26,6 +26,15 @@
|
||||
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
flags = FPRINT | TABLEPASS
|
||||
|
||||
/obj/item/clothing/under/rank/dispatch
|
||||
name = "dispatcher's uniform"
|
||||
desc = "A dress shirt and khakis with a security patch sewn on."
|
||||
icon_state = "dispatch"
|
||||
item_state = "dispatch"
|
||||
color = "dispatch"
|
||||
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
flags = FPRINT | TABLEPASS
|
||||
|
||||
/obj/item/clothing/under/rank/security2
|
||||
name = "security officer's uniform"
|
||||
desc = "It's made of a slightly sturdier material, to allow for robust protection."
|
||||
@@ -66,6 +75,7 @@
|
||||
color = "hosred"
|
||||
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
flags = FPRINT | TABLEPASS
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
/obj/item/clothing/head/helmet/HoS
|
||||
@@ -76,6 +86,7 @@
|
||||
armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0)
|
||||
flags_inv = 0
|
||||
flags_inv = HIDEEARS
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
/obj/item/clothing/suit/armor/hos
|
||||
@@ -86,6 +97,7 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
siemens_coefficient = 0
|
||||
|
||||
|
||||
/obj/item/clothing/head/helmet/HoS/dermal
|
||||
@@ -101,10 +113,12 @@
|
||||
icon_state = "jensen"
|
||||
item_state = "jensen"
|
||||
color = "jensen"
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/suit/armor/hos/jensen
|
||||
name = "armored trenchcoat"
|
||||
desc = "A trenchcoat augmented with a special alloy for some protection and style."
|
||||
icon_state = "jensencoat"
|
||||
item_state = "jensencoat"
|
||||
flags_inv = 0
|
||||
flags_inv = 0
|
||||
siemens_coefficient = 0
|
||||
@@ -12,6 +12,13 @@
|
||||
color = "blue_pyjamas"
|
||||
item_state = "w_suit"
|
||||
|
||||
/obj/item/clothing/under/captain_fly
|
||||
name = "rogue captains uniform"
|
||||
desc = "For the man who doesn't care because he's still free."
|
||||
icon_state = "captain_fly"
|
||||
item_state = "captain_fly"
|
||||
color = "captain_fly"
|
||||
|
||||
/obj/item/clothing/under/scratch
|
||||
name = "white suit"
|
||||
desc = "A white suit, suitable for an excellent host"
|
||||
@@ -96,6 +103,7 @@
|
||||
armor = list(melee = 100, bullet = 100, laser = 100,energy = 100, bomb = 100, bio = 100, rad = 100)
|
||||
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/under/owl
|
||||
name = "owl uniform"
|
||||
@@ -232,70 +240,122 @@
|
||||
color = "gladiator"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
|
||||
//dress
|
||||
|
||||
/obj/item/clothing/under/dress/dress_fire
|
||||
name = "flame dress"
|
||||
desc = "A small black dress with blue flames print on it."
|
||||
icon_state = "dress_fire"
|
||||
color = "dress_fire"
|
||||
|
||||
/obj/item/clothing/under/dress/dress_green
|
||||
name = "green dress"
|
||||
desc = "A simple, tight fitting green dress."
|
||||
icon_state = "dress_green"
|
||||
color = "dress_green"
|
||||
|
||||
/obj/item/clothing/under/dress/dress_orange
|
||||
name = "orange dress"
|
||||
desc = "A fancy orange gown for those who like to show leg."
|
||||
icon_state = "dress_orange"
|
||||
color = "dress_orange"
|
||||
|
||||
/obj/item/clothing/under/dress/dress_pink
|
||||
name = "pink dress"
|
||||
desc = "A simple, tight fitting pink dress."
|
||||
icon_state = "dress_pink"
|
||||
color = "dress_pink"
|
||||
|
||||
/obj/item/clothing/under/dress/dress_yellow
|
||||
name = "yellow dress"
|
||||
desc = "A flirty, little yellow dress."
|
||||
icon_state = "dress_yellow"
|
||||
color = "dress_yellow"
|
||||
|
||||
/obj/item/clothing/under/dress/dress_saloon
|
||||
name = "saloon girl dress"
|
||||
desc = "A old western inspired gown for the girl who likes to drink."
|
||||
icon_state = "dress_saloon"
|
||||
color = "dress_saloon"
|
||||
|
||||
/obj/item/clothing/under/dress/dress_rd
|
||||
name = "research director dress uniform"
|
||||
desc = "Feminine fashion for the style concious RD."
|
||||
icon_state = "dress_rd"
|
||||
color = "dress_rd"
|
||||
|
||||
/obj/item/clothing/under/dress/dress_cap
|
||||
name = "captain dress uniform"
|
||||
desc = "Feminine fashion for the style concious captain."
|
||||
icon_state = "dress_cap"
|
||||
color = "dress_cap"
|
||||
|
||||
/obj/item/clothing/under/dress/dress_hop
|
||||
name = "head of personal dress uniform"
|
||||
desc = "Feminine fashion for the style concious HoP."
|
||||
icon_state = "dress_hop"
|
||||
color = "dress_hop"
|
||||
|
||||
/obj/item/clothing/under/dress/dress_hr
|
||||
name = "human resources director uniform"
|
||||
desc = "Superior class for the nosy H.R. Director."
|
||||
icon_state = "huresource"
|
||||
color = "huresource"
|
||||
|
||||
/obj/item/clothing/under/dress/plaid_blue
|
||||
name = "blue plaid skirt"
|
||||
desc = "A preppy blue skirt with a white blouse."
|
||||
icon_state = "plaid_blue"
|
||||
color = "plaid_blue"
|
||||
|
||||
/obj/item/clothing/under/dress/plaid_red
|
||||
name = "red plaid skirt"
|
||||
desc = "A preppy red skirt with a white blouse."
|
||||
icon_state = "plaid_red"
|
||||
color = "plaid_red"
|
||||
|
||||
/obj/item/clothing/under/dress/plaid_purple
|
||||
name = "blue purple skirt"
|
||||
desc = "A preppy purple skirt with a white blouse."
|
||||
icon_state = "plaid_purple"
|
||||
color = "plaid_purple"
|
||||
|
||||
//wedding stuff
|
||||
|
||||
/obj/item/clothing/under/wedding/bride_orange
|
||||
name = "orange wedding dress"
|
||||
desc = "A big and puffy orange dress."
|
||||
icon_state = "bride_orange"
|
||||
item_state = "creamsuit"
|
||||
color = "bride_orange"
|
||||
flags_inv = HIDESHOES
|
||||
|
||||
/obj/item/clothing/under/wedding/suit_white
|
||||
name = "white suit"
|
||||
desc = "A fabulous white suit with orange shirt."
|
||||
icon_state = "white_suit"
|
||||
item_state = "creamsuit"
|
||||
color = "white_suit"
|
||||
/obj/item/clothing/under/wedding/bride_purple
|
||||
name = "purple wedding dress"
|
||||
desc = "A big and puffy purple dress."
|
||||
icon_state = "bride_purple"
|
||||
color = "bride_purple"
|
||||
flags_inv = HIDESHOES
|
||||
|
||||
/obj/item/clothing/under/wedding/bridesmaid
|
||||
name = "yellow dress"
|
||||
desc = "A big and puffy orange dress."
|
||||
icon_state = "bridesmaid"
|
||||
item_state = "creamsuit"
|
||||
color = "bridesmaid"
|
||||
/obj/item/clothing/under/wedding/bride_blue
|
||||
name = "blue wedding dress"
|
||||
desc = "A big and puffy blue dress."
|
||||
icon_state = "bride_blue"
|
||||
color = "bride_blue"
|
||||
flags_inv = HIDESHOES
|
||||
|
||||
/obj/item/clothing/under/wedding/firedress
|
||||
name = "flaming hot black dress"
|
||||
desc = "A small black dress with blue flames print on it."
|
||||
icon_state = "dress_fire"
|
||||
item_state = "creamsuit"
|
||||
color = "dress_fire"
|
||||
/obj/item/clothing/under/wedding/bride_red
|
||||
name = "red wedding dress"
|
||||
desc = "A big and puffy red dress."
|
||||
icon_state = "bride_red"
|
||||
color = "bride_red"
|
||||
flags_inv = HIDESHOES
|
||||
|
||||
/obj/item/clothing/under/wedding/dress_orange
|
||||
name = "orange dress"
|
||||
icon_state = "d_orange"
|
||||
color = "d_orange"
|
||||
|
||||
/obj/item/clothing/under/wedding/dress_green
|
||||
name = "green dress"
|
||||
icon_state = "d_green"
|
||||
color = "d_green"
|
||||
|
||||
/obj/item/clothing/under/wedding/dress_purple
|
||||
name = "purple dress"
|
||||
icon_state = "d_purple"
|
||||
color = "d_purple"
|
||||
|
||||
/obj/item/clothing/under/wedding/dress_red
|
||||
name = "red dress"
|
||||
icon_state = "d_red"
|
||||
color = "d_red"
|
||||
|
||||
/obj/item/clothing/under/wedding/dress_blue
|
||||
name = "blue dress"
|
||||
icon_state = "d_blue"
|
||||
color = "d_blue"
|
||||
|
||||
/obj/item/clothing/under/wedding/officer_blue
|
||||
name = "blue officer dress"
|
||||
icon_state = "officer_blue"
|
||||
color = "officer_blue"
|
||||
|
||||
/obj/item/clothing/under/wedding/dress_vampire
|
||||
name = "vampire dress"
|
||||
icon_state = "d_vampire"
|
||||
color = "d_vampire"
|
||||
/obj/item/clothing/under/wedding/bride_white
|
||||
name = "orange wedding dress"
|
||||
desc = "A white wedding gown made from the finest silk."
|
||||
icon_state = "bride_white"
|
||||
color = "bride_white"
|
||||
flags_inv = HIDESHOES
|
||||
|
||||
/obj/item/clothing/under/sundress
|
||||
name = "sundress"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
color = "syndicate"
|
||||
has_sensor = 0
|
||||
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0
|
||||
|
||||
/obj/item/clothing/under/syndicate/combat
|
||||
name = "combat turtleneck"
|
||||
@@ -16,5 +17,6 @@
|
||||
icon_state = "tactifool"
|
||||
item_state = "bl_suit"
|
||||
color = "tactifool"
|
||||
siemens_coefficient = 1
|
||||
|
||||
|
||||
|
||||
@@ -135,6 +135,14 @@ hi
|
||||
icon_on = "bluezippoon"
|
||||
icon_off = "bluezippo"
|
||||
|
||||
/obj/item/weapon/lighter/zippo/fluff/michael_guess_1 //Dragor23: Michael Guess
|
||||
name = "engraved lighter"
|
||||
desc = "A golden lighter, engraved with some ornaments and a G."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "guessip"
|
||||
icon_on = "guessipon"
|
||||
icon_off = "guessip"
|
||||
|
||||
/obj/item/weapon/lighter/zippo/fluff/riley_rohtin_1 //rawrtaicho: Riley Rohtin
|
||||
name = "Riley's black zippo"
|
||||
desc = "A black zippo lighter, which holds some form of sentimental value."
|
||||
@@ -192,6 +200,17 @@ hi
|
||||
icon = 'custom_items.dmi'
|
||||
desc = "A modified detective's camera, painted in bright orange. On the back you see \"Have fun\" written in small accurate letters with something black."
|
||||
icon_state = "orangecamera"
|
||||
icon_on = "orangecamera"
|
||||
icon_off = "camera_off"
|
||||
pictures_left = 30
|
||||
|
||||
/obj/item/device/camera/fluff/oldcamera //magmaram: Maria Crash
|
||||
name = "Old Camera"
|
||||
icon = 'custom_items.dmi'
|
||||
desc = "An old, slightly beat-up digital camera, with a cheap photo printer taped on. It's a nice shade of blue."
|
||||
icon_state = "oldcamera"
|
||||
icon_on = "oldcamera"
|
||||
icon_off = "oldcamera_off"
|
||||
pictures_left = 30
|
||||
|
||||
/obj/item/weapon/card/id/fluff/lifetime //fastler: Fastler Greay; it seemed like something multiple people would have
|
||||
@@ -317,13 +336,6 @@ hi
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "odysseus_spec_id"
|
||||
|
||||
/obj/item/weapon/card/id/fluff/ian_colm_1 //Roaper: Ian Colm
|
||||
name = "Technician"
|
||||
desc = "An old ID with the words 'Ian Colm's Technician ID' printed on it.."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "technician_id"
|
||||
|
||||
|
||||
/obj/item/weapon/clipboard/fluff/mcreary_journal //sirribbot: James McReary
|
||||
name = "McReary's journal"
|
||||
desc = "A journal with a warning sticker on the front cover. The initials \"J.M.\" are written on the back."
|
||||
@@ -353,6 +365,14 @@ hi
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "royce_kit"
|
||||
|
||||
////// Ripley customisation kit - Sven Fjeltson - Mordeth221
|
||||
|
||||
/obj/item/weapon/fluff/sven_fjeltson_1
|
||||
name = "Mercenary APLU kit"
|
||||
desc = "A kit containing all the needed tools and parts to turn an APLU Ripley into an old Mercenaries APLU."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "sven_kit"
|
||||
|
||||
//////////////////////////////////
|
||||
//////////// Clothing ////////////
|
||||
//////////////////////////////////
|
||||
@@ -402,12 +422,6 @@ hi
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "uzenwa_sissra_1"
|
||||
|
||||
/obj/item/clothing/glasses/welding/fluff/ian_colm_2 //roaper: Ian Colm
|
||||
name = "Ian's Goggles"
|
||||
desc = "A pair of goggles used in the application of welding."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "ian_colm_1"
|
||||
|
||||
////// Medical eyepatch - Thysse Ezinwa - Jadepython
|
||||
/obj/item/clothing/glasses/eyepatch/fluff/thysse_1
|
||||
name = "medical eyepatch"
|
||||
@@ -459,6 +473,17 @@ hi
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "edvin_telephosphor_1"
|
||||
|
||||
/obj/item/clothing/head/hardhat/fluff/neil_patterson_1 //superboredguy: Neil Patterson
|
||||
name = "Engineering Cap"
|
||||
desc = "Much safer than a hard helmet."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "neilpatterson0_hat"
|
||||
|
||||
/obj/item/clothing/head/fluff/krinnhat //Shirotyrant: Krinn Seeskale
|
||||
name = "saucepan hat"
|
||||
desc = "This hat is the shiniest shiny Krinn has ever owned."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "krinn_hat"
|
||||
//////////// Suits ////////////
|
||||
|
||||
/obj/item/clothing/suit/storage/labcoat/fluff/pink //spaceman96: Trenna Seber
|
||||
@@ -496,6 +521,14 @@ hi
|
||||
icon_state = "deus_blueshield"
|
||||
item_state = "deus_blueshield"
|
||||
|
||||
/obj/item/clothing/suit/fluff/oldscarf //Writerer2: Javaria Zara
|
||||
name = "old scarf"
|
||||
desc = "An old looking scarf, it seems to be fairly worn."
|
||||
icon = 'clothing/suits.dmi'
|
||||
icon_state = "mantle-unathi"
|
||||
item_state = "mantle-unathi"
|
||||
body_parts_covered = UPPER_TORSO
|
||||
|
||||
//////////// Uniforms ////////////
|
||||
|
||||
/obj/item/clothing/under/fluff/jumpsuitdown //searif: Yuki Matsuda
|
||||
@@ -537,6 +570,14 @@ hi
|
||||
item_state = "ara_bar_uniform"
|
||||
color = "ara_bar_uniform"
|
||||
|
||||
/obj/item/clothing/under/fluff/callum_suit //roaper: Callum Leamus
|
||||
name = "knockoff suit"
|
||||
desc = "A knockoff of a suit commonly worn by the upper class."
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "callum_suit"
|
||||
item_state = "callum_suit"
|
||||
color = "callum_suit"
|
||||
|
||||
/////// NT-SID Suit //Zuhayr: Jane Doe
|
||||
|
||||
/obj/item/clothing/under/fluff/jane_sidsuit
|
||||
@@ -697,12 +738,12 @@ hi
|
||||
|
||||
///// Colt Peacemaker - Ana Ka'Rimah - SueTheCake
|
||||
|
||||
/obj/item/weapon/gun/energy/stunrevolver/fluff/ana_peacemaker
|
||||
//obj/item/weapon/gun/energy/stunrevolver/fluff/ana_peacemaker
|
||||
|
||||
name = "Peacemaker"
|
||||
/* name = "Peacemaker"
|
||||
desc = "A nickel-plated revolver with pearl grips. It has a certain Old West flair!"
|
||||
icon = 'custom_items.dmi'
|
||||
icon_state = "peacemaker"
|
||||
icon_state = "peacemaker"*/
|
||||
|
||||
///// Well-used baton - Oen'g Issek - Donofnyc3
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
sleep(2400)
|
||||
*/
|
||||
|
||||
var/list/event_last_fired = list()
|
||||
|
||||
//Always triggers an event when called, dynamically chooses events based on job population
|
||||
/proc/spawn_dynamic_event()
|
||||
if(!config.allow_random_events)
|
||||
@@ -58,22 +60,24 @@
|
||||
possibleEvents[/datum/event/infestation] = 50 + 25 * active_with_role["Janitor"]
|
||||
|
||||
possibleEvents[/datum/event/communications_blackout] = 50 + 25 * active_with_role["AI"] + active_with_role["Scientist"] * 25
|
||||
possibleEvents[/datum/event/ionstorm] = 25 + active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5
|
||||
possibleEvents[/datum/event/grid_check] = 25 + 10 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/electrical_storm] = 75 + 25 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/ionstorm] = active_with_role["AI"] * 25 + active_with_role["Cyborg"] * 25 + active_with_role["Engineer"] * 10 + active_with_role["Scientist"] * 5
|
||||
possibleEvents[/datum/event/grid_check] = 25 + 20 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/electrical_storm] = 10 * active_with_role["Janitor"] + 5 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/wallrot] = 30 * active_with_role["Engineer"] + 50 * active_with_role["Botanist"]
|
||||
|
||||
if(!spacevines_spawned)
|
||||
possibleEvents[/datum/event/spacevine] = 5 + 10 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/spacevine] = 5 + 5 * active_with_role["Engineer"]
|
||||
if(minutes_passed >= 30) // Give engineers time to set up engine
|
||||
possibleEvents[/datum/event/meteor_wave] = 20 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/meteor_shower] = 80 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/blob] = 30 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/meteor_wave] = 10 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/meteor_shower] = 40 * active_with_role["Engineer"]
|
||||
possibleEvents[/datum/event/blob] = 20 * active_with_role["Engineer"]
|
||||
|
||||
possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 25
|
||||
possibleEvents[/datum/event/viral_infection] = 25 + active_with_role["Medical"] * 100
|
||||
if(active_with_role["Medical"] > 0)
|
||||
possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 100
|
||||
possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 75
|
||||
possibleEvents[/datum/event/viral_outbreak] = active_with_role["Medical"] * 5
|
||||
possibleEvents[/datum/event/radiation_storm] = active_with_role["Medical"] * 50
|
||||
possibleEvents[/datum/event/spontaneous_appendicitis] = active_with_role["Medical"] * 150
|
||||
possibleEvents[/datum/event/viral_outbreak] = active_with_role["Medical"] * 10
|
||||
possibleEvents[/datum/event/organ_failure] = active_with_role["Medical"] * 50
|
||||
|
||||
possibleEvents[/datum/event/prison_break] = active_with_role["Security"] * 50
|
||||
if(active_with_role["Security"] > 0)
|
||||
@@ -84,16 +88,26 @@
|
||||
if(!sent_ninja_to_station && toggle_space_ninja)
|
||||
possibleEvents[/datum/event/space_ninja] = max(active_with_role["Security"], 5)
|
||||
|
||||
for(var/event_type in event_last_fired) if(possibleEvents[event_type])
|
||||
var/time_passed = world.time - event_last_fired[event_type]
|
||||
var/full_recharge_after = 60 * 60 * 10 * 3 // 3 hours
|
||||
var/weight_modifier = max(0, (full_recharge_after - time_passed) / 300)
|
||||
|
||||
possibleEvents[event_type] = max(possibleEvents[event_type] - weight_modifier, 0)
|
||||
|
||||
var/picked_event = pickweight(possibleEvents)
|
||||
event_last_fired[picked_event] = world.time
|
||||
|
||||
// Debug code below here, very useful for testing so don't delete please.
|
||||
/*var/debug_message = "Firing random event. "
|
||||
var/debug_message = "Firing random event. "
|
||||
for(var/V in active_with_role)
|
||||
debug_message += "#[V]:[active_with_role[V]] "
|
||||
debug_message += "||| "
|
||||
for(var/V in possibleEvents)
|
||||
debug_message += "[V]:[possibleEvents[V]]"
|
||||
message_admins(debug_message)*/
|
||||
debug_message += "|||Picked:[picked_event]"
|
||||
log_debug(debug_message)
|
||||
|
||||
var/picked_event = pickweight(possibleEvents)
|
||||
if(!picked_event)
|
||||
return
|
||||
|
||||
@@ -176,6 +190,7 @@
|
||||
active_with_role["AI"] = 0
|
||||
active_with_role["Cyborg"] = 0
|
||||
active_with_role["Janitor"] = 0
|
||||
active_with_role["Botanist"] = 0
|
||||
|
||||
for(var/mob/M in player_list)
|
||||
if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive
|
||||
@@ -208,4 +223,7 @@
|
||||
if(M.mind.assigned_role == "Janitor")
|
||||
active_with_role["Janitor"]++
|
||||
|
||||
if(M.mind.assigned_role == "Botanist")
|
||||
active_with_role["Botanist"]++
|
||||
|
||||
return active_with_role
|
||||
|
||||
@@ -2,8 +2,8 @@ var/list/allEvents = typesof(/datum/event) - /datum/event
|
||||
var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event
|
||||
//var/list/potentialRandomEvents = typesof(/datum/event) - /datum/event - /datum/event/spider_infestation - /datum/event/alien_infestation
|
||||
|
||||
var/eventTimeLower = 10000 //15 minutes
|
||||
var/eventTimeUpper = 25000 //30 minutes
|
||||
var/eventTimeLower = 9000 //15 minutes
|
||||
var/eventTimeUpper = 15000 //25 minutes
|
||||
var/scheduledEvent = null
|
||||
|
||||
|
||||
@@ -30,7 +30,9 @@ var/scheduledEvent = null
|
||||
playercount_modifier = 0.9
|
||||
if(36 to 100000)
|
||||
playercount_modifier = 0.8
|
||||
scheduledEvent = world.timeofday + rand(eventTimeLower, eventTimeUpper) * playercount_modifier
|
||||
var/next_event_delay = rand(eventTimeLower, eventTimeUpper) * playercount_modifier
|
||||
scheduledEvent = world.timeofday + next_event_delay
|
||||
log_debug("Next event in [next_event_delay/600] minutes.")
|
||||
|
||||
else if(world.timeofday > scheduledEvent)
|
||||
spawn_dynamic_event()
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
|
||||
//
|
||||
/datum/event/meteor_shower
|
||||
startWhen = 6
|
||||
startWhen = 5
|
||||
endWhen = 7
|
||||
var/next_meteor = 6
|
||||
var/waves = 1
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
var/sender
|
||||
var/message
|
||||
switch(pick(1,2,3,4,5))
|
||||
switch(pick(1,2,3,4,5,6,7))
|
||||
if(1)
|
||||
sender = pick("MaxBet","MaxBet Online Casino","There is no better time to register","I'm excited for you to join us")
|
||||
message = pick("Triple deposits are waiting for you at MaxBet Online when you register to play with us.",\
|
||||
@@ -68,11 +68,23 @@
|
||||
sender = pick("Dr","Crown prince","King Regent","Professor","Captain")
|
||||
sender += " " + pick("Robert","Alfred","Josephat","Kingsley","Sehi","Zbahi")
|
||||
sender += " " + pick("Mugawe","Nkem","Gbatokwia","Nchekwube","Ndim","Ndubisi")
|
||||
message = pick("YOUR FUND HAS BEEN MOVED TO [pick("Salusa","Segunda","Cepheus","Andromeda","Gruis","Corona","Aquila","Asellus")] DEVELOPMENTARY BANK FOR ONWARD REMITTANCE.",\
|
||||
message = pick("YOUR FUND HAS BEEN MOVED TO [pick("Salusa","Segunda","Cepheus","Andromeda","Gruis","Corona","Aquila","ARES","Asellus")] DEVELOPMENTARY BANK FOR ONWARD REMITTANCE.",\
|
||||
"We are happy to inform you that due to the delay, we have been instructed to IMMEDIATELY deposit all funds into your account",\
|
||||
"Dear fund beneficiary, We have please to inform you that overdue funds payment has finally been approved and released for payment",\
|
||||
"Due to my lack of agents I require an off-world financial account to immediately deposit the sum of 1 POINT FIVE MILLION credits.",\
|
||||
"Greetings sir, I regretfully to inform you that as I lay dying here due to my lack ofheirs I have chosen you to recieve the full sum of my lifetime savings of 1.5 billion credits")
|
||||
if(6)
|
||||
sender = pick("NanoTrasen Morale Divison","Feeling Lonely?","Bored?","www.wetskrell.nt")
|
||||
message = pick("The NanoTrasen Morale Division wishes to provide you with quality entertainment sites.",\
|
||||
"WetSkrell.nt is a xenophillic website endorsed by NT for the use of male crewmembers among it's many stations and outposts.",\
|
||||
"Wetskrell.nt only provides the higest quality of male entertaiment to NanoTrasen Employees.",\
|
||||
"Simply enter your NanoTrasen Bank account system number and pin. With three easy steps this service could be yours!")
|
||||
if(7)
|
||||
sender = pick("You have won free tickets!","Click here to claim your prize!","You are the 1000th vistor!","You are our lucky grand prize winner!")
|
||||
message = pick("You have won tickets to the newest ACTION JAXSON MOVIE!",\
|
||||
"You have won tickets to the newest crime drama DETECTIVE MYSTERY IN THE CLAMITY CAPER!",\
|
||||
"You have won tickets to the newest romantic comedy 16 RULES OF LOVE!",\
|
||||
"You have won tickets to the newest thriller THE CULT OF THE SLEEPING ONE!")
|
||||
|
||||
useMS.send_pda_message("[P.owner]", sender, message)
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
datum/event/organ_failure
|
||||
var/severity = 1
|
||||
|
||||
datum/event/organ_failure/setup()
|
||||
announceWhen = rand(0, 300)
|
||||
endWhen = announceWhen + 1
|
||||
severity = rand(1, 3)
|
||||
|
||||
datum/event/organ_failure/announce()
|
||||
command_alert("Confirmed outbreak of level [rand(3,7)] biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert")
|
||||
world << sound('sound/AI/outbreak5.ogg')
|
||||
|
||||
datum/event/organ_failure/start()
|
||||
var/list/candidates = list() //list of candidate keys
|
||||
for(var/mob/living/carbon/human/G in player_list)
|
||||
if(G.mind && G.mind.current && G.mind.current.stat != DEAD && G.health > 70)
|
||||
candidates += G
|
||||
if(!candidates.len) return
|
||||
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
|
||||
|
||||
while(severity > 0 && candidates.len)
|
||||
var/mob/living/carbon/human/C = candidates[1]
|
||||
|
||||
// Bruise one of their organs
|
||||
var/datum/organ/internal/I = pick(C.internal_organs)
|
||||
I.damage = I.min_bruised_damage
|
||||
candidates.Remove(C)
|
||||
severity--
|
||||
@@ -1,36 +1,46 @@
|
||||
/datum/event/radiation_storm
|
||||
announceWhen = 5
|
||||
announceWhen = 1
|
||||
oneShot = 1
|
||||
|
||||
|
||||
/datum/event/radiation_storm/announce()
|
||||
command_alert("High levels of radiation detected near the station. Please report to the Med-bay if you feel strange.", "Anomaly Alert")
|
||||
world << sound('sound/AI/radiation.ogg')
|
||||
|
||||
// Don't do anything, we want to pack the announcement with the actual event
|
||||
|
||||
/datum/event/radiation_storm/start()
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
continue
|
||||
if(T.z != 1)
|
||||
continue
|
||||
if(istype(H,/mob/living/carbon/human))
|
||||
H.apply_effect((rand(15,75)),IRRADIATE,0)
|
||||
if(prob(5))
|
||||
H.apply_effect((rand(90,150)),IRRADIATE,0)
|
||||
if(prob(25))
|
||||
if (prob(75))
|
||||
randmutb(H)
|
||||
domutcheck(H,null,1)
|
||||
else
|
||||
randmutg(H)
|
||||
domutcheck(H,null,1)
|
||||
spawn()
|
||||
world << sound('sound/AI/radiation.ogg')
|
||||
command_alert("High levels of radiation detected near the station. Please evacuate into one of the shielded maintenance tunnels.", "Anomaly Alert")
|
||||
|
||||
for(var/mob/living/carbon/monkey/M in living_mob_list)
|
||||
var/turf/T = get_turf(M)
|
||||
if(!T)
|
||||
continue
|
||||
if(T.z != 1)
|
||||
continue
|
||||
M.apply_effect((rand(15,75)),IRRADIATE,0)
|
||||
sleep(600)
|
||||
|
||||
command_alert("The station has entered the radiation belt. Please remain in a sheltered area until we have passed the radiation belt.", "Anomaly Alert")
|
||||
for(var/i = 0, i < 10, i++)
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
continue
|
||||
if(T.z != 1)
|
||||
continue
|
||||
if(istype(T.loc, /area/maintenance) || istype(T.loc, /area/crew_quarters))
|
||||
continue
|
||||
if(istype(H,/mob/living/carbon/human))
|
||||
H.apply_effect((rand(2,15)),IRRADIATE,0)
|
||||
if(prob(5))
|
||||
H.apply_effect((rand(10,30)),IRRADIATE,0)
|
||||
if (prob(75))
|
||||
randmutb(H)
|
||||
domutcheck(H,null,1)
|
||||
else
|
||||
randmutg(H)
|
||||
domutcheck(H,null,1)
|
||||
for(var/mob/living/carbon/monkey/M in living_mob_list)
|
||||
var/turf/T = get_turf(M)
|
||||
if(!T)
|
||||
continue
|
||||
if(T.z != 1)
|
||||
continue
|
||||
M.apply_effect((rand(5,25)),IRRADIATE,0)
|
||||
sleep(100)
|
||||
|
||||
|
||||
command_alert("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms.", "Anomaly Alert")
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/datum/event/spontaneous_appendicitis/start()
|
||||
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
|
||||
for(var/mob/living/carbon/human/H in shuffle(living_mob_list)) if(H.client && H.stat != DEAD)
|
||||
var/foundAlready = 0 //don't infect someone that already has the virus
|
||||
for(var/datum/disease/D in H.viruses)
|
||||
foundAlready = 1
|
||||
|
||||
@@ -14,7 +14,7 @@ datum/event/viral_infection/announce()
|
||||
datum/event/viral_infection/start()
|
||||
var/list/candidates = list() //list of candidate keys
|
||||
for(var/mob/living/carbon/human/G in player_list)
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
if(G.client && G.stat != DEAD)
|
||||
candidates += G
|
||||
if(!candidates.len) return
|
||||
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
|
||||
|
||||
@@ -14,7 +14,7 @@ datum/event/viral_outbreak/announce()
|
||||
datum/event/viral_outbreak/start()
|
||||
var/list/candidates = list() //list of candidate keys
|
||||
for(var/mob/living/carbon/human/G in player_list)
|
||||
if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
|
||||
if(G.client && G.stat != DEAD)
|
||||
candidates += G
|
||||
if(!candidates.len) return
|
||||
candidates = shuffle(candidates)//Incorporating Donkie's list shuffle
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/turf/simulated/wall
|
||||
|
||||
|
||||
datum/event/wallrot
|
||||
var/severity = 1
|
||||
|
||||
datum/event/wallrot/setup()
|
||||
announceWhen = rand(0, 300)
|
||||
endWhen = announceWhen + 1
|
||||
severity = rand(5, 10)
|
||||
|
||||
datum/event/wallrot/announce()
|
||||
command_alert("Harmful fungi detected on station. Station structures may be contaminated.", "Biohazard Alert")
|
||||
|
||||
datum/event/wallrot/start()
|
||||
spawn()
|
||||
var/turf/center = null
|
||||
|
||||
// 100 attempts
|
||||
for(var/i=0, i<100, i++)
|
||||
var/turf/candidate = locate(rand(1, world.maxx), rand(1, world.maxy), 1)
|
||||
if(istype(candidate, /turf/simulated/wall))
|
||||
center = candidate
|
||||
|
||||
if(center)
|
||||
// Make sure at least one piece of wall rots!
|
||||
center:rot()
|
||||
|
||||
// Have a chance to rot lots of other walls.
|
||||
var/rotcount = 0
|
||||
for(var/turf/simulated/wall/W in range(5, center)) if(prob(50))
|
||||
W:rot()
|
||||
rotcount++
|
||||
|
||||
// Only rot up to severity walls
|
||||
if(rotcount >= severity)
|
||||
break
|
||||
@@ -6,7 +6,13 @@ mob/living/carbon/proc/dream()
|
||||
"light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun",
|
||||
"a hat","the Luna","a ruined station","a planet","plasma","air","the medical bay","the bridge","blinking lights",
|
||||
"a blue light","an abandoned laboratory","Nanotrasen","The Syndicate","blood","healing","power","respect",
|
||||
"riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying"
|
||||
"riches","space","a crash","happiness","pride","a fall","water","flames","ice","melons","flying","the eggs","money",
|
||||
"the head of personnel","the head of security","a chief engineer","a research director","a chief medical officer",
|
||||
"the detective","the warden","a member of the internal affairs","a station engineer","the janitor","atmospheric technician",
|
||||
"the quartermaster","a cargo technician","the botanist","a shaft miner","the psychologist","the chemist","the geneticist",
|
||||
"the virologist","the roboticist","the chef","the bartender","the chaplain","the librarian","a mouse","an ert member",
|
||||
"a beach","the holodeck","a smokey room","a voice","the cold","a mouse","an operating table","the bar","the rain","a skrell",
|
||||
"a unathi","a tajaran","the ai core","the mining station","the research station","a beaker of strange liquid",
|
||||
)
|
||||
spawn(0)
|
||||
for(var/i = rand(1,4),i > 0, i--)
|
||||
|
||||
@@ -819,6 +819,14 @@ I said no!
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/boiledspagetti
|
||||
|
||||
/datum/recipe/boiledrice
|
||||
reagents = list("water" = 5, "rice" = 10)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/boiledrice
|
||||
|
||||
/datum/recipe/ricepudding
|
||||
reagents = list("milk" = 5, "rice" = 10)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/ricepudding
|
||||
|
||||
/datum/recipe/pastatomato
|
||||
reagents = list("water" = 5)
|
||||
items = list(
|
||||
|
||||
@@ -193,6 +193,10 @@ proc/move_mining_shuttle()
|
||||
var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO
|
||||
origin_tech = "materials=1;engineering=1"
|
||||
attack_verb = list("hit", "pierced", "sliced", "attacked")
|
||||
var/drill_sound = 'sound/weapons/Genhit.ogg'
|
||||
var/drill_verb = "picking"
|
||||
|
||||
var/excavation_amount = 100
|
||||
|
||||
hammer
|
||||
name = "sledgehammer"
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
/**********************Mineral deposits**************************/
|
||||
|
||||
#define XENOARCH_SPAWN_CHANCE 0.5
|
||||
#define XENOARCH_SPREAD_CHANCE 15
|
||||
#define ARTIFACT_SPAWN_CHANCE 20
|
||||
|
||||
/turf/simulated/mineral //wall piece
|
||||
name = "Rock"
|
||||
icon = 'icons/turf/walls.dmi'
|
||||
@@ -14,9 +18,18 @@
|
||||
var/mineralAmt = 0
|
||||
var/spread = 0 //will the seam spread?
|
||||
var/spreadChance = 0 //the percentual chance of an ore spreading to the neighbouring tiles
|
||||
var/artifactChance = 0.3 //percent chance to spawn a xenoarchaelogical artifact
|
||||
var/last_act = 0
|
||||
|
||||
var/datum/geosample/geological_data
|
||||
var/excavation_level = 0
|
||||
var/list/finds = list()
|
||||
var/list/excavation_minerals = list()
|
||||
var/next_rock = 0
|
||||
var/archaeo_overlay = ""
|
||||
var/excav_overlay = ""
|
||||
var/obj/item/weapon/last_find
|
||||
var/datum/artifact_find/artifact_find
|
||||
|
||||
/turf/simulated/mineral/Del()
|
||||
return
|
||||
|
||||
@@ -55,24 +68,89 @@
|
||||
T.overlays += image('icons/turf/walls.dmi', "rock_side_e", layer=6)
|
||||
|
||||
if (mineralName && mineralAmt && spread && spreadChance)
|
||||
if(prob(spreadChance))
|
||||
if(istype(get_step(src, SOUTH), /turf/simulated/mineral/random))
|
||||
new src.type(get_step(src, SOUTH))
|
||||
if(prob(spreadChance))
|
||||
if(istype(get_step(src, NORTH), /turf/simulated/mineral/random))
|
||||
new src.type(get_step(src, NORTH))
|
||||
if(prob(spreadChance))
|
||||
if(istype(get_step(src, WEST), /turf/simulated/mineral/random))
|
||||
new src.type(get_step(src, WEST))
|
||||
if(prob(spreadChance))
|
||||
if(istype(get_step(src, EAST), /turf/simulated/mineral/random))
|
||||
new src.type(get_step(src, EAST))
|
||||
for(var/trydir in list(1,2,4,8))
|
||||
if(prob(spreadChance))
|
||||
if(istype(get_step(src, trydir), /turf/simulated/mineral/random))
|
||||
var/turf/simulated/mineral/T = get_step(src, trydir)
|
||||
var/turf/simulated/mineral/M = new src.type(T)
|
||||
//keep any digsite data as constant as possible
|
||||
if(T.finds.len && !M.finds.len)
|
||||
M.finds = T.finds
|
||||
if(T.archaeo_overlay)
|
||||
M.overlays += archaeo_overlay
|
||||
|
||||
|
||||
//---- Xenoarchaeology BEGIN
|
||||
|
||||
//put into spawn so that digsite data can be preserved over the turf replacements via spreading mineral veins
|
||||
spawn(0)
|
||||
if(mineralAmt > 0 && !excavation_minerals.len)
|
||||
for(var/i=0, i<mineralAmt, i++)
|
||||
excavation_minerals.Add(rand(5,95))
|
||||
excavation_minerals = insertion_sort_numeric_list_descending(excavation_minerals)
|
||||
|
||||
if(!finds.len && prob(XENOARCH_SPAWN_CHANCE))
|
||||
//create a new archaeological deposit
|
||||
var/digsite = get_random_digsite_type()
|
||||
|
||||
var/list/turfs_to_process = list(src)
|
||||
var/list/processed_turfs = list()
|
||||
while(turfs_to_process.len)
|
||||
var/turf/simulated/mineral/M = turfs_to_process[1]
|
||||
for(var/turf/simulated/mineral/T in orange(1, M))
|
||||
if(T.finds.len)
|
||||
continue
|
||||
if(T in processed_turfs)
|
||||
continue
|
||||
if(prob(XENOARCH_SPREAD_CHANCE))
|
||||
turfs_to_process.Add(T)
|
||||
|
||||
turfs_to_process.Remove(M)
|
||||
processed_turfs.Add(M)
|
||||
if(!M.finds.len)
|
||||
if(prob(50))
|
||||
M.finds.Add(new/datum/find(digsite, rand(5,95)))
|
||||
else if(prob(75))
|
||||
M.finds.Add(new/datum/find(digsite, rand(5,45)))
|
||||
M.finds.Add(new/datum/find(digsite, rand(55,95)))
|
||||
else
|
||||
M.finds.Add(new/datum/find(digsite, rand(5,30)))
|
||||
M.finds.Add(new/datum/find(digsite, rand(35,75)))
|
||||
M.finds.Add(new/datum/find(digsite, rand(75,95)))
|
||||
|
||||
//sometimes a find will be close enough to the surface to show
|
||||
var/datum/find/F = M.finds[1]
|
||||
if(F.excavation_required <= F.view_range)
|
||||
archaeo_overlay = "overlay_archaeo[rand(1,3)]"
|
||||
M.overlays += archaeo_overlay
|
||||
|
||||
//dont create artifact machinery in animal or plant digsites, or if we already have one
|
||||
if(!artifact_find && digsite != 1 && digsite != 2 && prob(ARTIFACT_SPAWN_CHANCE))
|
||||
artifact_find = new()
|
||||
artifact_spawning_turfs.Add(src)
|
||||
|
||||
if(!src.geological_data)
|
||||
src.geological_data = new/datum/geosample(src)
|
||||
src.geological_data.UpdateTurf(src)
|
||||
|
||||
//for excavated turfs placeable in the map editor
|
||||
/*if(excavation_level > 0)
|
||||
if(excavation_level < 25)
|
||||
src.overlays += image('icons/obj/xenoarchaeology.dmi', "overlay_excv1_[rand(1,3)]")
|
||||
else if(excavation_level < 50)
|
||||
src.overlays += image('icons/obj/xenoarchaeology.dmi', "overlay_excv2_[rand(1,3)]")
|
||||
else if(excavation_level < 75)
|
||||
src.overlays += image('icons/obj/xenoarchaeology.dmi', "overlay_excv3_[rand(1,3)]")
|
||||
else
|
||||
src.overlays += image('icons/obj/xenoarchaeology.dmi', "overlay_excv4_[rand(1,3)]")
|
||||
desc = "It appears to be partially excavated."*/
|
||||
|
||||
return
|
||||
|
||||
/turf/simulated/mineral/random
|
||||
name = "Mineral deposit"
|
||||
var/mineralAmtList = list("Uranium" = 5, "Iron" = 5, "Diamond" = 5, "Gold" = 5, "Silver" = 5, "Plasma" = 5, "Archaeo" = 3/*, "Adamantine" = 5*/)
|
||||
var/mineralSpawnChanceList = list("Uranium" = 5, "Iron" = 50, "Diamond" = 1, "Gold" = 5, "Silver" = 5, "Plasma" = 25, "Archaeo" = 5/*, "Adamantine" =5*/)//Currently, Adamantine won't spawn as it has no uses. -Durandan
|
||||
var/mineralAmtList = list("Uranium" = 5, "Iron" = 5, "Diamond" = 5, "Gold" = 5, "Silver" = 5, "Plasma" = 5/*, "Adamantine" = 5*/)
|
||||
var/mineralSpawnChanceList = list("Uranium" = 5, "Iron" = 50, "Diamond" = 1, "Gold" = 5, "Silver" = 5, "Plasma" = 25/*, "Adamantine" =5*/)//Currently, Adamantine won't spawn as it has no uses. -Durandan
|
||||
var/mineralChance = 10 //means 10% chance of this plot changing to a mineral deposit
|
||||
|
||||
/turf/simulated/mineral/random/New()
|
||||
@@ -95,16 +173,22 @@
|
||||
M = new/turf/simulated/mineral/silver(src)
|
||||
if("Plasma")
|
||||
M = new/turf/simulated/mineral/plasma(src)
|
||||
if("Archaeo")
|
||||
M = new/turf/simulated/mineral/archaeo(src)
|
||||
/*if("Adamantine")
|
||||
M = new/turf/simulated/mineral/adamantine(src)*/
|
||||
if(M)
|
||||
src = M
|
||||
M.levelupdate()
|
||||
else if (prob(artifactChance))
|
||||
//spawn a rare, xeno-arch artifact here
|
||||
new/obj/machinery/artifact(src)
|
||||
|
||||
//preserve archaeo data
|
||||
M.geological_data = src.geological_data
|
||||
M.excavation_minerals = src.excavation_minerals
|
||||
M.overlays = src.overlays
|
||||
M.artifact_find = src.artifact_find
|
||||
M.archaeo_overlay = src.archaeo_overlay
|
||||
M.excav_overlay = src.excav_overlay
|
||||
|
||||
/*else if (prob(artifactChance))
|
||||
new/obj/machinery/artifact(src)*/
|
||||
return
|
||||
|
||||
/turf/simulated/mineral/random/high_chance
|
||||
@@ -169,15 +253,6 @@
|
||||
spread = 1
|
||||
|
||||
|
||||
/turf/simulated/mineral/archaeo
|
||||
name = "Strange rock formation"
|
||||
icon_state = "rock_Archaeo"
|
||||
mineralName = "Archaeo"
|
||||
mineralAmt = 3
|
||||
spreadChance = 25
|
||||
spread = 1
|
||||
|
||||
|
||||
/turf/simulated/mineral/clown
|
||||
name = "Bananium deposit"
|
||||
icon_state = "rock_Clown"
|
||||
@@ -222,6 +297,24 @@ commented out in r5061, I left it because of the shroom thingies
|
||||
usr << "\red You don't have the dexterity to do this!"
|
||||
return
|
||||
|
||||
if (istype(W, /obj/item/device/core_sampler))
|
||||
src.geological_data.UpdateNearbyArtifactInfo(src)
|
||||
var/obj/item/device/core_sampler/C = W
|
||||
C.sample_item(src, user)
|
||||
return
|
||||
|
||||
if (istype(W, /obj/item/device/depth_scanner))
|
||||
var/obj/item/device/depth_scanner/C = W
|
||||
C.scan_atom(user, src)
|
||||
return
|
||||
|
||||
if (istype(W, /obj/item/device/measuring_tape))
|
||||
var/obj/item/device/measuring_tape/P = W
|
||||
user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].")
|
||||
if(do_after(user,40))
|
||||
user << "\blue \icon[P] [src] has been excavated to a depth of [2*src.excavation_level]cm."
|
||||
return
|
||||
|
||||
if (istype(W, /obj/item/weapon/pickaxe))
|
||||
var/turf/T = user.loc
|
||||
if (!( istype(T, /turf) ))
|
||||
@@ -233,56 +326,250 @@ commented out in r5061, I left it because of the shroom thingies
|
||||
return
|
||||
*/
|
||||
//Watch your tabbing, microwave. --NEO
|
||||
if(last_act+W:digspeed > world.time)//prevents message spam
|
||||
|
||||
var/obj/item/weapon/pickaxe/P = W
|
||||
if(last_act+P.digspeed > world.time)//prevents message spam
|
||||
return
|
||||
last_act = world.time
|
||||
user << "\red You start picking."
|
||||
playsound(user, 'sound/weapons/Genhit.ogg', 20, 1)
|
||||
|
||||
if(do_after(user,W:digspeed))
|
||||
user << "\blue You finish cutting into the rock."
|
||||
gets_drilled()
|
||||
playsound(user, P.drill_sound, 20, 1)
|
||||
|
||||
//handle any archaeological finds we might uncover
|
||||
var/fail_message
|
||||
if(src.finds.len)
|
||||
var/datum/find/F = src.finds[1]
|
||||
if(src.excavation_level + P.excavation_amount > F.excavation_required)
|
||||
//Chance to destroy / extract any finds here
|
||||
fail_message = ", <b>[pick("there is a crunching noise","[W] collides with some different rock","part of the rock face crumbles away","something breaks under [W]")]</b>"
|
||||
|
||||
user << "\red You start [P.drill_verb][fail_message ? fail_message : ""]."
|
||||
|
||||
if(fail_message && prob(90))
|
||||
if(prob(25))
|
||||
excavate_find(5, src.finds[1])
|
||||
else if(prob(50))
|
||||
src.finds.Remove(src.finds[1])
|
||||
if(prob(50))
|
||||
artifact_debris()
|
||||
|
||||
if(do_after(user,P.digspeed))
|
||||
user << "\blue You finish [P.drill_verb] the rock."
|
||||
|
||||
if(finds.len)
|
||||
var/datum/find/F = src.finds[1]
|
||||
if(round(src.excavation_level + P.excavation_amount) == F.excavation_required)
|
||||
//Chance to extract any items here perfectly, otherwise just pull them out along with the rock surrounding them
|
||||
if(src.excavation_level + P.excavation_amount > F.excavation_required)
|
||||
//if you can get slightly over, perfect extraction
|
||||
excavate_find(100, F)
|
||||
else
|
||||
excavate_find(80, F)
|
||||
|
||||
else if(src.excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range)
|
||||
//just pull the surrounding rock out
|
||||
excavate_find(0, F)
|
||||
|
||||
if( src.excavation_level + P.excavation_amount >= 100 || (!finds.len && !excavation_minerals.len) )
|
||||
//if players have been excavating this turf, have a chance to leave some rocky debris behind
|
||||
var/boulder_prob = 0
|
||||
var/obj/structure/boulder/B
|
||||
|
||||
if(src.excavation_level > 15)
|
||||
boulder_prob = 10
|
||||
if(artifact_find)
|
||||
boulder_prob += 25
|
||||
if(src.excavation_level >= 100)
|
||||
boulder_prob += 40
|
||||
else if(src.excavation_level > 95)
|
||||
boulder_prob += 25
|
||||
else if(src.excavation_level > 90)
|
||||
boulder_prob += 10
|
||||
if(prob(boulder_prob))
|
||||
B = new(src)
|
||||
if(artifact_find)
|
||||
B.artifact_find = artifact_find
|
||||
else if(artifact_find && src.excavation_level + P.excavation_amount >= 100)
|
||||
artifact_debris(1)
|
||||
|
||||
gets_drilled(B ? 0 : 1)
|
||||
return
|
||||
else
|
||||
src.excavation_level += P.excavation_amount
|
||||
|
||||
//archaeo overlays
|
||||
if(!archaeo_overlay && finds.len)
|
||||
var/datum/find/F = src.finds[1]
|
||||
if(F.excavation_required <= src.excavation_level + F.view_range)
|
||||
archaeo_overlay = "overlay_archaeo[rand(1,3)]"
|
||||
overlays += archaeo_overlay
|
||||
|
||||
//there's got to be a better way to do this
|
||||
var/update_excav_overlay = 0
|
||||
if(src.excavation_level >= 75)
|
||||
if(src.excavation_level - P.excavation_amount < 75)
|
||||
update_excav_overlay = 1
|
||||
else if(src.excavation_level >= 50)
|
||||
if(src.excavation_level - P.excavation_amount < 50)
|
||||
update_excav_overlay = 1
|
||||
else if(src.excavation_level >= 25)
|
||||
if(src.excavation_level - P.excavation_amount < 25)
|
||||
update_excav_overlay = 1
|
||||
|
||||
//update overlays displaying excavation level
|
||||
if( !(excav_overlay && excavation_level > 0) || update_excav_overlay )
|
||||
var/excav_quadrant = round(excavation_level / 25) + 1
|
||||
excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]"
|
||||
overlays += excav_overlay
|
||||
|
||||
//extract pesky minerals while we're excavating
|
||||
while(excavation_minerals.len && src.excavation_level > excavation_minerals[excavation_minerals.len])
|
||||
drop_mineral()
|
||||
pop(excavation_minerals)
|
||||
mineralAmt--
|
||||
|
||||
//drop some rocks
|
||||
next_rock += P.excavation_amount * 10
|
||||
while(next_rock > 100)
|
||||
next_rock -= 100
|
||||
var/obj/item/weapon/ore/O = new(src)
|
||||
src.geological_data.UpdateNearbyArtifactInfo(src)
|
||||
O.geological_data = src.geological_data
|
||||
|
||||
else
|
||||
return attack_hand(user)
|
||||
return
|
||||
|
||||
/turf/simulated/mineral/proc/gets_drilled()
|
||||
var/destroyed = 0 //used for breaking strange rocks
|
||||
/turf/simulated/mineral/proc/drop_mineral()
|
||||
var/obj/item/weapon/ore/O
|
||||
if (src.mineralName == "Uranium")
|
||||
O = new /obj/item/weapon/ore/uranium(src)
|
||||
if (src.mineralName == "Iron")
|
||||
O = new /obj/item/weapon/ore/iron(src)
|
||||
if (src.mineralName == "Gold")
|
||||
O = new /obj/item/weapon/ore/gold(src)
|
||||
if (src.mineralName == "Silver")
|
||||
O = new /obj/item/weapon/ore/silver(src)
|
||||
if (src.mineralName == "Plasma")
|
||||
O = new /obj/item/weapon/ore/plasma(src)
|
||||
if (src.mineralName == "Diamond")
|
||||
O = new /obj/item/weapon/ore/diamond(src)
|
||||
if (src.mineralName == "Clown")
|
||||
O = new /obj/item/weapon/ore/clown(src)
|
||||
if(O)
|
||||
src.geological_data.UpdateNearbyArtifactInfo(src)
|
||||
O.geological_data = src.geological_data
|
||||
return O
|
||||
|
||||
/turf/simulated/mineral/proc/gets_drilled(var/artifact_fail = 0)
|
||||
//var/destroyed = 0 //used for breaking strange rocks
|
||||
if ((src.mineralName != "") && (src.mineralAmt > 0) && (src.mineralAmt < 11))
|
||||
var/i
|
||||
for (i=0;i<mineralAmt;i++)
|
||||
if (src.mineralName == "Uranium")
|
||||
new /obj/item/weapon/ore/uranium(src)
|
||||
if (src.mineralName == "Iron")
|
||||
new /obj/item/weapon/ore/iron(src)
|
||||
if (src.mineralName == "Gold")
|
||||
new /obj/item/weapon/ore/gold(src)
|
||||
if (src.mineralName == "Silver")
|
||||
new /obj/item/weapon/ore/silver(src)
|
||||
if (src.mineralName == "Plasma")
|
||||
new /obj/item/weapon/ore/plasma(src)
|
||||
if (src.mineralName == "Diamond")
|
||||
new /obj/item/weapon/ore/diamond(src)
|
||||
if (src.mineralName == "Archaeo")
|
||||
//spawn strange rocks here
|
||||
//if(prob(10) || delicate)
|
||||
if(prob(50)) //Don't have delicate tools (hand pick/excavation tool) yet, temporarily change to 50% instead of 10% -Mij
|
||||
new /obj/item/weapon/ore/strangerock(src)
|
||||
else
|
||||
destroyed = 1
|
||||
if (src.mineralName == "Clown")
|
||||
new /obj/item/weapon/ore/clown(src)
|
||||
if (prob(src.artifactChance))
|
||||
//spawn a rare artifact here
|
||||
new /obj/machinery/artifact(src)
|
||||
|
||||
//if the turf has already been excavated, some of it's ore has been removed
|
||||
for (var/i=0;i<mineralAmt;i++)
|
||||
drop_mineral()
|
||||
|
||||
//destroyed artifacts have weird, unpleasant effects
|
||||
//make sure to destroy them before changing the turf though
|
||||
if(artifact_find && artifact_fail)
|
||||
var/pain = 0
|
||||
if(prob(50))
|
||||
pain = 1
|
||||
for(var/mob/living/M in range(src, 200))
|
||||
M << "<font color='red'><b>[pick("A high pitched [pick("keening","wailing","whistle")]","A rumbling noise like [pick("thunder","heavy machinery")]")] somehow penetrates your mind before fadaing away!</b></font>"
|
||||
if(pain)
|
||||
flick("pain",M.pain)
|
||||
if(prob(50))
|
||||
M.adjustBruteLoss(5)
|
||||
else
|
||||
flick("flash",M.flash)
|
||||
if(prob(50))
|
||||
M.Stun(5)
|
||||
M.apply_effect(25, IRRADIATE)
|
||||
|
||||
var/turf/simulated/floor/plating/airless/asteroid/N = ChangeTurf(/turf/simulated/floor/plating/airless/asteroid)
|
||||
N.fullUpdateMineralOverlays()
|
||||
|
||||
if(destroyed) //Display message about being a terrible miner
|
||||
usr << "\red You destroy some of the rocks!"
|
||||
return
|
||||
|
||||
/turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F)
|
||||
//with skill and luck, players can cleanly extract finds
|
||||
//otherwise, they come out inside a chunk of rock
|
||||
var/obj/item/weapon/X
|
||||
if(prob_clean)
|
||||
X = new/obj/item/weapon/archaeological_find(src, new_item_type = F.find_type)
|
||||
else
|
||||
X = new/obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type)
|
||||
src.geological_data.UpdateNearbyArtifactInfo(src)
|
||||
X:geological_data = src.geological_data
|
||||
|
||||
//some find types delete the /obj/item/weapon/archaeological_find and replace it with something else, this handles when that happens
|
||||
//yuck
|
||||
var/display_name = "something"
|
||||
if(!X)
|
||||
X = last_find
|
||||
if(X)
|
||||
display_name = X.name
|
||||
|
||||
//many finds are ancient and thus very delicate - luckily there is a specialised energy suspension field which protects them when they're being extracted
|
||||
if(prob(F.prob_delicate))
|
||||
var/obj/effect/suspension_field/S = locate() in src
|
||||
if(!S || S.field_type != get_responsive_reagent(F.find_type))
|
||||
if(X)
|
||||
src.visible_message("\red<b>[pick("[display_name] crumbles away into dust","[display_name] breaks apart")].</b>")
|
||||
del(X)
|
||||
|
||||
src.finds.Remove(F)
|
||||
|
||||
/turf/simulated/mineral/proc/artifact_debris(var/severity = 0)
|
||||
//cael's patented random limited drop componentized loot system!
|
||||
severity = max(min(severity,1),0)
|
||||
var/materials = 0
|
||||
var/list/viable_materials = list(1,2,4,8,16,32,64,128,256)
|
||||
|
||||
var/num_materials = rand(1,3 + severity*2)
|
||||
for(var/i=0, i<num_materials, i++)
|
||||
var/chosen = pick(viable_materials)
|
||||
materials |= chosen
|
||||
viable_materials.Remove(chosen)
|
||||
|
||||
if(materials & 1)
|
||||
var/obj/item/stack/rods/R = new(src)
|
||||
R.amount = rand(5,25)
|
||||
|
||||
if(materials & 2)
|
||||
var/obj/item/stack/tile/R = new(src)
|
||||
R.amount = rand(1,5)
|
||||
|
||||
if(materials & 4)
|
||||
var/obj/item/stack/sheet/metal/R = new(src)
|
||||
R.amount = rand(5,25)
|
||||
|
||||
if(materials & 8)
|
||||
var/obj/item/stack/sheet/plasteel/R = new(src)
|
||||
R.amount = rand(5,25)
|
||||
|
||||
if(materials & 16)
|
||||
var/quantity = rand(1,3)
|
||||
for(var/i=0, i<quantity, i++)
|
||||
new /obj/item/weapon/shard(src)
|
||||
|
||||
if(materials & 32)
|
||||
var/quantity = rand(1,3)
|
||||
for(var/i=0, i<quantity, i++)
|
||||
new /obj/item/weapon/shard/plasma(src)
|
||||
|
||||
if(materials & 64)
|
||||
var/obj/item/stack/sheet/mineral/uranium/R = new(src)
|
||||
R.amount = rand(5,25)
|
||||
|
||||
if(materials & 128)
|
||||
var/obj/item/stack/sheet/mineral/mythril/R = new(src)
|
||||
R.amount = rand(1,5)
|
||||
|
||||
if(materials & 256)
|
||||
var/obj/item/stack/sheet/mineral/adamantine/R = new(src)
|
||||
R.amount = rand(1,5)
|
||||
|
||||
/*
|
||||
/turf/simulated/mineral/proc/setRandomMinerals()
|
||||
var/s = pickweight(list("uranium" = 5, "iron" = 50, "gold" = 5, "silver" = 5, "plasma" = 50, "diamond" = 1))
|
||||
@@ -448,7 +735,6 @@ commented out in r5061, I left it because of the shroom thingies
|
||||
if(istype(get_step(src, WEST), /turf/simulated/mineral))
|
||||
src.overlays += image('icons/turf/walls.dmi', "rock_side_w", layer=6)
|
||||
|
||||
|
||||
/turf/simulated/floor/plating/airless/asteroid/proc/fullUpdateMineralOverlays()
|
||||
var/turf/simulated/floor/plating/airless/asteroid/A
|
||||
if(istype(get_step(src, WEST), /turf/simulated/floor/plating/airless/asteroid))
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
/obj/item/weapon/ore
|
||||
name = "Rock"
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "ore"
|
||||
|
||||
icon_state = "ore2"
|
||||
var/datum/geosample/geological_data
|
||||
|
||||
/obj/item/weapon/ore/uranium
|
||||
name = "Uranium ore"
|
||||
@@ -59,19 +59,16 @@
|
||||
desc = "Completely useless"
|
||||
icon_state = "slag"
|
||||
|
||||
/obj/item/weapon/ore/strangerock //see artifact_archaeo.dm in modules/research for more info
|
||||
name = "Strange rock"
|
||||
desc = "Seems to have some unusal strata evident throughout it."
|
||||
icon_state = "strange"
|
||||
var/obj/inside
|
||||
var/method // 0 = fire, 1+ = acid
|
||||
origin_tech = "materials=5"
|
||||
//unacidable = 1 //This can prevent acid from gooey grey massing
|
||||
|
||||
/obj/item/weapon/ore/New()
|
||||
pixel_x = rand(0,16)-8
|
||||
pixel_y = rand(0,8)-8
|
||||
|
||||
/obj/item/weapon/ore/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/device/core_sampler))
|
||||
var/obj/item/device/core_sampler/C = W
|
||||
C.sample_item(src, user)
|
||||
else
|
||||
return ..()
|
||||
|
||||
/*****************************Coin********************************/
|
||||
|
||||
@@ -152,4 +149,4 @@
|
||||
overlays = list()
|
||||
string_attached = null
|
||||
user << "\blue You detach the string from the coin."
|
||||
else ..()
|
||||
else ..()
|
||||
|
||||
@@ -32,19 +32,13 @@ mob/proc/custom_emote(var/m_type=1,var/message = null)
|
||||
continue
|
||||
if(findtext(message," snores.")) //Because we have so many sleeping people.
|
||||
break
|
||||
if(M.stat == 2 && M.client.ghost_sight && !(M in viewers(src,null)))
|
||||
if(M.stat == 2 && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null)))
|
||||
M.show_message(message)
|
||||
|
||||
|
||||
if (m_type & 1)
|
||||
for (var/mob/O in viewers(src, null))
|
||||
if(istype(O,/mob/living/carbon/human))
|
||||
for(var/mob/living/parasite/P in O:parasites)
|
||||
P.show_message(message, m_type)
|
||||
O.show_message(message, m_type)
|
||||
else if (m_type & 2)
|
||||
for (var/mob/O in hearers(src.loc, null))
|
||||
if(istype(O,/mob/living/carbon/human))
|
||||
for(var/mob/living/parasite/P in O:parasites)
|
||||
P.show_message(message, m_type)
|
||||
O.show_message(message, m_type)
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
return
|
||||
|
||||
if (length(message) >= 2)
|
||||
if (copytext(message, 1, 3) == ":a" || copytext(message, 1, 3) == "#a" || copytext(message, 1, 3) == ".a" )
|
||||
if (department_radio_keys[copytext(message, 1, 3)] == "alientalk")
|
||||
message = copytext(message, 3)
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
if (stat == 2)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/obj/item/device/posibrain
|
||||
/obj/item/device/mmi/posibrain
|
||||
name = "positronic brain"
|
||||
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
|
||||
icon = 'icons/obj/assemblies.dmi'
|
||||
@@ -6,17 +6,18 @@
|
||||
w_class = 3
|
||||
origin_tech = "engineering=4;materials=4;bluespace=2;programming=4"
|
||||
|
||||
var/list/construction_cost = list("metal"=500,"glass"=500,"silver"=200,"gold"=200,"plasma"=100,"diamond"=10)
|
||||
var/construction_time = 75
|
||||
construction_cost = list("metal"=500,"glass"=500,"silver"=200,"gold"=200,"plasma"=100,"diamond"=10)
|
||||
construction_time = 75
|
||||
var/searching = 0
|
||||
var/askDelay = 10 * 60 * 1
|
||||
var/mob/living/carbon/brain/brainmob = null
|
||||
mob/living/carbon/brain/brainmob = null
|
||||
req_access = list(access_robotics)
|
||||
var/locked = 0
|
||||
var/obj/mecha = null//This does not appear to be used outside of reference in mecha.dm.
|
||||
locked = 0
|
||||
mecha = null//This does not appear to be used outside of reference in mecha.dm.
|
||||
|
||||
|
||||
attack_self(mob/user as mob)
|
||||
if(!brainmob.key && searching == 0)
|
||||
if(brainmob && !brainmob.key && searching == 0)
|
||||
//Start the process of searching for a new user.
|
||||
user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process."
|
||||
icon_state = "posibrain-searching"
|
||||
@@ -36,7 +37,7 @@
|
||||
spawn(0)
|
||||
if(!C) return
|
||||
var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round")
|
||||
if(!C || brainmob.key) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
|
||||
if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
|
||||
if(response == "Yes")
|
||||
transfer_personality(C.mob)
|
||||
else if (response == "Never for this round")
|
||||
@@ -48,7 +49,8 @@
|
||||
|
||||
src.searching = 0
|
||||
src.brainmob.mind = candidate.mind
|
||||
src.brainmob.key = candidate.key
|
||||
//src.brainmob.key = candidate.key
|
||||
src.brainmob.ckey = candidate.ckey
|
||||
src.name = "positronic brain ([src.brainmob.name])"
|
||||
|
||||
src.brainmob << "<b>You are a positronic brain, brought into existence on [station_name()].</b>"
|
||||
@@ -64,7 +66,7 @@
|
||||
|
||||
proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
|
||||
|
||||
if(brainmob) return
|
||||
if(src.brainmob && src.brainmob.key) return
|
||||
|
||||
src.searching = 0
|
||||
icon_state = "posibrain"
|
||||
@@ -73,7 +75,7 @@
|
||||
for (var/mob/M in viewers(T))
|
||||
M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
|
||||
|
||||
/obj/item/device/posibrain/examine()
|
||||
/obj/item/device/mmi/posibrain/examine()
|
||||
|
||||
set src in oview()
|
||||
|
||||
@@ -85,7 +87,7 @@
|
||||
var/msg = "<span class='info'>*---------*\nThis is \icon[src] \a <EM>[src]</EM>!\n[desc]\n"
|
||||
msg += "<span class='warning'>"
|
||||
|
||||
if(src.brainmob.key)
|
||||
if(src.brainmob && src.brainmob.key)
|
||||
switch(src.brainmob.stat)
|
||||
if(CONSCIOUS)
|
||||
if(!src.brainmob.client) msg += "It appears to be in stand-by mode.\n" //afk
|
||||
@@ -97,20 +99,20 @@
|
||||
usr << msg
|
||||
return
|
||||
|
||||
/obj/item/device/posibrain/emp_act(severity)
|
||||
if(!brainmob)
|
||||
/obj/item/device/mmi/posibrain/emp_act(severity)
|
||||
if(!src.brainmob)
|
||||
return
|
||||
else
|
||||
switch(severity)
|
||||
if(1)
|
||||
brainmob.emp_damage += rand(20,30)
|
||||
src.brainmob.emp_damage += rand(20,30)
|
||||
if(2)
|
||||
brainmob.emp_damage += rand(10,20)
|
||||
src.brainmob.emp_damage += rand(10,20)
|
||||
if(3)
|
||||
brainmob.emp_damage += rand(0,10)
|
||||
src.brainmob.emp_damage += rand(0,10)
|
||||
..()
|
||||
|
||||
/obj/item/device/posibrain/New()
|
||||
/obj/item/device/mmi/posibrain/New()
|
||||
|
||||
src.brainmob = new(src)
|
||||
src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
|
||||
@@ -123,4 +125,4 @@
|
||||
src.brainmob.brain_op_stage = 4.0
|
||||
dead_mob_list -= src.brainmob
|
||||
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
if (silent)
|
||||
return
|
||||
|
||||
if(!(container && (istype(container, /obj/item/device/mmi) || istype(container, /obj/item/device/posibrain))))
|
||||
if(!(container && (istype(container, /obj/item/device/mmi) || istype(container, /obj/item/device/mmi/posibrain))))
|
||||
return //No MMI, can't speak, bucko./N
|
||||
else
|
||||
if ((copytext(message, 1, 3) == ":b") || (copytext(message, 1, 3) == ":B") && (container && istype(container, /obj/item/device/posibrain)))
|
||||
if ((department_radio_keys[copytext(message, 1, 3)] == "binary") && (container && istype(container, /obj/item/device/mmi/posibrain)))
|
||||
message = copytext(message, 3)
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
robot_talk(message)
|
||||
|
||||
@@ -54,8 +54,8 @@
|
||||
var/datum/organ/external/temp = M:organs_by_name["r_hand"]
|
||||
if (M.hand)
|
||||
temp = M:organs_by_name["l_hand"]
|
||||
if(temp && temp.status & ORGAN_DESTROYED)
|
||||
M << "\red Yo- wait a minute."
|
||||
if(temp && !temp.is_usable())
|
||||
M << "\red You can't use your [temp.display_name]"
|
||||
return
|
||||
|
||||
for(var/datum/disease/D in viruses)
|
||||
@@ -76,14 +76,6 @@
|
||||
/mob/living/carbon/attack_paw(mob/M as mob)
|
||||
if(!istype(M, /mob/living/carbon)) return
|
||||
|
||||
if (hasorgans(M))
|
||||
var/datum/organ/external/temp = M:organs_by_name["r_hand"]
|
||||
if (M.hand)
|
||||
temp = M:organs_by_name["l_hand"]
|
||||
if(temp && temp.status & ORGAN_DESTROYED)
|
||||
M << "\red Yo- wait a minute."
|
||||
return
|
||||
|
||||
for(var/datum/disease/D in viruses)
|
||||
|
||||
if(D.spread_by_touch())
|
||||
@@ -97,6 +89,7 @@
|
||||
return
|
||||
|
||||
/mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
shock_damage *= siemens_coeff
|
||||
if (shock_damage<1)
|
||||
return 0
|
||||
@@ -186,6 +179,8 @@
|
||||
status += "numb"
|
||||
if(org.status & ORGAN_DESTROYED)
|
||||
status = "MISSING!"
|
||||
if(org.status & ORGAN_MUTATED)
|
||||
status = "weirdly shapen."
|
||||
if(status == "")
|
||||
status = "OK"
|
||||
src.show_message(text("\t []My [] is [].",status=="OK"?"\blue ":"\red ",org.display_name,status),1)
|
||||
@@ -384,13 +379,13 @@
|
||||
item.layer = initial(item.layer)
|
||||
u_equip(item)
|
||||
update_icons()
|
||||
//if(src.client)
|
||||
//src.client.screen -= item
|
||||
|
||||
//item.loc = src.loc
|
||||
|
||||
//if(istype(item, /obj/item))
|
||||
//item:dropped(src) // let it know it's been dropped
|
||||
if (istype(usr, /mob/living/carbon/monkey)) //Check if a monkey is throwing. Modify/remove this line as required.
|
||||
item.loc = src.loc
|
||||
if(src.client)
|
||||
src.client.screen -= item
|
||||
if(istype(item, /obj/item))
|
||||
item:dropped(src) // let it know it's been dropped
|
||||
|
||||
//actually throw it!
|
||||
if (item)
|
||||
|
||||
@@ -48,9 +48,6 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/death(gibbed)
|
||||
if(halloss > 0 && !gibbed)
|
||||
halloss = 0
|
||||
return
|
||||
if(stat == DEAD) return
|
||||
if(healths) healths.icon_state = "health5"
|
||||
stat = DEAD
|
||||
|
||||
@@ -53,27 +53,17 @@
|
||||
var/input = copytext(sanitize(input("Choose an emote to display.") as text|null),1,MAX_MESSAGE_LEN)
|
||||
if (!input)
|
||||
return
|
||||
if(copytext(input,1,5) == "says")
|
||||
src << "\red Invalid emote."
|
||||
return
|
||||
else if(copytext(input,1,9) == "exclaims")
|
||||
src << "\red Invalid emote."
|
||||
return
|
||||
else if(copytext(input,1,5) == "asks")
|
||||
src << "\red Invalid emote."
|
||||
return
|
||||
else
|
||||
var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable")
|
||||
if (input2 == "Visible")
|
||||
m_type = 1
|
||||
else if (input2 == "Hearable")
|
||||
if (src.miming)
|
||||
return
|
||||
m_type = 2
|
||||
else
|
||||
alert("Unable to use this emote, must be either hearable or visible.")
|
||||
var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable")
|
||||
if (input2 == "Visible")
|
||||
m_type = 1
|
||||
else if (input2 == "Hearable")
|
||||
if (src.miming)
|
||||
return
|
||||
message = "<B>[src]</B> [input]"
|
||||
m_type = 2
|
||||
else
|
||||
alert("Unable to use this emote, must be either hearable or visible.")
|
||||
return
|
||||
message = "<B>[src]</B> [input]"
|
||||
|
||||
if ("me")
|
||||
if(silent)
|
||||
@@ -88,17 +78,7 @@
|
||||
return
|
||||
if(!(message))
|
||||
return
|
||||
if(copytext(message,1,5) == "says")
|
||||
src << "\red Invalid emote."
|
||||
return
|
||||
else if(copytext(message,1,9) == "exclaims")
|
||||
src << "\red Invalid emote."
|
||||
return
|
||||
else if(copytext(message,1,5) == "asks")
|
||||
src << "\red Invalid emote."
|
||||
return
|
||||
else
|
||||
message = "<B>[src]</B> [message]"
|
||||
message = "<B>[src]</B> [message]"
|
||||
|
||||
if ("salute")
|
||||
if (!src.buckled)
|
||||
|
||||
@@ -413,7 +413,7 @@
|
||||
|
||||
|
||||
msg += "<span class = 'deptradio'>Criminal status:</span> <a href='?src=\ref[src];criminal=1'>\[[criminal]\]</a>\n"
|
||||
msg += "<span class = 'deptradio'>Security records:</span> <a href='?src=\ref[src];secrecord=`'>\[View\]</a>\n"
|
||||
msg += "<span class = 'deptradio'>Security records:</span> <a href='?src=\ref[src];secrecord=`'>\[View\]</a> <a href='?src=\ref[src];secrecordadd=`'>\[Add comment\]</a>\n"
|
||||
//msg += "\[Set Hostile Identification\]\n"
|
||||
|
||||
if(istype(usr, /mob/living/carbon/human))
|
||||
@@ -439,7 +439,7 @@
|
||||
|
||||
|
||||
msg += "<span class = 'deptradio'>Physical status:</span> <a href='?src=\ref[src];medical=1'>\[[medical]\]</a>\n"
|
||||
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=\ref[src];medrecord=`'>\[View\]</a>\n"
|
||||
msg += "<span class = 'deptradio'>Medical records:</span> <a href='?src=\ref[src];medrecord=`'>\[View\]</a> <a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>\n"
|
||||
|
||||
|
||||
if(print_flavor_text()) msg += "[print_flavor_text()]\n"
|
||||
|
||||
@@ -439,7 +439,7 @@
|
||||
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
|
||||
/mob/living/carbon/human/proc/get_face_name()
|
||||
var/datum/organ/external/head/head = get_organ("head")
|
||||
if( !head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name ) //disfigured. use id-name if possible
|
||||
if( !head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
|
||||
return "Unknown"
|
||||
return real_name
|
||||
|
||||
@@ -568,11 +568,70 @@
|
||||
usr << "<b>Major Crimes:</b> [R.fields["ma_crim"]]"
|
||||
usr << "<b>Details:</b> [R.fields["ma_crim_d"]]"
|
||||
usr << "<b>Notes:</b> [R.fields["notes"]]"
|
||||
usr << "<a href='?src=\ref[src];secrecordComment=`'>\[View Comment Log\]</a>"
|
||||
read = 1
|
||||
|
||||
if(!read)
|
||||
usr << "\red Unable to locate a data core entry for this person."
|
||||
|
||||
if (href_list["secrecordComment"])
|
||||
if(istype(usr, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
|
||||
var/perpname = "wot"
|
||||
var/read = 0
|
||||
|
||||
if(wear_id)
|
||||
if(istype(wear_id,/obj/item/weapon/card/id))
|
||||
perpname = wear_id:registered_name
|
||||
else if(istype(wear_id,/obj/item/device/pda))
|
||||
var/obj/item/device/pda/tempPda = wear_id
|
||||
perpname = tempPda.owner
|
||||
else
|
||||
perpname = src.name
|
||||
for (var/datum/data/record/E in data_core.general)
|
||||
if (E.fields["name"] == perpname)
|
||||
for (var/datum/data/record/R in data_core.security)
|
||||
if (R.fields["id"] == E.fields["id"])
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
|
||||
read = 1
|
||||
var/counter = 1
|
||||
while(R.fields[text("com_[]", counter)])
|
||||
usr << text("[]", R.fields[text("com_[]", counter)])
|
||||
counter++
|
||||
if (counter == 1)
|
||||
usr << "No comment found"
|
||||
usr << "<a href='?src=\ref[src];secrecordadd=`'>\[Add comment\]</a>"
|
||||
|
||||
if(!read)
|
||||
usr << "\red Unable to locate a data core entry for this person."
|
||||
|
||||
if (href_list["secrecordadd"])
|
||||
if(istype(usr, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
|
||||
var/perpname = "wot"
|
||||
if(wear_id)
|
||||
if(istype(wear_id,/obj/item/weapon/card/id))
|
||||
perpname = wear_id:registered_name
|
||||
else if(istype(wear_id,/obj/item/device/pda))
|
||||
var/obj/item/device/pda/tempPda = wear_id
|
||||
perpname = tempPda.owner
|
||||
else
|
||||
perpname = src.name
|
||||
for (var/datum/data/record/E in data_core.general)
|
||||
if (E.fields["name"] == perpname)
|
||||
for (var/datum/data/record/R in data_core.security)
|
||||
if (R.fields["id"] == E.fields["id"])
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))
|
||||
var/t1 = copytext(sanitize(input("Add Comment:", "Sec. records", null, null) as message),1,MAX_MESSAGE_LEN)
|
||||
if ((!( t1 ) || src.stat || src.restrained() || !(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.glasses, /obj/item/clothing/glasses/sunglasses/sechud))))
|
||||
return
|
||||
var/counter = 1
|
||||
while(R.fields[text("com_[]", counter)])
|
||||
counter++
|
||||
R.fields[text("com_[]", counter)] = text("Made by [] ([]) on [], 2053<BR>[]",H.get_authentification_name(), H.get_assignment(), time2text(world.realtime, "DDD MMM DD hh:mm:ss"), t1)
|
||||
|
||||
if (href_list["medical"])
|
||||
if(istype(usr, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
@@ -594,7 +653,7 @@
|
||||
for (var/datum/data/record/R in data_core.general)
|
||||
if (R.fields["id"] == E.fields["id"])
|
||||
|
||||
var/setmedical = input(usr, "Specify a new criminal status for this person.", "Medical HUD", R.fields["p_stat"]) in list("*Deceased*", "*Unconscious*", "Physically Unfit", "Active", "Cancel")
|
||||
var/setmedical = input(usr, "Specify a new medical status for this person.", "Medical HUD", R.fields["p_stat"]) in list("*Deceased*", "*Unconscious*", "Physically Unfit", "Active", "Cancel")
|
||||
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
|
||||
if(setmedical != "Cancel")
|
||||
@@ -634,10 +693,69 @@
|
||||
usr << "<b>Major Disabilities:</b> [R.fields["ma_dis"]]"
|
||||
usr << "<b>Details:</b> [R.fields["ma_dis_d"]]"
|
||||
usr << "<b>Notes:</b> [R.fields["notes"]]"
|
||||
usr << "<a href='?src=\ref[src];medrecordComment=`'>\[View Comment Log\]</a>"
|
||||
read = 1
|
||||
|
||||
if(!read)
|
||||
usr << "\red Unable to locate a data core entry for this person."
|
||||
|
||||
if (href_list["medrecordComment"])
|
||||
if(istype(usr, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
|
||||
var/perpname = "wot"
|
||||
var/read = 0
|
||||
|
||||
if(wear_id)
|
||||
if(istype(wear_id,/obj/item/weapon/card/id))
|
||||
perpname = wear_id:registered_name
|
||||
else if(istype(wear_id,/obj/item/device/pda))
|
||||
var/obj/item/device/pda/tempPda = wear_id
|
||||
perpname = tempPda.owner
|
||||
else
|
||||
perpname = src.name
|
||||
for (var/datum/data/record/E in data_core.general)
|
||||
if (E.fields["name"] == perpname)
|
||||
for (var/datum/data/record/R in data_core.medical)
|
||||
if (R.fields["id"] == E.fields["id"])
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
|
||||
read = 1
|
||||
var/counter = 1
|
||||
while(R.fields[text("com_[]", counter)])
|
||||
usr << text("[]", R.fields[text("com_[]", counter)])
|
||||
counter++
|
||||
if (counter == 1)
|
||||
usr << "No comment found"
|
||||
usr << "<a href='?src=\ref[src];medrecordadd=`'>\[Add comment\]</a>"
|
||||
|
||||
if(!read)
|
||||
usr << "\red Unable to locate a data core entry for this person."
|
||||
|
||||
if (href_list["medrecordadd"])
|
||||
if(istype(usr, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = usr
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
|
||||
var/perpname = "wot"
|
||||
if(wear_id)
|
||||
if(istype(wear_id,/obj/item/weapon/card/id))
|
||||
perpname = wear_id:registered_name
|
||||
else if(istype(wear_id,/obj/item/device/pda))
|
||||
var/obj/item/device/pda/tempPda = wear_id
|
||||
perpname = tempPda.owner
|
||||
else
|
||||
perpname = src.name
|
||||
for (var/datum/data/record/E in data_core.general)
|
||||
if (E.fields["name"] == perpname)
|
||||
for (var/datum/data/record/R in data_core.medical)
|
||||
if (R.fields["id"] == E.fields["id"])
|
||||
if(istype(H.glasses, /obj/item/clothing/glasses/hud/health))
|
||||
var/t1 = copytext(sanitize(input("Add Comment:", "Med. records", null, null) as message),1,MAX_MESSAGE_LEN)
|
||||
if ((!( t1 ) || src.stat || src.restrained() || !(istype(H.glasses, /obj/item/clothing/glasses/hud/health))))
|
||||
return
|
||||
var/counter = 1
|
||||
while(R.fields[text("com_[]", counter)])
|
||||
counter++
|
||||
R.fields[text("com_[]", counter)] = text("Made by [] ([]) on [], 2053<BR>[]",H.get_authentification_name(), H.get_assignment(), time2text(world.realtime, "DDD MMM DD hh:mm:ss"), t1)
|
||||
..()
|
||||
return
|
||||
|
||||
@@ -684,7 +802,7 @@
|
||||
if(dna)
|
||||
switch(dna.mutantrace)
|
||||
if("lizard")
|
||||
return "Soghun"
|
||||
return "Unathi"
|
||||
if("tajaran")
|
||||
return "Tajaran"
|
||||
if("skrell")
|
||||
@@ -699,12 +817,21 @@
|
||||
/mob/living/carbon/get_species()
|
||||
if(src.dna)
|
||||
if(src.dna.mutantrace == "lizard")
|
||||
return "Soghun"
|
||||
return "Unathi"
|
||||
else if(src.dna.mutantrace == "skrell")
|
||||
return "Skrell"
|
||||
else if(src.dna.mutantrace == "tajaran")
|
||||
return "Tajaran"
|
||||
|
||||
/mob/living/carbon/proc/update_mutantrace_languages()
|
||||
if(src.dna)
|
||||
if(src.dna.mutantrace == "lizard")
|
||||
src.soghun_talk_understand = 1
|
||||
else if(src.dna.mutantrace == "skrell")
|
||||
src.skrell_talk_understand = 1
|
||||
else if(src.dna.mutantrace == "tajaran")
|
||||
src.tajaran_talk_understand = 1
|
||||
|
||||
/mob/living/carbon/human/proc/play_xylophone()
|
||||
if(!src.xylophone)
|
||||
visible_message("\red [src] begins playing his ribcage like a xylophone. It's quite spooky.","\blue You begin to play a spooky refrain on your ribcage.","\red You hear a spooky xylophone melody.")
|
||||
|
||||
@@ -3,6 +3,13 @@
|
||||
M << "No attacking people at spawn, you jackass."
|
||||
return
|
||||
|
||||
var/datum/organ/external/temp = M:organs_by_name["r_hand"]
|
||||
if (M.hand)
|
||||
temp = M:organs_by_name["l_hand"]
|
||||
if(temp && !temp.is_usable())
|
||||
M << "\red You can't use your [temp.display_name]."
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
if((M != src) && check_shields(0, M.name))
|
||||
|
||||
@@ -63,6 +63,34 @@
|
||||
if(HULK in mutations) return
|
||||
..()
|
||||
|
||||
/mob/living/carbon/human/adjustCloneLoss(var/amount)
|
||||
..()
|
||||
var/heal_prob = max(0, 80 - getCloneLoss())
|
||||
var/mut_prob = min(80, getCloneLoss()+10)
|
||||
if (amount > 0)
|
||||
if (prob(mut_prob))
|
||||
var/list/datum/organ/external/candidates = list()
|
||||
for (var/datum/organ/external/O in organs)
|
||||
if(!(O.status & ORGAN_MUTATED))
|
||||
candidates |= O
|
||||
if (candidates.len)
|
||||
var/datum/organ/external/O = pick(candidates)
|
||||
O.mutate()
|
||||
src << "<span class = 'notice'>Something is not right with your [O.display_name]...</span>"
|
||||
return
|
||||
else
|
||||
if (prob(heal_prob))
|
||||
for (var/datum/organ/external/O in organs)
|
||||
if (O.status & ORGAN_MUTATED)
|
||||
O.unmutate()
|
||||
src << "<span class = 'notice'>Your [O.display_name] is shaped normally again.</span>"
|
||||
return
|
||||
|
||||
if (getCloneLoss() < 1)
|
||||
for (var/datum/organ/external/O in organs)
|
||||
if (O.status & ORGAN_MUTATED)
|
||||
O.unmutate()
|
||||
src << "<span class = 'notice'>Your [O.display_name] is shaped normally again.</span>"
|
||||
////////////////////////////////////////////
|
||||
|
||||
//Returns a list of damaged organs
|
||||
|
||||
@@ -10,6 +10,28 @@ emp_act
|
||||
|
||||
/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone)
|
||||
|
||||
// BEGIN TASER NERF
|
||||
if(istype(P, /obj/item/projectile/energy/electrode))
|
||||
var/datum/organ/external/select_area = get_organ(def_zone) // We're checking the outside, buddy!
|
||||
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking?
|
||||
for(var/bp in body_parts) //Make an unregulated var to pass around.
|
||||
if(!bp)
|
||||
continue //Does this thing we're shooting even exist?
|
||||
if(bp && istype(bp ,/obj/item/clothing)) // If it exists, and it's clothed
|
||||
var/obj/item/clothing/C = bp // Then call an argument C to be that clothing!
|
||||
if(C.body_parts_covered & select_area.body_part) // Is that body part being targeted covered?
|
||||
if(C.siemens_coefficient == 0) //If so, is that clothing shock proof?
|
||||
visible_message("\red <B>The [P.name] gets deflected by [src]'s [C.name]!</B>") //DEFLECT!
|
||||
del P
|
||||
|
||||
/* Commenting out old Taser nerf
|
||||
if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor))
|
||||
if(istype(P, /obj/item/projectile/energy/electrode))
|
||||
visible_message("\red <B>The [P.name] gets deflected by [src]'s [wear_suit.name]!</B>")
|
||||
del P
|
||||
return -1
|
||||
*/
|
||||
// END TASER NERF
|
||||
if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor/laserproof))
|
||||
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
|
||||
var/reflectchance = 40 - round(P.damage/3)
|
||||
@@ -117,7 +139,7 @@ emp_act
|
||||
if(!target_zone)
|
||||
visible_message("\red <B>[user] misses [src] with \the [I]!")
|
||||
return
|
||||
|
||||
|
||||
var/datum/organ/external/affecting = get_organ(target_zone)
|
||||
if (!affecting)
|
||||
return
|
||||
@@ -138,7 +160,7 @@ emp_act
|
||||
if(armor >= 2) return 0
|
||||
if(!I.force) return 0
|
||||
|
||||
apply_damage(I.force, I.damtype, affecting, armor , I.sharp, I.name)
|
||||
apply_damage(I.force, I.damtype, affecting, armor , is_sharp(I), I.name)
|
||||
|
||||
var/bloody = 0
|
||||
if(((I.damtype == BRUTE) || (I.damtype == HALLOSS)) && prob(25 + (I.force * 2)))
|
||||
@@ -152,7 +174,7 @@ emp_act
|
||||
location.add_blood(src)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(get_dist(H, src) > 1) //people with TK won't get smeared with blood
|
||||
if(get_dist(H, src) <= 1) //people with TK won't get smeared with blood
|
||||
H.bloody_body(src)
|
||||
H.bloody_hands(src)
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
var/pressure_alert = 0
|
||||
var/prev_gender = null // Debug for plural genders
|
||||
var/temperature_alert = 0
|
||||
var/in_stasis = 0
|
||||
|
||||
|
||||
/mob/living/carbon/human/Life()
|
||||
@@ -59,8 +60,11 @@
|
||||
life_tick++
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
|
||||
in_stasis = istype(loc, /obj/structure/closet/body_bag/cryobag) && loc:opened == 0
|
||||
if(in_stasis) loc:used++
|
||||
|
||||
//No need to update all of these procs if the guy is dead.
|
||||
if(stat != DEAD)
|
||||
if(stat != DEAD && !in_stasis)
|
||||
if(air_master.current_cycle%4==2 || failed_last_breath) //First, resolve location and get a breath
|
||||
breathe() //Only try to take a breath every 4 ticks, unless suffocating
|
||||
|
||||
@@ -84,18 +88,22 @@
|
||||
//Random events (vomiting etc)
|
||||
handle_random_events()
|
||||
|
||||
handle_virus_updates()
|
||||
|
||||
//stuff in the stomach
|
||||
handle_stomach()
|
||||
|
||||
handle_shock()
|
||||
|
||||
handle_pain()
|
||||
|
||||
handle_medical_side_effects()
|
||||
|
||||
handle_stasis_bag()
|
||||
|
||||
//Handle temperature/pressure differences between body and environment
|
||||
handle_environment(environment)
|
||||
|
||||
//stuff in the stomach
|
||||
handle_stomach()
|
||||
|
||||
handle_shock()
|
||||
|
||||
handle_pain()
|
||||
|
||||
handle_medical_side_effects()
|
||||
|
||||
//Status updates, death etc.
|
||||
handle_regular_status_updates() //TODO: optimise ~Carn
|
||||
update_canmove()
|
||||
@@ -194,6 +202,16 @@
|
||||
src << "\red Your legs won't respond properly, you fall down."
|
||||
lying = 1
|
||||
|
||||
proc/handle_stasis_bag()
|
||||
// Handle side effects from stasis bag
|
||||
if(in_stasis)
|
||||
// First off, there's no oxygen supply, so the mob will slowly take brain damage
|
||||
adjustBrainLoss(0.1)
|
||||
|
||||
// Next, the method to induce stasis has some adverse side-effects, manifesting
|
||||
// as cloneloss
|
||||
adjustCloneLoss(0.1)
|
||||
|
||||
proc/handle_mutations_and_radiation()
|
||||
if(getFireLoss())
|
||||
if((COLD_RESISTANCE in mutations) || (prob(1)))
|
||||
@@ -448,6 +466,7 @@
|
||||
SA.moles = 0
|
||||
|
||||
if( (abs(310.15 - breath.temperature) > 50) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :(
|
||||
if(status_flags & GODMODE) return 1 //godmode
|
||||
if(breath.temperature < 260.15)
|
||||
if(prob(20))
|
||||
src << "\red You feel your face freezing and an icicle forming in your lungs!"
|
||||
@@ -516,6 +535,7 @@
|
||||
if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT)
|
||||
//Body temperature is too hot.
|
||||
fire_alert = max(fire_alert, 1)
|
||||
if(status_flags & GODMODE) return 1 //godmode
|
||||
switch(bodytemperature)
|
||||
if(360 to 400)
|
||||
apply_damage(HEAT_DAMAGE_LEVEL_1, BURN, used_weapon = "High Body Temperature")
|
||||
@@ -529,6 +549,7 @@
|
||||
|
||||
else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
|
||||
fire_alert = max(fire_alert, 1)
|
||||
if(status_flags & GODMODE) return 1 //godmode
|
||||
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
|
||||
switch(bodytemperature)
|
||||
if(200 to 260)
|
||||
@@ -546,6 +567,7 @@
|
||||
|
||||
var/pressure = environment.return_pressure()
|
||||
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
|
||||
if(status_flags & GODMODE) return 1 //godmode
|
||||
switch(adjusted_pressure)
|
||||
if(HAZARD_HIGH_PRESSURE to INFINITY)
|
||||
adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
|
||||
@@ -562,6 +584,9 @@
|
||||
pressure_alert = -2
|
||||
else
|
||||
pressure_alert = -1
|
||||
|
||||
if(environment.toxins > MOLES_PLASMA_VISIBLE)
|
||||
pl_effects()
|
||||
return
|
||||
|
||||
/*
|
||||
@@ -775,6 +800,12 @@
|
||||
|
||||
proc/handle_chemicals_in_body()
|
||||
if(reagents) reagents.metabolize(src)
|
||||
var/total_plasmaloss = 0
|
||||
for(var/obj/item/I in src)
|
||||
if(I.contaminated)
|
||||
total_plasmaloss += vsc.plc.CONTAMINATION_LOSS
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
adjustToxLoss(total_plasmaloss)
|
||||
|
||||
// if(dna && dna.mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist
|
||||
if(PLANT in mutations)
|
||||
@@ -871,8 +902,10 @@
|
||||
silent = 0
|
||||
else //ALIVE. LIGHTS ARE ON
|
||||
updatehealth() //TODO
|
||||
handle_organs()
|
||||
handle_blood()
|
||||
if(!in_stasis)
|
||||
handle_organs()
|
||||
handle_blood()
|
||||
|
||||
if(health <= config.health_threshold_dead || brain_op_stage == 4.0)
|
||||
death()
|
||||
blinded = 1
|
||||
@@ -1088,7 +1121,7 @@
|
||||
see_in_dark = 8
|
||||
if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
|
||||
if(seer)
|
||||
if(seer==1)
|
||||
var/obj/effect/rune/R = locate() in loc
|
||||
if(R && R.word1 == cultwords["see"] && R.word2 == cultwords["hell"] && R.word3 == cultwords["join"])
|
||||
see_invisible = SEE_INVISIBLE_OBSERVER
|
||||
@@ -1152,7 +1185,7 @@
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
else
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
else
|
||||
else if(!seer)
|
||||
see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
if(healths)
|
||||
@@ -1212,8 +1245,14 @@
|
||||
if(blinded) blind.layer = 18
|
||||
else blind.layer = 0
|
||||
|
||||
if( disabilities & NEARSIGHTED && !istype(glasses, /obj/item/clothing/glasses/regular) )
|
||||
client.screen += global_hud.vimpaired
|
||||
if(disabilities & NEARSIGHTED) //this looks meh but saves a lot of memory by not requiring to add var/prescription
|
||||
if(glasses) //to every /obj/item
|
||||
var/obj/item/clothing/glasses/G = glasses
|
||||
if(!G.prescription)
|
||||
client.screen += global_hud.vimpaired
|
||||
else
|
||||
client.screen += global_hud.vimpaired
|
||||
|
||||
if(eye_blurry) client.screen += global_hud.blurry
|
||||
if(druggy) client.screen += global_hud.druggy
|
||||
|
||||
@@ -1259,9 +1298,11 @@
|
||||
playsound_local(src,pick(scarySounds),50, 1, -1)
|
||||
|
||||
proc/handle_virus_updates()
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(bodytemperature > 406)
|
||||
for(var/datum/disease/D in viruses)
|
||||
D.cure()
|
||||
if(virus2) virus2.cure(src)
|
||||
if(!virus2)
|
||||
for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
|
||||
if(B.virus2 && get_infection_chance())
|
||||
@@ -1307,7 +1348,7 @@
|
||||
|
||||
handle_shock()
|
||||
..()
|
||||
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
if(analgesic) return // analgesic avoids all traumatic shock temporarily
|
||||
|
||||
if(health < 0)// health 0 makes you immediately collapse
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
if(miming)
|
||||
if(length(message) >= 2)
|
||||
if(mind && mind.changeling)
|
||||
if(copytext(message, 1, 2) != "*" && copytext(message, 1, 3) != ":g" && copytext(message, 1, 3) != ":G" && copytext(message, 1, 3) != ":ï")
|
||||
if(copytext(message, 1, 2) != "*" && department_radio_keys[copytext(message, 1, 3)] != "changeling")
|
||||
return
|
||||
else
|
||||
return ..(message)
|
||||
@@ -93,7 +93,7 @@
|
||||
else if(istype(wear_mask, /obj/item/clothing/mask/horsehead))
|
||||
var/obj/item/clothing/mask/horsehead/hoers = wear_mask
|
||||
if(hoers.voicechange)
|
||||
if(!(copytext(message, 1, 2) == "*" || (mind && mind.changeling && (copytext(message, 1, 3) == ":g" || copytext(message, 1, 3) == ":G" || copytext(message, 1, 3) == ":ï"))))
|
||||
if(!(copytext(message, 1, 2) == "*" || (mind && mind.changeling && department_radio_keys[copytext(message, 1, 3)] != "changeling")))
|
||||
message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!")
|
||||
|
||||
if ((HULK in mutations) && health >= 25 && length(message))
|
||||
|
||||
@@ -126,7 +126,8 @@ Please contact me on #coderbus IRC. ~Carn x
|
||||
var/list/overlays_lying[TOTAL_LAYERS]
|
||||
var/list/overlays_standing[TOTAL_LAYERS]
|
||||
var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed
|
||||
|
||||
var/icon/race_icon
|
||||
var/icon/deform_icon
|
||||
|
||||
//UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING
|
||||
//this proc is messy as I was forced to include some old laggy cloaking code to it so that I don't break cloakers
|
||||
@@ -234,34 +235,16 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
var/g = "m"
|
||||
if(gender == FEMALE) g = "f"
|
||||
|
||||
var/icon/icobase
|
||||
if(skeleton)
|
||||
icobase = 'icons/mob/human_races/r_skeleton.dmi'
|
||||
else if(dna)
|
||||
switch(dna.mutantrace)
|
||||
if("tajaran")
|
||||
icobase = 'icons/mob/human_races/r_tajaran.dmi'
|
||||
if("lizard")
|
||||
icobase = 'icons/mob/human_races/r_lizard.dmi'
|
||||
if("skrell")
|
||||
icobase = 'icons/mob/human_races/r_skrell.dmi'
|
||||
else
|
||||
icobase = 'icons/mob/human_races/r_human.dmi'
|
||||
else
|
||||
icobase = 'icons/mob/human_races/r_human.dmi'
|
||||
|
||||
var/datum/organ/external/chest = get_organ("chest")
|
||||
stand_icon = chest.get_icon(g)
|
||||
if(!skeleton)
|
||||
stand_icon = new /icon(icobase, "torso_[g][fat?"_fat":""]")
|
||||
if(husk)
|
||||
stand_icon.ColorTone(husk_color_mod)
|
||||
else if(hulk)
|
||||
// stand_icon.ColorTone(hulk_color_mod)
|
||||
var/list/TONE = ReadRGB(hulk_color_mod)
|
||||
stand_icon.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3]))
|
||||
else if(plant)
|
||||
stand_icon.ColorTone(plant_color_mod)
|
||||
else
|
||||
stand_icon = new /icon(icobase, "torso")
|
||||
|
||||
var/datum/organ/external/head = get_organ("head")
|
||||
var/has_head = 0
|
||||
@@ -271,28 +254,22 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
for(var/datum/organ/external/part in organs)
|
||||
if(!istype(part, /datum/organ/external/chest) && !(part.status & ORGAN_DESTROYED))
|
||||
var/icon/temp
|
||||
if(istype(part, /datum/organ/external/groin))
|
||||
if(skeleton)
|
||||
temp = new /icon(icobase, "groin")
|
||||
else
|
||||
temp = new /icon(icobase, "groin_[g]")
|
||||
else if(istype(part, /datum/organ/external/head))
|
||||
if(skeleton)
|
||||
temp = new /icon(icobase, "head")
|
||||
else
|
||||
temp = new /icon(icobase, "head_[g]")
|
||||
if (istype(part, /datum/organ/external/groin) || istype(part, /datum/organ/external/head))
|
||||
temp = part.get_icon(g)
|
||||
else
|
||||
temp = new /icon(icobase, "[part.icon_name]")
|
||||
temp = part.get_icon()
|
||||
|
||||
if(part.status & ORGAN_ROBOT)
|
||||
temp.GrayScale()
|
||||
|
||||
if(part.status & ORGAN_DEAD)
|
||||
temp.ColorTone(necrosis_color_mod)
|
||||
temp.SetIntensity(0.7)
|
||||
|
||||
else if(!skeleton)
|
||||
if(husk)
|
||||
temp.ColorTone(husk_color_mod)
|
||||
else if(hulk)
|
||||
// temp.ColorTone(hulk_color_mod)
|
||||
var/list/TONE = ReadRGB(hulk_color_mod)
|
||||
temp.MapColors(rgb(TONE[1],0,0),rgb(0,TONE[2],0),rgb(0,0,TONE[3]))
|
||||
else if(plant)
|
||||
@@ -327,7 +304,7 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
|
||||
if(husk)
|
||||
var/icon/mask = new(stand_icon)
|
||||
var/icon/husk_over = new(icobase,"overlay_husk")
|
||||
var/icon/husk_over = new(race_icon,"overlay_husk")
|
||||
mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0)
|
||||
husk_over.Blend(mask, ICON_ADD)
|
||||
stand_icon.Blend(husk_over, ICON_OVERLAY)
|
||||
@@ -451,14 +428,34 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
// var/g = "m"
|
||||
// if (gender == FEMALE) g = "f"
|
||||
//BS12 EDIT
|
||||
var/skeleton = (SKELETON in src.mutations)
|
||||
if(skeleton)
|
||||
race_icon = 'icons/mob/human_races/r_skeleton.dmi'
|
||||
else if(dna)
|
||||
switch(dna.mutantrace)
|
||||
if("tajaran")
|
||||
race_icon = 'icons/mob/human_races/r_tajaran.dmi'
|
||||
deform_icon = 'icons/mob/human_races/r_def_tajaran.dmi'
|
||||
if("lizard")
|
||||
race_icon = 'icons/mob/human_races/r_lizard.dmi'
|
||||
deform_icon = 'icons/mob/human_races/r_def_lizard.dmi'
|
||||
if("skrell")
|
||||
race_icon = 'icons/mob/human_races/r_skrell.dmi'
|
||||
deform_icon = 'icons/mob/human_races/r_def_skrell.dmi'
|
||||
else
|
||||
race_icon = 'icons/mob/human_races/r_human.dmi'
|
||||
deform_icon = 'icons/mob/human_races/r_def_human.dmi'
|
||||
else
|
||||
icon = 'icons/mob/human_races/r_human.dmi'
|
||||
|
||||
if(dna)
|
||||
switch(dna.mutantrace)
|
||||
if("lizard","golem","slime","shadow","adamantine")
|
||||
if("golem","slime","shadow","adamantine")
|
||||
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_l")
|
||||
overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace][fat]_[gender]_s")
|
||||
if("lizard","tajaran","skrell")
|
||||
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[gender]_l")
|
||||
overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[gender]_s")
|
||||
// if("lizard","tajaran","skrell")
|
||||
// overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[gender]_l")
|
||||
// overlays_standing[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.mutantrace]_[gender]_s")
|
||||
if("plant")
|
||||
if(stat == DEAD) //TODO
|
||||
overlays_lying[MUTANTRACE_LAYER] = image("icon" = 'icons/effects/genetics.dmi', "icon_state" = "[dna.mutantrace]_d")
|
||||
@@ -560,9 +557,13 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
|
||||
/mob/living/carbon/human/update_inv_wear_id(var/update_icons=1)
|
||||
if(wear_id)
|
||||
overlays_lying[ID_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "id2")
|
||||
overlays_standing[ID_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "id")
|
||||
wear_id.screen_loc = ui_id //TODO
|
||||
if(w_uniform && w_uniform:displays_id)
|
||||
overlays_lying[ID_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "id2")
|
||||
overlays_standing[ID_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "id")
|
||||
else
|
||||
overlays_lying[ID_LAYER] = null
|
||||
overlays_standing[ID_LAYER] = null
|
||||
else
|
||||
overlays_lying[ID_LAYER] = null
|
||||
overlays_standing[ID_LAYER] = null
|
||||
@@ -873,4 +874,4 @@ proc/get_damage_icon_part(damage_state, body_part)
|
||||
#undef R_HAND_LAYER
|
||||
#undef TAIL_LAYER
|
||||
#undef TARGETED_LAYER
|
||||
#undef TOTAL_LAYERS
|
||||
#undef TOTAL_LAYERS
|
||||
|
||||
@@ -140,5 +140,5 @@
|
||||
for (var/mob/M in dead_mob_list)
|
||||
if (!(M.client))
|
||||
continue
|
||||
if (M.stat > 1 && !(M in heard_a))
|
||||
if (M.stat > 1 && !(M in heard_a) && (M.client.prefs.toggles & CHAT_GHOSTEARS))
|
||||
M.show_message(rendered, 2)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/carbon/slime/emote(var/act)
|
||||
/mob/living/carbon/slime/emote(var/act, var/type, var/desc)
|
||||
|
||||
|
||||
if (findtext(act, "-", 1, null))
|
||||
@@ -13,6 +13,10 @@
|
||||
var/message
|
||||
|
||||
switch(act)
|
||||
if ("me")
|
||||
return custom_emote(m_type, desc)
|
||||
if ("custom")
|
||||
return custom_emote(m_type, desc)
|
||||
if("moan")
|
||||
message = "<B>The [src.name]</B> moans."
|
||||
m_type = 2
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/mob/living/carbon/monkey/emote(var/act)
|
||||
/mob/living/carbon/monkey/emote(var/act, var/type, var/desc)
|
||||
|
||||
var/param = null
|
||||
if (findtext(act, "-", 1, null))
|
||||
@@ -14,6 +14,12 @@
|
||||
var/message
|
||||
|
||||
switch(act)
|
||||
if ("me")
|
||||
return custom_emote(m_type, desc)
|
||||
|
||||
if ("custom")
|
||||
return custom_emote(m_type, desc)
|
||||
|
||||
if("sign")
|
||||
if (!src.restrained())
|
||||
message = text("<B>The monkey</B> signs[].", (text2num(param) ? text(" the number []", text2num(param)) : null))
|
||||
|
||||
@@ -42,6 +42,9 @@
|
||||
//Disabilities
|
||||
handle_disabilities()
|
||||
|
||||
//Virus updates, duh
|
||||
handle_virus_updates()
|
||||
|
||||
//Apparently, the person who wrote this code designed it so that
|
||||
//blinded get reset each cycle and then get activated later in the
|
||||
//code. Very ugly. I dont care. Moving this stuff here so its easy
|
||||
@@ -147,6 +150,28 @@
|
||||
emote("gasp")
|
||||
updatehealth()
|
||||
|
||||
proc/handle_virus_updates()//copypaste from mob/carbon/human/life.dm
|
||||
if(bodytemperature > 406)
|
||||
for(var/datum/disease/D in viruses)
|
||||
D.cure()
|
||||
if(!virus2)
|
||||
for(var/obj/effect/decal/cleanable/blood/B in view(1,src))
|
||||
if(B.virus2 && get_infection_chance())
|
||||
infect_virus2(src,B.virus2)
|
||||
for(var/obj/effect/decal/cleanable/mucus/M in view(1,src))
|
||||
if(M.virus2 && get_infection_chance())
|
||||
infect_virus2(src,M.virus2)
|
||||
else
|
||||
if(isnull(virus2)) // Trying to figure out a runtime error that keeps repeating
|
||||
CRASH("virus2 nulled before calling activate()")
|
||||
else
|
||||
virus2.activate(src)
|
||||
|
||||
// activate may have deleted the virus
|
||||
if(!virus2) return
|
||||
|
||||
// check if we're immune
|
||||
if(virus2.antigen & src.antibodies) virus2.dead = 1
|
||||
|
||||
proc/breathe()
|
||||
if(reagents)
|
||||
|
||||
@@ -228,6 +228,7 @@
|
||||
|
||||
// damage ONE external organ, organ gets randomly selected from damaged ones.
|
||||
/mob/living/proc/take_organ_damage(var/brute, var/burn)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
adjustBruteLoss(brute)
|
||||
adjustFireLoss(burn)
|
||||
src.updatehealth()
|
||||
@@ -239,7 +240,8 @@
|
||||
src.updatehealth()
|
||||
|
||||
// damage MANY external organs, in random order
|
||||
/mob/living/proc/take_overall_damage(var/brute, var/burn)
|
||||
/mob/living/proc/take_overall_damage(var/brute, var/burn, var/used_weapon = null)
|
||||
if(status_flags & GODMODE) return 0 //godmode
|
||||
adjustBruteLoss(brute)
|
||||
adjustFireLoss(burn)
|
||||
src.updatehealth()
|
||||
|
||||
@@ -54,7 +54,10 @@ var/list/department_radio_keys = list(
|
||||
":ô" = "alientalk", "#ô" = "alientalk", ".ô" = "alientalk",
|
||||
":å" = "Syndicate", "#å" = "Syndicate", ".å" = "Syndicate",
|
||||
":é" = "Supply", "#é" = "Supply", ".é" = "Supply",
|
||||
":ï" = "changeling", "#ï" = "changeling", ".ï" = "changeling"
|
||||
":ï" = "changeling", "#ï" = "changeling", ".ï" = "changeling",
|
||||
":ë" = "skrell", "#ë" = "skrell", ".ë" = "skrell",
|
||||
":î" = "tajaran", "#î" = "tajaran", ".î" = "tajaran",
|
||||
":ù" = "soghun", "#ù" = "soghun", ".ù" = "soghun"
|
||||
)
|
||||
|
||||
/mob/living/proc/binarycheck()
|
||||
@@ -402,7 +405,7 @@ var/list/department_radio_keys = list(
|
||||
var/deaf_message = ""
|
||||
var/deaf_type = 1
|
||||
if(M != src)
|
||||
deaf_message = "<span class='name'>[name][alt_name]</span> talks but you cannot hear them."
|
||||
deaf_message = "<span class='name'>[name]</span>[alt_name] talks but you cannot hear them."
|
||||
else
|
||||
deaf_message = "<span class='notice'>You cannot hear yourself!</span>"
|
||||
deaf_type = 2 // Since you should be able to hear yourself without looking
|
||||
@@ -416,12 +419,12 @@ var/list/department_radio_keys = list(
|
||||
message_b = voice_message
|
||||
else
|
||||
message_b = stars(message)
|
||||
message_b = say_quote(message_b)
|
||||
message_b = say_quote(message_b,is_speaking_soghun,is_speaking_skrell,is_speaking_taj)
|
||||
|
||||
if (italics)
|
||||
message_b = "<i>[message_b]</i>"
|
||||
|
||||
rendered = "<span class='game say'><span class='name'>[voice_name]</span> <span class='message'>[message_b]</span></span>"
|
||||
rendered = "<span class='game say'><span class='name'>[name]</span>[alt_name] <span class='message'>[message_b]</span></span>" //Voice_name isn't too useful. You'd be able to tell who was talking presumably.
|
||||
|
||||
|
||||
for (var/M in heard_b)
|
||||
@@ -450,9 +453,10 @@ var/list/department_radio_keys = list(
|
||||
del(B)
|
||||
*/
|
||||
|
||||
//talking crystals
|
||||
for(var/obj/item/weapon/talkingcrystal/O in view(3,src))
|
||||
O.catchMessage(message,src)
|
||||
//talking items
|
||||
for(var/obj/item/weapon/O in view(3,src))
|
||||
if(O.listening_to_players)
|
||||
O.catchMessage(message, src)
|
||||
|
||||
log_say("[name]/[key] : [message]")
|
||||
|
||||
|
||||
@@ -178,6 +178,7 @@ var/list/ai_list = list()
|
||||
..()
|
||||
statpanel("Status")
|
||||
if (client.statpanel == "Status")
|
||||
stat(null, "Station Time: [worldtime2text()]")
|
||||
if(emergency_shuttle.online && emergency_shuttle.location < 2)
|
||||
var/timeleft = emergency_shuttle.timeleft()
|
||||
if (timeleft)
|
||||
@@ -234,16 +235,12 @@ var/list/ai_list = list()
|
||||
/mob/living/silicon/ai/proc/ai_roster()
|
||||
set category = "AI Commands"
|
||||
set name = "Show Crew Manifest"
|
||||
var/dat = "<html><head><title>Crew Roster</title></head><body><b>Crew Roster:</b><br><br>"
|
||||
|
||||
var/list/L = list()
|
||||
for (var/datum/data/record/t in data_core.general)
|
||||
var/R = t.fields["name"] + " - " + t.fields["rank"]
|
||||
L += R
|
||||
for(var/R in sortList(L))
|
||||
dat += "[R]<br>"
|
||||
dat += "</body></html>"
|
||||
var/dat
|
||||
|
||||
dat += "<h4>Crew Manifest</h4>"
|
||||
if(data_core)
|
||||
dat += data_core.get_manifest(0) // make it monochrome
|
||||
dat += "<br>"
|
||||
src << browse(dat, "window=airoster")
|
||||
onclose(src, "airoster")
|
||||
|
||||
@@ -743,4 +740,4 @@ var/list/ai_list = list()
|
||||
anchored = 1
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -413,14 +413,9 @@
|
||||
/mob/living/silicon/pai/proc/softwareManifest()
|
||||
var/dat = ""
|
||||
dat += "<h2>Crew Manifest</h2><br><br>"
|
||||
var/list/L = list()
|
||||
if(!isnull(data_core.general))
|
||||
for (var/datum/data/record/t in sortRecord(data_core.general))
|
||||
var/R = t.fields["name"] + " - " + t.fields["rank"]
|
||||
L += R
|
||||
for(var/R in sortList(L))
|
||||
dat += "[R]<br>"
|
||||
dat += "</body></html>"
|
||||
if(data_core)
|
||||
dat += data_core.get_manifest(0) // make it monochrome
|
||||
dat += "<br>"
|
||||
return dat
|
||||
|
||||
// Medical Records
|
||||
|
||||
@@ -9,6 +9,12 @@
|
||||
act = copytext(act,1,length(act))
|
||||
|
||||
switch(act)
|
||||
if ("me")
|
||||
return custom_emote(m_type, message)
|
||||
|
||||
if ("custom")
|
||||
return custom_emote(m_type, message)
|
||||
|
||||
if ("salute")
|
||||
if (!src.buckled)
|
||||
var/M = null
|
||||
@@ -56,20 +62,6 @@
|
||||
message = "<B>[src]</B> flaps his wings ANGRILY!"
|
||||
m_type = 2
|
||||
|
||||
if ("custom")
|
||||
var/input = copytext(sanitize(input("Choose an emote to display.") as text|null),1,MAX_MESSAGE_LEN)
|
||||
if (!input)
|
||||
return
|
||||
var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable")
|
||||
if (input2 == "Visible")
|
||||
m_type = 1
|
||||
else if (input2 == "Hearable")
|
||||
m_type = 2
|
||||
else
|
||||
alert("Unable to use this emote, must be either hearable or visible.")
|
||||
return
|
||||
message = "<B>[src]</B> [input]"
|
||||
|
||||
if ("me")
|
||||
if (src.client)
|
||||
if(client.prefs.muted & MUTE_IC)
|
||||
|
||||
@@ -123,7 +123,10 @@
|
||||
updatename(mod)
|
||||
module = new /obj/item/weapon/robot_module/standard(src)
|
||||
hands.icon_state = "standard"
|
||||
icon_state = "robot"
|
||||
var/icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Standard")
|
||||
switch(icontype)
|
||||
if("Basic") icon_state = "robot_old"
|
||||
else icon_state = "robot"
|
||||
modtype = "Stand"
|
||||
feedback_inc("cyborg_standard",1)
|
||||
|
||||
@@ -145,7 +148,11 @@
|
||||
updatename(mod)
|
||||
module = new /obj/item/weapon/robot_module/miner(src)
|
||||
hands.icon_state = "miner"
|
||||
icon_state = "Miner"
|
||||
var/icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Advanced Droid", "Treadhead")
|
||||
switch(icontype)
|
||||
if("Basic") icon_state = "Miner_old"
|
||||
if("Advanced Droid") icon_state = "droid-miner"
|
||||
else icon_state = "Miner"
|
||||
modtype = "Miner"
|
||||
feedback_inc("cyborg_miner",1)
|
||||
channels = list("Mining" = 1)
|
||||
@@ -154,7 +161,12 @@
|
||||
updatename(mod)
|
||||
module = new /obj/item/weapon/robot_module/medical(src)
|
||||
hands.icon_state = "medical"
|
||||
icon_state = "surgeon"
|
||||
var/icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Advanced Droid", "Needles", "Hoverbot")
|
||||
switch(icontype)
|
||||
if("Basic") icon_state = "Medbot"
|
||||
if("Advanced Droid") icon_state = "droid-medical"
|
||||
if("Needles") icon_state = "medicalrobot"
|
||||
else icon_state = "surgeon"
|
||||
modtype = "Med"
|
||||
status_flags &= ~CANPUSH
|
||||
feedback_inc("cyborg_medical",1)
|
||||
@@ -164,7 +176,12 @@
|
||||
updatename(mod)
|
||||
module = new /obj/item/weapon/robot_module/security(src)
|
||||
hands.icon_state = "security"
|
||||
icon_state = "bloodhound"
|
||||
var/icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Red Knight", "Black Knight", "Bloodhound")
|
||||
switch(icontype)
|
||||
if("Basic") icon_state = "secborg"
|
||||
if("Red Knight") icon_state = "Security"
|
||||
if("Black Knight") icon_state = "securityrobot"
|
||||
else icon_state = "bloodhound"
|
||||
modtype = "Sec"
|
||||
//speed = -1 Secborgs have nerfed tasers now, so the speed boost is not necessary
|
||||
status_flags &= ~CANPUSH
|
||||
@@ -175,7 +192,11 @@
|
||||
updatename(mod)
|
||||
module = new /obj/item/weapon/robot_module/engineering(src)
|
||||
hands.icon_state = "engineer"
|
||||
icon_state = "landmate"
|
||||
var/icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Antique", "Landmate")
|
||||
switch(icontype)
|
||||
if("Basic") icon_state = "Engineering"
|
||||
if("Antique") icon_state = "Engineerrobot"
|
||||
else icon_state = "landmate"
|
||||
modtype = "Eng"
|
||||
feedback_inc("cyborg_engineering",1)
|
||||
channels = list("Engineering" = 1)
|
||||
@@ -184,7 +205,11 @@
|
||||
updatename(mod)
|
||||
module = new /obj/item/weapon/robot_module/janitor(src)
|
||||
hands.icon_state = "janitor"
|
||||
icon_state = "mopgearrex"
|
||||
var/icontype = input("Select an icon!", "Robot", null, null) in list("Basic", "Mopbot", "Zamboni")
|
||||
switch(icontype)
|
||||
if("Basic") icon_state = "JanBot2"
|
||||
if("Mopbot") icon_state = "janitorrobot"
|
||||
else icon_state = "mopgearrex"
|
||||
modtype = "Jan"
|
||||
feedback_inc("cyborg_janitor",1)
|
||||
|
||||
@@ -194,7 +219,7 @@
|
||||
|
||||
/mob/living/silicon/robot/proc/updatename(var/prefix as text)
|
||||
|
||||
if(istype(mmi, /obj/item/device/posibrain))
|
||||
if(istype(mmi, /obj/item/device/mmi/posibrain))
|
||||
braintype = "Android"
|
||||
else
|
||||
braintype = "Cyborg"
|
||||
@@ -211,13 +236,14 @@
|
||||
if(custom_name)
|
||||
return 0
|
||||
|
||||
var/newname
|
||||
newname = input(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","") as text
|
||||
if (newname != "")
|
||||
custom_name = newname
|
||||
spawn(0)
|
||||
var/newname
|
||||
newname = input(src,"You are a robot. Enter a name, or leave blank for the default name.", "Name change","") as text
|
||||
if (newname != "")
|
||||
custom_name = newname
|
||||
|
||||
updatename("Default")
|
||||
updateicon()
|
||||
updatename("Default")
|
||||
updateicon()
|
||||
|
||||
/mob/living/silicon/robot/verb/cmd_robot_alerts()
|
||||
set category = "Robot Commands"
|
||||
|
||||
@@ -18,17 +18,14 @@
|
||||
return
|
||||
|
||||
if (length(message) >= 2)
|
||||
if ((copytext(message, 1, 3) == ":b") || (copytext(message, 1, 3) == ":B") || \
|
||||
(copytext(message, 1, 3) == "#b") || (copytext(message, 1, 3) == "#B") || \
|
||||
(copytext(message, 1, 3) == ".b") || (copytext(message, 1, 3) == ".B"))
|
||||
var/prefix = copytext(message, 1, 3)
|
||||
if (department_radio_keys[prefix] == "binary")
|
||||
if(istype(src, /mob/living/silicon/pai))
|
||||
return ..(message)
|
||||
message = copytext(message, 3)
|
||||
message = trim(copytext(sanitize(message), 1, MAX_MESSAGE_LEN))
|
||||
robot_talk(message)
|
||||
else if ((copytext(message, 1, 3) == ":h") || (copytext(message, 1, 3) == ":H") || \
|
||||
(copytext(message, 1, 3) == "#h") || (copytext(message, 1, 3) == "#H") || \
|
||||
(copytext(message, 1, 3) == ".h") || (copytext(message, 1, 3) == ".H"))
|
||||
else if (department_radio_keys[prefix] == "department")
|
||||
if(isAI(src)&&client)//For patching directly into AI holopads.
|
||||
var/mob/living/silicon/ai/U = src
|
||||
message = copytext(message, 3)
|
||||
|
||||
@@ -74,6 +74,9 @@
|
||||
|
||||
// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
|
||||
// return
|
||||
|
||||
if(src.stat != CONSCIOUS) return
|
||||
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/vent_found
|
||||
var/welded = 0
|
||||
for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
|
||||
/mob/living/simple_animal/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob)
|
||||
|
||||
if(istype(O, /obj/item/device/mmi) || istype(O, /obj/item/device/posibrain))
|
||||
if(istype(O, /obj/item/device/mmi) || istype(O, /obj/item/device/mmi/posibrain))
|
||||
var/obj/item/device/mmi/B = O
|
||||
if(src.mmi) //There's already a brain in it.
|
||||
user << "\red There's already a brain in [src]!"
|
||||
@@ -150,6 +150,7 @@
|
||||
|
||||
src.mind = M.brainmob.mind
|
||||
src.mind.key = M.brainmob.key
|
||||
src.ckey = M.brainmob.ckey
|
||||
src.name = "Spider-bot ([M.brainmob.name])"
|
||||
|
||||
/mob/living/simple_animal/spiderbot/proc/explode() //When emagged.
|
||||
@@ -162,12 +163,13 @@
|
||||
|
||||
/mob/living/simple_animal/spiderbot/proc/update_icon()
|
||||
if(mmi)
|
||||
if (istype(mmi,/obj/item/device/mmi))
|
||||
if(istype(mmi,/obj/item/device/mmi))
|
||||
icon_state = "spiderbot-chassis-mmi"
|
||||
icon_living = "spiderbot-chassis-mmi"
|
||||
else
|
||||
if(istype(mmi, /obj/item/device/mmi/posibrain))
|
||||
icon_state = "spiderbot-chassis-posi"
|
||||
icon_living = "spiderbot-chassis-posi"
|
||||
|
||||
else
|
||||
icon_state = "spiderbot-chassis"
|
||||
icon_living = "spiderbot-chassis"
|
||||
@@ -203,6 +205,9 @@
|
||||
if(camera)
|
||||
camera.status = 0
|
||||
|
||||
held_item.loc = src.loc
|
||||
held_item = null
|
||||
|
||||
robogibs(src.loc, viruses)
|
||||
src.Del()
|
||||
return
|
||||
@@ -281,14 +286,14 @@
|
||||
return 0
|
||||
|
||||
if(istype(held_item, /obj/item/weapon/grenade))
|
||||
visible_message("\red [src] launches the [held_item]!", "\red You launch the [held_item]!", "You hear a skittering noise and a thump!")
|
||||
visible_message("\red [src] launches \the [held_item]!", "\red You launch \the [held_item]!", "You hear a skittering noise and a thump!")
|
||||
var/obj/item/weapon/grenade/G = held_item
|
||||
G.loc = src.loc
|
||||
G.prime()
|
||||
held_item = null
|
||||
return 1
|
||||
|
||||
visible_message("\blue [src] drops the [held_item]!", "\blue You drop the [held_item]!", "You hear a skittering noise and a soft thump.")
|
||||
visible_message("\blue [src] drops \the [held_item]!", "\blue You drop \the [held_item]!", "You hear a skittering noise and a soft thump.")
|
||||
|
||||
held_item.loc = src.loc
|
||||
held_item = null
|
||||
@@ -305,7 +310,7 @@
|
||||
return -1
|
||||
|
||||
if(held_item)
|
||||
src << "\red You are already holding the [held_item]"
|
||||
src << "\red You are already holding \the [held_item]"
|
||||
return 1
|
||||
|
||||
var/list/items = list()
|
||||
@@ -316,10 +321,19 @@
|
||||
var/obj/selection = input("Select an item.", "Pickup") in items
|
||||
|
||||
if(selection)
|
||||
held_item = selection
|
||||
selection.loc = src
|
||||
visible_message("\blue [src] scoops up the [held_item]!", "\blue You grab the [held_item]!", "You hear a skittering noise and a clink.")
|
||||
return held_item
|
||||
for(var/obj/item/I in view(1, src))
|
||||
if(selection == I)
|
||||
held_item = selection
|
||||
selection.loc = src
|
||||
visible_message("\blue [src] scoops up \the [held_item]!", "\blue You grab \the [held_item]!", "You hear a skittering noise and a clink.")
|
||||
return held_item
|
||||
src << "\red \The [selection] is too far away."
|
||||
return 0
|
||||
|
||||
src << "\red There is nothing of interest to take."
|
||||
return 0
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/spiderbot/examine()
|
||||
..()
|
||||
if(src.held_item)
|
||||
usr << "It is carrying \a [src.held_item] \icon[src.held_item]."
|
||||
|
||||
@@ -224,14 +224,10 @@
|
||||
return "[emote], \"[text]\""
|
||||
return "says, \"[text]\"";
|
||||
|
||||
/mob/living/simple_animal/emote(var/act)
|
||||
/mob/living/simple_animal/emote(var/act, var/type, var/desc)
|
||||
if(act)
|
||||
if(act == "scream") act = "makes a loud and pained whimper" //ugly hack to stop animals screaming when crushed :P
|
||||
if( findtext(act,".",lentext(act)) == 0 && findtext(act,"!",lentext(act)) == 0 && findtext(act,"?",lentext(act)) == 0 )
|
||||
act = addtext(act,".") //Makes sure all emotes end with a period.
|
||||
for (var/mob/O in viewers(src, null))
|
||||
O.show_message("<B>[src]</B> [act]")
|
||||
|
||||
if(act == "scream") act = "whimper" //ugly hack to stop animals screaming when crushed :P
|
||||
..(act, type, desc)
|
||||
|
||||
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob)
|
||||
if(M.melee_damage_upper == 0)
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
|
||||
//This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to equip people when the rounds tarts and when events happen and such.
|
||||
/mob/proc/equip_to_slot_or_del(obj/item/W as obj, slot)
|
||||
equip_to_slot_if_possible(W, slot, 1, 1, 0)
|
||||
return equip_to_slot_if_possible(W, slot, 1, 1, 0)
|
||||
|
||||
//The list of slots by priority. equip_to_appropriate_slot() uses this list. Doesn't matter if a mob type doesn't have a slot.
|
||||
var/list/slot_equipment_priority = list( \
|
||||
|
||||
@@ -65,6 +65,10 @@
|
||||
Stat()
|
||||
..()
|
||||
|
||||
statpanel("Status")
|
||||
if (client.statpanel == "Status" && ticker)
|
||||
if (ticker.current_state != GAME_STATE_PREGAME)
|
||||
stat(null, "Station Time: [worldtime2text()]")
|
||||
statpanel("Lobby")
|
||||
if(client.statpanel=="Lobby" && ticker)
|
||||
if(ticker.hide_mode)
|
||||
@@ -129,7 +133,10 @@
|
||||
return
|
||||
|
||||
if(client.prefs.species != "Human")
|
||||
if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist)
|
||||
|
||||
var/S = client.prefs.species
|
||||
if(S == "Unathi") S = "Soghun"
|
||||
if(!is_alien_whitelisted(src, S) && config.usealienwhitelist)
|
||||
src << alert("You are currently not whitelisted to play [client.prefs.species].")
|
||||
return 0
|
||||
|
||||
@@ -144,7 +151,9 @@
|
||||
usr << "\blue There is an administrative lock on entering the game!"
|
||||
return
|
||||
|
||||
if(!is_alien_whitelisted(src, client.prefs.species) && config.usealienwhitelist)
|
||||
var/S = client.prefs.species
|
||||
if(S == "Unathi") S = "Soghun"
|
||||
if(!is_alien_whitelisted(src, S) && config.usealienwhitelist)
|
||||
src << alert("You are currently not whitelisted to play [client.prefs.species].")
|
||||
return 0
|
||||
|
||||
@@ -272,6 +281,8 @@
|
||||
character.loc = pick(latejoin)
|
||||
character.lastarea = get_area(loc)
|
||||
|
||||
ticker.mode.latespawn(character)
|
||||
|
||||
//ticker.mode.latespawn(character)
|
||||
|
||||
if(character.mind.assigned_role != "Cyborg")
|
||||
@@ -286,13 +297,9 @@
|
||||
proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank)
|
||||
if (ticker.current_state == GAME_STATE_PLAYING)
|
||||
var/obj/item/device/radio/intercom/a = new /obj/item/device/radio/intercom(null)// BS12 EDIT Arrivals Announcement Computer, rather than the AI.
|
||||
|
||||
//unlikely for this to be an issue, but just in case
|
||||
if(istype(character.wear_id, /obj/item/weapon/card/id))
|
||||
var/obj/item/weapon/card/id/I = character.wear_id
|
||||
a.autosay("\"[character.real_name],[I.assignment ? " [I.assignment]," : "" ] has arrived on the station.\"", "Arrivals Announcement Computer")
|
||||
else
|
||||
a.autosay("\"[character.real_name], visitor, has arrived on the station.\"", "Arrivals Announcement Computer")
|
||||
if(character.mind.role_alt_title)
|
||||
rank = character.mind.role_alt_title
|
||||
a.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] has arrived on the station.", "Arrivals Announcement Computer")
|
||||
del(a)
|
||||
|
||||
proc/LateChoices()
|
||||
@@ -331,15 +338,15 @@
|
||||
new_character.lastarea = get_area(loc)
|
||||
|
||||
if(client.prefs.species == "Tajaran") //This is like the worst, but it works, so meh. - Erthilo
|
||||
if(is_alien_whitelisted(src, "Tajaran") || !config.usealienwhitelist)
|
||||
if(is_alien_whitelisted(src, "Tajaran"|| !config.usealienwhitelist))
|
||||
new_character.dna.mutantrace = "tajaran"
|
||||
new_character.tajaran_talk_understand = 1
|
||||
if(client.prefs.species == "Unathi")
|
||||
if(is_alien_whitelisted(src, "Soghun") || !config.usealienwhitelist)
|
||||
if(is_alien_whitelisted(src, "Soghun"|| !config.usealienwhitelist))
|
||||
new_character.dna.mutantrace = "lizard"
|
||||
new_character.soghun_talk_understand = 1
|
||||
if(client.prefs.species == "Skrell")
|
||||
if(is_alien_whitelisted(src, "Skrell") || !config.usealienwhitelist)
|
||||
if(is_alien_whitelisted(src, "Skrell"|| !config.usealienwhitelist))
|
||||
new_character.dna.mutantrace = "skrell"
|
||||
new_character.skrell_talk_understand = 1
|
||||
|
||||
@@ -364,6 +371,10 @@
|
||||
new_character.dna.ready_dna(new_character)
|
||||
new_character.dna.b_type = client.prefs.b_type
|
||||
|
||||
if(client.prefs.disabilities)
|
||||
new_character.dna.struc_enzymes = setblock(new_character.dna.struc_enzymes,GLASSESBLOCK,toggledblock(getblock(new_character.dna.struc_enzymes,GLASSESBLOCK,3)),3)
|
||||
new_character.disabilities |= NEARSIGHTED
|
||||
|
||||
new_character.key = key //Manually transfer the key to log them in
|
||||
|
||||
return new_character
|
||||
@@ -373,7 +384,7 @@
|
||||
dat += "<h4>Crew Manifest</h4>"
|
||||
dat += data_core.get_manifest()
|
||||
|
||||
src << browse(dat, "window=manifest;size=300x420;can_close=1")
|
||||
src << browse(dat, "window=manifest;size=370x420;can_close=1")
|
||||
|
||||
Move()
|
||||
return 0
|
||||
|
||||
@@ -135,37 +135,34 @@ datum/preferences
|
||||
|
||||
var/g = "m"
|
||||
if(gender == FEMALE) g = "f"
|
||||
if(species == "Tajaran")
|
||||
preview_icon = new /icon('icons/effects/species.dmi', "tajaran_[g]_s")
|
||||
preview_icon.Blend(new /icon('icons/effects/species.dmi', "tajtail_s"), ICON_OVERLAY)
|
||||
else if(species == "Unathi")
|
||||
preview_icon = new /icon('icons/effects/species.dmi', "lizard_[g]_s")
|
||||
preview_icon.Blend(new /icon('icons/effects/species.dmi', "sogtail_s"), ICON_OVERLAY)
|
||||
else if(species == "Skrell")
|
||||
preview_icon = new /icon('icons/effects/species.dmi', "skrell_[g]_s")
|
||||
else
|
||||
preview_icon = new /icon('human.dmi', "torso_[g]_s")
|
||||
|
||||
preview_icon.Blend(new /icon('human.dmi', "chest_[g]_s"), ICON_OVERLAY)
|
||||
var/icon/icobase
|
||||
switch(species)
|
||||
if("Tajaran")
|
||||
icobase = 'icons/mob/human_races/r_tajaran.dmi'
|
||||
if("Unathi")
|
||||
icobase = 'icons/mob/human_races/r_lizard.dmi'
|
||||
if("Skrell")
|
||||
icobase = 'icons/mob/human_races/r_skrell.dmi'
|
||||
else
|
||||
icobase = 'icons/mob/human_races/r_human.dmi'
|
||||
preview_icon = new /icon(icobase, "torso_[g]")
|
||||
preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY)
|
||||
preview_icon.Blend(new /icon(icobase, "head_[g]"), ICON_OVERLAY)
|
||||
|
||||
if(organ_data["head"] != "amputated")
|
||||
preview_icon.Blend(new /icon('human.dmi', "head_[g]_s"), ICON_OVERLAY)
|
||||
for(var/name in list("l_arm","r_arm","l_leg","r_leg","l_foot","r_foot","l_hand","r_hand"))
|
||||
// make sure the organ is added to the list so it's drawn
|
||||
if(organ_data[name] == null)
|
||||
organ_data[name] = null
|
||||
|
||||
for(var/name in list("l_arm","r_arm","l_leg","r_leg","l_foot","r_foot","l_hand","r_hand"))
|
||||
// make sure the organ is added to the list so it's drawn
|
||||
if(organ_data[name] == null)
|
||||
organ_data[name] = null
|
||||
for(var/name in organ_data)
|
||||
if(organ_data[name] == "amputated") continue
|
||||
|
||||
for(var/name in organ_data)
|
||||
if(organ_data[name] == "amputated") continue
|
||||
var/icon/temp = new /icon(icobase, "[name]")
|
||||
if(organ_data[name] == "cyborg")
|
||||
temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
|
||||
var/icon/temp = new /icon('human.dmi', "[name]_s")
|
||||
if(organ_data[name] == "cyborg")
|
||||
temp.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
|
||||
preview_icon.Blend(temp, ICON_OVERLAY)
|
||||
|
||||
preview_icon.Blend(new /icon('human.dmi', "groin_[g]_s"), ICON_OVERLAY)
|
||||
preview_icon.Blend(temp, ICON_OVERLAY)
|
||||
|
||||
// Skin tone
|
||||
if(species == "Human")
|
||||
@@ -302,7 +299,7 @@ datum/preferences
|
||||
if(4)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
|
||||
if(LAWYER)
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "lawyer_blue_s")
|
||||
clothes_s = new /icon('icons/mob/uniform.dmi', "internalaffairs_s")
|
||||
clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY)
|
||||
clothes_s.Blend(new /icon('icons/mob/items_righthand.dmi', "briefcase"), ICON_UNDERLAY)
|
||||
|
||||
@@ -561,6 +558,9 @@ datum/preferences
|
||||
else if(backbag == 3 || backbag == 4)
|
||||
clothes_s.Blend(new /icon('icons/mob/back.dmi', "satchel"), ICON_OVERLAY)
|
||||
|
||||
if(disabilities & NEARSIGHTED)
|
||||
preview_icon.Blend(new /icon('icons/mob/eyes.dmi', "glasses"), ICON_OVERLAY)
|
||||
|
||||
preview_icon.Blend(eyes_s, ICON_OVERLAY)
|
||||
if(clothes_s)
|
||||
preview_icon.Blend(clothes_s, ICON_OVERLAY)
|
||||
|
||||
+12
-11
@@ -75,31 +75,32 @@
|
||||
//tcomms code is still runtiming somewhere here
|
||||
var/ending = copytext(text, length(text))
|
||||
if (is_speaking_soghun)
|
||||
return "hisses, \"<span class='soghun'>[text]</span>\"";
|
||||
return "<span class='say_quote'>hisses</span>, \"<span class='soghun'>[text]</span>\"";
|
||||
if (is_speaking_skrell)
|
||||
return "warbles, \"<span class='skrell'>[text]</span>\"";
|
||||
return "<span class='say_quote'>warbles</span>, \"<span class='skrell'>[text]</span>\"";
|
||||
if (is_speaking_tajaran)
|
||||
return "mrowls, \"<span class='tajaran'>[text]</span>\"";
|
||||
return "<span class='say_quote'>mrowls</span>, \"<span class='tajaran'>[text]</span>\"";
|
||||
//Needs Virus2
|
||||
// if (src.disease_symptoms & DISEASE_HOARSE)
|
||||
// return "rasps, \"[text]\"";
|
||||
if (src.stuttering)
|
||||
return "stammers, \"[text]\"";
|
||||
return "<span class='say_quote'>stammers</span>, \"[text]\"";
|
||||
if (src.slurring)
|
||||
return "slurrs, \"[text]\"";
|
||||
return "<span class='say_quote'>slurrs</span>, \"[text]\"";
|
||||
if(isliving(src))
|
||||
var/mob/living/L = src
|
||||
if (L.getBrainLoss() >= 60)
|
||||
return "gibbers, \"[text]\"";
|
||||
return "<span class='say_quote'>gibbers</span>, \"[text]\"";
|
||||
if (ending == "?")
|
||||
return "asks, \"[text]\"";
|
||||
return "<span class='say_quote'>asks</span>, \"[text]\"";
|
||||
if (ending == "!")
|
||||
return "exclaims, \"[text]\"";
|
||||
return "<span class='say_quote'>exclaims</span>, \"[text]\"";
|
||||
|
||||
return "says, \"[text]\"";
|
||||
return "<span class='say_quote'>says</span>, \"[text]\"";
|
||||
|
||||
/mob/proc/emote(var/act)
|
||||
return
|
||||
/mob/proc/emote(var/act, var/type, var/message)
|
||||
if(act == "me")
|
||||
return custom_emote(type, message)
|
||||
|
||||
/mob/proc/get_ear()
|
||||
// returns an atom representing a location on the map from which this
|
||||
|
||||
@@ -25,7 +25,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
for(var/datum/reagent/blood/B in vessel.reagent_list)
|
||||
if(B.id == "blood")
|
||||
B.data = list( "donor"=src,"viruses"=null,"blood_DNA"=dna.unique_enzymes,"blood_type"=dna.b_type, \
|
||||
"resistances"=null,"trace_chem"=null, "virus2" = null, "antobodies" = null)
|
||||
"resistances"=null,"trace_chem"=null, "virus2" = null, "antibodies" = null)
|
||||
|
||||
// Takes care blood loss and regeneration
|
||||
/mob/living/carbon/human/proc/handle_blood()
|
||||
@@ -165,7 +165,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
B.data["donor"] = src
|
||||
if(src.virus2)
|
||||
B.data["virus2"] = src.virus2.getcopy()
|
||||
B.data["antibodies"] |= src.antibodies
|
||||
B.data["antibodies"] = src.antibodies
|
||||
B.data["blood_DNA"] = copytext(src.dna.unique_enzymes,1,0)
|
||||
if(src.resistances && src.resistances.len)
|
||||
if(B.data["resistances"])
|
||||
@@ -176,8 +176,8 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
|
||||
var/list/temp_chem = list()
|
||||
for(var/datum/reagent/R in src.reagents.reagent_list)
|
||||
temp_chem += R.name
|
||||
temp_chem[R.name] = R.volume
|
||||
temp_chem += R.id
|
||||
temp_chem[R.id] = R.volume
|
||||
B.data["trace_chem"] = list2params(temp_chem)
|
||||
return B
|
||||
|
||||
@@ -192,14 +192,22 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
||||
/mob/living/carbon/human/proc/inject_blood(obj/item/weapon/reagent_containers/container, var/amount)
|
||||
var/datum/reagent/blood/our = get_blood(vessel)
|
||||
var/datum/reagent/blood/injected = get_blood(container.reagents)
|
||||
|
||||
if (!injected)
|
||||
return
|
||||
if(blood_incompatible(injected.data["blood_type"],our.data["blood_type"]) )
|
||||
reagents.add_reagent("toxin",amount * 0.5)
|
||||
reagents.update_total()
|
||||
else
|
||||
vessel.add_reagent("blood", amount)
|
||||
vessel.add_reagent("blood", amount, injected.data)
|
||||
vessel.update_total()
|
||||
|
||||
var/list/chems = list()
|
||||
chems = params2list(injected.data["trace_chem"])
|
||||
for(var/C in chems)
|
||||
src.reagents.add_reagent(C, (text2num(chems[C]) / 560) * amount)//adds trace chemicals to owner's blood
|
||||
//world << "added [(text2num(chems[C])/560) * amount] = [text2num(chems[C])]/560*[amount] units of [C] to [src]" //DEBUG
|
||||
reagents.update_total()
|
||||
|
||||
container.reagents.remove_reagent("blood", amount)
|
||||
|
||||
//Gets human's own blood.
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
proc/receive_chem(chemical as obj)
|
||||
return 0
|
||||
|
||||
/datum/organ/proc/get_icon()
|
||||
return icon('icons/mob/human.dmi',"blank")
|
||||
|
||||
//Handles chem traces
|
||||
/mob/living/carbon/human/proc/handle_trace_chems()
|
||||
//New are added for reagents to random organs.
|
||||
|
||||
@@ -555,6 +555,14 @@
|
||||
if(T)
|
||||
T.robotize()
|
||||
|
||||
/datum/organ/external/proc/mutate()
|
||||
src.status |= ORGAN_MUTATED
|
||||
owner.update_body()
|
||||
|
||||
/datum/organ/external/proc/unmutate()
|
||||
src.status &= ~ORGAN_MUTATED
|
||||
owner.update_body()
|
||||
|
||||
/datum/organ/external/proc/get_damage() //returns total damage
|
||||
return max(brute_dam + burn_dam - perma_injury, perma_injury) //could use health?
|
||||
|
||||
@@ -564,21 +572,32 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/organ/external/get_icon(gender="")
|
||||
if (status & ORGAN_MUTATED)
|
||||
return new /icon(owner.deform_icon, "[icon_name][gender ? "_[gender]" : ""]")
|
||||
else
|
||||
return new /icon(owner.race_icon, "[icon_name][gender ? "_[gender]" : ""]")
|
||||
|
||||
|
||||
/datum/organ/external/proc/is_usable()
|
||||
return !(status & (ORGAN_DESTROYED|ORGAN_MUTATED|ORGAN_DEAD))
|
||||
|
||||
/****************************************************
|
||||
ORGAN DEFINES
|
||||
****************************************************/
|
||||
|
||||
/datum/organ/external/chest
|
||||
name = "chest"
|
||||
icon_name = "chest"
|
||||
icon_name = "torso"
|
||||
display_name = "chest"
|
||||
max_damage = 150
|
||||
min_broken_damage = 75
|
||||
body_part = UPPER_TORSO
|
||||
|
||||
|
||||
/datum/organ/external/groin
|
||||
name = "groin"
|
||||
icon_name = "diaper"
|
||||
icon_name = "groin"
|
||||
display_name = "groin"
|
||||
max_damage = 115
|
||||
min_broken_damage = 70
|
||||
@@ -661,27 +680,37 @@
|
||||
body_part = HEAD
|
||||
var/disfigured = 0
|
||||
|
||||
take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list())
|
||||
..(brute, burn, sharp, used_weapon, forbidden_limbs)
|
||||
if (!disfigured)
|
||||
if (brute_dam > 40)
|
||||
if (prob(50))
|
||||
disfigure("brute")
|
||||
if (burn_dam > 40)
|
||||
disfigure("burn")
|
||||
/datum/organ/external/head/get_icon()
|
||||
if (!owner)
|
||||
return ..()
|
||||
var/g = "m"
|
||||
if(owner.gender == FEMALE) g = "f"
|
||||
if (status & ORGAN_MUTATED)
|
||||
. = new /icon(owner.deform_icon, "[icon_name]_[g]")
|
||||
else
|
||||
. = new /icon(owner.race_icon, "[icon_name]_[g]")
|
||||
|
||||
proc/disfigure(var/type = "brute")
|
||||
if (disfigured)
|
||||
return
|
||||
if(type == "brute")
|
||||
owner.visible_message("\red You hear a sickening cracking sound coming from \the [owner]'s face.", \
|
||||
"\red <b>Your face becomes unrecognizible mangled mess!</b>", \
|
||||
"\red You hear a sickening crack.")
|
||||
else
|
||||
owner.visible_message("\red [owner]'s face melts away, turning into mangled mess!", \
|
||||
"\red <b>Your face melts off!</b>", \
|
||||
"\red You hear a sickening sizzle.")
|
||||
disfigured = 1
|
||||
/datum/organ/external/head/take_damage(brute, burn, sharp, used_weapon = null, list/forbidden_limbs = list())
|
||||
..(brute, burn, sharp, used_weapon, forbidden_limbs)
|
||||
if (!disfigured)
|
||||
if (brute_dam > 40)
|
||||
if (prob(50))
|
||||
disfigure("brute")
|
||||
if (burn_dam > 40)
|
||||
disfigure("burn")
|
||||
|
||||
/datum/organ/external/head/proc/disfigure(var/type = "brute")
|
||||
if (disfigured)
|
||||
return
|
||||
if(type == "brute")
|
||||
owner.visible_message("\red You hear a sickening cracking sound coming from \the [owner]'s face.", \
|
||||
"\red <b>Your face becomes unrecognizible mangled mess!</b>", \
|
||||
"\red You hear a sickening crack.")
|
||||
else
|
||||
owner.visible_message("\red [owner]'s face melts away, turning into mangled mess!", \
|
||||
"\red <b>Your face melts off!</b>", \
|
||||
"\red You hear a sickening sizzle.")
|
||||
disfigured = 1
|
||||
|
||||
/****************************************************
|
||||
EXTERNAL ORGAN ITEMS
|
||||
|
||||
@@ -56,7 +56,12 @@ mob/living/carbon/human/proc/custom_pain(var/message, var/flash_strength)
|
||||
var/msg = "\red <b>[message]</b>"
|
||||
if(flash_strength >= 1)
|
||||
msg = "\red <font size=3><b>[message]</b></font>"
|
||||
src << msg
|
||||
|
||||
// Anti message spam checks
|
||||
if(msg && ((msg != last_pain_message) || (world.time >= next_pain_time)))
|
||||
last_pain_message = msg
|
||||
src << msg
|
||||
next_pain_time = world.time + 100
|
||||
|
||||
mob/living/carbon/human/proc/handle_pain()
|
||||
// not when sleeping
|
||||
@@ -101,7 +106,10 @@ mob/living/carbon/human/proc/handle_pain()
|
||||
if(11 to 15)
|
||||
toxMessageProb = 2
|
||||
toxDamageMessage = "Your whole body hurts."
|
||||
if(91 to 10000)
|
||||
if(15 to 25)
|
||||
toxMessageProb = 3
|
||||
toxDamageMessage = "Your whole body hurts badly."
|
||||
if(26 to INFINITY)
|
||||
toxMessageProb = 5
|
||||
toxDamageMessage = "Your body aches all over, it's driving you mad."
|
||||
|
||||
|
||||
@@ -236,7 +236,8 @@
|
||||
if(href_list["write"])
|
||||
var/id = href_list["write"]
|
||||
//var/t = strip_html_simple(input(usr, "What text do you wish to add to " + (id=="end" ? "the end of the paper" : "field "+id) + "?", "[name]", null),8192) as message
|
||||
var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, MAX_MESSAGE_LEN)
|
||||
//var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, MAX_MESSAGE_LEN)
|
||||
var/t = input("Enter what you want to write:", "Write", null, null) as message
|
||||
var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen.
|
||||
var/iscrayon = 0
|
||||
if(!istype(i, /obj/item/weapon/pen))
|
||||
@@ -248,6 +249,17 @@
|
||||
if((!in_range(src, usr) && loc != usr && !( istype(loc, /obj/item/weapon/clipboard) ) && loc.loc != usr && usr.get_active_hand() != i)) // Some check to see if he's allowed to write
|
||||
return
|
||||
|
||||
t = checkhtml(t)
|
||||
|
||||
// check for exploits
|
||||
for(var/bad in paper_blacklist)
|
||||
if(findtext(t,bad))
|
||||
usr << "\blue You think to yourself, \"Hm.. this is only paper...\""
|
||||
log_admin("PAPER: [usr] ([usr.ckey]) tried to use forbidden word in [src]: [bad].")
|
||||
message_admins("PAPER: [usr] ([usr.ckey]) tried to use forbidden word in [src]: [bad].")
|
||||
return
|
||||
|
||||
t = replacetext(t, "\n", "<BR>")
|
||||
t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html
|
||||
|
||||
if(id!="end")
|
||||
|
||||
@@ -122,6 +122,8 @@
|
||||
var/pictures_max = 10
|
||||
var/pictures_left = 10
|
||||
var/on = 1
|
||||
var/icon_on = "camera"
|
||||
var/icon_off = "camera_off"
|
||||
|
||||
|
||||
/obj/item/device/camera/attack(mob/living/carbon/human/M as mob, mob/user as mob)
|
||||
@@ -130,9 +132,9 @@
|
||||
/obj/item/device/camera/attack_self(mob/user as mob)
|
||||
on = !on
|
||||
if(on)
|
||||
src.icon_state = "camera"
|
||||
src.icon_state = icon_on
|
||||
else
|
||||
src.icon_state = "camera_off"
|
||||
src.icon_state = icon_off
|
||||
user << "You switch the camera [on ? "on" : "off"]."
|
||||
return
|
||||
|
||||
@@ -253,8 +255,8 @@
|
||||
pictures_left--
|
||||
desc = "A polaroid camera. It has [pictures_left] photos left."
|
||||
user << "<span class='notice'>[pictures_left] photos left.</span>"
|
||||
icon_state = "camera_off"
|
||||
icon_state = icon_off
|
||||
on = 0
|
||||
spawn(64)
|
||||
icon_state = "camera"
|
||||
icon_state = icon_on
|
||||
on = 1
|
||||
@@ -187,10 +187,7 @@
|
||||
else
|
||||
icon_state = basestate
|
||||
else if (opened == 2)
|
||||
if ((stat & BROKEN) || malfhack )
|
||||
icon_state = "[basestate]-b-nocover"
|
||||
else /* if (emagged)*/
|
||||
icon_state = "[basestate]-nocover"
|
||||
icon_state = "[basestate]-nocover"
|
||||
else if (stat & BROKEN)
|
||||
icon_state = "apc-b"
|
||||
else if(emagged || malfai)
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
|
||||
//updated by cael_aislinn on 5/3/2013 to be rotateable, moveable and generally more flexible
|
||||
/obj/machinery/power/generator
|
||||
name = "thermoelectric generator"
|
||||
desc = "It's a high efficiency thermoelectric generator."
|
||||
icon_state = "teg"
|
||||
density = 1
|
||||
use_power = 0
|
||||
anchored = 0
|
||||
idle_power_usage = 50
|
||||
active_power_usage = 1000
|
||||
|
||||
use_power = 1
|
||||
idle_power_usage = 100 //Watts, I hope. Just enough to do the computer and display things.
|
||||
|
||||
var/obj/machinery/atmospherics/binary/circulator/circ1
|
||||
var/obj/machinery/atmospherics/binary/circulator/circ2
|
||||
@@ -57,43 +56,26 @@
|
||||
if(lastgenlev != 0)
|
||||
overlays += image('icons/obj/power.dmi', "teg-op[lastgenlev]")
|
||||
|
||||
#define GENRATE 800 // generator output coefficient from Q
|
||||
|
||||
/obj/machinery/power/generator/process()
|
||||
|
||||
//world << "Generator process ran"
|
||||
|
||||
if(!circ1 || !circ2 || !anchored || stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
//world << "circ1 and circ2 pass"
|
||||
updateDialog()
|
||||
|
||||
var/datum/gas_mixture/air1 = circ1.return_transfer_air()
|
||||
var/datum/gas_mixture/air2 = circ2.return_transfer_air()
|
||||
|
||||
lastgen = 0
|
||||
|
||||
//world << "hot_air = [hot_air]; cold_air = [cold_air];"
|
||||
|
||||
if(air1 && air2)
|
||||
|
||||
//world << "hot_air = [hot_air] temperature = [air2.temperature]; cold_air = [cold_air] temperature = [air2.temperature];"
|
||||
|
||||
//world << "coldair and hotair pass"
|
||||
var/air1_heat_capacity = air1.heat_capacity()
|
||||
var/air2_heat_capacity = air2.heat_capacity()
|
||||
var/delta_temperature = abs(air2.temperature - air1.temperature)
|
||||
|
||||
//world << "delta_temperature = [delta_temperature]; air1_heat_capacity = [air1_heat_capacity]; air2_heat_capacity = [air2_heat_capacity]"
|
||||
|
||||
if(delta_temperature > 0 && air1_heat_capacity > 0 && air2_heat_capacity > 0)
|
||||
use_power = 2
|
||||
var/efficiency = 0.65
|
||||
var/energy_transfer = delta_temperature*air2_heat_capacity*air1_heat_capacity/(air2_heat_capacity+air1_heat_capacity)
|
||||
var/heat = energy_transfer*(1-efficiency)
|
||||
lastgen = energy_transfer*efficiency
|
||||
|
||||
//world << "lastgen = [lastgen]; heat = [heat]; delta_temperature = [delta_temperature]; air2_heat_capacity = [air2_heat_capacity]; air1_heat_capacity = [air1_heat_capacity];"
|
||||
lastgen = energy_transfer*efficiency*0.05
|
||||
|
||||
if(air2.temperature > air1.temperature)
|
||||
air2.temperature = air2.temperature - energy_transfer/air2_heat_capacity
|
||||
@@ -102,28 +84,29 @@
|
||||
air2.temperature = air2.temperature + heat/air2_heat_capacity
|
||||
air1.temperature = air1.temperature - energy_transfer/air1_heat_capacity
|
||||
|
||||
//world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [air1_heat_capacity], [air2_heat_capacity]"
|
||||
//Transfer the air
|
||||
circ1.air2.merge(air1)
|
||||
circ2.air2.merge(air2)
|
||||
|
||||
add_avail(lastgen)
|
||||
|
||||
if(air1)
|
||||
circ1.air2.merge(air1)
|
||||
|
||||
if(air2)
|
||||
circ2.air2.merge(air2)
|
||||
//Update the gas networks
|
||||
if(circ1.network2)
|
||||
circ1.network2.update = 1
|
||||
if(circ2.network2)
|
||||
circ2.network2.update = 1
|
||||
|
||||
// update icon overlays and power usage only if displayed level has changed
|
||||
var/genlev = max(0, min( round(11*lastgen / 100000), 11))
|
||||
if(lastgen > 250000 && prob(10))
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
lastgen *= 0.5
|
||||
var/genlev = max(0, min( round(11*lastgen / 250000), 11))
|
||||
if(lastgen > 100 && genlev == 0)
|
||||
genlev = 1
|
||||
if(genlev != lastgenlev)
|
||||
lastgenlev = genlev
|
||||
active_power_usage = lastgenlev * 1000
|
||||
if(lastgenlev > 0)
|
||||
use_power = 2
|
||||
else
|
||||
use_power = 1
|
||||
updateicon()
|
||||
|
||||
src.updateDialog()
|
||||
add_avail(lastgen)
|
||||
|
||||
/obj/machinery/power/generator/attack_ai(mob/user)
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
@@ -157,17 +140,18 @@
|
||||
if(circ1 && circ2)
|
||||
t += "Output : [round(lastgen)] W<BR><BR>"
|
||||
|
||||
t += "<B>Primary Circulator (top/right)</B><BR>"
|
||||
t += "<B>Primary Circulator (top or right)</B><BR>"
|
||||
t += "Inlet Pressure: [round(circ1.air1.return_pressure(), 0.1)] kPa<BR>"
|
||||
t += "Inlet Temperature: [round(circ1.air1.temperature, 0.1)] K<BR>"
|
||||
t += "Outlet Pressure: [round(circ1.air2.return_pressure(), 0.1)] kPa<BR>"
|
||||
t += "Outlet Temperature: [round(circ1.air2.temperature, 0.1)] K<BR>"
|
||||
|
||||
t += "<B>Secondary Circulator (bottom/left)</B><BR>"
|
||||
t += "<B>Secondary Circulator (bottom or left)</B><BR>"
|
||||
t += "Inlet Pressure: [round(circ2.air1.return_pressure(), 0.1)] kPa<BR>"
|
||||
t += "Inlet Temperature: [round(circ2.air1.temperature, 0.1)] K<BR>"
|
||||
t += "Outlet Pressure: [round(circ2.air2.return_pressure(), 0.1)] kPa<BR>"
|
||||
t += "Outlet Temperature: [round(circ2.air2.temperature, 0.1)] K<BR>"
|
||||
|
||||
else
|
||||
t += "Unable to connect to circulators.<br>"
|
||||
t += "Ensure both are in position and wrenched into place."
|
||||
@@ -187,6 +171,7 @@
|
||||
usr << browse(null, "window=teg")
|
||||
usr.unset_machine()
|
||||
return 0
|
||||
|
||||
updateDialog()
|
||||
return 1
|
||||
|
||||
@@ -196,12 +181,22 @@
|
||||
updateicon()
|
||||
|
||||
|
||||
/obj/machinery/power/generator/verb/rotate()
|
||||
/obj/machinery/power/generator/verb/rotate_clock()
|
||||
set category = "Object"
|
||||
set name = "Rotate Generator"
|
||||
set name = "Rotate Generator (Clockwise)"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.dir = turn(src.dir, 90)
|
||||
|
||||
/obj/machinery/power/generator/verb/rotate_anticlock()
|
||||
set category = "Object"
|
||||
set name = "Rotate Generator (Counterclockwise)"
|
||||
set src in view(1)
|
||||
|
||||
if (usr.stat || usr.restrained() || anchored)
|
||||
return
|
||||
|
||||
src.dir = turn(src.dir, -90)
|
||||
@@ -502,13 +502,7 @@
|
||||
if(prot > 0 || (COLD_RESISTANCE in user.mutations))
|
||||
user << "You remove the light [fitting]"
|
||||
else
|
||||
user << "You try to remove the light [fitting], but you burn your hand on it!"
|
||||
|
||||
var/datum/organ/external/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm")
|
||||
|
||||
if(affecting.take_damage( 0, 5 )) // 5 burn damage
|
||||
H.UpdateDamageIcon()
|
||||
H.updatehealth()
|
||||
user << "You try to remove the light [fitting], but it's too hot and you don't want to burn your hand."
|
||||
return // if burned, don't remove the light
|
||||
|
||||
// create a light tube/bulb item and put it in the user's hand
|
||||
|
||||
+31
-17
@@ -277,10 +277,10 @@ var/list/solars_list = list()
|
||||
var/cdir = 0
|
||||
var/gen = 0
|
||||
var/lastgen = 0
|
||||
var/track = 0 // 0= off 1=timed 2=auto (tracker)
|
||||
var/trackrate = 600 // 300-900 seconds
|
||||
var/trackdir = 1 // 0 =CCW, 1=CW
|
||||
var/nexttime = 0
|
||||
var/track = 0 // 0=off 1=manual 2=automatic
|
||||
var/trackrate = 60 // Measured in tenths of degree per minute (i.e. defaults to 6.0 deg/min)
|
||||
var/trackdir = 1 // -1=CCW, 1=CW
|
||||
var/nexttime = 0 // Next clock time that manual tracking will move the array
|
||||
|
||||
|
||||
/obj/machinery/power/solar_control/New()
|
||||
@@ -371,9 +371,11 @@ var/list/solars_list = list()
|
||||
return
|
||||
|
||||
use_power(250)
|
||||
if(track==1 && nexttime < world.timeofday && trackrate)
|
||||
nexttime = world.timeofday + 3600/abs(trackrate)
|
||||
cdir = (cdir+trackrate/abs(trackrate)+360)%360
|
||||
if(track==1 && nexttime < world.time && trackdir*trackrate)
|
||||
// Increments nexttime using itself and not world.time to prevent drift
|
||||
nexttime = nexttime + 6000/trackrate
|
||||
// Nudges array 1 degree in desired direction
|
||||
cdir = (cdir+trackdir+360)%360
|
||||
set_panels(cdir)
|
||||
update_icon()
|
||||
|
||||
@@ -402,19 +404,28 @@ var/list/solars_list = list()
|
||||
user.set_machine(src)
|
||||
|
||||
var/t = "<TT><B>Solar Generator Control</B><HR><PRE>"
|
||||
t += "Generated power : [round(lastgen)] W<BR><BR>"
|
||||
t += "<B>Orientation</B>: [rate_control(src,"cdir","[cdir]°",1,15)] ([angle2text(cdir)])<BR><BR><BR>"
|
||||
t += "<BR><HR><BR><BR>"
|
||||
t += "<B>Generated power</B> : [round(lastgen)] W<BR>"
|
||||
t += "Station Rotational Period: [60/abs(sun.rate)] minutes<BR>"
|
||||
t += "Station Rotational Direction: [sun.rate<0 ? "CCW" : "CW"]<BR>"
|
||||
t += "Star Orientation: [sun.angle]° ([angle2text(sun.angle)])<BR>"
|
||||
t += "Array Orientation: [rate_control(src,"cdir","[cdir]°",1,10,60)] ([angle2text(cdir)])<BR>"
|
||||
t += "<BR><HR><BR>"
|
||||
t += "Tracking: "
|
||||
switch(track)
|
||||
if(0)
|
||||
t += "<B>Off</B> <A href='?src=\ref[src];track=1'>Timed</A> <A href='?src=\ref[src];track=2'>Auto</A><BR>"
|
||||
t += "<B>Off</B> <A href='?src=\ref[src];track=1'>Manual</A> <A href='?src=\ref[src];track=2'>Automatic</A><BR>"
|
||||
if(1)
|
||||
t += "<A href='?src=\ref[src];track=0'>Off</A> <B>Timed</B> <A href='?src=\ref[src];track=2'>Auto</A><BR>"
|
||||
t += "<A href='?src=\ref[src];track=0'>Off</A> <B>Manual</B> <A href='?src=\ref[src];track=2'>Automatic</A><BR>"
|
||||
if(2)
|
||||
t += "<A href='?src=\ref[src];track=0'>Off</A> <A href='?src=\ref[src];track=1'>Timed</A> <B>Auto</B><BR>"
|
||||
t += "<A href='?src=\ref[src];track=0'>Off</A> <A href='?src=\ref[src];track=1'>Manual</A> <B>Automatic</B><BR>"
|
||||
|
||||
t += "Tracking Rate: [rate_control(src,"tdir","[trackrate] deg/h ([trackrate<0 ? "CCW" : "CW"])",5,30,180)]<BR><BR>"
|
||||
t += "Manual Tracking Rate: [rate_control(src,"tdir","[trackrate/10]°/min ([trackdir<0 ? "CCW" : "CW"])",1,10)]<BR>"
|
||||
t += "Manual Tracking Direction: "
|
||||
switch(trackdir)
|
||||
if(-1)
|
||||
t += "<A href='?src=\ref[src];trackdir=1'>CW</A> <B>CCW</B><BR>"
|
||||
if(1)
|
||||
t += "<B>CW</B> <A href='?src=\ref[src];trackdir=-1'>CCW</A><BR>"
|
||||
t += "<A href='?src=\ref[src];close=1'>Close</A></TT>"
|
||||
user << browse(t, "window=solcon")
|
||||
onclose(user, "solcon")
|
||||
@@ -443,11 +454,11 @@ var/list/solars_list = list()
|
||||
set_panels(cdir)
|
||||
update_icon()
|
||||
if(href_list["tdir"])
|
||||
src.trackrate = dd_range(-7200,7200,src.trackrate+text2num(href_list["tdir"]))
|
||||
if(src.trackrate) nexttime = world.timeofday + 3600/abs(trackrate)
|
||||
src.trackrate = dd_range(0,360,src.trackrate+text2num(href_list["tdir"]))
|
||||
if(src.trackrate) nexttime = world.time + 6000/trackrate
|
||||
|
||||
if(href_list["track"])
|
||||
if(src.trackrate) nexttime = world.timeofday + 3600/abs(trackrate)
|
||||
if(src.trackrate) nexttime = world.time + 6000/trackrate
|
||||
track = text2num(href_list["track"])
|
||||
if(powernet && (track == 2))
|
||||
for(var/obj/machinery/power/tracker/T in get_solars_powernet())
|
||||
@@ -455,6 +466,9 @@ var/list/solars_list = list()
|
||||
cdir = T.sun_angle
|
||||
break
|
||||
|
||||
if(href_list["trackdir"])
|
||||
trackdir = text2num(href_list["trackdir"])
|
||||
|
||||
set_panels(cdir)
|
||||
update_icon()
|
||||
src.updateUsrDialog()
|
||||
|
||||
@@ -143,6 +143,12 @@
|
||||
else
|
||||
user.update_inv_r_hand()
|
||||
|
||||
/obj/item/weapon/gun/proc/can_fire()
|
||||
return load_into_chamber()
|
||||
|
||||
/obj/item/weapon/gun/proc/can_hit(var/mob/living/target as mob, var/mob/living/user as mob)
|
||||
return in_chamber.check_fire(target,user)
|
||||
|
||||
/obj/item/weapon/gun/proc/click_empty(mob/user = null)
|
||||
if (user)
|
||||
user.visible_message("*click click*", "\red <b>*click*</b>")
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
loaded -= AC
|
||||
AM.loc = get_turf(src)
|
||||
empty_mag = null
|
||||
update_icon()
|
||||
user << "\blue You unload magazine from \the [src]!"
|
||||
else
|
||||
user << "\red Nothing loaded in \the [src]!"
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
icon_state = "mini-uzi"
|
||||
w_class = 3.0
|
||||
max_shells = 16
|
||||
caliber = " .45"
|
||||
caliber = ".45"
|
||||
origin_tech = "combat=5;materials=2;syndicate=8"
|
||||
ammo_type = "/obj/item/ammo_casing/c45"
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
icon_state = "cshotgun"
|
||||
max_shells = 8
|
||||
origin_tech = "combat=5;materials=2"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun/beanbag"
|
||||
ammo_type = "/obj/item/ammo_casing/shotgun"
|
||||
|
||||
//this is largely hacky and bad :( -Pete
|
||||
/obj/item/weapon/gun/projectile/shotgun/doublebarrel
|
||||
|
||||
@@ -9,10 +9,15 @@
|
||||
/obj/item/projectile/energy/electrode
|
||||
name = "electrode"
|
||||
icon_state = "spark"
|
||||
nodamage = 1
|
||||
/* - Old taser bit
|
||||
nodamage = 0
|
||||
stun = 10
|
||||
weaken = 10
|
||||
stutter = 10
|
||||
*/
|
||||
damage = 40
|
||||
damage_type = HALLOSS
|
||||
|
||||
|
||||
|
||||
/obj/item/projectile/energy/declone
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user