mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-21 03:55:05 +01:00
Merge branch 'master' of https://github.com/Baystation12/Baystation12
Conflicts: code/game/objects/structures/crates_lockers/closets/secure/security.dm code/modules/clothing/under/miscellaneous.dm icons/mob/uniform.dmi icons/obj/clothing/uniforms.dmi icons/obj/custom_items.dmi maps/tgstation.2.1.0.0.1.dmm
This commit is contained in:
@@ -133,7 +133,8 @@ 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
|
||||
)
|
||||
var/list/admin_verbs_possess = list(
|
||||
/proc/possess,
|
||||
@@ -720,4 +721,4 @@ 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"
|
||||
|
||||
@@ -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.")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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'
|
||||
)
|
||||
@@ -252,6 +252,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
|
||||
@@ -1008,6 +1009,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,6 +119,7 @@
|
||||
S["eyes_blue"] >> b_eyes
|
||||
S["underwear"] >> underwear
|
||||
S["backbag"] >> backbag
|
||||
S["b_type"] >> b_type
|
||||
|
||||
//Jobs
|
||||
S["userandomjob"] >> userandomjob
|
||||
@@ -170,6 +171,7 @@
|
||||
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))
|
||||
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
|
||||
@@ -218,6 +220,7 @@
|
||||
S["eyes_blue"] << b_eyes
|
||||
S["underwear"] << underwear
|
||||
S["backbag"] << backbag
|
||||
S["b_type"] << b_type
|
||||
|
||||
//Jobs
|
||||
S["userandomjob"] << userandomjob
|
||||
@@ -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"
|
||||
@@ -129,6 +132,7 @@
|
||||
vision_flags = BLIND
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/prescription
|
||||
name = "prescription sunglasses"
|
||||
prescription = 1
|
||||
|
||||
/obj/item/clothing/glasses/sunglasses/big
|
||||
|
||||
@@ -21,10 +21,13 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
|
||||
/obj/item/clothing/suit/captunic/trek
|
||||
/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
|
||||
|
||||
@@ -295,9 +295,9 @@
|
||||
icon_state = "dress_hop"
|
||||
color = "dress_hop"
|
||||
|
||||
/obj/item/clothing/under/dress/dress_resource
|
||||
/obj/item/clothing/under/dress/dress_hr
|
||||
name = "human resources director uniform"
|
||||
desc = "Stylish class for the nosy H.R. director."
|
||||
desc = "Superior class for the nosy H.R. Director."
|
||||
icon_state = "huresource"
|
||||
color = "huresource"
|
||||
|
||||
|
||||
@@ -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."
|
||||
@@ -263,14 +271,6 @@ hi
|
||||
body_parts_covered = null
|
||||
flags = FPRINT|TABLEPASS
|
||||
|
||||
/obj/item/weapon/lighter/fluff //Dragor23: Michael Guess
|
||||
name = "engraved lighter"
|
||||
desc = "A golden lighter, engraved with some ornaments and a G.."
|
||||
icon_state = "guessip"
|
||||
item_state = "guessip"
|
||||
icon_on = "guessipon"
|
||||
icon_off = "guessip"
|
||||
|
||||
//Strange penlight, Nerezza: Asher Spock
|
||||
|
||||
/obj/item/weapon/reagent_containers/hypospray/fluff/asher_spock_1
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
var/sender
|
||||
var/message
|
||||
switch(pick(1,2,3,4,5))
|
||||
switch(pick(1,2,3,4,5,6))
|
||||
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.",\
|
||||
@@ -73,6 +73,12 @@
|
||||
"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!")
|
||||
|
||||
useMS.send_pda_message("[P.owner]", sender, message)
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ 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"
|
||||
)
|
||||
spawn(0)
|
||||
for(var/i = rand(1,4),i > 0, i--)
|
||||
|
||||
@@ -344,14 +344,13 @@ commented out in r5061, I left it because of the shroom thingies
|
||||
|
||||
user << "\red You start [P.drill_verb][fail_message ? fail_message : ""]."
|
||||
|
||||
if(fail_message)
|
||||
if(prob(50))
|
||||
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(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."
|
||||
@@ -425,8 +424,6 @@ commented out in r5061, I left it because of the shroom thingies
|
||||
//extract pesky minerals while we're excavating
|
||||
while(excavation_minerals.len && src.excavation_level > excavation_minerals[excavation_minerals.len])
|
||||
drop_mineral()
|
||||
//have a 50% chance to extract bonus minerals this way
|
||||
//if(prob(50))
|
||||
pop(excavation_minerals)
|
||||
mineralAmt--
|
||||
|
||||
@@ -456,13 +453,6 @@ commented out in r5061, I left it because of the shroom thingies
|
||||
O = new /obj/item/weapon/ore/plasma(src)
|
||||
if (src.mineralName == "Diamond")
|
||||
O = new /obj/item/weapon/ore/diamond(src)
|
||||
/*if (src.mineralName == "Archaeo")
|
||||
//new /obj/item/weapon/archaeological_find(src)
|
||||
//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
|
||||
O = new /obj/item/weapon/ore/strangerock(src)
|
||||
else
|
||||
destroyed = 1*/
|
||||
if (src.mineralName == "Clown")
|
||||
O = new /obj/item/weapon/ore/clown(src)
|
||||
if(O)
|
||||
@@ -496,14 +486,9 @@ commented out in r5061, I left it because of the shroom thingies
|
||||
M.Stun(5)
|
||||
M.apply_effect(25, IRRADIATE)
|
||||
|
||||
/*if (prob(src.artifactChance))
|
||||
//spawn a rare artifact here
|
||||
new /obj/machinery/artifact(src)*/
|
||||
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)
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
src.searching = 0
|
||||
src.brainmob.mind = candidate.mind
|
||||
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>"
|
||||
|
||||
@@ -97,6 +97,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
|
||||
@@ -384,13 +385,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)
|
||||
|
||||
@@ -117,7 +117,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
|
||||
@@ -152,7 +152,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)
|
||||
|
||||
|
||||
@@ -450,6 +450,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!"
|
||||
@@ -518,6 +519,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")
|
||||
@@ -531,6 +533,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)
|
||||
@@ -548,6 +551,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) )
|
||||
@@ -783,8 +787,8 @@
|
||||
var/total_plasmaloss = 0
|
||||
for(var/obj/item/I in src)
|
||||
if(I.contaminated)
|
||||
total_plasmaloss += vsc.plc.CONTAMINATION_LOSS
|
||||
|
||||
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
|
||||
@@ -1223,8 +1227,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
|
||||
|
||||
@@ -1270,6 +1280,7 @@
|
||||
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()
|
||||
@@ -1319,7 +1330,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
|
||||
|
||||
@@ -560,9 +560,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 +877,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
|
||||
|
||||
@@ -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()
|
||||
@@ -240,6 +241,7 @@
|
||||
|
||||
// damage MANY external organs, in random order
|
||||
/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()
|
||||
|
||||
@@ -234,16 +234,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 +739,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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
@@ -326,6 +328,7 @@
|
||||
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
|
||||
|
||||
@@ -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( \
|
||||
|
||||
@@ -365,6 +365,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
|
||||
|
||||
@@ -558,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)
|
||||
|
||||
@@ -192,7 +192,8 @@ 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()
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
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,7 +57,7 @@
|
||||
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()
|
||||
|
||||
@@ -87,13 +87,9 @@
|
||||
//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];"
|
||||
|
||||
if(air2.temperature > air1.temperature)
|
||||
air2.temperature = air2.temperature - energy_transfer/air2_heat_capacity
|
||||
@@ -102,28 +98,20 @@
|
||||
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]"
|
||||
lastgen = circ1.ReturnPowerGeneration() + circ2.ReturnPowerGeneration()
|
||||
if(lastgen > 0)
|
||||
add_avail(lastgen)
|
||||
|
||||
add_avail(lastgen)
|
||||
|
||||
if(air1)
|
||||
circ1.air2.merge(air1)
|
||||
|
||||
if(air2)
|
||||
circ2.air2.merge(air2)
|
||||
else
|
||||
add_load(-lastgen)
|
||||
|
||||
// update icon overlays and power usage only if displayed level has changed
|
||||
var/genlev = max(0, min( round(11*lastgen / 100000), 11))
|
||||
if(genlev != lastgenlev)
|
||||
lastgenlev = genlev
|
||||
active_power_usage = lastgenlev * 1000
|
||||
if(lastgenlev > 0)
|
||||
use_power = 2
|
||||
else
|
||||
use_power = 1
|
||||
updateicon()
|
||||
|
||||
src.updateDialog()
|
||||
updateDialog()
|
||||
|
||||
/obj/machinery/power/generator/attack_ai(mob/user)
|
||||
if(stat & (BROKEN|NOPOWER)) return
|
||||
@@ -162,12 +150,15 @@
|
||||
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 += "Turbine Status: <A href='?src=\ref[src];turbine1=1'>[circ1.turbine_pumping ? "Pumping" : "Generating"]</a><br><br>"
|
||||
|
||||
t += "<B>Secondary Circulator (bottom/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>"
|
||||
t += "Turbine Status: <A href='?src=\ref[src];turbine2=1'>[circ2.turbine_pumping ? "Pumping" : "Generating"]</a><br>"
|
||||
|
||||
else
|
||||
t += "Unable to connect to circulators.<br>"
|
||||
t += "Ensure both are in position and wrenched into place."
|
||||
@@ -187,6 +178,15 @@
|
||||
usr << browse(null, "window=teg")
|
||||
usr.unset_machine()
|
||||
return 0
|
||||
|
||||
if( href_list["turbine2"] )
|
||||
if(circ2)
|
||||
circ2.turbine_pumping = !circ2.turbine_pumping
|
||||
|
||||
if( href_list["turbine1"] )
|
||||
if(circ1)
|
||||
circ1.turbine_pumping = !circ1.turbine_pumping
|
||||
|
||||
updateDialog()
|
||||
return 1
|
||||
|
||||
@@ -196,12 +196,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)
|
||||
@@ -341,8 +341,9 @@
|
||||
P.icon_state = "pill"+pillsprite
|
||||
reagents.trans_to(P,50)
|
||||
if(src.loaded_pill_bottle)
|
||||
P.loc = src.loaded_pill_bottle
|
||||
src.updateUsrDialog()
|
||||
if(loaded_pill_bottle.contents.len < loaded_pill_bottle.storage_slots)
|
||||
P.loc = loaded_pill_bottle
|
||||
src.updateUsrDialog()
|
||||
else if (href_list["createbottle"])
|
||||
if(!condi)
|
||||
var/name = reject_bad_text(input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name()))
|
||||
|
||||
@@ -1136,26 +1136,15 @@ datum
|
||||
reagent_state = LIQUID
|
||||
color = "#660000" // rgb: 102, 0, 0
|
||||
|
||||
//Commenting this out as it's horribly broken. It's a neat effect though, so it might be worth making a new reagent (that is less common) with similar effects. -Pete
|
||||
/*
|
||||
|
||||
reaction_obj(var/obj/O, var/volume)
|
||||
src = null
|
||||
var/turf/the_turf = get_turf(O)
|
||||
if(!the_turf)
|
||||
return //No sense trying to start a fire if you don't have a turf to set on fire. --NEO
|
||||
var/datum/gas_mixture/napalm = new
|
||||
var/datum/gas/volatile_fuel/fuel = new
|
||||
fuel.moles = 15
|
||||
napalm.trace_gases += fuel
|
||||
the_turf.assume_air(napalm)
|
||||
new /obj/effect/decal/cleanable/liquid_fuel(the_turf, volume)
|
||||
reaction_turf(var/turf/T, var/volume)
|
||||
src = null
|
||||
var/datum/gas_mixture/napalm = new
|
||||
var/datum/gas/volatile_fuel/fuel = new
|
||||
fuel.moles = 15
|
||||
napalm.trace_gases += fuel
|
||||
T.assume_air(napalm)
|
||||
return*/
|
||||
new /obj/effect/decal/cleanable/liquid_fuel(T, volume)
|
||||
return
|
||||
on_mob_life(var/mob/living/M as mob)
|
||||
if(!M) M = holder.my_atom
|
||||
M.adjustToxLoss(1)
|
||||
|
||||
@@ -385,8 +385,10 @@ datum
|
||||
for(var/turf/simulated/floor/target_tile in range(0,location))
|
||||
|
||||
var/datum/gas_mixture/napalm = new
|
||||
var/datum/gas/volatile_fuel/fuel = new
|
||||
fuel.moles = created_volume
|
||||
napalm.trace_gases += fuel
|
||||
|
||||
napalm.toxins = created_volume*10
|
||||
napalm.temperature = 400+T0C
|
||||
napalm.update_values()
|
||||
|
||||
|
||||
@@ -534,6 +534,10 @@
|
||||
proc/move()
|
||||
var/obj/structure/disposalpipe/last
|
||||
while(active)
|
||||
if(hasmob && prob(3))
|
||||
for(var/mob/living/H in src)
|
||||
H.take_overall_damage(20, 0, "Blunt Trauma")//horribly maim any living creature jumping down disposals. c'est la vie
|
||||
|
||||
if(has_fat_guy && prob(2)) // chance of becoming stuck per segment if contains a fat guy
|
||||
active = 0
|
||||
// find the fat guys
|
||||
|
||||
@@ -595,7 +595,7 @@ datum/design/posibrain
|
||||
|
||||
build_type = PROTOLATHE
|
||||
materials = list("$metal" = 2000, "$glass" = 1000, "$silver" = 1000, "$gold" = 500, "$plasma" = 500, "$diamond" = 100)
|
||||
build_path = "/obj/item/device/posibrain"
|
||||
build_path = "/obj/item/device/mmi/posibrain"
|
||||
|
||||
///////////////////////////////////
|
||||
//////////Mecha Module Disks///////
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/view_range = 20 //how close excavation has to come to show an overlay on the turf
|
||||
var/clearance_range = 3 //how close excavation has to come to extract the item
|
||||
//if excavation hits var/excavation_required exactly, it's contained find is extracted cleanly without the ore
|
||||
var/prob_delicate = 75 //probability it requires an active suspension field to not insta-crumble
|
||||
var/prob_delicate = 90 //probability it requires an active suspension field to not insta-crumble
|
||||
var/dissonance_spread = 1 //proportion of the tile that is affected by this find
|
||||
//used in conjunction with analysis machines to determine correct suspension field type
|
||||
|
||||
@@ -276,6 +276,7 @@
|
||||
if(19)
|
||||
apply_prefix = 0
|
||||
new_item = new /obj/item/weapon/claymore(src.loc)
|
||||
new_item.force = 10
|
||||
item_type = new_item.name
|
||||
if(20)
|
||||
//arcane clothing
|
||||
@@ -318,6 +319,7 @@
|
||||
if(25)
|
||||
apply_prefix = 0
|
||||
new_item = new /obj/item/weapon/katana(src.loc)
|
||||
new_item.force = 10
|
||||
item_type = new_item.name
|
||||
if(26)
|
||||
//energy gun
|
||||
@@ -349,6 +351,7 @@
|
||||
var/obj/item/weapon/gun/projectile/new_gun = new /obj/item/weapon/gun/projectile(src.loc)
|
||||
new_item = new_gun
|
||||
new_item.icon_state = "gun[rand(1,4)]"
|
||||
new_item.icon = 'xenoarchaeology.dmi'
|
||||
|
||||
//33% chance to be able to reload the gun with human ammunition
|
||||
if(prob(66))
|
||||
@@ -359,8 +362,10 @@
|
||||
if(prob(33))
|
||||
var/num_bullets = rand(1,new_gun.max_shells)
|
||||
if(num_bullets < new_gun.loaded.len)
|
||||
for(var/i = num_bullets, i <= new_gun.loaded.len, i++)
|
||||
new_gun.loaded += new new_gun.ammo_type(src)
|
||||
new_gun.loaded.Cut()
|
||||
for(var/i = 1, i <= num_bullets, i++)
|
||||
var/A = text2path(new_gun.ammo_type)
|
||||
new_gun.loaded += new A(new_gun)
|
||||
else
|
||||
for(var/obj/item/I in new_gun)
|
||||
if(new_gun.loaded.len > num_bullets)
|
||||
|
||||
@@ -18,26 +18,23 @@ obj/machinery/anomaly/accelerator/ScanResults()
|
||||
num_reagents++
|
||||
|
||||
if(num_reagents == 2 && scanned_sample && carrier_name)
|
||||
var/accuracy = GetResultSpecifity(scanned_sample, carrier_name)
|
||||
accuracy += 0.5 * (1 - accuracy) / scanned_sample.total_spread
|
||||
if(!accuracy)
|
||||
accuracy = rand(0.01, 0.5)
|
||||
results = "Kinetic acceleration of carrier ([carrier_name]) indicates age ([100 * accuracy]% accuracy): <br><br>"
|
||||
var/specifity = GetResultSpecifity(scanned_sample, carrier_name)
|
||||
results = "Kinetic acceleration of carrier ([carrier_name]) indicates age ([100 * specifity]% accuracy): <br><br>"
|
||||
|
||||
if(scanned_sample.age_billion)
|
||||
var/displayed_age_millions = scanned_sample.age_million + max(scanned_sample.age_million * ((1 - accuracy) * (2 * rand() - 1)), 0)
|
||||
var/displayed_age_billions = scanned_sample.age_billion + max(scanned_sample.age_billion * ((1 - accuracy) * (2 * rand() - 1)), 0)
|
||||
var/displayed_age_millions = scanned_sample.age_million + max(scanned_sample.age_million * ((1 - specifity) * (2 * rand() - 1)), 0)
|
||||
var/displayed_age_billions = scanned_sample.age_billion + max(scanned_sample.age_billion * ((1 - specifity) * (2 * rand() - 1)), 0)
|
||||
results += "[displayed_age_billions + displayed_age_millions / 1000] billion years.<br>"
|
||||
else if(scanned_sample.age_million)
|
||||
var/displayed_age_thousands = scanned_sample.age_thousand + max(scanned_sample.age_thousand * ((1 - accuracy) * (4 * rand() - 2)), 0)
|
||||
var/displayed_age_millions = scanned_sample.age_million + max(scanned_sample.age_million * ((1 - accuracy) * (2 * rand() - 1)), 0)
|
||||
var/displayed_age_thousands = scanned_sample.age_thousand + max(scanned_sample.age_thousand * ((1 - specifity) * (4 * rand() - 2)), 0)
|
||||
var/displayed_age_millions = scanned_sample.age_million + max(scanned_sample.age_million * ((1 - specifity) * (2 * rand() - 1)), 0)
|
||||
results += "[displayed_age_millions + displayed_age_thousands / 1000] million years.<br>"
|
||||
else if(scanned_sample.age_thousand)
|
||||
var/displayed_age = scanned_sample.age + max(scanned_sample.age * ((1 - accuracy) * (8 * rand() - 4)), 0)
|
||||
var/displayed_age_thousands = scanned_sample.age_thousand + max(scanned_sample.age * ((1 - accuracy) * (4 * rand() - 2)), 0)
|
||||
var/displayed_age = scanned_sample.age + max(scanned_sample.age * ((1 - specifity) * (8 * rand() - 4)), 0)
|
||||
var/displayed_age_thousands = scanned_sample.age_thousand + max(scanned_sample.age * ((1 - specifity) * (4 * rand() - 2)), 0)
|
||||
results += "[displayed_age_thousands + displayed_age / 1000] thousand years.<br>"
|
||||
else
|
||||
var/displayed_age = scanned_sample.age + max(scanned_sample.age * ((1 - accuracy) * (8 * rand() - 4)), 0)
|
||||
var/displayed_age = scanned_sample.age + max(scanned_sample.age * ((1 - specifity) * (8 * rand() - 4)), 0)
|
||||
results += "[displayed_age] years.<br>"
|
||||
|
||||
results += "<br>Warning, results only valid for ages on the scale of billions of years."
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
dat += "Scan in progress<br><br><br>"
|
||||
else
|
||||
dat += "[held_container ? "<A href='?src=\ref[src];eject_beaker=1'>Eject beaker</a>" : "No beaker inserted."]<br>"
|
||||
dat += "[fuel_container ? "<A href='?src=\ref[src];eject_fuel=1'>Eject fuel tank</a>" : "No fuel tank inserted."]<br>"
|
||||
//dat += "[fuel_container ? "<A href='?src=\ref[src];eject_fuel=1'>Eject fuel tank</a>" : "No fuel tank inserted."]<br>"
|
||||
dat += "[held_container ? "<A href='?src=\ref[src];begin=1'>Begin scanning</a>" : ""]"
|
||||
dat += "<hr>"
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>Refresh</a><BR>"
|
||||
@@ -130,7 +130,7 @@ obj/machinery/anomaly/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
|
||||
held_container.loc = src
|
||||
updateDialog()
|
||||
|
||||
else if(istype(W, /obj/item/weapon/tank))
|
||||
/*else if(istype(W, /obj/item/weapon/tank))
|
||||
//var/obj/item/weapon/reagent_containers/glass/G = W
|
||||
if(fuel_container)
|
||||
user << "\red You must remove the [fuel_container] first."
|
||||
@@ -139,7 +139,7 @@ obj/machinery/anomaly/attackby(obj/item/weapon/W as obj, mob/living/user as mob)
|
||||
user.drop_item(W)
|
||||
fuel_container.loc = src
|
||||
fuel_container = W
|
||||
updateDialog()
|
||||
updateDialog()*/
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -19,16 +19,11 @@ obj/machinery/anomaly/fourier_transform/ScanResults()
|
||||
|
||||
if(num_reagents == 2 && scanned_sample && carrier)
|
||||
//all necessary components are present
|
||||
var/accuracy = GetResultSpecifity(scanned_sample, carrier)
|
||||
var/specifity = GetResultSpecifity(scanned_sample, carrier)
|
||||
var/distance = scanned_sample.artifact_distance
|
||||
if(distance > 0)
|
||||
if(prob(accuracy))
|
||||
distance += (2 * rand() - 1) * distance * 0.05
|
||||
accuracy = 0.95 + 0.05 * (2 * rand() - 1)
|
||||
else
|
||||
var/offset = 1 - accuracy
|
||||
distance += (2 * rand() - 1) * distance * offset
|
||||
results = "Fourier transform analysis on anomalous energy absorption through carrier ([carrier]) indicates source located inside emission radius ([100 * accuracy]% accuracy): [distance]."
|
||||
distance += (2 * rand() - 1) * distance * 0.05
|
||||
results = "Fourier transform analysis on anomalous energy absorption through carrier ([carrier]) indicates source located inside emission radius ([95 * specifity]% accuracy): [distance]."
|
||||
else
|
||||
results = "Energy dispersion detected throughout sample consistent with background readings.<br>"
|
||||
if(carrier == scanned_sample.source_mineral)
|
||||
|
||||
@@ -18,16 +18,13 @@ obj/machinery/anomaly/gas_chromatography/ScanResults()
|
||||
num_reagents++
|
||||
|
||||
if(num_reagents == 2 && scanned_sample)
|
||||
|
||||
var/specifity = 0.15
|
||||
if(carrier)
|
||||
specifity = GetResultSpecifity(scanned_sample, carrier)
|
||||
results = "Chromatography partitioning analysis over carrier ([carrier]) indicates the following elements present ([110 * (specifity / (specifity + 0.1))]% accuracy):<br><br>"
|
||||
var/specifity = GetResultSpecifity(scanned_sample, carrier)
|
||||
results = "Chromatography partitioning analysis over carrier ([carrier]) indicates the following elements present ([100 * specifity]% accuracy):<br><br>"
|
||||
|
||||
var/num_found = 0
|
||||
for(var/index=1,index <= scanned_sample.find_presence.len, index++)
|
||||
var/find = scanned_sample.find_presence[index]
|
||||
if(find && prob( 110 * (specifity / (specifity + 0.1)) ))
|
||||
if(find && prob(100 * specifity))
|
||||
results += " - " + finds_as_strings[index] + "<br>"
|
||||
num_found++
|
||||
|
||||
|
||||
@@ -32,13 +32,17 @@ obj/machinery/anomaly/hyperspectral/ScanResults()
|
||||
var/specifity = GetResultSpecifity(scanned_sample, carrier)
|
||||
results = "Spectral signature over carrier ([carrier]):<br>"
|
||||
if(specifity <= 0.25)
|
||||
results += "<img src=\"http://i.imgur.com/TAQHn.jpg\"></img><br>"
|
||||
//results += "<img src=\"http://i.imgur.com/TAQHn.jpg\"></img><br>"
|
||||
results += "<img src=chart1.jpg>"
|
||||
else if(specifity <= 0.5)
|
||||
results += "<img src=\"http://i.imgur.com/EwOZ7.jpg\"></img><br>"
|
||||
//results += "<img src=\"http://i.imgur.com/EwOZ7.jpg\"></img><br>"
|
||||
results += "<img src=chart2.jpg>"
|
||||
else if(specifity <= 0.75)
|
||||
results += "<img src=\"http://i.imgur.com/1qCae.jpg\"></img><br>"
|
||||
//results += "<img src=\"http://i.imgur.com/1qCae.jpg\"></img><br>"
|
||||
results += "<img src=chart3.jpg>"
|
||||
else
|
||||
results += "<img src=\"http://i.imgur.com/9T9nc.jpg\"></img><br>"
|
||||
//results += "<img src=\"http://i.imgur.com/9T9nc.jpg\"></img><br>"
|
||||
results += "<img src=chart4.jpg>"
|
||||
|
||||
results += "<br>"
|
||||
if(scanned_sample.artifact_id)
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
icon = 'device.dmi'
|
||||
icon_state = "locator"
|
||||
item_state = "locator"
|
||||
w_class = 2
|
||||
|
||||
/obj/item/device/gps/attack_self(var/mob/user as mob)
|
||||
var/turf/T = get_turf(src)
|
||||
@@ -18,5 +19,6 @@
|
||||
desc = "A coiled metallic tape used to check dimensions and lengths."
|
||||
icon = 'icons/obj/xenoarchaeology.dmi'
|
||||
icon_state = "measuring"
|
||||
w_class = 2
|
||||
|
||||
//todo: dig site tape
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
var/clearance = 0
|
||||
var/record_index = 1
|
||||
var/dissonance_spread = 1
|
||||
var/material = "unknown"
|
||||
|
||||
/obj/item/device/depth_scanner/proc/scan_atom(var/mob/user, var/atom/A)
|
||||
user.visible_message("\blue [user] scans [A], the air around them humming gently.")
|
||||
@@ -34,12 +35,14 @@
|
||||
D.coords = "[M.x].[rand(0,9)]:[M.y].[rand(0,9)]:[10 * M.z].[rand(0,9)]"
|
||||
D.time = worldtime2text()
|
||||
D.record_index = positive_locations.len + 1
|
||||
D.material = M.mineralName
|
||||
|
||||
//find whichever is closer: find or mineral
|
||||
if(M.finds.len)
|
||||
var/datum/find/F = M.finds[1]
|
||||
D.depth = F.excavation_required * 2
|
||||
D.clearance = F.clearance_range * 2
|
||||
D.material = get_responsive_reagent(F.find_type)
|
||||
if(M.excavation_minerals.len)
|
||||
if(M.excavation_minerals[1] < D.depth)
|
||||
D.depth = M.excavation_minerals[1]
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
item_state = "syringe_kit"
|
||||
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
storage_slots = 8
|
||||
w_class = 4
|
||||
w_class = 3
|
||||
can_hold = list("/obj/item/weapon/pickaxe/brush",\
|
||||
"/obj/item/weapon/pickaxe/one_pick",\
|
||||
"/obj/item/weapon/pickaxe/two_pick",\
|
||||
@@ -118,7 +118,7 @@
|
||||
"/obj/item/weapon/pickaxe/five_pick",\
|
||||
"/obj/item/weapon/pickaxe/six_pick",\
|
||||
"/obj/item/weapon/pickaxe/hand")
|
||||
max_combined_w_class = 20
|
||||
max_combined_w_class = 11
|
||||
max_w_class = 4
|
||||
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
// BRAIN DAMAGE FIXING //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/surgery_step/brain/fix_brain
|
||||
/datum/surgery_step/brain/bone_chips
|
||||
required_tool = /obj/item/weapon/hemostat
|
||||
allowed_tools = list(/obj/item/weapon/wirecutters, /obj/item/weapon/kitchen/utensil/fork)
|
||||
|
||||
@@ -113,22 +113,48 @@
|
||||
return ..() && target.brain_op_stage == 2
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts mending ruptured vessels in [target]'s brain with \the [tool].", \
|
||||
"You start mending [target]'s brain with \the [tool].")
|
||||
user.visible_message("[user] starts taking out bone chips and out of [target]'s brain with \the [tool].", \
|
||||
"You start taking out bone chips and out of [target]'s brain with \the [tool].")
|
||||
..()
|
||||
|
||||
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] mends [target]'s brain hematoma with \the [tool].", \
|
||||
"\blue You mend ruptured vessels to [target]'s brain hematoma with \the [tool].")
|
||||
user.visible_message("\blue [user] takes out all bone chips out of [target]'s brain with \the [tool].", \
|
||||
"\blue You take out all bone chips out of [target]'s brain with \the [tool].")
|
||||
target.brain_op_stage = 3
|
||||
|
||||
|
||||
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\red [user]'s hand slips, jabbing \the [tool] in [target]'s brain!", \
|
||||
"\red Your hand slips, jabbing \the [tool] in [target]'s brain!")
|
||||
target.apply_damage(30, BRUTE, "head", 1)
|
||||
|
||||
/datum/surgery_step/brain/hematoma
|
||||
required_tool = /obj/item/weapon/FixOVein
|
||||
allowed_tools = list(/obj/item/weapon/cable_coil)
|
||||
|
||||
min_duration = 90
|
||||
max_duration = 110
|
||||
|
||||
can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.brain_op_stage == 3
|
||||
|
||||
begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("[user] starts mending hematoma in [target]'s brain with \the [tool].", \
|
||||
"You start mending hematoma in [target]'s brain with \the [tool].")
|
||||
..()
|
||||
|
||||
end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\blue [user] mends hematoma in [target]'s brain with \the [tool].", \
|
||||
"\blue You mend hematoma in [target]'s brain with \the [tool].")
|
||||
var/datum/organ/internal/brain/sponge = target.internal_organs["brain"]
|
||||
if (sponge)
|
||||
sponge.damage = 0
|
||||
|
||||
|
||||
fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
user.visible_message("\red [user]'s hand slips, cutting a vein in [target]'s brain with \the [tool]!", \
|
||||
"\red Your hand slips, cutting a vein in [target]'s brain with \the [tool]!")
|
||||
target.apply_damage(50, BRUTE, "head", 1)
|
||||
user.visible_message("\red [user]'s hand slips, bruising [target]'s brain with \the [tool]!", \
|
||||
"\red Your hand slips, bruising [target]'s brain with \the [tool]!")
|
||||
target.apply_damage(20, BRUTE, "head", 1)
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// SLIME CORE EXTRACTION //
|
||||
|
||||
Reference in New Issue
Block a user