mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-18 10:33:30 +01:00
Merge branch 'master' into ERT-changes
This commit is contained in:
@@ -170,7 +170,6 @@ var/list/admin_verbs_debug = list(
|
||||
/client/proc/admin_serialize,
|
||||
/client/proc/jump_to_ruin,
|
||||
/client/proc/toggle_medal_disable,
|
||||
/client/proc/startadmintickets,
|
||||
)
|
||||
var/list/admin_verbs_possess = list(
|
||||
/proc/possess,
|
||||
|
||||
@@ -407,11 +407,11 @@
|
||||
dat += "Current Game Mode: <B>[ticker.mode.name]</B><BR>"
|
||||
dat += "Round Duration: <B>[round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)]:[add_zero(num2text(ROUND_TIME / 10 % 60), 2)]</B><BR>"
|
||||
dat += "<B>Emergency shuttle</B><BR>"
|
||||
if(shuttle_master.emergency.mode < SHUTTLE_CALL)
|
||||
if(SSshuttle.emergency.mode < SHUTTLE_CALL)
|
||||
dat += "<a href='?src=[UID()];call_shuttle=1'>Call Shuttle</a><br>"
|
||||
else
|
||||
var/timeleft = shuttle_master.emergency.timeLeft()
|
||||
if(shuttle_master.emergency.mode < SHUTTLE_DOCKED)
|
||||
var/timeleft = SSshuttle.emergency.timeLeft()
|
||||
if(SSshuttle.emergency.mode < SHUTTLE_DOCKED)
|
||||
dat += "ETA: <a href='?_src_=holder;edit_shuttle_time=1'>[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]</a><BR>"
|
||||
dat += "<a href='?_src_=holder;call_shuttle=2'>Send Back</a><br>"
|
||||
else
|
||||
|
||||
@@ -1,185 +0,0 @@
|
||||
/*
|
||||
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
|
||||
@@ -1,172 +0,0 @@
|
||||
/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(mob/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(mob/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(mob/user)
|
||||
//dat
|
||||
var/tickets = checkForTicket(user.client)
|
||||
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, 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)
|
||||
@@ -1,51 +1,33 @@
|
||||
//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))
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
globAdminTicketHolder.showUI(usr)
|
||||
SStickets.showUI(usr)
|
||||
|
||||
/client/proc/resolveAllTickets()
|
||||
set name = "Resolve All Open Tickets"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder && !check_rights(R_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()
|
||||
|
||||
|
||||
SStickets.resolveAllOpenTickets()
|
||||
|
||||
/client/proc/openUserUI()
|
||||
|
||||
set name = "My Tickets"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder && !check_rights(R_ADMIN))
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
globAdminTicketHolder.userDetailUI(usr)
|
||||
SStickets.userDetailUI(usr)
|
||||
|
||||
+14
-14
@@ -30,7 +30,7 @@
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/ticketID = text2num(href_list["openadminticket"])
|
||||
globAdminTicketHolder.showDetailUI(usr, ticketID)
|
||||
SStickets.showDetailUI(usr, ticketID)
|
||||
|
||||
if(href_list["stickyban"])
|
||||
stickyban(href_list["stickyban"],href_list)
|
||||
@@ -274,22 +274,22 @@
|
||||
|
||||
switch(href_list["call_shuttle"])
|
||||
if("1")
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_DOCKED)
|
||||
if(SSshuttle.emergency.mode >= SHUTTLE_DOCKED)
|
||||
return
|
||||
shuttle_master.emergency.request()
|
||||
SSshuttle.emergency.request()
|
||||
log_admin("[key_name(usr)] called the Emergency Shuttle")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] called the Emergency Shuttle to the station</span>")
|
||||
|
||||
if("2")
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_DOCKED)
|
||||
if(SSshuttle.emergency.mode >= SHUTTLE_DOCKED)
|
||||
return
|
||||
switch(shuttle_master.emergency.mode)
|
||||
switch(SSshuttle.emergency.mode)
|
||||
if(SHUTTLE_CALL)
|
||||
shuttle_master.emergency.cancel()
|
||||
SSshuttle.emergency.cancel()
|
||||
log_admin("[key_name(usr)] sent the Emergency Shuttle back")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] sent the Emergency Shuttle back</span>")
|
||||
else
|
||||
shuttle_master.emergency.cancel()
|
||||
SSshuttle.emergency.cancel()
|
||||
log_admin("[key_name(usr)] called the Emergency Shuttle")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] called the Emergency Shuttle to the station</span>")
|
||||
|
||||
@@ -299,10 +299,10 @@
|
||||
else if(href_list["edit_shuttle_time"])
|
||||
if(!check_rights(R_SERVER)) return
|
||||
|
||||
var/timer = input("Enter new shuttle duration (seconds):","Edit Shuttle Timeleft", shuttle_master.emergency.timeLeft() ) as num
|
||||
shuttle_master.emergency.setTimer(timer*10)
|
||||
var/timer = input("Enter new shuttle duration (seconds):","Edit Shuttle Timeleft", SSshuttle.emergency.timeLeft() ) as num
|
||||
SSshuttle.emergency.setTimer(timer*10)
|
||||
log_admin("[key_name(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds")
|
||||
minor_announcement.Announce("The emergency shuttle will reach its destination in [round(shuttle_master.emergency.timeLeft(600))] minutes.")
|
||||
minor_announcement.Announce("The emergency shuttle will reach its destination in [round(SSshuttle.emergency.timeLeft(600))] minutes.")
|
||||
message_admins("<span class='adminnotice'>[key_name_admin(usr)] edited the Emergency Shuttle's timeleft to [timer] seconds</span>")
|
||||
href_list["secrets"] = "check_antagonist"
|
||||
|
||||
@@ -1988,7 +1988,7 @@
|
||||
P.name = "Central Command - paper"
|
||||
var/stypes = list("Handle it yourselves!","Illegible fax","Fax not signed","Not Right Now","You are wasting our time", "Keep up the good work", "ERT Instructions")
|
||||
var/stype = input(src.owner, "Which type of standard reply do you wish to send to [H]?","Choose your paperwork", "") as null|anything in stypes
|
||||
var/tmsg = "<font face='Verdana' color='black'><center><img src = 'ntlogo.png'><BR><BR><BR><font size='4'><B>Nanotrasen Science Station Cyberiad</B></font><BR><BR><BR><font size='4'>NAS Trurl Communications Department Report</font></center><BR><BR>"
|
||||
var/tmsg = "<font face='Verdana' color='black'><center><img src = 'ntlogo.png'><BR><BR><BR><font size='4'><B>Nanotrasen Science Station [using_map.station_short]</B></font><BR><BR><BR><font size='4'>NAS Trurl Communications Department Report</font></center><BR><BR>"
|
||||
if(stype == "Handle it yourselves!")
|
||||
tmsg += "Greetings, esteemed crewmember. Your fax has been <B><I>DECLINED</I></B> automatically by NAS Trurl Fax Registration.<BR><BR>Please proceed in accordance with Standard Operating Procedure and/or Space Law. You are fully trained to handle this situation without Central Command intervention.<BR><BR><i><small>This is an automatic message.</small>"
|
||||
else if(stype == "Illegible fax")
|
||||
@@ -2859,21 +2859,21 @@
|
||||
if("moveminingshuttle")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShM")
|
||||
if(!shuttle_master.toggleShuttle("mining","mining_home","mining_away"))
|
||||
if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away"))
|
||||
message_admins("[key_name_admin(usr)] moved mining shuttle")
|
||||
log_admin("[key_name(usr)] moved the mining shuttle")
|
||||
|
||||
if("movelaborshuttle")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShL")
|
||||
if(!shuttle_master.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away"))
|
||||
if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away"))
|
||||
message_admins("[key_name_admin(usr)] moved labor shuttle")
|
||||
log_admin("[key_name(usr)] moved the labor shuttle")
|
||||
|
||||
if("moveferry")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","ShF")
|
||||
if(!shuttle_master.toggleShuttle("ferry","ferry_home","ferry_away"))
|
||||
if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away"))
|
||||
message_admins("[key_name_admin(usr)] moved the centcom ferry")
|
||||
log_admin("[key_name(usr)] moved the centcom ferry")
|
||||
|
||||
|
||||
@@ -117,15 +117,15 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
if("Adminhelp")
|
||||
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
|
||||
if(SStickets.checkForOpenTicket(usr)) // If user already has an open ticket
|
||||
var/datum/admin_ticket/T = SStickets.checkForOpenTicket(usr) // 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.
|
||||
ticketNum = SStickets.getTicketCounter() // ticketNum is the ticket ready to be assigned.
|
||||
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, TRUE, 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>)" : ""](<A HREF='?_src_=holder;take_question=[mob.UID()]'>TAKE</A>) :</span> <span class='adminhelp'>[msg]</span>"
|
||||
//Open a new adminticket and inform the user.
|
||||
globAdminTicketHolder.newTicket(src, prunedmsg, msg)
|
||||
SStickets.newTicket(src, prunedmsg, msg)
|
||||
for(var/client/X in modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
|
||||
@@ -187,15 +187,15 @@
|
||||
return
|
||||
//Check if the mob being PM'd has any open admin tickets.
|
||||
var/tickets = list()
|
||||
tickets = globAdminTicketHolder.checkForTicket(C)
|
||||
tickets = SStickets.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)
|
||||
tickets = SStickets.checkForTicket(C)
|
||||
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)
|
||||
tickets = SStickets.checkForTicket(C)
|
||||
if(tickets)
|
||||
for(var/datum/admin_ticket/i in tickets)
|
||||
i.addResponse(src, msg)
|
||||
|
||||
@@ -796,7 +796,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
set category = "Admin"
|
||||
set name = "Call Shuttle"
|
||||
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_DOCKED)
|
||||
if(SSshuttle.emergency.mode >= SHUTTLE_DOCKED)
|
||||
return
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
@@ -806,11 +806,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
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
|
||||
SSshuttle.emergency.canRecall = TRUE
|
||||
else
|
||||
shuttle_master.emergency.canRecall = FALSE
|
||||
SSshuttle.emergency.canRecall = FALSE
|
||||
|
||||
shuttle_master.emergency.request()
|
||||
SSshuttle.emergency.request()
|
||||
|
||||
feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
log_admin("[key_name(usr)] admin-called the emergency shuttle.")
|
||||
@@ -825,20 +825,20 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
return
|
||||
if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") return
|
||||
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_DOCKED)
|
||||
if(SSshuttle.emergency.mode >= SHUTTLE_DOCKED)
|
||||
return
|
||||
|
||||
if(shuttle_master.emergency.canRecall == FALSE)
|
||||
if(SSshuttle.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()
|
||||
SSshuttle.emergency.canRecall = TRUE // must be true for cancel proc to work
|
||||
SSshuttle.emergency.cancel()
|
||||
if(keepStatus)
|
||||
shuttle_master.emergency.canRecall = FALSE // restores original status
|
||||
SSshuttle.emergency.canRecall = FALSE // restores original status
|
||||
else
|
||||
shuttle_master.emergency.cancel()
|
||||
SSshuttle.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.")
|
||||
@@ -855,11 +855,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(shuttle_master)
|
||||
shuttle_master.emergencyNoEscape = !shuttle_master.emergencyNoEscape
|
||||
if(SSshuttle)
|
||||
SSshuttle.emergencyNoEscape = !SSshuttle.emergencyNoEscape
|
||||
|
||||
log_admin("[key_name(src)] has [shuttle_master.emergencyNoEscape ? "denied" : "allowed"] the shuttle to be called.")
|
||||
message_admins("[key_name_admin(usr)] has [shuttle_master.emergencyNoEscape ? "denied" : "allowed"] the shuttle to be called.")
|
||||
log_admin("[key_name(src)] has [SSshuttle.emergencyNoEscape ? "denied" : "allowed"] the shuttle to be called.")
|
||||
message_admins("[key_name_admin(usr)] has [SSshuttle.emergencyNoEscape ? "denied" : "allowed"] the shuttle to be called.")
|
||||
|
||||
/client/proc/cmd_admin_attack_log(mob/M as mob in mob_list)
|
||||
set category = "Admin"
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
window_name = "Claw Game"
|
||||
var/machine_image = "_1"
|
||||
var/bonus_prize_chance = 5 //chance to dispense a SECOND prize if you win, increased by matter bin rating
|
||||
|
||||
//This is to make sure the images are available
|
||||
var/list/img_resources = list('icons/obj/arcade_images/backgroundsprite.png',
|
||||
'icons/obj/arcade_images/clawpieces.png',
|
||||
@@ -49,26 +48,25 @@
|
||||
icon_state = "clawmachine[machine_image]_off"
|
||||
else
|
||||
icon_state = "clawmachine[machine_image]_on"
|
||||
return
|
||||
|
||||
/obj/machinery/arcade/claw/win()
|
||||
icon_state = "clawmachine[machine_image]_win"
|
||||
visible_message("<span class='game say'><span class='name'>[src.name]</span> beeps, \"WINNER!\"</span>")
|
||||
if(prob(bonus_prize_chance))
|
||||
//double prize mania!
|
||||
if(prob(bonus_prize_chance)) //double prize mania!
|
||||
atom_say("DOUBLE PRIZE!")
|
||||
new /obj/item/toy/prizeball(get_turf(src))
|
||||
else
|
||||
atom_say("WINNER!")
|
||||
new /obj/item/toy/prizeball(get_turf(src))
|
||||
playsound(src.loc, 'sound/arcade/Win.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
spawn(10)
|
||||
update_icon()
|
||||
addtimer(CALLBACK(src, .update_icon), 10)
|
||||
|
||||
/obj/machinery/arcade/claw/start_play(mob/user as mob)
|
||||
..()
|
||||
user << browse_rsc('page.css')
|
||||
for(var/i=1, i<=img_resources.len, i++)
|
||||
for(var/i in 1 to img_resources.len)
|
||||
user << browse_rsc(img_resources[i])
|
||||
var/my_game_html = replacetext(claw_game_html, "/* ref src */", UID())
|
||||
user << browse(my_game_html, "window=[window_name];size=700x600")
|
||||
user << browse(my_game_html, "window=[window_name];size=915x600;can_resize=0")
|
||||
|
||||
/obj/machinery/arcade/claw/Topic(href, list/href_list)
|
||||
if(..())
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<title>Crane game</title>
|
||||
<title>Claw Game</title>
|
||||
<link rel="stylesheet" type="text/css" href="page.css" />
|
||||
<script src="libraries.min.js"></script>
|
||||
<!-- Prize.js --><script>
|
||||
@@ -22,7 +22,6 @@
|
||||
$(pic).append(ball);
|
||||
$('#game').append(pic);
|
||||
|
||||
//console.log(crane);
|
||||
this.GetState = function() {return state};
|
||||
|
||||
var CheckBoundaries = function () {
|
||||
@@ -38,12 +37,11 @@
|
||||
top = 347;
|
||||
state = 'resting';
|
||||
} else if(top > 500 && state =='won') {
|
||||
top=500;
|
||||
top = 500;
|
||||
}
|
||||
};
|
||||
|
||||
var CheckGrabbed = function() {
|
||||
|
||||
var tmp = Math.floor(Math.random()*100);
|
||||
if(tmp>error) {
|
||||
setTimeout(function(){
|
||||
@@ -51,8 +49,9 @@
|
||||
$('#debug-streak').html(0); //reset streak
|
||||
setTimeout(gameShutDown,500); //end game because you dropped it
|
||||
},4*error+300);
|
||||
}
|
||||
|
||||
}else{
|
||||
prizeWon = true; // Incase you are interupted, you still get a prize.
|
||||
}
|
||||
state = 'is grabbed';
|
||||
};
|
||||
|
||||
@@ -63,7 +62,7 @@
|
||||
top = 347;
|
||||
|
||||
left = crane.GetLeft()+23;
|
||||
if(left <= 60) {
|
||||
if(left <= 60) { // Claw has reached the drop-off with payload.
|
||||
left = 60;
|
||||
state = 'won';
|
||||
}
|
||||
@@ -95,10 +94,8 @@
|
||||
top += vspd;
|
||||
|
||||
if(state=='won' && top > 460) {
|
||||
$('#prize'+id).remove();//css({visibility:'hidden'});
|
||||
$('#prize'+id).remove();
|
||||
state='hidden';
|
||||
|
||||
prizeWon = true;
|
||||
gameShutDown();
|
||||
}
|
||||
|
||||
@@ -107,16 +104,14 @@
|
||||
|
||||
this.Repaint = function () {
|
||||
$('#prize'+id).css({'top':top, 'left':left});
|
||||
//$('#'+id+' #crane-handle-top').css({height: handleHeight});
|
||||
};
|
||||
|
||||
}</script>
|
||||
<!-- Crane.js --><script>
|
||||
function Crane(id) {
|
||||
//console.log("crane created");
|
||||
var top = 131; //private
|
||||
var left = 100;
|
||||
var hspd = 6;
|
||||
var hspd = 5;
|
||||
var vspd = 4;
|
||||
var state = false;
|
||||
var handleHeight = 83;
|
||||
@@ -131,34 +126,39 @@
|
||||
this.GetTop = function() {return top};
|
||||
|
||||
var Grab = function () {
|
||||
top += (state == 'down')?vspd:-vspd;
|
||||
handleHeight += (state == 'down')?vspd:-vspd;
|
||||
|
||||
if(top > 300 && state == 'down') { //when going down
|
||||
top = 300;
|
||||
//handleHeight = ;
|
||||
state = 'up';
|
||||
$('#'+id+' #crane-claw').css(frames['half']);
|
||||
} else if(top < 131 && state == 'up') { //when going up
|
||||
top = 131;
|
||||
handleHeight = 83;
|
||||
state = 'drop';
|
||||
|
||||
} else if(state == 'drop') { //when up and dropping
|
||||
left -= hspd;
|
||||
top = 131;
|
||||
handleHeight = 83;
|
||||
if(left < 30) {
|
||||
left = 30;
|
||||
$('#'+id+' #crane-claw').css(frames['open']);
|
||||
setTimeout(function(){$('#'+id+' #crane-claw').css(frames['normal']);state = false;},500);
|
||||
|
||||
}
|
||||
switch (state) {
|
||||
case 'up':
|
||||
top -= vspd;
|
||||
handleHeight -= vspd;
|
||||
if(top < 131) { // when going up
|
||||
top = 131;
|
||||
handleHeight = 83;
|
||||
state = 'drop';
|
||||
}
|
||||
break;
|
||||
case 'down': // when going down
|
||||
top += vspd;
|
||||
handleHeight += vspd;
|
||||
if(top > 300) {
|
||||
top = 300;
|
||||
state = 'up';
|
||||
$('#'+id+' #crane-claw').css(frames['half']);
|
||||
}
|
||||
break;
|
||||
case 'drop': // when up and dropping
|
||||
left -= hspd;
|
||||
top = 131;
|
||||
handleHeight = 83;
|
||||
if(left < 30) {
|
||||
left = 30;
|
||||
$('#'+id+' #crane-claw').css(frames['open']);
|
||||
setTimeout(function(){$('#'+id+' #crane-claw').css(frames['normal']);state = false;},500);
|
||||
}
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
var CheckBoundaries = function () {
|
||||
|
||||
if(left < 30)
|
||||
left = 30;
|
||||
else if(left > 788)
|
||||
@@ -166,20 +166,18 @@
|
||||
};
|
||||
|
||||
this.Update = function () {
|
||||
//console.log(left);
|
||||
if(keys["left"] && !state) //left
|
||||
left -= hspd;
|
||||
|
||||
if(keys["right"] && !state) //right
|
||||
left += hspd;
|
||||
|
||||
if(keys["down"] && !state) { //drop
|
||||
state = 'down';
|
||||
|
||||
$('#'+id+' #crane-claw').css(frames['open']);
|
||||
}
|
||||
|
||||
if(state) {
|
||||
if(!state){
|
||||
if(keys["left"]) //Move claw left
|
||||
left -= hspd;
|
||||
|
||||
if(keys["right"]) // Move claw right
|
||||
left += hspd;
|
||||
|
||||
if(keys["down"]){ // Drop claw.
|
||||
state = 'down';
|
||||
$('#'+id+' #crane-claw').css(frames['open']);
|
||||
}
|
||||
}else{
|
||||
Grab();
|
||||
}
|
||||
|
||||
@@ -204,57 +202,49 @@
|
||||
window.oRequestAnimationFrame ||
|
||||
window.msRequestAnimationFrame ||
|
||||
function(callback){
|
||||
window.setTimeout(callback, 1000 / 30);
|
||||
window.setTimeout(callback, 33.333); //1000 / 30
|
||||
};
|
||||
})();
|
||||
|
||||
function animate(){
|
||||
//console.log("animate called");
|
||||
crane.Update();
|
||||
|
||||
for(var i = 0; i< prizes.length; i++)
|
||||
for(var i=0; i<prizes.length; i++){
|
||||
prizes[i].Update();
|
||||
|
||||
for(var i = 0; i< prizes.length; i++)
|
||||
prizes[i].Repaint();
|
||||
}
|
||||
|
||||
crane.Repaint();
|
||||
|
||||
requestAnimFrame(function(){
|
||||
animate();
|
||||
});
|
||||
}
|
||||
|
||||
function joystickControlOn(direction){
|
||||
//console.log(direction);
|
||||
keys[direction] = true;
|
||||
}
|
||||
|
||||
function joystickControlOff(direction){
|
||||
//console.log(direction);
|
||||
keys[direction] = false;
|
||||
}
|
||||
|
||||
function gameStartUp(){ //main function
|
||||
//console.log("game start!");
|
||||
document.getElementById("play_btn").disabled = true; //to prevent button-mashing the start button.
|
||||
for(var i = 0; i< 5; i++)
|
||||
for(var i=0; i<5; i++){ // Creates prize balls.
|
||||
prizes[i] = new Prize(i,{top: Math.ceil(Math.random()*100),left: 400+i*100-Math.ceil(Math.random()*50)},crane);
|
||||
//console.log("prize made");
|
||||
|
||||
//crane.Repaint();
|
||||
}
|
||||
animate();
|
||||
}
|
||||
|
||||
function gameShutDown(){
|
||||
document.getElementById("play_btn").disabled = true;
|
||||
var close_game_link = '<h2>TRY AGAIN!</h2><br><a href="byond://?src=/* ref src */;prizeWon=0">\[Close Game\]</a>'
|
||||
if(prizeWon)
|
||||
close_game_link = '<h2>YOU WON!</h2><br><a href="byond://?src=/* ref src */;prizeWon=1">\[Close Game\]</a>'
|
||||
document.getElementById('game').innerHTML = '<center><h1> GAME OVER!</h1><br>'+close_game_link+'</center>'
|
||||
function checkPrize(){
|
||||
// Tells the machine if it should drop a prize.
|
||||
prizeWon?document.getElementById("close_nao").href = "byond://?src=/* ref src */;prizeWon=1":document.getElementById("close_nao").href = "byond://?src=/* ref src */;prizeWon=0";
|
||||
}
|
||||
|
||||
function gameShutDown(){
|
||||
checkPrize();
|
||||
if(prizeWon){ emergencyShutDown(); }else{
|
||||
document.getElementById('game').innerHTML = '<br><br><br><div class="end-text"><center><h1> GAME OVER!</h1><br><h2>BETTER LUCK NEXT TIME!</h2></center></div>';
|
||||
}
|
||||
}
|
||||
// Runs if close window or press close button.
|
||||
function emergencyShutDown(){
|
||||
checkPrize();
|
||||
document.getElementById("close_nao").click();
|
||||
}
|
||||
</script>
|
||||
@@ -278,11 +268,14 @@
|
||||
|
||||
</div>
|
||||
|
||||
<div id='controls' style='position: absolute; top: 550px'>
|
||||
<br><button id="play_btn" onclick="gameStartUp()">Play Now!</button> <button id="close_btn" onclick="gameShutDown()">Close Game.</button><a id="close_nao" hidden="true" href="byond://?src=/* ref src */;prizeWon=0"></a>
|
||||
<div id='controls' style='position: absolute; top: 515px; left: 385px;'>
|
||||
<br>
|
||||
<button class="button" id="play_btn" onclick="gameStartUp()">Play Now!</button>
|
||||
<button class="button" id="close_btn" onclick="emergencyShutDown()">Close.</button>
|
||||
<a id="close_nao" hidden="true" href="byond://?src=/* ref src */;prizeWon=0"></a>
|
||||
<br>
|
||||
<button onmouseover="joystickControlOn('left')" onmouseout="joystickControlOff('left')">/==<br>\==</button>
|
||||
<button onmousedown="joystickControlOn('down')" onmouseup="joystickControlOff('down')">DROP<br>CLAW</button>
|
||||
<button class="button" onmousedown="joystickControlOn('down')" onmouseup="joystickControlOff('down')">DROP<br>CLAW</button>
|
||||
<button onmouseover="joystickControlOn('right')" onmouseout="joystickControlOff('right')">==\<br>==/</button>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
@@ -44,13 +44,13 @@
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/Destroy()
|
||||
eject_card(1)
|
||||
if(mob_hunt_server)
|
||||
if(mob_hunt_server.battle_turn)
|
||||
mob_hunt_server.battle_turn = null
|
||||
if(mob_hunt_server.red_terminal == src)
|
||||
mob_hunt_server.red_terminal = null
|
||||
if(mob_hunt_server.blue_terminal == src)
|
||||
mob_hunt_server.blue_terminal = null
|
||||
if(SSmob_hunt)
|
||||
if(SSmob_hunt.battle_turn)
|
||||
SSmob_hunt.battle_turn = null
|
||||
if(SSmob_hunt.red_terminal == src)
|
||||
SSmob_hunt.red_terminal = null
|
||||
if(SSmob_hunt.blue_terminal == src)
|
||||
SSmob_hunt.blue_terminal = null
|
||||
QDEL_NULL(avatar)
|
||||
return ..()
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/eject_card(override = 0)
|
||||
if(!override)
|
||||
if(ready && mob_hunt_server.battle_turn != team)
|
||||
if(ready && SSmob_hunt.battle_turn != team)
|
||||
audible_message("You can't recall on your rival's turn!", null, 2)
|
||||
return
|
||||
card.mob_data = mob_info
|
||||
@@ -126,7 +126,7 @@
|
||||
dat += "<h1>No Nano-Mob card loaded.</h1>"
|
||||
dat += "</td>"
|
||||
dat += "</tr>"
|
||||
if(ready && mob_hunt_server.battle_turn) //offer the surrender option if they are in a battle (ready), but don't have a card loaded
|
||||
if(ready && SSmob_hunt.battle_turn) //offer the surrender option if they are in a battle (ready), but don't have a card loaded
|
||||
dat += "<tr>"
|
||||
dat += "<td><a href='?src=[UID()];surrender=1'>Surrender!</a></td>"
|
||||
dat += "</tr>"
|
||||
@@ -170,7 +170,7 @@
|
||||
dat += "<tr>"
|
||||
dat += "<td><a href='?src=[UID()];ready=1'>Battle!</a></td>"
|
||||
dat += "</tr>"
|
||||
if(ready && !mob_hunt_server.battle_turn)
|
||||
if(ready && !SSmob_hunt.battle_turn)
|
||||
dat += "<tr>"
|
||||
dat += "<td><a href='?src=[UID()];ready=2'>Cancel Battle!</a></td>"
|
||||
dat += "</tr>"
|
||||
@@ -205,23 +205,23 @@
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/check_connection()
|
||||
if(team == "Red")
|
||||
if(mob_hunt_server && !mob_hunt_server.red_terminal)
|
||||
mob_hunt_server.red_terminal = src
|
||||
if(SSmob_hunt && !SSmob_hunt.red_terminal)
|
||||
SSmob_hunt.red_terminal = src
|
||||
else if(team == "Blue")
|
||||
if(mob_hunt_server && !mob_hunt_server.blue_terminal)
|
||||
mob_hunt_server.blue_terminal = src
|
||||
if(SSmob_hunt && !SSmob_hunt.blue_terminal)
|
||||
SSmob_hunt.blue_terminal = src
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/do_attack()
|
||||
if(!ready) //no attacking if you arent ready to fight (duh)
|
||||
return
|
||||
if(!mob_hunt_server || team != mob_hunt_server.battle_turn) //don't attack unless it is actually our turn
|
||||
if(!SSmob_hunt || team != SSmob_hunt.battle_turn) //don't attack unless it is actually our turn
|
||||
return
|
||||
else
|
||||
var/message = "[mob_info.mob_name] attacks!"
|
||||
if(mob_info.nickname)
|
||||
message = "[mob_info.nickname] attacks!"
|
||||
audible_message(message, null, 5)
|
||||
mob_hunt_server.launch_attack(team, mob_info.get_raw_damage(), mob_info.get_attack_type())
|
||||
SSmob_hunt.launch_attack(team, mob_info.get_raw_damage(), mob_info.get_attack_type())
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/start_battle()
|
||||
if(ready) //don't do anything if we are still ready
|
||||
@@ -230,20 +230,20 @@
|
||||
return
|
||||
ready = 1
|
||||
audible_message("[team] Player is ready for battle! Waiting for rival...", null, 5)
|
||||
mob_hunt_server.start_check()
|
||||
SSmob_hunt.start_check()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/receive_attack(raw_damage, datum/mob_type/attack_type)
|
||||
var/message = mob_info.take_damage(raw_damage, attack_type)
|
||||
avatar.audible_message(message, null, 5)
|
||||
if(!mob_info.cur_health)
|
||||
mob_hunt_server.end_battle(team)
|
||||
SSmob_hunt.end_battle(team)
|
||||
eject_card(1) //force the card out, they were defeated
|
||||
else
|
||||
mob_hunt_server.end_turn()
|
||||
SSmob_hunt.end_turn()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/surrender()
|
||||
audible_message("[team] Player surrenders the battle!", null, 5)
|
||||
mob_hunt_server.end_battle(team, 1)
|
||||
SSmob_hunt.end_battle(team, 1)
|
||||
|
||||
//////////////////////////////
|
||||
// Mob Healing Terminal //
|
||||
|
||||
@@ -94,33 +94,33 @@
|
||||
P.audible_message(message, null, 4)
|
||||
|
||||
/obj/effect/nanomob/proc/despawn()
|
||||
if(mob_hunt_server)
|
||||
if(SSmob_hunt)
|
||||
if(mob_info.is_trap)
|
||||
mob_hunt_server.trap_spawns -= src
|
||||
SSmob_hunt.trap_spawns -= src
|
||||
else
|
||||
mob_hunt_server.normal_spawns -= src
|
||||
SSmob_hunt.normal_spawns -= src
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/nanomob/proc/reveal()
|
||||
if(!mob_hunt_server)
|
||||
if(!SSmob_hunt)
|
||||
return
|
||||
var/list/show_to = list()
|
||||
for(var/A in mob_hunt_server.connected_clients)
|
||||
if((A in clients_encountered) || !mob_hunt_server.connected_clients[A])
|
||||
for(var/A in SSmob_hunt.connected_clients)
|
||||
if((A in clients_encountered) || !SSmob_hunt.connected_clients[A])
|
||||
continue
|
||||
show_to |= mob_hunt_server.connected_clients[A]
|
||||
show_to |= SSmob_hunt.connected_clients[A]
|
||||
display_alt_appearance("nanomob_avatar", show_to)
|
||||
|
||||
/obj/effect/nanomob/proc/conceal(list/hide_from)
|
||||
if(!mob_hunt_server)
|
||||
if(!SSmob_hunt)
|
||||
return
|
||||
var/list/hiding_from = list()
|
||||
if(hide_from)
|
||||
hiding_from = hide_from
|
||||
else
|
||||
for(var/A in mob_hunt_server.connected_clients)
|
||||
if((A in clients_encountered) && mob_hunt_server.connected_clients[A])
|
||||
hiding_from |= mob_hunt_server.connected_clients[A]
|
||||
for(var/A in SSmob_hunt.connected_clients)
|
||||
if((A in clients_encountered) && SSmob_hunt.connected_clients[A])
|
||||
hiding_from |= SSmob_hunt.connected_clients[A]
|
||||
hide_alt_appearance("nanomob_avatar", hiding_from)
|
||||
|
||||
// BATTLE MOB AVATARS
|
||||
|
||||
@@ -72,12 +72,12 @@
|
||||
secondary_type = new secondary_type()
|
||||
if(no_register) //for booster pack cards
|
||||
return
|
||||
if(mob_hunt_server)
|
||||
if(SSmob_hunt)
|
||||
if(set_trap)
|
||||
if(mob_hunt_server.register_trap(src))
|
||||
if(SSmob_hunt.register_trap(src))
|
||||
return
|
||||
else if(select_spawn())
|
||||
if(mob_hunt_server.register_spawn(src))
|
||||
if(SSmob_hunt.register_spawn(src))
|
||||
return
|
||||
qdel(src) //if you reach this, the datum is just pure clutter, so delete it
|
||||
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
body {
|
||||
/* Disables scroll bars */
|
||||
overflow:hidden;
|
||||
}
|
||||
#background {
|
||||
width:900px;
|
||||
height:406px;
|
||||
@@ -81,4 +85,8 @@
|
||||
//-webkit-border-radius: 30px;
|
||||
//border-radius: 30px;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.button {
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -306,5 +306,5 @@ var/global/datum/prizes/global_prizes = new
|
||||
/datum/prize_item/bike
|
||||
name = "Awesome Bike!"
|
||||
desc = "WOAH."
|
||||
typepath = /obj/structure/stool/bed/chair/wheelchair/bike
|
||||
typepath = /obj/structure/chair/wheelchair/bike
|
||||
cost = 10000 //max stack + 1 tickets.
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
return
|
||||
|
||||
/obj/item/assembly/shock_kit/receive_signal()
|
||||
if(istype(loc, /obj/structure/stool/bed/chair/e_chair))
|
||||
var/obj/structure/stool/bed/chair/e_chair/C = loc
|
||||
if(istype(loc, /obj/structure/chair/e_chair))
|
||||
var/obj/structure/chair/e_chair/C = loc
|
||||
C.shock()
|
||||
return
|
||||
|
||||
+497
-250
@@ -4,295 +4,542 @@
|
||||
|
||||
//To do: Allow corpses to appear mangled, bloody, etc. Allow customizing the bodies appearance (they're all bald and white right now).
|
||||
|
||||
/obj/effect/landmark/corpse
|
||||
/obj/effect/mob_spawn
|
||||
name = "Unknown"
|
||||
var/mobname = "Unknown" //Unused now but it'd fuck up maps to remove it now
|
||||
var/mob_species = null //Set to make a mob of another race, currently used only in ruins
|
||||
var/corpseuniform = null //Set this to an object path to have the slot filled with said object on the corpse.
|
||||
var/corpsesuit = null
|
||||
var/corpseshoes = null
|
||||
var/corpsegloves = null
|
||||
var/corpseradio = null
|
||||
var/corpseglasses = null
|
||||
var/corpsemask = null
|
||||
var/corpsehelmet = null
|
||||
var/corpsebelt = null
|
||||
var/corpsepocket1 = null
|
||||
var/corpsepocket2 = null
|
||||
var/corpseback = null
|
||||
var/corpseid = 0 //Just set to 1 if you want them to have an ID
|
||||
var/corpseidjob = null // Needs to be in quotes, such as "Clown" or "Chef." This just determines what the ID reads as, not their access
|
||||
var/corpseidaccess = null //This is for access. See access.dm for which jobs give what access. Again, put in quotes. Use "Captain" if you want it to be all access.
|
||||
var/corpseidicon = null //For setting it to be a gold, silver, centcomm etc ID
|
||||
var/timeofdeath = null
|
||||
var/coffin = 0
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
var/mob_type = null
|
||||
var/mob_name = ""
|
||||
var/mob_gender = null
|
||||
var/death = TRUE //Kill the mob
|
||||
var/roundstart = TRUE //fires on initialize
|
||||
var/instant = FALSE //fires on New
|
||||
var/flavour_text = "The mapper forgot to set this!"
|
||||
var/faction = null
|
||||
var/permanent = FALSE //If true, the spawner will not disappear upon running out of uses.
|
||||
var/random = FALSE //Don't set a name or gender, just go random
|
||||
var/objectives = null
|
||||
var/uses = 1 //how many times can we spawn from it. set to -1 for infinite.
|
||||
var/brute_damage = 0
|
||||
var/oxy_damage = 0
|
||||
var/burn_damage = 0
|
||||
var/datum/disease/disease = null //Do they start with a pre-spawned disease?
|
||||
var/mob_color //Change the mob's color
|
||||
var/assignedrole
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/banType = "lavaland"
|
||||
|
||||
/obj/effect/landmark/corpse/Initialize()
|
||||
..()
|
||||
if(istype(src,/obj/effect/landmark/corpse/clown))
|
||||
var/obj/effect/landmark/corpse/clown/C = src
|
||||
C.chooseRank()
|
||||
createCorpse()
|
||||
|
||||
/obj/effect/landmark/corpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
|
||||
var/mob/living/carbon/human/M = new /mob/living/carbon/human(src.loc)
|
||||
M.real_name = src.name
|
||||
M.death(1) //Kills the new mob
|
||||
/obj/effect/mob_spawn/attack_ghost(mob/user)
|
||||
if(ticker.current_state != GAME_STATE_PLAYING || !loc)
|
||||
return
|
||||
if(!uses)
|
||||
to_chat(user, "<span class='warning'>This spawner is out of charges!</span>")
|
||||
return
|
||||
if(jobban_isbanned(user, banType))
|
||||
to_chat(user, "<span class='warning'>You are jobanned!</span>")
|
||||
return
|
||||
var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No")
|
||||
if(ghost_role == "No" || !loc)
|
||||
return
|
||||
log_game("[user.ckey] became [mob_name]")
|
||||
create(ckey = user.ckey)
|
||||
|
||||
/obj/effect/mob_spawn/Initialize(mapload)
|
||||
. = ..()
|
||||
if(instant || (roundstart && (ticker && ticker.current_state > GAME_STATE_SETTING_UP)))
|
||||
create()
|
||||
else
|
||||
poi_list |= src
|
||||
LAZYADD(GLOB.mob_spawners[name], src)
|
||||
|
||||
/obj/effect/mob_spawn/Destroy()
|
||||
poi_list -= src
|
||||
var/list/spawners = GLOB.mob_spawners[name]
|
||||
LAZYREMOVE(spawners, src)
|
||||
if(!LAZYLEN(spawners))
|
||||
GLOB.mob_spawners -= name
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/proc/special(mob/M)
|
||||
return
|
||||
|
||||
/obj/effect/mob_spawn/proc/equip(mob/M)
|
||||
return
|
||||
|
||||
/obj/effect/mob_spawn/proc/create(ckey, flavour = TRUE, name)
|
||||
var/mob/living/M = new mob_type(get_turf(src)) //living mobs only
|
||||
if(!random)
|
||||
M.real_name = mob_name ? mob_name : M.name
|
||||
if(!mob_gender)
|
||||
mob_gender = pick(MALE, FEMALE)
|
||||
M.gender = mob_gender
|
||||
if(faction)
|
||||
M.faction = list(faction)
|
||||
if(disease)
|
||||
M.ForceContractDisease(new disease)
|
||||
if(death)
|
||||
M.death(1) //Kills the new mob
|
||||
|
||||
M.adjustOxyLoss(oxy_damage)
|
||||
M.adjustBruteLoss(brute_damage)
|
||||
M.timeofdeath = timeofdeath
|
||||
if(mob_species)
|
||||
M.set_species(mob_species)
|
||||
if(corpseuniform)
|
||||
M.equip_to_slot_or_del(new corpseuniform(M), slot_w_uniform)
|
||||
if(corpsesuit)
|
||||
M.equip_to_slot_or_del(new corpsesuit(M), slot_wear_suit)
|
||||
if(corpseshoes)
|
||||
M.equip_to_slot_or_del(new corpseshoes(M), slot_shoes)
|
||||
if(corpsegloves)
|
||||
M.equip_to_slot_or_del(new corpsegloves(M), slot_gloves)
|
||||
if(corpseradio)
|
||||
M.equip_to_slot_or_del(new corpseradio(M), slot_l_ear)
|
||||
if(corpseglasses)
|
||||
M.equip_to_slot_or_del(new corpseglasses(M), slot_glasses)
|
||||
if(corpsemask)
|
||||
M.equip_to_slot_or_del(new corpsemask(M), slot_wear_mask)
|
||||
if(corpsehelmet)
|
||||
M.equip_to_slot_or_del(new corpsehelmet(M), slot_head)
|
||||
if(corpsebelt)
|
||||
M.equip_to_slot_or_del(new corpsebelt(M), slot_belt)
|
||||
if(corpsepocket1)
|
||||
M.equip_to_slot_or_del(new corpsepocket1(M), slot_r_store)
|
||||
if(corpsepocket2)
|
||||
M.equip_to_slot_or_del(new corpsepocket2(M), slot_l_store)
|
||||
if(corpseback)
|
||||
M.equip_to_slot_or_del(new corpseback(M), slot_back)
|
||||
if(corpseid == 1)
|
||||
var/obj/item/card/id/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card"
|
||||
var/datum/job/jobdatum
|
||||
for(var/jobtype in typesof(/datum/job))
|
||||
var/datum/job/J = new jobtype
|
||||
if(J.title == corpseidaccess)
|
||||
jobdatum = J
|
||||
break
|
||||
if(corpseidicon)
|
||||
W.icon_state = corpseidicon
|
||||
if(corpseidaccess)
|
||||
if(jobdatum)
|
||||
W.access = jobdatum.get_access()
|
||||
else
|
||||
W.access = list()
|
||||
if(corpseidjob)
|
||||
W.assignment = corpseidjob
|
||||
W.registered_name = M.real_name
|
||||
M.equip_to_slot_or_del(W, slot_wear_id)
|
||||
if(coffin == 1)
|
||||
var/obj/structure/closet/coffin/sarcophagus/sarc = locate(/obj/structure/closet/coffin/sarcophagus) in loc
|
||||
if(sarc) M.loc = sarc
|
||||
qdel(src)
|
||||
M.adjustFireLoss(burn_damage)
|
||||
M.color = mob_color
|
||||
equip(M, TRUE)
|
||||
|
||||
// I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example.
|
||||
/obj/effect/landmark/corpse/damaged
|
||||
if(ckey)
|
||||
M.ckey = ckey
|
||||
if(flavour)
|
||||
to_chat(M, "[flavour_text]")
|
||||
var/datum/mind/MM = M.mind
|
||||
if(objectives)
|
||||
for(var/objective in objectives)
|
||||
MM.objectives += new/datum/objective(objective)
|
||||
if(assignedrole)
|
||||
M.mind.assigned_role = assignedrole
|
||||
special(M, name)
|
||||
MM.name = M.real_name
|
||||
if(uses > 0)
|
||||
uses--
|
||||
if(!permanent && !uses)
|
||||
qdel(src)
|
||||
|
||||
// Base version - place these on maps/templates.
|
||||
/obj/effect/mob_spawn/human
|
||||
mob_type = /mob/living/carbon/human
|
||||
//Human specific stuff.
|
||||
var/mob_species = null //Set species
|
||||
var/datum/outfit/outfit = /datum/outfit //If this is a path, it will be instanced in Initialize()
|
||||
var/disable_pda = TRUE
|
||||
var/disable_sensors = TRUE
|
||||
//All of these only affect the ID that the outfit has placed in the ID slot
|
||||
var/id_job = null //Such as "Clown" or "Chef." This just determines what the ID reads as, not their access
|
||||
var/id_access = null //This is for access. See access.dm for which jobs give what access. Use "Captain" if you want it to be all access.
|
||||
var/id_access_list = null //Allows you to manually add access to an ID card.
|
||||
assignedrole = "Ghost Role"
|
||||
|
||||
var/husk = null
|
||||
//these vars are for lazy mappers to override parts of the outfit
|
||||
//these cannot be null by default, or mappers cannot set them to null if they want nothing in that slot
|
||||
var/uniform = -1
|
||||
var/r_hand = -1
|
||||
var/l_hand = -1
|
||||
var/suit = -1
|
||||
var/shoes = -1
|
||||
var/gloves = -1
|
||||
var/ears = -1
|
||||
var/glasses = -1
|
||||
var/mask = -1
|
||||
var/head = -1
|
||||
var/belt = -1
|
||||
var/r_pocket = -1
|
||||
var/l_pocket = -1
|
||||
var/back = -1
|
||||
var/id = -1
|
||||
var/neck = -1
|
||||
var/pda = -1
|
||||
var/backpack_contents = -1
|
||||
var/suit_store = -1
|
||||
|
||||
var/hair_style
|
||||
var/facial_hair_style
|
||||
var/skin_tone
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/Initialize()
|
||||
if(ispath(outfit))
|
||||
outfit = new outfit()
|
||||
if(!outfit)
|
||||
outfit = new /datum/outfit
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/equip(mob/living/carbon/human/H)
|
||||
if(mob_species)
|
||||
if(H.set_species(mob_species))
|
||||
H.regenerate_icons()
|
||||
if(husk)
|
||||
H.ChangeToHusk()
|
||||
else //Because for some reason I can't track down, things are getting turned into husks even if husk = false. It's in some damage proc somewhere.
|
||||
H.mutations.Remove(HUSK)
|
||||
H.underwear = "Nude"
|
||||
H.undershirt = "Nude"
|
||||
H.socks = "Nude"
|
||||
var/obj/item/organ/external/head/D = H.get_organ("head")
|
||||
if(istype(D))
|
||||
if(hair_style)
|
||||
D.h_style = hair_style
|
||||
else
|
||||
D.h_style = random_hair_style(gender)
|
||||
D.hair_colour = rand_hex_color()
|
||||
if(facial_hair_style)
|
||||
D.f_style = facial_hair_style
|
||||
else
|
||||
D.f_style = random_facial_hair_style(gender)
|
||||
D.facial_colour = rand_hex_color()
|
||||
if(skin_tone)
|
||||
H.s_tone = skin_tone
|
||||
else
|
||||
H.s_tone = random_skin_tone()
|
||||
H.update_hair()
|
||||
H.update_body()
|
||||
if(outfit)
|
||||
var/static/list/slots = list("uniform", "r_hand", "l_hand", "suit", "shoes", "gloves", "ears", "glasses", "mask", "head", "belt", "r_pocket", "l_pocket", "back", "id", "neck", "backpack_contents", "suit_store")
|
||||
for(var/slot in slots)
|
||||
var/T = vars[slot]
|
||||
if(!isnum(T))
|
||||
outfit.vars[slot] = T
|
||||
H.equipOutfit(outfit, TRUE)
|
||||
var/list/del_types = list(/obj/item/pda, /obj/item/radio/headset)
|
||||
for(var/del_type in del_types)
|
||||
var/obj/item/I = locate(del_type) in H
|
||||
qdel(I)
|
||||
|
||||
if(disable_pda)
|
||||
// We don't want corpse PDAs to show up in the messenger list.
|
||||
var/obj/item/pda/PDA = locate(/obj/item/pda) in H
|
||||
if(PDA)
|
||||
var/datum/data/pda/app/messenger/M = PDA.find_program(/datum/data/pda/app/messenger)
|
||||
M.toff = 1
|
||||
if(disable_sensors)
|
||||
// Using crew monitors to find corpses while creative makes finding certain ruins too easy.
|
||||
var/obj/item/clothing/under/C = H.w_uniform
|
||||
if(istype(C))
|
||||
C.sensor_mode = SUIT_SENSOR_OFF
|
||||
|
||||
var/obj/item/card/id/W = H.wear_id
|
||||
if(W)
|
||||
if(id_access)
|
||||
for(var/jobtype in typesof(/datum/job))
|
||||
var/datum/job/J = new jobtype
|
||||
if(J.title == id_access)
|
||||
W.access = J.get_access()
|
||||
break
|
||||
if(id_access_list)
|
||||
if(!islist(W.access))
|
||||
W.access = list()
|
||||
W.access |= id_access_list
|
||||
if(id_job)
|
||||
W.assignment = id_job
|
||||
W.registered_name = H.real_name
|
||||
W.update_label()
|
||||
|
||||
//Instant version - use when spawning corpses during runtime
|
||||
/obj/effect/mob_spawn/human/corpse
|
||||
roundstart = FALSE
|
||||
instant = TRUE
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/damaged
|
||||
brute_damage = 1000
|
||||
|
||||
/obj/effect/landmark/corpse/syndicatesoldier
|
||||
name = "Syndicate Operative"
|
||||
corpseuniform = /obj/item/clothing/under/syndicate
|
||||
corpsesuit = /obj/item/clothing/suit/armor/vest
|
||||
corpseshoes = /obj/item/clothing/shoes/combat
|
||||
corpsegloves = /obj/item/clothing/gloves/combat
|
||||
corpseradio = /obj/item/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/swat
|
||||
corpseback = /obj/item/storage/backpack
|
||||
corpseid = 1
|
||||
corpseidjob = "Operative"
|
||||
corpseidaccess = "Syndicate"
|
||||
|
||||
/obj/effect/mob_spawn/human/alive
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
death = FALSE
|
||||
roundstart = FALSE //you could use these for alive fake humans on roundstart but this is more common scenario
|
||||
|
||||
|
||||
//Non-human spawners
|
||||
|
||||
/obj/effect/landmark/corpse/syndicatecommando
|
||||
name = "Syndicate Commando"
|
||||
corpseuniform = /obj/item/clothing/under/syndicate
|
||||
corpsesuit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
corpseshoes = /obj/item/clothing/shoes/magboots/syndie
|
||||
corpsegloves = /obj/item/clothing/gloves/combat
|
||||
corpseradio = /obj/item/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/syndicate
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/syndi
|
||||
corpseback = /obj/item/tank/jetpack/oxygen
|
||||
corpsepocket1 = /obj/item/tank/emergency_oxygen
|
||||
corpseid = 1
|
||||
corpseidjob = "Operative"
|
||||
corpseidaccess = "Syndicate"
|
||||
/obj/effect/mob_spawn/mouse
|
||||
name = "sleeper"
|
||||
mob_name = "space mouse"
|
||||
mob_type = /mob/living/simple_animal/mouse
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "Squeak!"
|
||||
|
||||
/obj/effect/mob_spawn/cow
|
||||
name = "sleeper"
|
||||
mob_name = "space cow"
|
||||
mob_type = /mob/living/simple_animal/cow
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
mob_gender = FEMALE
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "Moo!"
|
||||
|
||||
|
||||
///////////Civilians//////////////////////
|
||||
|
||||
///////////Support//////////////////////
|
||||
/obj/effect/mob_spawn/human/corpse/assistant
|
||||
name = "Assistant"
|
||||
id_job = "Assistant"
|
||||
outfit = /datum/outfit/job/assistant
|
||||
|
||||
/obj/effect/landmark/corpse/chef
|
||||
name = "Chef"
|
||||
corpseuniform = /obj/item/clothing/under/rank/chef
|
||||
corpsesuit = /obj/item/clothing/suit/chef/classic
|
||||
corpseshoes = /obj/item/clothing/shoes/black
|
||||
corpsehelmet = /obj/item/clothing/head/chefhat
|
||||
corpseback = /obj/item/storage/backpack
|
||||
corpseradio = /obj/item/radio/headset
|
||||
corpseid = 1
|
||||
corpseidjob = "Chef"
|
||||
corpseidaccess = "Chef"
|
||||
/obj/effect/mob_spawn/human/corpse/assistant/beesease_infection
|
||||
disease = /datum/disease/beesease
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/assistant/brainrot_infection
|
||||
disease = /datum/disease/brainrot
|
||||
|
||||
/obj/effect/landmark/corpse/doctor
|
||||
/obj/effect/mob_spawn/human/corpse/assistant/spanishflu_infection
|
||||
disease = /datum/disease/fluspanish
|
||||
|
||||
/obj/effect/mob_spawn/human/cook
|
||||
name = "Cook"
|
||||
id_job = "Chef"
|
||||
outfit = /datum/outfit/job/chef
|
||||
|
||||
/obj/effect/mob_spawn/human/doctor
|
||||
name = "Doctor"
|
||||
corpseradio = /obj/item/radio/headset/headset_med
|
||||
corpseuniform = /obj/item/clothing/under/rank/medical
|
||||
corpsesuit = /obj/item/clothing/suit/storage/labcoat
|
||||
corpseback = /obj/item/storage/backpack/medic
|
||||
corpsepocket1 = /obj/item/flashlight/pen
|
||||
corpseshoes = /obj/item/clothing/shoes/black
|
||||
corpseid = 1
|
||||
corpseidjob = "Medical Doctor"
|
||||
corpseidaccess = "Medical Doctor"
|
||||
id_job = "Medical Doctor"
|
||||
outfit = /datum/outfit/job/doctor
|
||||
|
||||
/obj/effect/landmark/corpse/engineer
|
||||
/obj/effect/mob_spawn/human/doctor/alive
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
random = TRUE
|
||||
name = "sleeper"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a space doctor!"
|
||||
assignedrole = "Space Doctor"
|
||||
|
||||
/obj/effect/mob_spawn/human/doctor/alive/equip(mob/living/carbon/human/H)
|
||||
..()
|
||||
// Remove radio and PDA so they wouldn't annoy station crew.
|
||||
var/list/del_types = list(/obj/item/pda, /obj/item/radio/headset)
|
||||
for(var/del_type in del_types)
|
||||
var/obj/item/I = locate(del_type) in H
|
||||
qdel(I)
|
||||
|
||||
/obj/effect/mob_spawn/human/engineer
|
||||
name = "Engineer"
|
||||
corpseradio = /obj/item/radio/headset/headset_eng
|
||||
corpseuniform = /obj/item/clothing/under/rank/engineer
|
||||
corpseback = /obj/item/storage/backpack/industrial
|
||||
corpseshoes = /obj/item/clothing/shoes/workboots
|
||||
corpsebelt = /obj/item/storage/belt/utility/full
|
||||
corpsegloves = /obj/item/clothing/gloves/color/yellow
|
||||
corpsehelmet = /obj/item/clothing/head/hardhat
|
||||
corpseid = 1
|
||||
corpseidjob = "Station Engineer"
|
||||
corpseidaccess = "Station Engineer"
|
||||
id_job = "Engineer"
|
||||
outfit = /datum/outfit/job/engineer
|
||||
|
||||
/obj/effect/landmark/corpse/engineer/hardsuit
|
||||
corpsesuit = /obj/item/clothing/suit/space/hardsuit
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit
|
||||
/obj/effect/mob_spawn/human/engineer/hardsuit
|
||||
outfit = /datum/outfit/job/engineer/suit
|
||||
|
||||
/obj/effect/landmark/corpse/clown
|
||||
/datum/outfit/job/engineer/suit
|
||||
name = "Station Engineer"
|
||||
|
||||
/obj/effect/landmark/corpse/clown/proc/chooseRank()
|
||||
if(prob(10))
|
||||
name = "Clown Officer"
|
||||
corpseuniform = /obj/item/clothing/under/officeruniform
|
||||
corpsesuit = /obj/item/clothing/suit/officercoat
|
||||
corpseshoes = /obj/item/clothing/shoes/clown_shoes
|
||||
corpseradio = /obj/item/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/clown_hat
|
||||
corpsepocket1 = /obj/item/bikehorn
|
||||
corpseback = /obj/item/storage/backpack/clown
|
||||
corpsehelmet = /obj/item/clothing/head/naziofficer
|
||||
corpseid = 1
|
||||
corpseidjob = "Clown Officer"
|
||||
corpseidaccess = "Clown"
|
||||
timeofdeath = -50000
|
||||
else
|
||||
name = "Clown Soldier"
|
||||
corpseuniform = /obj/item/clothing/under/soldieruniform
|
||||
corpsesuit = /obj/item/clothing/suit/soldiercoat
|
||||
corpseshoes = /obj/item/clothing/shoes/clown_shoes
|
||||
corpseradio = /obj/item/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/clown_hat
|
||||
corpsepocket1 = /obj/item/bikehorn
|
||||
corpseback = /obj/item/storage/backpack/clown
|
||||
corpsehelmet = /obj/item/clothing/head/stalhelm
|
||||
corpseid = 1
|
||||
corpseidjob = "Clown Soldier"
|
||||
corpseidaccess = "Clown"
|
||||
timeofdeath = -50000
|
||||
uniform = /obj/item/clothing/under/rank/engineer
|
||||
belt = /obj/item/storage/belt/utility/full
|
||||
suit = /obj/item/clothing/suit/space/hardsuit
|
||||
shoes = /obj/item/clothing/shoes/workboots
|
||||
head = /obj/item/clothing/head/helmet/space/hardsuit
|
||||
mask = /obj/item/clothing/mask/breath
|
||||
id = /obj/item/card/id/engineering
|
||||
l_pocket = /obj/item/t_scanner
|
||||
|
||||
/obj/effect/landmark/corpse/clownking
|
||||
name = "Clown King"
|
||||
corpseuniform = /obj/item/clothing/under/rank/clown
|
||||
corpseshoes = /obj/item/clothing/shoes/clown_shoes
|
||||
corpseradio = /obj/item/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/clown_hat
|
||||
corpsehelmet = /obj/item/clothing/head/crown
|
||||
corpsepocket1 = /obj/item/bikehorn
|
||||
corpseback = /obj/item/bedsheet/clown
|
||||
corpseid = 1
|
||||
corpseidjob = "Clown King"
|
||||
corpseidaccess = "Clown"
|
||||
timeofdeath = -50000
|
||||
coffin = 1
|
||||
backpack = /obj/item/storage/backpack/industrial
|
||||
|
||||
/obj/effect/landmark/corpse/mime
|
||||
|
||||
/obj/effect/mob_spawn/human/clown
|
||||
name = "Clown"
|
||||
mob_name = "Clown"
|
||||
id_job = "Clown"
|
||||
outfit = /datum/outfit/job/clown
|
||||
|
||||
/obj/effect/mob_spawn/human/clown/Initialize()
|
||||
mob_name = pick(clown_names)
|
||||
..()
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/clownmili
|
||||
name = "Clown Soldier"
|
||||
outfit = /datum/outfit/clownsoldier
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/clownmili/Initialize()
|
||||
mob_name = "Officer [pick(clown_names)]"
|
||||
..()
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/clownoff
|
||||
name = "Clown Officer"
|
||||
outfit = /datum/outfit/clownofficer
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/clownoff/Initialize()
|
||||
mob_name = "Honk Specialist [pick(clown_names)]"
|
||||
..()
|
||||
|
||||
|
||||
/datum/outfit/clownsoldier
|
||||
uniform = /obj/item/clothing/under/soldieruniform
|
||||
suit = /obj/item/clothing/suit/soldiercoat
|
||||
shoes = /obj/item/clothing/shoes/clown_shoes
|
||||
l_ear = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/clown_hat
|
||||
l_pocket = /obj/item/bikehorn
|
||||
back = /obj/item/storage/backpack/clown
|
||||
head = /obj/item/clothing/head/stalhelm
|
||||
|
||||
/datum/outfit/clownofficer
|
||||
uniform = /obj/item/clothing/under/officeruniform
|
||||
suit = /obj/item/clothing/suit/officercoat
|
||||
shoes = /obj/item/clothing/shoes/clown_shoes
|
||||
l_ear = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/clown_hat
|
||||
l_pocket = /obj/item/bikehorn
|
||||
back = /obj/item/storage/backpack/clown
|
||||
head = /obj/item/clothing/head/naziofficer
|
||||
|
||||
/obj/effect/mob_spawn/human/mime
|
||||
name = "Mime"
|
||||
corpseuniform = /obj/item/clothing/under/mime
|
||||
corpseshoes = /obj/item/clothing/shoes/black
|
||||
corpseradio = /obj/item/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/mime
|
||||
corpseback = /obj/item/storage/backpack
|
||||
corpseid = 1
|
||||
corpseidjob = "Mime"
|
||||
corpseidaccess = "Mime"
|
||||
timeofdeath = -50000
|
||||
mob_name = "Mime"
|
||||
id_job = "Mime"
|
||||
outfit = /datum/outfit/job/mime
|
||||
|
||||
/obj/effect/landmark/corpse/scientist
|
||||
/obj/effect/mob_spawn/human/mime/Initialize()
|
||||
mob_name = pick(mime_names)
|
||||
..()
|
||||
|
||||
/obj/effect/mob_spawn/human/scientist
|
||||
name = "Scientist"
|
||||
corpseradio = /obj/item/radio/headset/headset_sci
|
||||
corpseuniform = /obj/item/clothing/under/rank/scientist
|
||||
corpsesuit = /obj/item/clothing/suit/storage/labcoat/science
|
||||
corpseback = /obj/item/storage/backpack
|
||||
corpseshoes = /obj/item/clothing/shoes/white
|
||||
corpseid = 1
|
||||
corpseidjob = "Scientist"
|
||||
corpseidaccess = "Scientist"
|
||||
id_job = "Scientist"
|
||||
outfit = /datum/outfit/job/scientist
|
||||
|
||||
/obj/effect/landmark/corpse/miner
|
||||
corpseradio = /obj/item/radio/headset/headset_cargo
|
||||
corpseuniform = /obj/item/clothing/under/rank/miner
|
||||
corpsegloves = /obj/item/clothing/gloves/fingerless
|
||||
corpseback = /obj/item/storage/backpack/industrial
|
||||
corpseshoes = /obj/item/clothing/shoes/black
|
||||
corpseid = 1
|
||||
corpseidjob = "Shaft Miner"
|
||||
corpseidaccess = "Shaft Miner"
|
||||
/obj/effect/mob_spawn/human/miner
|
||||
name = "Shaft Miner"
|
||||
id_job = "Shaft Miner"
|
||||
outfit = /datum/outfit/job/mining/suit
|
||||
|
||||
/obj/effect/landmark/corpse/miner/hardsuit
|
||||
corpsesuit = /obj/item/clothing/suit/space/hardsuit/mining
|
||||
corpsemask = /obj/item/clothing/mask/breath
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/mining
|
||||
/datum/outfit/job/mining/suit
|
||||
name = "Station Engineer"
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/mining
|
||||
head = /obj/item/clothing/head/helmet/space/hardsuit/mining
|
||||
uniform = /obj/item/clothing/under/rank/miner
|
||||
gloves = /obj/item/clothing/gloves/fingerless
|
||||
shoes = /obj/item/clothing/shoes/workboots
|
||||
l_ear = /obj/item/radio/headset/headset_cargo/mining
|
||||
id = /obj/item/card/id/supply
|
||||
l_pocket = /obj/item/reagent_containers/food/pill/patch/styptic
|
||||
r_pocket = /obj/item/flashlight/seclite
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/bartender
|
||||
name = "Space Bartender"
|
||||
id_job = "Bartender"
|
||||
id_access_list = list(access_bar)
|
||||
outfit = /datum/outfit/spacebartender
|
||||
|
||||
/obj/effect/mob_spawn/human/bartender/alive
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
random = TRUE
|
||||
name = "bartender sleeper"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a space bartender!"
|
||||
assignedrole = "Space Bartender"
|
||||
|
||||
/datum/outfit/spacebartender
|
||||
name = "Space Bartender"
|
||||
uniform = /obj/item/clothing/under/rank/bartender
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
belt = /obj/item/storage/belt/bandolier/full
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
id = /obj/item/card/id
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/beach
|
||||
outfit = /datum/outfit/beachbum
|
||||
|
||||
/obj/effect/mob_spawn/human/beach/alive
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
random = TRUE
|
||||
mob_name = "Beach Bum"
|
||||
name = "beach bum sleeper"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a beach bum!"
|
||||
assignedrole = "Beach Bum"
|
||||
|
||||
/datum/outfit/beachbum
|
||||
name = "Beach Bum"
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
uniform = /obj/item/clothing/under/shorts/red
|
||||
|
||||
/////////////////Spooky Undead//////////////////////
|
||||
|
||||
/obj/effect/mob_spawn/human/skeleton
|
||||
name = "skeletal remains"
|
||||
mob_name = "skeleton"
|
||||
mob_species = /datum/species/skeleton
|
||||
mob_gender = NEUTER
|
||||
|
||||
/obj/effect/mob_spawn/human/skeleton/alive
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
icon = 'icons/effects/blood.dmi'
|
||||
icon_state = "remains"
|
||||
flavour_text = "By unknown powers, your skeletal remains have been reanimated! Walk this mortal plain and terrorize all living adventurers who dare cross your path."
|
||||
assignedrole = "Skeleton"
|
||||
|
||||
/////////////////Officers//////////////////////
|
||||
|
||||
/obj/effect/landmark/corpse/bridgeofficer
|
||||
/obj/effect/mob_spawn/human/bridgeofficer
|
||||
name = "Bridge Officer"
|
||||
corpseradio = /obj/item/radio/headset/heads/hop
|
||||
corpseuniform = /obj/item/clothing/under/rank/centcom_officer
|
||||
corpsesuit = /obj/item/clothing/suit/armor/bulletproof
|
||||
corpseshoes = /obj/item/clothing/shoes/black
|
||||
corpseglasses = /obj/item/clothing/glasses/sunglasses
|
||||
corpseid = 1
|
||||
corpseidjob = "Bridge Officer"
|
||||
corpseidaccess = "Captain"
|
||||
id_job = "Bridge Officer"
|
||||
id_access = "Captain"
|
||||
outfit = /datum/outfit/nanotrasenbridgeofficercorpse
|
||||
|
||||
/obj/effect/landmark/corpse/commander
|
||||
/datum/outfit/nanotrasenbridgeofficercorpse
|
||||
name = "Bridge Officer Corpse"
|
||||
l_ear = /obj/item/radio/headset/heads/hop
|
||||
uniform = /obj/item/clothing/under/rank/centcom_officer
|
||||
suit = /obj/item/clothing/suit/armor/bulletproof
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
glasses = /obj/item/clothing/glasses/sunglasses
|
||||
id = /obj/item/card/id
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/commander
|
||||
name = "Commander"
|
||||
corpseuniform = /obj/item/clothing/under/rank/centcom_commander
|
||||
corpsesuit = /obj/item/clothing/suit/armor/bulletproof
|
||||
corpseradio = /obj/item/radio/headset/heads/captain
|
||||
corpseglasses = /obj/item/clothing/glasses/eyepatch
|
||||
corpsemask = /obj/item/clothing/mask/cigarette/cigar/cohiba
|
||||
corpsehelmet = /obj/item/clothing/head/centhat
|
||||
corpsegloves = /obj/item/clothing/gloves/combat
|
||||
corpseshoes = /obj/item/clothing/shoes/combat
|
||||
corpsepocket1 = /obj/item/lighter/zippo
|
||||
corpseid = 1
|
||||
corpseidjob = "Commander"
|
||||
corpseidaccess = "Captain"
|
||||
id_job = "Commander"
|
||||
id_access = "Captain"
|
||||
outfit = /datum/outfit/nanotrasencommandercorpse
|
||||
|
||||
/obj/effect/landmark/corpse/abductor //Connected to ruins, for some reason?
|
||||
/datum/outfit/nanotrasencommandercorpse
|
||||
name = "Commander Corpse"
|
||||
|
||||
uniform = /obj/item/clothing/under/rank/centcom/officer
|
||||
gloves = /obj/item/clothing/gloves/color/white
|
||||
shoes = /obj/item/clothing/shoes/centcom
|
||||
head = /obj/item/clothing/head/beret/centcom/officer
|
||||
glasses = /obj/item/clothing/glasses/hud/security/sunglasses
|
||||
id = /obj/item/card/id/centcom
|
||||
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/abductor
|
||||
name = "abductor"
|
||||
mobname = "???"
|
||||
mob_name = "alien"
|
||||
mob_species = /datum/species/abductor
|
||||
corpseuniform = /obj/item/clothing/under/color/grey
|
||||
corpseshoes = /obj/item/clothing/shoes/combat
|
||||
outfit = /datum/outfit/abductorcorpse
|
||||
|
||||
/datum/outfit/abductorcorpse
|
||||
name = "Abductor Corpse"
|
||||
uniform = /obj/item/clothing/under/color/grey
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
|
||||
//For ghost bar.
|
||||
/obj/effect/mob_spawn/human/alive/space_bar_patron
|
||||
name = "Bar cryogenics"
|
||||
mob_name = "Bar patron"
|
||||
random = TRUE
|
||||
permanent = TRUE
|
||||
uses = -1
|
||||
outfit = /datum/outfit/spacebartender
|
||||
assignedrole = "Space Bar Patron"
|
||||
|
||||
/obj/effect/mob_spawn/human/alive/space_bar_patron/attack_hand(mob/user)
|
||||
var/despawn = alert("Return to cryosleep? (Warning, Your mob will be deleted!)",,"Yes","No")
|
||||
if(despawn == "No" || !loc || !Adjacent(user))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user.name] climbs back into cryosleep...</span>")
|
||||
qdel(user)
|
||||
|
||||
/datum/outfit/cryobartender
|
||||
name = "Cryogenic Bartender"
|
||||
uniform = /obj/item/clothing/under/rank/bartender
|
||||
back = /obj/item/storage/backpack
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
glasses = /obj/item/clothing/glasses/sunglasses/reagent
|
||||
@@ -2159,7 +2159,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
var/obj/item/organ/external/l_foot = character.get_organ("l_foot")
|
||||
var/obj/item/organ/external/r_foot = character.get_organ("r_foot")
|
||||
if(!l_foot && !r_foot)
|
||||
var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc)
|
||||
var/obj/structure/chair/wheelchair/W = new /obj/structure/chair/wheelchair (character.loc)
|
||||
character.buckled = W
|
||||
character.update_canmove()
|
||||
W.dir = character.dir
|
||||
|
||||
@@ -206,9 +206,9 @@
|
||||
|
||||
"halt" = "HALT! HALT! HALT! HALT!",
|
||||
"bobby" = "Stop in the name of the Law.",
|
||||
"compliance" = "Compliance is in your best ineterest.",
|
||||
"compliance" = "Compliance is in your best interest.",
|
||||
"justice" = "Prepare for justice!",
|
||||
"running" = "Running will only increase your sentence",
|
||||
"running" = "Running will only increase your sentence.",
|
||||
"dontmove" = "Don't move, Creep!",
|
||||
"floor" = "Down on the floor, Creep!",
|
||||
"robocop" = "Dead or alive you're coming with me.",
|
||||
@@ -216,7 +216,7 @@
|
||||
"freeze" = "Freeze, Scum Bag!",
|
||||
"imperial" = "Stop right there, criminal scum!",
|
||||
"bash" = "Stop or I'll bash you.",
|
||||
"harry" = "Go ahead, make my day",
|
||||
"harry" = "Go ahead, make my day.",
|
||||
"asshole" = "Stop breaking the law, asshole.",
|
||||
"stfu" = "You have the right to shut the fuck up",
|
||||
"shutup" = "Shut up crime!",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "It's a high visibility jumpsuit given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding."
|
||||
name = "chief engineer's jumpsuit"
|
||||
icon_state = "chiefengineer"
|
||||
item_state = "g_suit"
|
||||
item_state = "chief"
|
||||
item_color = "chief"
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 10)
|
||||
flags_size = ONESIZEFITSALL
|
||||
|
||||
@@ -168,9 +168,9 @@
|
||||
if(!proximity || !ishuman(user) || user.incapacitated())
|
||||
return
|
||||
|
||||
if(istype(target, /obj/structure/stool/bed/chair/wheelchair) && !istype(target, /obj/structure/stool/bed/chair/wheelchair/bike))
|
||||
if(istype(target, /obj/structure/chair/wheelchair) && !istype(target, /obj/structure/chair/wheelchair/bike))
|
||||
to_chat(user, "<span class='notice'>You modify the appearance of [target].</span>")
|
||||
var/obj/structure/stool/bed/chair/wheelchair/chair = target
|
||||
var/obj/structure/chair/wheelchair/chair = target
|
||||
chair.icon = 'icons/obj/custom_items.dmi'
|
||||
chair.icon_state = "vox_wheelchair"
|
||||
chair.name = "vox wheelchair"
|
||||
@@ -1207,6 +1207,15 @@
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEFACE
|
||||
|
||||
|
||||
/obj/item/clothing/shoes/fluff/arachno_boots
|
||||
name = "Arachno-Man boots"
|
||||
desc = "These boots were made for crawlin'"
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "superior_boots"
|
||||
item_state = "superior_boots"
|
||||
|
||||
|
||||
/obj/item/nullrod/fluff/chronx //chronx100: Hughe O'Splash
|
||||
fluff_transformations = list(/obj/item/nullrod/fluff/chronx/scythe)
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ var/global/list/unused_trade_stations = list("sol")
|
||||
/datum/event/traders/proc/greet_trader(var/mob/living/carbon/human/M)
|
||||
to_chat(M, "<span class='boldnotice'>You are a trader!</span>")
|
||||
to_chat(M, "<span class='notice'>You are currently docked at [get_area(M)].</span>")
|
||||
to_chat(M, "<span class='notice'>You are about to trade with NSS Cyberiad.</span>")
|
||||
to_chat(M, "<span class='notice'>You are about to trade with [station_name()].</span>")
|
||||
to_chat(M, "<span class='notice'>Negotiate an agreement, and request docking.</span>")
|
||||
spawn(25)
|
||||
show_objectives(M.mind)
|
||||
|
||||
@@ -17,5 +17,5 @@
|
||||
return
|
||||
|
||||
/hook/startup/proc/ircNotify()
|
||||
send2mainirc("Server starting up on [config.server? "byond://[config.server]" : "byond://[world.address]:[world.port]"]")
|
||||
send2mainirc("Server starting up on [station_name()]. Connect to: [config.server? "[config.server]" : "[world.address]:[world.port]"]")
|
||||
return 1
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
/datum/map/delta
|
||||
name = "Delta"
|
||||
full_name = "NSS Kerberos"
|
||||
|
||||
station_name = "NSS Kerberos"
|
||||
station_short = "Kerberos"
|
||||
dock_name = "NAS Trurl"
|
||||
company_name = "Nanotrasen"
|
||||
company_short = "NT"
|
||||
starsys_name = "Epsilon Eridani "
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
/obj/machinery/computer/shuttle/labor/one_way/Topic(href, href_list)
|
||||
if(href_list["move"])
|
||||
var/obj/docking_port/mobile/M = shuttle_master.getShuttle("laborcamp")
|
||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle("laborcamp")
|
||||
if(!M)
|
||||
to_chat(usr, "<span class='warning'>Cannot locate shuttle!</span>")
|
||||
return 0
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
if(!alone_in_area(get_area(src), usr))
|
||||
to_chat(usr, "<span class='warning'>Prisoners are only allowed to be released while alone.</span>")
|
||||
else
|
||||
switch(shuttle_master.moveShuttle("laborcamp","laborcamp_home"))
|
||||
switch(SSshuttle.moveShuttle("laborcamp","laborcamp_home"))
|
||||
if(1)
|
||||
to_chat(usr, "<span class='notice'>Shuttle not found</span>")
|
||||
if(2)
|
||||
@@ -116,7 +116,7 @@
|
||||
|
||||
if(href_list["choice"] == "release")
|
||||
if(alone_in_area(get_area(loc), usr))
|
||||
var/obj/docking_port/stationary/S = shuttle_master.getDock("laborcamp_home")
|
||||
var/obj/docking_port/stationary/S = SSshuttle.getDock("laborcamp_home")
|
||||
if(S && S.get_docked())
|
||||
if(release_door && release_door.density)
|
||||
release_door.open()
|
||||
|
||||
@@ -196,13 +196,13 @@
|
||||
if("winter") //Snow terrain is slow to move in and cold! Get the assistants to shovel your driveway.
|
||||
NewTerrainFloors = /turf/simulated/floor/snow // Needs to be updated after turf update
|
||||
NewTerrainWalls = /turf/simulated/wall/mineral/wood
|
||||
NewTerrainChairs = /obj/structure/stool/bed/chair/wood/normal
|
||||
NewTerrainChairs = /obj/structure/chair/wood/normal
|
||||
NewTerrainTables = /obj/structure/table/glass
|
||||
NewFlora = list(/obj/structure/flora/grass/green, /obj/structure/flora/grass/brown, /obj/structure/flora/grass/both)
|
||||
if("jungle") //Beneficial due to actually having breathable air. Plus, monkeys and bows and arrows.
|
||||
NewTerrainFloors = /turf/simulated/floor/grass
|
||||
NewTerrainWalls = /turf/simulated/wall/mineral/sandstone
|
||||
NewTerrainChairs = /obj/structure/stool/bed/chair/wood/normal
|
||||
NewTerrainChairs = /obj/structure/chair/wood/normal
|
||||
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,
|
||||
@@ -211,7 +211,7 @@
|
||||
if("alien") //Beneficial, turns stuff into alien alloy which is useful to cargo and research. Also repairs atmos.
|
||||
NewTerrainFloors = /turf/simulated/floor/mineral/abductor
|
||||
NewTerrainWalls = /turf/simulated/wall/mineral/abductor
|
||||
NewTerrainChairs = /obj/structure/stool/bed/abductor //ayys apparently don't have chairs. An entire species of people who only recline.
|
||||
NewTerrainChairs = /obj/structure/bed/abductor //ayys apparently don't have chairs. An entire species of people who only recline.
|
||||
NewTerrainTables = /obj/structure/table/abductor
|
||||
|
||||
/obj/machinery/anomalous_crystal/theme_warp/ActivationReaction(mob/user, method)
|
||||
@@ -233,9 +233,9 @@
|
||||
if(iswallturf(T) && NewTerrainWalls)
|
||||
T.ChangeTurf(NewTerrainWalls)
|
||||
continue
|
||||
if(istype(Stuff, /obj/structure/stool/bed/chair) && NewTerrainChairs)
|
||||
var/obj/structure/stool/bed/chair/Original = Stuff
|
||||
var/obj/structure/stool/bed/chair/C = new NewTerrainChairs(Original.loc)
|
||||
if(istype(Stuff, /obj/structure/chair) && NewTerrainChairs)
|
||||
var/obj/structure/chair/Original = Stuff
|
||||
var/obj/structure/chair/C = new NewTerrainChairs(Original.loc)
|
||||
C.dir = Original.dir
|
||||
qdel(Stuff)
|
||||
continue
|
||||
|
||||
@@ -442,7 +442,7 @@
|
||||
attack_self(user)
|
||||
|
||||
//Bed
|
||||
/obj/structure/stool/bed/pod
|
||||
/obj/structure/bed/pod
|
||||
icon = 'icons/obj/lavaland/survival_pod.dmi'
|
||||
icon_state = "bed"
|
||||
|
||||
|
||||
@@ -207,7 +207,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
for(var/obj/effect/step_trigger/S in locate(x, y, z)) //<-- this is dumb
|
||||
S.Crossed(src)
|
||||
|
||||
var/area/A = get_area_master(src)
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
A.Entered(src)
|
||||
|
||||
|
||||
@@ -146,7 +146,7 @@ Doesn't work on other aliens/AI.*/
|
||||
if("resin membrane")
|
||||
new /obj/structure/alien/resin/membrane(loc)
|
||||
if("resin nest")
|
||||
new /obj/structure/stool/bed/nest(loc)
|
||||
new /obj/structure/bed/nest(loc)
|
||||
return
|
||||
|
||||
/mob/living/carbon/alien/humanoid/verb/regurgitate()
|
||||
|
||||
@@ -578,14 +578,14 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
|
||||
/mob/living/carbon/can_use_hands()
|
||||
if(handcuffed)
|
||||
return 0
|
||||
if(buckled && ! istype(buckled, /obj/structure/stool/bed/chair)) // buckling does not restrict hands
|
||||
return 0
|
||||
return 1
|
||||
return FALSE
|
||||
if(buckled && ! istype(buckled, /obj/structure/chair)) // buckling does not restrict hands
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/restrained()
|
||||
if(handcuffed)
|
||||
return 1
|
||||
return TRUE
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -354,8 +354,8 @@
|
||||
handle_dreams()
|
||||
adjustStaminaLoss(-10)
|
||||
var/comfort = 1
|
||||
if(istype(buckled, /obj/structure/stool/bed))
|
||||
var/obj/structure/stool/bed/bed = buckled
|
||||
if(istype(buckled, /obj/structure/bed))
|
||||
var/obj/structure/bed/bed = buckled
|
||||
comfort+= bed.comfort
|
||||
for(var/obj/item/bedsheet/bedsheet in range(loc,0))
|
||||
if(bedsheet.loc != loc) //bedsheets in your backpack/neck don't give you comfort
|
||||
|
||||
@@ -265,7 +265,7 @@ var/list/ai_verbs_default = list(
|
||||
/mob/living/silicon/ai/Destroy()
|
||||
ai_list -= src
|
||||
shuttle_caller_list -= src
|
||||
shuttle_master.autoEvac()
|
||||
SSshuttle.autoEvac()
|
||||
QDEL_NULL(eyeobj) // No AI, no Eye
|
||||
if(malfhacking)
|
||||
deltimer(malfhacking)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
see_invisible = SEE_INVISIBLE_LEVEL_TWO
|
||||
|
||||
shuttle_caller_list -= src
|
||||
shuttle_master.autoEvac()
|
||||
SSshuttle.autoEvac()
|
||||
|
||||
if(nuking)
|
||||
set_security_level("red")
|
||||
@@ -26,10 +26,10 @@
|
||||
|
||||
if(doomsday_device)
|
||||
doomsday_device.timing = 0
|
||||
shuttle_master.emergencyNoEscape = 0
|
||||
if(shuttle_master.emergency.mode == SHUTTLE_STRANDED)
|
||||
shuttle_master.emergency.mode = SHUTTLE_DOCKED
|
||||
shuttle_master.emergency.timer = world.time
|
||||
SSshuttle.emergencyNoEscape = 0
|
||||
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
|
||||
SSshuttle.emergency.mode = SHUTTLE_DOCKED
|
||||
SSshuttle.emergency.timer = world.time
|
||||
priority_announcement.Announce("Hostile environment resolved. You have 3 minutes to board the Emergency Shuttle.", "Priority Announcement", 'sound/AI/shuttledock.ogg')
|
||||
qdel(doomsday_device)
|
||||
|
||||
|
||||
@@ -1,162 +1,115 @@
|
||||
//Meant for simple animals to drop lootable human bodies.
|
||||
|
||||
//If someone can do this in a neater way, be my guest-Kor
|
||||
|
||||
//This has to be seperate from the Away Mission corpses, because New() doesn't work for those, and initialize() doesn't work for these.
|
||||
|
||||
//To do: Allow corpses to appear mangled, bloody, etc. Allow customizing the bodies appearance (they're all bald and white right now).
|
||||
|
||||
|
||||
/obj/effect/landmark/mobcorpse
|
||||
name = "Unknown"
|
||||
var/mobname = "Unknown" //Unused now but it'd fuck up maps to remove it now
|
||||
var/corpseuniform = null //Set this to an object path to have the slot filled with said object on the corpse.
|
||||
var/corpsesuit = null
|
||||
var/corpseshoes = null
|
||||
var/corpsegloves = null
|
||||
var/corpseradio = null
|
||||
var/corpseglasses = null
|
||||
var/corpsemask = null
|
||||
var/corpsehelmet = null
|
||||
var/corpsebelt = null
|
||||
var/corpsepocket1 = null
|
||||
var/corpsepocket2 = null
|
||||
var/corpseback = null
|
||||
var/corpseid = 0 //Just set to 1 if you want them to have an ID
|
||||
var/corpseidjob = null // Needs to be in quotes, such as "Clown" or "Chef." This just determines what the ID reads as, not their access
|
||||
var/corpseidaccess = null //This is for access. See access.dm for which jobs give what access. Again, put in quotes. Use "Captain" if you want it to be all access.
|
||||
var/corpseidicon = null //For setting it to be a gold, silver, centcomm etc ID
|
||||
|
||||
/obj/effect/landmark/mobcorpse/New()
|
||||
createCorpse()
|
||||
|
||||
/obj/effect/landmark/mobcorpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
|
||||
var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc)
|
||||
M.real_name = src.name
|
||||
M.stat = 2 //Kills the new mob
|
||||
if(src.corpseuniform)
|
||||
M.equip_to_slot_or_del(new src.corpseuniform(M), slot_w_uniform)
|
||||
if(src.corpsesuit)
|
||||
M.equip_to_slot_or_del(new src.corpsesuit(M), slot_wear_suit)
|
||||
if(src.corpseshoes)
|
||||
M.equip_to_slot_or_del(new src.corpseshoes(M), slot_shoes)
|
||||
if(src.corpsegloves)
|
||||
M.equip_to_slot_or_del(new src.corpsegloves(M), slot_gloves)
|
||||
if(src.corpseradio)
|
||||
M.equip_to_slot_or_del(new src.corpseradio(M), slot_l_ear)
|
||||
if(src.corpseglasses)
|
||||
M.equip_to_slot_or_del(new src.corpseglasses(M), slot_glasses)
|
||||
if(src.corpsemask)
|
||||
M.equip_to_slot_or_del(new src.corpsemask(M), slot_wear_mask)
|
||||
if(src.corpsehelmet)
|
||||
M.equip_to_slot_or_del(new src.corpsehelmet(M), slot_head)
|
||||
if(src.corpsebelt)
|
||||
M.equip_to_slot_or_del(new src.corpsebelt(M), slot_belt)
|
||||
if(src.corpsepocket1)
|
||||
M.equip_to_slot_or_del(new src.corpsepocket1(M), slot_r_store)
|
||||
if(src.corpsepocket2)
|
||||
M.equip_to_slot_or_del(new src.corpsepocket2(M), slot_l_store)
|
||||
if(src.corpseback)
|
||||
M.equip_to_slot_or_del(new src.corpseback(M), slot_back)
|
||||
if(src.corpseid == 1)
|
||||
var/obj/item/card/id/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card"
|
||||
var/datum/job/jobdatum
|
||||
for(var/jobtype in typesof(/datum/job))
|
||||
var/datum/job/J = new jobtype
|
||||
if(J.title == corpseidaccess)
|
||||
jobdatum = J
|
||||
break
|
||||
if(src.corpseidicon)
|
||||
W.icon_state = corpseidicon
|
||||
if(src.corpseidaccess)
|
||||
if(jobdatum)
|
||||
W.access = jobdatum.get_access()
|
||||
else
|
||||
W.access = list()
|
||||
if(corpseidjob)
|
||||
W.assignment = corpseidjob
|
||||
W.registered_name = M.real_name
|
||||
M.equip_to_slot_or_del(W, slot_wear_id)
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
//List of different corpse types
|
||||
|
||||
/obj/effect/landmark/mobcorpse/syndicatesoldier
|
||||
/obj/effect/mob_spawn/human/corpse/syndicatesoldier
|
||||
name = "Syndicate Operative"
|
||||
corpseuniform = /obj/item/clothing/under/syndicate
|
||||
corpsesuit = /obj/item/clothing/suit/armor/vest
|
||||
corpseshoes = /obj/item/clothing/shoes/combat
|
||||
corpsegloves = /obj/item/clothing/gloves/combat
|
||||
corpseradio = /obj/item/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/swat
|
||||
corpseback = /obj/item/storage/backpack
|
||||
corpseid = 1
|
||||
corpseidjob = "Operative"
|
||||
corpseidaccess = "Syndicate"
|
||||
mob_name = "Syndicate Operative"
|
||||
hair_style = "bald"
|
||||
facial_hair_style = "shaved"
|
||||
id_job = "Operative"
|
||||
id_access_list = list(access_syndicate)
|
||||
outfit = /datum/outfit/syndicatesoldiercorpse
|
||||
|
||||
/datum/outfit/syndicatesoldiercorpse
|
||||
name = "Syndicate Operative Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/armor/vest
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
l_ear = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas
|
||||
head = /obj/item/clothing/head/helmet/swat
|
||||
back = /obj/item/storage/backpack
|
||||
id = /obj/item/card/id
|
||||
|
||||
|
||||
|
||||
/obj/effect/landmark/mobcorpse/syndicatecommando
|
||||
/obj/effect/mob_spawn/human/corpse/syndicatecommando
|
||||
name = "Syndicate Commando"
|
||||
corpseuniform = /obj/item/clothing/under/syndicate
|
||||
corpsesuit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
corpseshoes = /obj/item/clothing/shoes/combat
|
||||
corpsegloves = /obj/item/clothing/gloves/combat
|
||||
corpseradio = /obj/item/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/syndicate
|
||||
corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/syndi
|
||||
corpseback = /obj/item/tank/jetpack/oxygen
|
||||
corpsepocket1 = /obj/item/tank/emergency_oxygen
|
||||
corpseid = 1
|
||||
corpseidjob = "Operative"
|
||||
corpseidaccess = "Syndicate"
|
||||
mob_name = "Syndicate Commando"
|
||||
hair_style = "bald"
|
||||
facial_hair_style = "shaved"
|
||||
id_job = "Operative"
|
||||
id_access_list = list(access_syndicate)
|
||||
outfit = /datum/outfit/syndicatecommandocorpse
|
||||
|
||||
/obj/effect/landmark/mobcorpse/syndicateautogib/createCorpse()
|
||||
var/mob/living/carbon/human/M = new /mob/living/carbon/human(loc)
|
||||
M.real_name = src.name
|
||||
M.gib()
|
||||
qdel(src)
|
||||
/datum/outfit/syndicatecommandocorpse
|
||||
name = "Syndicate Commando Corpse"
|
||||
uniform = /obj/item/clothing/under/syndicate
|
||||
suit = /obj/item/clothing/suit/space/hardsuit/syndi
|
||||
shoes = /obj/item/clothing/shoes/combat
|
||||
gloves = /obj/item/clothing/gloves/combat
|
||||
l_ear = /obj/item/radio/headset
|
||||
mask = /obj/item/clothing/mask/gas/syndicate
|
||||
back = /obj/item/tank/jetpack/oxygen
|
||||
r_pocket = /obj/item/tank/emergency_oxygen
|
||||
id = /obj/item/card/id
|
||||
|
||||
|
||||
/obj/effect/landmark/mobcorpse/clown
|
||||
name = "Clown"
|
||||
corpseuniform = /obj/item/clothing/under/rank/clown
|
||||
corpseshoes = /obj/item/clothing/shoes/clown_shoes
|
||||
corpseradio = /obj/item/radio/headset
|
||||
corpsemask = /obj/item/clothing/mask/gas/clown_hat
|
||||
corpsepocket1 = /obj/item/bikehorn
|
||||
corpseback = /obj/item/storage/backpack/clown
|
||||
corpseid = 1
|
||||
corpseidjob = "Clown"
|
||||
corpseidaccess = "Clown"
|
||||
/obj/effect/mob_spawn/human/clown/corpse
|
||||
roundstart = TRUE
|
||||
instant = TRUE
|
||||
|
||||
/obj/effect/mob_spawn/human/mime/corpse
|
||||
roundstart = TRUE
|
||||
instant = TRUE
|
||||
|
||||
|
||||
/obj/effect/landmark/mobcorpse/pirate
|
||||
/obj/effect/mob_spawn/human/corpse/pirate
|
||||
name = "Pirate"
|
||||
corpseuniform = /obj/item/clothing/under/pirate
|
||||
corpseshoes = /obj/item/clothing/shoes/jackboots
|
||||
corpseglasses = /obj/item/clothing/glasses/eyepatch
|
||||
corpsehelmet = /obj/item/clothing/head/bandana
|
||||
mob_name = "Pirate"
|
||||
hair_style = "bald"
|
||||
facial_hair_style = "shaved"
|
||||
outfit = /datum/outfit/piratecorpse
|
||||
|
||||
/datum/outfit/piratecorpse
|
||||
name = "Pirate Corpse"
|
||||
uniform = /obj/item/clothing/under/pirate
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
glasses = /obj/item/clothing/glasses/eyepatch
|
||||
head = /obj/item/clothing/head/bandana
|
||||
|
||||
|
||||
|
||||
/obj/effect/landmark/mobcorpse/pirate/ranged
|
||||
/obj/effect/mob_spawn/human/corpse/pirate/ranged
|
||||
name = "Pirate Gunner"
|
||||
corpsesuit = /obj/item/clothing/suit/pirate_black
|
||||
corpsehelmet = /obj/item/clothing/head/pirate
|
||||
mob_name = "Pirate Gunner"
|
||||
outfit = /datum/outfit/piratecorpse/ranged
|
||||
|
||||
/datum/outfit/piratecorpse/ranged
|
||||
name = "Pirate Gunner Corpse"
|
||||
suit = /obj/item/clothing/suit/pirate_black
|
||||
head = /obj/item/clothing/head/pirate
|
||||
|
||||
|
||||
|
||||
/obj/effect/landmark/mobcorpse/russian
|
||||
/obj/effect/mob_spawn/human/corpse/russian
|
||||
name = "Russian"
|
||||
corpseuniform = /obj/item/clothing/under/soviet
|
||||
corpseshoes = /obj/item/clothing/shoes/jackboots
|
||||
corpsehelmet = /obj/item/clothing/head/bearpelt
|
||||
mob_name = "Russian"
|
||||
hair_style = "bald"
|
||||
facial_hair_style = "shaved"
|
||||
outfit = /datum/outfit/russiancorpse
|
||||
|
||||
/obj/effect/landmark/mobcorpse/russian/ranged
|
||||
corpsehelmet = /obj/item/clothing/head/ushanka
|
||||
/datum/outfit/russiancorpse
|
||||
name = "Russian Corpse"
|
||||
uniform = /obj/item/clothing/under/soviet
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
head = /obj/item/clothing/head/bearpelt
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/russian/ranged
|
||||
outfit = /datum/outfit/russiancorpse/ranged
|
||||
|
||||
/datum/outfit/russiancorpse/ranged
|
||||
name = "Ranged Russian Corpse"
|
||||
head = /obj/item/clothing/head/ushanka
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/wizard
|
||||
name = "Space Wizard Corpse"
|
||||
outfit = /datum/outfit/wizardcorpse
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/clownoff/Initialize()
|
||||
mob_name = "[pick(wizard_first)], [pick(wizard_second)]"
|
||||
..()
|
||||
|
||||
/datum/outfit/wizardcorpse
|
||||
name = "Space Wizard Corpse"
|
||||
uniform = /obj/item/clothing/under/color/lightpurple
|
||||
suit = /obj/item/clothing/suit/wizrobe
|
||||
shoes = /obj/item/clothing/shoes/sandal
|
||||
head = /obj/item/clothing/head/wizard
|
||||
@@ -242,7 +242,7 @@
|
||||
stored_mob.forceMove(get_turf(src))
|
||||
stored_mob = null
|
||||
else
|
||||
new /obj/effect/landmark/corpse/damaged(T)
|
||||
new /obj/effect/mob_spawn/human/corpse/charredskeleton(T)
|
||||
..(gibbed)
|
||||
|
||||
|
||||
@@ -320,4 +320,14 @@
|
||||
name = "legion's head"
|
||||
desc = "The once living, now empty eyes of the former human's skull cut deep into your soul."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "skull"
|
||||
icon_state = "skull"
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/charredskeleton
|
||||
name = "charred skeletal remains"
|
||||
burn_damage = 1000
|
||||
mob_name = "ashen skeleton"
|
||||
mob_gender = NEUTER
|
||||
husk = FALSE
|
||||
mob_species = /datum/species/skeleton
|
||||
mob_color = "#454545"
|
||||
@@ -23,7 +23,7 @@
|
||||
atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 15
|
||||
speak_emote = list("yarrs")
|
||||
loot = list(/obj/effect/landmark/mobcorpse/pirate,
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/pirate,
|
||||
/obj/item/melee/energy/sword/pirate)
|
||||
del_on_death = 1
|
||||
faction = list("pirate")
|
||||
@@ -40,5 +40,5 @@
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
projectiletype = /obj/item/projectile/beam
|
||||
loot = list(/obj/effect/landmark/mobcorpse/pirate/ranged,
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged,
|
||||
/obj/item/gun/energy/laser)
|
||||
@@ -22,7 +22,7 @@
|
||||
unsuitable_atmos_damage = 15
|
||||
faction = list("russian")
|
||||
status_flags = CANPUSH
|
||||
loot = list(/obj/effect/landmark/mobcorpse/russian,
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/russian,
|
||||
/obj/item/kitchen/knife)
|
||||
del_on_death = 1
|
||||
sentience_type = SENTIENCE_OTHER
|
||||
@@ -34,9 +34,9 @@
|
||||
retreat_distance = 5
|
||||
minimum_distance = 5
|
||||
casingtype = /obj/item/ammo_casing/a357
|
||||
loot = list(/obj/effect/landmark/mobcorpse/russian/ranged, /obj/item/gun/projectile/revolver/mateba)
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/russian/ranged, /obj/item/gun/projectile/revolver/mateba)
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged/mosin
|
||||
loot = list(/obj/effect/landmark/mobcorpse/russian/ranged,
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/russian/ranged,
|
||||
/obj/item/gun/projectile/shotgun/boltaction)
|
||||
casingtype = /obj/item/ammo_casing/a762
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
faction = list("syndicate")
|
||||
check_friendly_fire = 1
|
||||
status_flags = CANPUSH
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier)
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier)
|
||||
del_on_death = 1
|
||||
sentience_type = SENTIENCE_OTHER
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
armour_penetration = 28
|
||||
status_flags = 0
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier, /obj/item/melee/energy/sword/saber/red, /obj/item/shield/energy)
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier, /obj/item/melee/energy/sword/saber/red, /obj/item/shield/energy)
|
||||
var/melee_block_chance = 20
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
|
||||
@@ -72,7 +72,7 @@
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicateautogib)
|
||||
loot = list()//no loot, its gonna delete and gib.
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot
|
||||
name = "Syndicate Operative"
|
||||
@@ -81,6 +81,7 @@
|
||||
stat_attack = 1
|
||||
universal_speak = 1
|
||||
melee_block_chance = 40
|
||||
del_on_death = 1
|
||||
var/area/syndicate_depot/core/depotarea
|
||||
var/raised_alert = FALSE
|
||||
var/alert_on_death = FALSE
|
||||
@@ -182,6 +183,7 @@
|
||||
depotarea.shields_key_check()
|
||||
if(depotarea)
|
||||
depotarea.list_remove(src, depotarea.guard_list)
|
||||
new /obj/effect/gibspawner/human(get_turf(src))
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/CanPass(atom/movable/mover, turf/target, height=0)
|
||||
@@ -247,7 +249,7 @@
|
||||
icon_state = "syndicatemeleespace"
|
||||
icon_living = "syndicatemeleespace"
|
||||
speed = 1
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatecommando, /obj/item/melee/energy/sword/saber/red, /obj/item/shield/energy)
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatecommando, /obj/item/melee/energy/sword/saber/red, /obj/item/shield/energy)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/space/Process_Spacemove(var/movement_dir = 0)
|
||||
return
|
||||
@@ -261,7 +263,7 @@
|
||||
icon_state = "syndicateranged"
|
||||
icon_living = "syndicateranged"
|
||||
casingtype = /obj/item/ammo_casing/c45
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier, /obj/item/gun/projectile/automatic/c20r)
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier, /obj/item/gun/projectile/automatic/c20r)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space
|
||||
icon_state = "syndicaterangedpsace"
|
||||
@@ -270,14 +272,13 @@
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
speed = 1
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatecommando, /obj/item/gun/projectile/automatic/c20r)
|
||||
loot = list(/obj/effect/mob_spawn/human/corpse/syndicatecommando, /obj/item/gun/projectile/automatic/c20r)
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space/Process_Spacemove(var/movement_dir = 0)
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/ranged/space/autogib
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicateautogib)
|
||||
|
||||
loot = list()//gonna gibe, no loot.
|
||||
|
||||
/mob/living/simple_animal/hostile/viscerator
|
||||
name = "viscerator"
|
||||
|
||||
@@ -472,6 +472,8 @@
|
||||
/mob/living/proc/CureBlind()
|
||||
var/val_change = !!(disabilities & BLIND)
|
||||
disabilities &= ~BLIND
|
||||
CureIfHasDisability(BLINDBLOCK)
|
||||
|
||||
if(val_change)
|
||||
update_blind_effects()
|
||||
|
||||
@@ -482,6 +484,7 @@
|
||||
|
||||
/mob/living/proc/CureCoughing()
|
||||
disabilities &= ~COUGHING
|
||||
CureIfHasDisability(COUGHBLOCK)
|
||||
|
||||
// Deaf
|
||||
|
||||
@@ -490,6 +493,7 @@
|
||||
|
||||
/mob/living/proc/CureDeaf()
|
||||
disabilities &= ~DEAF
|
||||
CureIfHasDisability(DEAFBLOCK)
|
||||
|
||||
// Epilepsy
|
||||
|
||||
@@ -498,6 +502,7 @@
|
||||
|
||||
/mob/living/proc/CureEpilepsy()
|
||||
disabilities &= ~EPILEPSY
|
||||
CureIfHasDisability(EPILEPSYBLOCK)
|
||||
|
||||
// Mute
|
||||
|
||||
@@ -506,6 +511,7 @@
|
||||
|
||||
/mob/living/proc/CureMute()
|
||||
disabilities &= ~MUTE
|
||||
CureIfHasDisability(MUTEBLOCK)
|
||||
|
||||
// Nearsighted
|
||||
|
||||
@@ -518,6 +524,7 @@
|
||||
/mob/living/proc/CureNearsighted()
|
||||
var/val_change = !!(disabilities & NEARSIGHTED)
|
||||
disabilities &= ~NEARSIGHTED
|
||||
CureIfHasDisability(GLASSESBLOCK)
|
||||
if(val_change)
|
||||
update_nearsighted_effects()
|
||||
|
||||
@@ -528,6 +535,7 @@
|
||||
|
||||
/mob/living/proc/CureNervous()
|
||||
disabilities &= ~NERVOUS
|
||||
CureIfHasDisability(NERVOUSBLOCK)
|
||||
|
||||
// Tourettes
|
||||
|
||||
@@ -536,3 +544,10 @@
|
||||
|
||||
/mob/living/proc/CureTourettes()
|
||||
disabilities &= ~TOURETTES
|
||||
CureIfHasDisability(TWITCHBLOCK)
|
||||
|
||||
/mob/living/proc/CureIfHasDisability(block)
|
||||
if(dna.GetSEState(block))
|
||||
dna.SetSEState(block, 0, 1) //Fix the gene
|
||||
genemutcheck(src, block,null, MUTCHK_FORCED)
|
||||
dna.UpdateSE()
|
||||
|
||||
@@ -995,9 +995,9 @@ var/list/slot_equipment_priority = list( \
|
||||
|
||||
// this function displays the shuttles ETA in the status panel if the shuttle has been called
|
||||
/mob/proc/show_stat_emergency_shuttle_eta()
|
||||
var/ETA = shuttle_master.emergency.getModeStr()
|
||||
var/ETA = SSshuttle.emergency.getModeStr()
|
||||
if(ETA)
|
||||
stat(null, "[ETA] [shuttle_master.emergency.getTimerStr()]")
|
||||
stat(null, "[ETA] [SSshuttle.emergency.getTimerStr()]")
|
||||
|
||||
/mob/proc/show_stat_turf_contents()
|
||||
if(listed_turf && client)
|
||||
|
||||
@@ -357,15 +357,15 @@
|
||||
|
||||
character.lastarea = get_area(loc)
|
||||
// Moving wheelchair if they have one
|
||||
if(character.buckled && istype(character.buckled, /obj/structure/stool/bed/chair/wheelchair))
|
||||
if(character.buckled && istype(character.buckled, /obj/structure/chair/wheelchair))
|
||||
character.buckled.loc = character.loc
|
||||
character.buckled.dir = character.dir
|
||||
|
||||
ticker.mode.latespawn(character)
|
||||
|
||||
character = job_master.EquipRank(character, rank, 1) //equips the human
|
||||
EquipCustomItems(character)
|
||||
|
||||
ticker.mode.latespawn(character)
|
||||
|
||||
if(character.mind.assigned_role == "Cyborg")
|
||||
AnnounceCyborg(character, rank, join_message)
|
||||
callHook("latespawn", list(character))
|
||||
@@ -433,9 +433,9 @@
|
||||
var/dat = "<html><body><center>"
|
||||
dat += "Round Duration: [round(hours)]h [round(mins)]m<br>"
|
||||
|
||||
if(shuttle_master.emergency.mode >= SHUTTLE_ESCAPE)
|
||||
if(SSshuttle.emergency.mode >= SHUTTLE_ESCAPE)
|
||||
dat += "<font color='red'><b>The station has been evacuated.</b></font><br>"
|
||||
else if(shuttle_master.emergency.mode >= SHUTTLE_CALL)
|
||||
else if(SSshuttle.emergency.mode >= SHUTTLE_CALL)
|
||||
dat += "<font color='red'>The station is currently undergoing evacuation procedures.</font><br>"
|
||||
|
||||
if(length(job_master.prioritized_jobs))
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
/datum/computer_file/program/comm/Destroy()
|
||||
shuttle_caller_list -= src
|
||||
shuttle_master.autoEvac()
|
||||
SSshuttle.autoEvac()
|
||||
return ..()
|
||||
|
||||
/datum/computer_file/program/comm/proc/is_authenticated(mob/user, loud = 1)
|
||||
@@ -145,16 +145,16 @@
|
||||
data["current_message"] = data["is_ai"] ? messagetext[aicurrmsg] : messagetext[currmsg]
|
||||
data["current_message_title"] = data["is_ai"] ? messagetitle[aicurrmsg] : messagetitle[currmsg]
|
||||
|
||||
data["lastCallLoc"] = shuttle_master.emergencyLastCallLoc ? format_text(shuttle_master.emergencyLastCallLoc.name) : null
|
||||
data["lastCallLoc"] = SSshuttle.emergencyLastCallLoc ? format_text(SSshuttle.emergencyLastCallLoc.name) : null
|
||||
|
||||
var/shuttle[0]
|
||||
switch(shuttle_master.emergency.mode)
|
||||
switch(SSshuttle.emergency.mode)
|
||||
if(SHUTTLE_IDLE, SHUTTLE_RECALL)
|
||||
shuttle["callStatus"] = 2 //#define
|
||||
else
|
||||
shuttle["callStatus"] = 1
|
||||
if(shuttle_master.emergency.mode == SHUTTLE_CALL)
|
||||
var/timeleft = shuttle_master.emergency.timeLeft()
|
||||
if(SSshuttle.emergency.mode == SHUTTLE_CALL)
|
||||
var/timeleft = SSshuttle.emergency.timeLeft()
|
||||
shuttle["eta"] = "[timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]"
|
||||
|
||||
data["shuttle"] = shuttle
|
||||
@@ -257,7 +257,7 @@
|
||||
return 1
|
||||
|
||||
call_shuttle_proc(usr, input)
|
||||
if(shuttle_master.emergency.timer)
|
||||
if(SSshuttle.emergency.timer)
|
||||
post_status("shuttle")
|
||||
setMenuState(usr, COMM_SCREEN_MAIN)
|
||||
|
||||
@@ -269,7 +269,7 @@
|
||||
var/response = alert("Are you sure you wish to recall the shuttle?", "Confirm", "Yes", "No")
|
||||
if(response == "Yes")
|
||||
cancel_call_proc(usr)
|
||||
if(shuttle_master.emergency.timer)
|
||||
if(SSshuttle.emergency.timer)
|
||||
post_status("shuttle")
|
||||
setMenuState(usr, COMM_SCREEN_MAIN)
|
||||
|
||||
@@ -376,8 +376,8 @@
|
||||
setMenuState(usr,COMM_SCREEN_MAIN)
|
||||
|
||||
if("RestartNanoMob")
|
||||
if(mob_hunt_server)
|
||||
if(mob_hunt_server.manual_reboot())
|
||||
if(SSmob_hunt)
|
||||
if(SSmob_hunt.manual_reboot())
|
||||
var/loading_msg = pick("Respawning spawns", "Reticulating splines", "Flipping hat",
|
||||
"Capturing all of them", "Fixing minor text issues", "Being the very best",
|
||||
"Nerfing this", "Not communicating with playerbase", "Coding a ripoff in a 2D spaceman game")
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
else
|
||||
var/area/A = get_area(src)
|
||||
if(!A || !isarea(A))
|
||||
if(!istype(A))
|
||||
return 0
|
||||
|
||||
if(A.powered(EQUIP))
|
||||
|
||||
@@ -313,19 +313,19 @@
|
||||
/datum/data/pda/app/supply/update_ui(mob/user as mob, list/data)
|
||||
var/supplyData[0]
|
||||
|
||||
if(shuttle_master.supply.mode == SHUTTLE_CALL)
|
||||
if(SSshuttle.supply.mode == SHUTTLE_CALL)
|
||||
supplyData["shuttle_moving"] = 1
|
||||
|
||||
if(!is_station_level(shuttle_master.supply.z))
|
||||
if(!is_station_level(SSshuttle.supply.z))
|
||||
supplyData["shuttle_loc"] = "station"
|
||||
else
|
||||
supplyData["shuttle_loc"] = "centcom"
|
||||
|
||||
supplyData["shuttle_time"] = "([shuttle_master.supply.timeLeft(600)] Mins)"
|
||||
supplyData["shuttle_time"] = "([SSshuttle.supply.timeLeft(600)] Mins)"
|
||||
|
||||
var/supplyOrderCount = 0
|
||||
var/supplyOrderData[0]
|
||||
for(var/S in shuttle_master.shoppinglist)
|
||||
for(var/S in SSshuttle.shoppinglist)
|
||||
var/datum/supply_order/SO = S
|
||||
supplyOrderCount++
|
||||
supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.orderedby, "Comment" = html_encode(SO.comment))
|
||||
@@ -338,7 +338,7 @@
|
||||
|
||||
var/requestCount = 0
|
||||
var/requestData[0]
|
||||
for(var/S in shuttle_master.requestlist)
|
||||
for(var/S in SSshuttle.requestlist)
|
||||
var/datum/supply_order/SO = S
|
||||
requestCount++
|
||||
requestData[++requestData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "OrderedBy" = SO.orderedby, "Comment" = html_encode(SO.comment))
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
processing_objects.Remove(pda)
|
||||
|
||||
/datum/data/pda/app/mob_hunter_game/proc/scan_nearby()
|
||||
if(!mob_hunt_server || !connected)
|
||||
if(!SSmob_hunt || !connected)
|
||||
return
|
||||
for(var/turf/T in range(scan_range, get_turf(pda)))
|
||||
for(var/obj/effect/nanomob/N in T.contents)
|
||||
@@ -41,10 +41,10 @@
|
||||
N.reveal()
|
||||
|
||||
/datum/data/pda/app/mob_hunter_game/proc/reconnect()
|
||||
if(!mob_hunt_server || !mob_hunt_server.server_status || connected)
|
||||
if(!SSmob_hunt || !SSmob_hunt.server_status || connected)
|
||||
//show a message about the server being unavailable (because it doesn't exist / didn't get set to the global var / is offline)
|
||||
return 0
|
||||
mob_hunt_server.connected_clients += src
|
||||
SSmob_hunt.connected_clients += src
|
||||
connected = 1
|
||||
if(pda)
|
||||
pda.audible_message("[bicon(pda)] Connection established. Capture all of the mobs, [pda.owner ? pda.owner : "hunter"]!", null, 2)
|
||||
@@ -59,10 +59,10 @@
|
||||
return null
|
||||
|
||||
/datum/data/pda/app/mob_hunter_game/proc/disconnect(reason = null)
|
||||
if(!mob_hunt_server || !connected)
|
||||
if(!SSmob_hunt || !connected)
|
||||
return
|
||||
mob_hunt_server.connected_clients -= src
|
||||
for(var/obj/effect/nanomob/N in (mob_hunt_server.normal_spawns + mob_hunt_server.trap_spawns))
|
||||
SSmob_hunt.connected_clients -= src
|
||||
for(var/obj/effect/nanomob/N in (SSmob_hunt.normal_spawns + SSmob_hunt.trap_spawns))
|
||||
N.conceal(list(get_player()))
|
||||
connected = 0
|
||||
//show a disconnect message if we were disconnected involuntarily (reason argument provided)
|
||||
@@ -70,7 +70,7 @@
|
||||
pda.audible_message("[bicon(pda)] Disconnected from server. Reason: [reason].", null, 2)
|
||||
|
||||
/datum/data/pda/app/mob_hunter_game/program_process()
|
||||
if(!mob_hunt_server || !connected)
|
||||
if(!SSmob_hunt || !connected)
|
||||
return
|
||||
scan_nearby()
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
return 1
|
||||
|
||||
/datum/data/pda/app/mob_hunter_game/update_ui(mob/user, list/data)
|
||||
if(!mob_hunt_server || !(src in mob_hunt_server.connected_clients))
|
||||
if(!SSmob_hunt || !(src in SSmob_hunt.connected_clients))
|
||||
data["connected"] = 0
|
||||
else
|
||||
data["connected"] = 1
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
if(building==0)
|
||||
init()
|
||||
else
|
||||
area = src.loc.loc
|
||||
area = get_area(src)
|
||||
area.apc |= src
|
||||
opened = 1
|
||||
operating = 0
|
||||
@@ -1068,7 +1068,6 @@
|
||||
if(prob(3))
|
||||
src.locked = 1
|
||||
if(src.cell.charge > 0)
|
||||
// to_chat(world, "<span class='warning'>blew APC in [src.loc.loc]</span>")
|
||||
src.cell.charge = 0
|
||||
cell.corrupt()
|
||||
src.malfhack = 1
|
||||
|
||||
@@ -396,7 +396,7 @@
|
||||
// returns whether this light has power
|
||||
// true if area has power and lightswitch is on
|
||||
/obj/machinery/light/proc/has_power()
|
||||
var/area/A = src.loc.loc
|
||||
var/area/A = get_area(src)
|
||||
return A.lightswitch && A.power_light
|
||||
|
||||
/obj/machinery/light/proc/flicker(var/amount = rand(10, 20))
|
||||
@@ -584,8 +584,9 @@
|
||||
|
||||
// called when area power state changes
|
||||
/obj/machinery/light/power_change()
|
||||
var/area/A = get_area_master(src)
|
||||
if(A) seton(A.lightswitch && A.power_light)
|
||||
var/area/A = get_area(src)
|
||||
if(A)
|
||||
seton(A.lightswitch && A.power_light)
|
||||
|
||||
// called when on fire
|
||||
|
||||
|
||||
@@ -59,11 +59,13 @@
|
||||
// defaults to power_channel
|
||||
/obj/machinery/proc/powered(var/chan = -1) // defaults to power_channel
|
||||
|
||||
if(!src.loc)
|
||||
if(!loc)
|
||||
return 0
|
||||
if(!use_power)
|
||||
return 1
|
||||
|
||||
var/area/A = src.loc.loc // make sure it's in an area
|
||||
if(!A || !isarea(A))
|
||||
var/area/A = get_area(src) // make sure it's in an area
|
||||
if(!A)
|
||||
return 0 // if not, then not powered
|
||||
if(chan == -1)
|
||||
chan = power_channel
|
||||
@@ -72,7 +74,7 @@
|
||||
// increment the power usage stats for an area
|
||||
/obj/machinery/proc/use_power(var/amount, var/chan = -1) // defaults to power_channel
|
||||
var/area/A = get_area(src) // make sure it's in an area
|
||||
if(!A || !isarea(A))
|
||||
if(!A)
|
||||
return
|
||||
if(chan == -1)
|
||||
chan = power_channel
|
||||
|
||||
@@ -38,8 +38,8 @@
|
||||
narsie_spawn_animation()
|
||||
|
||||
sleep(70)
|
||||
shuttle_master.emergency.request(null, 0.3) // Cannot recall
|
||||
shuttle_master.emergency.canRecall = FALSE
|
||||
SSshuttle.emergency.request(null, 0.3) // Cannot recall
|
||||
SSshuttle.emergency.canRecall = FALSE
|
||||
|
||||
/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
|
||||
makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, null, 1)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
/datum/mapGeneratorModule/syndieFurniture
|
||||
clusterCheckFlags = CLUSTER_CHECK_SAME_ATOMS
|
||||
spawnableTurfs = list()
|
||||
spawnableAtoms = list(/obj/structure/table = 20,/obj/structure/stool/bed/chair = 15,/obj/structure/stool = 10, \
|
||||
spawnableAtoms = list(/obj/structure/table = 20,/obj/structure/chair = 15,/obj/structure/chair/stool = 10, \
|
||||
/obj/structure/computerframe = 15, /obj/item/storage/toolbox/syndicate = 15 ,\
|
||||
/obj/structure/closet/syndicate = 25)
|
||||
|
||||
@@ -50,4 +50,4 @@
|
||||
/datum/mapGeneratorModule/border/syndieWalls,\
|
||||
/datum/mapGeneratorModule/syndieFurniture, \
|
||||
/datum/mapGeneratorModule/splatterLayer/syndieMobs, \
|
||||
/datum/mapGeneratorModule/bottomLayer/repressurize)
|
||||
/datum/mapGeneratorModule/bottomLayer/repressurize)
|
||||
|
||||
@@ -85,7 +85,7 @@
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BELT
|
||||
item_state = "syringe_kit"
|
||||
materials = list(MAT_METAL=30000)
|
||||
materials = list(MAT_METAL = 30000)
|
||||
throwforce = 2
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throw_speed = 4
|
||||
@@ -96,11 +96,14 @@
|
||||
var/multiple_sprites = 0
|
||||
var/caliber
|
||||
var/multiload = 1
|
||||
var/list/initial_mats //For calculating refund values.
|
||||
|
||||
/obj/item/ammo_box/New()
|
||||
for(var/i in 1 to max_ammo)
|
||||
stored_ammo += new ammo_type(src)
|
||||
update_icon()
|
||||
initial_mats = materials.Copy()
|
||||
update_mat_value()
|
||||
|
||||
/obj/item/ammo_box/Destroy()
|
||||
QDEL_LIST(stored_ammo)
|
||||
@@ -115,6 +118,7 @@
|
||||
stored_ammo -= b
|
||||
if(keep)
|
||||
stored_ammo.Insert(1,b)
|
||||
update_mat_value()
|
||||
return b
|
||||
|
||||
/obj/item/ammo_box/proc/give_round(obj/item/ammo_casing/R, replace_spent = 0)
|
||||
@@ -125,6 +129,7 @@
|
||||
if(stored_ammo.len < max_ammo)
|
||||
stored_ammo += R
|
||||
R.loc = src
|
||||
update_mat_value()
|
||||
return 1
|
||||
//for accessibles magazines (e.g internal ones) when full, start replacing spent ammo
|
||||
else if(replace_spent)
|
||||
@@ -135,6 +140,7 @@
|
||||
|
||||
stored_ammo += R
|
||||
R.loc = src
|
||||
update_mat_value()
|
||||
return 1
|
||||
|
||||
return 0
|
||||
@@ -184,6 +190,19 @@
|
||||
icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]"
|
||||
desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!"
|
||||
|
||||
/obj/item/ammo_box/proc/update_mat_value()
|
||||
var/num_ammo = 0
|
||||
for(var/B in stored_ammo)
|
||||
var/obj/item/ammo_casing/AC = B
|
||||
if(!AC.BB) //Skip any casing which are empty
|
||||
continue
|
||||
num_ammo++
|
||||
for(var/M in initial_mats) //In case we have multiple types of materials
|
||||
var/materials_per = initial_mats[M] / max_ammo
|
||||
|
||||
var/value = max(materials_per * num_ammo, 2000) //Enforce a minimum of 2000 units even if empty.
|
||||
materials[M] = value
|
||||
|
||||
//Behavior for magazines
|
||||
/obj/item/ammo_box/magazine/proc/ammo_count()
|
||||
return stored_ammo.len
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
processing_objects.Remove(src)
|
||||
return ..()
|
||||
|
||||
/obj/item/gun/medbeam/handle_suicide()
|
||||
return
|
||||
|
||||
/obj/item/gun/medbeam/dropped(mob/user)
|
||||
..()
|
||||
LoseTarget()
|
||||
|
||||
@@ -187,24 +187,22 @@
|
||||
update()
|
||||
return
|
||||
|
||||
var/obj/structure/disposalpipe/CP = locate() in T
|
||||
|
||||
if(ptype in list(PIPE_DISPOSALS_BIN, PIPE_DISPOSALS_OUTLET, PIPE_DISPOSALS_CHUTE)) // Disposal or outlet
|
||||
if(CP) // There's something there
|
||||
if(!istype(CP,/obj/structure/disposalpipe/trunk))
|
||||
to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.")
|
||||
return
|
||||
else // Nothing under, fuck.
|
||||
var/obj/structure/disposalpipe/trunk/CP = locate() in T
|
||||
if(!CP) // There's no trunk
|
||||
to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.")
|
||||
return
|
||||
else
|
||||
if(CP)
|
||||
update()
|
||||
var/pdir = CP.dpdir
|
||||
if(istype(CP, /obj/structure/disposalpipe/broken))
|
||||
pdir = CP.dir
|
||||
if(pdir & dpdir)
|
||||
to_chat(user, "There is already a [nicetype] at that location.")
|
||||
return
|
||||
for(var/obj/structure/disposalpipe/CP in T)
|
||||
if(CP)
|
||||
update()
|
||||
var/pdir = CP.dpdir
|
||||
if(istype(CP, /obj/structure/disposalpipe/broken))
|
||||
pdir = CP.dir
|
||||
if(pdir & dpdir)
|
||||
to_chat(user, "There is already a [nicetype] at that location.")
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/weldingtool))
|
||||
if(anchored)
|
||||
|
||||
@@ -45,6 +45,26 @@
|
||||
flush = initial(flush)
|
||||
T.nicely_link_to_other_stuff(src)
|
||||
|
||||
//When the disposalsoutlet is forcefully moved. Due to meteorshot (not the recall spell)
|
||||
/obj/machinery/disposal/Moved(atom/OldLoc, Dir)
|
||||
. = ..()
|
||||
eject()
|
||||
var/ptype = istype(src, /obj/machinery/disposal/deliveryChute) ? PIPE_DISPOSALS_CHUTE : PIPE_DISPOSALS_BIN //Check what disposaltype it is
|
||||
var/turf/T = OldLoc
|
||||
if(T.intact)
|
||||
var/turf/simulated/floor/F = T
|
||||
F.remove_tile(null,TRUE,TRUE)
|
||||
T.visible_message("<span class='warning'>The floortile is ripped from the floor!</span>", "<span class='warning'>You hear a loud bang!</span>")
|
||||
if(trunk)
|
||||
trunk.remove_trunk_links()
|
||||
var/obj/structure/disposalconstruct/C = new (loc)
|
||||
transfer_fingerprints_to(C)
|
||||
C.ptype = ptype
|
||||
C.update()
|
||||
C.anchored = 0
|
||||
C.density = 1
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/disposal/Destroy()
|
||||
eject()
|
||||
if(trunk)
|
||||
@@ -1345,6 +1365,24 @@
|
||||
to_chat(user, "You need more welding fuel to complete this task.")
|
||||
return
|
||||
|
||||
//When the disposalsoutlet is forcefully moved. Due to meteorshot or the recall item spell for instance
|
||||
/obj/structure/disposaloutlet/Moved(atom/OldLoc, Dir)
|
||||
. = ..()
|
||||
var/turf/T = OldLoc
|
||||
if(T.intact)
|
||||
var/turf/simulated/floor/F = T
|
||||
F.remove_tile(null,TRUE,TRUE)
|
||||
T.visible_message("<span class='warning'>The floortile is ripped from the floor!</span>", "<span class='warning'>You hear a loud bang!</span>")
|
||||
if(linkedtrunk)
|
||||
linkedtrunk.remove_trunk_links()
|
||||
var/obj/structure/disposalconstruct/C = new (loc)
|
||||
transfer_fingerprints_to(C)
|
||||
C.ptype = PIPE_DISPOSALS_OUTLET
|
||||
C.update()
|
||||
C.anchored = 0
|
||||
C.density = 1
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/disposaloutlet/Destroy()
|
||||
if(linkedtrunk)
|
||||
linkedtrunk.remove_trunk_links()
|
||||
|
||||
@@ -45,7 +45,8 @@
|
||||
heat_gen /= max(1, tot_rating)
|
||||
|
||||
/obj/machinery/r_n_d/server/proc/initialize_serv()
|
||||
if(!files) files = new /datum/research(src)
|
||||
if(!files)
|
||||
files = new /datum/research(src)
|
||||
var/list/temp_list
|
||||
if(!id_with_upload.len)
|
||||
temp_list = list()
|
||||
@@ -252,7 +253,8 @@
|
||||
else if(href_list["reset_tech"])
|
||||
var/choice = alert("Technology Data Reset", "Are you sure you want to reset this technology to its default data? Data lost cannot be recovered.", "Continue", "Cancel")
|
||||
if(choice == "Continue")
|
||||
for(var/datum/tech/T in temp_server.files.known_tech)
|
||||
for(var/I in temp_server.files.known_tech)
|
||||
var/datum/tech/T = temp_server.files.known_tech[I]
|
||||
if(T.id == href_list["reset_tech"])
|
||||
T.level = 1
|
||||
break
|
||||
@@ -261,9 +263,10 @@
|
||||
else if(href_list["reset_design"])
|
||||
var/choice = alert("Design Data Deletion", "Are you sure you want to delete this design? Data lost cannot be recovered.", "Continue", "Cancel")
|
||||
if(choice == "Continue")
|
||||
for(var/datum/design/D in temp_server.files.known_designs)
|
||||
for(var/I in temp_server.files.known_designs)
|
||||
var/datum/design/D = temp_server.files.known_designs[I]
|
||||
if(D.id == href_list["reset_design"])
|
||||
temp_server.files.known_designs -= D
|
||||
temp_server.files.known_designs -= D.id
|
||||
break
|
||||
temp_server.files.RefreshResearch()
|
||||
|
||||
@@ -310,15 +313,17 @@
|
||||
dat += "<HR><A href='?src=[UID()];main=1'>Main Menu</A>"
|
||||
|
||||
if(2) //Data Management menu
|
||||
dat += "[temp_server.name] Data ManagementP<BR><BR>"
|
||||
dat += "[temp_server.name] Data Management<BR><BR>"
|
||||
dat += "Known Technologies<BR>"
|
||||
for(var/datum/tech/T in temp_server.files.known_tech)
|
||||
for(var/I in temp_server.files.known_tech)
|
||||
var/datum/tech/T = temp_server.files.known_tech[I]
|
||||
if(T.level <= 0)
|
||||
continue
|
||||
dat += "* [T.name] "
|
||||
dat += "<A href='?src=[UID()];reset_tech=[T.id]'>(Reset)</A><BR>" //FYI, these are all strings.
|
||||
dat += "Known Designs<BR>"
|
||||
for(var/datum/design/D in temp_server.files.known_designs)
|
||||
for(var/I in temp_server.files.known_designs)
|
||||
var/datum/design/D = temp_server.files.known_designs[I]
|
||||
dat += "* [D.name] "
|
||||
dat += "<A href='?src=[UID()];reset_design=[D.id]'>(Delete)</A><BR>"
|
||||
dat += "<HR><A href='?src=[UID()];main=1'>Main Menu</A>"
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
if(level >= SEC_LEVEL_GREEN && level <= SEC_LEVEL_DELTA && level != security_level)
|
||||
if(level >= SEC_LEVEL_RED && security_level < SEC_LEVEL_RED)
|
||||
// Mark down this time to prevent shuttle cheese
|
||||
shuttle_master.emergency_sec_level_time = world.time
|
||||
SSshuttle.emergency_sec_level_time = world.time
|
||||
|
||||
switch(level)
|
||||
if(SEC_LEVEL_GREEN)
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
- [Initialization](#initialization)
|
||||
<!-- /TOC -->
|
||||
|
||||
# Important note:
|
||||
The following readme was last updated during Late 2015. The changes between Paradise & TG's shuttle system has diverged greatly since then. Do not take the documentation here's description of differences between tg & paradise seriously without double checking.
|
||||
|
||||
# Shuttle system
|
||||
## Introduction
|
||||
This folder belongs to the "shuttle" system. The shuttle system is used to control the
|
||||
@@ -121,11 +124,6 @@ direction as the "Stationary" docking port.
|
||||
There are three main differences between -tg-station13's shuttle system and the one in
|
||||
use on Paradise, and none are very complex.
|
||||
|
||||
### Shuttle Controller
|
||||
This is a very simple change. On -tg-station13, the shuttle controller is referenced by a
|
||||
variable named `SSShuttle`. On Paradise, due to controller naming conventions, it is
|
||||
instead named `shuttle_master`.
|
||||
|
||||
### Airlocks
|
||||
The biggest modification comes in the form of how docking ports interact with airlocks.
|
||||
With -tg-station13's base code, any door on the shuttle will be closed, and any door
|
||||
|
||||
@@ -11,11 +11,11 @@
|
||||
return
|
||||
if(!istype(W, /obj/item/card))
|
||||
return
|
||||
if(shuttle_master.emergency.mode != SHUTTLE_DOCKED)
|
||||
if(SSshuttle.emergency.mode != SHUTTLE_DOCKED)
|
||||
return
|
||||
if(!user)
|
||||
return
|
||||
if(shuttle_master.emergency.timeLeft() < 11)
|
||||
if(SSshuttle.emergency.timeLeft() < 11)
|
||||
return
|
||||
if(istype(W, /obj/item/card/id)||istype(W, /obj/item/pda))
|
||||
if(istype(W, /obj/item/pda))
|
||||
@@ -35,10 +35,10 @@
|
||||
return 0
|
||||
|
||||
var/choice = alert(user, text("Would you like to (un)authorize a shortened launch time? [] authorization\s are still needed. Use abort to cancel all authorizations.", src.auth_need - src.authorized.len), "Shuttle Launch", "Authorize", "Repeal", "Abort")
|
||||
if(shuttle_master.emergency.mode != SHUTTLE_DOCKED || user.get_active_hand() != W)
|
||||
if(SSshuttle.emergency.mode != SHUTTLE_DOCKED || user.get_active_hand() != W)
|
||||
return 0
|
||||
|
||||
var/seconds = shuttle_master.emergency.timeLeft()
|
||||
var/seconds = SSshuttle.emergency.timeLeft()
|
||||
if(seconds <= 10)
|
||||
return 0
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
message_admins("[key_name_admin(user)] has launched the emergency shuttle [seconds] seconds before launch.")
|
||||
log_game("[key_name(user)] has launched the emergency shuttle in ([x], [y], [z]) [seconds] seconds before launch.")
|
||||
minor_announcement.Announce("The emergency shuttle will launch in 10 seconds")
|
||||
shuttle_master.emergency.setTimer(100)
|
||||
SSshuttle.emergency.setTimer(100)
|
||||
|
||||
if("Repeal")
|
||||
if(authorized.Remove(W:registered_name))
|
||||
@@ -66,12 +66,12 @@
|
||||
authorized.Cut()
|
||||
|
||||
/obj/machinery/computer/emergency_shuttle/emag_act(mob/user)
|
||||
if(!emagged && shuttle_master.emergency.mode == SHUTTLE_DOCKED)
|
||||
var/time = shuttle_master.emergency.timeLeft()
|
||||
if(!emagged && SSshuttle.emergency.mode == SHUTTLE_DOCKED)
|
||||
var/time = SSshuttle.emergency.timeLeft()
|
||||
message_admins("[key_name_admin(user)] has emagged the emergency shuttle: [time] seconds before launch.")
|
||||
log_game("[key_name(user)] has emagged the emergency shuttle in ([x], [y], [z]): [time] seconds before launch.")
|
||||
minor_announcement.Announce("The emergency shuttle will launch in 10 seconds", "SYSTEM ERROR:")
|
||||
shuttle_master.emergency.setTimer(100)
|
||||
SSshuttle.emergency.setTimer(100)
|
||||
emagged = 1
|
||||
|
||||
|
||||
@@ -98,15 +98,15 @@
|
||||
if(!..())
|
||||
return 0 //shuttle master not initialized
|
||||
|
||||
shuttle_master.emergency = src
|
||||
SSshuttle.emergency = src
|
||||
return 1
|
||||
|
||||
/obj/docking_port/mobile/emergency/Destroy(force)
|
||||
if(force)
|
||||
// This'll make the shuttle subsystem use the backup shuttle.
|
||||
if(shuttle_master.emergency == src)
|
||||
if(SSshuttle.emergency == src)
|
||||
// If we're the selected emergency shuttle
|
||||
shuttle_master.emergencyDeregister()
|
||||
SSshuttle.emergencyDeregister()
|
||||
|
||||
|
||||
return ..()
|
||||
@@ -115,21 +115,21 @@
|
||||
if(divisor <= 0)
|
||||
divisor = 10
|
||||
if(!timer)
|
||||
return round(shuttle_master.emergencyCallTime/divisor, 1)
|
||||
return round(SSshuttle.emergencyCallTime/divisor, 1)
|
||||
|
||||
var/dtime = world.time - timer
|
||||
switch(mode)
|
||||
if(SHUTTLE_ESCAPE)
|
||||
dtime = max(shuttle_master.emergencyEscapeTime - dtime, 0)
|
||||
dtime = max(SSshuttle.emergencyEscapeTime - dtime, 0)
|
||||
if(SHUTTLE_DOCKED)
|
||||
dtime = max(shuttle_master.emergencyDockTime - dtime, 0)
|
||||
dtime = max(SSshuttle.emergencyDockTime - dtime, 0)
|
||||
else
|
||||
|
||||
dtime = max(shuttle_master.emergencyCallTime - dtime, 0)
|
||||
dtime = max(SSshuttle.emergencyCallTime - dtime, 0)
|
||||
return round(dtime/divisor, 1)
|
||||
|
||||
/obj/docking_port/mobile/emergency/request(obj/docking_port/stationary/S, coefficient=1, area/signalOrigin, reason, redAlert)
|
||||
shuttle_master.emergencyCallTime = initial(shuttle_master.emergencyCallTime) * coefficient
|
||||
SSshuttle.emergencyCallTime = initial(SSshuttle.emergencyCallTime) * coefficient
|
||||
switch(mode)
|
||||
if(SHUTTLE_RECALL)
|
||||
mode = SHUTTLE_CALL
|
||||
@@ -144,11 +144,11 @@
|
||||
return
|
||||
|
||||
if(prob(70))
|
||||
shuttle_master.emergencyLastCallLoc = signalOrigin
|
||||
SSshuttle.emergencyLastCallLoc = signalOrigin
|
||||
else
|
||||
shuttle_master.emergencyLastCallLoc = null
|
||||
SSshuttle.emergencyLastCallLoc = null
|
||||
|
||||
emergency_shuttle_called.Announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][shuttle_master.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]")
|
||||
emergency_shuttle_called.Announce("The emergency shuttle has been called. [redAlert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [timeLeft(600)] minutes.[reason][SSshuttle.emergencyLastCallLoc ? "\n\nCall signal traced. Results can be viewed on any communications console." : "" ]")
|
||||
|
||||
if(reason == "Automatic Crew Transfer" && signalOrigin == null) // Best way we have to check that it's actually a crew transfer and not just a player using the same message- any other calls to this proc should have a signalOrigin.
|
||||
atc.shift_ending()
|
||||
@@ -167,10 +167,10 @@
|
||||
mode = SHUTTLE_RECALL
|
||||
|
||||
if(prob(70))
|
||||
shuttle_master.emergencyLastCallLoc = signalOrigin
|
||||
SSshuttle.emergencyLastCallLoc = signalOrigin
|
||||
else
|
||||
shuttle_master.emergencyLastCallLoc = null
|
||||
emergency_shuttle_recalled.Announce("The emergency shuttle has been recalled.[shuttle_master.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]")
|
||||
SSshuttle.emergencyLastCallLoc = null
|
||||
emergency_shuttle_recalled.Announce("The emergency shuttle has been recalled.[SSshuttle.emergencyLastCallLoc ? " Recall signal traced. Results can be viewed on any communications console." : "" ]")
|
||||
|
||||
/obj/docking_port/mobile/emergency/proc/is_hijacked()
|
||||
for(var/mob/living/player in player_list)
|
||||
@@ -215,9 +215,9 @@
|
||||
if(!ripples.len && (time_left <= SHUTTLE_RIPPLE_TIME) && ((mode == SHUTTLE_CALL) || (mode == SHUTTLE_ESCAPE)))
|
||||
var/destination
|
||||
if(mode == SHUTTLE_CALL)
|
||||
destination = shuttle_master.getDock("emergency_home")
|
||||
destination = SSshuttle.getDock("emergency_home")
|
||||
else if(mode == SHUTTLE_ESCAPE)
|
||||
destination = shuttle_master.getDock("emergency_away")
|
||||
destination = SSshuttle.getDock("emergency_away")
|
||||
create_ripples(destination)
|
||||
|
||||
switch(mode)
|
||||
@@ -228,7 +228,7 @@
|
||||
if(SHUTTLE_CALL)
|
||||
if(time_left <= 0)
|
||||
//move emergency shuttle to station
|
||||
if(dock(shuttle_master.getDock("emergency_home")))
|
||||
if(dock(SSshuttle.getDock("emergency_home")))
|
||||
setTimer(20)
|
||||
return
|
||||
mode = SHUTTLE_DOCKED
|
||||
@@ -246,7 +246,7 @@
|
||||
*/
|
||||
if(SHUTTLE_DOCKED)
|
||||
|
||||
if(time_left <= 0 && shuttle_master.emergencyNoEscape)
|
||||
if(time_left <= 0 && SSshuttle.emergencyNoEscape)
|
||||
priority_announcement.Announce("Hostile environment detected. Departure has been postponed indefinitely pending conflict resolution.")
|
||||
sound_played = 0
|
||||
mode = SHUTTLE_STRANDED
|
||||
@@ -256,9 +256,9 @@
|
||||
for(var/area/shuttle/escape/E in world)
|
||||
E << 'sound/effects/hyperspace_begin.ogg'
|
||||
|
||||
if(time_left <= 0 && !shuttle_master.emergencyNoEscape)
|
||||
if(time_left <= 0 && !SSshuttle.emergencyNoEscape)
|
||||
//move each escape pod to its corresponding transit dock
|
||||
for(var/obj/docking_port/mobile/pod/M in shuttle_master.mobile)
|
||||
for(var/obj/docking_port/mobile/pod/M in SSshuttle.mobile)
|
||||
if(is_station_level(M.z)) //Will not launch from the mine/planet
|
||||
M.enterTransit()
|
||||
//now move the actual emergency shuttle to its transit dock
|
||||
@@ -275,8 +275,8 @@
|
||||
if(SHUTTLE_ESCAPE)
|
||||
if(time_left <= 0)
|
||||
//move each escape pod to its corresponding escape dock
|
||||
for(var/obj/docking_port/mobile/pod/M in shuttle_master.mobile)
|
||||
M.dock(shuttle_master.getDock("[M.id]_away"))
|
||||
for(var/obj/docking_port/mobile/pod/M in SSshuttle.mobile)
|
||||
M.dock(SSshuttle.getDock("[M.id]_away"))
|
||||
|
||||
for(var/area/shuttle/escape/E in world)
|
||||
E << 'sound/effects/hyperspace_end.ogg'
|
||||
@@ -321,7 +321,7 @@
|
||||
|
||||
/*
|
||||
findTransitDock()
|
||||
. = shuttle_master.getDock("[id]_transit")
|
||||
. = SSshuttle.getDock("[id]_transit")
|
||||
if(.) return .
|
||||
return ..()
|
||||
*/
|
||||
@@ -368,7 +368,7 @@
|
||||
roundstart_move = "backup_away"
|
||||
|
||||
/obj/docking_port/mobile/emergency/backup/register()
|
||||
var/current_emergency = shuttle_master.emergency
|
||||
var/current_emergency = SSshuttle.emergency
|
||||
..()
|
||||
shuttle_master.emergency = current_emergency
|
||||
shuttle_master.backup_shuttle = src
|
||||
SSshuttle.emergency = current_emergency
|
||||
SSshuttle.backup_shuttle = src
|
||||
|
||||
@@ -154,15 +154,15 @@
|
||||
var/lock_shuttle_doors = 0
|
||||
|
||||
/obj/docking_port/stationary/register()
|
||||
if(!shuttle_master)
|
||||
if(!SSshuttle)
|
||||
throw EXCEPTION("docking port [src] could not initialize.")
|
||||
return 0
|
||||
|
||||
shuttle_master.stationary += src
|
||||
SSshuttle.stationary += src
|
||||
if(!id)
|
||||
id = "[shuttle_master.stationary.len]"
|
||||
id = "[SSshuttle.stationary.len]"
|
||||
if(name == "dock")
|
||||
name = "dock[shuttle_master.stationary.len]"
|
||||
name = "dock[SSshuttle.stationary.len]"
|
||||
|
||||
#ifdef DOCKING_PORT_HIGHLIGHT
|
||||
highlight("#f00")
|
||||
@@ -191,7 +191,7 @@
|
||||
|
||||
name = "In transit" //This looks weird, but- it means that the on-map instances can be named something actually usable to search for, but still appear correctly in terminals.
|
||||
|
||||
shuttle_master.transit += src
|
||||
SSshuttle.transit += src
|
||||
return 1
|
||||
|
||||
/obj/docking_port/mobile
|
||||
@@ -236,22 +236,22 @@
|
||||
..()
|
||||
|
||||
/obj/docking_port/mobile/register()
|
||||
if(!shuttle_master)
|
||||
if(!SSshuttle)
|
||||
throw EXCEPTION("docking port [src] could not initialize.")
|
||||
return 0
|
||||
|
||||
shuttle_master.mobile += src
|
||||
SSshuttle.mobile += src
|
||||
|
||||
if(!id)
|
||||
id = "[shuttle_master.mobile.len]"
|
||||
id = "[SSshuttle.mobile.len]"
|
||||
if(name == "shuttle")
|
||||
name = "shuttle[shuttle_master.mobile.len]"
|
||||
name = "shuttle[SSshuttle.mobile.len]"
|
||||
|
||||
return 1
|
||||
|
||||
/obj/docking_port/mobile/Destroy(force)
|
||||
if(force)
|
||||
shuttle_master.mobile -= src
|
||||
SSshuttle.mobile -= src
|
||||
areaInstance = null
|
||||
destination = null
|
||||
previous = null
|
||||
@@ -517,14 +517,14 @@
|
||||
|
||||
|
||||
/obj/docking_port/mobile/proc/findTransitDock()
|
||||
var/obj/docking_port/stationary/transit/T = shuttle_master.getDock("[id]_transit")
|
||||
var/obj/docking_port/stationary/transit/T = SSshuttle.getDock("[id]_transit")
|
||||
if(T && check_dock(T))
|
||||
return T
|
||||
|
||||
|
||||
/obj/docking_port/mobile/proc/findRoundstartDock()
|
||||
var/obj/docking_port/stationary/D
|
||||
D = shuttle_master.getDock(roundstart_move)
|
||||
D = SSshuttle.getDock(roundstart_move)
|
||||
|
||||
if(D)
|
||||
return D
|
||||
@@ -536,7 +536,7 @@
|
||||
. = dock_id(roundstart_move)
|
||||
|
||||
/obj/docking_port/mobile/proc/dock_id(id)
|
||||
var/port = shuttle_master.getDock(id)
|
||||
var/port = SSshuttle.getDock(id)
|
||||
if(port)
|
||||
. = dock(port)
|
||||
else
|
||||
@@ -707,20 +707,20 @@
|
||||
var/obj/docking_port/mobile/M
|
||||
if(!shuttleId)
|
||||
// find close shuttle that is ok to mess with
|
||||
if(!shuttle_master) //intentionally mapping shuttle consoles without actual shuttles IS POSSIBLE OH MY GOD WHO KNEW *glare*
|
||||
if(!SSshuttle) //intentionally mapping shuttle consoles without actual shuttles IS POSSIBLE OH MY GOD WHO KNEW *glare*
|
||||
return
|
||||
for(var/obj/docking_port/mobile/D in shuttle_master.mobile)
|
||||
for(var/obj/docking_port/mobile/D in SSshuttle.mobile)
|
||||
if(get_dist(src, D) <= max_connect_range && D.rebuildable)
|
||||
M = D
|
||||
shuttleId = M.id
|
||||
break
|
||||
else if(!possible_destinations && shuttle_master) //possible destinations should **not** always exist; so, if it's specifically set to null, don't make it exist
|
||||
M = shuttle_master.getShuttle(shuttleId)
|
||||
else if(!possible_destinations && SSshuttle) //possible destinations should **not** always exist; so, if it's specifically set to null, don't make it exist
|
||||
M = SSshuttle.getShuttle(shuttleId)
|
||||
|
||||
if(M && !possible_destinations)
|
||||
// find perfect fits
|
||||
possible_destinations = ""
|
||||
for(var/obj/docking_port/stationary/S in shuttle_master.stationary)
|
||||
for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
|
||||
if(!istype(S, /obj/docking_port/stationary/transit) && S.width == M.width && S.height == M.height && S.dwidth == M.dwidth && S.dheight == M.dheight && findtext(S.id, M.id))
|
||||
possible_destinations += "[possible_destinations ? ";" : ""][S.id]"
|
||||
|
||||
@@ -734,7 +734,7 @@
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/computer/shuttle/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
var/obj/docking_port/mobile/M = shuttle_master.getShuttle(shuttleId)
|
||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
||||
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "shuttle_console.tmpl", M ? M.name : "shuttle", 300, 200)
|
||||
@@ -742,14 +742,14 @@
|
||||
|
||||
/obj/machinery/computer/shuttle/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
|
||||
var/data[0]
|
||||
var/obj/docking_port/mobile/M = shuttle_master.getShuttle(shuttleId)
|
||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
||||
data["status"] = M ? M.getStatusText() : null
|
||||
if(M)
|
||||
data["shuttle"] = 1
|
||||
var/list/docking_ports = list()
|
||||
data["docking_ports"] = docking_ports
|
||||
var/list/options = params2list(possible_destinations)
|
||||
for(var/obj/docking_port/stationary/S in shuttle_master.stationary)
|
||||
for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
|
||||
if(!options.Find(S.id))
|
||||
continue
|
||||
if(!M.check_dock(S))
|
||||
@@ -775,7 +775,7 @@
|
||||
// Seriously, though, NEVER trust a Topic with something like this. Ever.
|
||||
message_admins("move HREF ([src] attempted to move to: [href_list["move"]]) exploit attempted by [key_name_admin(usr)] on [src] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
return
|
||||
switch(shuttle_master.moveShuttle(shuttleId, href_list["move"], 1))
|
||||
switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1))
|
||||
if(0)
|
||||
to_chat(usr, "<span class='notice'>Shuttle received message and will be sent shortly.</span>")
|
||||
if(1)
|
||||
@@ -881,7 +881,7 @@ var/global/trade_dockrequest_timelimit = 0
|
||||
docking_request = 1
|
||||
var/possible_destinations_dock
|
||||
var/possible_destinations_nodock
|
||||
var/docking_request_message = "A trading ship has requested docking aboard the NSS Cyberiad for trading. This request can be accepted or denied using a communications console."
|
||||
var/docking_request_message = "A trading ship has submitted a request to dock for trading. This request can be accepted or denied using a communications console."
|
||||
|
||||
/obj/machinery/computer/shuttle/trade/attack_hand(mob/user)
|
||||
if(world.time < trade_dock_timelimit)
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
data["templates_tabs"] += S.port_id
|
||||
// The first found shuttle type will be our default
|
||||
if(!existing_shuttle)
|
||||
existing_shuttle = shuttle_master.getShuttle(S.port_id)
|
||||
existing_shuttle = SSshuttle.getShuttle(S.port_id)
|
||||
templates[S.port_id] = list(
|
||||
"port_id" = S.port_id,
|
||||
"templates" = list()
|
||||
@@ -111,7 +111,7 @@
|
||||
|
||||
// Status panel
|
||||
data["shuttles"] = list()
|
||||
for(var/i in shuttle_master.mobile)
|
||||
for(var/i in SSshuttle.mobile)
|
||||
var/obj/docking_port/mobile/M = i
|
||||
var/list/L = list()
|
||||
L["name"] = M.name
|
||||
@@ -148,19 +148,19 @@
|
||||
if(href_list["select_template_category"])
|
||||
var/chosen_shuttle_id = href_list["select_template_category"]
|
||||
selected = null
|
||||
existing_shuttle = shuttle_master.getShuttle(chosen_shuttle_id)
|
||||
existing_shuttle = SSshuttle.getShuttle(chosen_shuttle_id)
|
||||
return 1
|
||||
|
||||
if(href_list["select_template"])
|
||||
if(S)
|
||||
existing_shuttle = shuttle_master.getShuttle(S.port_id)
|
||||
existing_shuttle = SSshuttle.getShuttle(S.port_id)
|
||||
selected = S
|
||||
. = TRUE
|
||||
|
||||
if(href_list["jump_to"])
|
||||
|
||||
if(href_list["type"] == "mobile")
|
||||
for(var/i in shuttle_master.mobile)
|
||||
for(var/i in SSshuttle.mobile)
|
||||
var/obj/docking_port/mobile/M = i
|
||||
if(M.id == href_list["id"])
|
||||
user.forceMove(get_turf(M))
|
||||
@@ -170,7 +170,7 @@
|
||||
|
||||
if(href_list["fast_travel"])
|
||||
|
||||
for(var/i in shuttle_master.mobile)
|
||||
for(var/i in SSshuttle.mobile)
|
||||
var/obj/docking_port/mobile/M = i
|
||||
if(M.id == href_list["id"] && M.timer && M.timeLeft() >= 50)
|
||||
M.setTimer(50)
|
||||
@@ -192,7 +192,7 @@
|
||||
user.forceMove(get_turf(preview_shuttle))
|
||||
|
||||
if(href_list["load"])
|
||||
if(existing_shuttle == shuttle_master.backup_shuttle)
|
||||
if(existing_shuttle == SSshuttle.backup_shuttle)
|
||||
// TODO make the load button disabled
|
||||
WARNING("The shuttle that the selected shuttle will replace \
|
||||
is the backup shuttle. Backup shuttle is required to be \
|
||||
|
||||
+89
-108
@@ -24,7 +24,7 @@
|
||||
/obj/docking_port/mobile/supply/register()
|
||||
if(!..())
|
||||
return 0
|
||||
shuttle_master.supply = src
|
||||
SSshuttle.supply = src
|
||||
return 1
|
||||
|
||||
/obj/docking_port/mobile/supply/canMove()
|
||||
@@ -48,7 +48,7 @@
|
||||
if(!is_station_level(z)) //we only buy when we are -at- the station
|
||||
return 1
|
||||
|
||||
if(!shuttle_master.shoppinglist.len)
|
||||
if(!SSshuttle.shoppinglist.len)
|
||||
return 2
|
||||
|
||||
var/list/emptyTurfs = list()
|
||||
@@ -71,14 +71,14 @@
|
||||
|
||||
emptyTurfs += T
|
||||
|
||||
for(var/datum/supply_order/SO in shuttle_master.shoppinglist)
|
||||
for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
|
||||
if(!SO.object)
|
||||
throw EXCEPTION("Supply Order [SO] has no object associated with it.")
|
||||
continue
|
||||
|
||||
var/turf/T = pick_n_take(emptyTurfs) //turf we will place it in
|
||||
if(!T)
|
||||
shuttle_master.shoppinglist.Cut(1, shuttle_master.shoppinglist.Find(SO))
|
||||
SSshuttle.shoppinglist.Cut(1, SSshuttle.shoppinglist.Find(SO))
|
||||
return
|
||||
|
||||
var/errors = 0
|
||||
@@ -90,7 +90,7 @@
|
||||
errors |= MANIFEST_ERROR_ITEM
|
||||
SO.createObject(T, errors)
|
||||
|
||||
shuttle_master.shoppinglist.Cut()
|
||||
SSshuttle.shoppinglist.Cut()
|
||||
|
||||
/obj/docking_port/mobile/supply/proc/sell()
|
||||
if(z != level_name_to_num(CENTCOMM)) //we only sell when we are -at- centcomm
|
||||
@@ -105,19 +105,19 @@
|
||||
|
||||
for(var/atom/movable/MA in areaInstance)
|
||||
if(MA.anchored) continue
|
||||
shuttle_master.sold_atoms += " [MA.name]"
|
||||
SSshuttle.sold_atoms += " [MA.name]"
|
||||
|
||||
// Must be in a crate (or a critter crate)!
|
||||
if(istype(MA,/obj/structure/closet/crate) || istype(MA,/obj/structure/closet/critter))
|
||||
shuttle_master.sold_atoms += ":"
|
||||
SSshuttle.sold_atoms += ":"
|
||||
if(!MA.contents.len)
|
||||
shuttle_master.sold_atoms += " (empty)"
|
||||
SSshuttle.sold_atoms += " (empty)"
|
||||
++crate_count
|
||||
|
||||
var/find_slip = 1
|
||||
for(var/thing in MA)
|
||||
// Sell manifests
|
||||
shuttle_master.sold_atoms += " [thing:name]"
|
||||
SSshuttle.sold_atoms += " [thing:name]"
|
||||
if(find_slip && istype(thing,/obj/item/paper/manifest))
|
||||
var/obj/item/paper/manifest/slip = thing
|
||||
// TODO: Check for a signature, too.
|
||||
@@ -128,8 +128,8 @@
|
||||
if(slip.stamped[i] == /obj/item/stamp/denied)
|
||||
denied = 1
|
||||
if(slip.erroneous && denied) // Caught a mistake by Centcom (IDEA: maybe Centcom rarely gets offended by this)
|
||||
pointsEarned = slip.points - shuttle_master.points_per_crate
|
||||
shuttle_master.points += pointsEarned // For now, give a full refund for paying attention (minus the crate cost)
|
||||
pointsEarned = slip.points - SSshuttle.points_per_crate
|
||||
SSshuttle.points += pointsEarned // For now, give a full refund for paying attention (minus the crate cost)
|
||||
msg += "<span class='good'>+[pointsEarned]</span>: Station correctly denied package [slip.ordernumber]: "
|
||||
if(slip.erroneous & MANIFEST_ERROR_NAME)
|
||||
msg += "Destination station incorrect. "
|
||||
@@ -139,8 +139,8 @@
|
||||
msg += "Package incomplete. "
|
||||
msg += "Points refunded.<br>"
|
||||
else if(!slip.erroneous && !denied) // Approving a proper order awards the relatively tiny points_per_slip
|
||||
shuttle_master.points += shuttle_master.points_per_slip
|
||||
msg += "<span class='good'>+[shuttle_master.points_per_slip]</span>: Package [slip.ordernumber] accorded.<br>"
|
||||
SSshuttle.points += SSshuttle.points_per_slip
|
||||
msg += "<span class='good'>+[SSshuttle.points_per_slip]</span>: Package [slip.ordernumber] accorded.<br>"
|
||||
else // You done goofed.
|
||||
if(slip.erroneous)
|
||||
msg += "<span class='good'>+0</span>: Station approved package [slip.ordernumber] despite error: "
|
||||
@@ -152,8 +152,8 @@
|
||||
msg += "We found unshipped items on our dock."
|
||||
msg += " Be more vigilant.<br>"
|
||||
else
|
||||
pointsEarned = round(shuttle_master.points_per_crate - slip.points)
|
||||
shuttle_master.points += pointsEarned
|
||||
pointsEarned = round(SSshuttle.points_per_crate - slip.points)
|
||||
SSshuttle.points += pointsEarned
|
||||
msg += "<span class='bad'>[pointsEarned]</span>: Station denied package [slip.ordernumber]. Our records show no fault on our part.<br>"
|
||||
find_slip = 0
|
||||
continue
|
||||
@@ -173,10 +173,10 @@
|
||||
if(!disk.stored) continue
|
||||
var/datum/tech/tech = disk.stored
|
||||
|
||||
var/cost = tech.getCost(shuttle_master.techLevels[tech.id])
|
||||
var/cost = tech.getCost(SSshuttle.techLevels[tech.id])
|
||||
if(cost)
|
||||
shuttle_master.techLevels[tech.id] = tech.level
|
||||
shuttle_master.points += cost
|
||||
SSshuttle.techLevels[tech.id] = tech.level
|
||||
SSshuttle.points += cost
|
||||
for(var/mob/M in player_list)
|
||||
if(M.mind)
|
||||
for(var/datum/job_objective/further_research/objective in M.mind.job_objectives)
|
||||
@@ -189,48 +189,48 @@
|
||||
if(!disk.blueprint)
|
||||
continue
|
||||
var/datum/design/design = disk.blueprint
|
||||
if(design.id in shuttle_master.researchDesigns)
|
||||
if(design.id in SSshuttle.researchDesigns)
|
||||
continue
|
||||
shuttle_master.points += shuttle_master.points_per_design
|
||||
shuttle_master.researchDesigns += design.id
|
||||
msg += "<span class='good'>+[shuttle_master.points_per_design]</span>: [design.name] design.<br>"
|
||||
SSshuttle.points += SSshuttle.points_per_design
|
||||
SSshuttle.researchDesigns += design.id
|
||||
msg += "<span class='good'>+[SSshuttle.points_per_design]</span>: [design.name] design.<br>"
|
||||
|
||||
// Sell exotic plants
|
||||
if(istype(thing, /obj/item/seeds))
|
||||
var/obj/item/seeds/S = thing
|
||||
if(S.rarity == 0) // Mundane species
|
||||
msg += "<span class='bad'>+0</span>: We don't need samples of mundane species \"[capitalize(S.species)]\".<br>"
|
||||
else if(shuttle_master.discoveredPlants[S.type]) // This species has already been sent to CentComm
|
||||
var/potDiff = S.potency - shuttle_master.discoveredPlants[S.type] // Compare it to the previous best
|
||||
else if(SSshuttle.discoveredPlants[S.type]) // This species has already been sent to CentComm
|
||||
var/potDiff = S.potency - SSshuttle.discoveredPlants[S.type] // Compare it to the previous best
|
||||
if(potDiff > 0) // This sample is better
|
||||
shuttle_master.discoveredPlants[S.type] = S.potency
|
||||
SSshuttle.discoveredPlants[S.type] = S.potency
|
||||
msg += "<span class='good'>+[potDiff]</span>: New sample of \"[capitalize(S.species)]\" is superior. Good work.<br>"
|
||||
shuttle_master.points += potDiff
|
||||
SSshuttle.points += potDiff
|
||||
else // This sample is worthless
|
||||
msg += "<span class='bad'>+0</span>: New sample of \"[capitalize(S.species)]\" is not more potent than existing sample ([shuttle_master.discoveredPlants[S.type]] potency).<br>"
|
||||
msg += "<span class='bad'>+0</span>: New sample of \"[capitalize(S.species)]\" is not more potent than existing sample ([SSshuttle.discoveredPlants[S.type]] potency).<br>"
|
||||
else // This is a new discovery!
|
||||
shuttle_master.discoveredPlants[S.type] = S.potency
|
||||
SSshuttle.discoveredPlants[S.type] = S.potency
|
||||
msg += "<span class='good'>[S.rarity]</span>: New species discovered: \"[capitalize(S.species)]\". Excellent work.<br>"
|
||||
shuttle_master.points += S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later
|
||||
SSshuttle.points += S.rarity // That's right, no bonus for potency. Send a crappy sample first to "show improvement" later
|
||||
qdel(MA)
|
||||
shuttle_master.sold_atoms += "."
|
||||
SSshuttle.sold_atoms += "."
|
||||
|
||||
if(plasma_count > 0)
|
||||
pointsEarned = round(plasma_count * shuttle_master.points_per_plasma)
|
||||
pointsEarned = round(plasma_count * SSshuttle.points_per_plasma)
|
||||
msg += "<span class='good'>+[pointsEarned]</span>: Received [plasma_count] unit(s) of exotic material.<br>"
|
||||
shuttle_master.points += pointsEarned
|
||||
SSshuttle.points += pointsEarned
|
||||
|
||||
if(intel_count > 0)
|
||||
pointsEarned = round(intel_count * shuttle_master.points_per_intel)
|
||||
pointsEarned = round(intel_count * SSshuttle.points_per_intel)
|
||||
msg += "<span class='good'>+[pointsEarned]</span>: Received [intel_count] article(s) of enemy intelligence.<br>"
|
||||
shuttle_master.points += pointsEarned
|
||||
SSshuttle.points += pointsEarned
|
||||
|
||||
if(crate_count > 0)
|
||||
pointsEarned = round(crate_count * shuttle_master.points_per_crate)
|
||||
pointsEarned = round(crate_count * SSshuttle.points_per_crate)
|
||||
msg += "<span class='good'>+[pointsEarned]</span>: Received [crate_count] crate(s).<br>"
|
||||
shuttle_master.points += pointsEarned
|
||||
SSshuttle.points += pointsEarned
|
||||
|
||||
shuttle_master.centcom_message = msg
|
||||
SSshuttle.centcom_message = msg
|
||||
|
||||
/proc/forbidden_atoms_check(atom/A)
|
||||
var/list/blacklist = list(
|
||||
@@ -271,25 +271,6 @@
|
||||
var/comment = null
|
||||
var/crates
|
||||
|
||||
/datum/controller/process/shuttle/proc/generateSupplyOrder(packId, _orderedby, _orderedbyRank, _comment, _crates)
|
||||
if(!packId)
|
||||
return
|
||||
var/datum/supply_packs/P = supply_packs["[packId]"]
|
||||
if(!P)
|
||||
return
|
||||
|
||||
var/datum/supply_order/O = new()
|
||||
O.ordernum = ordernum++
|
||||
O.object = P
|
||||
O.orderedby = _orderedby
|
||||
O.orderedbyRank = _orderedbyRank
|
||||
O.comment = _comment
|
||||
O.crates = _crates
|
||||
|
||||
requestlist += O
|
||||
|
||||
return O
|
||||
|
||||
/datum/supply_order/proc/generateRequisition(atom/_loc)
|
||||
if(!object)
|
||||
return
|
||||
@@ -298,7 +279,7 @@
|
||||
playsound(_loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
|
||||
reqform.name = "Requisition Form - [crates] '[object.name]' for [orderedby]"
|
||||
reqform.info += "<h3>[station_name()] Supply Requisition Form</h3><hr>"
|
||||
reqform.info += "INDEX: #[shuttle_master.ordernum]<br>"
|
||||
reqform.info += "INDEX: #[SSshuttle.ordernum]<br>"
|
||||
reqform.info += "REQUESTED BY: [orderedby]<br>"
|
||||
reqform.info += "RANK: [orderedbyRank]<br>"
|
||||
reqform.info += "REASON: [comment]<br>"
|
||||
@@ -331,7 +312,7 @@
|
||||
slip.ordernumber = ordernum
|
||||
|
||||
var/stationName = (errors & MANIFEST_ERROR_NAME) ? new_station_name() : station_name()
|
||||
var/packagesAmt = shuttle_master.shoppinglist.len + ((errors & MANIFEST_ERROR_COUNT) ? rand(1,2) : 0)
|
||||
var/packagesAmt = SSshuttle.shoppinglist.len + ((errors & MANIFEST_ERROR_COUNT) ? rand(1,2) : 0)
|
||||
|
||||
slip.name = "Shipping Manifest - '[object.name]' for [orderedby]"
|
||||
slip.info = "<h3>[command_name()] Shipping Manifest</h3><hr><br>"
|
||||
@@ -444,8 +425,8 @@
|
||||
|
||||
var/cat = text2num(last_viewed_group)
|
||||
var/packs_list[0]
|
||||
for(var/set_name in shuttle_master.supply_packs)
|
||||
var/datum/supply_packs/pack = shuttle_master.supply_packs[set_name]
|
||||
for(var/set_name in SSshuttle.supply_packs)
|
||||
var/datum/supply_packs/pack = SSshuttle.supply_packs[set_name]
|
||||
if(!pack.contraband && !pack.hidden && !pack.special && pack.group == cat)
|
||||
// 0/1 after the pack name (set_name) is a boolean for ordering multiple crates
|
||||
packs_list.Add(list(list("name" = pack.name, "amount" = pack.amount, "cost" = pack.cost, "command1" = list("doorder" = "[set_name]0"), "command2" = list("doorder" = "[set_name]1"), "command3" = list("contents" = set_name))))
|
||||
@@ -458,7 +439,7 @@
|
||||
data["contents_access"] = content_pack.access ? get_access_desc(content_pack.access) : "None"
|
||||
|
||||
var/requests_list[0]
|
||||
for(var/set_name in shuttle_master.requestlist)
|
||||
for(var/set_name in SSshuttle.requestlist)
|
||||
var/datum/supply_order/SO = set_name
|
||||
if(SO)
|
||||
// Check if the user owns the request, so they can cancel requests
|
||||
@@ -470,18 +451,18 @@
|
||||
data["requests"] = requests_list
|
||||
|
||||
var/orders_list[0]
|
||||
for(var/set_name in shuttle_master.shoppinglist)
|
||||
for(var/set_name in SSshuttle.shoppinglist)
|
||||
var/datum/supply_order/SO = set_name
|
||||
if(SO)
|
||||
orders_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby)))
|
||||
data["orders"] = orders_list
|
||||
|
||||
data["points"] = round(shuttle_master.points)
|
||||
data["points"] = round(SSshuttle.points)
|
||||
data["send"] = list("send" = 1)
|
||||
|
||||
data["moving"] = shuttle_master.supply.mode != SHUTTLE_IDLE
|
||||
data["at_station"] = shuttle_master.supply.getDockedId() == "supply_home"
|
||||
data["timeleft"] = shuttle_master.supply.timeLeft(600)
|
||||
data["moving"] = SSshuttle.supply.mode != SHUTTLE_IDLE
|
||||
data["at_station"] = SSshuttle.supply.getDockedId() == "supply_home"
|
||||
data["timeleft"] = SSshuttle.supply.timeLeft(600)
|
||||
|
||||
return data
|
||||
|
||||
@@ -499,7 +480,7 @@
|
||||
var/multi = text2num(copytext(href_list["doorder"], -1))
|
||||
if(!isnum(multi))
|
||||
return 1
|
||||
var/datum/supply_packs/P = shuttle_master.supply_packs[index]
|
||||
var/datum/supply_packs/P = SSshuttle.supply_packs[index]
|
||||
if(!istype(P))
|
||||
return 1
|
||||
var/crates = 1
|
||||
@@ -528,7 +509,7 @@
|
||||
|
||||
//make our supply_order datums
|
||||
for(var/i = 1; i <= crates; i++)
|
||||
var/datum/supply_order/O = shuttle_master.generateSupplyOrder(index, idname, idrank, reason, crates)
|
||||
var/datum/supply_order/O = SSshuttle.generateSupplyOrder(index, idname, idrank, reason, crates)
|
||||
if(!O) return
|
||||
if(i == 1)
|
||||
O.generateRequisition(loc)
|
||||
@@ -536,10 +517,10 @@
|
||||
else if(href_list["rreq"])
|
||||
var/ordernum = text2num(href_list["rreq"])
|
||||
var/obj/item/card/id/I = usr.get_id_card()
|
||||
for(var/i=1, i<=shuttle_master.requestlist.len, i++)
|
||||
var/datum/supply_order/SO = shuttle_master.requestlist[i]
|
||||
for(var/i=1, i<=SSshuttle.requestlist.len, i++)
|
||||
var/datum/supply_order/SO = SSshuttle.requestlist[i]
|
||||
if(SO.ordernum == ordernum && (I && SO.orderedby == I.registered_name))
|
||||
shuttle_master.requestlist.Cut(i,i+1)
|
||||
SSshuttle.requestlist.Cut(i,i+1)
|
||||
break
|
||||
|
||||
else if(href_list["last_viewed_group"])
|
||||
@@ -551,7 +532,7 @@
|
||||
if(topic == 1)
|
||||
content_pack = null
|
||||
else
|
||||
var/datum/supply_packs/P = shuttle_master.supply_packs[topic]
|
||||
var/datum/supply_packs/P = SSshuttle.supply_packs[topic]
|
||||
content_pack = P
|
||||
|
||||
add_fingerprint(usr)
|
||||
@@ -593,8 +574,8 @@
|
||||
|
||||
var/cat = text2num(last_viewed_group)
|
||||
var/packs_list[0]
|
||||
for(var/set_name in shuttle_master.supply_packs)
|
||||
var/datum/supply_packs/pack = shuttle_master.supply_packs[set_name]
|
||||
for(var/set_name in SSshuttle.supply_packs)
|
||||
var/datum/supply_packs/pack = SSshuttle.supply_packs[set_name]
|
||||
if((pack.hidden && hacked) || (pack.contraband && can_order_contraband) || (pack.special && pack.special_enabled) || (!pack.contraband && !pack.hidden && !pack.special))
|
||||
if(pack.group == cat)
|
||||
// 0/1 after the pack name (set_name) is a boolean for ordering multiple crates
|
||||
@@ -608,7 +589,7 @@
|
||||
data["contents_access"] = content_pack.access ? get_access_desc(content_pack.access) : "None"
|
||||
|
||||
var/requests_list[0]
|
||||
for(var/set_name in shuttle_master.requestlist)
|
||||
for(var/set_name in SSshuttle.requestlist)
|
||||
var/datum/supply_order/SO = set_name
|
||||
if(SO)
|
||||
if(!SO.comment)
|
||||
@@ -617,21 +598,21 @@
|
||||
data["requests"] = requests_list
|
||||
|
||||
var/orders_list[0]
|
||||
for(var/set_name in shuttle_master.shoppinglist)
|
||||
for(var/set_name in SSshuttle.shoppinglist)
|
||||
var/datum/supply_order/SO = set_name
|
||||
if(SO)
|
||||
orders_list.Add(list(list("ordernum" = SO.ordernum, "supply_type" = SO.object.name, "orderedby" = SO.orderedby, "comment" = SO.comment)))
|
||||
data["orders"] = orders_list
|
||||
|
||||
data["canapprove"] = (shuttle_master.supply.getDockedId() == "supply_away") && !(shuttle_master.supply.mode != SHUTTLE_IDLE)
|
||||
data["points"] = round(shuttle_master.points)
|
||||
data["canapprove"] = (SSshuttle.supply.getDockedId() == "supply_away") && !(SSshuttle.supply.mode != SHUTTLE_IDLE)
|
||||
data["points"] = round(SSshuttle.points)
|
||||
data["send"] = list("send" = 1)
|
||||
data["message"] = shuttle_master.centcom_message ? shuttle_master.centcom_message : "Remember to stamp and send back the supply manifests."
|
||||
data["message"] = SSshuttle.centcom_message ? SSshuttle.centcom_message : "Remember to stamp and send back the supply manifests."
|
||||
|
||||
data["moving"] = shuttle_master.supply.mode != SHUTTLE_IDLE
|
||||
data["at_station"] = shuttle_master.supply.getDockedId() == "supply_home"
|
||||
data["timeleft"] = shuttle_master.supply.timeLeft(600)
|
||||
data["can_launch"] = !shuttle_master.supply.canMove()
|
||||
data["moving"] = SSshuttle.supply.mode != SHUTTLE_IDLE
|
||||
data["at_station"] = SSshuttle.supply.getDockedId() == "supply_home"
|
||||
data["timeleft"] = SSshuttle.supply.timeLeft(600)
|
||||
data["can_launch"] = !SSshuttle.supply.canMove()
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/supplycomp/proc/is_authorized(mob/user)
|
||||
@@ -650,24 +631,24 @@
|
||||
if(!is_authorized(usr))
|
||||
return 1
|
||||
|
||||
if(!shuttle_master)
|
||||
log_runtime(EXCEPTION("The shuttle_master controller datum is missing somehow."), src)
|
||||
if(!SSshuttle)
|
||||
log_runtime(EXCEPTION("The SSshuttle controller datum is missing somehow."), src)
|
||||
return 1
|
||||
|
||||
if(href_list["send"])
|
||||
if(shuttle_master.supply.canMove())
|
||||
if(SSshuttle.supply.canMove())
|
||||
to_chat(usr, "<span class='warning'>For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.</span>")
|
||||
else if(shuttle_master.supply.getDockedId() == "supply_home")
|
||||
shuttle_master.toggleShuttle("supply", "supply_home", "supply_away", 1)
|
||||
investigate_log("[key_name(usr)] has sent the supply shuttle away. Remaining points: [shuttle_master.points]. Shuttle contents: [shuttle_master.sold_atoms]", "cargo")
|
||||
else if(!shuttle_master.supply.request(shuttle_master.getDock("supply_home")))
|
||||
else if(SSshuttle.supply.getDockedId() == "supply_home")
|
||||
SSshuttle.toggleShuttle("supply", "supply_home", "supply_away", 1)
|
||||
investigate_log("[key_name(usr)] has sent the supply shuttle away. Remaining points: [SSshuttle.points]. Shuttle contents: [SSshuttle.sold_atoms]", "cargo")
|
||||
else if(!SSshuttle.supply.request(SSshuttle.getDock("supply_home")))
|
||||
post_signal("supply")
|
||||
if(LAZYLEN(shuttle_master.shoppinglist) && prob(10))
|
||||
if(LAZYLEN(SSshuttle.shoppinglist) && prob(10))
|
||||
var/datum/supply_order/O = new /datum/supply_order()
|
||||
O.ordernum = shuttle_master.ordernum
|
||||
O.object = shuttle_master.supply_packs[pick(shuttle_master.supply_packs)]
|
||||
O.ordernum = SSshuttle.ordernum
|
||||
O.object = SSshuttle.supply_packs[pick(SSshuttle.supply_packs)]
|
||||
O.orderedby = random_name(pick(MALE,FEMALE), species = "Human")
|
||||
shuttle_master.shoppinglist += O
|
||||
SSshuttle.shoppinglist += O
|
||||
investigate_log("Random [O.object] crate added to supply shuttle")
|
||||
|
||||
else if(href_list["doorder"])
|
||||
@@ -680,7 +661,7 @@
|
||||
var/multi = text2num(copytext(href_list["doorder"], -1))
|
||||
if(!isnum(multi))
|
||||
return 1
|
||||
var/datum/supply_packs/P = shuttle_master.supply_packs[index]
|
||||
var/datum/supply_packs/P = SSshuttle.supply_packs[index]
|
||||
if(!istype(P))
|
||||
return 1
|
||||
var/crates = 1
|
||||
@@ -708,37 +689,37 @@
|
||||
|
||||
//make our supply_order datums
|
||||
for(var/i = 1; i <= crates; i++)
|
||||
var/datum/supply_order/O = shuttle_master.generateSupplyOrder(index, idname, idrank, reason, crates)
|
||||
var/datum/supply_order/O = SSshuttle.generateSupplyOrder(index, idname, idrank, reason, crates)
|
||||
if(!O) return 1
|
||||
if(i == 1)
|
||||
O.generateRequisition(loc)
|
||||
|
||||
else if(href_list["confirmorder"])
|
||||
if(shuttle_master.supply.getDockedId() != "supply_away" || shuttle_master.supply.mode != SHUTTLE_IDLE)
|
||||
if(SSshuttle.supply.getDockedId() != "supply_away" || SSshuttle.supply.mode != SHUTTLE_IDLE)
|
||||
return 1
|
||||
var/ordernum = text2num(href_list["confirmorder"])
|
||||
var/datum/supply_order/O
|
||||
var/datum/supply_packs/P
|
||||
for(var/i=1, i<=shuttle_master.requestlist.len, i++)
|
||||
var/datum/supply_order/SO = shuttle_master.requestlist[i]
|
||||
for(var/i=1, i<=SSshuttle.requestlist.len, i++)
|
||||
var/datum/supply_order/SO = SSshuttle.requestlist[i]
|
||||
if(SO.ordernum == ordernum)
|
||||
O = SO
|
||||
P = O.object
|
||||
if(shuttle_master.points >= P.cost)
|
||||
shuttle_master.requestlist.Cut(i,i+1)
|
||||
shuttle_master.points -= P.cost
|
||||
shuttle_master.shoppinglist += O
|
||||
investigate_log("[key_name(usr)] has authorized an order for [P.name]. Remaining points: [shuttle_master.points].", "cargo")
|
||||
if(SSshuttle.points >= P.cost)
|
||||
SSshuttle.requestlist.Cut(i,i+1)
|
||||
SSshuttle.points -= P.cost
|
||||
SSshuttle.shoppinglist += O
|
||||
investigate_log("[key_name(usr)] has authorized an order for [P.name]. Remaining points: [SSshuttle.points].", "cargo")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>There are insufficient supply points for this request.</span>")
|
||||
break
|
||||
|
||||
else if(href_list["rreq"])
|
||||
var/ordernum = text2num(href_list["rreq"])
|
||||
for(var/i=1, i<=shuttle_master.requestlist.len, i++)
|
||||
var/datum/supply_order/SO = shuttle_master.requestlist[i]
|
||||
for(var/i=1, i<=SSshuttle.requestlist.len, i++)
|
||||
var/datum/supply_order/SO = SSshuttle.requestlist[i]
|
||||
if(SO.ordernum == ordernum)
|
||||
shuttle_master.requestlist.Cut(i,i+1)
|
||||
SSshuttle.requestlist.Cut(i,i+1)
|
||||
break
|
||||
|
||||
else if(href_list["last_viewed_group"])
|
||||
@@ -750,7 +731,7 @@
|
||||
if(topic == 1)
|
||||
content_pack = null
|
||||
else
|
||||
var/datum/supply_packs/P = shuttle_master.supply_packs[topic]
|
||||
var/datum/supply_packs/P = SSshuttle.supply_packs[topic]
|
||||
content_pack = P
|
||||
|
||||
add_fingerprint(usr)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
/datum/station_goal/bluespace_cannon/on_report()
|
||||
//Unlock BSA parts
|
||||
var/datum/supply_packs/misc/bsa/P = shuttle_master.supply_packs["[/datum/supply_packs/misc/bsa]"]
|
||||
var/datum/supply_packs/misc/bsa/P = SSshuttle.supply_packs["[/datum/supply_packs/misc/bsa]"]
|
||||
P.special_enabled = TRUE
|
||||
|
||||
/datum/station_goal/bluespace_cannon/check_completion()
|
||||
|
||||
@@ -42,10 +42,10 @@
|
||||
The base vault parts should be available for shipping by your cargo shuttle."}
|
||||
|
||||
/datum/station_goal/dna_vault/on_report()
|
||||
var/datum/supply_packs/P = shuttle_master.supply_packs["[/datum/supply_packs/misc/dna_vault]"]
|
||||
var/datum/supply_packs/P = SSshuttle.supply_packs["[/datum/supply_packs/misc/dna_vault]"]
|
||||
P.special_enabled = TRUE
|
||||
|
||||
P = shuttle_master.supply_packs["[/datum/supply_packs/misc/dna_probes]"]
|
||||
P = SSshuttle.supply_packs["[/datum/supply_packs/misc/dna_probes]"]
|
||||
P.special_enabled = TRUE
|
||||
|
||||
/datum/station_goal/dna_vault/check_completion()
|
||||
|
||||
@@ -13,10 +13,10 @@
|
||||
|
||||
/datum/station_goal/station_shield/on_report()
|
||||
//Unlock
|
||||
var/datum/supply_packs/P = shuttle_master.supply_packs["[/datum/supply_packs/misc/shield_sat]"]
|
||||
var/datum/supply_packs/P = SSshuttle.supply_packs["[/datum/supply_packs/misc/shield_sat]"]
|
||||
P.special_enabled = TRUE
|
||||
|
||||
P = shuttle_master.supply_packs["[/datum/supply_packs/misc/shield_sat_control]"]
|
||||
P = SSshuttle.supply_packs["[/datum/supply_packs/misc/shield_sat_control]"]
|
||||
P.special_enabled = TRUE
|
||||
|
||||
/datum/station_goal/station_shield/check_completion()
|
||||
|
||||
@@ -380,7 +380,7 @@ var/static/regex/multispin_words = regex("like a record baby")
|
||||
else if((findtext(message, sit_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
for(var/obj/structure/stool/bed/chair/chair in get_turf(L))
|
||||
for(var/obj/structure/chair/chair in get_turf(L))
|
||||
chair.buckle_mob(L)
|
||||
break
|
||||
next_command = world.time + cooldown_meme
|
||||
@@ -389,7 +389,7 @@ var/static/regex/multispin_words = regex("like a record baby")
|
||||
else if((findtext(message, stand_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
if(L.buckled && istype(L.buckled, /obj/structure/stool/bed/chair))
|
||||
if(L.buckled && istype(L.buckled, /obj/structure/chair))
|
||||
L.buckled.unbuckle_mob(L)
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
|
||||
@@ -86,8 +86,6 @@
|
||||
if(target_zone == surgery.location)
|
||||
initiate(user, target, target_zone, tool, surgery)
|
||||
return 1//returns 1 so we don't stab the guy in the dick or wherever.
|
||||
if(isrobot(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/surgery_step/proc/initiate(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
|
||||
// Polycrystals, aka stacks
|
||||
|
||||
var/global/list/datum/stack_recipe/bluespace_crystal_recipes = list(new/datum/stack_recipe("Breakdown into bluespace crystal", /obj/item/ore/bluespace_crystal/refined, 1, one_per_turf = 0, on_floor = 1))
|
||||
var/global/list/datum/stack_recipe/bluespace_crystal_recipes = list(new/datum/stack_recipe("Breakdown into bluespace crystal", /obj/item/ore/bluespace_crystal/refined, 1))
|
||||
|
||||
/obj/item/stack/sheet/bluespace_crystal
|
||||
name = "bluespace polycrystal"
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
var/delay_timer = null
|
||||
|
||||
var/list/blacklist = list(/obj/tram/rail,/atom/movable/lighting_overlay)
|
||||
var/list/ancwhitelist = list(/obj/tram, /obj/vehicle, /obj/structure/stool/bed/chair, /obj/structure/grille, /obj/structure/window)
|
||||
var/list/ancwhitelist = list(/obj/tram, /obj/vehicle, /obj/structure/chair, /obj/structure/grille, /obj/structure/window)
|
||||
|
||||
/obj/tram/tram_controller/New()
|
||||
spawn(1)
|
||||
@@ -260,4 +260,4 @@
|
||||
/obj/tram/bullet_act(var/obj/item/projectile/proj)
|
||||
if(prob(proj.damage))
|
||||
qdel(src)
|
||||
..()
|
||||
..()
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "what the paramedic uses to run over people to take to medbay."
|
||||
icon_state = "docwagon2"
|
||||
keytype = /obj/item/key/ambulance
|
||||
var/obj/structure/stool/bed/amb_trolley/bed = null
|
||||
var/obj/structure/bed/amb_trolley/bed = null
|
||||
var/datum/action/ambulance_alarm/AA
|
||||
var/datum/looping_sound/ambulance_alarm/soundloop
|
||||
|
||||
@@ -92,11 +92,11 @@
|
||||
if(bed.buckled_mob)
|
||||
bed.buckled_mob.dir = Dir
|
||||
|
||||
/obj/structure/stool/bed/amb_trolley
|
||||
/obj/structure/bed/amb_trolley
|
||||
name = "ambulance train trolley"
|
||||
icon = 'icons/vehicles/CargoTrain.dmi'
|
||||
icon_state = "ambulance"
|
||||
anchored = 0
|
||||
anchored = FALSE
|
||||
throw_pressure_limit = INFINITY //Throwing an ambulance trolley can kill the process scheduler.
|
||||
|
||||
/obj/structure/stool/bed/amb_trolley/MouseDrop(obj/over_object as obj)
|
||||
|
||||
Reference in New Issue
Block a user