Merge branch 'master' of https://github.com/PolarisSS13/Polaris into 3/11/2016_integrated_circuits

This commit is contained in:
Neerti
2016-08-31 20:40:35 -04:00
496 changed files with 8917 additions and 7728 deletions

View File

@@ -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

View File

@@ -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(

View File

@@ -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)

View File

@@ -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")

View File

@@ -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>"

View File

@@ -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

View File

@@ -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)

View File

@@ -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>"

View File

@@ -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"])

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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)

View File

@@ -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)

View File

@@ -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"

View File

@@ -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)"

View File

@@ -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

View File

@@ -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")

View File

@@ -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)

View File

@@ -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

View File

@@ -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(

View File

@@ -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")

View File

@@ -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

View File

@@ -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")

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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
*/

View File

@@ -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"

View File

@@ -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)

View File

@@ -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]!")

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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>"

View File

@@ -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)

View File

@@ -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>
"}

View File

@@ -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>
"}

View 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

View 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)

View 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 += "&nbsp;&nbsp;" + 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 ..()

View 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

View File

@@ -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>"

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View 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."

View 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."

View File

@@ -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",

View File

@@ -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)

View File

@@ -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 _______",

View File

@@ -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",

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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"

View File

@@ -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)

View File

@@ -1,5 +1,5 @@
/obj/item/weapon/ore
name = "rock"
name = "small rock"
icon = 'icons/obj/mining.dmi'
icon_state = "ore2"
w_class = 2

View File

@@ -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

View File

@@ -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

View File

@@ -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]"

View File

@@ -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"

View File

@@ -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)

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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()

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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."

View File

@@ -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.

View File

@@ -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.

View File

@@ -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>")

View File

@@ -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()

View File

@@ -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]"])

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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])

View File

@@ -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.

View File

@@ -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)

View File

@@ -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,

View File

@@ -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