Resolved merge conflicts... I hope.

This commit is contained in:
Purpose
2018-10-06 16:01:34 +01:00
184 changed files with 18696 additions and 6969 deletions
+1 -1
View File
@@ -566,7 +566,7 @@ var/global/nologevent = 0
if(!check_rights(R_SERVER,0))
message = adminscrub(message,500)
message = replacetext(message, "\n", "<br>") // required since we're putting it in a <p> tag
to_chat(world, "<span class=notice><b>[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:</b><p style='text-indent: 50px'>[message]</p></span>")
to_chat(world, "<span class='notice'><b>[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:</b><p style='text-indent: 50px'>[message]</p></span>")
log_admin("Announce: [key_name(usr)] : [message]")
feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-1
View File
@@ -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,
+3 -3
View File
@@ -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
-185
View File
@@ -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)
+13 -13
View File
@@ -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"
@@ -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")
+4 -4
View File
@@ -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'
+3 -3
View File
@@ -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)
+1 -1
View File
@@ -32,7 +32,7 @@ client/proc/one_click_antag()
if(M.stat || !M.mind || M.mind.special_role)
return FALSE
if(temp)
if(M.mind.assigned_role in temp.restricted_jobs || M.mind.assigned_role in temp.protected_jobs || M.client.prefs.species in temp.protected_species)
if((M.mind.assigned_role in temp.restricted_jobs) || (M.client.prefs.species in temp.protected_species))
return FALSE
if(role) // Don't even bother evaluating if there's no role
if(player_old_enough_antag(M.client,role) && (role in M.client.prefs.be_special) && (!jobban_isbanned(M, role)))
+14 -14
View File
@@ -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"
+7 -9
View File
@@ -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(..())
+71 -78
View File
@@ -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>
+20 -20
View File
@@ -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 //
+11 -11
View File
@@ -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
+3 -3
View File
@@ -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
+8
View File
@@ -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;
}
+497 -250
View File
@@ -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
+3 -3
View File
@@ -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!",
@@ -44,7 +44,7 @@
return
if(!user.canUnEquip(W, 0))
to_chat(user, "<span class='warning'>You can't let go of the [W]!<span>")
to_chat(user, "<span class='warning'>You can't let go of the [W]!</span>")
return
holstered = W
@@ -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
+64
View File
@@ -563,6 +563,61 @@
else
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
#define USED_MOD_HELM 1
#define USED_MOD_SUIT 2
/obj/item/fluff/pyro_wintersec_kit //DarkLordpyro: Valthorne Haliber
name = "winter sec conversion kit"
desc = "A securirty hardsuit conversion kit."
icon_state = "modkit"
w_class = WEIGHT_CLASS_SMALL
/obj/item/fluff/pyro_wintersec_kit/afterattack(atom/target, mob/user, proximity)
if(!proximity || !ishuman(user) || user.incapacitated())
return
var/mob/living/carbon/human/H = user
if(istype(target, /obj/item/clothing/head/helmet/space/hardsuit/security))
if(used & USED_MOD_HELM)
to_chat(H, "<span class='notice'>The kit's helmet modifier has already been used.</span>")
return
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
used |= USED_MOD_HELM
var/obj/item/clothing/head/helmet/space/hardsuit/security/P = target
P.name = "winterised security hardsuit helmet"
P.desc = "A rare winterised variant of the security hardsuit helmet, used on colder mining worlds for security patrols."
P.icon = 'icons/obj/custom_items.dmi'
P.icon_state = "hardsuit0-secf"
P.item_state = "hardsuit0-secf"
P.sprite_sheets = null
P.item_color = "secf"
user.update_icons()
if(P == H.head)
H.update_inv_head()
return
if(istype(target, /obj/item/clothing/suit/space/hardsuit/security))
if(used & USED_MOD_SUIT)
to_chat(user, "<span class='notice'>The kit's suit modifier has already been used.</span>")
return
to_chat(H, "<span class='notice'>You modify the appearance of [target].</span>")
used |= USED_MOD_SUIT
var/obj/item/clothing/suit/space/hardsuit/security/P = target
P.name = "winterised security hardsuit"
P.desc = "A rare winterised variant of the security hardsuit, used on colder mining worlds for securiry patrols, this one has 'Haliber' written on an ID patch located on the right side of the chest."
P.icon = 'icons/obj/custom_items.dmi'
P.icon_state = "hardsuit-secf"
P.item_state = "hardsuit-secf"
P.sprite_sheets = null
user.update_icons()
if(P == H.wear_suit)
H.update_inv_wear_suit()
return
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
//////////////////////////////////
//////////// Clothing ////////////
//////////////////////////////////
@@ -1152,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)
+1 -1
View File
@@ -80,7 +80,7 @@
if(ismob(loc))
var/mob/M = loc
M.put_in_hands(P)
to_chat(M, "<span class='notice'>Report printed. Log cleared.<span>")
to_chat(M, "<span class='notice'>Report printed. Log cleared.</span>")
// Clear the logs
log = list()
+3 -3
View File
@@ -40,7 +40,7 @@
/obj/item/deck/examine(mob/user)
..()
to_chat(user,"<span class='notice'>It contains [cards.len ? cards.len : "no"] cards</span class>")
to_chat(user,"<span class='notice'>It contains [cards.len ? cards.len : "no"] cards</span>")
/obj/item/deck/attack_hand(mob/user as mob)
draw_card(user)
@@ -317,9 +317,9 @@
/obj/item/cardhand/examine(mob/user)
..(user)
if((!concealed) && cards.len)
to_chat(user,"<span class='notice'>It contains:</span class>")
to_chat(user,"<span class='notice'>It contains:</span>")
for(var/datum/playingcard/P in cards)
to_chat(user,"<span class='notice'>the [P.name].</span class>")
to_chat(user,"<span class='notice'>the [P.name].</span>")
// Datum action here
+1 -1
View File
@@ -77,7 +77,7 @@
health -= O.force * 0.75
else
if(health <= 0)
visible_message("<span class=warning>The bookcase is smashed apart!</span>")
visible_message("<span class='warning'>The bookcase is smashed apart!</span>")
qdel(src)
return ..()
+10
View File
@@ -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()
+1 -1
View File
@@ -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)
@@ -15,8 +15,8 @@
skinned_type = /obj/item/stack/sheet/metal // Let's grind up IPCs for station resources!
eyes = "blank_eyes"
brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150%
burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall.
brute_mod = 2.5 // 100% * 2.5 * 0.66 (robolimbs) = 165%
burn_mod = 2.5 // So they take 65% extra damage from brute/burn overall.
tox_mod = 0
clone_mod = 0
oxy_mod = 0
+1 -1
View File
@@ -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)
+5 -5
View File
@@ -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 -1
View File
@@ -7,7 +7,7 @@
var/turf/T = get_turf_or_move(loc)
for(var/mob/M in viewers(T))
M.show_message("<span class=warning>[src] emits a dull beep before it loses power and collapses.</span>", 3, "<span class=warning>You hear a dull beep followed by the sound of glass crunching.</span>", 2)
M.show_message("<span class='warning'>[src] emits a dull beep before it loses power and collapses.</span>", 3, "<span class='warning'>You hear a dull beep followed by the sound of glass crunching.</span>", 2)
name = "pAI debris"
desc = "The unfortunate remains of some poor personal AI device."
icon_state = "[chassis]_dead"
+6 -6
View File
@@ -324,11 +324,11 @@
return
if(loc != card)
to_chat(src, "<span class=warning>You are already in your mobile form!</span>")
to_chat(src, "<span class='warning'>You are already in your mobile form!</span>")
return
if(world.time <= last_special)
to_chat(src, "<span class=warning>You must wait before folding your chassis out again!</span>")
to_chat(src, "<span class='warning'>You must wait before folding your chassis out again!</span>")
return
last_special = world.time + 200
@@ -336,7 +336,7 @@
//I'm not sure how much of this is necessary, but I would rather avoid issues.
force_fold_out()
visible_message("<span class=notice>[src] folds outwards, expanding into a mobile form.</span>", "<span class=notice>You fold outwards, expanding into a mobile form.</span>")
visible_message("<span class='notice'>[src] folds outwards, expanding into a mobile form.</span>", "<span class='notice'>You fold outwards, expanding into a mobile form.</span>")
/mob/living/silicon/pai/proc/force_fold_out()
if(istype(card.loc, /mob))
@@ -359,11 +359,11 @@
return
if(loc == card)
to_chat(src, "<span class=warning>You are already in your card form!</span>")
to_chat(src, "<span class='warning'>You are already in your card form!</span>")
return
if(world.time <= last_special)
to_chat(src, "<span class=warning>You must wait before returning to your card form!</span>")
to_chat(src, "<span class='warning'>You must wait before returning to your card form!</span>")
return
close_up()
@@ -494,7 +494,7 @@
if(loc == card)
return
visible_message("<span class=notice>[src] neatly folds inwards, compacting down to a rectangular card.</span>", "<span class=notice>You neatly fold inwards, compacting down to a rectangular card.</span>")
visible_message("<span class='notice'>[src] neatly folds inwards, compacting down to a rectangular card.</span>", "<span class='notice'>You neatly fold inwards, compacting down to a rectangular card.</span>")
stop_pulling()
reset_perspective(card)
@@ -281,7 +281,7 @@
grabbed_something = 1
if(grabbed_something)
to_chat(user, "<span class='notice'>You deploy your decompiler and clear out the contents of \the [T].<span>")
to_chat(user, "<span class='notice'>You deploy your decompiler and clear out the contents of \the [T].</span>")
else
to_chat(user, "<span class='warning'>Nothing on \the [T] is useful to you.</span>")
return
@@ -653,10 +653,13 @@ var/list/robot_verbs_default = list(
var/datum/robot_component/C = components[V]
if(C.installed == 1 || C.installed == -1)
removable_components += V
if(module)
removable_components += module.custom_removals
var/remove = input(user, "Which component do you want to pry out?", "Remove Component") as null|anything in removable_components
if(!remove)
return
if(module && module.handle_custom_removal(remove, user, W, params))
return
var/datum/robot_component/C = components[remove]
var/obj/item/robot_parts/robot_component/I = C.wrapped
to_chat(user, "You remove \the [I].")
@@ -15,6 +15,7 @@
var/list/stacktypes
var/channels = list()
var/list/custom_removals = list()
/obj/item/robot_module/emp_act(severity)
@@ -103,6 +104,10 @@
qdel(A)
R.module_actions.Cut()
// Return true in an overridden subtype to prevent normal removal handling
/obj/item/robot_module/proc/handle_custom_removal(component_id, mob/living/user, obj/item/W, params)
return FALSE
/obj/item/robot_module/standard
name = "standard robot module"
module_type = "Standard"
@@ -325,6 +330,7 @@
module_actions = list(
/datum/action/innate/robot_sight/meson,
)
custom_removals = list("KA modkits")
/obj/item/robot_module/miner/New()
..()
@@ -341,6 +347,13 @@
fix_modules()
/obj/item/robot_module/miner/handle_custom_removal(component_id, mob/living/user, obj/item/W, params)
if(component_id == "KA modkits")
for(var/obj/item/gun/energy/kinetic_accelerator/cyborg/D in src)
D.attackby(W, user, params)
return TRUE
return ..()
/obj/item/robot_module/deathsquad
name = "NT advanced combat module"
module_type = "Malf"
@@ -694,7 +694,7 @@
/mob/living/simple_animal/bot/mulebot/proc/RunOver(mob/living/carbon/human/H)
add_attack_logs(src, H, "Run over (DAMTYPE: [uppertext(BRUTE)])")
H.visible_message("<span class='danger'>[src] drives over [H]!</span>", \
"<span class='userdanger'>[src] drives over you!<span>")
"<span class='userdanger'>[src] drives over you!</span>")
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
var/damage = rand(5,15)
+97 -144
View File
@@ -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
@@ -78,7 +78,7 @@
to_chat(user, "<span class='warning'>[src] is wearing too much armor! You can't cause [p_them()] any damage.</span>")
visible_message("<span class='danger'> [user] hits [src] with [O], however [src] is too armored.</span>")
else
to_chat(user, "<span class='warning'>[src] is wearing too much armor! You can't reach [p_their()] skin.<span>")
to_chat(user, "<span class='warning'>[src] is wearing too much armor! You can't reach [p_their()] skin.</span>")
visible_message("[user] gently taps [src] with [O].")
if(health>0 && prob(15))
custom_emote(1, "looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression.")
@@ -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
@@ -168,11 +168,11 @@
W.ChangeTurf(/turf/simulated/floor/plating)
new /obj/item/stack/sheet/metal(src, plasmaPoopPotential)
currentlyEating = null //ffs, unstore this
src.visible_message("<span class='userdanger'>\the [src] eats \the [noms]!</span>","<span class='notice'>You eat \the [noms]!</span>","<span class=userdanger'>You hear gnashing.</span>") //inform everyone what the fucking worm is doing.
src.visible_message("<span class='userdanger'>\the [src] eats \the [noms]!</span>","<span class='notice'>You eat \the [noms]!</span>","<span class='userdanger'>You hear gnashing.</span>") //inform everyone what the fucking worm is doing.
else
currentlyEating = null
contents += noms
src.visible_message("<span class='userdanger'>\the [src] eats \the [noms]!</span>","<span class='notice'>You eat \the [noms]!</span>","<span class=userdanger'>You hear gnashing.</span>") //inform everyone what the fucking worm is doing.
src.visible_message("<span class='userdanger'>\the [src] eats \the [noms]!</span>","<span class='notice'>You eat \the [noms]!</span>","<span class='userdanger'>You hear gnashing.</span>") //inform everyone what the fucking worm is doing.
if(ismob(noms))
var/mob/M = noms //typecast because noms isn't movable
M.loc = src //because just setting a mob loc to null breaks the camera and such
@@ -331,4 +331,4 @@
/mob/living/simple_animal/hostile/spaceWorm/do_attack_animation(atom/A, visual_effect_icon, used_item, no_effect, end_pixel_y)
..()
if(previousWorm)
previousWorm.do_attack_animation(src)
previousWorm.do_attack_animation(src)
@@ -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"
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -469,7 +469,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM)
/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, title = null, atom/source = null, image/alert_overlay = null, flashwindow = TRUE, var/action = NOTIFY_JUMP) //Easy notification of ghosts.
for(var/mob/dead/observer/O in player_list)
if(O.client)
to_chat(O, "<span class='ghostalert'>[message][(enter_link) ? " [enter_link]" : ""]<span>")
to_chat(O, "<span class='ghostalert'>[message][(enter_link) ? " [enter_link]" : ""]</span>")
if(ghost_sound)
O << sound(ghost_sound)
if(flashwindow)
+4 -4
View File
@@ -361,11 +361,11 @@
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))
+1 -1
View File
@@ -6,7 +6,7 @@
return 1
var/turf/T = get_turf(nano_host())
if(!T || !is_level_reachable(T.z))
to_chat(usr, "<span class='warning'>Unable to establish a connection<span>: You're too far away from the station!")
to_chat(usr, "<span class='warning'><b>Unable to establish a connection</b>: You're too far away from the station!</span>")
return 0
if(href_list["track"])
if(isAI(usr))
+7 -7
View File
@@ -59,7 +59,7 @@
if(istype(I, /obj/item/screwdriver))
if(displayed)
playsound(src, I.usesound, 100, 1)
user.visible_message("<span class=warning>[user] unfastens \the [displayed] out of \the [src].</span>", "<span class=warning>You unfasten \the [displayed] out of \the [src].</span>")
user.visible_message("<span class='warning'>[user] unfastens \the [displayed] out of \the [src].</span>", "<span class='warning'>You unfasten \the [displayed] out of \the [src].</span>")
if(istype(displayed, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = displayed
@@ -70,10 +70,10 @@
name = initial(name)
update_icon()
else
to_chat(user, "<span class=notice>There is nothing to remove from \the [src].</span>")
to_chat(user, "<span class='notice'>There is nothing to remove from \the [src].</span>")
else if(istype(I, /obj/item/crowbar))
playsound(src, I.usesound, 100, 1)
user.visible_message("<span class=warning>[user] breaks down \the [src].</span>", "<span class=warning>You break down \the [src].</span>")
user.visible_message("<span class='warning'>[user] breaks down \the [src].</span>", "<span class='warning'>You break down \the [src].</span>")
for(var/A in contents)
if(istype(A, /obj/structure/sign/poster))
var/obj/structure/sign/poster/P = A
@@ -89,7 +89,7 @@
insert(I)
update_icon()
else
to_chat(user, "<span class=notice>\The [src] already contains \a [displayed].</span>")
to_chat(user, "<span class='notice'>\The [src] already contains \a [displayed].</span>")
else
return ..()
@@ -212,10 +212,10 @@
/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/screwdriver))
playsound(src, I.usesound, 100, 1)
user.visible_message("<span class=warning>[user] begins to unfasten \the [src] from the wall.</span>", "<span class=warning>You begin to unfasten \the [src] from the wall.</span>")
user.visible_message("<span class='warning'>[user] begins to unfasten \the [src] from the wall.</span>", "<span class='warning'>You begin to unfasten \the [src] from the wall.</span>")
if(do_after(user, 100 * I.toolspeed, target = src))
playsound(src, I.usesound, 100, 1)
user.visible_message("<span class=warning>[user] unfastens \the [src] from the wall.</span>", "<span class=warning>You unfasten \the [src] from the wall.</span>")
user.visible_message("<span class='warning'>[user] unfastens \the [src] from the wall.</span>", "<span class='warning'>You unfasten \the [src] from the wall.</span>")
frame.forceMove(user.loc)
frame = null
if(explosive)
@@ -229,7 +229,7 @@
if(!tilted)
to_chat(user, "<span class='warning'>\The [src] needs to be already tilted before being rigged with \the [I].</span>")
return 1
user.visible_message("<span class=warning>[user] is fiddling around behind \the [src].</span>", "<span class=warning>You begin to secure \the [I] behind \the [src].</span>")
user.visible_message("<span class='warning'>[user] is fiddling around behind \the [src].</span>", "<span class='warning'>You begin to secure \the [I] behind \the [src].</span>")
if(do_after(user, 150, target = src))
if(explosive || !tilted)
return
+5 -5
View File
@@ -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))
+8 -8
View File
@@ -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
+21 -21
View File
@@ -41,24 +41,24 @@
icon = "heart-o"
/datum/data/pda/utility/scanmode/medical/scan_mob(mob/living/C as mob, mob/living/user as mob)
C.visible_message("<span class=warning>[user] has analyzed [C]'s vitals!</span>")
C.visible_message("<span class='warning'>[user] has analyzed [C]'s vitals!</span>")
user.show_message("<span class=notice>Analyzing Results for [C]:</span>")
user.show_message("<span class=notice>\t Overall Status: [C.stat > 1 ? "dead" : "[C.health]% healthy"]</span>", 1)
user.show_message("<span class=notice>\t Damage Specifics: [C.getOxyLoss() > 50 ? "</span><span class=warning>" : ""][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "</span><span class=warning>" : "</span><span class=notice>"][C.getToxLoss()]-[C.getFireLoss() > 50 ? "</span><span class=warning>" : "</span><span class=notice>"][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "</span><span class=warning>" : "</span><span class=notice>"][C.getBruteLoss()]</span>", 1)
user.show_message("<span class=notice>\t Key: Suffocation/Toxin/Burns/Brute</span>", 1)
user.show_message("<span class=notice>\t Body Temperature: [C.bodytemperature-T0C]&deg;C ([C.bodytemperature*1.8-459.67]&deg;F)</span>", 1)
user.show_message("<span class='notice'>Analyzing Results for [C]:</span>")
user.show_message("<span class='notice'>\t Overall Status: [C.stat > 1 ? "dead" : "[C.health]% healthy"]</span>", 1)
user.show_message("<span class='notice'>\t Damage Specifics: [C.getOxyLoss() > 50 ? "</span><span class='warning'>" : ""][C.getOxyLoss()]-[C.getToxLoss() > 50 ? "</span><span class='warning'>" : "</span><span class='notice'>"][C.getToxLoss()]-[C.getFireLoss() > 50 ? "</span><span class='warning'>" : "</span><span class='notice'>"][C.getFireLoss()]-[C.getBruteLoss() > 50 ? "</span><span class='warning'>" : "</span><span class='notice'>"][C.getBruteLoss()]</span>", 1)
user.show_message("<span class='notice'>\t Key: Suffocation/Toxin/Burns/Brute</span>", 1)
user.show_message("<span class='notice'>\t Body Temperature: [C.bodytemperature-T0C]&deg;C ([C.bodytemperature*1.8-459.67]&deg;F)</span>", 1)
if(C.timeofdeath && (C.stat == DEAD || (C.status_flags & FAKEDEATH)))
user.show_message("<span class=notice>\t Time of Death: [station_time_timestamp("hh:mm:ss", C.timeofdeath)]</span>")
user.show_message("<span class='notice'>\t Time of Death: [station_time_timestamp("hh:mm:ss", C.timeofdeath)]</span>")
if(istype(C, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C
var/list/damaged = H.get_damaged_organs(1,1)
user.show_message("<span class=notice>Localized Damage, Brute/Burn:</span>",1)
user.show_message("<span class='notice'>Localized Damage, Brute/Burn:</span>",1)
if(length(damaged)>0)
for(var/obj/item/organ/external/org in damaged)
user.show_message("<span class=notice>\t [capitalize(org.name)]: [org.brute_dam > 0 ? "<span class=warning>[org.brute_dam]</span>" : "0"]-[org.burn_dam > 0 ? "<span class=warning>[org.burn_dam]</span>" : "0"]", 1)
user.show_message("<span class='notice'>\t [capitalize(org.name)]: [org.brute_dam > 0 ? "<span class='warning'>[org.brute_dam]</span>" : "0"]-[org.burn_dam > 0 ? "<span class='warning'>[org.burn_dam]</span>" : "0"]", 1)
else
user.show_message("<span class=notice>\t Limbs are OK.",1)
user.show_message("<span class='notice'>\t Limbs are OK.",1)
/datum/data/pda/utility/scanmode/dna
base_name = "DNA Scanner"
@@ -68,9 +68,9 @@
if(istype(C, /mob/living/carbon/human))
var/mob/living/carbon/human/H = C
if(!istype(H.dna, /datum/dna))
to_chat(user, "<span class=notice>No fingerprints found on [H]</span>")
to_chat(user, "<span class='notice'>No fingerprints found on [H]</span>")
else
to_chat(user, "<span class=notice>[H]'s Fingerprints: [md5(H.dna.uni_identity)]</span>")
to_chat(user, "<span class='notice'>[H]'s Fingerprints: [md5(H.dna.uni_identity)]</span>")
scan_blood(C, user)
/datum/data/pda/utility/scanmode/dna/scan_atom(atom/A as mob|obj|turf|area, mob/user as mob)
@@ -78,27 +78,27 @@
/datum/data/pda/utility/scanmode/dna/proc/scan_blood(atom/A, mob/user)
if(!A.blood_DNA)
to_chat(user, "<span class=notice>No blood found on [A]</span>")
to_chat(user, "<span class='notice'>No blood found on [A]</span>")
if(A.blood_DNA)
qdel(A.blood_DNA)
else
to_chat(user, "<span class=notice>Blood found on [A]. Analysing...</span>")
to_chat(user, "<span class='notice'>Blood found on [A]. Analysing...</span>")
spawn(15)
for(var/blood in A.blood_DNA)
to_chat(user, "<span class=notice>Blood type: [A.blood_DNA[blood]]\nDNA: [blood]</span>")
to_chat(user, "<span class='notice'>Blood type: [A.blood_DNA[blood]]\nDNA: [blood]</span>")
/datum/data/pda/utility/scanmode/halogen
base_name = "Halogen Counter"
icon = "exclamation-circle"
/datum/data/pda/utility/scanmode/halogen/scan_mob(mob/living/C as mob, mob/living/user as mob)
C.visible_message("<span class=warning>[user] has analyzed [C]'s radiation levels!</span>")
C.visible_message("<span class='warning'>[user] has analyzed [C]'s radiation levels!</span>")
user.show_message("<span class=notice>Analyzing Results for [C]:</span>")
user.show_message("<span class='notice'>Analyzing Results for [C]:</span>")
if(C.radiation)
user.show_message("<span class=notice>Radiation Level: [C.radiation > 0 ? "</span><span class=danger>[C.radiation]" : "0"]</span>")
user.show_message("<span class='notice'>Radiation Level: [C.radiation > 0 ? "</span><span class='danger'>[C.radiation]" : "0"]</span>")
else
user.show_message("<span class=notice>No radiation detected.</span>")
user.show_message("<span class='notice'>No radiation detected.</span>")
/datum/data/pda/utility/scanmode/reagent
base_name = "Reagent Scanner"
@@ -194,7 +194,7 @@
// notehtml ISN'T set to allow user to get their old notes back. A better implementation would add a "scanned documents"
// feature to the PDA, which would better convey the availability of the feature, but this will work for now.
// Inform the user
to_chat(user, "<span class=notice>Paper scanned and OCRed to notekeeper.</span>")//concept of scanning paper copyright brainoblivion 2009
to_chat(user, "<span class='notice'>Paper scanned and OCRed to notekeeper.</span>")//concept of scanning paper copyright brainoblivion 2009
else
to_chat(user, "<span class=warning>Error scanning [A].</span>")
to_chat(user, "<span class='warning'>Error scanning [A].</span>")
+1 -2
View File
@@ -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
+4 -3
View File
@@ -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
+6 -4
View File
@@ -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
+2 -2
View File
@@ -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)
+3 -3
View File
@@ -58,11 +58,11 @@
/obj/item/gun/dartgun/examine(mob/user)
if(..(user, 2))
if(beakers.len)
to_chat(user, "<span class='notice>[src] contains:</span>")
to_chat(user, "<span class='notice'>[src] contains:</span>")
for(var/obj/item/reagent_containers/glass/beaker/B in beakers)
if(B.reagents && B.reagents.reagent_list.len)
for(var/datum/reagent/R in B.reagents.reagent_list)
to_chat(user, "<span class='notice>[R.volume] units of [R.name]</span>")
to_chat(user, "<span class='notice'>[R.volume] units of [R.name]</span>")
/obj/item/gun/dartgun/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I, /obj/item/dart_cartridge))
@@ -99,7 +99,7 @@
return
B.forceMove(src)
beakers += B
to_chat(user, "<span class='notice>You slot [B] into [src].</span>")
to_chat(user, "<span class='notice'>You slot [B] into [src].</span>")
src.updateUsrDialog()
/obj/item/gun/dartgun/can_shoot()
@@ -124,7 +124,7 @@
if(!suppressed)
playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
else if(isliving(loc))
to_chat(loc, "<span class='warning'>[src] silently charges up.<span>")
to_chat(loc, "<span class='warning'>[src] silently charges up.</span>")
update_icon()
overheat = FALSE
+2 -2
View File
@@ -27,7 +27,7 @@
if(no_den_usage)
var/area/A = get_area(user)
if(istype(A, /area/wizard_station))
to_chat(user, "<span class='warning'>You know better than to violate the security of The Den, best wait until you leave to use [src].<span>")
to_chat(user, "<span class='warning'>You know better than to violate the security of The Den, best wait until you leave to use [src].</span>")
return
else
no_den_usage = 0
@@ -72,7 +72,7 @@
return
/obj/item/gun/magic/shoot_with_empty_chamber(mob/living/user as mob|obj)
to_chat(user, "<span class='warning'>The [name] whizzles quietly.<span>")
to_chat(user, "<span class='warning'>The [name] whizzles quietly.</span>")
return
/obj/item/gun/magic/suicide_act(mob/user)
+1 -1
View File
@@ -38,7 +38,7 @@
if(no_den_usage)
var/area/A = get_area(user)
if(istype(A, /area/wizard_station))
to_chat(user, "<span class='warning'>You know better than to violate the security of The Den, best wait until you leave to use [src].<span>")
to_chat(user, "<span class='warning'>You know better than to violate the security of The Den, best wait until you leave to use [src].</span>")
return
else
no_den_usage = 0
@@ -397,7 +397,7 @@
if(13 to INFINITY)
to_chat(M, "<span class = 'danger'>You suddenly ignite in a holy fire!</span>")
for(var/mob/O in viewers(M, null))
O.show_message(text("<span class = 'danger'>[] suddenly bursts into flames!<span>", M), 1)
O.show_message(text("<span class = 'danger'>[] suddenly bursts into flames!</span>", M), 1)
M.fire_stacks = min(5,M.fire_stacks + 3)
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
M.adjustFireLoss(3) //Hence the other damages... ain't I a bastard?
@@ -513,4 +513,4 @@
if(istype(O, /obj/item/clothing/shoes/galoshes))
var/t_loc = get_turf(O)
qdel(O)
new /obj/item/clothing/shoes/galoshes/dry(t_loc)
new /obj/item/clothing/shoes/galoshes/dry(t_loc)
@@ -52,7 +52,7 @@
/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
holder.my_atom.visible_message("<span class='warning>The solution spews out a metalic foam!</span>")
holder.my_atom.visible_message("<span class='warning'>The solution spews out a metalic foam!</span>")
var/datum/effect_system/foam_spread/s = new()
s.set_up(created_volume, location, holder, MFOAM_IRON)
@@ -480,4 +480,4 @@
if(B && B.data)
var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"]
if(D)
D.Devolve()
D.Devolve()
+1 -1
View File
@@ -377,7 +377,7 @@
found = 1
break
if(!found)
to_chat(usr, "<span class=notice>[bicon(src)] The conveyor switch did not detect any linked conveyor belts in range.</span>")
to_chat(usr, "<span class='notice'>[bicon(src)] The conveyor switch did not detect any linked conveyor belts in range.</span>")
return
var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id)
transfer_fingerprints_to(NC)
+12 -14
View File
@@ -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)
+12 -7
View File
@@ -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)
+3 -5
View File
@@ -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
+34 -34
View File
@@ -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
+22 -22
View File
@@ -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)
+7 -7
View File
@@ -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
View File
@@ -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)
+1 -1
View File
@@ -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()
+9 -9
View File
@@ -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()
@@ -87,10 +87,10 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/
to_chat(user, "<span clas='warning'>Plants needs to be ready to harvest to perform full data scan.</span>") //Because space dna is actually magic
return
if(plants[H.myseed.type])
to_chat(user, "<span class='notice'>Plant data already present in local storage.<span>")
to_chat(user, "<span class='notice'>Plant data already present in local storage.</span>")
return
plants[H.myseed.type] = 1
to_chat(user, "<span class='notice'>Plant data added to local storage.<span>")
to_chat(user, "<span class='notice'>Plant data added to local storage.</span>")
//animals
if(isanimal(target) || is_type_in_typecache(target, non_simple_animals))
@@ -100,19 +100,19 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/
to_chat(user, "<span class='warning'>No compatible DNA detected</span>")
return
if(animals[target.type])
to_chat(user, "<span class='notice'>Animal data already present in local storage.<span>")
to_chat(user, "<span class='notice'>Animal data already present in local storage.</span>")
return
animals[target.type] = 1
to_chat(user, "<span class='notice'>Animal data added to local storage.<span>")
to_chat(user, "<span class='notice'>Animal data added to local storage.</span>")
//humans
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(dna[H.dna.uni_identity])
to_chat(user, "<span class='notice'>Humanoid data already present in local storage.<span>")
to_chat(user, "<span class='notice'>Humanoid data already present in local storage.</span>")
return
dna[H.dna.uni_identity] = 1
to_chat(user, "<span class='notice'>Humanoid data added to local storage.<span>")
to_chat(user, "<span class='notice'>Humanoid data added to local storage.</span>")
/obj/item/circuitboard/machine/dna_vault
@@ -301,4 +301,4 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/
/obj/machinery/dna_vault/proc/grant_power(mob/living/carbon/human/H, block, power)
H.dna.SetSEState(block, 1, 1)
H.mutations |= power
genemutcheck(H, block, null, MUTCHK_FORCED)
genemutcheck(H, block, null, MUTCHK_FORCED)
+2 -2
View File
@@ -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()
-2
View File
@@ -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)
+2 -2
View File
@@ -26,7 +26,7 @@
/obj/item/ore/bluespace_crystal/proc/blink_mob(var/mob/living/L)
if(!is_teleport_allowed(L.z))
src.visible_message("<span class=warning>[src]'s fragments begin rapidly vibrating and blink out of existence.<span>")
src.visible_message("<span class='warning'>[src]'s fragments begin rapidly vibrating and blink out of existence.</span>")
qdel(src)
return
do_teleport(L, get_turf(L), blink_range, asoundin = 'sound/effects/phasein.ogg')
@@ -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"