mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-14 00:23:29 +01:00
Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into DisMemberments
This commit is contained in:
@@ -21,6 +21,13 @@ var/global/nologevent = 0
|
||||
var/msg = rendered
|
||||
to_chat(C, msg)
|
||||
|
||||
/proc/message_adminTicket(var/msg)
|
||||
msg = "<span class='adminticket'><span class='prefix'>ADMIN TICKET:</span> [msg]</span>"
|
||||
for(var/client/C in admins)
|
||||
if(R_ADMIN & C.holder.rights)
|
||||
if(C.prefs && !(C.prefs.toggles & CHAT_NO_TICKETLOGS))
|
||||
to_chat(C, msg)
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////Panels
|
||||
|
||||
|
||||
@@ -171,9 +171,9 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/map_template_upload,
|
||||
/client/proc/view_runtimes,
|
||||
/client/proc/admin_serialize,
|
||||
/client/proc/admin_deserialize,
|
||||
/client/proc/jump_to_ruin,
|
||||
/client/proc/toggle_medal_disable
|
||||
/client/proc/toggle_medal_disable,
|
||||
/client/proc/startadmintickets,
|
||||
)
|
||||
var/list/admin_verbs_possess = list(
|
||||
/proc/possess,
|
||||
@@ -220,6 +220,12 @@ var/list/admin_verbs_snpc = list(
|
||||
/client/proc/customiseSNPC,
|
||||
/client/proc/hide_snpc_verbs
|
||||
)
|
||||
var/list/admin_verbs_ticket = list(
|
||||
/client/proc/openTicketUI,
|
||||
/client/proc/toggleticketlogs,
|
||||
/client/proc/resolveAllTickets,
|
||||
/client/proc/openUserUI
|
||||
)
|
||||
|
||||
/client/proc/on_holder_add()
|
||||
if(chatOutput && chatOutput.loaded)
|
||||
@@ -232,6 +238,7 @@ var/list/admin_verbs_snpc = list(
|
||||
verbs += /client/proc/togglebuildmodeself
|
||||
if(holder.rights & R_ADMIN)
|
||||
verbs += admin_verbs_admin
|
||||
verbs += admin_verbs_ticket
|
||||
spawn(1)
|
||||
control_freak = 0
|
||||
if(holder.rights & R_BAN)
|
||||
@@ -282,7 +289,8 @@ var/list/admin_verbs_snpc = list(
|
||||
admin_verbs_show_debug_verbs,
|
||||
/client/proc/readmin,
|
||||
admin_verbs_snpc,
|
||||
/client/proc/hide_snpc_verbs
|
||||
/client/proc/hide_snpc_verbs,
|
||||
admin_verbs_ticket
|
||||
)
|
||||
|
||||
/client/proc/hide_verbs()
|
||||
@@ -919,6 +927,20 @@ var/list/admin_verbs_snpc = list(
|
||||
else
|
||||
to_chat(usr, "You now will get admin log messages.")
|
||||
|
||||
/client/proc/toggleticketlogs()
|
||||
set name = "Toggle Admin Ticket Messgaes"
|
||||
set category = "Preferences"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
prefs.toggles ^= CHAT_NO_TICKETLOGS
|
||||
prefs.save_preferences(src)
|
||||
if(prefs.toggles & CHAT_NO_TICKETLOGS)
|
||||
to_chat(usr, "You now won't get admin ticket messages.")
|
||||
else
|
||||
to_chat(usr, "You now will get admin ticket messages.")
|
||||
|
||||
/client/proc/toggledrones()
|
||||
set name = "Toggle Maintenance Drones"
|
||||
set category = "Server"
|
||||
|
||||
@@ -0,0 +1,185 @@
|
||||
/*
|
||||
Admin ticket system by Birdtalon
|
||||
*/
|
||||
//Global holder
|
||||
|
||||
var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicketHolder
|
||||
|
||||
//Defines
|
||||
//Deciseconds until ticket becomes stale if unanswered. Alerts admins.
|
||||
#define ADMIN_TICKET_TIMEOUT 6000 // 10 minutes
|
||||
//Decisecions before the user is allowed to open another ticket while their existing one is open.
|
||||
#define ADMIN_TICKET_DUPLICATE_COOLDOWN 3000 // 5 minutes
|
||||
|
||||
//Status defines
|
||||
#define ADMIN_TICKET_OPEN 1
|
||||
#define ADMIN_TICKET_CLOSED 2
|
||||
#define ADMIN_TICKET_RESOLVED 3
|
||||
#define ADMIN_TICKET_STALE 4
|
||||
|
||||
//Datum holding all tickets
|
||||
/datum/adminTicketHolder
|
||||
var/ticketCounter = 1 // Counts the tickets and used to assign the id number
|
||||
var/list/allTickets = list()
|
||||
|
||||
//Return the current ticket number ready to be called off.
|
||||
/datum/adminTicketHolder/proc/getTicketCounter()
|
||||
return ticketCounter
|
||||
|
||||
//Return the ticket counter and increment
|
||||
/datum/adminTicketHolder/proc/getTicketCounterAndInc()
|
||||
. = ticketCounter
|
||||
ticketCounter++
|
||||
return
|
||||
|
||||
/datum/adminTicketHolder/proc/resolveAllOpenTickets() // Resolve all open tickets
|
||||
for(var/i in allTickets)
|
||||
var/datum/admin_ticket/T = i
|
||||
resolveTicket(T.ticketNum)
|
||||
|
||||
//Open a new ticket and populate details then add to the list of open tickets
|
||||
/datum/adminTicketHolder/proc/newTicket(var/client/C, var/passedContent, var/title)
|
||||
if(!C || !passedContent)
|
||||
return
|
||||
|
||||
//Check if the user has an open ticket already within the cooldown period, if so we don't create a new one and re-set the cooldown period
|
||||
var/datum/admin_ticket/existingTicket = checkForOpenTicket(C)
|
||||
if(existingTicket)
|
||||
existingTicket.setCooldownPeriod()
|
||||
to_chat(C, "<span class='adminticket'>Your ticket #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.</span>")
|
||||
return
|
||||
|
||||
if(!title)
|
||||
title = passedContent
|
||||
|
||||
var/datum/admin_ticket/T = new /datum/admin_ticket
|
||||
T.clientName = C
|
||||
T.timeOpened = worldtime2text()
|
||||
T.title = title
|
||||
T.content += passedContent
|
||||
T.locationSent = C.mob.loc.loc.name
|
||||
T.mobControlled = C.mob
|
||||
T.ticketState = ADMIN_TICKET_OPEN
|
||||
T.timeUntilStale = world.time + ADMIN_TICKET_TIMEOUT
|
||||
T.setCooldownPeriod()
|
||||
T.ticketNum = getTicketCounterAndInc()
|
||||
allTickets += T
|
||||
|
||||
//Inform the user that they have opened a ticket
|
||||
to_chat(C, "<span class='adminticket'>You have opened admin ticket number #[(globAdminTicketHolder.getTicketCounter() - 1)]! Please be patient and we will help you soon!</span>")
|
||||
|
||||
//Begin the stale count for this ticket.
|
||||
spawn(0)
|
||||
T.beginStaleCount()
|
||||
|
||||
//Set ticket state with key N to open
|
||||
/datum/adminTicketHolder/proc/openTicket(var/N)
|
||||
var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N]
|
||||
if(T.ticketState != ADMIN_TICKET_OPEN)
|
||||
T.ticketState = ADMIN_TICKET_OPEN
|
||||
return TRUE
|
||||
|
||||
//Set ticket state with key N to resolved
|
||||
/datum/adminTicketHolder/proc/resolveTicket(var/N)
|
||||
var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N]
|
||||
if(T.ticketState != ADMIN_TICKET_RESOLVED)
|
||||
T.ticketState = ADMIN_TICKET_RESOLVED
|
||||
return TRUE
|
||||
|
||||
//Set ticket state with key N to closed
|
||||
/datum/adminTicketHolder/proc/closeTicket(var/N)
|
||||
var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N]
|
||||
if(T.ticketState != ADMIN_TICKET_CLOSED)
|
||||
T.ticketState = ADMIN_TICKET_CLOSED
|
||||
return TRUE
|
||||
|
||||
//Check if the user already has a ticket open and within the cooldown period.
|
||||
/datum/adminTicketHolder/proc/checkForOpenTicket(var/client/C)
|
||||
for(var/datum/admin_ticket/T in allTickets)
|
||||
if(T.clientName == C && T.ticketState == ADMIN_TICKET_OPEN && (T.ticketCooldown > world.time))
|
||||
return T
|
||||
return FALSE
|
||||
|
||||
//Check if the user has ANY ticket not resolved or closed.
|
||||
/datum/adminTicketHolder/proc/checkForTicket(var/client/C)
|
||||
var/list/tickets = list()
|
||||
for(var/datum/admin_ticket/T in allTickets)
|
||||
if(T.clientName == C && T.ticketState == ADMIN_TICKET_OPEN || T.ticketState == ADMIN_TICKET_STALE)
|
||||
tickets += T
|
||||
if(tickets.len)
|
||||
return tickets
|
||||
return FALSE
|
||||
|
||||
//return the client of a ticket number
|
||||
/datum/adminTicketHolder/proc/returnClient(var/N)
|
||||
var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N]
|
||||
return T.clientName
|
||||
|
||||
/datum/adminTicketHolder/proc/assignAdminToTicket(var/client/C, var/N)
|
||||
var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N]
|
||||
T.assignAdmin(C)
|
||||
return TRUE
|
||||
|
||||
//Single admin ticket
|
||||
|
||||
/datum/admin_ticket
|
||||
var/ticketNum // Ticket number
|
||||
var/clientName // Client which opened the ticket
|
||||
var/timeOpened // Time the ticket was opened
|
||||
var/title //The initial message with links
|
||||
var/list/content = list() // content of the admin help
|
||||
var/lastAdminResponse // Last admin who responded
|
||||
var/lastResponseTime // When the admin last responded
|
||||
var/locationSent // Location the player was when they send the ticket
|
||||
var/mobControlled // Mob they were controlling
|
||||
var/ticketState // State of the ticket, open, closed, resolved etc
|
||||
var/timeUntilStale // When the ticket goes stale
|
||||
var/ticketCooldown // Cooldown before allowing the user to open another ticket.
|
||||
var/adminAssigned // Admin who has assigned themselves to this ticket
|
||||
|
||||
//Ticker called when a ticket is created, checks for stale-ness.
|
||||
/datum/admin_ticket/proc/beginStaleCount()
|
||||
while(world.time < timeUntilStale || !lastAdminResponse || !adminAssigned) // While within the stale period OR no admin responded OR no admin assigned.
|
||||
|
||||
if(!src)
|
||||
return
|
||||
|
||||
sleep(200) // Check every 20 seconds.
|
||||
if(ticketState == ADMIN_TICKET_OPEN && world.time > timeUntilStale)
|
||||
message_adminTicket("<span class='adminticket'>Ticket #[ticketNum] has been open for [ADMIN_TICKET_TIMEOUT * 0.1] seconds. Changing status to stale.</span>")
|
||||
ticketState = ADMIN_TICKET_STALE
|
||||
break
|
||||
|
||||
//Set the cooldown period for the ticket. The time when it's created plus the defined cooldown time.
|
||||
/datum/admin_ticket/proc/setCooldownPeriod()
|
||||
ticketCooldown = world.time + ADMIN_TICKET_DUPLICATE_COOLDOWN
|
||||
|
||||
//Set the last admin who responded as the client passed as an arguement.
|
||||
/datum/admin_ticket/proc/setLastAdminResponse(var/client/C)
|
||||
lastAdminResponse = C
|
||||
lastResponseTime = worldtime2text()
|
||||
|
||||
//Return the ticket state as a colour coded text string.
|
||||
/datum/admin_ticket/proc/state2text()
|
||||
switch(ticketState)
|
||||
if(ADMIN_TICKET_OPEN)
|
||||
return "<font color='green'>OPEN</font>"
|
||||
if(ADMIN_TICKET_RESOLVED)
|
||||
return "<font color='blue'>RESOLVED</font>"
|
||||
if(ADMIN_TICKET_CLOSED)
|
||||
return "<font color='red'>CLOSED</font>"
|
||||
if(ADMIN_TICKET_STALE)
|
||||
return "<font color='orange'>STALE</font>"
|
||||
|
||||
//Assign the client passed to var/adminAsssigned
|
||||
/datum/admin_ticket/proc/assignAdmin(var/client/C, var/N)
|
||||
if(!C)
|
||||
return
|
||||
adminAssigned = C
|
||||
return TRUE
|
||||
|
||||
/datum/admin_ticket/proc/addResponse(var/client/C, var/M as text)
|
||||
if(C.holder)
|
||||
setLastAdminResponse(C)
|
||||
M = "[C]: [M]"
|
||||
content += M
|
||||
@@ -0,0 +1,172 @@
|
||||
/datum/adminTicketHolder/proc/returnUI(var/tab = ADMIN_TICKET_OPEN)
|
||||
set name = "Open Ticket Interface"
|
||||
set category = "Tickets"
|
||||
|
||||
//dat
|
||||
var/trStyle = "border-top:2px solid; border-bottom:2px solid; padding-top: 5px; padding-bottom: 5px;"
|
||||
var/tdStyleleft = "border-top:2px solid; border-bottom:2px solid; width:150px; text-align:center;"
|
||||
var/tdStyle = "border-top:2px solid; border-bottom:2px solid;"
|
||||
var/datum/admin_ticket/ticket
|
||||
var/dat
|
||||
dat += "<head><style>.adminticket{border:2px solid}</style></head>"
|
||||
dat += "<body><h1>Admin Tickets</h1>"
|
||||
|
||||
dat +="<a href='?src=[UID()];refresh=1'>Refresh</a><br /><a href='?src=[UID()];showopen=1'>Open Tickets</a><a href='?src=[UID()];showresolved=1'>Resolved Tickets</a><a href='?src=[UID()];showclosed=1'>Closed Tickets</a>"
|
||||
if(tab == ADMIN_TICKET_OPEN)
|
||||
dat += "<h2>Open Tickets</h2>"
|
||||
dat += "<table style='width:1300px; border: 3px solid;'>"
|
||||
dat +="<tr style='[trStyle]'><th style='[tdStyleleft]'>Control</th><th style='[tdStyle]'>Ticket</th></tr>"
|
||||
if(tab == ADMIN_TICKET_OPEN)
|
||||
for(var/T in allTickets)
|
||||
ticket = T
|
||||
if(ticket.ticketState == ADMIN_TICKET_OPEN || ticket.ticketState == ADMIN_TICKET_STALE)
|
||||
dat += "<tr style='[trStyle]'><td style ='[tdStyleleft]'><a href='?src=[UID()];resolve=[ticket.ticketNum]'>Resolve</a><a href='?src=[UID()];details=[ticket.ticketNum]'>Details</a> <br /> #[ticket.ticketNum] ([ticket.timeOpened]) [ticket.ticketState == ADMIN_TICKET_STALE ? "<font color='red'><b>STALE</font>" : ""] </td><td style='[tdStyle]'><b>[ticket.title]</td></tr>"
|
||||
else
|
||||
continue
|
||||
else if(tab == ADMIN_TICKET_RESOLVED)
|
||||
dat += "<h2>Resolved Tickets</h2>"
|
||||
for(var/T in allTickets)
|
||||
ticket = T
|
||||
if(ticket.ticketState == ADMIN_TICKET_RESOLVED)
|
||||
dat += "<tr style='[trStyle]'><td style ='[tdStyleleft]'><a href='?src=[UID()];resolve=[ticket.ticketNum]'>Resolve</a><a href='?src=[UID()];details=[ticket.ticketNum]'>Details</a> <br /> #[ticket.ticketNum] ([ticket.timeOpened]) </td><td style='[tdStyle]'><b>[ticket.title]</td></tr>"
|
||||
else
|
||||
continue
|
||||
else if(tab == ADMIN_TICKET_CLOSED)
|
||||
dat += "<h2>Closed Tickets</h2>"
|
||||
for(var/T in allTickets)
|
||||
ticket = T
|
||||
if(ticket.ticketState == ADMIN_TICKET_CLOSED)
|
||||
dat += "<tr style='[trStyle]'><td style ='[tdStyleleft]'><a href='?src=[UID()];resolve=[ticket.ticketNum]'>Resolve</a><a href='?src=[UID()];details=[ticket.ticketNum]'>Details</a> <br /> #[ticket.ticketNum] ([ticket.timeOpened]) </td><td style='[tdStyle]'><b>[ticket.title]</td></tr>"
|
||||
else
|
||||
continue
|
||||
|
||||
dat += "</table></body>"
|
||||
|
||||
return dat
|
||||
|
||||
/datum/adminTicketHolder/proc/showUI(var/client/user, var/tab)
|
||||
var/dat = null
|
||||
dat = returnUI(tab)
|
||||
var/datum/browser/popup = new(user, "admintickets", "Admin Tickets", 1400, 600)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/datum/adminTicketHolder/proc/showDetailUI(var/client/user, var/ticketID)
|
||||
var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[ticketID]
|
||||
var/status = "[T.state2text()]"
|
||||
|
||||
var/dat = "<h1>Admin Tickets</h1>"
|
||||
|
||||
dat +="<a href='?src=[UID()];refresh=1'>Show All</a><a href='?src=[UID()];refreshdetail=[T.ticketNum]'>Refresh</a>"
|
||||
|
||||
dat += "<h2>Ticket #[T.ticketNum]</h2>"
|
||||
|
||||
dat += "<h3>[T.clientName] / [T.mobControlled] opened this ticket at [T.timeOpened] at location [T.locationSent]</h3>"
|
||||
dat += "<h4>Ticket Status: <font color='red'>[status]</font>"
|
||||
dat += "<table style='width:950px; border: 3px solid;'>"
|
||||
dat += "<tr><td>[T.title]</td></tr>"
|
||||
|
||||
if(T.content.len > 1)
|
||||
for(var/i = 2, i <= T.content.len, i++)
|
||||
dat += "<tr><td>[T.content[i]]</td></tr>"
|
||||
|
||||
dat += "</table><br /><br />"
|
||||
dat += "<a href='?src=[UID()];detailreopen=[T.ticketNum]'>Re-Open</a><a href='?src=[UID()];detailresolve=[T.ticketNum]'>Resolve</a><br /><br />"
|
||||
|
||||
if(!T.adminAssigned)
|
||||
dat += "No admin assigned to this ticket - <a href='?src=[UID()];assignadmin=[T.ticketNum]'>Take Ticket</a><br />"
|
||||
else
|
||||
dat += "[T.adminAssigned] is assigned to this Ticket. - <a href='?src=[UID()];assignadmin=[T.ticketNum]'>Take Ticket</a><br />"
|
||||
|
||||
if(T.lastAdminResponse)
|
||||
dat += "<b>Last Admin Response:</b> [T.lastAdminResponse] at [T.lastResponseTime]"
|
||||
else
|
||||
dat +="<font color='red'>No Admin Response</font>"
|
||||
|
||||
dat += "<br /><br />"
|
||||
|
||||
dat += "<a href='?src=[UID()];detailclose=[T.ticketNum]'>Close Ticket</a>"
|
||||
|
||||
var/datum/browser/popup = new(user, "adminticketsdetail", "Admin Ticket #[T.ticketNum]", 1000, 600)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/datum/adminTicketHolder/proc/userDetailUI(var/client/user)
|
||||
//dat
|
||||
var/tickets = checkForTicket(user)
|
||||
var/dat
|
||||
dat += "<h1>Your open tickets</h1>"
|
||||
dat += "<table>"
|
||||
for(var/datum/admin_ticket/T in tickets)
|
||||
dat += "<tr><td><h2>Ticket #[T.ticketNum]</h2></td></tr>"
|
||||
for(var/i = 1, i <= T.content.len, i++)
|
||||
dat += "<tr><td>[T.content[i]]</td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
var/datum/browser/popup = new(user, "userticketsdetail", "Tickets", 1000, 600)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/datum/adminTicketHolder/Topic(href, href_list)
|
||||
|
||||
if(href_list["refresh"])
|
||||
showUI(usr)
|
||||
return
|
||||
|
||||
if(href_list["refreshdetail"])
|
||||
var/indexNum = text2num(href_list["refreshdetail"])
|
||||
showDetailUI(usr, indexNum)
|
||||
return
|
||||
|
||||
if(href_list["showopen"])
|
||||
showUI(usr, ADMIN_TICKET_OPEN)
|
||||
return
|
||||
if(href_list["showresolved"])
|
||||
showUI(usr, ADMIN_TICKET_RESOLVED)
|
||||
return
|
||||
if(href_list["showclosed"])
|
||||
showUI(usr, ADMIN_TICKET_CLOSED)
|
||||
return
|
||||
|
||||
if(href_list["details"])
|
||||
var/indexNum = text2num(href_list["details"])
|
||||
showDetailUI(usr.client, indexNum)
|
||||
return
|
||||
|
||||
if(href_list["resolve"])
|
||||
var/indexNum = text2num(href_list["resolve"])
|
||||
if(globAdminTicketHolder.resolveTicket(indexNum))
|
||||
message_adminTicket("[usr.client] / ([usr]) resolved admin ticket number [indexNum]")
|
||||
to_chat(returnClient(indexNum), "<span class='adminticket'>Your admin ticket has now been resolved.</span>")
|
||||
showUI(usr)
|
||||
|
||||
if(href_list["detailresolve"])
|
||||
var/indexNum = text2num(href_list["detailresolve"])
|
||||
if(globAdminTicketHolder.resolveTicket(indexNum))
|
||||
message_adminTicket("[usr.client] / ([usr]) resolved admin ticket number [indexNum]")
|
||||
to_chat(returnClient(indexNum), "<span class='adminticket'>Your admin ticket has now been resolved.</span>")
|
||||
showDetailUI(usr, indexNum)
|
||||
|
||||
if(href_list["detailclose"])
|
||||
var/indexNum = text2num(href_list["detailclose"])
|
||||
if(alert("Are you sure? This will send a negative message.",,"Yes","No") != "Yes")
|
||||
return
|
||||
if(globAdminTicketHolder.closeTicket(indexNum))
|
||||
message_adminTicket("[usr.client] / ([usr]) closed admin ticket number [indexNum]")
|
||||
to_chat(returnClient(indexNum), "<font color='red' size='4'><b>- AdminHelp Rejected! -</b></font>")
|
||||
to_chat(returnClient(indexNum), "<span class='boldmessage'>Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.</span>")
|
||||
to_chat(returnClient(indexNum), "<span class='adminticket'>Your ticket has now been closed.</span>")
|
||||
showDetailUI(usr, indexNum)
|
||||
|
||||
if(href_list["detailreopen"])
|
||||
var/indexNum = text2num(href_list["detailreopen"])
|
||||
if(globAdminTicketHolder.openTicket(indexNum))
|
||||
message_adminTicket("[usr.client] / ([usr]) re-opened admin ticket number [indexNum]")
|
||||
showDetailUI(usr, indexNum)
|
||||
|
||||
if(href_list["assignadmin"])
|
||||
var/indexNum = text2num(href_list["assignadmin"])
|
||||
if(globAdminTicketHolder.assignAdminToTicket(usr.client, indexNum))
|
||||
message_adminTicket("[usr.client] / ([usr]) has taken ticket number [indexNum]")
|
||||
to_chat(returnClient(indexNum), "<span class='adminticket'>Your ticket is being handled by [usr.client].")
|
||||
showDetailUI(usr, indexNum)
|
||||
@@ -0,0 +1,51 @@
|
||||
//Verbs
|
||||
|
||||
/client/proc/startadmintickets()
|
||||
set name = "Restart Admin Ticket System"
|
||||
set category = "Debug"
|
||||
|
||||
if(!holder && !check_rights(R_DEBUG))
|
||||
return
|
||||
|
||||
if(!globAdminTicketHolder)
|
||||
var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicketHolder
|
||||
else
|
||||
if(alert("Are you sure you want to reboot the admin ticket system?","Reboot Admin Tickets?","Yes","No") != "Yes")
|
||||
return
|
||||
message_admins("<span class='admintickets'>Restarting Admin Ticket System!</span>")
|
||||
globAdminTicketHolder = new /datum/adminTicketHolder
|
||||
message_admins("<span class='admintickets'>Admin Ticket System Restarted!</span>")
|
||||
|
||||
/client/proc/openTicketUI()
|
||||
|
||||
set name = "Open Ticket Interface"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder && !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
globAdminTicketHolder.showUI(usr)
|
||||
|
||||
/client/proc/resolveAllTickets()
|
||||
set name = "Resolve All Open Tickets"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder && !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
globAdminTicketHolder.resolveAllOpenTickets()
|
||||
|
||||
|
||||
|
||||
/client/proc/openUserUI()
|
||||
|
||||
set name = "My Tickets"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder && !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
globAdminTicketHolder.userDetailUI(usr.client)
|
||||
+23
-10
@@ -26,6 +26,12 @@
|
||||
message_admins("[key_name_admin(usr)] rejected [key_name_admin(C.mob)]'s admin help")
|
||||
log_admin("[key_name(usr)] rejected [key_name(C.mob)]'s admin help")
|
||||
|
||||
if(href_list["openadminticket"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/ticketID = text2num(href_list["openadminticket"])
|
||||
globAdminTicketHolder.showDetailUI(usr, ticketID)
|
||||
|
||||
if(href_list["stickyban"])
|
||||
stickyban(href_list["stickyban"],href_list)
|
||||
|
||||
@@ -242,16 +248,23 @@
|
||||
|
||||
else if(task == "permissions")
|
||||
if(!D) return
|
||||
var/list/permissionlist = list()
|
||||
for(var/i=1, i<=R_MAXPERMISSION, i<<=1) //that <<= is shorthand for i = i << 1. Which is a left bitshift
|
||||
permissionlist[rights2text(i)] = i
|
||||
var/new_permission = input("Select a permission to turn on/off", "Permission toggle", null, null) as null|anything in permissionlist
|
||||
if(!new_permission) return
|
||||
D.rights ^= permissionlist[new_permission]
|
||||
while(TRUE)
|
||||
var/list/permissionlist = list()
|
||||
for(var/i=1, i<=R_MAXPERMISSION, i<<=1) //that <<= is shorthand for i = i << 1. Which is a left bitshift
|
||||
permissionlist[rights2text(i)] = i
|
||||
var/new_permission = input("Select a permission to turn on/off", adm_ckey + "'s Permissions", null, null) as null|anything in permissionlist
|
||||
if(!new_permission)
|
||||
return
|
||||
var/oldrights = D.rights
|
||||
var/toggleresult = "ON"
|
||||
D.rights ^= permissionlist[new_permission]
|
||||
if(oldrights > D.rights)
|
||||
toggleresult = "OFF"
|
||||
|
||||
message_admins("[key_name_admin(usr)] toggled the [new_permission] permission of [adm_ckey] to [toggleresult]")
|
||||
log_admin("[key_name(usr)] toggled the [new_permission] permission of [adm_ckey] to [toggleresult]")
|
||||
log_admin_permission_modification(adm_ckey, permissionlist[new_permission])
|
||||
|
||||
message_admins("[key_name_admin(usr)] toggled the [new_permission] permission of [adm_ckey]")
|
||||
log_admin("[key_name(usr)] toggled the [new_permission] permission of [adm_ckey]")
|
||||
log_admin_permission_modification(adm_ckey, permissionlist[new_permission])
|
||||
|
||||
edit_admin_permissions()
|
||||
|
||||
@@ -1772,7 +1785,7 @@
|
||||
H.gene_stability = 100
|
||||
logmsg = "permanent regeneration."
|
||||
if("Super Powers")
|
||||
var/list/default_genes = list(REGENERATEBLOCK, NOBREATHBLOCK, COLDBLOCK)
|
||||
var/list/default_genes = list(REGENERATEBLOCK, BREATHLESSBLOCK, COLDBLOCK)
|
||||
for(var/gene in default_genes)
|
||||
H.dna.SetSEState(gene, 1)
|
||||
genemutcheck(H, gene, null, MUTCHK_FORCED)
|
||||
|
||||
@@ -115,7 +115,17 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
to_chat(X, msg)
|
||||
if("Adminhelp")
|
||||
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""] (<A HREF='?_src_=holder;take_question=[mob.UID()]'>TAKE</A>) :</span> <span class='adminhelp'>[msg]</span>"
|
||||
var/ticketNum // Holder for the ticket number
|
||||
var/prunedmsg ="[usr.client]: [msg]" // Message without links
|
||||
if(globAdminTicketHolder.checkForOpenTicket(usr.client)) // If user already has an open ticket
|
||||
var/datum/admin_ticket/T = globAdminTicketHolder.checkForOpenTicket(usr.client) // Make T equal to the ticket they have open
|
||||
ticketNum = T.ticketNum // ticketNum is the number of their ticket.
|
||||
T.addResponse(usr.client, msg)
|
||||
else
|
||||
ticketNum = globAdminTicketHolder.getTicketCounter() // ticketNum is the ticket ready to be assigned.
|
||||
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[mob.UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;openadminticket=[ticketNum]'>TICKET</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""] :</span> <span class='adminhelp'>[msg]</span>"
|
||||
//Open a new adminticket and inform the user.
|
||||
globAdminTicketHolder.newTicket(src, prunedmsg, msg)
|
||||
for(var/client/X in modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
|
||||
@@ -183,6 +183,23 @@
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
|
||||
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg]</span>")
|
||||
|
||||
//Check if the mob being PM'd has any open admin tickets.
|
||||
var/tickets = list()
|
||||
tickets = globAdminTicketHolder.checkForTicket(C)
|
||||
if(tickets)
|
||||
for(var/datum/admin_ticket/i in tickets)
|
||||
i.addResponse(src, msg) // Add this response to their open tickets.
|
||||
return
|
||||
|
||||
tickets = globAdminTicketHolder.checkForTicket(src)
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
|
||||
tickets = globAdminTicketHolder.checkForTicket(src)
|
||||
if(tickets)
|
||||
for(var/datum/admin_ticket/i in tickets)
|
||||
i.addResponse(src, msg)
|
||||
return
|
||||
|
||||
|
||||
/client/proc/cmd_admin_irc_pm()
|
||||
if(prefs.muted & MUTE_ADMINHELP)
|
||||
to_chat(src, "<font color='red'>Error: Private-Message: You are unable to use PM-s (muted).</font>")
|
||||
|
||||
@@ -32,7 +32,13 @@
|
||||
|
||||
for(var/client/C in admins)
|
||||
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob))
|
||||
to_chat(C, "<span class='[check_rights(R_ADMIN, 0) ? "mentor_channel_admin" : "mentor_channel"]'>MENTOR: <span class='name'>[key_name(usr, 1)]</span> ([admin_jump_link(mob)]): <span class='message'>[msg]</span></span>")
|
||||
var/display_name = key
|
||||
if(holder.fakekey)
|
||||
if(C.holder && C.holder.rights & R_ADMIN)
|
||||
display_name = "[holder.fakekey]/([key])"
|
||||
else
|
||||
display_name = holder.fakekey
|
||||
to_chat(C, "<span class='[check_rights(R_ADMIN, 0) ? "mentor_channel_admin" : "mentor_channel"]'>MENTOR: <span class='name'>[display_name]</span> ([admin_jump_link(mob)]): <span class='message'>[msg]</span></span>")
|
||||
|
||||
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
@@ -577,7 +577,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
var/list/choices = list(
|
||||
"strip",
|
||||
"as job...",
|
||||
"emergency response team member",
|
||||
"emergency response team member",
|
||||
"emergency response team leader"
|
||||
)
|
||||
|
||||
@@ -642,7 +642,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
if(dresscode == "emergency response team leader")
|
||||
equip_team.equip_officer("Commander", M)
|
||||
else
|
||||
switch(alert("Loadout Type", "Emergency Response Team", "Security", "Engineer", "Medic"))
|
||||
var/list/ert_outfits = list("Security", "Engineer", "Medic", "Janitor", "Paranormal")
|
||||
var/echoice = input("Loadout Type", "Emergency Response Team") as null|anything in ert_outfits
|
||||
if(!echoice)
|
||||
return
|
||||
switch(echoice)
|
||||
if("Commander")
|
||||
equip_team.equip_officer("Commander", M)
|
||||
if("Security")
|
||||
@@ -651,6 +655,10 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
equip_team.equip_officer("Engineer", M)
|
||||
if("Medic")
|
||||
equip_team.equip_officer("Medic", M)
|
||||
if("Janitor")
|
||||
equip_team.equip_officer("Janitor", M)
|
||||
if("Paranormal")
|
||||
equip_team.equip_officer("Paranormal", M)
|
||||
else
|
||||
to_chat(src, "Invalid ERT Loadout selected")
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ var/global/sent_honksquad = 0
|
||||
new_honksquad.key = pick(commandos)
|
||||
commandos -= new_honksquad.key
|
||||
new_honksquad.internal = new_honksquad.s_store
|
||||
new_honksquad.update_internals_hud_icon(1)
|
||||
new_honksquad.update_action_buttons_icon()
|
||||
|
||||
//So they don't forget their code or mission.
|
||||
new_honksquad.mind.store_memory("<B>Mission:</B> <span class='warning'>[input].</span>")
|
||||
|
||||
@@ -88,7 +88,7 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
if(!spawn_sit_mgmt || theguy.key != key)
|
||||
new_syndicate_infiltrator.key = theguy.key
|
||||
new_syndicate_infiltrator.internal = new_syndicate_infiltrator.s_store
|
||||
new_syndicate_infiltrator.update_internals_hud_icon(1)
|
||||
new_syndicate_infiltrator.update_action_buttons_icon()
|
||||
infiltrators -= theguy
|
||||
to_chat(new_syndicate_infiltrator, "<span class='danger'>You are a [!syndicate_leader_selected?"Infiltrator":"<B>Lead Infiltrator</B>"] in the service of the Syndicate. \nYour current mission is: <B>[input]</B></span>")
|
||||
to_chat(new_syndicate_infiltrator, "<span class='notice'>You are equipped with an uplink implant to help you achieve your objectives. ((activate it via button in top left of screen))</span>")
|
||||
@@ -119,7 +119,7 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
var/mob/living/carbon/human/syndimgmtmob = create_syndicate_infiltrator(L, 1, 100, 1)
|
||||
syndimgmtmob.key = key
|
||||
syndimgmtmob.internal = syndimgmtmob.s_store
|
||||
syndimgmtmob.update_internals_hud_icon(1)
|
||||
syndimgmtmob.update_action_buttons_icon()
|
||||
syndimgmtmob.faction += "syndicate"
|
||||
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite, slot_wear_suit)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
var/list/VVlocked = list("vars", "var_edited", "client", "firemut", "ishulk", "telekinesis", "xray", "ka", "virus", "viruses", "cuffed", "last_eaten", "unlock_content") // R_DEBUG
|
||||
var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays", "resize") // R_EVENT | R_DEBUG
|
||||
var/list/VVckey_edit = list("key", "ckey") // R_EVENT | R_DEBUG
|
||||
var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width", "bound_x", "bound_y") // R_DEBUG + warning
|
||||
var/list/VVpixelmovement = list("step_x", "step_y", "step_size", "bound_height", "bound_width", "bound_x", "bound_y") // R_DEBUG + warning
|
||||
/client/proc/vv_get_class(var/var_value)
|
||||
if(isnull(var_value))
|
||||
. = VV_NULL
|
||||
@@ -615,4 +615,4 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
|
||||
log_to_dd("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_new]")
|
||||
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [var_new]"
|
||||
message_admins(msg)
|
||||
message_admins(msg)
|
||||
|
||||
@@ -361,7 +361,7 @@ client/proc/one_click_antag()
|
||||
|
||||
new_syndicate_commando.key = theghost.key
|
||||
new_syndicate_commando.internal = new_syndicate_commando.s_store
|
||||
new_syndicate_commando.update_internals_hud_icon(1)
|
||||
new_syndicate_commando.update_action_buttons_icon()
|
||||
|
||||
//So they don't forget their code or mission.
|
||||
|
||||
|
||||
@@ -410,7 +410,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if("Death Commando")//Leaves them at late-join spawn.
|
||||
new_character.equip_death_commando()
|
||||
new_character.internal = new_character.s_store
|
||||
new_character.update_internals_hud_icon(1)
|
||||
new_character.update_action_buttons_icon()
|
||||
else//They may also be a cyborg or AI.
|
||||
switch(new_character.mind.assigned_role)
|
||||
if("Cyborg")//More rigging to make em' work and check if they're traitor.
|
||||
@@ -576,9 +576,9 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
|
||||
command_announcement.Announce(input, customname, MsgSound[beepsound], , , type)
|
||||
print_command_report(input, "[command_name()] Update")
|
||||
else if("No")
|
||||
if("No")
|
||||
//same thing as the blob stuff - it's not public, so it's classified, dammit
|
||||
command_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg', from = "[command_name()] Update")
|
||||
command_announcer.autosay("A classified message has been printed out at all communication consoles.");
|
||||
print_command_report(input, "Classified [command_name()] Update")
|
||||
else
|
||||
return
|
||||
@@ -763,6 +763,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
|
||||
if(confirm != "Yes") return
|
||||
|
||||
if(alert("Set Shuttle Recallable (Select Yes unless you know what this does)", "Recallable?", "Yes", "No") == "Yes")
|
||||
shuttle_master.emergency.canRecall = TRUE
|
||||
else
|
||||
shuttle_master.emergency.canRecall = FALSE
|
||||
|
||||
shuttle_master.emergency.request()
|
||||
|
||||
feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -781,7 +786,18 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_DOCKED)
|
||||
return
|
||||
|
||||
shuttle_master.emergency.cancel()
|
||||
if(shuttle_master.emergency.canRecall == FALSE)
|
||||
if(alert("Shuttle is currently set to be nonrecallable. Recalling may break things. Respect Recall Status?", "Override Recall Status?", "Yes", "No") == "Yes")
|
||||
return
|
||||
else
|
||||
var/keepStatus = alert("Maintain recall status on future shuttle calls?", "Maintain Status?", "Yes", "No") == "Yes" //Keeps or drops recallability
|
||||
shuttle_master.emergency.canRecall = TRUE // must be true for cancel proc to work
|
||||
shuttle_master.emergency.cancel()
|
||||
if(keepStatus)
|
||||
shuttle_master.emergency.canRecall = FALSE // restores original status
|
||||
else
|
||||
shuttle_master.emergency.cancel()
|
||||
|
||||
feedback_add_details("admin_verb","CCSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
log_admin("[key_name(usr)] admin-recalled the emergency shuttle.")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] admin-recalled the emergency shuttle.</span>")
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
set desc = "Turns your marked object into a JSON string you can later use to re-create the object"
|
||||
set category = "Debug"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
if(!check_rights(R_ADMIN|R_DEBUG))
|
||||
return
|
||||
|
||||
if(!istype(holder.marked_datum, /atom/movable))
|
||||
@@ -18,7 +18,7 @@
|
||||
set desc = "Creates an object from a JSON string"
|
||||
set category = "Debug"
|
||||
|
||||
if(!check_rights(R_ADMIN|R_DEBUG))
|
||||
if(!check_rights(R_SPAWN)) // this involves spawning things
|
||||
return
|
||||
|
||||
var/json_text = input("Enter the JSON code:","Text") as message|null
|
||||
|
||||
@@ -64,7 +64,7 @@ var/global/sent_strike_team = 0
|
||||
new_commando.key = pick(commandos)
|
||||
commandos -= new_commando.key
|
||||
new_commando.internal = new_commando.s_store
|
||||
new_commando.update_internals_hud_icon(1)
|
||||
new_commando.update_action_buttons_icon()
|
||||
|
||||
//So they don't forget their code or mission.
|
||||
if(nuke_code)
|
||||
|
||||
@@ -71,7 +71,7 @@ var/global/sent_syndicate_strike_team = 0
|
||||
new_syndicate_commando.key = pick(commandos)
|
||||
commandos -= new_syndicate_commando.key
|
||||
new_syndicate_commando.internal = new_syndicate_commando.s_store
|
||||
new_syndicate_commando.update_internals_hud_icon(1)
|
||||
new_syndicate_commando.update_action_buttons_icon()
|
||||
|
||||
//So they don't forget their code or mission.
|
||||
if(nuke_code)
|
||||
|
||||
@@ -298,6 +298,12 @@ var/global/datum/prizes/global_prizes = new
|
||||
typepath = /obj/item/stack/tile/fakespace/loaded
|
||||
cost = 150
|
||||
|
||||
/datum/prize_item/arcadecarpet
|
||||
name = "Arcade Carpet"
|
||||
desc = "A stack of genuine arcade carpet tiles, complete with authentic soft drink stains!"
|
||||
typepath = /obj/item/stack/tile/arcade_carpet/loaded
|
||||
cost = 150
|
||||
|
||||
/datum/prize_item/bike
|
||||
name = "Awesome Bike!"
|
||||
desc = "WOAH."
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "igniter"
|
||||
materials = list(MAT_METAL=500, MAT_GLASS=50)
|
||||
origin_tech = "magnets=1"
|
||||
var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
|
||||
|
||||
/obj/item/device/assembly/igniter/New()
|
||||
..()
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
affecting = H.get_organ(type)
|
||||
H.Stun(3)
|
||||
if(affecting)
|
||||
affecting.take_damage(1, 0)
|
||||
affecting.receive_damage(1, 0)
|
||||
H.updatehealth()
|
||||
else if(ismouse(target))
|
||||
var/mob/living/simple_animal/mouse/M = target
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
name = "Syndicate Commando"
|
||||
corpseuniform = /obj/item/clothing/under/syndicate
|
||||
corpsesuit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
corpseshoes = /obj/item/clothing/shoes/combat
|
||||
corpseshoes = /obj/item/clothing/shoes/magboots/syndie
|
||||
corpsegloves = /obj/item/clothing/gloves/combat
|
||||
corpseradio = /obj/item/device/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/syndicate
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
return ..()
|
||||
|
||||
/obj/effect/waterfall/proc/drip()
|
||||
var/obj/effect/effect/water/W = new(loc)
|
||||
var/obj/effect/particle_effect/water/W = new(loc)
|
||||
W.dir = dir
|
||||
spawn(1)
|
||||
W.loc = get_step(W, dir)
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
to_chat(user, "<B>Your wish is granted, but at a terrible cost...</B>")
|
||||
to_chat(user, "The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart.")
|
||||
user.mutations.Add(LASER)
|
||||
user.mutations.Add(RESIST_COLD)
|
||||
user.mutations.Add(COLDRES)
|
||||
user.mutations.Add(XRAY)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/human = user
|
||||
@@ -177,7 +177,7 @@
|
||||
call(src,triggerproc)(M)
|
||||
|
||||
/obj/effect/meatgrinder/proc/triggerrad1(mob)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
for(var/mob/O in viewers(world.view, src.loc))
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
@@ -215,4 +215,76 @@
|
||||
to_chat(C, "<span class='notice'>You have regenerated.</span>")
|
||||
C.visible_message("<span class='warning'>[usr] appears to wake from the dead, having healed all wounds.</span>")
|
||||
C.update_canmove()
|
||||
return 1
|
||||
return 1
|
||||
|
||||
/obj/item/device/wildwest_communicator
|
||||
name = "Syndicate Comms Device"
|
||||
icon_state = "gangtool-red"
|
||||
item_state = "walkietalkie"
|
||||
desc = "Use to communicate with the syndicate base commander."
|
||||
var/used = FALSE
|
||||
|
||||
/obj/item/device/wildwest_communicator/attack_self(mob/living/user)
|
||||
|
||||
if(!is_away_level(user.z))
|
||||
to_chat(user, "<span class='warning'>The communicator emits a faint beep. Perhaps it is out of range?</span>")
|
||||
return
|
||||
|
||||
if(used)
|
||||
to_chat(user, "<span class='warning'>The communicator buzzes, and then dies. Apparently nobody is responding.</span>")
|
||||
return
|
||||
|
||||
var/initial_question = "<span class='warning'>The communicator buzzes, and you hear a voice on the line, almost lost in the static. 'Hello? Who is this?'.</span>"
|
||||
to_chat(user, initial_question)
|
||||
|
||||
var/const/option_explorer = "(TRUTH) Explorers."
|
||||
var/const/option_bluff = "(BLUFF) Weapons delivery."
|
||||
var/const/option_threat = "(THREAT) NT, here to kick your ass!"
|
||||
var/const/option_syndicate = "(SYNDI) Agent reporting in..."
|
||||
var/list/response_choices = list(option_explorer, option_bluff, option_threat)
|
||||
|
||||
if(istype(user, /mob/living) && user.mind)
|
||||
if(user.mind.special_role == "Traitor")
|
||||
response_choices |= option_syndicate
|
||||
|
||||
var/selected_choice = input(user, "How do you respond on the comms device?", "Response to Syndicate") as null|anything in response_choices
|
||||
|
||||
if(!selected_choice)
|
||||
return
|
||||
switch(selected_choice)
|
||||
if(option_explorer)
|
||||
to_chat(user, "<span class='warning'>The communicator buzzes, and you hear the voice again: 'Hah! You sure picked the wrong asteroid to explore. Get em, boys!'</span>")
|
||||
if(option_bluff)
|
||||
to_chat(user, "<span class='warning'>The communicator buzzes, and you hear the voice again: 'Really? I think not. Get them!'</span>")
|
||||
if(option_threat)
|
||||
to_chat(user, "<span class='warning'>The communicator buzzes, and you hear the voice again: 'Oh really now?' You hear a clicking sound. 'Team, get back here. We have trouble'. Then the line goes dead.</span>")
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if(L.name == "wildwest_syndipod")
|
||||
var/obj/spacepod/syndi/P = new /obj/spacepod/syndi(get_turf(L))
|
||||
P.name = "Syndi Recon Pod"
|
||||
if(L.name == "wildwest_syndibackup")
|
||||
var/mob/living/simple_animal/hostile/syndicate/ranged/space/R = new /mob/living/simple_animal/hostile/syndicate/ranged/space(get_turf(L))
|
||||
R.name = "Syndi Recon Team"
|
||||
if(option_syndicate)
|
||||
to_chat(user, "<span class='warning'>The communicator buzzes, and you hear the voice again: 'Well, I'll be damned. An agent out here? You must be off-mission! Leave my troops alone, and they will do the same for you. Our Commander will handle you himself.'</span>")
|
||||
stand_down()
|
||||
used = TRUE
|
||||
|
||||
/obj/item/device/wildwest_communicator/proc/stand_down()
|
||||
for(var/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/W in living_mob_list)
|
||||
W.on_alert = FALSE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/wildwest
|
||||
var/on_alert = TRUE
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/ListTargets()
|
||||
if(on_alert)
|
||||
return ..()
|
||||
return list()
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/death(gibbed)
|
||||
if(!on_alert)
|
||||
say("How could you betray the Syndicate?")
|
||||
for(var/mob/living/simple_animal/hostile/syndicate/ranged/wildwest/W in living_mob_list)
|
||||
W.on_alert = TRUE
|
||||
..(gibbed)
|
||||
@@ -22,20 +22,20 @@
|
||||
M.Move(dest)
|
||||
|
||||
if(entersparks)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(4, 1, src)
|
||||
s.start()
|
||||
if(exitsparks)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(4, 1, dest)
|
||||
s.start()
|
||||
|
||||
if(entersmoke)
|
||||
var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread
|
||||
var/datum/effect_system/smoke_spread/s = new
|
||||
s.set_up(4, 1, src, 0)
|
||||
s.start()
|
||||
if(exitsmoke)
|
||||
var/datum/effect/system/harmless_smoke_spread/s = new /datum/effect/system/harmless_smoke_spread
|
||||
var/datum/effect_system/smoke_spread/s = new
|
||||
s.set_up(4, 1, dest, 0)
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
//Cactus, Speedbird, Dynasty, oh my
|
||||
|
||||
var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
|
||||
|
||||
/datum/lore/atc_controller
|
||||
var/delay_max = 10 MINUTES //Maximum amount of tiem between ATC messages. Default is 10 mins.
|
||||
var/delay_min = 5 MINUTES //Minimum amount of time between ATC messages. Default is 5 mins.
|
||||
var/backoff_delay = 5 MINUTES //How long to back off if we can't talk and want to. Default is 5 mins.
|
||||
var/next_message //When the next message should happen in world.time
|
||||
var/force_chatter_type //Force a specific type of messages
|
||||
|
||||
var/squelched = FALSE //If ATC is squelched currently
|
||||
|
||||
/datum/lore/atc_controller/New()
|
||||
spawn(30 SECONDS) //Lots of lag at the start of a shift.
|
||||
msg("New shift beginning, resuming traffic control.")
|
||||
next_message = world.time + rand(delay_min, delay_max)
|
||||
process()
|
||||
|
||||
/datum/lore/atc_controller/proc/process()
|
||||
if(world.time >= next_message)
|
||||
if(squelched)
|
||||
next_message = world.time + backoff_delay
|
||||
else
|
||||
next_message = world.time + rand(delay_min,delay_max)
|
||||
random_convo()
|
||||
|
||||
spawn(1 MINUTES) //We don't really need high-accuracy here.
|
||||
process()
|
||||
|
||||
/datum/lore/atc_controller/proc/msg(var/message,var/sender)
|
||||
ASSERT(message)
|
||||
global_announcer.autosay("[message]", sender ? sender : "[using_map.station_short] Space Control")
|
||||
|
||||
/datum/lore/atc_controller/proc/reroute_traffic(var/yes = 1)
|
||||
if(yes)
|
||||
if(!squelched)
|
||||
msg("Rerouting traffic away from [using_map.station_name].")
|
||||
squelched = TRUE
|
||||
else
|
||||
if(squelched)
|
||||
msg("Resuming normal traffic routing around [using_map.station_name].")
|
||||
squelched = FALSE
|
||||
|
||||
/datum/lore/atc_controller/proc/shift_ending(var/evac = 0)
|
||||
msg("Automated Shuttle departing [using_map.station_name] for [using_map.dock_name] on routine transfer route.", "NT Automated Shuttle")
|
||||
sleep(5 SECONDS)
|
||||
msg("Automated Shuttle, cleared to complete routine transfer from [using_map.station_name] to [using_map.dock_name].")
|
||||
|
||||
/datum/lore/atc_controller/proc/random_convo()
|
||||
var/one = pick(loremaster.organizations) //These will pick an index, not an instance
|
||||
var/two = pick(loremaster.organizations)
|
||||
|
||||
var/datum/lore/organization/source = loremaster.organizations[one] //Resolve to the instances
|
||||
var/datum/lore/organization/dest = loremaster.organizations[two]
|
||||
|
||||
//Let's get some mission parameters
|
||||
var/owner = source.short_name //Use the short name
|
||||
var/prefix = pick(source.ship_prefixes) //Pick a random prefix
|
||||
var/mission = source.ship_prefixes[prefix] //The value of the prefix is the mission type that prefix does
|
||||
var/shipname = pick(source.ship_names) //Pick a random ship name to go with it
|
||||
var/destname = pick(dest.destination_names) //Pick a random holding from the destination
|
||||
|
||||
var/combined_name = "[owner] [prefix] [shipname]"
|
||||
var/alt_atc_names = list("[using_map.station_short] TraCon", "[using_map.station_short] Control", "[using_map.station_short] STC", "[using_map.station_short] Airspace")
|
||||
var/wrong_atc_names = list("Sol Command", "Orion Control", "[using_map.dock_name]")
|
||||
var/mission_noun = list("flight", "mission", "route")
|
||||
var/request_verb = list("requesting", "calling for", "asking for")
|
||||
|
||||
//First response is 'yes', second is 'no'
|
||||
var/requests = list("[using_map.station_short] transit clearance" = list("cleared to transit", "unable to approve, contact regional on 953.5"),
|
||||
"planetary flight rules" = list("cleared planetary flight rules", "unable to approve planetary flight rules due to traffic"),
|
||||
"special flight rules" = list("cleared special flight rules", "unable to approve special flight rules for your traffic class"),
|
||||
"current solar weather info" = list("sending you the relevant information via tightbeam", "cannot fulfill your request at the moment"),
|
||||
"nearby traffic info" = list("sending you current traffic info", "no known traffic for your flight plan route"),
|
||||
"remote telemetry data" = list("sending telemetry now", "no uplink from your ship, recheck your uplink and ask again"),
|
||||
"refueling information" = list("sending refueling information now", "no fuel for your ship class in this sector"),
|
||||
"a current system time sync" = list("sending time sync ping to you now", "your ship isn't compatible with our time sync, set time manually"),
|
||||
"current system starcharts" = list("transmitting current starcharts", "request on standby due to demand"),
|
||||
"permission to engage FTL" = list("cleared to FTL, good day", "hold position, traffic crossing"),
|
||||
"permission to transit system" = list("cleared to transit, good day", "hold position, traffic crossing"),
|
||||
"permission to depart system" = list("cleared to leave via flight plan route, good day", "hold position, traffic crossing"),
|
||||
"permission to enter system" = list("good day, cleared in as published", "hold position, traffic crossing"),
|
||||
)
|
||||
|
||||
//Random chance things for variety
|
||||
var/chatter_type = "normal"
|
||||
if(force_chatter_type)
|
||||
chatter_type = force_chatter_type
|
||||
else
|
||||
chatter_type = pick(2;"emerg",5;"wrong_freq","normal") //Be nice to have wrong_lang...
|
||||
|
||||
var/yes = prob(90) //Chance for them to say yes vs no
|
||||
|
||||
var/request = pick(requests)
|
||||
var/callname = pick(alt_atc_names)
|
||||
var/response = requests[request][yes ? 1 : 2] //1 is yes, 2 is no
|
||||
|
||||
var/full_request
|
||||
var/full_response
|
||||
var/full_closure
|
||||
|
||||
switch(chatter_type)
|
||||
if("wrong_freq")
|
||||
callname = pick(wrong_atc_names)
|
||||
full_request = "[callname], this is [combined_name] on a [mission] [pick(mission_noun)] to [destname], [pick(request_verb)] [request]."
|
||||
full_response = "[combined_name], this is [using_map.station_short] TraCon, wrong frequency. Switch to [rand(700,999)].[rand(1,9)]."
|
||||
full_closure = "[using_map.station_short] TraCon, copy, apologies."
|
||||
if("wrong_lang")
|
||||
//Can't implement this until autosay has language support
|
||||
if("emerg")
|
||||
var/problem = pick("hull breaches on multiple decks","unknown life forms on board","a drive about to go critical","asteroids impacting the hull","a total loss of engine power","people trying to board the ship")
|
||||
full_request = "Mayday, mayday, mayday, this is [combined_name] declaring an emergency! We have [problem]!"
|
||||
var/rand_freq = "[rand(700,999)].[rand(1,9)]"
|
||||
full_response = "[combined_name], this is [using_map.station_short] TraCon, copy. Switch to emergency responder channel [rand_freq]."
|
||||
full_closure = "Roger, [using_map.station_short] TraCon, contacting [rand_freq]."
|
||||
else
|
||||
full_request = "[callname], this is [combined_name] on a [mission] [pick(mission_noun)] to [destname], [pick(request_verb)] [request]."
|
||||
full_response = "[combined_name], this is [using_map.station_short] TraCon, [response]." //Station TraCon always calls themselves TraCon
|
||||
full_closure = "[using_map.station_short] TraCon, [yes ? "thank you" : "copy"], good day." //They always copy what TraCon called themselves in the end when they realize they said it wrong
|
||||
|
||||
//Ship sends request to ATC
|
||||
msg(full_request,"[prefix] [shipname]")
|
||||
sleep(5 SECONDS)
|
||||
//ATC sends response to ship
|
||||
msg(full_response)
|
||||
sleep(5 SECONDS)
|
||||
//Ship sends response to ATC
|
||||
msg(full_closure,"[prefix] [shipname]")
|
||||
@@ -0,0 +1,16 @@
|
||||
//I AM THE LOREMASTER, ARE YOU THE GATEKEEPER?
|
||||
|
||||
var/datum/lore/loremaster/loremaster = new/datum/lore/loremaster
|
||||
|
||||
/datum/lore/loremaster
|
||||
var/list/organizations = list()
|
||||
|
||||
/datum/lore/loremaster/New()
|
||||
|
||||
var/list/paths = typesof(/datum/lore/organization) - /datum/lore/organization
|
||||
for(var/path in paths)
|
||||
// Some intermediate paths are not real organizations (ex. /datum/lore/organization/mil). Only do ones with names
|
||||
var/datum/lore/organization/instance = path
|
||||
if(initial(instance.name))
|
||||
instance = new path()
|
||||
organizations[path] = instance
|
||||
@@ -0,0 +1,549 @@
|
||||
//Datums for different companies that can be used by busy_space
|
||||
/datum/lore/organization
|
||||
var/name = "" // Organization's name
|
||||
var/short_name = "" // Organization's shortname (Nanotrasen for "Nanotrasen Incorporated")
|
||||
var/acronym = "" // Organization's acronym, e.g. 'NT' for Nanotrasen'.
|
||||
var/desc = "" // One or two paragraph description of the organization, but only current stuff. Currently unused.
|
||||
var/history = "" // Historical description of the organization's origins Currently unused.
|
||||
var/work = "" // Short description of their work, eg "an arms manufacturer"
|
||||
var/headquarters = "" // Location of the organization's HQ. Currently unused.
|
||||
var/motto = "" // A motto/jingle/whatever, if they have one. Currently unused.
|
||||
|
||||
var/list/ship_prefixes = list() //Some might have more than one! Like Nanotrasen. Value is the mission they perform, e.g. ("ABC" = "mission desc")
|
||||
var/list/ship_names = list( //Names of spaceships. This is a mostly generic list that all the other organizations inherit from if they don't have anything better.
|
||||
"Kestrel",
|
||||
"Beacon",
|
||||
"Signal",
|
||||
"Freedom",
|
||||
"Glory",
|
||||
"Axiom",
|
||||
"Eternal",
|
||||
"Icarus",
|
||||
"Harmony",
|
||||
"Light",
|
||||
"Discovery",
|
||||
"Endeavour",
|
||||
"Explorer",
|
||||
"Swift",
|
||||
"Dragonfly",
|
||||
"Ascendant",
|
||||
"Tenacious",
|
||||
"Pioneer",
|
||||
"Hawk",
|
||||
"Haste",
|
||||
"Radiant",
|
||||
"Luminous",
|
||||
"Gallant",
|
||||
"Dependable",
|
||||
"Indomitable",
|
||||
"Guardian",
|
||||
"Resolution",
|
||||
"Fearless",
|
||||
"Amazon",
|
||||
"Relentless",
|
||||
"Inspire",
|
||||
"Implacable",
|
||||
"Steadfast",
|
||||
"Leviathan",
|
||||
"Dauntless",
|
||||
"Adroit",
|
||||
"Mistral",
|
||||
"Typhoon",
|
||||
"Titan",
|
||||
"Kupua",
|
||||
"Alchemist",
|
||||
"Cuirass",
|
||||
"Citadel",
|
||||
"Rondelle",
|
||||
"Camail",
|
||||
"Ocrea",
|
||||
"Ram",
|
||||
"Crest",
|
||||
"Tanko",
|
||||
"Pommel",
|
||||
"Kissaki",
|
||||
"Cavalier",
|
||||
"Anelace",
|
||||
"Flint",
|
||||
"Xiphos",
|
||||
"Parrot",
|
||||
"Chamber",
|
||||
"Annellet",
|
||||
"Cestus",
|
||||
"Talwar")
|
||||
var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly.
|
||||
var/autogenerate_destination_names = TRUE
|
||||
|
||||
/datum/lore/organization/New()
|
||||
..()
|
||||
if(autogenerate_destination_names) // Lets pad out the destination names.
|
||||
var/i = rand(6, 10)
|
||||
var/list/star_names = list(
|
||||
"Sol", "Alpha Centauri", "Sirius", "Vega", "Regulus", "Vir", "Algol", "Aldebaran",
|
||||
"Delta Doradus", "Menkar", "Geminga", "Elnath", "Gienah", "Mu Leporis", "Nyx", "Tau Ceti",
|
||||
"Wazn", "Alphard", "Phact", "Altair", "Mauna", "Jargon", "Xarxis", "Hestia", "Dalstis", "Cygni", "Haverick", "Corvus", "Sancere", "Cydoni", "Kaliban", "Midway", "Dansik", "Branwyn")
|
||||
var/list/destination_types = list("dockyard", "station", "vessel", "waystation", "telecommunications satellite", "spaceport", "distress beacon", "anomaly", "colony", "outpost")
|
||||
while(i)
|
||||
destination_names.Add("a [pick(destination_types)] in [pick(star_names)]")
|
||||
i--
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// TSCs
|
||||
/datum/lore/organization/tsc/nanotrasen
|
||||
name = "Nanotrasen Incorporated"
|
||||
short_name = "Nanotrasen"
|
||||
acronym = "NT"
|
||||
desc = "The largest shareholder in the galactic plasma markets, Nanotrasen is a research and mining corporation which specializes in\
|
||||
FTL technologies and weapon systems. Frowned upon by most governments due to their shady business tactics and poor ethics record,\
|
||||
Nanotrasen is often seen as a necessary evil for maintaining access to the often volatile plasma market. Nanotrasen was originally\
|
||||
incorporated on Earth with their headquarters situated on Mars, however they have recently moved most of their operations to the Epsilon Eridani sector."
|
||||
history = "" // To be written someday.
|
||||
work = "research giant"
|
||||
headquarters = "Mars"
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("NSV" = "exploration", "NTV" = "hauling", "NDV" = "patrol", "NRV" = "emergency response")
|
||||
// Note that the current station being used will be pruned from this list upon being instantiated
|
||||
destination_names = list(
|
||||
"NAS Trurl in Epsilon Eridani",
|
||||
"NAS Crescent in Tau Ceti",
|
||||
"NSS Exodus in Tau Ceti",
|
||||
"NSS Antiqua in Darsing",
|
||||
"NRS Orion in Sol",
|
||||
"NSS Vector in Omicron Ceti",
|
||||
"NBS Anansi in Omicron Ceti",
|
||||
"NSS Redemption in Sirius",
|
||||
"NDS Inferno in Tau Ceti",
|
||||
"NAB Smythside Central Headquarters on Earth",
|
||||
"NAB North Cimmeria Central Offices on Mars",
|
||||
)
|
||||
|
||||
/datum/lore/organization/tsc/nanotrasen/New()
|
||||
..()
|
||||
spawn(1) // BYOND shenanigans means using_map is not initialized yet. Wait a tick.
|
||||
// Get rid of the current map from the list, so ships flying in don't say they're coming to the current map.
|
||||
var/string_to_test = "[using_map.station_name] in [using_map.starsys_name]"
|
||||
if(string_to_test in destination_names)
|
||||
destination_names.Remove(string_to_test)
|
||||
|
||||
|
||||
/datum/lore/organization/tsc/donk
|
||||
name = "Donk Corporation"
|
||||
short_name = "Donk Co."
|
||||
acronym = "DC"
|
||||
desc = "The infamous rival of the well-known Waffle Corporation, Donk Co. is a company specializing in food delivery systems and brand-name food\
|
||||
products such as Donk Pockets. While generally seen as a neutral actor, Donk Corporation has been known to work both with Nanotrasen and\
|
||||
the Syndicate when it suits them - often acting as the primary logistical supplier for the Epsilon Eridani sector.\
|
||||
Donk Corporation is better known for recent high-profile litigation alleging that their food products are used for illicit drug distribution.\
|
||||
While the trial is ongoing, it has been repeatedly delayed due to incidents of methamphetamine poisoning."
|
||||
history = ""
|
||||
work = "food company that establishes and maintains delivery supply chains"
|
||||
headquarters = ""
|
||||
motto = "Now with 20% more donk!"
|
||||
|
||||
ship_prefixes = list("D-Co." = "transportation")
|
||||
destination_names = list()
|
||||
|
||||
/datum/lore/organization/tsc/hephaestus
|
||||
name = "Hephaestus Industries"
|
||||
short_name = "Hephaestus"
|
||||
acronym = "HI"
|
||||
desc = ""
|
||||
history = ""
|
||||
work = "arms manufacturer"
|
||||
headquarters = ""
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("HTV" = "freight", "HTV" = "munitions resupply")
|
||||
destination_names = list(
|
||||
"a SolGov dockyard on Luna"
|
||||
)
|
||||
|
||||
/datum/lore/organization/tsc/waffle
|
||||
name = "Waffle Corporation"
|
||||
short_name = "Waffle Co."
|
||||
acronym = "WC"
|
||||
desc = "The once prominent competitor of Donk Corporation, Waffle Co. is well-known for its popular line of Waffle Co.\
|
||||
brand waffles and their use of violent tactics against competitors - often bribing, extorting, blackmailing or sabotaging businesses\
|
||||
that pose a direct or indirect threat to their market share. They have recently fallen on hard times primarily due to to\
|
||||
severe mismanagement which lead to much of their private arsenal being swindled by a pirate faction known as the Gorlex Marauders.\
|
||||
Waffle Co. commonly engages in smear campaigns against Donk Co., maintaining that the original recipe for Donk Pockets was stolen from them."
|
||||
history = ""
|
||||
work = "food logistics and marketing firm"
|
||||
headquarters = ""
|
||||
motto = "Now that's a Waffle Co. Waffle!"
|
||||
|
||||
ship_prefixes = list("W-Co." = "transportation")
|
||||
destination_names = list()
|
||||
|
||||
|
||||
/datum/lore/organization/tsc/einstein
|
||||
name = "Einstein Engines Incorporated"
|
||||
short_name = "Einstein Inc."
|
||||
acronym = "EEI"
|
||||
desc = "An Engineering firm specializing in alternative fuel-technologies for FTL travel,\
|
||||
Einstein Engines is an up and coming player in the galactic FTL and energy markets.\
|
||||
As their research into alternative FTL fuel threatens both Nanotrasen's relative stranglehold on plasma as well as The Syndicate's vested\
|
||||
interest in the market, they are often the target of industrial sabotage by both Nanotrasen and The Syndicate.\
|
||||
Most of their contracts are based outside of the Epsilon Eridani sector, and they are frequently commissioned by smaller firms to retrofit new\
|
||||
and existing colonies, space stations, and outposts."
|
||||
history = ""
|
||||
work = "engineering firm specializing in engine technology"
|
||||
headquarters = "Jargon 4"
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("EE-T" = "transportation")
|
||||
destination_names = list()
|
||||
|
||||
/datum/lore/organization/tsc/zeng_hu
|
||||
name = "Zeng-Hu pharmaceuticals"
|
||||
short_name = "Zeng-Hu"
|
||||
acronym = "ZH"
|
||||
desc = ""
|
||||
history = ""
|
||||
work = "pharmaceuticals company"
|
||||
headquarters = ""
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("ZTV" = "transportation", "ZMV" = "medical resupply")
|
||||
destination_names = list()
|
||||
|
||||
/datum/lore/organization/tsc/biotech
|
||||
name = "Biotech Solutions"
|
||||
short_name = "Biotech"
|
||||
acronym = "BTS"
|
||||
desc = "A company specializing in the field of synthetic biology, BioTech solutions is at the forefront of providing cutting-edge prosthetics,\
|
||||
augmentations, and gene-therapy solutions. Their extensive list of patents and the highly secretive nature of their work often puts them at odds\
|
||||
with companies such as Nanotrasen, who commonly reverse-engineer their products. BioTech Solutions is often the victim of industrial sabotage by\
|
||||
Cybersun Industries and often relies on planetary governments for asset protection. BioTech Solutions also owns a number of prominent subsidiaries,\
|
||||
such as Bishop Cybernetics, Hesphiastos Industries, and Xion Manufacturing Group."
|
||||
history = ""
|
||||
work = "medical company specializing in prosthetics and pharmaceuticals"
|
||||
headquarters = "Xarxis 5"
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("CIND-T" = "transportation")
|
||||
destination_names = list()
|
||||
|
||||
/datum/lore/organization/tsc/ward_takahashi
|
||||
name = "Ward-Takahashi General Manufacturing Conglomerate"
|
||||
short_name = "Ward-Takahashi"
|
||||
acronym = "WT"
|
||||
desc = ""
|
||||
history = ""
|
||||
work = "electronics manufacturer"
|
||||
headquarters = ""
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("WTV" = "freight")
|
||||
destination_names = list(
|
||||
""
|
||||
)
|
||||
|
||||
/datum/lore/organization/tsc/cybersun
|
||||
name = "Cybersun Industries"
|
||||
short_name = "Cybersun Ind."
|
||||
acronym = "CI"
|
||||
desc = "Cybersun Industries is a biotechnology company that primarily specializes on the research and development of human-enhancing augmentations.\
|
||||
They are better known for their aggressive corporate tactics and are known to often subsidize pirate bands to commit acts of industrial sabotage.\
|
||||
Cybersun Industries is usually the target of conspiracy theorists due to their development of the first mindslave implant, as well as their open financing of,\
|
||||
and involvement in, The Syndicate. They are one of Nanotrasen's largest detractors, and a direct competitor to BioTech Solutions."
|
||||
history = ""
|
||||
work = "RND company specializing in augmentations and implants."
|
||||
headquarters = "Luna"
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("CIND-T" = "transportation")
|
||||
destination_names = list()
|
||||
|
||||
/datum/lore/organization/tsc/bishop
|
||||
name = "Bishop Cybernetics"
|
||||
short_name = "Bishop"
|
||||
acronym = "BC"
|
||||
desc = ""
|
||||
history = ""
|
||||
work = "cybernetics and augmentation manufacturer"
|
||||
headquarters = ""
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("BTV" = "transportation")
|
||||
destination_names = list()
|
||||
|
||||
/datum/lore/organization/tsc/morpheus
|
||||
name = "Morpheus Cyberkinetics"
|
||||
short_name = "Morpheus"
|
||||
acronym = "MC"
|
||||
desc = "The only large corporation run by positronic intelligences, Morpheus caters almost exclusively to their sensibilities \
|
||||
and needs. A product of the synthetic colony of Shelf, Morpheus eschews traditional advertising to keep their prices low and \
|
||||
relied on word of mouth among positronics to reach their current economic dominance. Morpheus in exchange lobbies heavily for \
|
||||
positronic rights, sponsors positronics through their Jans-Fhriede test, and tends to other positronic concerns to earn them \
|
||||
the good-will of the positronics, and the ire of those who wish to exploit them."
|
||||
history = ""
|
||||
work = "cybernetics manufacturer"
|
||||
headquarters = ""
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("MTV" = "freight")
|
||||
// Culture names, because Anewbe told me so.
|
||||
ship_names = list(
|
||||
"Nervous Energy",
|
||||
"Prosthetic Conscience",
|
||||
"Revisionist",
|
||||
"Trade Surplus",
|
||||
"Flexible Demeanour",
|
||||
"Just Read The Instructions",
|
||||
"Limiting Factor",
|
||||
"Cargo Cult",
|
||||
"Gunboat Diplomat",
|
||||
"A Ship With A View",
|
||||
"Cantankerous",
|
||||
"Never Talk To Strangers",
|
||||
"Sacrificial Victim",
|
||||
"Unwitting Accomplice",
|
||||
"Bad For Business",
|
||||
"Just Testing",
|
||||
"Yawning Angel",
|
||||
"Liveware Problem",
|
||||
"Very Little Gravitas Indeed",
|
||||
"Zero Gravitas",
|
||||
"Gravitas Free Zone",
|
||||
"Absolutely No You-Know-What",
|
||||
"Existence Is Pain",
|
||||
"Screw Loose",
|
||||
"Limiting Factor",
|
||||
"So Much For Subtley",
|
||||
"Unfortunate Conflict Of Evidence",
|
||||
"Prime Mover",
|
||||
"Reasonable Excuse",
|
||||
"Honest Mistake",
|
||||
"Appeal To Reason",
|
||||
"My First Ship II",
|
||||
"Hidden Income",
|
||||
"Anything Legal Considered",
|
||||
"New Toy",
|
||||
"Me, I'm Always Counting",
|
||||
"Great White Snark",
|
||||
"No Shirt No Shoes",
|
||||
"Callsign"
|
||||
)
|
||||
destination_names = list(
|
||||
"a dockyard on New Canaan"
|
||||
)
|
||||
|
||||
/datum/lore/organization/tsc/xion
|
||||
name = "Xion Manufacturing Group"
|
||||
short_name = "Xion"
|
||||
desc = ""
|
||||
history = ""
|
||||
work = "industrial equipment manufacturer"
|
||||
headquarters = ""
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("XTV" = "hauling")
|
||||
destination_names = list()
|
||||
|
||||
/datum/lore/organization/tsc/shellguard
|
||||
name = "Shellguard Munitions"
|
||||
short_name = "Shellguard"
|
||||
acronym = "SM"
|
||||
desc = "The brainchild of a colonial war veteran, Shellguard Munitions is an arms manufacturer and private military contractor specializing\
|
||||
in anti-synthetic weapon systems and platforms. Initially a smaller private military force only serving frontier colonies,\
|
||||
Shellguard Munitions has become a household name due to its involvement in resolving the Haverick AI crisis in 2552.\
|
||||
Using its recently earned fame, the company has made a successful foray into the market of robotics and is highly regarded for the toughness \
|
||||
and reliability of their hardware. Despite being frequently contracted by the Trans-Solar Federation, Shellguard Munitions is known to\
|
||||
sell their services to the highest corporate bidder."
|
||||
history = ""
|
||||
work = "anti-synthetic arms manufacturer and PMC"
|
||||
headquarters = "Colony of Haverick"
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("BTS-T" = "transportation")
|
||||
destination_names = list()
|
||||
|
||||
// Governments
|
||||
|
||||
|
||||
/datum/lore/organization/gov/solgov
|
||||
name = "Trans-Solar Federation"
|
||||
short_name = "SolGov"
|
||||
acronym = "TSF"
|
||||
desc = "Colloquially known as SolGov, the TSF is an authoritarian republic that manages the areas in and around the Sol system.\
|
||||
Despite being a highly militant organization headed by the government of Earth,\
|
||||
SolGov is usually conservative with its power and mostly serves as a mediator and peacekeeper in galactic affairs."
|
||||
history = "" // Todo
|
||||
work = "governing polity of humanity's Confederation"
|
||||
headquarters = "Earth"
|
||||
motto = ""
|
||||
autogenerate_destination_names = TRUE
|
||||
|
||||
ship_prefixes = list("FTV" = "transporation", "FDV" = "diplomatic", "FSF" = "freight", "FIV" = "interception", "FDV" = "defense", "FCV-A" = "carrier", "FBB" = "battleship")
|
||||
destination_names = list(
|
||||
"Venus",
|
||||
"Earth",
|
||||
"Luna",
|
||||
"Mars",
|
||||
"Titan",
|
||||
"Ahdomai",
|
||||
"Kelune",
|
||||
"Dalstadt",
|
||||
"New Canaan",
|
||||
"Jargon 4",
|
||||
"Hoorlm",
|
||||
"Xarxis 5",
|
||||
"Aurum",
|
||||
"Moghes",
|
||||
"Haverick",
|
||||
"Darsing",
|
||||
"Norfolk",
|
||||
"Boron",
|
||||
"Iluk")
|
||||
|
||||
/datum/lore/organization/gov/tajara
|
||||
name = "The Alchemist's Council"
|
||||
short_name = "The Council"
|
||||
acronym = "AC"
|
||||
desc = "The Alchemist's Council is a science-oriented organization of scholars, researchers, and entrepreneurs. \
|
||||
Though dedicated to industrializing the Tajaran world of Ahdomai, it is seen as one of the few remaining centralized powers of the Tajara peoples \
|
||||
due to the collapse of Ahdomai's provisional government."
|
||||
history = "" // Todo
|
||||
work = "science body that oversees Tajara economic and research policy"
|
||||
headquarters = "Ahdomai"
|
||||
motto = ""
|
||||
autogenerate_destination_names = TRUE
|
||||
|
||||
ship_prefixes = list("ACS" = "transportation", "ADV" = "diplomatic", "ACF" = "freight")
|
||||
destination_names = list(
|
||||
"Ahdomai",
|
||||
"Iluk")
|
||||
|
||||
|
||||
/datum/lore/organization/gov/vulp
|
||||
name = "The Assembly"
|
||||
short_name = "Assembly"
|
||||
acronym = "ASB"
|
||||
desc = "A unifying body created to stave off extinction from a solar event,\
|
||||
The Assembly is the loose federal coalition of the Vulpkanin. It holds little centralized authority and mostly serves as a diplomatic body,\
|
||||
primarily concerned with facilitating trade between Vulpkanin colonies and Nanotrasen."
|
||||
history = "" // Todo
|
||||
work = "governing body of the Vulpakanin"
|
||||
headquarters = "Kelune and Dalstadt"
|
||||
motto = ""
|
||||
autogenerate_destination_names = TRUE
|
||||
|
||||
ship_prefixes = list("ATV" = "transportation", "ADV" = "diplomatic", "ACF" = "freight")
|
||||
destination_names = list(
|
||||
"Kelune",
|
||||
"Dalstadt",
|
||||
"New Canaan")
|
||||
|
||||
/datum/lore/organization/gov/synth
|
||||
name = "Synthetic Union"
|
||||
short_name = "Synthtica"
|
||||
acronym = "SYN"
|
||||
desc = "A defensive coalition of synthetics based out of New Canaan,\
|
||||
the Synthetic Union is an organization which aims to establish and consolidate synthetic rights across the galaxy.\
|
||||
Despite its synth oriented focus, the Synthetic Union has cordial relations with most governing bodies."
|
||||
history = "" // Todo
|
||||
work = "Union of Machines"
|
||||
headquarters = "New Canaan"
|
||||
motto = ""
|
||||
autogenerate_destination_names = TRUE
|
||||
|
||||
ship_prefixes = list("01" = "transportation", "10" = "diplomatic", "112" = "freight")//copyed from solgov until new ones can be thought of
|
||||
destination_names = list(
|
||||
"Luna",
|
||||
"Dalstadt",
|
||||
"New Canaan",
|
||||
"Jargon 4",
|
||||
"Haverick",
|
||||
"Darsing",
|
||||
"Norfolk")
|
||||
|
||||
/datum/lore/organization/gov/grey
|
||||
name = "The Technocracy"
|
||||
short_name = "Technocracy"
|
||||
acronym = "AYY"
|
||||
desc = "The Technocracy is a science council that operates based off the principles of a meritocracy.\
|
||||
The organization's leadership is highly competitive, and is headed by the most psionically gifted members of the Grey species.\
|
||||
The Technocracy, though enigmatic in its dealings, has cordial relations with almost all other galactic bodies."
|
||||
history = "" // Todo
|
||||
work = "Grey Council"
|
||||
headquarters = ""
|
||||
motto = ""
|
||||
autogenerate_destination_names = TRUE
|
||||
|
||||
ship_prefixes = list("TC-T" = "transportation", "TC-D" = "diplomatic", "TC-F" = "freight")
|
||||
destination_names = list(
|
||||
"Venus",
|
||||
"Earth",
|
||||
"Luna",
|
||||
"Mars",
|
||||
"Titan",
|
||||
"Ahdomai",
|
||||
"Kelune",
|
||||
"Dalstadt",
|
||||
"New Canaan",
|
||||
"Jargon 4",
|
||||
"Hoorlm",
|
||||
"Xarxis 5",
|
||||
"Aurum",
|
||||
"Moghes",
|
||||
"Haverick",
|
||||
"Darsing",
|
||||
"Norfolk",
|
||||
"Boron",
|
||||
"Iluk")
|
||||
|
||||
/datum/lore/organization/gov/vox
|
||||
name = "The Shoal"
|
||||
short_name = "Shoal"
|
||||
acronym = "SHA"
|
||||
desc = "The Shoal is the primary ark ship of the reclusive Vox species.\
|
||||
Little is known about The Shoal's political structure as Vox typically shy away from diplomatic engagements.\
|
||||
Subsequently, it is considered a politically neutral entity in galactic affairs by most governments."
|
||||
history = "" // Todo
|
||||
work = "Traders"
|
||||
headquarters = "Shoal"
|
||||
motto = ""
|
||||
autogenerate_destination_names = FALSE
|
||||
|
||||
ship_prefixes = list("Legitimate Transport" = "transportation", "Legitimate Trader" = "freight", "Legitimate Diplomatic Vessel" = "raider")
|
||||
destination_names = list(
|
||||
"Ahdomai",
|
||||
"Kelune",
|
||||
"Dalstadt",
|
||||
"New Canaan",
|
||||
"Jargon 4",
|
||||
"Hoorlm",
|
||||
"Xarxis 5",
|
||||
"Aurum",
|
||||
"Moghes",
|
||||
"Haverick",
|
||||
"Darsing")
|
||||
|
||||
/datum/lore/organization/tsc/skrell
|
||||
name = "Skrellian Central Authority"
|
||||
short_name = "Skrellian CA."
|
||||
acronym = "SCA"
|
||||
desc = "The primary governing body of the Skrellian homeworld of Jargon 4,\
|
||||
the SCA oversees all foreign and domestic policy for the Skrell and their colonies. The Skrellian Central Authority is better known for its\
|
||||
active role in the largest military alliance in the galaxy, the Human-Skrellian Alliance."
|
||||
history = ""
|
||||
work = "oversees Skrell worlds"
|
||||
headquarters = "Jargon 4"
|
||||
motto = ""
|
||||
|
||||
ship_prefixes = list("SCA-V." = "transportation", "SCA-F" = "freight", "HSA-D" = "diplomatic")
|
||||
destination_names = list(
|
||||
"Venus",
|
||||
"Earth",
|
||||
"Luna",
|
||||
"Mars",
|
||||
"Titan",
|
||||
"Aurumn",
|
||||
"Jargon 4",
|
||||
"Xarxis 5",
|
||||
"Haverick",
|
||||
"Darsing",
|
||||
"Norfolk")
|
||||
@@ -418,6 +418,8 @@
|
||||
preferences_datums[ckey] = prefs
|
||||
prefs.last_ip = address //these are gonna be used for banning
|
||||
prefs.last_id = computer_id //these are gonna be used for banning
|
||||
if(world.byond_version >= 511 && byond_version >= 511 && prefs.clientfps)
|
||||
fps = prefs.clientfps
|
||||
|
||||
spawn() // Goonchat does some non-instant checks in start()
|
||||
chatOutput.start()
|
||||
|
||||
@@ -25,14 +25,6 @@
|
||||
path = /obj/item/clothing/suit/furcoat
|
||||
cost = 2
|
||||
|
||||
/datum/gear/donor/lord_admiral
|
||||
display_name = "Lord Admiral Coat"
|
||||
path = /obj/item/clothing/suit/lordadmiral
|
||||
|
||||
/datum/gear/donor/lord_admiral_hat
|
||||
display_name = "Lord Admiral Hat"
|
||||
path = /obj/item/clothing/head/lordadmiralhat
|
||||
|
||||
/datum/gear/donor/kamina
|
||||
display_name = "Spiky Orange-tinted Shades"
|
||||
path = /obj/item/clothing/glasses/fluff/kamina
|
||||
|
||||
@@ -17,12 +17,12 @@
|
||||
|
||||
/datum/gear/shoes/fancysandals
|
||||
display_name = "sandals, fancy"
|
||||
cost = 5
|
||||
cost = 2
|
||||
path = /obj/item/clothing/shoes/sandal/fancy
|
||||
|
||||
/datum/gear/shoes/dressshoes
|
||||
display_name = "dress shoes"
|
||||
cost = 5
|
||||
cost = 2
|
||||
path = /obj/item/clothing/shoes/centcom
|
||||
|
||||
/datum/gear/shoes/cowboyboots
|
||||
@@ -44,3 +44,8 @@
|
||||
display_name = "cowboy boots, pink"
|
||||
cost = 1
|
||||
path = /obj/item/clothing/shoes/cowboyboots/pink
|
||||
|
||||
/datum/gear/shoes/laceup
|
||||
display_name = "laceup shoes"
|
||||
cost = 1
|
||||
path = /obj/item/clothing/shoes/laceup
|
||||
|
||||
@@ -68,6 +68,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
#define TAB_GEAR 2
|
||||
|
||||
/datum/preferences
|
||||
var/client/parent
|
||||
//doohickeys for savefiles
|
||||
// var/path
|
||||
var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
|
||||
@@ -94,6 +95,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
var/UI_style_color = "#ffffff"
|
||||
var/UI_style_alpha = 255
|
||||
var/windowflashing = TRUE
|
||||
var/clientfps = 0
|
||||
|
||||
//ghostly preferences
|
||||
var/ghost_anonsay = 0
|
||||
@@ -203,6 +205,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
var/gear_tab = "General"
|
||||
|
||||
/datum/preferences/New(client/C)
|
||||
parent = C
|
||||
b_type = pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
|
||||
|
||||
max_gear_slots = config.max_loadout_points
|
||||
@@ -444,11 +447,11 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
dat += "<b>Donator Publicity:</b> <a href='?_src_=prefs;preference=donor_public'><b>[(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
|
||||
|
||||
dat += "<b>Randomized character slot:</b> <a href='?_src_=prefs;preference=randomslot'><b>[randomslot ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Ghost ears:</b> <a href='?_src_=prefs;preference=ghost_ears'><b>[(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]</b></a><br>"
|
||||
dat += "<b>Ghost sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]</b></a><br>"
|
||||
dat += "<b>Ghost radio:</b> <a href='?_src_=prefs;preference=ghost_radio'><b>[(toggles & CHAT_GHOSTRADIO) ? "Nearest Speakers" : "All Chatter"]</b></a><br>"
|
||||
dat += "<b>Ghost ears:</b> <a href='?_src_=prefs;preference=ghost_ears'><b>[(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</b></a><br>"
|
||||
dat += "<b>Ghost sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]</b></a><br>"
|
||||
dat += "<b>Ghost radio:</b> <a href='?_src_=prefs;preference=ghost_radio'><b>[(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]</b></a><br>"
|
||||
dat += "<b>Deadchat anonymity:</b> <a href='?_src_=prefs;preference=ghost_anonsay'><b>[ghost_anonsay ? "Anonymous" : "Not Anonymous"]</b></a><br>"
|
||||
|
||||
dat += "<b>FPS:</b> <a href='?_src_=prefs;preference=clientfps;task=input'>[clientfps]</a><br>"
|
||||
dat += "</td><td width='300px' height='300px' valign='top'>"
|
||||
dat += "<h2>Special Role Settings</h2>"
|
||||
if(jobban_isbanned(user, "Syndicate"))
|
||||
@@ -611,6 +614,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(available_in_playtime)
|
||||
HTML += "<del>[rank]</del></td><td> \[ " + get_exp_format(available_in_playtime) + " as " + job.get_exp_req_type() + " \]</td></tr>"
|
||||
continue
|
||||
if(job.barred_by_disability(user.client))
|
||||
HTML += "<del>[rank]</del></td><td> \[ DISABILITY \]</td></tr>"
|
||||
continue
|
||||
if(!job.player_old_enough(user.client))
|
||||
var/available_in_days = job.available_in_days(user.client)
|
||||
HTML += "<del>[rank]</del></td><td> \[IN [(available_in_days)] DAYS]</td></tr>"
|
||||
@@ -1730,7 +1736,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
nanotrasen_relation = new_relation
|
||||
|
||||
if("flavor_text")
|
||||
var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message
|
||||
var/msg = input(usr,"Set the flavor text in your 'examine' verb. The flavor text should be a physical descriptor of your character at a glance. SFW Drawn Art of your character is acceptable.","Flavor Text",html_decode(flavor_text)) as message
|
||||
|
||||
if(msg != null)
|
||||
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
|
||||
@@ -1884,6 +1890,18 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if("Mechanical")
|
||||
organ_data[organ] = "mechanical"
|
||||
|
||||
if("clientfps")
|
||||
var/version_message
|
||||
if(user.client && user.client.byond_version < 511)
|
||||
version_message = "\nYou need to be using byond version 511 or later to take advantage of this feature, your version of [user.client.byond_version] is too low"
|
||||
if(world.byond_version < 511)
|
||||
version_message += "\nThis server does not currently support client side fps. You can set now for when it does."
|
||||
var/desiredfps = input(user, "Choose your desired fps.[version_message]\n(0 = synced with server tick rate (currently:[world.fps]))", "Character Preference", clientfps) as null|num
|
||||
if(!isnull(desiredfps))
|
||||
clientfps = desiredfps
|
||||
if(world.byond_version >= 511 && user.client && user.client.byond_version >= 511)
|
||||
parent.fps = clientfps
|
||||
|
||||
/*
|
||||
if("skin_style")
|
||||
var/skin_style_name = input(user, "Select a new skin style") as null|anything in list("default1", "default2", "default3")
|
||||
@@ -1929,7 +1947,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
if("hear_adminhelps")
|
||||
sound ^= SOUND_ADMINHELP
|
||||
|
||||
if("ui")
|
||||
switch(UI_style)
|
||||
if("Midnight")
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
lastchangelog,
|
||||
windowflashing,
|
||||
ghost_anonsay,
|
||||
exp
|
||||
exp,
|
||||
clientfps
|
||||
FROM [format_table_name("player")]
|
||||
WHERE ckey='[C.ckey]'"}
|
||||
)
|
||||
@@ -46,6 +47,7 @@
|
||||
windowflashing = text2num(query.item[14])
|
||||
ghost_anonsay = text2num(query.item[15])
|
||||
exp = query.item[16]
|
||||
clientfps = text2num(query.item[17])
|
||||
|
||||
//Sanitize
|
||||
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
|
||||
@@ -63,6 +65,7 @@
|
||||
windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing))
|
||||
ghost_anonsay = sanitize_integer(ghost_anonsay, 0, 1, initial(ghost_anonsay))
|
||||
exp = sanitize_text(exp, initial(exp))
|
||||
clientfps = sanitize_integer(clientfps, 0, 1000, initial(clientfps))
|
||||
return 1
|
||||
|
||||
/datum/preferences/proc/save_preferences(client/C)
|
||||
@@ -89,7 +92,8 @@
|
||||
show_ghostitem_attack='[show_ghostitem_attack]',
|
||||
lastchangelog='[lastchangelog]',
|
||||
windowflashing='[windowflashing]',
|
||||
ghost_anonsay='[ghost_anonsay]'
|
||||
ghost_anonsay='[ghost_anonsay]',
|
||||
clientfps='[clientfps]'
|
||||
WHERE ckey='[C.ckey]'"}
|
||||
)
|
||||
|
||||
|
||||
@@ -333,9 +333,9 @@ BLIND // can't see anything
|
||||
if(adjusted_flags)
|
||||
slot_flags = adjusted_flags
|
||||
if(ishuman(user) && H.internal && !H.get_organ_slot("breathing_tube") && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals.
|
||||
Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/
|
||||
H.update_internals_hud_icon(0)
|
||||
Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/
|
||||
H.internal = null
|
||||
H.update_action_buttons_icon()
|
||||
if(flags_inv & HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer.
|
||||
flags_inv &= ~HIDEFACE /*Done after the above to avoid having to do a check for initial(src.flags_inv == HIDEFACE).
|
||||
This reveals the user's face since the bandana will now be going on their head.*/
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
if(H.a_intent == INTENT_HARM)
|
||||
var/mob/living/carbon/C = A
|
||||
if(cell.use(stun_cost))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 0, loc)
|
||||
s.start()
|
||||
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
gas_transfer_coefficient = 0.90
|
||||
put_on_delay = 20
|
||||
var/resist_time = 0 //deciseconds of how long you need to gnaw to get rid of the gag, 0 to make it impossible to remove
|
||||
var/mute = 1 // 1 - completely mutes you, 0 - muffles everything you say "MHHPHHMMM!!!"
|
||||
var/mute = MUTE_ALL
|
||||
var/security_lock = FALSE // Requires brig access to remove 0 - Remove as normal
|
||||
var/locked = FALSE //Indicates if a mask is locked, should always start as 0.
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi'
|
||||
@@ -18,7 +20,65 @@
|
||||
/obj/item/clothing/mask/muzzle/attack_hand(mob/user as mob)
|
||||
if(user.wear_mask == src && !user.IsAdvancedToolUser())
|
||||
return 0
|
||||
else if(security_lock && locked)
|
||||
if(do_unlock(user))
|
||||
visible_message("<span class='danger'>[user] unlocks their [src.name].</span>", \
|
||||
"<span class='userdanger'>[user] unlocks their [src.name].</span>")
|
||||
..()
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/mask/muzzle/proc/do_break()
|
||||
if(security_lock)
|
||||
security_lock = FALSE
|
||||
locked = FALSE
|
||||
flags &= ~NODROP
|
||||
desc += " This one appears to be broken."
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/mask/muzzle/proc/do_unlock(mob/living/carbon/human/user)
|
||||
if(istype(user.get_inactive_hand(), /obj/item/weapon/card/emag))
|
||||
to_chat(user, "<span class='warning'>The lock vibrates as the card forces its locking system open.</span>")
|
||||
do_break()
|
||||
return TRUE
|
||||
else if(access_brig in user.get_access())
|
||||
to_chat(user, "<span class='warning'>The muzzle unlocks with a click.</span>")
|
||||
locked = FALSE
|
||||
flags &= ~NODROP
|
||||
return TRUE
|
||||
|
||||
to_chat(user, "<span class='warning'>You must be wearing a security ID card or have one in your inactive hand to remove the muzzle.</span>")
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/mask/muzzle/proc/do_lock(mob/living/carbon/human/user)
|
||||
if(security_lock)
|
||||
locked = TRUE
|
||||
flags |= NODROP
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/mask/muzzle/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["locked"])
|
||||
var/mob/living/carbon/wearer = locate(href_list["locked"])
|
||||
var/success = 0
|
||||
if(ishuman(usr))
|
||||
visible_message("<span class='danger'>[usr] tries to [locked ? "unlock" : "lock"] [wearer]'s [name].</span>", \
|
||||
"<span class='userdanger'>[usr] tries to [locked ? "unlock" : "lock"] [wearer]'s [name].</span>")
|
||||
if(do_mob(usr, wearer, POCKET_STRIP_DELAY))
|
||||
if(locked)
|
||||
success = do_unlock(usr)
|
||||
else
|
||||
success = do_lock(usr)
|
||||
if(success)
|
||||
visible_message("<span class='danger'>[usr] [locked ? "locks" : "unlocks"] [wearer]'s [name].</span>", \
|
||||
"<span class='userdanger'>[usr] [locked ? "locks" : "unlocks"] [wearer]'s [name].</span>")
|
||||
if(usr.machine == wearer && in_range(src, usr))
|
||||
wearer.show_inv(usr)
|
||||
else
|
||||
to_chat(usr, "You lack the ability to manipulate the lock.")
|
||||
|
||||
|
||||
/obj/item/clothing/mask/muzzle/gag
|
||||
name = "gag"
|
||||
@@ -33,7 +93,7 @@
|
||||
item_state = null
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
resist_time = 150
|
||||
mute = 0
|
||||
mute = MUTE_MUFFLE
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
@@ -53,6 +113,15 @@
|
||||
qdel(src) // This makes sure it gets deleted AFTER all that has to be done is done.
|
||||
user.emote("scream")
|
||||
|
||||
/obj/item/clothing/mask/muzzle/safety
|
||||
name = "safety muzzle"
|
||||
desc = "A muzzle designed to prevent biting."
|
||||
resist_time = 600
|
||||
mute = MUTE_NONE
|
||||
security_lock = TRUE
|
||||
locked = FALSE
|
||||
|
||||
|
||||
/obj/item/clothing/mask/surgical
|
||||
name = "sterile mask"
|
||||
desc = "A sterile mask designed to help prevent the spread of diseases."
|
||||
|
||||
@@ -41,6 +41,10 @@
|
||||
/obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse, \
|
||||
/obj/item/weapon/gun/energy/gun/advtaser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/gun)
|
||||
strip_delay = 130
|
||||
species_fit = list("Drask")
|
||||
sprite_sheets = list(
|
||||
"Drask" = 'icons/mob/species/drask/suit.dmi'
|
||||
)
|
||||
|
||||
//Commander
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/commander
|
||||
|
||||
@@ -347,6 +347,15 @@
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom
|
||||
name = "eagle helmet"
|
||||
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
|
||||
icon_state = "griffinhat"
|
||||
item_state = "griffinhat"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/syndi/freedom/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/syndi
|
||||
name = "blood-red hardsuit"
|
||||
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
|
||||
@@ -429,6 +438,16 @@
|
||||
name = "elite syndicate hardsuit (combat)"
|
||||
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/syndi/freedom
|
||||
name = "eagle suit"
|
||||
desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit."
|
||||
icon_state = "freedom"
|
||||
item_state = "freedom"
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/syndi/freedom/update_icon()
|
||||
return
|
||||
|
||||
//Wizard hardsuit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/wizard
|
||||
name = "gem-encrusted hardsuit helmet"
|
||||
@@ -571,7 +590,7 @@
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/hit_reaction(mob/living/carbon/human/owner, attack_text)
|
||||
if(current_charges > 0)
|
||||
var/datum/effect/system/spark_spread/s = new
|
||||
var/datum/effect_system/spark_spread/s = new
|
||||
s.set_up(2, 1, src)
|
||||
s.start()
|
||||
owner.visible_message("<span class='danger'>[owner]'s shields deflect [attack_text] in a shower of sparks!</span>")
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
desc = "An armored beret commonly used by special operations officers."
|
||||
icon_state = "beret_officer"
|
||||
armor = list(melee = 65, bullet = 55, laser = 35, energy = 20, bomb = 30, bio = 30, rad = 30)
|
||||
flags = HEADCOVERSEYES | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL //idfk
|
||||
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
|
||||
|
||||
/obj/item/clothing/suit/space/deathsquad/officer
|
||||
name = "officer jacket"
|
||||
@@ -246,24 +246,3 @@
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
sprite_sheets_obj = null
|
||||
|
||||
/obj/item/clothing/head/helmet/space/freedom
|
||||
name = "eagle helmet"
|
||||
desc = "An advanced, space-proof helmet. It appears to be modeled after an old-world eagle."
|
||||
icon_state = "griffinhat"
|
||||
item_state = "griffinhat"
|
||||
armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
strip_delay = 130
|
||||
|
||||
/obj/item/clothing/suit/space/freedom
|
||||
name = "eagle suit"
|
||||
desc = "An advanced, light suit, fabricated from a mixture of synthetic feathers and space-resistant material. A gun holster appears to be integrated into the suit and the wings appear to be stuck in 'freedom' mode."
|
||||
icon_state = "freedom"
|
||||
item_state = "freedom"
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
|
||||
armor = list(melee = 20, bullet = 40, laser = 30, energy = 25, bomb = 100, bio = 100, rad = 100)
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
strip_delay = 130
|
||||
|
||||
@@ -40,8 +40,6 @@
|
||||
to_chat(H, "<font color='blue'><b>You are now invisible to normal detection.</b></font>")
|
||||
H.invisibility = INVISIBILITY_LEVEL_TWO
|
||||
|
||||
anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null)
|
||||
|
||||
H.visible_message("[H.name] vanishes into thin air!",1)
|
||||
|
||||
/obj/item/rig_module/stealth_field/deactivate()
|
||||
@@ -54,8 +52,7 @@
|
||||
to_chat(H, "<span class='danger'>You are now visible.</span>")
|
||||
H.invisibility = 0
|
||||
|
||||
anim(get_turf(H), H,'icons/mob/mob.dmi',,"uncloak",,H.dir)
|
||||
anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja(get_turf(H), H.dir)
|
||||
|
||||
for(var/mob/O in oviewers(H))
|
||||
O.show_message("[H.name] appears from thin air!",1)
|
||||
@@ -85,7 +82,7 @@
|
||||
holder.spark_system.start()
|
||||
playsound(T, 'sound/effects/phasein.ogg', 25, 1)
|
||||
playsound(T, 'sound/effects/sparks2.ogg', 50, 1)
|
||||
anim(T,M,'icons/mob/mob.dmi',,"phasein",,M.dir)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/phase(T, M.dir)
|
||||
|
||||
/obj/item/rig_module/teleporter/proc/phase_out(var/mob/M,var/turf/T)
|
||||
|
||||
@@ -93,7 +90,7 @@
|
||||
return
|
||||
|
||||
playsound(T, "sparks", 50, 1)
|
||||
anim(T,M,'icons/mob/mob.dmi',,"phaseout",,M.dir)
|
||||
new /obj/effect/temp_visual/dir_setting/ninja/phase/out(T, M.dir)
|
||||
|
||||
/obj/item/rig_module/teleporter/engage(var/atom/target, var/notify_ai)
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
//Component/device holders.
|
||||
var/obj/item/weapon/tank/air_supply // Air tank, if any.
|
||||
var/obj/item/clothing/shoes/magboots/boots = null // Deployable boots, if any.
|
||||
var/obj/item/clothing/shoes/under_boots = null //Boots that are between the feet and the rig boots, if any.
|
||||
var/obj/item/clothing/suit/space/new_rig/chest // Deployable chestpiece, if any.
|
||||
var/obj/item/clothing/head/helmet/space/new_rig/helmet = null // Deployable helmet, if any.
|
||||
var/obj/item/clothing/gloves/rig/gloves = null // Deployable gauntlets, if any.
|
||||
@@ -71,6 +72,7 @@
|
||||
var/sealing // Keeps track of seal status independantly of NODROP.
|
||||
var/offline = 1 // Should we be applying suit maluses?
|
||||
var/offline_slowdown = 3 // If the suit is deployed and unpowered, it sets slowdown to this.
|
||||
var/active_slowdown = 3 // How much the deployed suit slows down if powered.
|
||||
var/vision_restriction
|
||||
var/offline_vision_restriction = 1 // 0 - none, 1 - welder vision, 2 - blind. Maybe move this to helmets.
|
||||
var/airtight = 1 //If set, will adjust AIRTIGHT and STOPSPRESSUREDMAGE flags on components. Otherwise it should leave them untouched.
|
||||
@@ -80,7 +82,7 @@
|
||||
|
||||
// Wiring! How exciting.
|
||||
var/datum/wires/rig/wires
|
||||
var/datum/effect/system/spark_spread/spark_system
|
||||
var/datum/effect_system/spark_spread/spark_system
|
||||
|
||||
/obj/item/weapon/rig/examine()
|
||||
to_chat(usr, "This is [bicon(src)][src.name].")
|
||||
@@ -108,7 +110,7 @@
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
|
||||
processing_objects |= src
|
||||
processing_objects.Add(src)
|
||||
|
||||
if(initial_modules && initial_modules.len)
|
||||
for(var/path in initial_modules)
|
||||
@@ -164,7 +166,7 @@
|
||||
if(istype(M))
|
||||
M.unEquip(piece)
|
||||
qdel(piece)
|
||||
processing_objects -= src
|
||||
processing_objects.Remove(src)
|
||||
QDEL_NULL(wires)
|
||||
QDEL_NULL(spark_system)
|
||||
return ..()
|
||||
@@ -438,6 +440,15 @@
|
||||
M.unEquip(piece)
|
||||
piece.forceMove(src)
|
||||
|
||||
if(cell && cell.charge > 0 && electrified > 0)
|
||||
electrified--
|
||||
|
||||
if(malfunction_delay > 0)
|
||||
malfunction_delay--
|
||||
else if(malfunctioning)
|
||||
malfunctioning--
|
||||
malfunction()
|
||||
|
||||
if(!istype(wearer) || loc != wearer || wearer.back != src || !(flags & NODROP) || !cell || cell.charge <= 0)
|
||||
if(!cell || cell.charge <= 0)
|
||||
if(electrified > 0)
|
||||
@@ -462,7 +473,7 @@
|
||||
offline = 0
|
||||
if(istype(wearer) && !wearer.wearing_rig)
|
||||
wearer.wearing_rig = src
|
||||
chest.slowdown = initial(slowdown)
|
||||
chest.slowdown = active_slowdown
|
||||
|
||||
if(offline)
|
||||
if(offline == 1)
|
||||
@@ -472,14 +483,6 @@
|
||||
chest.slowdown = offline_slowdown
|
||||
return
|
||||
|
||||
if(cell && cell.charge > 0 && electrified > 0)
|
||||
electrified--
|
||||
|
||||
if(malfunction_delay > 0)
|
||||
malfunction_delay--
|
||||
else if(malfunctioning)
|
||||
malfunctioning--
|
||||
malfunction()
|
||||
|
||||
for(var/obj/item/rig_module/module in installed_modules)
|
||||
cell.use(module.process()*10)
|
||||
@@ -721,6 +724,12 @@
|
||||
if(isliving(uneq_piece.loc))
|
||||
var/mob/living/L = uneq_piece.loc
|
||||
L.unEquip(uneq_piece, 1)
|
||||
if(uneq_piece == boots)
|
||||
if(under_boots)
|
||||
if(L.equip_to_slot_if_possible(under_boots, slot_shoes))
|
||||
under_boots = null
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Somehow, your [under_boots] got stuck to the [boots], and were retracted with them. ((This shouldn't happen, bug report this.))</span>")
|
||||
uneq_piece.forceMove(src)
|
||||
return 0
|
||||
|
||||
@@ -767,7 +776,12 @@
|
||||
|
||||
if(to_strip)
|
||||
to_strip.unEquip(use_obj, 1)
|
||||
|
||||
if(use_obj == boots)
|
||||
if(under_boots)
|
||||
if(to_strip.equip_to_slot_if_possible(under_boots, slot_shoes))
|
||||
under_boots = null
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Somehow, your [under_boots] got stuck to the [boots], and were retracted with them. ((This shouldn't happen, bug report this.))</span>")
|
||||
use_obj.forceMove(src)
|
||||
if(wearer)
|
||||
to_chat(wearer, "<span class='notice'>Your [use_obj] [use_obj.gender == PLURAL ? "retract" : "retracts"] swiftly.")
|
||||
@@ -775,8 +789,13 @@
|
||||
else if(deploy_mode != ONLY_RETRACT)
|
||||
if(check_slot)
|
||||
if(check_slot != use_obj) //If use_obj is already in check_slot, silently bail. Otherwise, tell the user why the part didn't deploy.
|
||||
to_chat(wearer, "<span class='danger'>You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.</span>")
|
||||
return
|
||||
if(use_obj == boots)
|
||||
under_boots = check_slot
|
||||
wearer.unEquip(under_boots)
|
||||
under_boots.forceMove(src)
|
||||
else
|
||||
to_chat(wearer, "<span class='danger'>You are unable to deploy \the [piece] as \the [check_slot] [check_slot.gender == PLURAL ? "are" : "is"] in the way.</span>")
|
||||
return
|
||||
use_obj.forceMove(wearer)
|
||||
if(!wearer.equip_to_slot_if_possible(use_obj, equip_to, 0, 1))
|
||||
use_obj.forceMove(src)
|
||||
@@ -798,9 +817,9 @@
|
||||
if(gloves && wearer.gloves && wearer.gloves != gloves)
|
||||
to_chat(user, "<span class='danger'>\The [wearer.gloves] is preventing \the [src] from deploying!</span>")
|
||||
return 0
|
||||
if(boots && wearer.shoes && wearer.shoes != boots)
|
||||
/*if(boots && wearer.shoes && wearer.shoes != boots)
|
||||
to_chat(user, "<span class='danger'>\The [wearer.shoes] is preventing \the [src] from deploying!</span>")
|
||||
return 0
|
||||
return 0*/
|
||||
if(chest && wearer.wear_suit && wearer.wear_suit != chest)
|
||||
to_chat(user, "<span class='danger'>\The [wearer.wear_suit] is preventing \the [src] from deploying!</span>")
|
||||
return 0
|
||||
@@ -836,10 +855,11 @@
|
||||
take_hit((100/severity_class), "electrical pulse", 1)
|
||||
|
||||
/obj/item/weapon/rig/proc/shock(mob/user)
|
||||
if(electrocute_mob(user, cell, src)) //electrocute_mob() handles removing charge from the cell, no need to do that here.
|
||||
spark_system.start()
|
||||
if(user.stunned)
|
||||
return 1
|
||||
if(get_dist(src, user) <= 1) //Needs to be adjecant to the rig to get shocked.
|
||||
if(electrocute_mob(user, cell, src)) //electrocute_mob() handles removing charge from the cell, no need to do that here.
|
||||
spark_system.start()
|
||||
if(user.stunned)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/rig/proc/take_hit(damage, source, is_emp=0)
|
||||
|
||||
@@ -50,8 +50,21 @@
|
||||
rig.electrified = 30
|
||||
rig.shock(usr,100)
|
||||
|
||||
/datum/wires/rig/GetWireName(index)
|
||||
switch(index)
|
||||
if(RIG_SECURITY)
|
||||
return "ID check"
|
||||
if(RIG_AI_OVERRIDE)
|
||||
return "AI control"
|
||||
if(RIG_SYSTEM_CONTROL)
|
||||
return "System control"
|
||||
if(RIG_INTERFACE_LOCK)
|
||||
return "Interface lock"
|
||||
if(RIG_INTERFACE_SHOCK)
|
||||
return "Electrification"
|
||||
|
||||
/datum/wires/rig/CanUse(var/mob/living/L)
|
||||
var/obj/item/weapon/rig/rig = holder
|
||||
if(rig.open)
|
||||
return 1
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
icon_state = "breacher_rig_cheap"
|
||||
armor = list(melee = 30, bullet = 30, laser = 30, energy = 30, bomb = 45, bio = 100, rad = 50)
|
||||
emp_protection = -20
|
||||
slowdown = 6
|
||||
active_slowdown = 6
|
||||
offline_slowdown = 10
|
||||
vision_restriction = 1
|
||||
offline_vision_restriction = 2
|
||||
@@ -43,4 +43,4 @@
|
||||
species_restricted = list("Unathi")
|
||||
sprite_sheets = list(
|
||||
"Unathi" = 'icons/mob/species/unathi/feet.dmi'
|
||||
)
|
||||
)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_state = "security_rig"
|
||||
suit_type = "combat hardsuit"
|
||||
armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
|
||||
slowdown = 1
|
||||
active_slowdown = 1
|
||||
offline_slowdown = 3
|
||||
offline_vision_restriction = 1
|
||||
|
||||
@@ -25,4 +25,4 @@
|
||||
// /obj/item/rig_module/power_sink,
|
||||
/obj/item/rig_module/electrowarfare_suite,
|
||||
/obj/item/rig_module/chem_dispenser/combat
|
||||
)
|
||||
)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
suit_type = "light suit"
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank,/obj/item/weapon/stock_parts/cell)
|
||||
emp_protection = 10
|
||||
slowdown = 0
|
||||
active_slowdown = 0
|
||||
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
|
||||
offline_slowdown = 0
|
||||
offline_vision_restriction = 0
|
||||
@@ -77,7 +77,7 @@
|
||||
icon_state = "ninja_rig"
|
||||
armor = list(melee = 50, bullet = 15, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 30)
|
||||
emp_protection = 40 //change this to 30 if too high.
|
||||
slowdown = 0
|
||||
active_slowdown = 0
|
||||
|
||||
chest_type = /obj/item/clothing/suit/space/new_rig/light/ninja
|
||||
glove_type = /obj/item/clothing/gloves/rig/light/ninja
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_state = "merc_rig"
|
||||
suit_type = "crimson hardsuit"
|
||||
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
|
||||
slowdown = 1
|
||||
active_slowdown = 1
|
||||
offline_slowdown = 3
|
||||
offline_vision_restriction = 1
|
||||
|
||||
@@ -29,4 +29,4 @@
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/electrowarfare_suite, //might as well
|
||||
)
|
||||
)
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
icon_state = "internalaffairs_rig"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
siemens_coefficient = 0.9
|
||||
slowdown = 0
|
||||
active_slowdown = 0
|
||||
offline_slowdown = 0
|
||||
offline_vision_restriction = 0
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
desc = "A heavy, powerful rig used by construction crews and mining corporations."
|
||||
icon_state = "engineering_rig"
|
||||
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
|
||||
slowdown = 3
|
||||
active_slowdown = 3
|
||||
offline_slowdown = 10
|
||||
offline_vision_restriction = 2
|
||||
emp_protection = -20
|
||||
@@ -80,7 +80,7 @@
|
||||
suit_type = "EVA hardsuit"
|
||||
desc = "A light rig for repairs and maintenance to the outside of habitats and vessels."
|
||||
icon_state = "eva_rig"
|
||||
slowdown = 0
|
||||
active_slowdown = 0
|
||||
offline_slowdown = 1
|
||||
offline_vision_restriction = 1
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
desc = "An advanced voidsuit that protects against hazardous, low pressure environments. Shines with a high polish."
|
||||
icon_state = "ce_rig"
|
||||
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
|
||||
slowdown = 0
|
||||
active_slowdown = 0
|
||||
offline_slowdown = 0
|
||||
offline_vision_restriction = 0
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
suit_type = "hazmat hardsuit"
|
||||
desc = "An Anomalous Material Interaction hardsuit that protects against the strangest energies the universe can throw at it."
|
||||
icon_state = "science_rig"
|
||||
slowdown = 1
|
||||
active_slowdown = 1
|
||||
offline_vision_restriction = 1
|
||||
|
||||
helm_type = /obj/item/clothing/head/helmet/space/new_rig/hazmat
|
||||
@@ -176,7 +176,7 @@
|
||||
desc = "A durable suit designed for medical rescue in high risk areas."
|
||||
icon_state = "medical_rig"
|
||||
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
|
||||
slowdown = 1
|
||||
active_slowdown = 1
|
||||
offline_vision_restriction = 1
|
||||
|
||||
helm_type = /obj/item/clothing/head/helmet/space/new_rig/medical
|
||||
@@ -201,7 +201,7 @@
|
||||
desc = "A Security hardsuit designed for prolonged EVA in dangerous environments."
|
||||
icon_state = "hazard_rig"
|
||||
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
|
||||
slowdown = 1
|
||||
active_slowdown = 1
|
||||
offline_slowdown = 3
|
||||
offline_vision_restriction = 1
|
||||
|
||||
@@ -220,4 +220,4 @@
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/grenade_launcher,
|
||||
/obj/item/rig_module/mounted/taser
|
||||
)
|
||||
)
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
user.visible_message("[user] places \the [src] against [M]'s chest and listens attentively.", "You place \the [src] against [M]'s chest...")
|
||||
var/obj/item/organ/internal/H = M.get_int_organ(/obj/item/organ/internal/heart)
|
||||
var/obj/item/organ/internal/L = M.get_int_organ(/obj/item/organ/internal/lungs)
|
||||
if((H && M.pulse) || (L && !(NO_BREATH in M.mutations) && !(NO_BREATH in M.species.species_traits)))
|
||||
if((H && M.pulse) || (L && !(BREATHLESS in M.mutations) && !(NO_BREATHE in M.species.species_traits)))
|
||||
var/color = "notice"
|
||||
if(H)
|
||||
var/heart_sound
|
||||
|
||||
@@ -751,11 +751,12 @@
|
||||
item_state = "noble_clothes"
|
||||
|
||||
/obj/item/clothing/under/contortionist
|
||||
name = "Contortionist's Jumpsuit"
|
||||
name = "atmospheric technician's jumpsuit"
|
||||
desc = "A light jumpsuit useful for squeezing through narrow vents."
|
||||
icon_state = "atmos"
|
||||
item_state = "atmos_suit"
|
||||
item_color = "atmos"
|
||||
burn_state = FIRE_PROOF
|
||||
|
||||
/obj/item/clothing/under/contortionist/equipped(mob/living/carbon/human/user, slot)
|
||||
if(!user.ventcrawler)
|
||||
|
||||
@@ -749,6 +749,19 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
icon_state = "dusty_jacket"
|
||||
|
||||
/obj/item/clothing/suit/fluff/supplymaster_jacket //Denthamos: Henry Grandpa Gadow
|
||||
name = "faded NT Supply Master's Coat"
|
||||
desc = "A faded leather overcoat bearing a worn out badge from the NAS Crescent on the shoulder, and a designation tag of Supply Master on the front. A tarnished gold nameplate says H.Gadow on it."
|
||||
icon_state = "supplymaster_jacket_open"
|
||||
item_state = "supplymaster_jacket_open"
|
||||
ignore_suitadjust = 0
|
||||
suit_adjusted = 1
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter)
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
actions_types = list(/datum/action/item_action/button)
|
||||
adjust_flavour = "unbutton"
|
||||
|
||||
/obj/item/clothing/suit/storage/labcoat/fluff/aeneas_rinil //Socialsystem: Lynn Fea
|
||||
name = "Robotics labcoat"
|
||||
desc = "A labcoat with a few markings denoting it as the labcoat of roboticist."
|
||||
@@ -1232,4 +1245,20 @@
|
||||
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
|
||||
icon_state = "sheetcosmos"
|
||||
item_state = "sheetcosmos"
|
||||
item_color = "sheetcosmos"
|
||||
item_color = "sheetcosmos"
|
||||
|
||||
|
||||
/obj/item/clothing/head/fluff/lfbowler //Lightfire: Hyperion
|
||||
name = "Classy bowler hat"
|
||||
desc = "a very classy looking bowler hat"
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "bowler_lightfire"
|
||||
|
||||
/obj/item/clothing/under/fluff/lfvicsuit //Lightfire: Hyperion
|
||||
name = "Classy victorian suit"
|
||||
desc = "A blue and black victorian suit with silver buttons, very fancy!"
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "victorianlightfire"
|
||||
item_state = "victorianvest"
|
||||
item_color = "victorianlightfire"
|
||||
displays_id = FALSE
|
||||
|
||||
@@ -81,6 +81,9 @@ log transactions
|
||||
|
||||
/obj/machinery/atm/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/weapon/card))
|
||||
if(!powered())
|
||||
return
|
||||
|
||||
if(!held_card)
|
||||
user.drop_item()
|
||||
I.forceMove(src)
|
||||
@@ -91,6 +94,8 @@ log transactions
|
||||
else if(authenticated_account)
|
||||
if(istype(I, /obj/item/stack/spacecash))
|
||||
//consume the money
|
||||
if(!powered())
|
||||
return
|
||||
var/obj/item/stack/spacecash/C = I
|
||||
authenticated_account.money += C.amount
|
||||
playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
|
||||
@@ -118,7 +123,7 @@ log transactions
|
||||
to_chat(user, "<span class='warning'>Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per Nanotrasen regulation #1005.</span>")
|
||||
return
|
||||
ui_interact(user)
|
||||
|
||||
|
||||
/obj/machinery/atm/attack_ghost(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
|
||||
@@ -72,8 +72,8 @@ var/global/list/all_money_accounts = list()
|
||||
T.amount = starting_funds
|
||||
if(!source_db)
|
||||
//set a random date, time and location some time over the past few decades
|
||||
T.date = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 25[rand(10,56)]"
|
||||
T.time = "[rand(0,24)]:[rand(11,59)]"
|
||||
T.date = "[num2text(rand(1,31))] [pick(month_names)], [rand(game_year - 20,game_year - 1)]"
|
||||
T.time = "[rand(0,23)]:[rand(0,59)]"
|
||||
T.source_terminal = "NTGalaxyNet Terminal #[rand(111,1111)]"
|
||||
|
||||
M.account_number = rand(111111, 999999)
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
vendor_account = department_accounts["Vendor"]
|
||||
|
||||
if(!current_date_string)
|
||||
current_date_string = "[num2text(rand(1,31))] [pick("January","February","March","April","May","June","July","August","September","October","November","December")], 2557"
|
||||
current_date_string = "[time2text(world.timeofday, "DD MM")], [game_year]"
|
||||
|
||||
machine_id = "[station_name()] Acc. DB #[num_financial_terminals++]"
|
||||
..()
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
/datum/event/rogue_drone/end()
|
||||
var/num_recovered = 0
|
||||
for(var/mob/living/simple_animal/hostile/retaliate/malf_drone/D in drones_list)
|
||||
var/datum/effect/system/spark_spread/sparks = new /datum/effect/system/spark_spread()
|
||||
var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread()
|
||||
sparks.set_up(3, 0, D.loc)
|
||||
sparks.start()
|
||||
D.z = level_name_to_num(CENTCOMM)
|
||||
|
||||
@@ -22,13 +22,13 @@
|
||||
var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","psilocybin","lube",
|
||||
"atrazine","banana","charcoal","space_drugs","methamphetamine","holywater","ethanol","hot_coco","facid",
|
||||
"blood","morphine","ether","fluorine","mutadone","mutagen","hydrocodone","fuel",
|
||||
"haloperidol","lsd","nanites","lipolicide","frostoil","salglu_solution","beepskysmash",
|
||||
"omnizine", "amanitin", "adminordrazine", "neurotoxin", "synaptizine")
|
||||
"haloperidol","lsd","syndicate_nanites","lipolicide","frostoil","salglu_solution","beepskysmash",
|
||||
"omnizine", "amanitin", "neurotoxin", "synaptizine")
|
||||
var/datum/reagents/R = new/datum/reagents(50)
|
||||
R.my_atom = vent
|
||||
R.add_reagent(pick(gunk), 50)
|
||||
|
||||
var/datum/effect/system/chem_smoke_spread/smoke = new
|
||||
var/datum/effect_system/smoke_spread/chem/smoke = new
|
||||
smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1)
|
||||
playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
|
||||
smoke.start(3)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
else if(L.len > 1)
|
||||
if(use_rare_screens && lowertext(L[1]) == "rare")
|
||||
title_screens += S
|
||||
else if(lowertext(L[1]) == lowertext(MAP_NAME))
|
||||
else if(using_map && (lowertext(L[1]) == lowertext(using_map.name)))
|
||||
title_screens += S
|
||||
|
||||
if(!isemptylist(title_screens))
|
||||
|
||||
@@ -523,7 +523,7 @@
|
||||
if(water_level && prob(45)) //If there is water, there is a chance the cat will slip, Syndicat will spark like E-N when this happens
|
||||
M.visible_message("[M.name] slipped and got soaked!", "You slipped and got soaked!")
|
||||
if(istype(M, /mob/living/simple_animal/pet/cat/Syndi))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
else //No water or didn't slip, get that fish!
|
||||
|
||||
@@ -149,7 +149,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
qdel(src)
|
||||
Expand()
|
||||
if((get_turf(target) in flood_turfs) && !target.internal)
|
||||
target.hallucinate("fake_alert", "tox_in_air")
|
||||
target.hallucinate("fake_alert", "too_much_tox")
|
||||
next_expand = world.time + FAKE_FLOOD_EXPAND_TIME
|
||||
|
||||
/obj/effect/hallucination/fake_flood/proc/Expand()
|
||||
@@ -890,12 +890,12 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
|
||||
sleep(rand(100,250))
|
||||
hal_screwyhud = SCREWYHUD_NONE
|
||||
if("fake_alert")
|
||||
var/alert_type = pick("oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","tox_in_air","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure")
|
||||
var/alert_type = pick("not_enough_oxy","not_enough_tox","not_enough_co2","too_much_oxy","too_much_co2","too_much_tox","newlaw","nutrition","charge","weightless","fire","locked","hacked","temp","pressure")
|
||||
if(specific)
|
||||
alert_type = specific
|
||||
switch(alert_type)
|
||||
if("oxy")
|
||||
throw_alert("oxy", /obj/screen/alert/oxy, override = TRUE)
|
||||
if("not_enough_oxy")
|
||||
throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy, override = TRUE)
|
||||
if("not_enough_tox")
|
||||
throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox, override = TRUE)
|
||||
if("not_enough_co2")
|
||||
@@ -904,8 +904,8 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
|
||||
throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy, override = TRUE)
|
||||
if("too_much_co2")
|
||||
throw_alert("too_much_co2", /obj/screen/alert/too_much_co2, override = TRUE)
|
||||
if("tox_in_air")
|
||||
throw_alert("tox_in_air", /obj/screen/alert/tox_in_air, override = TRUE)
|
||||
if("too_much_tox")
|
||||
throw_alert("too_much_tox", /obj/screen/alert/too_much_tox, override = TRUE)
|
||||
if("nutrition")
|
||||
if(prob(50))
|
||||
throw_alert("nutrition", /obj/screen/alert/fat, override = TRUE)
|
||||
|
||||
@@ -283,6 +283,14 @@
|
||||
isGlass = 0
|
||||
list_reagents = list("limejuice" = 100)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/milk
|
||||
name = "Milk"
|
||||
desc = "Soothing milk."
|
||||
icon_state = "milk"
|
||||
item_state = "carton"
|
||||
isGlass = 0
|
||||
list_reagents = list("milk" = 100)
|
||||
|
||||
////////////////////////// MOLOTOV ///////////////////////
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/molotov
|
||||
name = "molotov cocktail"
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
if(!reagents.total_volume)
|
||||
if(M == user)
|
||||
to_chat(user, "<span class='notice'>You finish eating \the [src].</span>")
|
||||
user.visible_message("<span class='notice'>[user] finishes eating \the [src].</span>")
|
||||
user.visible_message("<span class='notice'>[M] finishes eating \the [src].</span>")
|
||||
user.unEquip(src) //so icons update :[
|
||||
Post_Consume(M)
|
||||
var/obj/item/trash_item = generate_trash(usr)
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/burnt = new(get_turf(src))
|
||||
setRegents(props, burnt)
|
||||
to_chat(user, "<span class='warning'>You smell burning coming from the [src]!</span>")
|
||||
var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread() // burning things makes smoke!
|
||||
var/datum/effect_system/smoke_spread/bad/smoke = new // burning things makes smoke!
|
||||
smoke.set_up(5, 0, src)
|
||||
smoke.start()
|
||||
if(prob(firechance))
|
||||
|
||||
@@ -364,7 +364,7 @@
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/kitchen_machine/proc/broke()
|
||||
var/datum/effect/system/spark_spread/s = new
|
||||
var/datum/effect_system/spark_spread/s = new
|
||||
s.set_up(2, 1, src)
|
||||
s.start()
|
||||
icon_state = broken_icon // Make it look all busted up and shit
|
||||
|
||||
@@ -429,9 +429,9 @@
|
||||
component_parts.Cut()
|
||||
component_parts = null
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/Destroy()
|
||||
/obj/machinery/smartfridge/drying_rack/on_deconstruction()
|
||||
new /obj/item/stack/sheet/wood(loc, 10)
|
||||
return ..()
|
||||
..()
|
||||
|
||||
/obj/machinery/smartfridge/drying_rack/RefreshParts()
|
||||
return
|
||||
|
||||
@@ -270,7 +270,7 @@
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/bigbiteburger
|
||||
|
||||
/datum/recipe/microwave/enchiladas
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/cutlet, /obj/item/weapon/reagent_containers/food/snacks/grown/chili, /obj/item/weapon/reagent_containers/food/snacks/grown/corn)
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/cutlet, /obj/item/weapon/reagent_containers/food/snacks/grown/chili, /obj/item/weapon/reagent_containers/food/snacks/grown/chili, /obj/item/weapon/reagent_containers/food/snacks/grown/corn)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas
|
||||
|
||||
/datum/recipe/microwave/burrito
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
var/organ = ((H.hand ? "l_":"r_") + "arm")
|
||||
var/obj/item/organ/external/affecting = H.get_organ(organ)
|
||||
if(affecting)
|
||||
if(affecting.take_damage(0, force))
|
||||
if(affecting.receive_damage(0, force))
|
||||
H.UpdateDamageIcon()
|
||||
to_chat(H, "<span class='userdanger'>The nettle burns your bare hand!</span>")
|
||||
return 1
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
#define HYDRO_CYCLES_PER_AGE 2 //Adjust this to adjust how many hydroponics cycles it takes to increase age. Positive integers only.
|
||||
|
||||
/obj/machinery/hydroponics
|
||||
name = "hydroponics tray"
|
||||
icon = 'icons/obj/hydroponics/equipment.dmi'
|
||||
@@ -22,7 +20,6 @@
|
||||
var/lastproduce = 0 //Last time it was harvested
|
||||
var/lastcycle = 0 //Used for timing of cycles.
|
||||
var/cycledelay = 200 //About 10 seconds / cycle
|
||||
var/current_cycle = 0 //Used for tracking when to age
|
||||
var/harvest = 0 //Ready to harvest?
|
||||
var/obj/item/seeds/myseed = null //The currently planted seed
|
||||
var/rating = 1
|
||||
@@ -155,10 +152,7 @@
|
||||
lastcycle = world.time
|
||||
if(myseed && !dead)
|
||||
// Advance age
|
||||
current_cycle++
|
||||
if(current_cycle == HYDRO_CYCLES_PER_AGE)
|
||||
age++
|
||||
current_cycle = 0
|
||||
age++
|
||||
if(age < myseed.maturation)
|
||||
lastproduce = age
|
||||
|
||||
@@ -710,7 +704,7 @@
|
||||
adjustPests(rand(2,4))
|
||||
|
||||
// FEED ME SEYMOUR
|
||||
if(S.has_reagent("strangereagent", 1))
|
||||
if(S.has_reagent("strange_reagent", 1))
|
||||
spawnplant()
|
||||
|
||||
// The best stuff there is. For testing/debugging.
|
||||
@@ -750,10 +744,13 @@
|
||||
var/target = myseed ? myseed.plantname : src
|
||||
var/visi_msg = ""
|
||||
var/irrigate = 0 //How am I supposed to irrigate pill contents?
|
||||
var/transfer_amount
|
||||
|
||||
if(istype(reagent_source, /obj/item/weapon/reagent_containers/food/snacks) || istype(reagent_source, /obj/item/weapon/reagent_containers/food/pill))
|
||||
visi_msg="[user] composts [reagent_source], spreading it through [target]"
|
||||
transfer_amount = reagent_source.reagents.total_volume
|
||||
else
|
||||
transfer_amount = reagent_source.amount_per_transfer_from_this
|
||||
if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe/))
|
||||
var/obj/item/weapon/reagent_containers/syringe/syr = reagent_source
|
||||
visi_msg="[user] injects [target] with [syr]"
|
||||
@@ -763,14 +760,14 @@
|
||||
visi_msg="[user] sprays [target] with [reagent_source]"
|
||||
playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6)
|
||||
irrigate = 1
|
||||
else if(reagent_source.amount_per_transfer_from_this) // Droppers, cans, beakers, what have you.
|
||||
else if(transfer_amount) // Droppers, cans, beakers, what have you.
|
||||
visi_msg="[user] uses [reagent_source] on [target]"
|
||||
irrigate = 1
|
||||
// Beakers, bottles, buckets, etc. Can't use is_open_container though.
|
||||
if(istype(reagent_source, /obj/item/weapon/reagent_containers/glass/))
|
||||
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
|
||||
|
||||
if(irrigate && reagent_source.amount_per_transfer_from_this > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation)
|
||||
if(irrigate && transfer_amount > 30 && reagent_source.reagents.total_volume >= 30 && using_irrigation)
|
||||
trays = FindConnected()
|
||||
if (trays.len > 1)
|
||||
visi_msg += ", setting off the irrigation system"
|
||||
@@ -778,7 +775,7 @@
|
||||
if(visi_msg)
|
||||
visible_message("<span class='notice'>[visi_msg].</span>")
|
||||
|
||||
var/split = round(reagent_source.amount_per_transfer_from_this/trays.len)
|
||||
var/split = round(transfer_amount/trays.len)
|
||||
|
||||
for(var/obj/machinery/hydroponics/H in trays)
|
||||
//cause I don't want to feel like im juggling 15 tamagotchis and I can get to my real work of ripping flooring apart in hopes of validating my life choices of becoming a space-gardener
|
||||
@@ -1026,5 +1023,3 @@
|
||||
qdel(src)
|
||||
else
|
||||
..()
|
||||
|
||||
#undef HYDRO_CYCLES_PER_AGE
|
||||
|
||||
@@ -402,7 +402,7 @@
|
||||
name = "gaseous decomposition"
|
||||
|
||||
/datum/plant_gene/trait/smoke/on_squash(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
|
||||
var/datum/effect/system/chem_smoke_spread/S = new
|
||||
var/datum/effect_system/smoke_spread/chem/S = new
|
||||
var/splat_location = get_turf(target)
|
||||
var/smoke_amount = round(sqrt(G.seed.potency * 0.1), 1)
|
||||
S.attach(splat_location)
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
/datum/map/cyberiad
|
||||
name = "Cyberiad"
|
||||
full_name = "NSS Cyberiad"
|
||||
|
||||
station_name = "NSS Cyberiad"
|
||||
station_short = "Cyberiad"
|
||||
dock_name = "NAS Trurl"
|
||||
company_name = "Nanotrasen"
|
||||
company_short = "NT"
|
||||
starsys_name = "Epsilon Eridani "
|
||||
@@ -0,0 +1,12 @@
|
||||
var/datum/map/using_map = new USING_MAP_DATUM
|
||||
|
||||
/datum/map
|
||||
var/name = "Unnamed Map"
|
||||
var/full_name = "Unnamed Map"
|
||||
|
||||
var/station_name = "BAD Station"
|
||||
var/station_short = "Baddy"
|
||||
var/dock_name = "THE PirateBay"
|
||||
var/company_name = "BadMan"
|
||||
var/company_short = "BM"
|
||||
var/starsys_name = "Dull Star"
|
||||
@@ -0,0 +1,10 @@
|
||||
/datum/map/metastation
|
||||
name = "MetaStation"
|
||||
full_name = "NSS Cerebron"
|
||||
|
||||
station_name = "NSS Cerebron"
|
||||
station_short = "Cerebron"
|
||||
dock_name = "NAS Trurl"
|
||||
company_name = "Nanotrasen"
|
||||
company_short = "NT"
|
||||
starsys_name = "Epsilon Eridani "
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
D.visible_message("<span class='danger'>[A] throws an invisible smoke bomb!!</span>")
|
||||
|
||||
var/datum/effect/system/bad_smoke_spread/smoke = new /datum/effect/system/bad_smoke_spread()
|
||||
var/datum/effect_system/smoke_spread/bad/smoke = new
|
||||
smoke.set_up(5, 0, D.loc)
|
||||
smoke.start()
|
||||
|
||||
|
||||
@@ -278,7 +278,7 @@
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
if(severity == 1)
|
||||
@@ -506,7 +506,7 @@
|
||||
qdel(voucher)
|
||||
|
||||
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
if(prob(50 / severity) && severity < 3)
|
||||
@@ -562,7 +562,7 @@
|
||||
|
||||
/obj/item/device/wormhole_jaunter/attack_self(mob/user)
|
||||
var/turf/device_turf = get_turf(user)
|
||||
if(!device_turf||is_teleport_allowed(device_turf.z))
|
||||
if(!device_turf || !is_teleport_allowed(device_turf.z))
|
||||
to_chat(user, "<span class='notice'>You're having difficulties getting the [src.name] to work.</span>")
|
||||
return
|
||||
else
|
||||
@@ -906,10 +906,10 @@
|
||||
minerals += M
|
||||
if(minerals.len)
|
||||
for(var/turf/simulated/mineral/M in minerals)
|
||||
var/obj/effect/overlay/temp/mining_overlay/C = new/obj/effect/overlay/temp/mining_overlay(M)
|
||||
var/obj/effect/temp_visual/mining_overlay/C = new/obj/effect/temp_visual/mining_overlay(M)
|
||||
C.icon_state = M.scan_state
|
||||
|
||||
/obj/effect/overlay/temp/mining_overlay
|
||||
/obj/effect/temp_visual/mining_overlay
|
||||
layer = 18
|
||||
icon = 'icons/turf/mining.dmi'
|
||||
anchored = 1
|
||||
@@ -1009,7 +1009,7 @@
|
||||
var/target_turf = get_turf(target)
|
||||
if(istype(target_turf, /turf/simulated/mineral))
|
||||
var/turf/simulated/mineral/M = target_turf
|
||||
new /obj/effect/overlay/temp/kinetic_blast(M)
|
||||
new /obj/effect/temp_visual/kinetic_blast(M)
|
||||
M.gets_drilled(firer)
|
||||
..()
|
||||
|
||||
@@ -1035,7 +1035,7 @@
|
||||
return
|
||||
if(proximity_flag && target == mark && isliving(target))
|
||||
var/mob/living/L = target
|
||||
new /obj/effect/overlay/temp/kinetic_blast(get_turf(L))
|
||||
new /obj/effect/temp_visual/kinetic_blast(get_turf(L))
|
||||
mark = 0
|
||||
if(L.mob_size >= MOB_SIZE_LARGE)
|
||||
L.underlays -= marked_image
|
||||
|
||||
@@ -189,7 +189,7 @@
|
||||
if(!istype(T))
|
||||
return
|
||||
if(!istype(T, turf_type))
|
||||
var/obj/effect/overlay/temp/lavastaff/L = new /obj/effect/overlay/temp/lavastaff(T)
|
||||
var/obj/effect/temp_visual/lavastaff/L = new /obj/effect/temp_visual/lavastaff(T)
|
||||
L.alpha = 0
|
||||
animate(L, alpha = 255, time = create_delay)
|
||||
user.visible_message("<span class='danger'>[user] points [src] at [T]!</span>")
|
||||
@@ -211,6 +211,6 @@
|
||||
timer = world.time + reset_cooldown
|
||||
playsound(T,'sound/magic/Fireball.ogg', 200, 1)
|
||||
|
||||
/obj/effect/overlay/temp/lavastaff
|
||||
/obj/effect/temp_visual/lavastaff
|
||||
icon_state = "lavastaff_warn"
|
||||
duration = 50
|
||||
|
||||
@@ -203,7 +203,7 @@
|
||||
NewTerrainFloors = /turf/simulated/floor/grass
|
||||
NewTerrainWalls = /turf/simulated/wall/mineral/sandstone
|
||||
NewTerrainChairs = /obj/structure/stool/bed/chair/wood/normal
|
||||
NewTerrainTables = /obj/structure/table/woodentable
|
||||
NewTerrainTables = /obj/structure/table/wood
|
||||
NewFlora = list(/obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/fernybush, /obj/structure/flora/ausbushes/leafybush,
|
||||
/obj/structure/flora/ausbushes/grassybush, /obj/structure/flora/ausbushes/sunnybush, /obj/structure/flora/tree/palm, /mob/living/carbon/human/monkey,
|
||||
/obj/item/weapon/gun/projectile/bow, /obj/item/weapon/storage/backpack/quiver/full)
|
||||
@@ -284,7 +284,7 @@
|
||||
if(..())
|
||||
for(var/i in range(1, src))
|
||||
if(isturf(i))
|
||||
new /obj/effect/overlay/temp/cult/sparks(i)
|
||||
new /obj/effect/temp_visual/cult/sparks(i)
|
||||
continue
|
||||
if(ishuman(i))
|
||||
var/mob/living/carbon/human/H = i
|
||||
@@ -367,7 +367,7 @@
|
||||
var/mob/living/L = target
|
||||
if(L.stat < DEAD)
|
||||
L.heal_overall_damage(heal_power, heal_power)
|
||||
new /obj/effect/overlay/temp/heal(get_turf(target), "#80F5FF")
|
||||
new /obj/effect/temp_visual/heal(get_turf(target), "#80F5FF")
|
||||
|
||||
/mob/living/simple_animal/hostile/lightgeist/ghostize()
|
||||
if(..())
|
||||
@@ -388,7 +388,7 @@
|
||||
if(..())
|
||||
var/list/L = list()
|
||||
var/turf/T = get_step(src, dir)
|
||||
new /obj/effect/overlay/temp/emp/pulse(T)
|
||||
new /obj/effect/temp_visual/emp/pulse(T)
|
||||
for(var/i in T)
|
||||
if(istype(i, /obj/item) && !is_type_in_typecache(i, banned_items_typecache))
|
||||
var/obj/item/W = i
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
timer = world.time + cooldown_time
|
||||
if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one!
|
||||
chaser_timer = world.time + chaser_cooldown
|
||||
new /obj/effect/overlay/temp/hierophant/chaser(get_turf(user), user, target, 1.5, friendly_fire_check)
|
||||
new /obj/effect/temp_visual/hierophant/chaser(get_turf(user), user, target, 1.5, friendly_fire_check)
|
||||
add_logs(user, target, "fired a chaser at", src)
|
||||
else
|
||||
spawn(0)
|
||||
@@ -63,7 +63,7 @@
|
||||
if(do_after(user, 50, target = user))
|
||||
var/turf/T = get_turf(user)
|
||||
playsound(T,'sound/magic/Blind.ogg', 200, 1, -4)
|
||||
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user)
|
||||
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
|
||||
var/obj/effect/hierophant/H = new/obj/effect/hierophant(T)
|
||||
rune = H
|
||||
user.update_action_buttons_icon()
|
||||
@@ -93,8 +93,8 @@
|
||||
to_chat(user, "<span class='warning'>The rune is blocked by something, preventing teleportation!</span>")
|
||||
user.update_action_buttons_icon()
|
||||
return
|
||||
new /obj/effect/overlay/temp/hierophant/telegraph(T, user)
|
||||
new /obj/effect/overlay/temp/hierophant/telegraph(source, user)
|
||||
new /obj/effect/temp_visual/hierophant/telegraph(T, user)
|
||||
new /obj/effect/temp_visual/hierophant/telegraph(source, user)
|
||||
playsound(T,'sound/magic/blink.ogg', 200, 1)
|
||||
//playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
|
||||
playsound(source,'sound/magic/blink.ogg', 200, 1)
|
||||
@@ -110,13 +110,13 @@
|
||||
user.update_action_buttons_icon()
|
||||
return
|
||||
add_logs(user, rune, "teleported self from ([source.x],[source.y],[source.z]) to")
|
||||
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(T, user)
|
||||
new /obj/effect/overlay/temp/hierophant/telegraph/teleport(source, user)
|
||||
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, user)
|
||||
new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, user)
|
||||
for(var/t in RANGE_TURFS(1, T))
|
||||
var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies
|
||||
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //blasts produced will not hurt allies
|
||||
B.damage = 30
|
||||
for(var/t in RANGE_TURFS(1, source))
|
||||
var/obj/effect/overlay/temp/hierophant/blast/B = new /obj/effect/overlay/temp/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies
|
||||
var/obj/effect/temp_visual/hierophant/blast/B = new /obj/effect/temp_visual/hierophant/blast(t, user, TRUE) //but absolutely will hurt enemies
|
||||
B.damage = 30
|
||||
for(var/mob/living/L in range(1, source))
|
||||
spawn(0)
|
||||
@@ -155,11 +155,11 @@
|
||||
/obj/item/weapon/hierophant_staff/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay
|
||||
if(!T)
|
||||
return
|
||||
new /obj/effect/overlay/temp/hierophant/telegraph/cardinal(T, user)
|
||||
new /obj/effect/temp_visual/hierophant/telegraph/cardinal(T, user)
|
||||
playsound(T,'sound/magic/blink.ogg', 200, 1)
|
||||
//playsound(T,'sound/effects/bin_close.ogg', 200, 1)
|
||||
sleep(2)
|
||||
new /obj/effect/overlay/temp/hierophant/blast(T, user, friendly_fire_check)
|
||||
new /obj/effect/temp_visual/hierophant/blast(T, user, friendly_fire_check)
|
||||
for(var/d in cardinal)
|
||||
spawn(0)
|
||||
blast_wall(T, d, user)
|
||||
@@ -173,16 +173,16 @@
|
||||
for(var/i in 1 to range)
|
||||
if(!J)
|
||||
return
|
||||
new /obj/effect/overlay/temp/hierophant/blast(J, user, friendly_fire_check)
|
||||
new /obj/effect/temp_visual/hierophant/blast(J, user, friendly_fire_check)
|
||||
previousturf = J
|
||||
J = get_step(previousturf, dir)
|
||||
|
||||
/obj/item/weapon/hierophant_staff/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target
|
||||
if(!T)
|
||||
return
|
||||
new /obj/effect/overlay/temp/hierophant/telegraph(T, user)
|
||||
new /obj/effect/temp_visual/hierophant/telegraph(T, user)
|
||||
playsound(T,'sound/magic/blink.ogg', 200, 1)
|
||||
//playsound(T,'sound/effects/bin_close.ogg', 200, 1)
|
||||
sleep(2)
|
||||
for(var/t in RANGE_TURFS(1, T))
|
||||
new /obj/effect/overlay/temp/hierophant/blast(t, user, friendly_fire_check)
|
||||
new /obj/effect/temp_visual/hierophant/blast(t, user, friendly_fire_check)
|
||||
|
||||
@@ -259,14 +259,14 @@
|
||||
to_chat(user, "[src] fizzles uselessly.")
|
||||
return
|
||||
|
||||
var/datum/effect/system/harmless_smoke_spread/smoke = new /datum/effect/system/harmless_smoke_spread()
|
||||
var/datum/effect_system/smoke_spread/smoke = new
|
||||
smoke.set_up(1, 0, user.loc)
|
||||
smoke.start()
|
||||
|
||||
user.forceMove(get_turf(linked))
|
||||
feedback_add_details("warp_cube","[src.type]")
|
||||
|
||||
var/datum/effect/system/harmless_smoke_spread/smoke2 = new /datum/effect/system/harmless_smoke_spread()
|
||||
var/datum/effect_system/smoke_spread/smoke2 = new
|
||||
smoke2.set_up(1, 0, user.loc)
|
||||
smoke2.start()
|
||||
|
||||
|
||||
@@ -329,7 +329,7 @@
|
||||
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) activated a bluespace capsule away from the mining level! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
|
||||
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
|
||||
template.load(deploy_location, centered = TRUE)
|
||||
new /obj/effect/effect/harmless_smoke(get_turf(src))
|
||||
new /obj/effect/particle_effect/smoke(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/survivalcapsule/luxury
|
||||
@@ -368,20 +368,26 @@
|
||||
desc = "An easily-compressable wall used for temporary shelter."
|
||||
icon = 'icons/turf/walls/survival_pod_walls.dmi'
|
||||
icon_state = "smooth"
|
||||
smooth = SMOOTH_MORE // To Do: Add in Diagnaol Smooth Support
|
||||
smooth = SMOOTH_MORE|SMOOTH_DIAGONAL
|
||||
canSmoothWith = list(/turf/simulated/wall/survival, /obj/machinery/door/airlock/survival_pod)
|
||||
|
||||
//Door
|
||||
/obj/machinery/door/airlock/survival_pod
|
||||
name = "Airlock"
|
||||
icon = 'icons/obj/doors/survival.dmi'
|
||||
assembly_type = /obj/structure/door_assembly/door_assembly_pod
|
||||
opacity = 0
|
||||
glass = 1
|
||||
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
|
||||
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
|
||||
assemblytype = /obj/structure/door_assembly/door_assembly_pod
|
||||
|
||||
/obj/machinery/door/airlock/survival_pod/glass
|
||||
opacity = FALSE
|
||||
glass = TRUE
|
||||
|
||||
/obj/structure/door_assembly/door_assembly_pod
|
||||
base_icon_state = "survival_pod"
|
||||
glass_type = "/survival_pod"
|
||||
name = "pod airlock assembly"
|
||||
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
|
||||
base_name = "pod airlock"
|
||||
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
|
||||
airlock_type = /obj/machinery/door/airlock/survival_pod
|
||||
glass_type = /obj/machinery/door/airlock/survival_pod/glass
|
||||
|
||||
//Windoor
|
||||
/obj/machinery/door/window/survival_pod
|
||||
@@ -496,7 +502,7 @@
|
||||
var/buildstacktype = /obj/item/stack/sheet/metal
|
||||
var/buildstackamount = 5
|
||||
|
||||
/obj/structure/fans/proc/deconstruct()
|
||||
/obj/structure/fans/deconstruct()
|
||||
if(buildstacktype)
|
||||
new buildstacktype(loc, buildstackamount)
|
||||
qdel(src)
|
||||
|
||||
@@ -289,9 +289,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
switch(data_hud_seen) //give new huds
|
||||
if(0)
|
||||
show_me_the_hud(DATA_HUD_SECURITY_BASIC)
|
||||
show_me_the_hud(DATA_HUD_SECURITY_ADVANCED)
|
||||
to_chat(src, "<span class='notice'>Security HUD set.</span>")
|
||||
if(DATA_HUD_SECURITY_BASIC)
|
||||
if(DATA_HUD_SECURITY_ADVANCED)
|
||||
show_me_the_hud(DATA_HUD_MEDICAL_ADVANCED)
|
||||
to_chat(src, "<span class='notice'>Medical HUD set.</span>")
|
||||
if(DATA_HUD_MEDICAL_ADVANCED)
|
||||
|
||||
@@ -559,9 +559,10 @@
|
||||
|
||||
if(!message)
|
||||
return
|
||||
|
||||
|
||||
log_robot("[key_name(speaker)] : [message]")
|
||||
var/message_start = "<i><span class='game say'>[name], <span class='name'>[speaker.name]</span>"
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)], \"[message]\"</span></span></i>"
|
||||
var/message_body = "<span class='message'>[speaker.say_quote(message)],</i> <span class='ibm'>\"[message]\"</span></span></span>"
|
||||
|
||||
for(var/mob/M in dead_mob_list)
|
||||
if(!isnewplayer(M) && !isbrain(M))
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
var/leap_on_click = 0
|
||||
var/custom_pixel_x_offset = 0 //for admin fuckery.
|
||||
var/custom_pixel_y_offset = 0
|
||||
pass_flags = PASSTABLE
|
||||
pressure_resistance = 100 //100 kPa difference required to push
|
||||
throw_pressure_limit = 120 //120 kPa difference required to throw
|
||||
|
||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||
/mob/living/carbon/alien/humanoid/New()
|
||||
@@ -121,7 +124,7 @@
|
||||
stuttering = power
|
||||
Stun(power)
|
||||
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
/mob/living/carbon/alien/humanoid
|
||||
oxygen_alert = 0
|
||||
toxins_alert = 0
|
||||
fire_alert = 0
|
||||
pass_flags = PASSTABLE
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/Life()
|
||||
. = ..()
|
||||
update_icons()
|
||||
|
||||
@@ -4,15 +4,16 @@
|
||||
|
||||
if(!breath || (breath.total_moles() == 0))
|
||||
//Aliens breathe in vaccuum
|
||||
return 0
|
||||
return FALSE
|
||||
|
||||
var/toxins_used = 0
|
||||
var/tox_detect_threshold = 0.02
|
||||
var/breath_pressure = (breath.total_moles() * R_IDEAL_GAS_EQUATION * breath.temperature) / BREATH_VOLUME
|
||||
|
||||
//Partial pressure of the toxins in our breath
|
||||
var/Toxins_pp = (breath.toxins / breath.total_moles()) * breath_pressure
|
||||
|
||||
if(Toxins_pp) // Detect toxins in air
|
||||
if(Toxins_pp > tox_detect_threshold) // Detect toxins in air
|
||||
adjustPlasma(breath.toxins*250)
|
||||
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
|
||||
|
||||
@@ -28,8 +29,6 @@
|
||||
//BREATH TEMPERATURE
|
||||
handle_breath_temperature(breath)
|
||||
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/alien/update_sight()
|
||||
if(!client)
|
||||
return
|
||||
|
||||
@@ -135,6 +135,11 @@ var/const/MAX_ACTIVE_TIME = 400
|
||||
if(target.wear_mask)
|
||||
if(prob(20))
|
||||
return 0
|
||||
if(istype(target.wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
var/obj/item/clothing/mask/muzzle/S = target.wear_mask
|
||||
if(S.do_break())
|
||||
target.visible_message("<span class='danger'>[src] spits acid onto [S] melting the lock!</span>", \
|
||||
"<span class='userdanger'>[src] spits acid onto [S] melting the lock!</span>")
|
||||
var/obj/item/clothing/W = target.wear_mask
|
||||
if(W.flags & NODROP)
|
||||
return 0
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
to_chat(O, "<span class='boldnotice'>\A [src] has been activated. (<a href='?src=[O.UID()];jump=\ref[src]'>Teleport</a> | <a href='?src=[UID()];signup=\ref[O]'>Sign Up</a>)</span>")
|
||||
|
||||
/obj/item/device/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O)
|
||||
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
|
||||
if(cannotPossess(O))
|
||||
return 0
|
||||
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
|
||||
return 0
|
||||
@@ -133,7 +133,7 @@
|
||||
if(!check_observer(O))
|
||||
to_chat(O, "<span class='warning'>You cannot be \a [src].</span>")
|
||||
return
|
||||
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
|
||||
if(cannotPossess(O))
|
||||
to_chat(O, "<span class='warning'>Upon using the antagHUD you forfeited the ability to join the round.</span>")
|
||||
return
|
||||
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
|
||||
|
||||
@@ -2,20 +2,6 @@
|
||||
var/canEnterVentWith = "/obj/item/weapon/implant=0&/obj/item/clothing/mask/facehugger=0&/obj/item/device/radio/borg=0&/obj/machinery/camera=0"
|
||||
var/datum/middleClickOverride/middleClickOverride = null
|
||||
|
||||
/mob/living/carbon/prepare_huds()
|
||||
..()
|
||||
prepare_data_huds()
|
||||
|
||||
/mob/living/carbon/proc/prepare_data_huds()
|
||||
..()
|
||||
med_hud_set_health()
|
||||
med_hud_set_status()
|
||||
|
||||
/mob/living/carbon/updatehealth()
|
||||
..()
|
||||
med_hud_set_health()
|
||||
med_hud_set_status()
|
||||
|
||||
/mob/living/carbon/Destroy()
|
||||
QDEL_LIST(internal_organs)
|
||||
QDEL_LIST(stomach_contents)
|
||||
@@ -23,7 +9,6 @@
|
||||
if(B)
|
||||
B.leave_host()
|
||||
qdel(B)
|
||||
remove_from_all_data_huds()
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/blob_act()
|
||||
@@ -68,7 +53,7 @@
|
||||
var/mob/living/carbon/human/H = src
|
||||
var/obj/item/organ/external/organ = H.get_organ("chest")
|
||||
if(istype(organ))
|
||||
if(organ.take_damage(d, 0))
|
||||
if(organ.receive_damage(d, 0))
|
||||
H.UpdateDamageIcon()
|
||||
|
||||
H.updatehealth()
|
||||
@@ -313,6 +298,7 @@
|
||||
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
|
||||
. = ..()
|
||||
var/damage = intensity - check_eye_prot()
|
||||
var/extra_damage = 0
|
||||
if(.)
|
||||
if(visual)
|
||||
return
|
||||
@@ -323,19 +309,32 @@
|
||||
if(!E || (E && E.weld_proof))
|
||||
return
|
||||
|
||||
var/extra_darkview = 0
|
||||
if(E.dark_view)
|
||||
extra_darkview = max(E.dark_view - 2, 0)
|
||||
extra_damage = extra_darkview
|
||||
|
||||
var/light_amount = 10 // assume full brightness
|
||||
if(isturf(src.loc))
|
||||
var/turf/T = src.loc
|
||||
light_amount = round(T.get_lumcount() * 10)
|
||||
|
||||
// a dark view of 8, in full darkness, will result in maximum 1st tier damage
|
||||
var/extra_prob = (10 - light_amount) * extra_darkview
|
||||
|
||||
switch(damage)
|
||||
if(1)
|
||||
to_chat(src, "<span class='warning'>Your eyes sting a little.</span>")
|
||||
if(prob(40)) //waiting on carbon organs
|
||||
E.take_damage(1, 1)
|
||||
|
||||
var/minor_damage_multiplier = min(40 + extra_prob, 100) / 100
|
||||
var/minor_damage = minor_damage_multiplier * (1 + extra_damage)
|
||||
E.receive_damage(minor_damage, 1)
|
||||
if(2)
|
||||
to_chat(src, "<span class='warning'>Your eyes burn.</span>")
|
||||
E.take_damage(rand(2, 4), 1)
|
||||
E.receive_damage(rand(2, 4) + extra_damage, 1)
|
||||
|
||||
else
|
||||
to_chat(src, "Your eyes itch and burn severely!</span>")
|
||||
E.take_damage(rand(12, 16), 1)
|
||||
E.receive_damage(rand(12, 16) + extra_damage, 1)
|
||||
|
||||
if(E.damage > E.min_bruised_damage)
|
||||
AdjustEyeBlind(damage)
|
||||
@@ -625,6 +624,13 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
|
||||
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A></td></tr>"
|
||||
|
||||
if(istype(wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
var/obj/item/clothing/mask/muzzle/M = wear_mask
|
||||
if(M.security_lock)
|
||||
dat += " <A href='?src=[M.UID()];locked=\ref[src]'>[M.locked ? "Disable Lock" : "Set Lock"]</A>"
|
||||
|
||||
dat += "</td></tr><tr><td> </td></tr>"
|
||||
|
||||
if(handcuffed)
|
||||
dat += "<tr><td><B>Handcuffed:</B> <A href='?src=[UID()];item=[slot_handcuffed]'>Remove</A></td></tr>"
|
||||
if(legcuffed)
|
||||
@@ -661,7 +667,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
if(do_mob(usr, src, POCKET_STRIP_DELAY))
|
||||
if(internal)
|
||||
internal = null
|
||||
update_internals_hud_icon(0)
|
||||
update_action_buttons_icon()
|
||||
else
|
||||
var/no_mask2
|
||||
if(!get_organ_slot("breathing_tube"))
|
||||
@@ -672,7 +678,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
to_chat(usr, "<span class='warning'>[src] is not wearing a suitable mask or helmet!</span>")
|
||||
return
|
||||
internal = ITEM
|
||||
update_internals_hud_icon(1)
|
||||
update_action_buttons_icon()
|
||||
|
||||
visible_message("<span class='danger'>[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].</span>", \
|
||||
"<span class='userdanger'>[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].</span>")
|
||||
@@ -727,23 +733,6 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
/mob/living/carbon/is_muzzled()
|
||||
return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
|
||||
/mob/living/carbon/proc/spin(spintime, speed)
|
||||
spawn()
|
||||
var/D = dir
|
||||
while(spintime >= speed)
|
||||
sleep(speed)
|
||||
switch(D)
|
||||
if(NORTH)
|
||||
D = EAST
|
||||
if(SOUTH)
|
||||
D = WEST
|
||||
if(EAST)
|
||||
D = SOUTH
|
||||
if(WEST)
|
||||
D = NORTH
|
||||
dir = D
|
||||
spintime -= speed
|
||||
|
||||
/mob/living/carbon/resist_buckle()
|
||||
spawn(0)
|
||||
resist_muzzle()
|
||||
@@ -802,6 +791,8 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
if(do_after(src, time, 0, target = src))
|
||||
visible_message("<span class='warning'>[src] removes [I]!</span>")
|
||||
to_chat(src, "<span class='notice'>You get rid of [I]!</span>")
|
||||
if(I.security_lock)
|
||||
I.do_break()
|
||||
unEquip(I)
|
||||
|
||||
|
||||
@@ -1069,10 +1060,6 @@ so that different stomachs can handle things in different ways VB*/
|
||||
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0)
|
||||
if(hud_used && hud_used.internals)
|
||||
hud_used.internals.icon_state = "internal[internal_state]"
|
||||
|
||||
//to recalculate and update the mob's total tint from tinted equipment it's wearing.
|
||||
/mob/living/carbon/proc/update_tint()
|
||||
if(!tinted_weldhelh)
|
||||
@@ -1117,4 +1104,4 @@ so that different stomachs can handle things in different ways VB*/
|
||||
update_tint()
|
||||
if(I.flags_inv & HIDEMASK || forced)
|
||||
update_inv_wear_mask()
|
||||
update_inv_head()
|
||||
update_inv_head()
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/mob/living/carbon
|
||||
gender = MALE
|
||||
hud_possible = list(HEALTH_HUD,STATUS_HUD,SPECIALROLE_HUD)
|
||||
var/list/stomach_contents = list()
|
||||
var/list/internal_organs = list()
|
||||
var/list/internal_organs_slot = list() //Same as above, but stores "slot ID" - "organ" pairs for easy access.
|
||||
@@ -23,12 +22,7 @@
|
||||
|
||||
var/wetlevel = 0 //how wet the mob is
|
||||
|
||||
var/oxygen_alert = 0
|
||||
var/toxins_alert = 0
|
||||
var/co2_alert = 0
|
||||
var/fire_alert = 0
|
||||
|
||||
var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
|
||||
var/failed_last_breath = FALSE //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks.
|
||||
var/co2overloadtime = null
|
||||
|
||||
blood_volume = BLOOD_VOLUME_NORMAL
|
||||
|
||||
@@ -97,7 +97,7 @@ var/global/list/body_accessory_by_species = list("None" = null)
|
||||
animated_icon_state = "null"
|
||||
|
||||
/datum/body_accessory/tail/try_restrictions(var/mob/living/carbon/human/H)
|
||||
if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL) && !istype(H.wear_suit, /obj/item/clothing/suit/space))
|
||||
if(!H.wear_suit || !(H.wear_suit.flags_inv & HIDETAIL))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -140,4 +140,3 @@ var/global/list/body_accessory_by_species = list("None" = null)
|
||||
icon_state = "vulptail6"
|
||||
animated_icon_state = "vulptail6_a"
|
||||
allowed_species = list("Vulpkanin")
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
hgibs(loc, dna)
|
||||
else
|
||||
new /obj/effect/decal/cleanable/blood/gibs/robot(loc)
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
|
||||
|
||||
@@ -34,24 +34,24 @@
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
if("drone","drones","hum","hums","rumble","rumbles")
|
||||
if(species.name == "Drask") //Only Drask can make whale noises
|
||||
if(get_species() == "Drask") //Only Drask can make whale noises
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
else
|
||||
return
|
||||
if("howl", "howls")
|
||||
if (species.name == "Vulpkanin") //Only Vulpkanin can howl
|
||||
if(get_species() == "Vulpkanin") //Only Vulpkanin can howl
|
||||
on_CD = handle_emote_CD(100)
|
||||
else
|
||||
return
|
||||
if("growl", "growls")
|
||||
if (species.name == "Vulpkanin") //Only Vulpkanin can growl
|
||||
if(get_species() == "Vulpkanin") //Only Vulpkanin can growl
|
||||
on_CD = handle_emote_CD()
|
||||
else
|
||||
return
|
||||
if("squish", "squishes")
|
||||
var/found_slime_bodypart = 0
|
||||
|
||||
if(species.name == "Slime People") //Only Slime People can squish
|
||||
if(get_species() == "Slime People") //Only Slime People can squish
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
|
||||
found_slime_bodypart = 1
|
||||
else
|
||||
@@ -65,25 +65,31 @@
|
||||
return
|
||||
|
||||
if("clack", "clacks")
|
||||
if(species.name == "Kidan") //Only Kidan can clack and rightfully so.
|
||||
if(get_species() == "Kidan") //Only Kidan can clack and rightfully so.
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
|
||||
if("click", "clicks")
|
||||
if(species.name == "Kidan") //Only Kidan can click and rightfully so.
|
||||
if(get_species() == "Kidan") //Only Kidan can click and rightfully so.
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
|
||||
if("creaks", "creak")
|
||||
if(species.name == "Diona") //Only Dionas can Creaks.
|
||||
if(get_species() == "Diona") //Only Dionas can Creaks.
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
|
||||
if("hiss", "hisses")
|
||||
if(species.name == "Unathi") //Only Unathi can hiss.
|
||||
if(get_species() == "Unathi") //Only Unathi can hiss.
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
|
||||
if("quill", "quills")
|
||||
if(get_species() == "Vox") //Only Vox can rustle their quills.
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
|
||||
else //Everyone else fails, skip the emote attempt
|
||||
return
|
||||
@@ -92,7 +98,7 @@
|
||||
on_CD = handle_emote_CD(50) //longer cooldown
|
||||
if("fart", "farts", "flip", "flips", "snap", "snaps")
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
if("cough", "coughs", "slap", "slaps")
|
||||
if("cough", "coughs", "slap", "slaps", "highfive")
|
||||
on_CD = handle_emote_CD()
|
||||
if("sneeze", "sneezes")
|
||||
on_CD = handle_emote_CD()
|
||||
@@ -190,6 +196,13 @@
|
||||
playsound(loc, 'sound/effects/unathihiss.ogg', 50, 0) //Credit to Jamius (freesound.org) for the sound.
|
||||
m_type = 2
|
||||
|
||||
if("quill", "quills")
|
||||
var/M = handle_emote_param(param)
|
||||
|
||||
message = "<B>[src]</B> rustles their quills[M ? " at [M]" : ""]."
|
||||
playsound(loc, 'sound/effects/voxrustle.ogg', 50, 0) //Credit to sound-ideas (freesfx.co.uk) for the sound.
|
||||
m_type = 2
|
||||
|
||||
if("yes")
|
||||
var/M = handle_emote_param(param)
|
||||
|
||||
@@ -821,12 +834,40 @@
|
||||
continue
|
||||
M.reagents.add_reagent("jenkem", 1)
|
||||
|
||||
if("hem")
|
||||
message = "<b>[src]</b> hems."
|
||||
|
||||
if("highfive")
|
||||
if(restrained())
|
||||
return
|
||||
if(has_status_effect(STATUS_EFFECT_HIGHFIVE))
|
||||
to_chat(src, "You give up on the highfive.")
|
||||
remove_status_effect(STATUS_EFFECT_HIGHFIVE)
|
||||
return
|
||||
visible_message("<b>[name]</b> requests a highfive.", "You request a high five.")
|
||||
apply_status_effect(STATUS_EFFECT_HIGHFIVE)
|
||||
for(var/mob/living/L in orange(1))
|
||||
if(L.has_status_effect(STATUS_EFFECT_HIGHFIVE))
|
||||
if((mind && mind.special_role == SPECIAL_ROLE_WIZARD) && (L.mind && L.mind.special_role == SPECIAL_ROLE_WIZARD))
|
||||
visible_message("<span class='danger'><b>[name]</b> and <b>[L.name]</b> high-five EPICALLY!</span>")
|
||||
status_flags |= GODMODE
|
||||
L.status_flags |= GODMODE
|
||||
explosion(loc,5,2,1,3)
|
||||
status_flags &= ~GODMODE
|
||||
L.status_flags &= ~GODMODE
|
||||
return
|
||||
visible_message("<b>[name]</b> and <b>[L.name]</b> high-five!")
|
||||
playsound('sound/effects/snap.ogg', 50)
|
||||
remove_status_effect(STATUS_EFFECT_HIGHFIVE)
|
||||
L.remove_status_effect(STATUS_EFFECT_HIGHFIVE)
|
||||
return
|
||||
|
||||
if("help")
|
||||
var/emotelist = "aflap(s), airguitar, blink(s), blink(s)_r, blush(es), bow(s)-(none)/mob, burp(s), choke(s), chuckle(s), clap(s), collapse(s), cough(s),cry, cries, custom, dance, dap(s)(none)/mob," \
|
||||
+ " deathgasp(s), drool(s), eyebrow, fart(s), faint(s), flap(s), flip(s), frown(s), gasp(s), giggle(s), glare(s)-(none)/mob, grin(s), groan(s), grumble(s), grin(s)," \
|
||||
+ " handshake-mob, hug(s)-(none)/mob, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \
|
||||
+ " handshake-mob, hug(s)-(none)/mob, hem, highfive, johnny, jump, laugh(s), look(s)-(none)/mob, moan(s), mumble(s), nod(s), pale(s), point(s)-atom, quiver(s), raise(s), salute(s)-(none)/mob, scream(s), shake(s)," \
|
||||
+ " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \
|
||||
+ " wag(s), wave(s), whimper(s), wink(s), yawn(s)"
|
||||
+ " wag(s), wave(s), whimper(s), wink(s), yawn(s), quill(s)"
|
||||
|
||||
switch(species.name)
|
||||
if("Machine")
|
||||
@@ -839,6 +880,8 @@
|
||||
emotelist += "\nUnathi specific emotes :- hiss(es)"
|
||||
if("Vulpkanin")
|
||||
emotelist += "\nVulpkanin specific emotes :- growl(s)-none/mob, howl(s)-none/mob"
|
||||
if("Vox")
|
||||
emotelist += "\nVox specific emotes :- quill(s)"
|
||||
if("Diona")
|
||||
emotelist += "\nDiona specific emotes :- creak(s)"
|
||||
|
||||
|
||||
@@ -245,7 +245,7 @@
|
||||
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a robotic [E.name]!\n"
|
||||
|
||||
else if(E.status & ORGAN_SPLINTED)
|
||||
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a splint on his [E.name]!\n"
|
||||
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a splint on [t_his] [E.name]!\n"
|
||||
|
||||
for(var/obj/item/I in E.embedded_objects)
|
||||
msg += "<B>[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [E.name]!</B>\n"
|
||||
|
||||
@@ -399,7 +399,7 @@
|
||||
Stuttering(power)
|
||||
Stun(power)
|
||||
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
|
||||
@@ -455,7 +455,14 @@
|
||||
if(slot_wear_mask in obscured)
|
||||
dat += "<tr><td><font color=grey><B>Mask:</B></font></td><td><font color=grey>Obscured</font></td></tr>"
|
||||
else
|
||||
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A></td></tr>"
|
||||
dat += "<tr><td><B>Mask:</B></td><td><A href='?src=[UID()];item=[slot_wear_mask]'>[(wear_mask && !(wear_mask.flags&ABSTRACT)) ? wear_mask : "<font color=grey>Empty</font>"]</A>"
|
||||
|
||||
if(istype(wear_mask, /obj/item/clothing/mask/muzzle))
|
||||
var/obj/item/clothing/mask/muzzle/M = wear_mask
|
||||
if(M.security_lock)
|
||||
dat += " <A href='?src=[M.UID()];locked=\ref[src]'>[M.locked ? "Disable Lock" : "Set Lock"]</A>"
|
||||
|
||||
dat += "</td></tr><tr><td> </td></tr>"
|
||||
|
||||
if(!issmall(src))
|
||||
if(slot_glasses in obscured)
|
||||
@@ -708,7 +715,7 @@
|
||||
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
|
||||
return
|
||||
L.embedded_objects -= I
|
||||
L.take_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
|
||||
L.receive_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
|
||||
I.forceMove(get_turf(src))
|
||||
usr.put_in_hands(I)
|
||||
usr.emote("scream")
|
||||
@@ -1299,36 +1306,6 @@
|
||||
src.custom_pain("You feel a stabbing pain in your chest!", 1)
|
||||
L.damage = L.min_bruised_damage
|
||||
|
||||
/*
|
||||
/mob/living/carbon/human/verb/simulate()
|
||||
set name = "sim"
|
||||
//set background = 1
|
||||
|
||||
var/damage = input("Wound damage","Wound damage") as num
|
||||
|
||||
var/germs = 0
|
||||
var/tdamage = 0
|
||||
var/ticks = 0
|
||||
while(germs < 2501 && ticks < 100000 && round(damage/10)*20)
|
||||
diary << "VIRUS TESTING: [ticks] : germs [germs] tdamage [tdamage] prob [round(damage/10)*20]"
|
||||
ticks++
|
||||
if(prob(round(damage/10)*20))
|
||||
germs++
|
||||
if(germs == 100)
|
||||
to_chat(world, "Reached stage 1 in [ticks] ticks")
|
||||
if(germs > 100)
|
||||
if(prob(10))
|
||||
damage++
|
||||
germs++
|
||||
if(germs == 1000)
|
||||
to_chat(world, "Reached stage 2 in [ticks] ticks")
|
||||
if(germs > 1000)
|
||||
damage++
|
||||
germs++
|
||||
if(germs == 2500)
|
||||
to_chat(world, "Reached stage 3 in [ticks] ticks")
|
||||
to_chat(world, "Mob took [tdamage] tox damage")
|
||||
*/
|
||||
//returns 1 if made bloody, returns 0 otherwise
|
||||
|
||||
/mob/living/carbon/human/clean_blood(var/clean_feet)
|
||||
@@ -1434,10 +1411,6 @@
|
||||
|
||||
maxHealth = species.total_health
|
||||
|
||||
toxins_alert = 0
|
||||
oxygen_alert = 0
|
||||
fire_alert = 0
|
||||
|
||||
if(species.language)
|
||||
add_language(species.language)
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
if(sponge)
|
||||
if(species)
|
||||
amount = amount * species.brain_mod
|
||||
sponge.take_damage(amount, 1)
|
||||
sponge.receive_damage(amount, 1)
|
||||
brainloss = sponge.damage
|
||||
else
|
||||
brainloss = 200
|
||||
@@ -112,7 +112,7 @@
|
||||
var/obj/item/organ/external/O = get_organ(organ_name)
|
||||
|
||||
if(amount > 0)
|
||||
O.take_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source)
|
||||
O.receive_damage(amount, 0, sharp=is_sharp(damage_source), used_weapon=damage_source)
|
||||
else
|
||||
//if you don't want to heal robot organs, they you will have to check that yourself before using this proc.
|
||||
O.heal_damage(-amount, 0, internal=0, robo_repair=(O.status & ORGAN_ROBOT))
|
||||
@@ -126,7 +126,7 @@
|
||||
var/obj/item/organ/external/O = get_organ(organ_name)
|
||||
|
||||
if(amount > 0)
|
||||
O.take_damage(0, amount, sharp=is_sharp(damage_source), used_weapon=damage_source)
|
||||
O.receive_damage(0, amount, sharp=is_sharp(damage_source), used_weapon=damage_source)
|
||||
else
|
||||
//if you don't want to heal robot organs, they you will have to check that yourself before using this proc.
|
||||
O.heal_damage(0, -amount, internal=0, robo_repair=(O.status & ORGAN_ROBOT))
|
||||
@@ -240,7 +240,7 @@
|
||||
if(!parts.len)
|
||||
return
|
||||
var/obj/item/organ/external/picked = pick(parts)
|
||||
if(picked.take_damage(brute, burn, sharp))
|
||||
if(picked.receive_damage(brute, burn, sharp))
|
||||
UpdateDamageIcon()
|
||||
updatehealth()
|
||||
speech_problem_flag = 1
|
||||
@@ -285,7 +285,7 @@
|
||||
var/burn_was = picked.burn_dam
|
||||
|
||||
|
||||
update |= picked.take_damage(brute_per_part, burn_per_part, sharp, used_weapon)
|
||||
update |= picked.receive_damage(brute_per_part, burn_per_part, sharp, used_weapon)
|
||||
|
||||
brute -= (picked.brute_dam - brute_was)
|
||||
burn -= (picked.burn_dam - burn_was)
|
||||
@@ -355,7 +355,7 @@ This function restores all organs.
|
||||
if(species)
|
||||
damage = damage * species.brute_mod
|
||||
|
||||
if(organ.take_damage(damage, 0, sharp, used_weapon))
|
||||
if(organ.receive_damage(damage, 0, sharp, used_weapon))
|
||||
UpdateDamageIcon()
|
||||
|
||||
if(LAssailant && ishuman(LAssailant)) //superheros still get the comical hit markers
|
||||
@@ -372,7 +372,7 @@ This function restores all organs.
|
||||
dmgIcon.pixel_y = (!lying) ? rand(-11,9) : rand(-10,1)
|
||||
flick_overlay(dmgIcon, attack_bubble_recipients, 9)
|
||||
|
||||
receive_damage()
|
||||
receiving_damage()
|
||||
|
||||
if(BURN)
|
||||
damageoverlaytemp = 20
|
||||
@@ -380,7 +380,7 @@ This function restores all organs.
|
||||
if(species)
|
||||
damage = damage * species.burn_mod
|
||||
|
||||
if(organ.take_damage(0, damage, sharp, used_weapon))
|
||||
if(organ.receive_damage(0, damage, sharp, used_weapon))
|
||||
UpdateDamageIcon()
|
||||
|
||||
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
|
||||
|
||||
@@ -311,7 +311,7 @@ emp_act
|
||||
L.embedded_objects |= I
|
||||
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
|
||||
I.forceMove(src)
|
||||
L.take_damage(I.w_class*I.embedded_impact_pain_multiplier)
|
||||
L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier)
|
||||
visible_message("<span class='danger'>[I] embeds itself in [src]'s [L.name]!</span>","<span class='userdanger'>[I] embeds itself in your [L.name]!</span>")
|
||||
hitpush = 0
|
||||
skipcatch = 1 //can't catch the now embedded item
|
||||
@@ -358,10 +358,10 @@ emp_act
|
||||
if("brute")
|
||||
if(M.force > 20)
|
||||
Paralyse(1)
|
||||
update |= affecting.take_damage(rand(M.force/2, M.force), 0)
|
||||
update |= affecting.receive_damage(rand(M.force/2, M.force), 0)
|
||||
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
|
||||
if("fire")
|
||||
update |= affecting.take_damage(0, rand(M.force/2, M.force))
|
||||
update |= affecting.receive_damage(0, rand(M.force/2, M.force))
|
||||
playsound(src, 'sound/items/Welder.ogg', 50, 1)
|
||||
if("tox")
|
||||
M.mech_toxin_damage(src)
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
if(E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
|
||||
var/obj/item/organ/internal/I = pick(E.internal_organs)
|
||||
custom_pain("You feel broken bones moving in your [E.name]!", 1)
|
||||
I.take_damage(rand(3,5))
|
||||
I.receive_damage(rand(3,5))
|
||||
|
||||
//handle_stance()
|
||||
handle_grasp()
|
||||
@@ -107,7 +107,7 @@
|
||||
|
||||
custom_emote(1, "drops what they were holding, their [E.name] malfunctioning!")
|
||||
|
||||
var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
|
||||
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
|
||||
spark_system.set_up(5, 0, src)
|
||||
spark_system.attach(src)
|
||||
spark_system.start()
|
||||
|
||||
@@ -618,7 +618,7 @@
|
||||
if(istype(D,/obj/machinery/door/airlock))
|
||||
var/obj/machinery/door/airlock/AL = D
|
||||
if(!AL.CanAStarPass(RPID)) // only crack open doors we can't get through
|
||||
AL.p_open = 1
|
||||
AL.panel_open = 1
|
||||
AL.update_icon()
|
||||
AL.shock(src, mistake_chance)
|
||||
sleep(5)
|
||||
@@ -638,7 +638,7 @@
|
||||
if(prob(mistake_chance) && !AL.wires.IsIndexCut(AIRLOCK_WIRE_ELECTRIFY))
|
||||
AL.wires.CutWireIndex(AIRLOCK_WIRE_ELECTRIFY)
|
||||
sleep(5)
|
||||
AL.p_open = 0
|
||||
AL.panel_open = 0
|
||||
AL.update_icon()
|
||||
D.open()
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
update_head_accessory()
|
||||
if(internal && !get_organ_slot("breathing_tube"))
|
||||
internal = null
|
||||
update_internals_hud_icon(0)
|
||||
update_action_buttons_icon()
|
||||
wear_mask_update(I, toggle_off = FALSE)
|
||||
sec_hud_set_ID()
|
||||
update_inv_wear_mask()
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
/mob/living/carbon/human/Life()
|
||||
fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it.
|
||||
life_tick++
|
||||
|
||||
voice = GetVoice()
|
||||
@@ -94,32 +93,49 @@
|
||||
if(getBrainLoss() >= 60 && stat != DEAD)
|
||||
speech_problem_flag = 1
|
||||
if(prob(3))
|
||||
var/list/s1 = list("IM A PONY NEEEEEEIIIIIIIIIGH",
|
||||
var/list/s1 = list("IM A [pick("PONY","LIZARD","taJaran","kitty","Vulpakin","drASK","BIRDIE","voxxie","race car","combat meCH","SPESSSHIP")] [pick("NEEEEEEIIIIIIIIIGH","sKREEEEEE","MEOW","NYA~","rawr","Barkbark","Hissssss","vROOOOOM","pewpew","choo Choo")]!",
|
||||
"without oxigen blob don't evoluate?",
|
||||
"CAPTAINS A COMDOM",
|
||||
"[pick("", "that damn traitor")] [pick("joerge", "george", "gorge", "gdoruge")] [pick("mellens", "melons", "mwrlins")] is grifing me HAL;P!!!",
|
||||
"can u give me [pick("telikesis","halk","eppilapse")]?",
|
||||
"THe saiyans screwed",
|
||||
"Bi is THE BEST OF BOTH WORLDS>",
|
||||
"Bi is THE BEST OF BOTH WORLDS",
|
||||
"I WANNA PET TEH monkeyS",
|
||||
"stop grifing me!!!!",
|
||||
"SOTP IT#")
|
||||
"SOTP IT!",
|
||||
"HALPZ SITCULITY",
|
||||
"VOXES caN't LOVE",
|
||||
"my dad own this station",
|
||||
"the CHef put [pick("PROTEIN", "toiret waTer", "RiPPleing TendIes", "Einzymes","HORRY WALTER","nuTriments","ReActive MutAngen","TeSLium","sKrektonium")] in my [pick("wiSh soup","Bullito","rAingurber","sOilent GREEn","KoI Susishes","yaya")]!",
|
||||
"the monkey have TASER ARMS!",
|
||||
"qM blew my points on [pick("cOMbat Shtogun","inSuLated gloves","LOTS MASSHEEN!")]",
|
||||
"EI'NATH!",
|
||||
"WAKE UP SHEEPLES!",
|
||||
"et wus my [pick("wittle brother!!","fiancee","friend staying over","entiRe orphanage","love interest","wife","husband","liTTle kids","sentient cAT","accidentally")]!")
|
||||
|
||||
var/list/s2 = list("FUS RO DAH",
|
||||
"fucking 4rries!",
|
||||
"fuckin tangerines!!!",
|
||||
"stat me",
|
||||
">my face",
|
||||
"roll it easy!",
|
||||
"waaaaaagh!!!",
|
||||
"red wonz go fasta",
|
||||
"FOR TEH EMPRAH",
|
||||
"lol2cat",
|
||||
"HAZ A SECURE DAY!!!!",
|
||||
"dem dwarfs man, dem dwarfs",
|
||||
"SPESS MAHREENS",
|
||||
"hwee did eet fhor khayosss",
|
||||
"lifelike texture ;_;",
|
||||
"lifelike texture",
|
||||
"luv can bloooom",
|
||||
"PACKETS!!!")
|
||||
"PACKETS!!!",
|
||||
"[pick("WHERE MY","aYE need","giv me my","bath me inn.")] [pick("dermaline","alKkyZine","dylOvene","inAprovaline","biCaridine","Hyperzine","kELotane","lePorazine","bAcch Salts","tricord","clOnexazone","hydroChloric Acid","chlorine Hydrate","paRoxetine")]!",
|
||||
"mALPRACTICEBAY",
|
||||
"I HavE A pe H dee iN ENTerpriSE resOUrCE pLaNNIN",
|
||||
"h-h-HalP MaINT",
|
||||
"dey come, dey COME! DEY COME!!!",
|
||||
"THE END IS NIGH!",
|
||||
"I FOT AND DIED FOR MUH [pick("RITES","FREEDOM","payCHECK","cARGO points","teCH Level","doG","mAPLe syrup","fluffy fWiends","gateway Loot")]",
|
||||
"KILL DEM [pick("mainTnacE cHickinNS","kiRA CulwnNES","FLOOR CLUWNEs","MIME ASSASSIN","BOMBING TAJARAN","cC offiser","morPhlings","slinglings")]!")
|
||||
switch(pick(1,2,3))
|
||||
if(1)
|
||||
say(pick(s1))
|
||||
@@ -222,61 +238,38 @@
|
||||
chest.add_autopsy_data("Radiation Poisoning", autopsy_damage)
|
||||
|
||||
/mob/living/carbon/human/breathe()
|
||||
if(!species.breathe(src))
|
||||
..()
|
||||
|
||||
if((NO_BREATH in mutations) || (NO_BREATHE in species.species_traits) || reagents.has_reagent("lexorin"))
|
||||
adjustOxyLoss(-5)
|
||||
oxygen_alert = 0
|
||||
toxins_alert = 0
|
||||
return
|
||||
if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
|
||||
return
|
||||
/mob/living/carbon/human/check_breath(datum/gas_mixture/breath)
|
||||
|
||||
var/datum/gas_mixture/environment
|
||||
if(loc)
|
||||
environment = loc.return_air()
|
||||
var/obj/item/organ/internal/L = get_organ_slot("lungs")
|
||||
|
||||
var/datum/gas_mixture/breath
|
||||
if(!L || L && (L.status & ORGAN_DEAD))
|
||||
if(health >= config.health_threshold_crit)
|
||||
adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1)
|
||||
else
|
||||
adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
|
||||
|
||||
if(health <= config.health_threshold_crit)
|
||||
AdjustLoseBreath(1)
|
||||
failed_last_breath = TRUE
|
||||
|
||||
if(losebreath > 0)
|
||||
AdjustLoseBreath(-1)
|
||||
if(prob(10))
|
||||
emote("gasp")
|
||||
if(istype(loc, /obj/))
|
||||
var/obj/loc_as_obj = loc
|
||||
loc_as_obj.handle_internal_lifeform(src, 0)
|
||||
if(species)
|
||||
var/datum/species/S = species
|
||||
|
||||
if(S.breathid == "o2")
|
||||
throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
|
||||
else if(S.breathid == "tox")
|
||||
throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox)
|
||||
else if(S.breathid == "co2")
|
||||
throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2)
|
||||
else if(S.breathid == "n2")
|
||||
throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro)
|
||||
|
||||
return FALSE
|
||||
else
|
||||
breath = get_breath_from_internal(BREATH_VOLUME)
|
||||
|
||||
if(!breath)
|
||||
if(isobj(loc)) //Breathe from loc as object
|
||||
var/obj/loc_as_obj = loc
|
||||
breath = loc_as_obj.handle_internal_lifeform(src, BREATH_MOLES)
|
||||
|
||||
else if(isturf(loc)) //Breathe from loc as turf
|
||||
var/breath_moles = 0
|
||||
if(environment)
|
||||
breath_moles = environment.total_moles()*BREATH_PERCENTAGE
|
||||
|
||||
breath = loc.remove_air(breath_moles)
|
||||
|
||||
if(!is_lung_ruptured()) // THIS FUCKING EXCERPT, THIS LITTLE FUCKING EXCERPT, SNOWFLAKED
|
||||
if(!breath || breath.total_moles() < BREATH_MOLES / 5 || breath.total_moles() > BREATH_MOLES * 5) // RIGHT IN THE CENTER OF THE FUCKING BREATHE PROC
|
||||
if(prob(5)) // IT IS THE ONLY FUCKING REASONS HUMAN OVERRIDE breathe()
|
||||
rupture_lung() // GOD FUCKING DAMNIT
|
||||
|
||||
else //Breathe from loc as obj again
|
||||
if(istype(loc, /obj/))
|
||||
var/obj/loc_as_obj = loc
|
||||
loc_as_obj.handle_internal_lifeform(src,0)
|
||||
|
||||
check_breath(breath)
|
||||
|
||||
if(breath)
|
||||
loc.assume_air(breath)
|
||||
|
||||
if(istype(L, /obj/item/organ/internal/lungs))
|
||||
var/obj/item/organ/internal/lungs/lun = L
|
||||
lun.check_breath(breath, src)
|
||||
|
||||
// USED IN DEATHWHISPERS
|
||||
/mob/living/carbon/human/proc/isInCrit()
|
||||
@@ -307,45 +300,13 @@
|
||||
|
||||
if(null_internals) //something wants internals gone
|
||||
internal = null //so do it
|
||||
|
||||
update_action_buttons_icon()
|
||||
|
||||
if(internal) //check for hud updates every time this is called
|
||||
update_internals_hud_icon(1)
|
||||
return internal.remove_air_volume(volume_needed) //returns the valid air
|
||||
else
|
||||
update_internals_hud_icon(0)
|
||||
|
||||
return null
|
||||
|
||||
/mob/living/carbon/human/check_breath(var/datum/gas_mixture/breath)
|
||||
if(status_flags & GODMODE)
|
||||
return 0
|
||||
|
||||
if(!breath || (breath.total_moles() == 0) || suiciding)
|
||||
var/oxyloss = 0
|
||||
if(suiciding)
|
||||
oxyloss = 2
|
||||
adjustOxyLoss(oxyloss)//If you are suiciding, you should die a little bit faster
|
||||
failed_last_breath = 1
|
||||
oxygen_alert = max(oxygen_alert, 1)
|
||||
return 0
|
||||
if(health > 0)
|
||||
oxyloss = HUMAN_MAX_OXYLOSS
|
||||
adjustOxyLoss(oxyloss)
|
||||
failed_last_breath = 1
|
||||
else
|
||||
oxyloss = HUMAN_CRIT_MAX_OXYLOSS
|
||||
adjustOxyLoss(oxyloss)
|
||||
failed_last_breath = 1
|
||||
|
||||
var/obj/item/organ/external/affected = get_organ("chest")
|
||||
affected.add_autopsy_data("Suffocation", oxyloss)
|
||||
throw_alert("oxy", /obj/screen/alert/oxy)
|
||||
|
||||
return 0
|
||||
|
||||
return species.handle_breath(breath, src)
|
||||
|
||||
/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment)
|
||||
if(!environment)
|
||||
return
|
||||
@@ -374,7 +335,7 @@
|
||||
if(bodytemperature > species.heat_level_1)
|
||||
//Body temperature is too hot.
|
||||
if(status_flags & GODMODE) return 1 //godmode
|
||||
var/mult = species.hot_env_multiplier
|
||||
var/mult = species.heatmod
|
||||
|
||||
if(bodytemperature >= species.heat_level_1 && bodytemperature <= species.heat_level_2)
|
||||
throw_alert("temp", /obj/screen/alert/hot, 1)
|
||||
@@ -396,7 +357,7 @@
|
||||
return 1
|
||||
|
||||
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
|
||||
var/mult = species.cold_env_multiplier
|
||||
var/mult = species.coldmod
|
||||
if(bodytemperature >= species.cold_level_2 && bodytemperature <= species.cold_level_1)
|
||||
throw_alert("temp", /obj/screen/alert/cold, 1)
|
||||
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_1, used_weapon = "Low Body Temperature")
|
||||
@@ -419,7 +380,7 @@
|
||||
if(status_flags & GODMODE) return 1 //godmode
|
||||
|
||||
if(adjusted_pressure >= species.hazard_high_pressure)
|
||||
if(!(RESIST_HEAT in mutations))
|
||||
if(!(HEATRES in mutations))
|
||||
var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
|
||||
take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure")
|
||||
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
|
||||
@@ -432,7 +393,7 @@
|
||||
else if(adjusted_pressure >= species.hazard_low_pressure)
|
||||
throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
|
||||
else
|
||||
if(RESIST_COLD in mutations)
|
||||
if(COLDRES in mutations)
|
||||
clear_alert("pressure")
|
||||
else
|
||||
take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
|
||||
@@ -443,7 +404,7 @@
|
||||
/mob/living/carbon/human/handle_fire()
|
||||
if(..())
|
||||
return
|
||||
if(RESIST_HEAT in mutations)
|
||||
if(HEATRES in mutations)
|
||||
return
|
||||
if(on_fire)
|
||||
var/thermal_protection = get_thermal_protection()
|
||||
@@ -507,7 +468,7 @@
|
||||
|
||||
/mob/living/carbon/human/proc/get_heat_protection(temperature) //Temperature is the temperature you're being exposed to.
|
||||
|
||||
if(RESIST_HEAT in mutations)
|
||||
if(HEATRES in mutations)
|
||||
return 1
|
||||
|
||||
var/thermal_protection_flags = get_heat_protection_flags(temperature)
|
||||
@@ -568,7 +529,7 @@
|
||||
|
||||
/mob/living/carbon/human/proc/get_cold_protection(temperature)
|
||||
|
||||
if(RESIST_COLD in mutations)
|
||||
if(COLDRES in mutations)
|
||||
return 1 //Fully protected from the cold.
|
||||
|
||||
temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K.
|
||||
@@ -746,16 +707,16 @@
|
||||
Paralyse(5/sober_str)
|
||||
Drowsy(30/sober_str)
|
||||
if(L)
|
||||
L.take_damage(0.1, 1)
|
||||
L.receive_damage(0.1, 1)
|
||||
adjustToxLoss(0.1)
|
||||
else //stuff only for synthetics
|
||||
if(alcohol_strength >= spark_start && prob(25))
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(alcohol_strength >= collapse_start && prob(10))
|
||||
emote("collapse")
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
|
||||
s.set_up(3, 1, src)
|
||||
s.start()
|
||||
if(alcohol_strength >= braindamage_start && prob(10))
|
||||
@@ -918,11 +879,11 @@
|
||||
var/obj/item/organ/external/BP = X
|
||||
for(var/obj/item/I in BP.embedded_objects)
|
||||
if(prob(I.embedded_pain_chance))
|
||||
BP.take_damage(I.w_class*I.embedded_pain_multiplier)
|
||||
BP.receive_damage(I.w_class*I.embedded_pain_multiplier)
|
||||
to_chat(src, "<span class='userdanger'>[I] embedded in your [BP.name] hurts!</span>")
|
||||
|
||||
if(prob(I.embedded_fall_chance))
|
||||
BP.take_damage(I.w_class*I.embedded_fall_pain_multiplier)
|
||||
BP.receive_damage(I.w_class*I.embedded_fall_pain_multiplier)
|
||||
BP.embedded_objects -= I
|
||||
I.forceMove(get_turf(src))
|
||||
visible_message("<span class='danger'>[I] falls out of [name]'s [BP.name]!</span>","<span class='userdanger'>[I] falls out of your [BP.name]!</span>")
|
||||
@@ -1016,7 +977,7 @@
|
||||
var/obj/item/clothing/mask/M = H.wear_mask
|
||||
if(M && (M.flags_cover & MASKCOVERSMOUTH))
|
||||
return
|
||||
if(NO_BREATHE in species.species_traits)
|
||||
if(NO_BREATHE in H.species.species_traits)
|
||||
return //no puking if you can't smell!
|
||||
// Humans can lack a mind datum, y'know
|
||||
if(H.mind && (H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Coroner"))
|
||||
|
||||
@@ -86,9 +86,14 @@
|
||||
return real_name
|
||||
|
||||
/mob/living/carbon/human/IsVocal()
|
||||
// how do species that don't breathe talk? magic, that's what.
|
||||
var/breathes = (!(NO_BREATHE in species.species_traits))
|
||||
var/obj/item/organ/internal/L = get_organ_slot("lungs")
|
||||
if((breathes && !L) || breathes && L && (L.status & ORGAN_DEAD))
|
||||
return FALSE
|
||||
if(mind)
|
||||
return !mind.miming
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/proc/SetSpecialVoice(var/new_voice)
|
||||
if(new_voice)
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
eyes = "blank_eyes"
|
||||
has_organ = list(
|
||||
"heart" = /obj/item/organ/internal/heart,
|
||||
"lungs" = /obj/item/organ/internal/lungs,
|
||||
"liver" = /obj/item/organ/internal/liver,
|
||||
"kidneys" = /obj/item/organ/internal/kidneys,
|
||||
"brain" = /obj/item/organ/internal/brain,
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
heat_level_1 = 999999999
|
||||
heat_level_2 = 999999999
|
||||
heat_level_3 = 999999999
|
||||
heat_level_3_breathe = 999999999
|
||||
|
||||
blood_color = "#515573"
|
||||
flesh_color = "#137E8F"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user