mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-29 03:22:12 +00:00
Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 3/11/2016_integrated_circuits
This commit is contained in:
@@ -59,7 +59,8 @@ proc/admin_notice(var/message, var/rights)
|
||||
<a href='?src=\ref[usr];priv_msg=\ref[M]'>PM</a> -
|
||||
<a href='?src=\ref[src];subtlemessage=\ref[M]'>SM</a> -
|
||||
[admin_jump_link(M, src)]\] <br>
|
||||
<b>Mob type</b> = [M.type]<br><br>
|
||||
<b>Mob type:</b> [M.type]<br>
|
||||
<b>Inactivity time:</b> [M.client ? "[M.client.inactivity/600] minutes" : "Logged out"]<br/><br/>
|
||||
<A href='?src=\ref[src];boot2=\ref[M]'>Kick</A> |
|
||||
<A href='?_src_=holder;warn=[M.ckey]'>Warn</A> |
|
||||
<A href='?src=\ref[src];newban=\ref[M]'>Ban</A> |
|
||||
@@ -1348,6 +1349,7 @@ proc/admin_notice(var/message, var/rights)
|
||||
H.paralysis = 0
|
||||
msg = "has unparalyzed [key_name(H)]."
|
||||
log_and_message_admins(msg)
|
||||
|
||||
/datum/admins/proc/set_tcrystals(mob/living/carbon/human/H as mob)
|
||||
set category = "Debug"
|
||||
set name = "Set Telecrystals"
|
||||
@@ -1380,3 +1382,93 @@ proc/admin_notice(var/message, var/rights)
|
||||
else
|
||||
usr << "You do not have access to this command."
|
||||
|
||||
|
||||
/datum/admins/proc/sendFax()
|
||||
set category = "Special Verbs"
|
||||
set name = "Send Fax"
|
||||
set desc = "Sends a fax to this machine"
|
||||
var/department = input("Choose a fax", "Fax") as null|anything in alldepartments
|
||||
for(var/obj/machinery/photocopier/faxmachine/sendto in allfaxes)
|
||||
if(sendto.department == department)
|
||||
|
||||
if (!istype(src,/datum/admins))
|
||||
src = usr.client.holder
|
||||
if (!istype(src,/datum/admins))
|
||||
usr << "Error: you are not an admin!"
|
||||
return
|
||||
|
||||
var/replyorigin = input(src.owner, "Please specify who the fax is coming from", "Origin") as text|null
|
||||
|
||||
var/obj/item/weapon/paper/admin/P = new /obj/item/weapon/paper/admin( null ) //hopefully the null loc won't cause trouble for us
|
||||
faxreply = P
|
||||
|
||||
P.admindatum = src
|
||||
P.origin = replyorigin
|
||||
P.destination = sendto
|
||||
|
||||
P.adminbrowse()
|
||||
|
||||
|
||||
datum/admins/var/obj/item/weapon/paper/admin/faxreply // var to hold fax replies in
|
||||
|
||||
/datum/admins/proc/faxCallback(var/obj/item/weapon/paper/admin/P, var/obj/machinery/photocopier/faxmachine/destination)
|
||||
var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null
|
||||
|
||||
P.name = "[P.origin] - [customname]"
|
||||
P.desc = "This is a paper titled '" + P.name + "'."
|
||||
|
||||
var/shouldStamp = 1
|
||||
if(!P.sender) // admin initiated
|
||||
switch(alert("Would you like the fax stamped?",, "Yes", "No"))
|
||||
if("No")
|
||||
shouldStamp = 0
|
||||
|
||||
if(shouldStamp)
|
||||
P.stamps += "<hr><i>This paper has been stamped by the [P.origin] Quantum Relay.</i>"
|
||||
|
||||
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
|
||||
var/{x; y;}
|
||||
x = rand(-2, 0)
|
||||
y = rand(-1, 2)
|
||||
P.offset_x += x
|
||||
P.offset_y += y
|
||||
stampoverlay.pixel_x = x
|
||||
stampoverlay.pixel_y = y
|
||||
|
||||
if(!P.ico)
|
||||
P.ico = new
|
||||
P.ico += "paper_stamp-cent"
|
||||
stampoverlay.icon_state = "paper_stamp-cent"
|
||||
|
||||
if(!P.stamped)
|
||||
P.stamped = new
|
||||
P.stamped += /obj/item/weapon/stamp/centcomm
|
||||
P.overlays += stampoverlay
|
||||
|
||||
var/obj/item/rcvdcopy
|
||||
rcvdcopy = destination.copy(P)
|
||||
rcvdcopy.loc = null //hopefully this shouldn't cause trouble
|
||||
adminfaxes += rcvdcopy
|
||||
|
||||
|
||||
|
||||
if(destination.recievefax(P))
|
||||
src.owner << "<span class='notice'>Message reply to transmitted successfully.</span>"
|
||||
if(P.sender) // sent as a reply
|
||||
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(P.sender)]")
|
||||
for(var/client/C in admins)
|
||||
if((R_ADMIN | R_MOD) & C.holder.rights)
|
||||
C << "<span class='log_message'><span class='prefix'>FAX LOG:</span>[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(P.sender)] (<a href='?_src_=holder;AdminFaxView=\ref[rcvdcopy]'>VIEW</a>)</span>"
|
||||
else
|
||||
log_admin("[key_name(src.owner)] has sent a fax message to [destination.department]")
|
||||
for(var/client/C in admins)
|
||||
if((R_ADMIN | R_MOD) & C.holder.rights)
|
||||
C << "<span class='log_message'><span class='prefix'>FAX LOG:</span>[key_name_admin(src.owner)] has sent a fax message to [destination.department] (<a href='?_src_=holder;AdminFaxView=\ref[rcvdcopy]'>VIEW</a>)</span>"
|
||||
|
||||
else
|
||||
src.owner << "<span class='warning'>Message reply failed.</span>"
|
||||
|
||||
spawn(100)
|
||||
qdel(P)
|
||||
faxreply = null
|
||||
return
|
||||
|
||||
@@ -96,7 +96,8 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/toggle_debug_logs,
|
||||
/client/proc/toggle_attack_logs,
|
||||
/datum/admins/proc/paralyze_mob,
|
||||
/client/proc/fixatmos
|
||||
/client/proc/fixatmos,
|
||||
/datum/admins/proc/sendFax
|
||||
)
|
||||
var/list/admin_verbs_ban = list(
|
||||
/client/proc/unban_panel,
|
||||
@@ -161,7 +162,7 @@ var/list/admin_verbs_server = list(
|
||||
/client/proc/nanomapgen_DumpImage
|
||||
)
|
||||
var/list/admin_verbs_debug = list(
|
||||
/client/proc/getruntimelog, //allows us to access runtime logs to somebody,
|
||||
/client/proc/getruntimelog, //allows us to access runtime logs to somebody,
|
||||
/client/proc/cmd_admin_list_open_jobs,
|
||||
/client/proc/Debug2,
|
||||
/client/proc/kill_air,
|
||||
@@ -195,7 +196,8 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/jumptocoord,
|
||||
/client/proc/dsay,
|
||||
/client/proc/toggle_debug_logs,
|
||||
/client/proc/admin_ghost //allows us to ghost/reenter body at will,
|
||||
/client/proc/admin_ghost, //allows us to ghost/reenter body at will,
|
||||
/datum/admins/proc/view_runtimes
|
||||
)
|
||||
|
||||
var/list/admin_verbs_paranoid_debug = list(
|
||||
@@ -305,7 +307,9 @@ var/list/admin_verbs_mod = list(
|
||||
/client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head',
|
||||
/datum/admins/proc/paralyze_mob,
|
||||
/client/proc/cmd_admin_direct_narrate,
|
||||
/client/proc/allow_character_respawn // Allows a ghost to respawn ,
|
||||
/client/proc/allow_character_respawn, // Allows a ghost to respawn ,
|
||||
/datum/admins/proc/sendFax
|
||||
|
||||
)
|
||||
|
||||
var/list/admin_verbs_mentor = list(
|
||||
|
||||
@@ -13,6 +13,7 @@ var/list/admin_datums = list()
|
||||
var/datum/feed_channel/admincaster_feed_channel = new /datum/feed_channel
|
||||
var/admincaster_signature //What you'll sign the newsfeeds as
|
||||
|
||||
|
||||
/datum/admins/New(initial_rank = "Temporary Admin", initial_rights = 0, ckey)
|
||||
if(!ckey)
|
||||
error("Admin datum created without a ckey argument. Datum has been deleted")
|
||||
@@ -57,22 +58,28 @@ proc/admin_proc()
|
||||
|
||||
NOTE: It checks usr by default. Supply the "user" argument if you wish to check for a specific mob.
|
||||
*/
|
||||
/proc/check_rights(rights_required, show_msg=1, var/mob/user = usr)
|
||||
if(user && user.client)
|
||||
if(rights_required)
|
||||
if(user.client.holder)
|
||||
if(rights_required & user.client.holder.rights)
|
||||
return 1
|
||||
else
|
||||
if(show_msg)
|
||||
user << "<font color='red'>Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")].</font>"
|
||||
/proc/check_rights(rights_required, show_msg=1, var/client/C = usr)
|
||||
if(ismob(C))
|
||||
var/mob/M = C
|
||||
C = M.client
|
||||
if(!C)
|
||||
return FALSE
|
||||
if(!(istype(C, /client))) // If we still didn't find a client, something is wrong.
|
||||
return FALSE
|
||||
if(!C.holder)
|
||||
if(show_msg)
|
||||
C << "<span class='warning'>Error: You are not an admin.</span>"
|
||||
return FALSE
|
||||
|
||||
if(rights_required)
|
||||
if(rights_required & C.holder.rights)
|
||||
return TRUE
|
||||
else
|
||||
if(user.client.holder)
|
||||
return 1
|
||||
else
|
||||
if(show_msg)
|
||||
user << "<font color='red'>Error: You are not an admin.</font>"
|
||||
return 0
|
||||
if(show_msg)
|
||||
C << "<span class='warning'>Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")].</span>"
|
||||
return FALSE
|
||||
else
|
||||
return TRUE
|
||||
|
||||
//probably a bit iffy - will hopefully figure out a better solution
|
||||
/proc/check_if_greater_rights_than(client/other)
|
||||
|
||||
@@ -63,7 +63,7 @@ var/savefile/Banlistjob
|
||||
bantimestamp = CMinutes + minutes
|
||||
if(rank == "Heads")
|
||||
AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Personnel")
|
||||
AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Captain")
|
||||
AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Station Administrator")
|
||||
AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security")
|
||||
AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer")
|
||||
AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director")
|
||||
|
||||
@@ -392,7 +392,7 @@
|
||||
if (ticker && ticker.current_state >= GAME_STATE_PLAYING)
|
||||
var/dat = "<html><head><title>Round Status</title></head><body><h1><B>Round Status</B></h1>"
|
||||
dat += "Current Game Mode: <B>[ticker.mode.name]</B><BR>"
|
||||
dat += "Round Duration: <B>[round_duration_as_text()]</B><BR>"
|
||||
dat += "Round Duration: <B>[roundduration2text()]</B><BR>"
|
||||
dat += "<B>Emergency shuttle</B><BR>"
|
||||
if (!emergency_shuttle.online())
|
||||
dat += "<a href='?src=\ref[src];call_shuttle=1'>Call Shuttle</a><br>"
|
||||
|
||||
@@ -892,9 +892,9 @@
|
||||
if (ticker && ticker.mode)
|
||||
return alert(usr, "The game has already started.", null, null, null, null)
|
||||
master_mode = href_list["c_mode2"]
|
||||
log_admin("[key_name(usr)] set the mode as [master_mode].")
|
||||
message_admins("\blue [key_name_admin(usr)] set the mode as [master_mode].", 1)
|
||||
world << "\blue <b>The mode is now: [master_mode]</b>"
|
||||
log_admin("[key_name(usr)] set the mode as [config.mode_names[master_mode]].")
|
||||
message_admins("\blue [key_name_admin(usr)] set the mode as [config.mode_names[master_mode]].", 1)
|
||||
world << "\blue <b>The mode is now: [config.mode_names[master_mode]]</b>"
|
||||
Game() // updates the main game menu
|
||||
world.save_mode(master_mode)
|
||||
.(href, list("c_mode"=1))
|
||||
@@ -1176,6 +1176,18 @@
|
||||
sleep(2)
|
||||
C.jumptomob(M)
|
||||
|
||||
else if(href_list["adminplayerobservefollow"])
|
||||
if(!check_rights(R_MENTOR|R_MOD|R_ADMIN|R_SERVER))
|
||||
return
|
||||
|
||||
var/mob/M = locate(href_list["adminplayerobservefollow"])
|
||||
|
||||
var/client/C = usr.client
|
||||
if(!isobserver(usr)) C.admin_ghost()
|
||||
var/mob/observer/dead/G = C.mob
|
||||
sleep(2)
|
||||
G.ManualFollow(M)
|
||||
|
||||
else if(href_list["check_antagonist"])
|
||||
check_antagonists()
|
||||
|
||||
@@ -1386,86 +1398,21 @@
|
||||
H.show(src.owner)
|
||||
return
|
||||
|
||||
else if(href_list["CentcommFaxReply"])
|
||||
var/mob/sender = locate(href_list["CentcommFaxReply"])
|
||||
else if(href_list["FaxReply"])
|
||||
var/mob/sender = locate(href_list["FaxReply"])
|
||||
var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"])
|
||||
|
||||
//todo: sanitize
|
||||
var/input = input(src.owner, "Please enter a message to reply to [key_name(sender)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use <br> for line breaks.", "Outgoing message from Centcomm", "") as message|null
|
||||
if(!input) return
|
||||
|
||||
var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null
|
||||
|
||||
// Create the reply message
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( null ) //hopefully the null loc won't cause trouble for us
|
||||
P.name = "[command_name()]- [customname]"
|
||||
P.info = input
|
||||
P.update_icon()
|
||||
|
||||
// Stamps
|
||||
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
|
||||
stampoverlay.icon_state = "paper_stamp-cent"
|
||||
if(!P.stamped)
|
||||
P.stamped = new
|
||||
P.stamped += /obj/item/weapon/stamp
|
||||
P.overlays += stampoverlay
|
||||
P.stamps += "<HR><i>This paper has been stamped by the Central Command Quantum Relay.</i>"
|
||||
|
||||
if(fax.recievefax(P))
|
||||
src.owner << "\blue Message reply to transmitted successfully."
|
||||
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(sender)]: [input]")
|
||||
message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(sender)]", 1)
|
||||
else
|
||||
src.owner << "\red Message reply failed."
|
||||
|
||||
spawn(100)
|
||||
qdel(P)
|
||||
return
|
||||
|
||||
else if(href_list["SolGovFaxReply"])
|
||||
//TODO
|
||||
/*
|
||||
var/mob/living/carbon/human/H = locate(href_list["SolGovFaxReply"])
|
||||
var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"])
|
||||
|
||||
var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use <br> for line breaks.", "Outgoing message from Centcomm", "") as message|null
|
||||
if(!input) return
|
||||
|
||||
var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null
|
||||
|
||||
for(var/obj/machinery/photocopier/faxmachine/F in machines)
|
||||
if(F == fax)
|
||||
if(! (F.stat & (BROKEN|NOPOWER) ) )
|
||||
|
||||
// animate! it's alive!
|
||||
flick("faxreceive", F)
|
||||
|
||||
// give the sprite some time to flick
|
||||
spawn(20)
|
||||
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( F.loc )
|
||||
P.name = "Sol Government- [customname]"
|
||||
P.info = input
|
||||
P.update_icon()
|
||||
|
||||
playsound(F.loc, "sound/items/polaroid1.ogg", 50, 1)
|
||||
|
||||
// Stamps
|
||||
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
|
||||
stampoverlay.icon_state = "paper_stamp-cap"
|
||||
if(!P.stamped)
|
||||
P.stamped = new
|
||||
P.stamped += /obj/item/weapon/stamp
|
||||
P.overlays += stampoverlay
|
||||
P.stamps += "<HR><i>This paper has been stamped and encrypted by the Sol Government Quantum Relay.</i>"
|
||||
|
||||
src.owner << "Message reply to transmitted successfully."
|
||||
log_admin("[key_name(src.owner)] replied to a fax message from [key_name(H)]: [input]")
|
||||
message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)]", 1)
|
||||
return
|
||||
src.owner << "/red Unable to locate fax!"
|
||||
*/
|
||||
var/replyorigin = href_list["replyorigin"]
|
||||
|
||||
|
||||
var/obj/item/weapon/paper/admin/P = new /obj/item/weapon/paper/admin( null ) //hopefully the null loc won't cause trouble for us
|
||||
faxreply = P
|
||||
|
||||
P.admindatum = src
|
||||
P.origin = replyorigin
|
||||
P.destination = fax
|
||||
P.sender = sender
|
||||
|
||||
P.adminbrowse()
|
||||
|
||||
else if(href_list["jumpto"])
|
||||
if(!check_rights(R_ADMIN)) return
|
||||
|
||||
@@ -262,7 +262,7 @@
|
||||
id.icon_state = "gold"
|
||||
id.access = get_all_accesses()
|
||||
id.registered_name = H.real_name
|
||||
id.assignment = "Captain"
|
||||
id.assignment = "Station Administrator"
|
||||
id.name = "[id.registered_name]'s ID Card ([id.assignment])"
|
||||
H.equip_to_slot_or_del(id, slot_wear_id)
|
||||
H.update_inv_wear_id()
|
||||
@@ -959,3 +959,13 @@
|
||||
log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!")
|
||||
else
|
||||
alert("Invalid mob")
|
||||
|
||||
/datum/admins/proc/view_runtimes()
|
||||
set category = "Debug"
|
||||
set name = "View Runtimes"
|
||||
set desc = "Open the Runtime Viewer"
|
||||
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
error_cache.showTo(usr)
|
||||
|
||||
@@ -131,6 +131,7 @@
|
||||
prefs.last_id = computer_id //these are gonna be used for banning
|
||||
|
||||
. = ..() //calls mob.Login()
|
||||
prefs.sanitize_preferences()
|
||||
|
||||
if(custom_event_msg && custom_event_msg != "")
|
||||
src << "<h1 class='alert'>Custom Event</h1>"
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
. += "- [pref.species] cannot choose secondary languages.<br>"
|
||||
|
||||
. += "<b>Language Keys</b><br>"
|
||||
. += " [english_list(pref.language_prefixes, and_text = " ", comma_text = " ")] <a href='?src=\ref[src];change_prefix=1'>Change</a> <a href='?src=\ref[src];reset_prefix=1'>Reset</a><br>"
|
||||
. += " [jointext(pref.language_prefixes, " ")] <a href='?src=\ref[src];change_prefix=1'>Change</a> <a href='?src=\ref[src];reset_prefix=1'>Reset</a><br>"
|
||||
|
||||
/datum/category_item/player_setup_item/general/language/OnTopic(var/href,var/list/href_list, var/mob/user)
|
||||
if(href_list["remove_language"])
|
||||
|
||||
@@ -52,34 +52,38 @@ var/list/gear_datums = list()
|
||||
S["gear"] << pref.gear
|
||||
|
||||
/datum/category_item/player_setup_item/loadout/proc/valid_gear_choices(var/max_cost)
|
||||
var/list/valid_gear_choices = list()
|
||||
. = list()
|
||||
var/mob/preference_mob = preference_mob()
|
||||
for(var/gear_name in gear_datums)
|
||||
var/datum/gear/G = gear_datums[gear_name]
|
||||
if(G.whitelisted && !is_alien_whitelisted(preference_mob(), all_species[G.whitelisted]))
|
||||
|
||||
if(G.whitelisted && !is_alien_whitelisted(preference_mob, all_species[G.whitelisted]))
|
||||
continue
|
||||
if(max_cost && G.cost > max_cost)
|
||||
continue
|
||||
valid_gear_choices += gear_name
|
||||
return valid_gear_choices
|
||||
. += gear_name
|
||||
|
||||
/datum/category_item/player_setup_item/loadout/sanitize_character()
|
||||
var/mob/preference_mob = preference_mob()
|
||||
if(!islist(pref.gear))
|
||||
pref.gear = list()
|
||||
|
||||
for(var/gear_name in pref.gear)
|
||||
if(!(gear_name in gear_datums))
|
||||
pref.gear -= gear_name
|
||||
|
||||
var/total_cost = 0
|
||||
for(var/gear_name in pref.gear)
|
||||
if(!gear_datums[gear_name])
|
||||
preference_mob << "<span class='warning'>You cannot have more than one of the \the [gear_name]</span>"
|
||||
pref.gear -= gear_name
|
||||
else if(!(gear_name in valid_gear_choices()))
|
||||
preference_mob << "<span class='warning'>You cannot take \the [gear_name] as you are not whitelisted for the species.</span>"
|
||||
pref.gear -= gear_name
|
||||
else
|
||||
var/datum/gear/G = gear_datums[gear_name]
|
||||
if(total_cost + G.cost > MAX_GEAR_COST)
|
||||
pref.gear -= gear_name
|
||||
preference_mob << "<span class='warning'>You cannot afford to take \the [gear_name]</span>"
|
||||
else
|
||||
total_cost += G.cost
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
/datum/gear/accessory/holster
|
||||
display_name = "holster, armpit"
|
||||
path = /obj/item/clothing/accessory/holster/armpit
|
||||
allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective")
|
||||
allowed_roles = list("Station Administrator", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective")
|
||||
|
||||
/datum/gear/accessory/holster/hip
|
||||
display_name = "holster, hip"
|
||||
@@ -210,4 +210,12 @@
|
||||
/datum/gear/accessory/webbing
|
||||
display_name = "webbing, simple"
|
||||
path = /obj/item/clothing/accessory/storage/webbing
|
||||
cost = 2
|
||||
cost = 2
|
||||
|
||||
/datum/gear/accessory/chaps
|
||||
display_name = "chaps, brown"
|
||||
path = /obj/item/clothing/accessory/chaps
|
||||
|
||||
/datum/gear/accessory/chaps/black
|
||||
display_name = "chaps, black"
|
||||
path = /obj/item/clothing/accessory/chaps/black
|
||||
@@ -50,7 +50,7 @@
|
||||
/datum/gear/eyes/shades
|
||||
display_name = "Sunglasses, fat (Security/Command)"
|
||||
path = /obj/item/clothing/glasses/sunglasses/big
|
||||
allowed_roles = list("Security Officer","Head of Security","Warden","Captain","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective")
|
||||
allowed_roles = list("Security Officer","Head of Security","Warden","Station Administrator","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective")
|
||||
|
||||
/datum/gear/eyes/glasses/fakesun
|
||||
display_name = "Sunglasses, stylish"
|
||||
|
||||
@@ -224,3 +224,27 @@
|
||||
/datum/gear/head/turban/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/head/beanie
|
||||
display_name = "beanie"
|
||||
path = /obj/item/clothing/head/beanie
|
||||
|
||||
/datum/gear/head/beanie/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/head/loose_beanie
|
||||
display_name = "loose beanie"
|
||||
path = /obj/item/clothing/head/beanie_loose
|
||||
|
||||
/datum/gear/head/loose_beanie/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
/datum/gear/head/beretg
|
||||
display_name = "beret"
|
||||
path = /obj/item/clothing/head/beretg
|
||||
|
||||
/datum/gear/head/beretg/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
@@ -95,4 +95,12 @@
|
||||
|
||||
/datum/gear/shoes/flats/white
|
||||
display_name = "flats, white"
|
||||
path = /obj/item/clothing/shoes/flats/white
|
||||
path = /obj/item/clothing/shoes/flats/white
|
||||
|
||||
/datum/gear/shoes/flipflops
|
||||
display_name = "flip flops"
|
||||
path = /obj/item/clothing/shoes/flipflop
|
||||
|
||||
/datum/gear/shoes/flipflops/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
@@ -118,40 +118,40 @@
|
||||
|
||||
/datum/gear/suit/poncho
|
||||
display_name = "poncho selection"
|
||||
path = /obj/item/clothing/suit/poncho
|
||||
path = /obj/item/clothing/accessory/poncho
|
||||
cost = 1
|
||||
|
||||
/datum/gear/suit/poncho/New()
|
||||
..()
|
||||
var/list/ponchos = list()
|
||||
for(var/poncho_style in (typesof(/obj/item/clothing/suit/poncho) - typesof(/obj/item/clothing/suit/poncho/roles)))
|
||||
var/obj/item/clothing/suit/storage/toggle/hoodie/poncho = poncho_style
|
||||
for(var/poncho_style in (typesof(/obj/item/clothing/accessory/poncho) - typesof(/obj/item/clothing/accessory/poncho/roles)))
|
||||
var/obj/item/clothing/accessory/poncho/poncho = poncho_style
|
||||
ponchos[initial(poncho.name)] = poncho
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ponchos))
|
||||
|
||||
/datum/gear/suit/roles/poncho/security
|
||||
display_name = "poncho, security"
|
||||
path = /obj/item/clothing/suit/poncho/roles/security
|
||||
path = /obj/item/clothing/accessory/poncho/roles/security
|
||||
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer")
|
||||
|
||||
/datum/gear/suit/roles/poncho/medical
|
||||
display_name = "poncho, medical"
|
||||
path = /obj/item/clothing/suit/poncho/roles/medical
|
||||
path = /obj/item/clothing/accessory/poncho/roles/medical
|
||||
allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist")
|
||||
|
||||
/datum/gear/suit/roles/poncho/engineering
|
||||
display_name = "poncho, engineering"
|
||||
path = /obj/item/clothing/suit/poncho/roles/engineering
|
||||
path = /obj/item/clothing/accessory/poncho/roles/engineering
|
||||
allowed_roles = list("Chief Engineer","Atmospheric Technician", "Station Engineer")
|
||||
|
||||
/datum/gear/suit/roles/poncho/science
|
||||
display_name = "poncho, science"
|
||||
path = /obj/item/clothing/suit/poncho/roles/science
|
||||
path = /obj/item/clothing/accessory/poncho/roles/science
|
||||
allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist")
|
||||
|
||||
/datum/gear/suit/roles/poncho/cargo
|
||||
display_name = "poncho, cargo"
|
||||
path = /obj/item/clothing/suit/poncho/roles/cargo
|
||||
path = /obj/item/clothing/accessory/poncho/roles/cargo
|
||||
allowed_roles = list("Quartermaster","Cargo Technician")
|
||||
|
||||
/datum/gear/suit/unathi_robe
|
||||
@@ -180,6 +180,31 @@
|
||||
path = /obj/item/clothing/suit/wcoat
|
||||
cost = 1
|
||||
|
||||
/datum/gear/suit/wcoat/red
|
||||
display_name = "red waistcoat"
|
||||
path = /obj/item/clothing/suit/wcoat/red
|
||||
|
||||
/datum/gear/suit/wcoat/grey
|
||||
display_name = "grey waistcoat"
|
||||
path = /obj/item/clothing/suit/wcoat/grey
|
||||
|
||||
/datum/gear/suit/wcoat/brown
|
||||
display_name = "brown waistcoat"
|
||||
path = /obj/item/clothing/suit/wcoat/brown
|
||||
|
||||
/datum/gear/suit/swvest
|
||||
display_name = "black sweatervest"
|
||||
path = /obj/item/clothing/suit/wcoat/swvest
|
||||
cost = 1
|
||||
|
||||
/datum/gear/suit/swvest/blue
|
||||
display_name = "blue sweatervest"
|
||||
path = /obj/item/clothing/suit/wcoat/swvest/blue
|
||||
|
||||
/datum/gear/suit/swvest/red
|
||||
display_name = "red sweatervest"
|
||||
path = /obj/item/clothing/suit/wcoat/swvest/red
|
||||
|
||||
/datum/gear/suit/forensics
|
||||
display_name = "forensics long, red"
|
||||
path = /obj/item/clothing/suit/storage/forensics/red/long
|
||||
@@ -205,9 +230,9 @@
|
||||
path = /obj/item/clothing/suit/storage/hooded/wintercoat
|
||||
|
||||
/datum/gear/suit/wintercoat/captain
|
||||
display_name = "winter coat, captain"
|
||||
display_name = "winter coat, station administrator"
|
||||
path = /obj/item/clothing/suit/storage/hooded/wintercoat/captain
|
||||
allowed_roles = list("Captain")
|
||||
allowed_roles = list("Station Administrator")
|
||||
|
||||
/datum/gear/suit/wintercoat/security
|
||||
display_name = "winter coat, security"
|
||||
|
||||
@@ -284,9 +284,9 @@
|
||||
path = /obj/item/clothing/under/dress/dress_fire
|
||||
|
||||
/datum/gear/uniform/uniform_captain
|
||||
display_name = "uniform, captain's dress"
|
||||
display_name = "uniform, station administrator's dress"
|
||||
path = /obj/item/clothing/under/dress/dress_cap
|
||||
allowed_roles = list("Captain")
|
||||
allowed_roles = list("Station Administrator")
|
||||
|
||||
/datum/gear/uniform/corpdetsuit
|
||||
display_name = "uniform, corporate (Detective)"
|
||||
|
||||
@@ -35,3 +35,8 @@
|
||||
/datum/gear/utility/paicard
|
||||
display_name = "personal AI device"
|
||||
path = /obj/item/device/paicard
|
||||
|
||||
/datum/gear/utility/securecase
|
||||
display_name = "secure briefcase"
|
||||
path =/obj/item/weapon/storage/secure/briefcase
|
||||
cost = 2
|
||||
@@ -2,14 +2,12 @@
|
||||
/datum/gear/suit/zhan_furs
|
||||
display_name = "Zhan-Khazan furs (Tajara)"
|
||||
path = /obj/item/clothing/suit/tajaran/furs
|
||||
whitelisted = "Tajara"
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/suit/unathi_mantle
|
||||
display_name = "hide mantle (Unathi)"
|
||||
path = /obj/item/clothing/suit/unathi/mantle
|
||||
cost = 1
|
||||
whitelisted = "Unathi"
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/ears/skrell/chains //Chains
|
||||
@@ -25,7 +23,7 @@
|
||||
var/obj/item/clothing/ears/skrell/chain/chain = chain_style
|
||||
chaintypes[initial(chain.name)] = chain
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(chaintypes))
|
||||
|
||||
|
||||
/datum/gear/ears/skrell/bands
|
||||
display_name = "headtail band selection (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/band
|
||||
@@ -39,7 +37,7 @@
|
||||
var/obj/item/clothing/ears/skrell/band/band = band_style
|
||||
bandtypes[initial(band.name)] = band
|
||||
gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bandtypes))
|
||||
|
||||
|
||||
/datum/gear/ears/skrell/cloth/male
|
||||
display_name = "male headtail cloth selection (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/cloth_male
|
||||
@@ -73,17 +71,17 @@
|
||||
path = /obj/item/clothing/ears/skrell/colored/band
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = "Skrell"
|
||||
|
||||
|
||||
/datum/gear/ears/skrell/colored/band/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
|
||||
|
||||
/datum/gear/ears/skrell/colored/chain
|
||||
display_name = "Colored chain (Skrell)"
|
||||
path = /obj/item/clothing/ears/skrell/colored/chain
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = "Skrell"
|
||||
|
||||
|
||||
/datum/gear/ears/skrell/colored/chain/New()
|
||||
..()
|
||||
gear_tweaks = list(gear_tweak_free_color_choice)
|
||||
@@ -123,3 +121,9 @@
|
||||
display_name = "gear harness (Full Body Prosthetic, Diona)"
|
||||
path = /obj/item/clothing/under/harness
|
||||
sort_category = "Xenowear"
|
||||
|
||||
/datum/gear/uniform/loincloth
|
||||
display_name = "loincloth (Tajaran, Unathi)"
|
||||
path = /obj/item/clothing/under/shorts/loincloth
|
||||
sort_category = "Xenowear"
|
||||
whitelisted = list("Tajaran", "Unathi")
|
||||
|
||||
@@ -129,8 +129,6 @@
|
||||
// Need due to, for example, the 01_basic module relying on species having been loaded to sanitize correctly but that isn't loaded until module 03_body.
|
||||
for(var/datum/category_item/player_setup_item/PI in items)
|
||||
PI.load_character(S)
|
||||
for(var/datum/category_item/player_setup_item/PI in items)
|
||||
PI.sanitize_character()
|
||||
|
||||
/datum/category_group/player_setup_category/proc/save_character(var/savefile/S)
|
||||
// Sanitize all data, then save it
|
||||
@@ -142,8 +140,6 @@
|
||||
/datum/category_group/player_setup_category/proc/load_preferences(var/savefile/S)
|
||||
for(var/datum/category_item/player_setup_item/PI in items)
|
||||
PI.load_preferences(S)
|
||||
for(var/datum/category_item/player_setup_item/PI in items)
|
||||
PI.sanitize_preferences()
|
||||
|
||||
/datum/category_group/player_setup_category/proc/save_preferences(var/savefile/S)
|
||||
for(var/datum/category_item/player_setup_item/PI in items)
|
||||
|
||||
@@ -237,12 +237,14 @@ datum/preferences
|
||||
else if(href_list["reload"])
|
||||
load_preferences()
|
||||
load_character()
|
||||
sanitize_preferences()
|
||||
else if(href_list["load"])
|
||||
if(!IsGuestKey(usr.key))
|
||||
open_load_dialog(usr)
|
||||
return 1
|
||||
else if(href_list["changeslot"])
|
||||
load_character(text2num(href_list["changeslot"]))
|
||||
sanitize_preferences()
|
||||
close_load_dialog(usr)
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -17,7 +17,7 @@ var/global/list/citizenship_choices = list(
|
||||
"Earth",
|
||||
"Mars",
|
||||
"Moghes",
|
||||
"Ahdomai",
|
||||
"Meralar",
|
||||
"Qerrbalak"
|
||||
)
|
||||
|
||||
@@ -28,7 +28,7 @@ var/global/list/home_system_choices = list(
|
||||
"Tau Ceti",
|
||||
"Qerr'Vallis",
|
||||
"Epsilon Ursae Minoris",
|
||||
"S'randarr"
|
||||
"Rarkajar"
|
||||
)
|
||||
|
||||
var/global/list/faction_choices = list(
|
||||
@@ -44,7 +44,7 @@ var/global/list/faction_choices = list(
|
||||
"Zeng-Hu Pharmaceuticals",
|
||||
"Hesphaistos Industries"
|
||||
)
|
||||
|
||||
|
||||
var/global/list/antag_faction_choices = list() //Should be populated after brainstorming. Leaving as blank in case brainstorming does not occur.
|
||||
|
||||
var/global/list/antag_visiblity_choices = list(
|
||||
|
||||
@@ -467,6 +467,8 @@
|
||||
"Teshari" = 'icons/mob/species/seromi/suit.dmi'
|
||||
)
|
||||
|
||||
valid_accessory_slots = list("over")
|
||||
|
||||
/obj/item/clothing/suit/update_clothing_icon()
|
||||
if (ismob(src.loc))
|
||||
var/mob/M = src.loc
|
||||
@@ -505,7 +507,7 @@
|
||||
//convenience var for defining the icon state for the overlay used when the clothing is worn.
|
||||
//Also used by rolling/unrolling.
|
||||
var/worn_state = null
|
||||
valid_accessory_slots = list("utility","armband","decor")
|
||||
valid_accessory_slots = list("utility","armband","decor","over")
|
||||
restricted_accessory_slots = list("utility", "armband")
|
||||
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "arm guards"
|
||||
desc = "These arm guards will protect your hands and arms."
|
||||
body_parts_covered = HANDS|ARMS
|
||||
slowdown = 1
|
||||
slowdown = 0.5
|
||||
overgloves = 1
|
||||
w_class = 3
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/item/clothing/gloves/captain
|
||||
desc = "Regal blue gloves, with a nice gold trim. Swanky."
|
||||
name = "captain's gloves"
|
||||
name = "station administrator's gloves"
|
||||
icon_state = "captain"
|
||||
item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue")
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/collectable/captain
|
||||
name = "collectable captain's hat"
|
||||
name = "collectable station administrator's hat"
|
||||
desc = "A Collectable Hat that'll make you look just like a real comdom!"
|
||||
icon_state = "captain"
|
||||
body_parts_covered = 0
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
|
||||
//Captain
|
||||
/obj/item/clothing/head/caphat
|
||||
name = "captain's hat"
|
||||
name = "station administrator's hat"
|
||||
icon_state = "captain"
|
||||
desc = "It's good being the king."
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/caphat/cap
|
||||
name = "captain's cap"
|
||||
name = "station administrator's cap"
|
||||
desc = "You fear to wear it for the negligence it brings."
|
||||
icon_state = "capcap"
|
||||
|
||||
@@ -32,7 +32,8 @@
|
||||
/obj/item/clothing/head/chaplain_hood
|
||||
name = "chaplain's hood"
|
||||
desc = "It's hood that covers the head. It keeps you warm during the space winters."
|
||||
icon_state = "beret_black"
|
||||
icon_state = "chaplain_hood"
|
||||
item_state_slots = list(slot_r_hand_str = "beret_black", slot_l_hand_str = "beret_black")
|
||||
flags_inv = BLOCKHAIR
|
||||
body_parts_covered = HEAD
|
||||
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
siemens_coefficient = 0.9
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/centhat/customs
|
||||
name = "Customs Hat"
|
||||
desc = "A formal hat for SolGov Customs Officers."
|
||||
icon_state = "customshat"
|
||||
|
||||
/obj/item/clothing/head/hairflower
|
||||
name = "hair flower pin"
|
||||
icon_state = "hairflower"
|
||||
@@ -73,13 +78,13 @@
|
||||
/obj/item/clothing/head/nursehat
|
||||
name = "nurse's hat"
|
||||
desc = "It allows quick identification of trained medical personnel."
|
||||
item_state_slots = list(slot_r_hand_str = "nursehat", slot_l_hand_str = "nursehat")
|
||||
icon_state = "nursehat"
|
||||
siemens_coefficient = 0.9
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/syndicatefake
|
||||
name = "red space-helmet replica"
|
||||
item_state_slots = list(slot_r_hand_str = "syndicate-helm-black-red", slot_l_hand_str = "syndicate-helm-black-red")
|
||||
item_state_slots = list(slot_r_hand_str = "syndicate-helm-black-red", slot_l_hand_str = "syndicate-helm-black-red")
|
||||
icon_state = "syndicate"
|
||||
desc = "A plastic replica of a bloodthirsty mercenary's space helmet, you'll look just like a real murderous criminal operative in this! This is a toy, it is not made for use in space!"
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR
|
||||
@@ -125,7 +130,7 @@
|
||||
|
||||
/obj/item/clothing/head/justice/pink
|
||||
icon_state = "justicepink"
|
||||
|
||||
|
||||
/obj/item/clothing/head/rabbitears
|
||||
name = "rabbit ears"
|
||||
desc = "Wearing these makes you looks useless, and only good for your sex appeal."
|
||||
@@ -202,7 +207,7 @@
|
||||
name = "fez"
|
||||
icon_state = "fez"
|
||||
desc = "You should wear a fez. Fezzes are cool."
|
||||
|
||||
|
||||
/obj/item/clothing/head/cowboy_hat
|
||||
name = "cowboy hat"
|
||||
desc = "For those that have spurs that go jingle jangle jingle."
|
||||
@@ -277,3 +282,21 @@
|
||||
item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white")
|
||||
body_parts_covered = 0
|
||||
flags_inv = BLOCKHAIR
|
||||
|
||||
/obj/item/clothing/head/beanie
|
||||
name = "beanie"
|
||||
desc = "A head-hugging brimless winter cap. This one is tight."
|
||||
icon_state = "beanie"
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/beanie_loose
|
||||
name = "loose beanie"
|
||||
desc = "A head-hugging brimless winter cap. This one is loose."
|
||||
icon_state = "beanie_hang"
|
||||
body_parts_covered = 0
|
||||
|
||||
/obj/item/clothing/head/beretg
|
||||
name = "beret"
|
||||
desc = "A beret, an artists favorite headwear."
|
||||
icon_state = "beret_g"
|
||||
body_parts_covered = 0
|
||||
@@ -46,7 +46,7 @@
|
||||
|
||||
/obj/item/clothing/shoes/rainbow
|
||||
name = "rainbow shoes"
|
||||
desc = "Very gay shoes."
|
||||
desc = "Very colourful shoes."
|
||||
icon_state = "rain_bow"
|
||||
|
||||
/obj/item/clothing/shoes/flats
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "leg guards"
|
||||
desc = "These will protect your legs and feet."
|
||||
body_parts_covered = LEGS|FEET
|
||||
slowdown = 0 //Shoes have a slowdown of -1, so this needs to be 0 in order for it to effectively be 1 slowdown.
|
||||
slowdown = SHOES_SLOWDOWN+0.5
|
||||
species_restricted = null //Unathi and Taj can wear leg armor now
|
||||
w_class = 3
|
||||
|
||||
|
||||
@@ -199,4 +199,9 @@
|
||||
cold_protection = FEET|LEGS
|
||||
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
heat_protection = FEET|LEGS
|
||||
max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
|
||||
/obj/item/clothing/shoes/flipflop
|
||||
name = "flip flops"
|
||||
desc = "A pair of foam flip flops. For those not afraid to show a little ankle."
|
||||
icon_state = "thongsandal"
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
//Captain's space suit This is not the proper path but I don't currently know enough about how this all works to mess with it.
|
||||
/obj/item/clothing/suit/armor/captain
|
||||
name = "Captain's armor"
|
||||
name = "Station Administrator's armor"
|
||||
desc = "A bulky, heavy-duty piece of exclusive corporate armor. YOU are in charge!"
|
||||
icon_state = "caparmor"
|
||||
w_class = 5
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
/obj/item/rig_module/self_destruct
|
||||
|
||||
name = "self-destruct module"
|
||||
desc = "Oh my God, Captain. A bomb."
|
||||
desc = "Oh my God, Station Administrator. A bomb."
|
||||
icon_state = "deadman"
|
||||
usable = 1
|
||||
active = 1
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
req_one_access = list()
|
||||
req_access = list()
|
||||
w_class = 5
|
||||
action_button_name = "Toggle Heatsink"
|
||||
|
||||
// These values are passed on to all component pieces.
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
|
||||
@@ -54,6 +55,12 @@
|
||||
var/image/mob_icon // Holder for on-mob icon.
|
||||
var/list/installed_modules = list() // Power consumption/use bookkeeping.
|
||||
|
||||
// Cooling system vars.
|
||||
var/cooling_on = 0 //is it turned on?
|
||||
var/max_cooling = 15 // in degrees per second - probably don't need to mess with heat capacity here
|
||||
var/charge_consumption = 2 // charge per second at max_cooling //more effective on a rig, because it's all built in already
|
||||
var/thermostat = T20C
|
||||
|
||||
// Rig status vars.
|
||||
var/open = 0 // Access panel status.
|
||||
var/locked = 1 // Lock status.
|
||||
@@ -91,8 +98,13 @@
|
||||
usr << "\icon[piece] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed."
|
||||
|
||||
if(src.loc == usr)
|
||||
usr << "The access panel is [locked? "locked" : "unlocked"]."
|
||||
usr << "The maintenance panel is [open ? "open" : "closed"]."
|
||||
usr << "Hardsuit systems are [offline ? "<font color='red'>offline</font>" : "<font color='green'>online</font>"]."
|
||||
usr << "The cooling stystem is [cooling_on ? "active" : "inactive"]."
|
||||
|
||||
if(open)
|
||||
usr << "It's equipped with [english_list(installed_modules)]."
|
||||
|
||||
/obj/item/weapon/rig/New()
|
||||
..()
|
||||
@@ -298,8 +310,97 @@
|
||||
piece.item_flags |= (STOPPRESSUREDAMAGE|AIRTIGHT)
|
||||
update_icon(1)
|
||||
|
||||
/obj/item/weapon/rig/process()
|
||||
/obj/item/weapon/rig/ui_action_click()
|
||||
toggle_cooling(usr)
|
||||
|
||||
/obj/item/weapon/rig/proc/toggle_cooling(var/mob/user)
|
||||
if(cooling_on)
|
||||
turn_cooling_off(user)
|
||||
else
|
||||
turn_cooling_on(user)
|
||||
|
||||
/obj/item/weapon/rig/proc/turn_cooling_on(var/mob/user)
|
||||
if(!cell)
|
||||
return
|
||||
if(cell.charge <= 0)
|
||||
user << "<span class='notice'>\The [src] has no power!.</span>"
|
||||
return
|
||||
if(!suit_is_deployed())
|
||||
user << "<span class='notice'>The hardsuit needs to be deployed first!.</span>"
|
||||
return
|
||||
|
||||
cooling_on = 1
|
||||
usr << "<span class='notice'>You switch \the [src]'s cooling system on.</span>"
|
||||
|
||||
|
||||
/obj/item/weapon/rig/proc/turn_cooling_off(var/mob/user, var/failed)
|
||||
if(failed) visible_message("\The [src]'s cooling system clicks and whines as it powers down.")
|
||||
else usr << "<span class='notice'>You switch \the [src]'s cooling system off.</span>"
|
||||
cooling_on = 0
|
||||
|
||||
/obj/item/weapon/rig/proc/get_environment_temperature()
|
||||
if (ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
if(istype(H.loc, /obj/mecha))
|
||||
var/obj/mecha/M = H.loc
|
||||
return M.return_temperature()
|
||||
else if(istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell))
|
||||
var/obj/machinery/atmospherics/unary/cryo_cell/cryo = H.loc
|
||||
return cryo.air_contents.temperature
|
||||
|
||||
var/turf/T = get_turf(src)
|
||||
if(istype(T, /turf/space))
|
||||
return 0 //space has no temperature, this just makes sure the cooling unit works in space
|
||||
|
||||
var/datum/gas_mixture/environment = T.return_air()
|
||||
if (!environment)
|
||||
return 0
|
||||
|
||||
return environment.temperature
|
||||
|
||||
/obj/item/weapon/rig/proc/attached_to_back(mob/M)
|
||||
if (!ishuman(M))
|
||||
return 0
|
||||
|
||||
var/mob/living/carbon/human/H = M
|
||||
|
||||
if (!H.wear_suit || H.back != src)
|
||||
return 0
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/weapon/rig/proc/coolingProcess()
|
||||
if (!cooling_on || !cell)
|
||||
return
|
||||
|
||||
if (!ismob(loc))
|
||||
return
|
||||
|
||||
if (!attached_to_back(loc)) //make sure the rig's not just in their hands
|
||||
return
|
||||
|
||||
if (!suit_is_deployed()) //inbuilt systems only work on the suit they're designed to work on
|
||||
return
|
||||
|
||||
var/mob/living/carbon/human/H = loc
|
||||
|
||||
var/efficiency = 1 - H.get_pressure_weakness() //you need to have a good seal for effective cooling
|
||||
var/env_temp = get_environment_temperature() //wont save you from a fire
|
||||
var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling)
|
||||
|
||||
if (temp_adj < 0.5) //only cools, doesn't heat, also we don't need extreme precision
|
||||
return
|
||||
|
||||
var/charge_usage = (temp_adj/max_cooling)*charge_consumption
|
||||
|
||||
H.bodytemperature -= temp_adj*efficiency
|
||||
|
||||
cell.use(charge_usage)
|
||||
|
||||
if(cell.charge <= 0)
|
||||
turn_cooling_off(H, 1)
|
||||
|
||||
/obj/item/weapon/rig/process()
|
||||
// If we've lost any parts, grab them back.
|
||||
var/mob/living/M
|
||||
for(var/obj/item/piece in list(gloves,boots,helmet,chest))
|
||||
@@ -308,6 +409,8 @@
|
||||
M = piece.loc
|
||||
M.unEquip(piece)
|
||||
piece.forceMove(src)
|
||||
// Run through cooling
|
||||
coolingProcess()
|
||||
|
||||
if(!istype(wearer) || loc != wearer || wearer.back != src || canremove || !cell || cell.charge <= 0)
|
||||
if(!cell || cell.charge <= 0)
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
desc = "A heavy, powerful rig used by construction crews and mining corporations."
|
||||
icon_state = "engineering_rig"
|
||||
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 50)
|
||||
slowdown = 3
|
||||
slowdown = 1
|
||||
offline_slowdown = 10
|
||||
offline_vision_restriction = 2
|
||||
emp_protection = -20
|
||||
@@ -168,7 +168,7 @@
|
||||
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/ert
|
||||
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils)
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
|
||||
icon_state = "rig0-engineering"
|
||||
item_state_slots = list(slot_r_hand_str = "eng_helm", slot_l_hand_str = "eng_helm")
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80)
|
||||
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80)
|
||||
|
||||
/obj/item/clothing/suit/space/void/engineering
|
||||
name = "engineering voidsuit"
|
||||
@@ -13,7 +13,7 @@
|
||||
icon_state = "rig-engineering"
|
||||
item_state_slots = list(slot_r_hand_str = "eng_voidsuit", slot_l_hand_str = "eng_voidsuit")
|
||||
slowdown = 1
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80)
|
||||
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd)
|
||||
|
||||
//Mining
|
||||
@@ -22,7 +22,7 @@
|
||||
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has reinforced plating."
|
||||
icon_state = "rig0-mining"
|
||||
item_state_slots = list(slot_r_hand_str = "mining_helm", slot_l_hand_str = "mining_helm")
|
||||
armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20)
|
||||
armor = list(melee = 50, bullet = 5, laser = 20, energy = 5, bomb = 55, bio = 100, rad = 20)
|
||||
light_overlay = "helmet_light_dual"
|
||||
|
||||
/obj/item/clothing/suit/space/void/mining
|
||||
@@ -30,7 +30,7 @@
|
||||
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating."
|
||||
icon_state = "rig-mining"
|
||||
item_state_slots = list(slot_r_hand_str = "mining_voidsuit", slot_l_hand_str = "mining_voidsuit")
|
||||
armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20)
|
||||
armor = list(melee = 50, bullet = 5, laser = 20, energy = 5, bomb = 55, bio = 100, rad = 20)
|
||||
|
||||
//Medical
|
||||
/obj/item/clothing/head/helmet/space/void/medical
|
||||
@@ -38,7 +38,7 @@
|
||||
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has minor radiation shielding."
|
||||
icon_state = "rig0-medical"
|
||||
item_state_slots = list(slot_r_hand_str = "medical_helm", slot_l_hand_str = "medical_helm")
|
||||
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50)
|
||||
armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50)
|
||||
|
||||
/obj/item/clothing/suit/space/void/medical
|
||||
name = "medical voidsuit"
|
||||
@@ -46,7 +46,7 @@
|
||||
icon_state = "rig-medical"
|
||||
item_state_slots = list(slot_r_hand_str = "medical_voidsuit", slot_l_hand_str = "medical_voidsuit")
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
|
||||
armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50)
|
||||
armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50)
|
||||
|
||||
//Security
|
||||
/obj/item/clothing/head/helmet/space/void/security
|
||||
@@ -54,7 +54,7 @@
|
||||
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
|
||||
icon_state = "rig0-sec"
|
||||
item_state_slots = list(slot_r_hand_str = "sec_helm", slot_l_hand_str = "sec_helm")
|
||||
armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10)
|
||||
armor = list(melee = 50, bullet = 25, laser = 25, energy = 5, bomb = 45, bio = 100, rad = 10)
|
||||
siemens_coefficient = 0.7
|
||||
light_overlay = "helmet_light_dual"
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
|
||||
icon_state = "rig-sec"
|
||||
item_state_slots = list(slot_r_hand_str = "sec_voidsuit", slot_l_hand_str = "sec_voidsuit")
|
||||
armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10)
|
||||
armor = list(melee = 50, bullet = 25, laser = 25, energy = 5, bomb = 45, bio = 100, rad = 10)
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton)
|
||||
siemens_coefficient = 0.7
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
name = "atmospherics voidsuit helmet"
|
||||
icon_state = "rig0-atmos"
|
||||
item_state_slots = list(slot_r_hand_str = "atmos_helm", slot_l_hand_str = "atmos_helm")
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 50)
|
||||
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 50)
|
||||
max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
light_overlay = "helmet_light_dual"
|
||||
|
||||
@@ -82,5 +82,5 @@
|
||||
desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
|
||||
icon_state = "rig-atmos"
|
||||
item_state_slots = list(slot_r_hand_str = "atmos_voidsuit", slot_l_hand_str = "atmos_voidsuit")
|
||||
armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 50)
|
||||
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 50)
|
||||
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
|
||||
@@ -14,15 +14,15 @@
|
||||
|
||||
//Captain
|
||||
/obj/item/clothing/suit/captunic
|
||||
name = "captain's parade tunic"
|
||||
desc = "Worn by a Captain to show their class."
|
||||
name = "station administrator's parade tunic"
|
||||
desc = "Worn by a Station Administrator to show their class."
|
||||
icon_state = "captunic"
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
|
||||
/obj/item/clothing/suit/captunic/capjacket
|
||||
name = "captain's uniform jacket"
|
||||
desc = "A less formal jacket for everyday captain use."
|
||||
name = "station administrator's uniform jacket"
|
||||
desc = "A less formal jacket for everyday Station Administrator use."
|
||||
icon_state = "capjacket"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
flags_inv = HIDEJUMPSUIT
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
flags = CONDUCT
|
||||
fire_resist = T0C+5200
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
|
||||
|
||||
/obj/item/clothing/suit/greatcoat
|
||||
name = "great coat"
|
||||
desc = "A heavy great coat"
|
||||
@@ -92,6 +92,31 @@
|
||||
blood_overlay_type = "armor"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
|
||||
/obj/item/clothing/suit/wcoat/red
|
||||
name = "red waistcoat"
|
||||
icon_state = "red_waistcoat"
|
||||
|
||||
/obj/item/clothing/suit/wcoat/grey
|
||||
name = "grey waistcoat"
|
||||
icon_state = "grey_waistcoat"
|
||||
|
||||
/obj/item/clothing/suit/wcoat/brown
|
||||
name = "brown waistcoat"
|
||||
icon_state = "brown_waistcoat"
|
||||
|
||||
/obj/item/clothing/suit/wcoat/swvest
|
||||
name = "black sweatervest"
|
||||
desc = "A sleeveless sweater. Wear this if you don't want your arms to be warm, or if you're a nerd."
|
||||
icon_state = "sweatervest"
|
||||
|
||||
/obj/item/clothing/suit/wcoat/swvest/blue
|
||||
name = "blue sweatervest"
|
||||
icon_state = "sweatervest_blue"
|
||||
|
||||
/obj/item/clothing/suit/wcoat/swvest/red
|
||||
name = "red sweatervest"
|
||||
icon_state = "sweatervest_red"
|
||||
|
||||
/obj/item/clothing/suit/apron/overalls
|
||||
name = "coveralls"
|
||||
desc = "A set of denim overalls."
|
||||
@@ -197,7 +222,13 @@
|
||||
desc = "A flowing, black coat."
|
||||
icon_state = "neocoat"
|
||||
item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket")
|
||||
|
||||
|
||||
/obj/item/clothing/suit/customs
|
||||
name = "customs jacket"
|
||||
desc = "A standard SolGov Customs formal jacket."
|
||||
icon_state = "customs_jacket"
|
||||
item_state_slots = list(slot_r_hand_str = "suit_blue", slot_l_hand_str = "suit_blue")
|
||||
|
||||
/*
|
||||
* stripper
|
||||
*/
|
||||
@@ -224,59 +255,6 @@
|
||||
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
|
||||
siemens_coefficient = 2.0
|
||||
|
||||
/*
|
||||
* Poncho
|
||||
*/
|
||||
/obj/item/clothing/suit/poncho
|
||||
name = "poncho"
|
||||
desc = "A simple, comfortable poncho."
|
||||
icon_state = "classicponcho"
|
||||
|
||||
/obj/item/clothing/suit/poncho/green
|
||||
name = "green poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is green."
|
||||
icon_state = "greenponcho"
|
||||
|
||||
/obj/item/clothing/suit/poncho/red
|
||||
name = "red poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is red."
|
||||
icon_state = "redponcho"
|
||||
|
||||
/obj/item/clothing/suit/poncho/purple
|
||||
name = "purple poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is purple."
|
||||
icon_state = "purpleponcho"
|
||||
|
||||
/obj/item/clothing/suit/poncho/blue
|
||||
name = "blue poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is blue."
|
||||
icon_state = "blueponcho"
|
||||
|
||||
/obj/item/clothing/suit/poncho/roles/security
|
||||
name = "security poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is black and red, standard NanoTrasen Security colors."
|
||||
icon_state = "secponcho"
|
||||
|
||||
/obj/item/clothing/suit/poncho/roles/medical
|
||||
name = "medical poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is white with green and blue tint, standard Medical colors."
|
||||
icon_state = "medponcho"
|
||||
|
||||
/obj/item/clothing/suit/poncho/roles/engineering
|
||||
name = "engineering poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is yellow and orange, standard Engineering colors."
|
||||
icon_state = "engiponcho"
|
||||
|
||||
/obj/item/clothing/suit/poncho/roles/science
|
||||
name = "science poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is white with purple trim, standard NanoTrasen Science colors."
|
||||
icon_state = "sciponcho"
|
||||
|
||||
/obj/item/clothing/suit/poncho/roles/cargo
|
||||
name = "cargo poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is tan and grey, the colors of Cargo."
|
||||
icon_state = "cargoponcho"
|
||||
|
||||
/obj/item/clothing/suit/jacket/puffer
|
||||
name = "puffer jacket"
|
||||
desc = "A thick jacket with a rubbery, water-resistant shell."
|
||||
@@ -524,7 +502,7 @@
|
||||
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
|
||||
|
||||
/obj/item/clothing/suit/storage/hooded/wintercoat/captain
|
||||
name = "captain's winter coat"
|
||||
name = "station administrator's winter coat"
|
||||
icon_state = "coatcaptain"
|
||||
item_state_slots = list(slot_r_hand_str = "coatcaptain", slot_l_hand_str = "coatcaptain")
|
||||
armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0)
|
||||
@@ -732,4 +710,4 @@
|
||||
icon_open = "suitjacket_green_open"
|
||||
icon_closed = "suitjacket_green"
|
||||
blood_overlay_type = "coat"
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
body_parts_covered = UPPER_TORSO|ARMS
|
||||
|
||||
@@ -26,4 +26,90 @@
|
||||
/obj/item/clothing/accessory/checkered_jacket
|
||||
name = "checkered suit jacket"
|
||||
desc = "Lucky suit jacket."
|
||||
icon_state = "checkered_jacket"
|
||||
icon_state = "checkered_jacket"
|
||||
|
||||
/obj/item/clothing/accessory/chaps
|
||||
name = "brown chaps"
|
||||
desc = "A pair of loose, brown leather chaps."
|
||||
icon_state = "chaps"
|
||||
|
||||
/obj/item/clothing/accessory/chaps/black
|
||||
name = "black chaps"
|
||||
desc = "A pair of loose, black leather chaps."
|
||||
icon_state = "chaps_black"
|
||||
|
||||
/*
|
||||
* Poncho
|
||||
*/
|
||||
/obj/item/clothing/accessory/poncho
|
||||
name = "poncho"
|
||||
desc = "A simple, comfortable poncho."
|
||||
icon_state = "classicponcho"
|
||||
item_state = "classicponcho"
|
||||
icon_override = 'icons/mob/ties.dmi'
|
||||
var/fire_resist = T0C+100
|
||||
allowed = list(/obj/item/weapon/tank/emergency_oxygen)
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
slot_flags = SLOT_OCLOTHING | SLOT_TIE
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
siemens_coefficient = 0.9
|
||||
w_class = 3
|
||||
slot = "over"
|
||||
|
||||
sprite_sheets = list(
|
||||
"Teshari" = 'icons/mob/species/seromi/suit.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/accessory/poncho/green
|
||||
name = "green poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is green."
|
||||
icon_state = "greenponcho"
|
||||
item_state = "greenponcho"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/red
|
||||
name = "red poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is red."
|
||||
icon_state = "redponcho"
|
||||
item_state = "redponcho"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/purple
|
||||
name = "purple poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is purple."
|
||||
icon_state = "purpleponcho"
|
||||
item_state = "purpleponcho"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/blue
|
||||
name = "blue poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is blue."
|
||||
icon_state = "blueponcho"
|
||||
item_state = "blueponcho"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/security
|
||||
name = "security poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is black and red, standard NanoTrasen Security colors."
|
||||
icon_state = "secponcho"
|
||||
item_state = "secponcho"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/medical
|
||||
name = "medical poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is white with green and blue tint, standard Medical colors."
|
||||
icon_state = "medponcho"
|
||||
item_state = "medponcho"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/engineering
|
||||
name = "engineering poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is yellow and orange, standard Engineering colors."
|
||||
icon_state = "engiponcho"
|
||||
item_state = "engiponcho"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/science
|
||||
name = "science poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is white with purple trim, standard NanoTrasen Science colors."
|
||||
icon_state = "sciponcho"
|
||||
item_state = "sciponcho"
|
||||
|
||||
/obj/item/clothing/accessory/poncho/roles/cargo
|
||||
name = "cargo poncho"
|
||||
desc = "A simple, comfortable cloak without sleeves. This one is tan and grey, the colors of Cargo."
|
||||
icon_state = "cargoponcho"
|
||||
item_state = "cargoponcho"
|
||||
@@ -7,8 +7,8 @@
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define.
|
||||
desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"."
|
||||
name = "captain's jumpsuit"
|
||||
desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Station Administrator\"."
|
||||
name = "station administrator's jumpsuit"
|
||||
icon_state = "captain"
|
||||
rolled_sleeves = 0
|
||||
|
||||
|
||||
@@ -33,6 +33,14 @@
|
||||
icon_state = "waiter"
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/customs
|
||||
name = "customs uniform"
|
||||
desc = "A standard SolGov customs uniform. Complete with epaulettes."
|
||||
icon_state = "cu_suit"
|
||||
|
||||
/obj/item/clothing/under/customs/khaki
|
||||
icon_state = "cu_suit_kh"
|
||||
|
||||
/obj/item/clothing/under/rank/mailman
|
||||
name = "mailman's jumpsuit"
|
||||
desc = "<i>'Special delivery!'</i>"
|
||||
@@ -145,7 +153,7 @@
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/gimmick/rank/captain/suit
|
||||
name = "captain's suit"
|
||||
name = "station administrator's suit"
|
||||
desc = "A green suit and yellow necktie. Exemplifies authority."
|
||||
icon_state = "green_suit"
|
||||
item_state_slots = list(slot_r_hand_str = "centcom", slot_l_hand_str = "centcom")
|
||||
@@ -217,6 +225,7 @@
|
||||
desc = "Includes shoes and plaid"
|
||||
icon_state = "kilt"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|FEET
|
||||
rolled_sleeves = 0
|
||||
|
||||
/obj/item/clothing/under/sexymime
|
||||
name = "sexy mime outfit"
|
||||
@@ -253,7 +262,7 @@
|
||||
/obj/item/clothing/under/dress/stripeddress
|
||||
name = "striped dress"
|
||||
desc = "Fashion in space."
|
||||
icon_state = "striped_dress"
|
||||
icon_state = "striped_dress"
|
||||
|
||||
/obj/item/clothing/under/dress/sailordress
|
||||
name = "sailor dress"
|
||||
@@ -307,8 +316,8 @@
|
||||
item_state_slots = list(slot_r_hand_str = "dress_white", slot_l_hand_str = "dress_white")
|
||||
|
||||
/obj/item/clothing/under/dress/dress_cap
|
||||
name = "captain's dress uniform"
|
||||
desc = "Feminine fashion for the style concious captain."
|
||||
name = "station administrator's dress uniform"
|
||||
desc = "Feminine fashion for the style concious Station Administrator."
|
||||
icon_state = "dress_cap"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
|
||||
@@ -374,8 +383,8 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
|
||||
/obj/item/clothing/under/captainformal
|
||||
name = "captain's formal uniform"
|
||||
desc = "A captain's formal-wear, for special occasions."
|
||||
name = "station administrator's formal uniform"
|
||||
desc = "A Station Administrator's formal-wear, for special occasions."
|
||||
icon_state = "captain_formal"
|
||||
item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue")
|
||||
|
||||
@@ -529,7 +538,7 @@
|
||||
name = "fancy dark red dress"
|
||||
desc = "A short, red dress with a black belt. Fancy."
|
||||
icon_state = "darkreddress"
|
||||
|
||||
|
||||
/*
|
||||
* swimsuit
|
||||
*/
|
||||
@@ -566,7 +575,7 @@
|
||||
desc = "An oldfashioned red swimsuit."
|
||||
icon_state = "swim_red"
|
||||
siemens_coefficient = 1
|
||||
|
||||
|
||||
/*
|
||||
* pyjamas
|
||||
*/
|
||||
@@ -583,7 +592,7 @@
|
||||
icon_state = "red_pyjamas"
|
||||
item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red")
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
|
||||
|
||||
|
||||
/obj/item/clothing/under/stripper
|
||||
body_parts_covered = 0
|
||||
|
||||
@@ -598,7 +607,7 @@
|
||||
desc = "A rather skimpy green swimsuit."
|
||||
icon_state = "stripper_g_under"
|
||||
siemens_coefficient = 1
|
||||
|
||||
|
||||
/obj/item/clothing/under/stripper/mankini
|
||||
name = "mankini"
|
||||
desc = "No honest man would wear this abomination"
|
||||
|
||||
@@ -82,6 +82,16 @@
|
||||
desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station."
|
||||
icon_state = "camopants"
|
||||
|
||||
/obj/item/clothing/under/pants/chaps
|
||||
name = "sexy brown chaps"
|
||||
desc = "A pair of sexy, tight brown leather chaps."
|
||||
icon_state = "chapsb"
|
||||
|
||||
/obj/item/clothing/under/pants/chaps/black
|
||||
name = "sexy black chaps"
|
||||
desc = "A pair of sexy, tight black leather chaps."
|
||||
icon_state = "chapsbl"
|
||||
|
||||
/*
|
||||
* Baggy Pants
|
||||
*/
|
||||
|
||||
@@ -83,6 +83,11 @@
|
||||
name = "khaki short shorts"
|
||||
icon_state = "khaki_shorts_f"
|
||||
|
||||
/obj/item/clothing/under/shorts/loincloth
|
||||
name = "loincloth"
|
||||
desc = "A piece of cloth wrapped around the waist."
|
||||
icon_state = "loincloth"
|
||||
|
||||
//Argh, skirts be below this line -> ------------------------------
|
||||
|
||||
/obj/item/clothing/under/skirt
|
||||
@@ -128,50 +133,50 @@
|
||||
desc = "A preppy red skirt with a white blouse."
|
||||
icon_state = "plaid_red"
|
||||
item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red")
|
||||
|
||||
|
||||
/obj/item/clothing/under/skirt/plaid_purple
|
||||
name = "blue purple skirt"
|
||||
desc = "A preppy purple skirt with a white blouse."
|
||||
icon_state = "plaid_purple"
|
||||
item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple")
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/cargo/skirt
|
||||
name = "quartermaster's jumpskirt"
|
||||
desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper."
|
||||
icon_state = "qmf"
|
||||
item_state_slots = list(slot_r_hand_str = "qm", slot_l_hand_str = "qm")
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/cargotech/skirt
|
||||
name = "cargo technician's jumpskirt"
|
||||
desc = "Skirrrrrts! They're comfy and easy to wear!"
|
||||
icon_state = "cargof"
|
||||
item_state_slots = list(slot_r_hand_str = "cargo", slot_l_hand_str = "cargo")
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/engineer/skirt
|
||||
desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding."
|
||||
name = "engineer's jumpskirt"
|
||||
icon_state = "enginef"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
|
||||
item_state_slots = list(slot_r_hand_str = "engine", slot_l_hand_str = "engine")
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/chief_engineer/skirt
|
||||
desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding."
|
||||
name = "chief engineer's jumpskirt"
|
||||
icon_state = "chieff"
|
||||
item_state_slots = list(slot_r_hand_str = "chiefengineer", slot_l_hand_str = "chiefengineer")
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/atmospheric_technician/skirt
|
||||
desc = "It's a jumpskirt worn by atmospheric technicians."
|
||||
name = "atmospheric technician's jumpskirt"
|
||||
icon_state = "atmosf"
|
||||
item_state_slots = list(slot_r_hand_str = "atmos", slot_l_hand_str = "atmos")
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/roboticist/skirt
|
||||
desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work."
|
||||
name = "roboticist's jumpskirt"
|
||||
icon_state = "roboticsf"
|
||||
item_state_slots = list(slot_r_hand_str = "robotics", slot_l_hand_str = "robotics")
|
||||
|
||||
|
||||
/obj/item/clothing/under/rank/scientist/skirt
|
||||
name = "scientist's jumpskirt"
|
||||
icon_state = "sciencef"
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
var/report_num = 0
|
||||
|
||||
/obj/machinery/dnaforensics/New()
|
||||
circuit = new circuit(src)
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
user << "<span class='warning'>The [initial(name)] is dry!</span>"
|
||||
else
|
||||
user.visible_message("\The [user] starts to wipe down [A] with [src]!")
|
||||
reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping.
|
||||
//reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping.
|
||||
update_name()
|
||||
if(do_after(user,30))
|
||||
user.visible_message("\The [user] finishes wiping off the [A]!")
|
||||
|
||||
@@ -80,24 +80,7 @@ log transactions
|
||||
return 1
|
||||
|
||||
/obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
|
||||
user << "<span class='notice'>You start disconnecting the monitor.</span>"
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
if(do_after(user, 20))
|
||||
var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
|
||||
var/obj/item/weapon/circuitboard/M = new circuit( A )
|
||||
A.frame_type = "atm"
|
||||
A.pixel_x = pixel_x
|
||||
A.pixel_y = pixel_y
|
||||
A.circuit = M
|
||||
A.anchored = 1
|
||||
for (var/obj/C in src)
|
||||
C.forceMove(loc)
|
||||
user << "<span class='notice'>You disconnect the monitor.</span>"
|
||||
A.state = 4
|
||||
A.icon_state = "atm_4"
|
||||
M.deconstruct(src)
|
||||
qdel(src)
|
||||
if(computer_deconstruction_screwdriver(user, I))
|
||||
return
|
||||
if(istype(I, /obj/item/weapon/card))
|
||||
if(emagged > 0)
|
||||
@@ -131,7 +114,7 @@ log transactions
|
||||
T.amount = I:worth
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
|
||||
user << "<span class='info'>You insert [I] into [src].</span>"
|
||||
@@ -260,7 +243,7 @@ log transactions
|
||||
T.purpose = transfer_purpose
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
T.amount = "([transfer_amount])"
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
else
|
||||
@@ -302,7 +285,7 @@ log transactions
|
||||
T.purpose = "Unauthorised login attempt"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
failed_account.transaction_log.Add(T)
|
||||
else
|
||||
usr << "\red \icon[src] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining."
|
||||
@@ -322,7 +305,7 @@ log transactions
|
||||
T.purpose = "Remote terminal access"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
|
||||
usr << "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'"
|
||||
@@ -350,7 +333,7 @@ log transactions
|
||||
T.amount = "([amount])"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
else
|
||||
usr << "\icon[src]<span class='warning'>You don't have enough funds to do that!</span>"
|
||||
@@ -375,7 +358,7 @@ log transactions
|
||||
T.amount = "([amount])"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
else
|
||||
usr << "\icon[src]<span class='warning'>You don't have enough funds to do that!</span>"
|
||||
@@ -387,7 +370,7 @@ log transactions
|
||||
R.info += "<i>Account holder:</i> [authenticated_account.owner_name]<br>"
|
||||
R.info += "<i>Account number:</i> [authenticated_account.account_number]<br>"
|
||||
R.info += "<i>Balance:</i> $[authenticated_account.money]<br>"
|
||||
R.info += "<i>Date and time:</i> [worldtime2text()], [current_date_string]<br><br>"
|
||||
R.info += "<i>Date and time:</i> [stationtime2text()], [current_date_string]<br><br>"
|
||||
R.info += "<i>Service terminal ID:</i> [machine_id]<br>"
|
||||
|
||||
//stamp the paper
|
||||
@@ -410,7 +393,7 @@ log transactions
|
||||
R.info = "<b>Transaction logs</b><br>"
|
||||
R.info += "<i>Account holder:</i> [authenticated_account.owner_name]<br>"
|
||||
R.info += "<i>Account number:</i> [authenticated_account.account_number]<br>"
|
||||
R.info += "<i>Date and time:</i> [worldtime2text()], [current_date_string]<br><br>"
|
||||
R.info += "<i>Date and time:</i> [stationtime2text()], [current_date_string]<br><br>"
|
||||
R.info += "<i>Service terminal ID:</i> [machine_id]<br>"
|
||||
R.info += "<table border=1 style='width:100%'>"
|
||||
R.info += "<tr>"
|
||||
@@ -486,7 +469,7 @@ log transactions
|
||||
T.purpose = "Remote terminal access"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
authenticated_account.transaction_log.Add(T)
|
||||
|
||||
view_screen = NO_SCREEN
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
M.account_number = rand(111111, 999999)
|
||||
else
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
T.source_terminal = source_db.machine_id
|
||||
|
||||
M.account_number = next_account_number
|
||||
@@ -57,7 +57,7 @@
|
||||
R.info += "<i>Account number:</i> [M.account_number]<br>"
|
||||
R.info += "<i>Account pin:</i> [M.remote_access_pin]<br>"
|
||||
R.info += "<i>Starting balance:</i> $[M.money]<br>"
|
||||
R.info += "<i>Date and time:</i> [worldtime2text()], [current_date_string]<br><br>"
|
||||
R.info += "<i>Date and time:</i> [stationtime2text()], [current_date_string]<br><br>"
|
||||
R.info += "<i>Creation terminal ID:</i> [source_db.machine_id]<br>"
|
||||
R.info += "<i>Authorised NT officer overseeing creation:</i> [source_db.held_card.registered_name]<br>"
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
for(var/datum/money_account/D in all_money_accounts)
|
||||
if(D.account_number == attempt_account_number && !D.suspended)
|
||||
D.money += amount
|
||||
|
||||
|
||||
//create a transaction log entry
|
||||
var/datum/transaction/T = new()
|
||||
T.target_name = source_name
|
||||
@@ -90,12 +90,12 @@
|
||||
else
|
||||
T.amount = "[amount]"
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
T.source_terminal = terminal_id
|
||||
D.transaction_log.Add(T)
|
||||
|
||||
|
||||
return 1
|
||||
|
||||
|
||||
return 0
|
||||
|
||||
//this returns the first account datum that matches the supplied accnum/pin combination, it returns null if the combination did not match any account
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
T.purpose = reason
|
||||
T.amount = amount
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
T.source_terminal = machine_id
|
||||
return T
|
||||
|
||||
|
||||
@@ -140,7 +140,7 @@
|
||||
T.amount = transaction_amount
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
linked_account.transaction_log.Add(T)
|
||||
else
|
||||
usr << "\icon[src]<span class='warning'>\The [O] doesn't have that much money!</span>"
|
||||
@@ -264,7 +264,7 @@
|
||||
T.amount = "[transaction_amount]"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
D.transaction_log.Add(T)
|
||||
//
|
||||
T = new()
|
||||
@@ -273,7 +273,7 @@
|
||||
T.amount = "[transaction_amount]"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
linked_account.transaction_log.Add(T)
|
||||
else
|
||||
usr << "\icon[src]<span class='warning'>You don't have that much money!</span>"
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
[pick("playwright","author","director","actor","TV star")] [random_name(pick(MALE,FEMALE))] comes the latest sensation: '\
|
||||
[pick("Deadly","The last","Lost","Dead")] [pick("Starships","Warriors","outcasts","Tajarans","Unathi","Skrell")] \
|
||||
[pick("of","from","raid","go hunting on","visit","ravage","pillage","destroy")] \
|
||||
[pick("Moghes","Earth","Biesel","Ahdomai","S'randarr","the Void","the Edge of Space")]'.\
|
||||
[pick("Moghes","Earth","Biesel","Meralar","Rarkajar","the Void","the Edge of Space")]'.\
|
||||
. Own it on webcast today, or visit the galactic premier on [affected_dest.name]!"
|
||||
|
||||
if(BIG_GAME_HUNTERS)
|
||||
|
||||
@@ -256,7 +256,7 @@
|
||||
T.amount = "([transaction_amount])"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
D.transaction_log.Add(T)
|
||||
|
||||
// Create log entry in owner's account
|
||||
@@ -266,7 +266,7 @@
|
||||
T.amount = "[transaction_amount]"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
linked_account.transaction_log.Add(T)
|
||||
|
||||
// Save log
|
||||
@@ -304,7 +304,7 @@
|
||||
T.amount = "[transaction_amount]"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
linked_account.transaction_log.Add(T)
|
||||
|
||||
// Save log
|
||||
@@ -414,7 +414,7 @@
|
||||
<tr></tr>
|
||||
<tr><td class="tx-name">Customer</td><td class="tx-data">[c_name]</td></tr>
|
||||
<tr><td class="tx-name">Pay Method</td><td class="tx-data">[p_method]</td></tr>
|
||||
<tr><td class="tx-name">Station Time</td><td class="tx-data">[worldtime2text()]</td></tr>
|
||||
<tr><td class="tx-name">Station Time</td><td class="tx-data">[stationtime2text()]</td></tr>
|
||||
</table>
|
||||
<table width=300>
|
||||
"}
|
||||
|
||||
@@ -231,7 +231,7 @@
|
||||
T.amount = "([transaction_amount])"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
D.transaction_log.Add(T)
|
||||
|
||||
// Create log entry in owner's account
|
||||
@@ -241,7 +241,7 @@
|
||||
T.amount = "[transaction_amount]"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
linked_account.transaction_log.Add(T)
|
||||
|
||||
// Save log
|
||||
@@ -274,7 +274,7 @@
|
||||
T.amount = "[transaction_amount]"
|
||||
T.source_terminal = machine_id
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
linked_account.transaction_log.Add(T)
|
||||
|
||||
// Save log
|
||||
@@ -348,7 +348,7 @@
|
||||
<tr></tr>
|
||||
<tr><td class="tx-name">Customer</td><td class="tx-data">[c_name]</td></tr>
|
||||
<tr><td class="tx-name">Pay Method</td><td class="tx-data">[p_method]</td></tr>
|
||||
<tr><td class="tx-name">Station Time</td><td class="tx-data">[worldtime2text()]</td></tr>
|
||||
<tr><td class="tx-name">Station Time</td><td class="tx-data">[stationtime2text()]</td></tr>
|
||||
</table>
|
||||
<table width=300>
|
||||
"}
|
||||
|
||||
9
code/modules/error_handler/_defines.dm
Normal file
9
code/modules/error_handler/_defines.dm
Normal file
@@ -0,0 +1,9 @@
|
||||
// Settings for the error handler and error viewer
|
||||
|
||||
#define ERROR_COOLDOWN 600 // The "cooldown" time for each occurrence of a unique error
|
||||
#define ERROR_LIMIT 9 // How many occurrences before the next will silence them
|
||||
#define ERROR_MAX_COOLDOWN (ERROR_COOLDOWN * ERROR_LIMIT)
|
||||
#define ERROR_SILENCE_TIME 6000 // How long a unique error will be silenced for
|
||||
|
||||
// How long to wait between messaging admins about occurrences of a unique error
|
||||
#define ERROR_MSG_DELAY 50
|
||||
118
code/modules/error_handler/error_handler.dm
Normal file
118
code/modules/error_handler/error_handler.dm
Normal file
@@ -0,0 +1,118 @@
|
||||
var/list/error_last_seen = list()
|
||||
// error_cooldown items will either be positive (cooldown time) or negative (silenced error)
|
||||
// If negative, starts at -1, and goes down by 1 each time that error gets skipped
|
||||
var/list/error_cooldown = list()
|
||||
var/total_runtimes = 0
|
||||
var/total_runtimes_skipped = 0
|
||||
// The ifdef needs to be down here, since the error viewer references total_runtimes
|
||||
#ifdef DEBUG
|
||||
/world/Error(var/exception/e, var/datum/e_src)
|
||||
if(!istype(e)) // Something threw an unusual exception
|
||||
log_to_dd("\[[time_stamp()]] Uncaught exception: [e]")
|
||||
return ..()
|
||||
if(!error_last_seen) // A runtime is occurring too early in start-up initialization
|
||||
return ..()
|
||||
total_runtimes++
|
||||
|
||||
var/erroruid = "[e.file][e.line]"
|
||||
var/last_seen = error_last_seen[erroruid]
|
||||
var/cooldown = error_cooldown[erroruid] || 0
|
||||
if(last_seen == null) // A new error!
|
||||
error_last_seen[erroruid] = world.time
|
||||
last_seen = world.time
|
||||
if(cooldown < 0)
|
||||
error_cooldown[erroruid]-- // Used to keep track of skip count for this error
|
||||
total_runtimes_skipped++
|
||||
return // Error is currently silenced, skip handling it
|
||||
|
||||
// Handle cooldowns and silencing spammy errors
|
||||
var/silencing = 0
|
||||
// Each occurrence of a unique error adds to its "cooldown" time...
|
||||
cooldown = max(0, cooldown - (world.time - last_seen)) + ERROR_COOLDOWN
|
||||
// ... which is used to silence an error if it occurs too often, too fast
|
||||
if(cooldown > ERROR_MAX_COOLDOWN)
|
||||
cooldown = -1
|
||||
silencing = 1
|
||||
spawn(0)
|
||||
usr = null
|
||||
sleep(ERROR_SILENCE_TIME)
|
||||
var/skipcount = abs(error_cooldown[erroruid]) - 1
|
||||
error_cooldown[erroruid] = 0
|
||||
if(skipcount > 0)
|
||||
log_to_dd("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file],[e.line].")
|
||||
error_cache.logError(e, skipCount = skipcount)
|
||||
error_last_seen[erroruid] = world.time
|
||||
error_cooldown[erroruid] = cooldown
|
||||
|
||||
// The detailed error info needs some tweaking to make it look nice
|
||||
var/list/srcinfo = null
|
||||
var/list/usrinfo = null
|
||||
var/locinfo
|
||||
// First, try to make better src/usr info lines
|
||||
if(istype(e_src))
|
||||
srcinfo = list(" src: [log_info_line(e_src)]")
|
||||
locinfo = log_info_line(e_src)
|
||||
if(locinfo)
|
||||
srcinfo += " src.loc: [locinfo]"
|
||||
if(istype(usr))
|
||||
usrinfo = list(" usr: [log_info_line(usr)]")
|
||||
locinfo = log_info_line(usr)
|
||||
if(locinfo)
|
||||
usrinfo += " usr.loc: [locinfo]"
|
||||
// The proceeding mess will almost definitely break if error messages are ever changed
|
||||
// I apologize in advance
|
||||
var/list/splitlines = splittext(e.desc, "\n")
|
||||
var/list/desclines = list()
|
||||
if(splitlines.len > 2) // If there aren't at least three lines, there's no info
|
||||
for(var/line in splitlines)
|
||||
if(length(line) < 3)
|
||||
continue // Blank line, skip it
|
||||
if(findtext(line, "source file:"))
|
||||
continue // Redundant, skip it
|
||||
if(findtext(line, "usr.loc:"))
|
||||
continue // Our usr.loc is better, skip it
|
||||
if(findtext(line, "usr:"))
|
||||
if(usrinfo)
|
||||
desclines.Add(usrinfo)
|
||||
usrinfo = null
|
||||
continue // Our usr info is better, replace it
|
||||
if(srcinfo)
|
||||
if(findtext(line, "src.loc:"))
|
||||
continue
|
||||
if(findtext(line, "src:"))
|
||||
desclines.Add(srcinfo)
|
||||
srcinfo = null
|
||||
continue
|
||||
if(copytext(line, 1, 3) != " ")
|
||||
desclines += (" " + line) // Pad any unpadded lines, so they look pretty
|
||||
else
|
||||
desclines += line
|
||||
if(srcinfo) // If these aren't null, they haven't been added yet
|
||||
desclines.Add(srcinfo)
|
||||
if(usrinfo)
|
||||
desclines.Add(usrinfo)
|
||||
if(silencing)
|
||||
desclines += " (This error will now be silenced for [ERROR_SILENCE_TIME / 600] minutes)"
|
||||
|
||||
// Now to actually output the error info...
|
||||
log_to_dd("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]")
|
||||
for(var/line in desclines)
|
||||
log_to_dd(line)
|
||||
if(error_cache)
|
||||
error_cache.logError(e, desclines, e_src = e_src)
|
||||
|
||||
#endif
|
||||
|
||||
/proc/log_runtime(exception/e, datum/e_src, extra_info)
|
||||
if(!istype(e))
|
||||
world.Error(e, e_src)
|
||||
return
|
||||
|
||||
if(extra_info)
|
||||
// Adding extra info adds two newlines, because parsing runtimes is funky
|
||||
if(islist(extra_info))
|
||||
e.desc = " [jointext(extra_info, "\n ")]\n\n" + e.desc
|
||||
else
|
||||
e.desc = " [extra_info]\n\n" + e.desc
|
||||
|
||||
world.Error(e, e_src)
|
||||
206
code/modules/error_handler/error_viewer.dm
Normal file
206
code/modules/error_handler/error_viewer.dm
Normal file
@@ -0,0 +1,206 @@
|
||||
// Error viewing datums, responsible for storing error info, notifying admins
|
||||
// when errors occur, and showing them to admins on demand.
|
||||
|
||||
// There are 3 different types used here:
|
||||
//
|
||||
// - ErrorCache keeps track of all error sources, as well as all individually
|
||||
// logged errors. Only one instance of this datum should ever exist, and it's
|
||||
// right here:
|
||||
|
||||
#ifdef DEBUG
|
||||
var/global/datum/ErrorViewer/ErrorCache/error_cache = new()
|
||||
#else
|
||||
// If debugging is disabled, there's nothing useful to log, so don't bother.
|
||||
var/global/datum/ErrorViewer/ErrorCache/error_cache = null
|
||||
#endif
|
||||
|
||||
// - ErrorSource datums exist for each line (of code) that generates an error,
|
||||
// and keep track of all errors generated by that line.
|
||||
//
|
||||
// - ErrorEntry datums exist for each logged error, and keep track of all
|
||||
// relevant info about that error.
|
||||
|
||||
// Common vars and procs are kept at the ErrorViewer level
|
||||
/datum/ErrorViewer/
|
||||
var/name = ""
|
||||
|
||||
/datum/ErrorViewer/proc/browseTo(var/user, var/html)
|
||||
if(user)
|
||||
var/datum/browser/popup = new(user, "error_viewer", "Runtime Viewer", 700, 500)
|
||||
popup.add_head_content({"<style>
|
||||
.runtime{
|
||||
background-color: #171717;
|
||||
border: solid 1px #202020;
|
||||
font-family:'Courier New',monospace;
|
||||
font-size:9pt;
|
||||
color: #DDDDDD;
|
||||
}
|
||||
p.runtime_list{
|
||||
font-family:'Courier New',monospace;
|
||||
font-size:9pt;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
text-indent:-13ch;
|
||||
margin-left:13ch;
|
||||
}
|
||||
</style>"})
|
||||
popup.set_content(html)
|
||||
popup.open(0)
|
||||
|
||||
/datum/ErrorViewer/proc/buildHeader(var/datum/ErrorViewer/back_to, var/linear, var/refreshable)
|
||||
// Common starter HTML for showTo
|
||||
var/html = ""
|
||||
|
||||
if(istype(back_to))
|
||||
html += "[back_to.makeLink("<<<", null, linear)] "
|
||||
if(refreshable)
|
||||
html += "[makeLink("Refresh", null, linear)]"
|
||||
if(html)
|
||||
html += "<br><br>"
|
||||
return html
|
||||
|
||||
/datum/ErrorViewer/proc/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear)
|
||||
// Specific to each child type
|
||||
return
|
||||
|
||||
/datum/ErrorViewer/proc/makeLink(var/linktext, var/datum/ErrorViewer/back_to, var/linear)
|
||||
var/back_to_param = ""
|
||||
if(!linktext)
|
||||
linktext = name
|
||||
if(istype(back_to))
|
||||
back_to_param = ";viewruntime_backto=\ref[back_to]"
|
||||
if(linear)
|
||||
back_to_param += ";viewruntime_linear=1"
|
||||
return "<A HREF='?src=\ref[src];viewruntime=\ref[src][back_to_param]'>[html_encode(linktext)]</A>"
|
||||
|
||||
/datum/ErrorViewer/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["viewruntime_backto"])
|
||||
showTo(usr, locate(href_list["viewruntime_backto"]), href_list["viewruntime_linear"])
|
||||
else
|
||||
showTo(usr, null, href_list["viewruntime_linear"])
|
||||
|
||||
/datum/ErrorViewer/ErrorCache
|
||||
var/list/errors = list()
|
||||
var/list/error_sources = list()
|
||||
var/list/errors_silenced = list()
|
||||
|
||||
/datum/ErrorViewer/ErrorCache/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear)
|
||||
var/html = buildHeader(null, linear, refreshable=1)
|
||||
html += "[total_runtimes] runtimes, [total_runtimes_skipped] skipped<br><br>"
|
||||
if(!linear)
|
||||
html += "organized | [makeLink("linear", null, 1)]<hr>"
|
||||
var/datum/ErrorViewer/ErrorSource/error_source
|
||||
for(var/erroruid in error_sources)
|
||||
error_source = error_sources[erroruid]
|
||||
html += "<p class='runtime_list'>[error_source.makeLink(null, src)]<br></p>"
|
||||
else
|
||||
html += "[makeLink("organized", null)] | linear<hr>"
|
||||
for(var/datum/ErrorViewer/ErrorEntry/error_entry in errors)
|
||||
html += "<p class='runtime_list'>[error_entry.makeLink(null, src, 1)]<br></p>"
|
||||
browseTo(user, html)
|
||||
|
||||
/datum/ErrorViewer/ErrorCache/proc/logError(var/exception/e, var/list/desclines, var/skipCount, var/datum/e_src)
|
||||
if(!istype(e))
|
||||
return // Abnormal exception, don't even bother
|
||||
|
||||
var/erroruid = "[e.file][e.line]"
|
||||
var/datum/ErrorViewer/ErrorSource/error_source = error_sources[erroruid]
|
||||
if(!error_source)
|
||||
error_source = new(e)
|
||||
error_sources[erroruid] = error_source
|
||||
|
||||
var/datum/ErrorViewer/ErrorEntry/error_entry = new(e, desclines, skipCount, e_src)
|
||||
error_entry.error_source = error_source
|
||||
errors += error_entry
|
||||
error_source.errors += error_entry
|
||||
if(skipCount)
|
||||
return // Skip notifying admins about skipped errors
|
||||
|
||||
// Show the error to admins with debug messages turned on, but only if one
|
||||
// from the same source hasn't been shown too recently
|
||||
// (Also, make sure config is initialized, or log_debug will runtime)
|
||||
if(config && error_source.next_message_at <= world.time)
|
||||
var/const/viewtext = "\[view]" // Nesting these in other brackets went poorly
|
||||
log_debug("Runtime in [e.file],[e.line]: [html_encode(e.name)] [error_entry.makeLink(viewtext)]")
|
||||
error_source.next_message_at = world.time + ERROR_MSG_DELAY
|
||||
|
||||
/datum/ErrorViewer/ErrorSource
|
||||
var/list/errors = list()
|
||||
var/next_message_at = 0
|
||||
|
||||
/datum/ErrorViewer/ErrorSource/New(var/exception/e)
|
||||
if(!istype(e))
|
||||
name = "\[[time_stamp()]] Uncaught exceptions"
|
||||
return
|
||||
name = "\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]"
|
||||
|
||||
/datum/ErrorViewer/ErrorSource/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear)
|
||||
if(!istype(back_to))
|
||||
back_to = error_cache
|
||||
var/html = buildHeader(back_to, refreshable=1)
|
||||
for(var/datum/ErrorViewer/ErrorEntry/error_entry in errors)
|
||||
html += "<p class='runtime_list'>[error_entry.makeLink(null, src)]<br></p>"
|
||||
browseTo(user, html)
|
||||
|
||||
/datum/ErrorViewer/ErrorEntry
|
||||
var/datum/ErrorViewer/ErrorSource/error_source
|
||||
var/exception/exc
|
||||
var/desc = ""
|
||||
var/srcRef
|
||||
var/srcType
|
||||
var/turf/srcLoc
|
||||
var/usrRef
|
||||
var/turf/usrLoc
|
||||
var/isSkipCount
|
||||
|
||||
/datum/ErrorViewer/ErrorEntry/New(var/exception/e, var/list/desclines, var/skipCount, var/datum/e_src)
|
||||
if(!istype(e))
|
||||
name = "\[[time_stamp()]] Uncaught exception: [e]"
|
||||
return
|
||||
if(skipCount)
|
||||
name = "\[[time_stamp()]] Skipped [skipCount] runtimes in [e.file],[e.line]."
|
||||
isSkipCount = TRUE
|
||||
return
|
||||
name = "\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]"
|
||||
exc = e
|
||||
if(istype(desclines))
|
||||
for(var/line in desclines)
|
||||
// There's probably a better way to do this than non-breaking spaces...
|
||||
desc += " " + html_encode(line) + "<br>"
|
||||
if(istype(e_src))
|
||||
srcRef = "\ref[e_src]"
|
||||
srcType = e_src.type
|
||||
srcLoc = get_turf(e_src)
|
||||
if(usr)
|
||||
usrRef = "\ref[usr]"
|
||||
usrLoc = get_turf(usr)
|
||||
|
||||
/datum/ErrorViewer/ErrorEntry/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear)
|
||||
if(!istype(back_to))
|
||||
back_to = error_source
|
||||
var/html = buildHeader(back_to, linear)
|
||||
html += "<div class='runtime'>[html_encode(name)]<br>[desc]</div>"
|
||||
if(srcRef)
|
||||
html += "<br>src: <a href='?_src_=vars;Vars=[srcRef]'>VV</a>"
|
||||
if(ispath(srcType, /mob))
|
||||
html += " <a href='?_src_=holder;adminplayeropts=[srcRef]'>PP</a>"
|
||||
html += " <a href='?_src_=holder;adminplayerobservefollow=[srcRef]'>Follow</a>"
|
||||
if(istype(srcLoc))
|
||||
html += "<br>src.loc: <a href='?_src_=vars;Vars=\ref[srcLoc]'>VV</a>"
|
||||
html += " <a href='?_src_=holder;adminplayerobservecoodjump=1;X=[srcLoc.x];Y=[srcLoc.y];Z=[srcLoc.z]'>JMP</a>"
|
||||
if(usrRef)
|
||||
html += "<br>usr: <a href='?_src_=vars;Vars=[usrRef]'>VV</a>"
|
||||
html += " <a href='?_src_=holder;adminplayeropts=[usrRef]'>PP</a>"
|
||||
html += " <a href='?_src_=holder;adminplayerobservefollow=[usrRef]'>Follow</a>"
|
||||
if(istype(usrLoc))
|
||||
html += "<br>usr.loc: <a href='?_src_=vars;Vars=\ref[usrLoc]'>VV</a>"
|
||||
html += " <a href='?_src_=holder;adminplayerobservecoodjump=1;X=[usrLoc.x];Y=[usrLoc.y];Z=[usrLoc.z]'>JMP</a>"
|
||||
browseTo(user, html)
|
||||
|
||||
/datum/ErrorViewer/ErrorEntry/makeLink(var/linktext, var/datum/ErrorViewer/back_to, var/linear)
|
||||
if(isSkipCount)
|
||||
return html_encode(name)
|
||||
else
|
||||
return ..()
|
||||
6
code/modules/error_handler/~defines.dm
Normal file
6
code/modules/error_handler/~defines.dm
Normal file
@@ -0,0 +1,6 @@
|
||||
// Settings for the error handler and error viewer
|
||||
#undef ERROR_COOLDOWN
|
||||
#undef ERROR_LIMIT
|
||||
#undef ERROR_MAX_COOLDOWN
|
||||
#undef ERROR_SILENCE_TIME
|
||||
#undef ERROR_MSG_DELAY
|
||||
@@ -44,7 +44,7 @@
|
||||
if(EM.add_to_queue)
|
||||
EC.available_events += EM
|
||||
|
||||
log_debug("Event '[EM.name]' has completed at [worldtime2text()].")
|
||||
log_debug("Event '[EM.name]' has completed at [worldtime2stationtime(world.time)].")
|
||||
|
||||
/datum/event_manager/proc/delay_events(var/severity, var/delay)
|
||||
var/list/datum/event_container/EC = event_containers[severity]
|
||||
@@ -67,12 +67,12 @@
|
||||
var/datum/event_meta/EM = E.event_meta
|
||||
if(EM.name == "Nothing")
|
||||
continue
|
||||
var/message = "'[EM.name]' began at [worldtime2text(E.startedAt)] "
|
||||
var/message = "'[EM.name]' began at [worldtime2stationtime(E.startedAt)] "
|
||||
if(E.isRunning)
|
||||
message += "and is still running."
|
||||
else
|
||||
if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes
|
||||
message += "and ended at [worldtime2text(E.endedAt)]."
|
||||
message += "and ended at [worldtime2stationtime(E.endedAt)]."
|
||||
else
|
||||
message += "and ran to completion."
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
var/next_event_at = max(0, EC.next_event_time - world.time)
|
||||
html += "<tr>"
|
||||
html += "<td>[severity_to_string[severity]]</td>"
|
||||
html += "<td>[worldtime2text(max(EC.next_event_time, world.time))]</td>"
|
||||
html += "<td>[worldtime2stationtime(max(EC.next_event_time, world.time))]</td>"
|
||||
html += "<td>[round(next_event_at / 600, 0.1)]</td>"
|
||||
html += "<td>"
|
||||
html += "<A align='right' href='?src=\ref[src];dec_timer=2;event=\ref[EC]'>--</A>"
|
||||
@@ -178,7 +178,7 @@
|
||||
html += "<tr>"
|
||||
html += "<td>[severity_to_string[EM.severity]]</td>"
|
||||
html += "<td>[EM.name]</td>"
|
||||
html += "<td>[worldtime2text(ends_at)]</td>"
|
||||
html += "<td>[worldtime2stationtime(ends_at)]</td>"
|
||||
html += "<td>[ends_in]</td>"
|
||||
html += "<td><A align='right' href='?src=\ref[src];stop=\ref[E]'>Stop</A></td>"
|
||||
html += "</tr>"
|
||||
|
||||
@@ -15,15 +15,15 @@
|
||||
kill()
|
||||
|
||||
/datum/event/money_hacker/announce()
|
||||
var/message = "A brute force hack has been detected (in progress since [worldtime2text()]). The target of the attack is: Financial account #[affected_account.account_number], \
|
||||
var/message = "A brute force hack has been detected (in progress since [stationtime2text()]). The target of the attack is: Financial account #[affected_account.account_number], \
|
||||
without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \
|
||||
Notifications will be sent as updates occur.<br>"
|
||||
var/my_department = "[station_name()] firewall subroutines"
|
||||
|
||||
|
||||
for(var/obj/machinery/message_server/MS in world)
|
||||
if(!MS.active) continue
|
||||
MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2)
|
||||
|
||||
|
||||
|
||||
/datum/event/money_hacker/tick()
|
||||
if(world.time >= end_time)
|
||||
@@ -51,7 +51,7 @@
|
||||
T.date = pick("", current_date_string, date1, date2)
|
||||
var/time1 = rand(0, 99999999)
|
||||
var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]"
|
||||
T.time = pick("", worldtime2text(), time2)
|
||||
T.time = pick("", stationtime2text(), time2)
|
||||
T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD")
|
||||
|
||||
affected_account.transaction_log.Add(T)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
T.purpose = "Winner!"
|
||||
T.amount = winner_sum
|
||||
T.date = current_date_string
|
||||
T.time = worldtime2text()
|
||||
T.time = stationtime2text()
|
||||
T.source_terminal = "Sif TCD Terminal #[rand(111,333)]"
|
||||
D.transaction_log.Add(T)
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
var/releaseWhen = 60
|
||||
var/list/area/areas = list() //List of areas to affect. Filled by start()
|
||||
|
||||
|
||||
var/eventDept = "Security" //Department name in announcement
|
||||
var/list/areaName = list("Brig") //Names of areas mentioned in AI and Engineering announcements
|
||||
var/list/areaType = list(/area/security/prison, /area/security/brig) //Area types to include.
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
if(areas && areas.len > 0)
|
||||
var/my_department = "[station_name()] firewall subroutines"
|
||||
var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [worldtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.<br>"
|
||||
var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [stationtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.<br>"
|
||||
for(var/obj/machinery/message_server/MS in world)
|
||||
MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2)
|
||||
for(var/mob/living/silicon/ai/A in player_list)
|
||||
|
||||
35
code/modules/examine/descriptions/containers.dm
Normal file
35
code/modules/examine/descriptions/containers.dm
Normal file
@@ -0,0 +1,35 @@
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/cola
|
||||
description_fluff = "Space Cola is the most popular soft drink in known space. It was invented by Nikolas Fedorov, a Martian-Russian immagrant to Tau Ceti. He then went on to create Nikolas Beverages Inc., a soft drink corporation that is now part of Centauri Provisions."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle
|
||||
description_fluff = "This is a generic, NanoTrasen branded bottle of water. The company swears on the quality of the water, saying it comes from the Martian poles. Most people disregard that and assume it's recycled from hydroponics trays."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind
|
||||
description_fluff = "This cola was allegedly made after Vasily Federov, the son of Nikolas Federov and the second CEO of Federov Beverages Inc., went on a climbing expedition to an arctic planet. He then created this citris flavored soft drink. Scientists claim that it can eat through styrafoam in a matter of weeks, but people drink it anyway."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko
|
||||
description_fluff = "A beverage loved by college students. The Thirteen Loko Company created this highly alcoholic beverage as an energy drink. It is illegal in much of SolGov space and most of Skrell space. This drink has been regulated more than any other in known space, and doctors strongly advise not to drink it."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb
|
||||
description_fluff = "Originally made by a doctor seeking to mix several different flavors, this soda has become widely popular in the past decade. The drink has become so popular, in fact, that Nikolas Beverages bought it. Ever since then, the drink has never been the same. As a result, people all across known space beg for the old formula, but Nikolas Beverages does not appear to be listening."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/starkist
|
||||
description_fluff = "Nikolas Beverages' attempt at an orange-flavored drink. Advertised as a nice summer beverage. The company tries to paint it as one of their more 'healthy' beverages due to its 'orange' and 'vitamins'."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/space_up
|
||||
description_fluff = "This drink is advertised as one of the most carbonated beverages on the market. It's owned by Federov Beverages, and advertised for its carbonation, not its flavor. Children will commonly make 'Space-Up Volcanoes' by dropping mints into a can of Space-Up and causing it to create a long stream of fizz upward."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime
|
||||
description_fluff = "This is a NanoTrasen branded can of Lemon-Lime juice. NanoTrasen swears to their 'natural' beverage, but most people think differently."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea
|
||||
description_fluff = "Vrisk Iced Tea is named after it's creator, Penelope Vrisk. She was a canner for Federov Beverages who wanted to create an authentic-tasting Southern iced tea. After finishing her formula and managing to get it produced, the tea became an instant hit."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice
|
||||
description_fluff = "This is a NanoTrasen branded can of grape juice. NanoTrasen claims that they use the same grapes that this juice is made of to make their wine."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/tonic
|
||||
description_fluff = "Endorsed by the popular positronic rapper, T-Borg, this drink is advertised as a 'high class' drink. Most people just use it to mix with their gin, and not much can be said about the quality."
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater
|
||||
description_fluff = "This is a NanoTrasen branded can of soda water. They use the same water for this that they use for the bottled water that they sell. That may explain why the stuff isn't exactly flying off of the shelves."
|
||||
39
code/modules/examine/descriptions/smokeables.dm
Normal file
39
code/modules/examine/descriptions/smokeables.dm
Normal file
@@ -0,0 +1,39 @@
|
||||
/obj/item/weapon/storage/fancy/cigarettes
|
||||
description_fluff = "The Trans-Stellar Duty-Free cigarette company was created as a sub-company of NanoTrasen. They are the most boring, tasteless, dry cigarettes on the market, but due to how generic they are, they are still the most well-known and widespread cigarettes in the universe."
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/dromedaryco
|
||||
description_fluff = "DromedaryCo is one of the oldest companies that produces cigarettes. Being a company that has changed hands and names several times through the years, their cigarettes are now very different from the original, and old-timers tend to complain about the quality of their current product. While they have been dwindling when it comes to profits in the past years due to marketing schemes deemed 'unethical', they still remain on the forefront of the smokeable industry."
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/killthroat
|
||||
description_fluff = "AcmeCo is known for their signature high-tar cigarettes. Being a sub-company Xion, some accuse the cigarettes of having other harmful things in them besides tar. Xion officials refuse to comment on the issue."
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/luckystars
|
||||
description_fluff = "Lucky Stars were created on Venus by a researcher seeking to make a good quality cigarette from pod-based tobacco plants. The researcher only managed to make these, but made quite a profit off of them when she started her company."
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/jerichos
|
||||
description_fluff = "Hephaistos Industries ex-military employees once decided to make a cigarette that was easy to light and had a waterproof case, specifically tailored for soldiers. They created Jerichos. Jerichos are known for their Hickory smoke and warm feeling in your lungs. They are loved by soldiers and people employed in para-military outfits."
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/menthols
|
||||
description_fluff = "The Temperamento Menthol Company is a large cigarette company based in Mars. They have been around since the very dawn of Human colonization and have remained a favorite for those seeking a more.. numbing cigarette.<br>\
|
||||
<br>\
|
||||
This is a pack of Temperamento Menthols, the main product of the company. They taste like menthol, surprisingly enough."
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/carcinomas
|
||||
description_fluff = "The CarcinoCo was originally destined to fail, as the company blatantly advertized themselves as creating the 'most cancerous cigarette'. Somehow, after endorsement from a reporter, the cigarettes took off."
|
||||
|
||||
/obj/item/weapon/storage/fancy/cigarettes/professionals
|
||||
description_fluff = "Decades ago, probably before you were born, Gilthari Exports created the Professional 120s. They wanted to make a fancy cigarette that would be considered a luxury. Nowadays, people who use them are generally laughed at for being wannabe rich people or old. They are, however, very high-quality and made from the very best tobacco."
|
||||
|
||||
/obj/item/clothing/mask/smokable/cigarette/cigar
|
||||
description_fluff = "While the label does say that this is a 'premium cigar', it really cannot match other types of cigars on the market. Is it a quality cigarette? Perhaps. Was it hand-made with care? No. This is what differentiates between quality products that Gilthari puts out and NanoTrasen 'premium' cigars like this one."
|
||||
|
||||
/obj/item/clothing/mask/smokable/cigarette/cigar/cohiba
|
||||
description_fluff = "Cohiba has been a popular cigar company for centuries. They are still based out of Cuba and refuse to expand and therefore have a very limited quantity, making their cigars coveted all through known space. Robusto is one of their most popular shapes of cigars."
|
||||
|
||||
/obj/item/clothing/mask/smokable/cigarette/cigar/havana
|
||||
description_fluff = "'Havanian' is an umbrella term for any cigar made in the typical handmade style of Cuba. This particular cigar is from Gilthari's cigar manufacturers. While the way of making quality cigars has become slightly bastardized over the years, overall quality has remained relatively the same, even if there is a large quantity of 'Havanian' cigars."
|
||||
|
||||
/obj/item/clothing/mask/smokable/pipe
|
||||
description_fluff = "ClassiCo Men's Accessories and Haberdashers is a widespread company originating out of Mars. They seek to create quality goods to give men a more 'classy' look. Most of their items are high-end and expensive, but they do back that up with quality.<br>\
|
||||
<br>\
|
||||
This pipe is a ClassiCo pipe. It is made out of fine, stained cherry wood."
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
var/list/dreams = list(
|
||||
"an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the captain",
|
||||
"an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the Station Administrator",
|
||||
"voices from all around","deep space","a doctor","the engine","a traitor","an ally","darkness",
|
||||
"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","phoron","air","the medical bay","the bridge","blinking lights",
|
||||
|
||||
@@ -189,7 +189,7 @@ mob/living/carbon/proc/handle_hallucinations()
|
||||
|
||||
var/possible_txt = list("Launch Escape Pods","Self-Destruct Sequence","\[Swipe ID\]","De-Monkify",\
|
||||
"Reticulate Splines","Plasma","Open Valve","Lockdown","Nerf Airflow","Kill Traitor","Nihilism",\
|
||||
"OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Captain IQ","Retrieve Arms",\
|
||||
"OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Station Administrator IQ","Retrieve Arms",\
|
||||
"Play Charades","Oxygen","Inject BeAcOs","Ninja Lizards","Limit Break","Build Sentry")
|
||||
|
||||
if(mid_txts)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"The Chaplain this shift is worshiping _____.",
|
||||
"Cargo ordered a crate full of _____.",
|
||||
"An ERT was called due to ______.",
|
||||
"Alert! The Captain has armed themselves with _____.",
|
||||
"Alert! The Station Administrator has armed themselves with _____.",
|
||||
"Current Laws: ________ is your master.",
|
||||
"Current Laws: ________ is the enemy.",
|
||||
"_____ vented the entirety of Cargo.",
|
||||
@@ -14,7 +14,7 @@
|
||||
"Caution, ______ have been detected in collision course with the station.",
|
||||
"Today's kitchen menu includes _______.",
|
||||
"What did the mercenaries want when they attacked the station?",
|
||||
"I think the Captain is insane. He just demanded ______ in his office.",
|
||||
"I think the Station Administrator is insane. He just demanded ______ in his office.",
|
||||
"Fuckin' scientists, they just turned Misc. Research into _______ .",
|
||||
"What's my fetish?",
|
||||
"Hello, _______ here with _______",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"Space 'Nam",
|
||||
"Space lesbians",
|
||||
"The Gardener getting SUPER high",
|
||||
"The Captain thinking they're a badass",
|
||||
"The Station Administrator thinking they're a badass",
|
||||
"Being in a cult",
|
||||
"Racially biased lawsets",
|
||||
"An Unathi who WON'T STOP FIGHTING",
|
||||
@@ -57,7 +57,7 @@
|
||||
"An irritatingly chipper robot",
|
||||
"Androids hanging out in the bar drinking beer",
|
||||
"Gear harnesses",
|
||||
"A seventeen-year-old Captain",
|
||||
"A seventeen-year-old Station Administrator",
|
||||
"The throbbing erection that the HoS gets at the thought of shooting something",
|
||||
"Trying to stab someone and hugging them instead",
|
||||
"Waking up naked in the maintenance tunnels",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
else
|
||||
var/language_type = pick(/datum/language/human,/datum/language/diona,/datum/language/tajaran,/datum/language/unathi)
|
||||
var/datum/language/L = new language_type()
|
||||
var/team = pick("Brickburn Galaxy Trekers","Mars Rovers", "Qerrbalak Saints", "Moghes Rockets", "Ahdomai Lightening", starsys_name+" Vixens", "Euphoric-Earth Alligators")
|
||||
var/team = pick("Brickburn Galaxy Trekers","Mars Rovers", "Qerrbalak Saints", "Moghes Rockets", "Meralar Lightning", starsys_name+" Vixens", "Euphoric-Earth Alligators")
|
||||
P.name = "[L.get_random_name(pick(MALE,FEMALE))], [year - rand(0,50)] [team]"
|
||||
P.card_icon = "spaceball_standard"
|
||||
P.back_icon = "card_back_spaceball"
|
||||
|
||||
@@ -1028,8 +1028,8 @@
|
||||
|
||||
/datum/seed/shand
|
||||
name = "shand"
|
||||
seed_name = "S'randar's hand"
|
||||
display_name = "S'randar's hand leaves"
|
||||
seed_name = "Selem's hand"
|
||||
display_name = "Selem's hand leaves"
|
||||
chems = list("bicaridine" = list(0,10))
|
||||
kitchen_tag = "shand"
|
||||
|
||||
@@ -1048,8 +1048,8 @@
|
||||
|
||||
/datum/seed/mtear
|
||||
name = "mtear"
|
||||
seed_name = "Messa's tear"
|
||||
display_name = "Messa's tear leaves"
|
||||
seed_name = "Malani's tear"
|
||||
display_name = "Malani's tear leaves"
|
||||
chems = list("honey" = list(1,10), "kelotane" = list(3,5))
|
||||
kitchen_tag = "mtear"
|
||||
|
||||
|
||||
@@ -395,7 +395,7 @@ var/list/name_to_material
|
||||
weight = 15
|
||||
door_icon_base = "stone"
|
||||
destruction_desc = "shatters"
|
||||
window_options = list("One Direction" = 1, "Full Window" = 4)
|
||||
window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 2)
|
||||
created_window = /obj/structure/window/basic
|
||||
rod_product = /obj/item/stack/material/glass/reinforced
|
||||
|
||||
@@ -425,6 +425,12 @@ var/list/name_to_material
|
||||
for (var/obj/structure/window/check_window in user.loc)
|
||||
window_count++
|
||||
possible_directions -= check_window.dir
|
||||
for (var/obj/structure/windoor_assembly/check_assembly in user.loc)
|
||||
window_count++
|
||||
possible_directions -= check_assembly.dir
|
||||
for (var/obj/machinery/door/window/check_windoor in user.loc)
|
||||
window_count++
|
||||
possible_directions -= check_windoor.dir
|
||||
|
||||
// Get the closest available dir to the user's current facing.
|
||||
var/build_dir = SOUTHWEST //Default to southwest for fulltile windows.
|
||||
@@ -435,18 +441,12 @@ var/list/name_to_material
|
||||
else
|
||||
if(choice in list("One Direction","Windoor"))
|
||||
if(possible_directions.len)
|
||||
for(var/direction in list(user.dir, turn(user.dir,90), turn(user.dir,180), turn(user.dir,270) ))
|
||||
for(var/direction in list(user.dir, turn(user.dir,90), turn(user.dir,270), turn(user.dir,180)))
|
||||
if(direction in possible_directions)
|
||||
build_dir = direction
|
||||
break
|
||||
else
|
||||
failed_to_build = 1
|
||||
if(!failed_to_build && choice == "Windoor")
|
||||
if(!is_reinforced())
|
||||
user << "<span class='warning'>This material is not reinforced enough to use for a door.</span>"
|
||||
return
|
||||
if((locate(/obj/structure/windoor_assembly) in T.contents) || (locate(/obj/machinery/door/window) in T.contents))
|
||||
failed_to_build = 1
|
||||
if(failed_to_build)
|
||||
user << "<span class='warning'>There is no room in this location.</span>"
|
||||
return 1
|
||||
@@ -454,7 +454,8 @@ var/list/name_to_material
|
||||
var/build_path = /obj/structure/windoor_assembly
|
||||
var/sheets_needed = window_options[choice]
|
||||
if(choice == "Windoor")
|
||||
build_dir = user.dir
|
||||
if(is_reinforced())
|
||||
build_path = /obj/structure/windoor_assembly/secure
|
||||
else
|
||||
build_path = created_window
|
||||
|
||||
@@ -484,7 +485,7 @@ var/list/name_to_material
|
||||
weight = 30
|
||||
stack_origin_tech = "materials=2"
|
||||
composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT / 2, "glass" = SHEET_MATERIAL_AMOUNT)
|
||||
window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 5)
|
||||
window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 2)
|
||||
created_window = /obj/structure/window/reinforced
|
||||
wire_product = null
|
||||
rod_product = null
|
||||
@@ -497,6 +498,7 @@ var/list/name_to_material
|
||||
integrity = 100
|
||||
icon_colour = "#FC2BC5"
|
||||
stack_origin_tech = list(TECH_MATERIAL = 4)
|
||||
window_options = list("One Direction" = 1, "Full Window" = 4)
|
||||
created_window = /obj/structure/window/phoronbasic
|
||||
wire_product = null
|
||||
rod_product = /obj/item/stack/material/glass/phoronrglass
|
||||
@@ -507,6 +509,7 @@ var/list/name_to_material
|
||||
stack_type = /obj/item/stack/material/glass/phoronrglass
|
||||
stack_origin_tech = list(TECH_MATERIAL = 5)
|
||||
composite_material = list() //todo
|
||||
window_options = list("One Direction" = 1, "Full Window" = 4)
|
||||
created_window = /obj/structure/window/phoronreinforced
|
||||
hardness = 40
|
||||
weight = 30
|
||||
|
||||
@@ -42,7 +42,6 @@
|
||||
/obj/machinery/mining/drill/New()
|
||||
|
||||
..()
|
||||
circuit = new circuit(src)
|
||||
component_parts = list()
|
||||
component_parts += new /obj/item/weapon/stock_parts/matter_bin(src)
|
||||
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
var/drill_verb = "drilling"
|
||||
sharp = 1
|
||||
|
||||
var/excavation_amount = 100
|
||||
var/excavation_amount = 200
|
||||
|
||||
/obj/item/weapon/pickaxe/hammer
|
||||
name = "sledgehammer"
|
||||
|
||||
@@ -121,6 +121,12 @@ var/list/mining_overlay_cache = list()
|
||||
if(!mining_overlay_cache["rock_side_[place_dir]"])
|
||||
mining_overlay_cache["rock_side_[place_dir]"] = image('icons/turf/walls.dmi', "rock_side", dir = place_dir)
|
||||
T.overlays += mining_overlay_cache["rock_side_[place_dir]"]
|
||||
|
||||
if(archaeo_overlay)
|
||||
overlays += archaeo_overlay
|
||||
|
||||
if(excav_overlay)
|
||||
overlays += excav_overlay
|
||||
else
|
||||
|
||||
name = "sand"
|
||||
@@ -320,13 +326,12 @@ var/list/mining_overlay_cache = list()
|
||||
if (istype(W, /obj/item/device/measuring_tape))
|
||||
var/obj/item/device/measuring_tape/P = W
|
||||
user.visible_message("<span class='notice'>\The [user] extends \a [P] towards \the [src].</span>","<span class='notice'>You extend \the [P] towards \the [src].</span>")
|
||||
if(do_after(user,25))
|
||||
user << "<span class='notice'>\icon[P] [src] has been excavated to a depth of [2*excavation_level]cm.</span>"
|
||||
if(do_after(user, 15))
|
||||
user << "<span class='notice'>\The [src] has been excavated to a depth of [excavation_level]cm.</span>"
|
||||
return
|
||||
|
||||
if (istype(W, /obj/item/weapon/pickaxe))
|
||||
var/turf/T = user.loc
|
||||
if (!( istype(T, /turf) ))
|
||||
if(!istype(user.loc, /turf))
|
||||
return
|
||||
|
||||
var/obj/item/weapon/pickaxe/P = W
|
||||
@@ -335,44 +340,37 @@ var/list/mining_overlay_cache = list()
|
||||
last_act = world.time
|
||||
|
||||
playsound(user, P.drill_sound, 20, 1)
|
||||
var/newDepth = excavation_level + P.excavation_amount // Used commonly below
|
||||
|
||||
//handle any archaeological finds we might uncover
|
||||
var/fail_message
|
||||
var/fail_message = ""
|
||||
if(finds && finds.len)
|
||||
var/datum/find/F = finds[1]
|
||||
if(excavation_level + P.excavation_amount > F.excavation_required)
|
||||
//Chance to destroy / extract any finds here
|
||||
if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably)
|
||||
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 << "<span class='notice'>You start [P.drill_verb][fail_message ? fail_message : ""].</span>"
|
||||
user << "<span class='notice'>You start [P.drill_verb][fail_message].</span>"
|
||||
|
||||
if(fail_message && prob(90))
|
||||
if(prob(25))
|
||||
excavate_find(5, finds[1])
|
||||
excavate_find(prob(5), finds[1])
|
||||
else if(prob(50))
|
||||
finds.Remove(finds[1])
|
||||
if(prob(50))
|
||||
artifact_debris()
|
||||
|
||||
if(do_after(user,P.digspeed))
|
||||
user << "<span class='notice'>You finish [P.drill_verb] \the [src].</span>"
|
||||
|
||||
if(finds && finds.len)
|
||||
var/datum/find/F = finds[1]
|
||||
if(round(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(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)
|
||||
if(newDepth == F.excavation_required) // When the pick hits that edge just right, you extract your find perfectly, it's never confined in a rock
|
||||
excavate_find(1, F)
|
||||
else if(newDepth > F.excavation_required - F.clearance_range) // Not quite right but you still extract your find, the closer to the bottom the better, but not above 80%
|
||||
excavate_find(prob(80 * (F.excavation_required - newDepth) / F.clearance_range), F)
|
||||
|
||||
else if(excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range)
|
||||
//just pull the surrounding rock out
|
||||
excavate_find(0, F)
|
||||
user << "<span class='notice'>You finish [P.drill_verb] \the [src].</span>"
|
||||
|
||||
if( excavation_level + P.excavation_amount >= 100 )
|
||||
//if players have been excavating this turf, leave some rocky debris behind
|
||||
if(newDepth >= 200) // This means the rock is mined out fully
|
||||
var/obj/structure/boulder/B
|
||||
if(artifact_find)
|
||||
if( excavation_level > 0 || prob(15) )
|
||||
@@ -382,7 +380,7 @@ var/list/mining_overlay_cache = list()
|
||||
B.artifact_find = artifact_find
|
||||
else
|
||||
artifact_debris(1)
|
||||
else if(prob(15))
|
||||
else if(prob(5))
|
||||
//empty boulder
|
||||
B = new(src)
|
||||
|
||||
@@ -393,36 +391,44 @@ var/list/mining_overlay_cache = list()
|
||||
return
|
||||
|
||||
excavation_level += P.excavation_amount
|
||||
var/updateIcon = 0
|
||||
|
||||
//archaeo overlays
|
||||
if(!archaeo_overlay && finds && finds.len)
|
||||
var/datum/find/F = finds[1]
|
||||
if(F.excavation_required <= excavation_level + F.view_range)
|
||||
archaeo_overlay = "overlay_archaeo[rand(1,3)]"
|
||||
overlays += archaeo_overlay
|
||||
updateIcon = 1
|
||||
|
||||
else if(archaeo_overlay && (!finds || !finds.len))
|
||||
archaeo_overlay = null
|
||||
updateIcon = 1
|
||||
|
||||
//there's got to be a better way to do this
|
||||
var/update_excav_overlay = 0
|
||||
if(excavation_level >= 75)
|
||||
if(excavation_level - P.excavation_amount < 75)
|
||||
if(excavation_level >= 150)
|
||||
if(excavation_level - P.excavation_amount < 150)
|
||||
update_excav_overlay = 1
|
||||
else if(excavation_level >= 100)
|
||||
if(excavation_level - P.excavation_amount < 100)
|
||||
update_excav_overlay = 1
|
||||
else if(excavation_level >= 50)
|
||||
if(excavation_level - P.excavation_amount < 50)
|
||||
update_excav_overlay = 1
|
||||
else if(excavation_level >= 25)
|
||||
if(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
|
||||
updateIcon = 1
|
||||
|
||||
if(updateIcon)
|
||||
update_icon()
|
||||
|
||||
//drop some rocks
|
||||
next_rock += P.excavation_amount * 10
|
||||
while(next_rock > 100)
|
||||
next_rock -= 100
|
||||
next_rock += P.excavation_amount
|
||||
while(next_rock > 50)
|
||||
next_rock -= 50
|
||||
var/obj/item/weapon/ore/O = new(src)
|
||||
geologic_data.UpdateNearbyArtifactInfo(src)
|
||||
O.geologic_data = geologic_data
|
||||
@@ -481,11 +487,11 @@ var/list/mining_overlay_cache = list()
|
||||
make_floor()
|
||||
update_icon(1)
|
||||
|
||||
/turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F)
|
||||
/turf/simulated/mineral/proc/excavate_find(var/is_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)
|
||||
if(is_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)
|
||||
@@ -503,7 +509,7 @@ var/list/mining_overlay_cache = list()
|
||||
//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(!S)
|
||||
if(X)
|
||||
visible_message("<span class='danger'>\The [pick("[display_name] crumbles away into dust","[display_name] breaks apart")].</span>")
|
||||
qdel(X)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/item/weapon/ore
|
||||
name = "rock"
|
||||
name = "small rock"
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "ore2"
|
||||
w_class = 2
|
||||
|
||||
@@ -820,16 +820,26 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
|
||||
set category = "Ghost"
|
||||
set name = "Choose Sprite"
|
||||
|
||||
icon = 'icons/mob/ghost.dmi'
|
||||
overlays.Cut()
|
||||
var/choice
|
||||
var/previous_state
|
||||
var/finalized = "No"
|
||||
|
||||
while(finalized == "No" && src.client)
|
||||
|
||||
choice = input(usr,"What would you like to use for your ghost sprite?") as null|anything in possible_ghost_sprites
|
||||
if(!choice) return
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
icon_state = possible_ghost_sprites[choice]
|
||||
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")
|
||||
if(choice)
|
||||
icon = 'icons/mob/ghost.dmi'
|
||||
overlays.Cut()
|
||||
|
||||
ghost_sprite = possible_ghost_sprites[choice]
|
||||
if(icon_state && icon)
|
||||
previous_state = icon_state
|
||||
|
||||
icon_state = possible_ghost_sprites[choice]
|
||||
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")
|
||||
|
||||
ghost_sprite = possible_ghost_sprites[choice]
|
||||
|
||||
if(finalized == "No")
|
||||
icon_state = previous_state
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
healths.icon_state = "health6"
|
||||
|
||||
timeofdeath = world.time
|
||||
if(mind) mind.store_memory("Time of death: [worldtime2text()]", 0)
|
||||
if(mind) mind.store_memory("Time of death: [stationtime2text()]", 0)
|
||||
living_mob_list -= src
|
||||
dead_mob_list |= src
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
if(speaker == src)
|
||||
src << "<span class='warning'>You cannot hear yourself speak!</span>"
|
||||
else
|
||||
src << "<span class='name'>[speaker_name]</span>[alt_name] talks but you cannot hear \him."
|
||||
src << "<span class='name'>[speaker_name]</span>[alt_name] talks but you cannot hear."
|
||||
else
|
||||
if(language)
|
||||
on_hear_say("<span class='game say'><span class='name'>[speaker_name]</span>[alt_name] [track][language.format_message(message, verb)]</span>")
|
||||
@@ -194,7 +194,7 @@
|
||||
on_hear_radio(part_a, speaker_name, track, part_b, formatted)
|
||||
|
||||
/proc/say_timestamp()
|
||||
return "<span class='say_quote'>\[[worldtime2text()]\]</span>"
|
||||
return "<span class='say_quote'>\[[stationtime2text()]\]</span>"
|
||||
|
||||
/mob/proc/on_hear_radio(part_a, speaker_name, track, part_b, formatted)
|
||||
src << "[part_a][speaker_name][part_b][formatted]"
|
||||
|
||||
@@ -25,13 +25,13 @@
|
||||
flags = WHITELISTED
|
||||
space_chance = 40
|
||||
syllables = list(
|
||||
"za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz",
|
||||
"ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh",
|
||||
"la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl",
|
||||
"ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk",
|
||||
"sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss",
|
||||
"ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr",
|
||||
"a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s"
|
||||
"za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz",
|
||||
"ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh",
|
||||
"la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl",
|
||||
"ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk",
|
||||
"sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss",
|
||||
"ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr",
|
||||
"a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s"
|
||||
)
|
||||
|
||||
/datum/language/unathi/get_random_name()
|
||||
@@ -42,8 +42,8 @@
|
||||
return capitalize(new_name)
|
||||
|
||||
/datum/language/tajaran
|
||||
name = "Siik'tajr"
|
||||
desc = "The traditionally employed tongue of Ahdomai, composed of expressive yowls and chirps. Native to the Tajaran."
|
||||
name = "Siik"
|
||||
desc = "The most prevalant language of Meralar, composed of expressive yowls and chirps. Native to the Tajaran."
|
||||
speech_verb = "mrowls"
|
||||
ask_verb = "mrowls"
|
||||
exclaim_verb = "yowls"
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
autohiss_basic_map = list(
|
||||
"r" = list("rr", "rrr", "rrrr")
|
||||
)
|
||||
autohiss_exempt = list("Siik'tajr")
|
||||
autohiss_exempt = list("Siik")
|
||||
|
||||
|
||||
/datum/species/proc/handle_autohiss(message, datum/language/lang, mode)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Cleanbot"
|
||||
desc = "A little cleaning robot, he looks so excited!"
|
||||
icon_state = "cleanbot0"
|
||||
req_access = list(access_janitor)
|
||||
req_one_access = list(access_robotics, access_janitor)
|
||||
botcard_access = list(access_janitor, access_maint_tunnels)
|
||||
|
||||
locked = 0 // Start unlocked so roboticist can set them to patrol.
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
icon_state = "farmbot0"
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
req_access = list(access_hydroponics)
|
||||
req_one_access = list(access_robotics, access_hydroponics)
|
||||
|
||||
var/action = "" // Used to update icon
|
||||
var/waters_trays = 1
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Floorbot"
|
||||
desc = "A little floor repairing robot, he looks so excited!"
|
||||
icon_state = "floorbot0"
|
||||
req_access = list(access_construction)
|
||||
req_one_access = list(access_robotics, access_construction)
|
||||
wait_if_pulled = 1
|
||||
min_target_dist = 0
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
name = "Medbot"
|
||||
desc = "A little medical robot. He looks somewhat underwhelmed."
|
||||
icon_state = "medibot0"
|
||||
req_access = list(access_medical)
|
||||
req_one_access = list(access_robotics, access_medical)
|
||||
botcard_access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics)
|
||||
|
||||
var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits.
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "secbot0"
|
||||
maxHealth = 100
|
||||
health = 100
|
||||
req_one_access = list(access_security, access_forensics_lockers)
|
||||
req_one_access = list(access_robotics, access_security, access_forensics_lockers)
|
||||
botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels)
|
||||
patrol_speed = 2
|
||||
target_speed = 3
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
adult.set_species(new_species)
|
||||
show_evolution_blurb()
|
||||
|
||||
adult.name = input(src,"Choose a name for yourself (please stick to any appropriate naming conventions).") as text|null
|
||||
if(mind)
|
||||
mind.transfer_to(adult)
|
||||
else
|
||||
@@ -38,6 +39,7 @@
|
||||
|
||||
for(var/datum/language/L in languages)
|
||||
adult.add_language(L.name)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/mob/living/carbon/alien/proc/update_progression()
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/mob/living/carbon/proc/breathe()
|
||||
//if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return
|
||||
if(!should_have_organ(O_LUNGS) || does_not_breathe) return
|
||||
if(!should_have_organ(O_LUNGS)) return
|
||||
|
||||
var/datum/gas_mixture/breath = null
|
||||
|
||||
@@ -24,6 +24,11 @@
|
||||
breath = get_breath_from_internal() //First, check for air from internals
|
||||
if(!breath)
|
||||
breath = get_breath_from_environment() //No breath from internals so let's try to get air from our location
|
||||
if(!breath)
|
||||
var/static/datum/gas_mixture/vacuum //avoid having to create a new gas mixture for each breath in space
|
||||
if(!vacuum) vacuum = new
|
||||
|
||||
breath = vacuum //still nothing? must be vacuum
|
||||
|
||||
handle_breath(breath)
|
||||
handle_post_breath(breath)
|
||||
|
||||
@@ -27,6 +27,13 @@
|
||||
update_dna()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_gender_identity(var/identifying_gender)
|
||||
if(src.identifying_gender == identifying_gender)
|
||||
return
|
||||
|
||||
src.identifying_gender = identifying_gender
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_hair(var/hair_style)
|
||||
if(!hair_style)
|
||||
return
|
||||
@@ -149,7 +156,7 @@
|
||||
continue
|
||||
if(blacklist.len && (current_species_name in blacklist))
|
||||
continue
|
||||
if((current_species.spawn_flags & SPECIES_IS_WHITELISTED) && !is_alien_whitelisted(src, current_species_name))
|
||||
if((current_species.spawn_flags & SPECIES_IS_WHITELISTED) && !is_alien_whitelisted(src, current_species))
|
||||
continue
|
||||
|
||||
valid_species += current_species_name
|
||||
|
||||
@@ -124,10 +124,16 @@
|
||||
|
||||
//suit/armour
|
||||
if(wear_suit)
|
||||
var/tie_msg
|
||||
if(istype(wear_suit,/obj/item/clothing/suit))
|
||||
var/obj/item/clothing/suit/U = wear_suit
|
||||
if(U.accessories.len)
|
||||
tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]"
|
||||
|
||||
if(wear_suit.blood_DNA)
|
||||
msg += "<span class='warning'>[T.He] [T.is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_suit.name]!</span>\n"
|
||||
else
|
||||
msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit].\n"
|
||||
msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit][tie_msg].\n"
|
||||
|
||||
//suit/armour storage
|
||||
if(s_store && !skipsuitstorage)
|
||||
|
||||
@@ -41,6 +41,10 @@
|
||||
human_mob_list |= src
|
||||
..()
|
||||
|
||||
hide_underwear.Cut()
|
||||
for(var/category in global_underwear.categories_by_name)
|
||||
hide_underwear[category] = FALSE
|
||||
|
||||
if(dna)
|
||||
dna.ready_dna(src)
|
||||
dna.real_name = real_name
|
||||
@@ -928,9 +932,8 @@
|
||||
/mob/living/carbon/human/proc/rupture_lung()
|
||||
var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS]
|
||||
|
||||
if(L && !L.is_bruised())
|
||||
src.custom_pain("You feel a stabbing pain in your chest!", 1)
|
||||
L.damage = L.min_bruised_damage
|
||||
if(L)
|
||||
L.rupture()
|
||||
|
||||
/*
|
||||
/mob/living/carbon/human/verb/simulate()
|
||||
@@ -1416,6 +1419,22 @@
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/verb/toggle_underwear()
|
||||
set name = "Toggle Underwear"
|
||||
set desc = "Shows/hides selected parts of your underwear."
|
||||
set category = "Object"
|
||||
|
||||
if(stat) return
|
||||
var/datum/category_group/underwear/UWC = input(usr, "Choose underwear:", "Show/hide underwear") as null|anything in global_underwear.categories
|
||||
var/datum/category_item/underwear/UWI = all_underwear[UWC.name]
|
||||
if(!UWI || UWI.name == "None")
|
||||
src << "<span class='notice'>You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "\a [UWC.display_name]"].</span>"
|
||||
return
|
||||
hide_underwear[UWC.name] = !hide_underwear[UWC.name]
|
||||
update_underwear(1)
|
||||
src << "<span class='notice'>You [hide_underwear[UWC.name] ? "take off" : "put on"] your [UWC.display_name].</span>"
|
||||
return
|
||||
|
||||
/mob/living/carbon/human/verb/pull_punches()
|
||||
set name = "Pull Punches"
|
||||
set desc = "Try not to hurt them."
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
|
||||
var/list/all_underwear = list()
|
||||
var/list/all_underwear_metadata = list()
|
||||
var/list/hide_underwear = list()
|
||||
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
|
||||
var/pdachoice = 1 //Which PDA type the player has chosen. Default, Slim, or Old.
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
#define HUMAN_CRIT_MAX_OXYLOSS ( 2.0 / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. last_tick_duration = ~2.0 on average
|
||||
|
||||
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
|
||||
#define HEAT_DAMAGE_LEVEL_2 4 //Amount of damage applied when your body temperature passes the 400K point
|
||||
#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 1000K point
|
||||
#define HEAT_DAMAGE_LEVEL_2 10 //Amount of damage applied when your body temperature passes the 400K point
|
||||
#define HEAT_DAMAGE_LEVEL_3 20 //Amount of damage applied when your body temperature passes the 1000K point
|
||||
|
||||
#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point
|
||||
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
|
||||
@@ -327,6 +327,11 @@
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
|
||||
if(does_not_breathe)
|
||||
failed_last_breath = 0
|
||||
adjustOxyLoss(-5)
|
||||
return
|
||||
|
||||
if(!breath || (breath.total_moles == 0) || suiciding)
|
||||
failed_last_breath = 1
|
||||
if(suiciding)
|
||||
@@ -338,12 +343,22 @@
|
||||
else
|
||||
adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
|
||||
|
||||
if(should_have_organ(O_LUNGS))
|
||||
var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS]
|
||||
if(!L.is_bruised() && prob(8))
|
||||
if(breath.total_moles)
|
||||
if(breath.total_moles < BREATH_MOLES / 5 || breath.total_moles > BREATH_MOLES * 5)
|
||||
rupture_lung()
|
||||
else
|
||||
rupture_lung()
|
||||
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
|
||||
return 0
|
||||
|
||||
var/safe_pressure_min = 16 // Minimum safe partial pressure of breathable gas in kPa
|
||||
|
||||
|
||||
// Lung damage increases the minimum safe pressure.
|
||||
if(should_have_organ(O_LUNGS))
|
||||
var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS]
|
||||
@@ -1184,10 +1199,10 @@
|
||||
// if(resting || lying || sleeping) rest.icon_state = "rest1"
|
||||
// else rest.icon_state = "rest0"
|
||||
if(toxin)
|
||||
if(hal_screwyhud == 4 || phoron_alert) toxin.icon_state = "tox1"
|
||||
if(hal_screwyhud == 4 || (phoron_alert && !does_not_breathe)) toxin.icon_state = "tox1"
|
||||
else toxin.icon_state = "tox0"
|
||||
if(oxygen)
|
||||
if(hal_screwyhud == 3 || oxygen_alert) oxygen.icon_state = "oxy1"
|
||||
if(hal_screwyhud == 3 || (oxygen_alert && !does_not_breathe)) oxygen.icon_state = "oxy1"
|
||||
else oxygen.icon_state = "oxy0"
|
||||
if(fire)
|
||||
if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat.
|
||||
|
||||
@@ -221,14 +221,22 @@
|
||||
H.internal_organs_by_name[organ_tag] = O
|
||||
|
||||
|
||||
/datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target)
|
||||
/datum/species/proc/hug(var/mob/living/carbon/human/H, var/mob/living/target)
|
||||
|
||||
var/t_him = "them"
|
||||
switch(target.gender)
|
||||
if(MALE)
|
||||
t_him = "him"
|
||||
if(FEMALE)
|
||||
t_him = "her"
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/T = target
|
||||
switch(T.identifying_gender)
|
||||
if(MALE)
|
||||
t_him = "him"
|
||||
if(FEMALE)
|
||||
t_him = "her"
|
||||
else
|
||||
switch(target.gender)
|
||||
if(MALE)
|
||||
t_him = "him"
|
||||
if(FEMALE)
|
||||
t_him = "her"
|
||||
|
||||
H.visible_message("<span class='notice'>[H] hugs [target] to make [t_him] feel better!</span>", \
|
||||
"<span class='notice'>You hug [target] to make [t_him] feel better!</span>")
|
||||
|
||||
@@ -130,8 +130,13 @@ var/list/wrapped_species_by_ref = list()
|
||||
if(!new_gender)
|
||||
return
|
||||
|
||||
var/new_gender_identity = input("Please select a gender Identity.", "Shapeshifter Gender Identity") as null|anything in list(FEMALE, MALE, NEUTER, PLURAL)
|
||||
if(!new_gender_identity)
|
||||
return
|
||||
|
||||
visible_message("<span class='notice'>\The [src]'s form contorts subtly.</span>")
|
||||
change_gender(new_gender)
|
||||
change_gender_identity(new_gender_identity)
|
||||
|
||||
/mob/living/carbon/human/proc/shapeshifter_select_shape()
|
||||
|
||||
|
||||
@@ -97,17 +97,25 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
else
|
||||
H.equip_to_slot_or_del(L, slot_in_backpack)
|
||||
|
||||
/datum/species/shapeshifter/promethean/hug(var/mob/living/carbon/human/H,var/mob/living/target)
|
||||
/datum/species/shapeshifter/promethean/hug(var/mob/living/carbon/human/H, var/mob/living/target)
|
||||
|
||||
var/t_him = "them"
|
||||
switch(target.gender)
|
||||
if(MALE)
|
||||
t_him = "him"
|
||||
if(FEMALE)
|
||||
t_him = "her"
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/T = target
|
||||
switch(T.identifying_gender)
|
||||
if(MALE)
|
||||
t_him = "him"
|
||||
if(FEMALE)
|
||||
t_him = "her"
|
||||
else
|
||||
switch(target.gender)
|
||||
if(MALE)
|
||||
t_him = "him"
|
||||
if(FEMALE)
|
||||
t_him = "her"
|
||||
|
||||
H.visible_message("<span class='notice'>\The [H] glomps [target] to make [t_him] feel better!</span>", \
|
||||
"<span class='notice'>You glomps [target] to make [t_him] feel better!</span>")
|
||||
"<span class='notice'>You glomp [target] to make [t_him] feel better!</span>")
|
||||
H.apply_stored_shock_to(target)
|
||||
|
||||
/datum/species/shapeshifter/promethean/handle_death(var/mob/living/carbon/human/H)
|
||||
@@ -171,11 +179,11 @@ var/datum/species/shapeshifter/promethean/prometheans
|
||||
return
|
||||
|
||||
var/t_she = "She is"
|
||||
if(H.gender == MALE)
|
||||
if(H.identifying_gender == MALE)
|
||||
t_she = "He is"
|
||||
else if(H.gender == PLURAL)
|
||||
else if(H.identifying_gender == PLURAL)
|
||||
t_she = "They are"
|
||||
else if(H.gender == NEUTER)
|
||||
else if(H.identifying_gender == NEUTER)
|
||||
t_she = "It is"
|
||||
|
||||
switch(stored_shock_by_ref["\ref[H]"])
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
heat_level_1 = 320
|
||||
heat_level_2 = 370
|
||||
heat_level_3 = 600
|
||||
heat_discomfort_level = 292
|
||||
heat_discomfort_level = 295
|
||||
heat_discomfort_strings = list(
|
||||
"Your feathers prickle in the heat.",
|
||||
"You feel uncomfortably warm.",
|
||||
@@ -120,4 +120,4 @@
|
||||
|
||||
/datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
|
||||
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
|
||||
|
||||
@@ -96,8 +96,8 @@
|
||||
burn_mod = 1.15
|
||||
gluttonous = 1
|
||||
num_alternate_languages = 2
|
||||
secondary_langs = list("Siik'tajr")
|
||||
name_language = "Siik'tajr"
|
||||
secondary_langs = list("Siik")
|
||||
name_language = "Siik"
|
||||
health_hud_intensity = 2.5
|
||||
|
||||
min_age = 17
|
||||
|
||||
@@ -124,8 +124,7 @@
|
||||
|
||||
if(can_reach_splints)
|
||||
var/removed_splint
|
||||
for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM))
|
||||
var/obj/item/organ/external/o = get_organ(organ)
|
||||
for(var/obj/item/organ/external/o in organs)
|
||||
if (o && o.status & ORGAN_SPLINTED)
|
||||
var/obj/item/W = new /obj/item/stack/medical/splint(get_turf(src), 1)
|
||||
o.status &= ~ORGAN_SPLINTED
|
||||
|
||||
@@ -336,6 +336,8 @@ var/global/list/damage_icon_parts = list()
|
||||
if(species.appearance_flags & HAS_UNDERWEAR)
|
||||
overlays_standing[UNDERWEAR_LAYER] = list()
|
||||
for(var/category in all_underwear)
|
||||
if(hide_underwear[category])
|
||||
continue
|
||||
var/datum/category_item/underwear/UWI = all_underwear[category]
|
||||
overlays_standing[UNDERWEAR_LAYER] += UWI.generate_image(all_underwear_metadata[category])
|
||||
|
||||
|
||||
@@ -151,8 +151,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
add_language("Galactic Common", 1)
|
||||
add_language("Sol Common", 0)
|
||||
add_language("Sinta'unathi", 0)
|
||||
add_language("Siik'maas", 0)
|
||||
add_language("Siik'tajr", 0)
|
||||
add_language("Siik", 0)
|
||||
add_language("Skrellian", 0)
|
||||
add_language("Tradeband", 1)
|
||||
add_language("Gutter", 0)
|
||||
@@ -565,7 +564,21 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
var/icon_list[] = list(
|
||||
"default",
|
||||
"floating face",
|
||||
"carp"
|
||||
"carp",
|
||||
"ian",
|
||||
"runtime",
|
||||
"poly",
|
||||
"pun pun",
|
||||
"male human",
|
||||
"female human",
|
||||
"male unathi",
|
||||
"female unathi",
|
||||
"male tajara",
|
||||
"female tajara",
|
||||
"male tesharii",
|
||||
"female tesharii",
|
||||
"male skrell",
|
||||
"female skrell"
|
||||
)
|
||||
input = input("Please select a hologram:") as null|anything in icon_list
|
||||
if(input)
|
||||
@@ -577,6 +590,35 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2"))
|
||||
if("carp")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4"))
|
||||
if("ian")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi"))
|
||||
if("runtime")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"cat"))
|
||||
if("poly")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"parrot_fly"))
|
||||
if("pun pun")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"punpun"))
|
||||
if("male human")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holohumm"))
|
||||
if("female human")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holohumf"))
|
||||
if("male unathi")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holounam"))
|
||||
if("female unathi")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holounaf"))
|
||||
if("male tajara")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotajm"))
|
||||
if("female tajara")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotajf"))
|
||||
if("male tesharii")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotesm"))
|
||||
if("female tesharii")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotesf"))
|
||||
if("male skrell")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holoskrm"))
|
||||
if("female skrell")
|
||||
holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holoskrf"))
|
||||
|
||||
return
|
||||
|
||||
//Toggles the luminosity and applies it by re-entereing the camera.
|
||||
|
||||
@@ -469,11 +469,11 @@
|
||||
user.translator_on = !user.translator_on
|
||||
if(user.translator_on)
|
||||
user.add_language("Sinta'unathi")
|
||||
user.add_language("Siik'tajr")
|
||||
user.add_language("Siik")
|
||||
user.add_language("Skrellian")
|
||||
else
|
||||
user.remove_language("Sinta'unathi")
|
||||
user.remove_language("Siik'tajr")
|
||||
user.remove_language("Siik")
|
||||
user.remove_language("Skrellian")
|
||||
|
||||
is_active(mob/living/silicon/pai/user)
|
||||
|
||||
@@ -23,7 +23,7 @@ var/global/list/robot_modules = list(
|
||||
var/hide_on_manifest = 0
|
||||
var/channels = list()
|
||||
var/networks = list()
|
||||
var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK_TAJR = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0)
|
||||
var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0)
|
||||
var/sprites = list()
|
||||
var/can_be_pushed = 1
|
||||
var/no_slip = 0
|
||||
@@ -488,8 +488,7 @@ var/global/list/robot_modules = list(
|
||||
languages = list(
|
||||
LANGUAGE_SOL_COMMON = 1,
|
||||
LANGUAGE_UNATHI = 1,
|
||||
LANGUAGE_SIIK_MAAS = 1,
|
||||
LANGUAGE_SIIK_TAJR = 1,
|
||||
LANGUAGE_SIIK = 1,
|
||||
LANGUAGE_SKRELLIAN = 1,
|
||||
LANGUAGE_ROOTSPEAK = 1,
|
||||
LANGUAGE_TRADEBAND = 1,
|
||||
@@ -649,8 +648,7 @@ var/global/list/robot_modules = list(
|
||||
LANGUAGE_SOL_COMMON = 1,
|
||||
LANGUAGE_TRADEBAND = 1,
|
||||
LANGUAGE_UNATHI = 0,
|
||||
LANGUAGE_SIIK_MAAS = 0,
|
||||
LANGUAGE_SIIK_TAJR = 0,
|
||||
LANGUAGE_SIIK = 0,
|
||||
LANGUAGE_SKRELLIAN = 0,
|
||||
LANGUAGE_ROOTSPEAK = 0,
|
||||
LANGUAGE_GUTTER = 1,
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Crab say what?",
|
||||
"Man they say we have space lizards now, man this shit is getting more wack every minute",
|
||||
"The so called \"improved\" station AI is just bullshit, that thing aint fun for noone",
|
||||
"The Captain is a traitor, he took my power core.",
|
||||
"The Station Administrator is a traitor, he took my power core.",
|
||||
"Say \"what\" again. Say \"what\" again. I dare you. I double-dare you, motherfucker. Say \"what\" one more goddamn time.",
|
||||
"Ezekiel 25:17 ,The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who in the name of charity and good will shepherds the weak through the valley of darkness, for he is truly his brother's keeper and the finder of lost children. And I will strike down upon thee with great vengeance and furious anger those who attempt to poison and destroy my brothers. And you will know my name is the Lord... when I lay my vengeance upon thee.",
|
||||
"Did you notice a sign out in front of my house that said \"Dead Nigger Storage\"?")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user