mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-20 10:37:17 +01:00
Merge remote-tracking branch 'upstream/master' into fix-cqc
# Conflicts: # code/game/objects/items.dm
This commit is contained in:
@@ -28,6 +28,11 @@ var/global/nologevent = 0
|
||||
if(C.prefs && !(C.prefs.toggles & CHAT_NO_TICKETLOGS))
|
||||
to_chat(C, msg)
|
||||
|
||||
/proc/message_mentorTicket(var/msg)
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(check_rights(R_ADMIN | R_MENTOR | R_MOD, 0, C.mob))
|
||||
if(C.prefs && !(C.prefs.toggles & CHAT_NO_MENTORTICKETLOGS))
|
||||
to_chat(C, msg)
|
||||
|
||||
/proc/admin_ban_mobsearch(var/mob/M, var/ckey_to_find, var/mob/admin_to_notify)
|
||||
if(!M || !M.ckey)
|
||||
@@ -62,7 +67,7 @@ var/global/nologevent = 0
|
||||
if(M.client)
|
||||
body += " played by <b>[M.client]</b> "
|
||||
body += "\[<A href='?_src_=holder;editrights=rank;ckey=[M.ckey]'>[M.client.holder ? M.client.holder.rank : "Player"]</A>\] "
|
||||
body += "\[<A href='?_src_=holder;getplaytimewindow=[M.UID()]'>" + M.client.get_exp_living() + "</a>\]"
|
||||
body += "\[<A href='?_src_=holder;getplaytimewindow=[M.UID()]'>" + M.client.get_exp_type(EXP_TYPE_CREW) + " as [EXP_TYPE_CREW]</a>\]"
|
||||
|
||||
if(istype(M, /mob/new_player))
|
||||
body += " <B>Hasn't Entered Game</B> "
|
||||
@@ -316,7 +321,7 @@ var/global/nologevent = 0
|
||||
if(CHANNEL.is_admin_channel)
|
||||
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen'><A href='?src=[UID()];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A></FONT></B><BR>"
|
||||
else
|
||||
dat+="<B><A href='?src=[UID()];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR></B>"
|
||||
dat+="<B><A href='?src=[UID()];ac_show_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR></B>"
|
||||
dat+={"<BR><HR><A href='?src=[UID()];ac_refresh=1'>Refresh</A>
|
||||
<BR><A href='?src=[UID()];ac_setScreen=[0]'>Back</A>
|
||||
"}
|
||||
@@ -400,7 +405,7 @@ var/global/nologevent = 0
|
||||
dat+="<I>No feed channels found active...</I><BR>"
|
||||
else
|
||||
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
|
||||
dat+="<A href='?src=[UID()];ac_pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
|
||||
dat+="<A href='?src=[UID()];ac_pick_censor_channel=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR>"
|
||||
dat+="<BR><A href='?src=[UID()];ac_setScreen=[0]'>Cancel</A>"
|
||||
if(11)
|
||||
dat+={"
|
||||
@@ -413,7 +418,7 @@ var/global/nologevent = 0
|
||||
dat+="<I>No feed channels found active...</I><BR>"
|
||||
else
|
||||
for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
|
||||
dat+="<A href='?src=[UID()];ac_pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ()]<BR>"
|
||||
dat+="<A href='?src=[UID()];ac_pick_d_notice=\ref[CHANNEL]'>[CHANNEL.channel_name]</A> [(CHANNEL.censored) ? ("<FONT COLOR='red'>***</FONT>") : ""]<BR>"
|
||||
|
||||
dat+="<BR><A href='?src=[UID()];ac_setScreen=[0]'>Back</A>"
|
||||
if(12)
|
||||
@@ -671,6 +676,9 @@ var/global/nologevent = 0
|
||||
alert("Unable to start the game as it is not set up.")
|
||||
return
|
||||
if(ticker.current_state == GAME_STATE_PREGAME)
|
||||
if(config.start_now_confirmation)
|
||||
if(alert(usr, "This is a live server. Are you sure you want to start now?", "Start game", "Yes", "No") != "Yes")
|
||||
return
|
||||
ticker.current_state = GAME_STATE_SETTING_UP
|
||||
log_admin("[key_name(usr)] has started the game.")
|
||||
message_admins("[key_name_admin(usr)] has started the game.")
|
||||
@@ -1067,3 +1075,28 @@ var/gamma_ship_location = 1 // 0 = station , 1 = space
|
||||
continue
|
||||
result[1]++
|
||||
return result
|
||||
|
||||
//Discord duplications
|
||||
/datum/admins/proc/discord_duplicates()
|
||||
if(!usr.client.holder)
|
||||
return
|
||||
var/dat = "<html><head><title>Discord Duplicates</title></head>"
|
||||
dat += "<body><p><i>Discord IDs with more than one ckey linked are shown below</i></i><table border=1 cellspacing=5><B><tr><th>Discord ID</th><th>CKEYs</th><th>Unlink</th></B>"
|
||||
// If anyone reads this, I spent a whole 30 minutes writing just this fucking query. It is the messiest SQL statement I have ever written
|
||||
// If anyone even thinks about touching this I will impale you on a railroad spike
|
||||
// It hurts to wake up in the morning, -aa07
|
||||
var/DBQuery/discord_ids = dbcon.NewQuery("SELECT a.* FROM [format_table_name("discord")] a JOIN (SELECT discord_id, ckey, COUNT(*) FROM [format_table_name("discord")] GROUP BY discord_id HAVING count(*) > 1 ) b ON a.discord_id = b.discord_id ORDER BY a.discord_id")
|
||||
if(!discord_ids.Execute())
|
||||
var/err = discord_ids.ErrorMsg()
|
||||
log_game("SQL ERROR while selecting discord accounts. Error : \[[err]\]\n")
|
||||
return
|
||||
while(discord_ids.NextRow())
|
||||
var/ckey = discord_ids.item[1]
|
||||
var/id = discord_ids.item[2]
|
||||
dat += "<tr><td><b>" + id + "</b></td>"
|
||||
dat += "<td>" + ckey + "</td>"
|
||||
dat += "<td><a href='?src=[UID()];force_discord_unlink=[ckey]'>Unlink</td></tr>"
|
||||
|
||||
dat += "</table></body></html>"
|
||||
|
||||
usr << browse(dat, "window=duplicates;size=500x480")
|
||||
@@ -2,7 +2,8 @@
|
||||
var/list/admin_verbs_default = list(
|
||||
/client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/
|
||||
/client/proc/hide_verbs, /*hides all our adminverbs*/
|
||||
/client/proc/toggleadminhelpsound, /*toggles whether we hear bwoinks*/
|
||||
/client/proc/toggleadminhelpsound,
|
||||
/client/proc/togglementorhelpsound,
|
||||
/client/proc/cmd_mentor_check_new_players,
|
||||
/client/proc/cmd_mentor_check_player_exp /* shows players by playtime */
|
||||
)
|
||||
@@ -78,6 +79,7 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/list_ssds,
|
||||
/client/proc/cmd_admin_headset_message,
|
||||
/client/proc/spawn_floor_cluwne,
|
||||
/client/proc/show_discord_duplicates,
|
||||
)
|
||||
var/list/admin_verbs_ban = list(
|
||||
/client/proc/unban_panel,
|
||||
@@ -203,6 +205,8 @@ var/list/admin_verbs_mentor = list(
|
||||
/client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/
|
||||
/client/proc/cmd_admin_pm_panel, /*admin-pm list*/
|
||||
/client/proc/cmd_admin_pm_by_key_panel, /*admin-pm list by key*/
|
||||
/client/proc/openMentorTicketUI,
|
||||
/client/proc/toggleMentorTicketLogs,
|
||||
/client/proc/cmd_mentor_say /* mentor say*/
|
||||
// cmd_mentor_say is added/removed by the toggle_mentor_chat verb
|
||||
)
|
||||
@@ -217,10 +221,10 @@ var/list/admin_verbs_snpc = list(
|
||||
/client/proc/hide_snpc_verbs
|
||||
)
|
||||
var/list/admin_verbs_ticket = list(
|
||||
/client/proc/openTicketUI,
|
||||
/client/proc/openAdminTicketUI,
|
||||
/client/proc/toggleticketlogs,
|
||||
/client/proc/resolveAllTickets,
|
||||
/client/proc/openUserUI
|
||||
/client/proc/resolveAllAdminTickets,
|
||||
/client/proc/resolveAllMentorTickets
|
||||
)
|
||||
|
||||
/client/proc/on_holder_add()
|
||||
@@ -938,6 +942,20 @@ var/list/admin_verbs_ticket = list(
|
||||
else
|
||||
to_chat(usr, "You now will get admin log messages.")
|
||||
|
||||
/client/proc/toggleMentorTicketLogs()
|
||||
set name = "Toggle Mentor Ticket Messgaes"
|
||||
set category = "Preferences"
|
||||
|
||||
if(!check_rights(R_MENTOR))
|
||||
return
|
||||
|
||||
prefs.toggles ^= CHAT_NO_MENTORTICKETLOGS
|
||||
prefs.save_preferences(src)
|
||||
if(prefs.toggles & CHAT_NO_MENTORTICKETLOGS)
|
||||
to_chat(usr, "You now won't get mentor ticket messages.")
|
||||
else
|
||||
to_chat(usr, "You now will get mentor ticket messages.")
|
||||
|
||||
/client/proc/toggleticketlogs()
|
||||
set name = "Toggle Admin Ticket Messgaes"
|
||||
set category = "Preferences"
|
||||
@@ -987,7 +1005,7 @@ var/list/admin_verbs_ticket = list(
|
||||
|
||||
to_chat(T, "<span class='notice'><b><font size=3>Man up and deal with it.</font></b></span>")
|
||||
to_chat(T, "<span class='notice'>Move on.</span>")
|
||||
T << 'sound/voice/ManUp1.ogg'
|
||||
T << 'sound/voice/manup1.ogg'
|
||||
|
||||
log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.")
|
||||
message_admins("[key_name_admin(usr)] told [key_name(T)] to man up and deal with it.")
|
||||
@@ -1005,7 +1023,7 @@ var/list/admin_verbs_ticket = list(
|
||||
if(confirm == "Yes")
|
||||
for(var/mob/T as mob in GLOB.mob_list)
|
||||
to_chat(T, "<br><center><span class='notice'><b><font size=4>Man up.<br> Deal with it.</font></b><br>Move on.</span></center><br>")
|
||||
T << 'sound/voice/ManUp1.ogg'
|
||||
T << 'sound/voice/manup1.ogg'
|
||||
|
||||
log_admin("[key_name(usr)] told everyone to man up and deal with it.")
|
||||
message_admins("[key_name_admin(usr)] told everyone to man up and deal with it.")
|
||||
@@ -1044,3 +1062,12 @@ var/list/admin_verbs_ticket = list(
|
||||
|
||||
log_admin("[key_name(usr)] has [advanced_admin_interaction ? "activated" : "deactivated"] their advanced admin interaction.")
|
||||
message_admins("[key_name_admin(usr)] has [advanced_admin_interaction ? "activated" : "deactivated"] their advanced admin interaction.")
|
||||
|
||||
/client/proc/show_discord_duplicates()
|
||||
set name = "Show Duplicate Discord Links"
|
||||
set category = "Admin"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
holder.discord_duplicates()
|
||||
@@ -477,6 +477,9 @@
|
||||
else
|
||||
dat += "<tr><td><i>Blob not found!</i></td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
if(ticker.mode.blob_overminds.len)
|
||||
dat += check_role_table("Blob Overminds", ticker.mode.blob_overminds)
|
||||
|
||||
if(ticker.mode.changelings.len)
|
||||
dat += check_role_table("Changelings", ticker.mode.changelings)
|
||||
@@ -519,6 +522,9 @@
|
||||
if(ticker.mode.vampire_enthralled.len)
|
||||
dat += check_role_table("Vampire Thralls", ticker.mode.vampire_enthralled)
|
||||
|
||||
if(ticker.mode.devils.len)
|
||||
dat += check_role_table("Devils", ticker.mode.devils)
|
||||
|
||||
if(ticker.mode.xenos.len)
|
||||
dat += check_role_table("Xenos", ticker.mode.xenos)
|
||||
|
||||
@@ -531,6 +537,9 @@
|
||||
if(ticker.mode.greyshirts.len)
|
||||
dat += check_role_table("Greyshirts", ticker.mode.greyshirts)
|
||||
|
||||
if(ticker.mode.eventmiscs.len)
|
||||
dat += check_role_table("Event Roles", ticker.mode.eventmiscs)
|
||||
|
||||
if(ts_spiderlist.len)
|
||||
var/list/spider_minds = list()
|
||||
for(var/mob/living/simple_animal/hostile/poison/terror_spider/S in ts_spiderlist)
|
||||
@@ -539,6 +548,16 @@
|
||||
if(spider_minds.len)
|
||||
dat += check_role_table("Terror Spiders", spider_minds)
|
||||
|
||||
var/count_eggs = 0
|
||||
var/count_spiderlings = 0
|
||||
for(var/obj/structure/spider/eggcluster/terror_eggcluster/E in ts_egg_list)
|
||||
if(is_station_level(E.z))
|
||||
count_eggs += E.spiderling_number
|
||||
for(var/obj/structure/spider/spiderling/terror_spiderling/L in ts_spiderling_list)
|
||||
if(!L.stillborn && is_station_level(L.z))
|
||||
count_spiderlings += 1
|
||||
dat += "<table cellspacing=5><TR><TD>Growing TS on-station: [count_eggs] egg[count_eggs != 1 ? "s" : ""], [count_spiderlings] spiderling[count_spiderlings != 1 ? "s" : ""]. </TD></TR></TABLE>"
|
||||
|
||||
if(ticker.mode.ert.len)
|
||||
dat += check_role_table("ERT", ticker.mode.ert)
|
||||
|
||||
|
||||
@@ -113,7 +113,9 @@
|
||||
<A href='?src=[UID()];secretsfun=schoolgirl'>Japanese Animes Mode</A>
|
||||
<A href='?src=[UID()];secretsfun=eagles'>Egalitarian Station Mode</A><BR>
|
||||
<A href='?src=[UID()];secretsfun=guns'>Summon Guns</A>
|
||||
<A href='?src=[UID()];secretsfun=magic'>Summon Magic</A>
|
||||
<A href='?src=[UID()];secretsfun=magic'>Summon Magic</A>
|
||||
<A href='?src=[UID()];secretsfun=revolver'>Summon Revolver Duel</A>
|
||||
<A href='?src=[UID()];secretsfun=fakerevolver'>Summon Suicidal Revolver Duel</A>
|
||||
<BR>
|
||||
<A href='?src=[UID()];secretsfun=rolldice'>Roll the Dice</A><BR>
|
||||
<BR>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
//Verbs
|
||||
|
||||
/client/proc/openTicketUI()
|
||||
/client/proc/openAdminTicketUI()
|
||||
|
||||
set name = "Open Ticket Interface"
|
||||
set name = "Open Admin Ticket Interface"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
@@ -10,8 +10,8 @@
|
||||
|
||||
SStickets.showUI(usr)
|
||||
|
||||
/client/proc/resolveAllTickets()
|
||||
set name = "Resolve All Open Tickets"
|
||||
/client/proc/resolveAllAdminTickets()
|
||||
set name = "Resolve All Open Admin Tickets"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
@@ -22,12 +22,7 @@
|
||||
|
||||
SStickets.resolveAllOpenTickets()
|
||||
|
||||
/client/proc/openUserUI()
|
||||
|
||||
set name = "My Tickets"
|
||||
/client/verb/openAdminUserUI()
|
||||
set name = "My Admin Tickets"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
SStickets.userDetailUI(usr)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
//Verbs
|
||||
|
||||
/client/proc/openMentorTicketUI()
|
||||
|
||||
set name = "Open Mentor Ticket Interface"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder || !check_rights(R_MENTOR))
|
||||
return
|
||||
|
||||
SSmentor_tickets.showUI(usr)
|
||||
|
||||
/client/proc/resolveAllMentorTickets()
|
||||
set name = "Resolve All Open Mentor Tickets"
|
||||
set category = "Admin"
|
||||
|
||||
if(!holder || !check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes")
|
||||
return
|
||||
|
||||
SSmentor_tickets.resolveAllOpenTickets()
|
||||
|
||||
/client/verb/openMentorUserUI()
|
||||
set name = "My Mentor Tickets"
|
||||
set category = "Admin"
|
||||
SSmentor_tickets.userDetailUI(usr)
|
||||
+45
-25
@@ -32,6 +32,12 @@
|
||||
var/ticketID = text2num(href_list["openadminticket"])
|
||||
SStickets.showDetailUI(usr, ticketID)
|
||||
|
||||
if(href_list["openmentorticket"])
|
||||
if(!check_rights(R_MENTOR|R_MOD|R_ADMIN))
|
||||
return
|
||||
var/ticketID = text2num(href_list["openmentorticket"])
|
||||
SSmentor_tickets.showDetailUI(usr, ticketID)
|
||||
|
||||
if(href_list["stickyban"])
|
||||
stickyban(href_list["stickyban"],href_list)
|
||||
|
||||
@@ -1546,22 +1552,13 @@
|
||||
check_antagonists()
|
||||
|
||||
else if(href_list["take_question"])
|
||||
var/mob/M = locateUID(href_list["take_question"])
|
||||
var/is_mhelp = href_list["is_mhelp"]
|
||||
if(ismob(M))
|
||||
var/helptype = "ADMINHELP"
|
||||
if(is_mhelp)
|
||||
helptype = "MENTORHELP"
|
||||
var/take_msg = "<span class='notice'><b>[helptype]</b>: <b>[key_name_hidden(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> question.</span>"
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(check_rights(R_ADMIN, 0, X.mob))
|
||||
to_chat(X, take_msg)
|
||||
else if(is_mhelp && check_rights(R_MOD|R_MENTOR, 0, X.mob))
|
||||
to_chat(X, take_msg)
|
||||
to_chat(M, "<span class='notice'><b>Your question is being attended to by [key_name_hidden(usr.client, null, 0)]. Thanks for your patience!</b></span>")
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>Unable to locate mob.</span>")
|
||||
|
||||
var/index = text2num(href_list["take_question"])
|
||||
|
||||
if(href_list["is_mhelp"])
|
||||
SSmentor_tickets.takeTicket(index)
|
||||
else //Ahelp
|
||||
SStickets.takeTicket(index)
|
||||
|
||||
else if(href_list["cult_nextobj"])
|
||||
if(alert(usr, "Validate the current Cult objective and unlock the next one?", "Cult Cheat Code", "Yes", "No") != "Yes")
|
||||
return
|
||||
@@ -1812,16 +1809,17 @@
|
||||
var/petchoice = input("Select pet type", "Pets") as null|anything in pets
|
||||
if(isnull(petchoice))
|
||||
return
|
||||
var/mob/living/simple_animal/pet/P = new petchoice(H.loc)
|
||||
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [P], pet of [H]?", poll_time = 200, min_hours = 10)
|
||||
var/list/mob/dead/observer/candidates = pollCandidates("Play as the special event pet [H]?", poll_time = 200, min_hours = 10)
|
||||
var/mob/dead/observer/theghost = null
|
||||
if(candidates.len)
|
||||
var/mob/living/simple_animal/pet/P = new petchoice(H.loc)
|
||||
theghost = pick(candidates)
|
||||
P.key = theghost.key
|
||||
P.master_commander = H
|
||||
P.universal_speak = 1
|
||||
P.universal_understand = 1
|
||||
P.can_collar = 1
|
||||
P.faction = list("neutral")
|
||||
var/obj/item/clothing/accessory/petcollar/C = new /obj/item/clothing/accessory/petcollar(P)
|
||||
P.collar = C
|
||||
C.equipped(P)
|
||||
@@ -1833,15 +1831,15 @@
|
||||
D.assignment = "Pet"
|
||||
C.access_id = D
|
||||
spawn(30)
|
||||
var/newname = sanitize(copytext(input(P, "You are [P], pet of [H]. Would you like to change your name to something else?", "Name change", P.name) as null|text,1,MAX_NAME_LEN))
|
||||
var/newname = sanitize(copytext(input(P, "You are [P], special event pet of [H]. Change your name to something else?", "Name change", P.name) as null|text,1,MAX_NAME_LEN))
|
||||
if(newname && newname != P.name)
|
||||
P.name = newname
|
||||
if(P.mind)
|
||||
P.mind.name = newname
|
||||
logmsg = "pet ([P])."
|
||||
else
|
||||
to_chat(usr, "<span class='warning'>WARNING: Nobody volunteered to play [P].</span>")
|
||||
qdel(P)
|
||||
logmsg = "pet ([P])."
|
||||
to_chat(usr, "<span class='warning'>WARNING: Nobody volunteered to play the special event pet.</span>")
|
||||
logmsg = "pet (no volunteers)."
|
||||
if("Human Protector")
|
||||
usr.client.create_eventmob_for(H, 0)
|
||||
logmsg = "syndie protector."
|
||||
@@ -1889,7 +1887,7 @@
|
||||
switch(punishment)
|
||||
if("Lightning bolt")
|
||||
M.electrocute_act(5, "Lightning Bolt", safety=1)
|
||||
playsound(get_turf(M), 'sound/magic/LightningShock.ogg', 50, 1, -1)
|
||||
playsound(get_turf(M), 'sound/magic/lightningshock.ogg', 50, 1, -1)
|
||||
M.adjustFireLoss(75)
|
||||
M.Weaken(5)
|
||||
to_chat(M, "<span class='userdanger'>The gods have punished you for your sins!</span>")
|
||||
@@ -2842,11 +2840,19 @@
|
||||
if("guns")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SG")
|
||||
usr.rightandwrong(0)
|
||||
usr.rightandwrong(FALSE)
|
||||
if("magic")
|
||||
feedback_inc("admin_secrets_fun_used",1)
|
||||
feedback_add_details("admin_secrets_fun_used","SM")
|
||||
usr.rightandwrong(1)
|
||||
usr.rightandwrong(TRUE)
|
||||
if("revolver")
|
||||
feedback_inc("admin_secrets_fun_used", 1)
|
||||
feedback_add_details("admin_secrets_fun_used", "SRD")
|
||||
usr.rightandwrong(FALSE, revolver_fight = TRUE)
|
||||
if("fakerevolver")
|
||||
feedback_inc("admin_secrets_fun_used", 1)
|
||||
feedback_add_details("admin_secrets_fun_used", "SFD")
|
||||
usr.rightandwrong(FALSE, fake_revolver_fight = TRUE)
|
||||
if("tdomereset")
|
||||
var/delete_mobs = alert("Clear all mobs?","Confirm","Yes","No","Cancel")
|
||||
if(delete_mobs == "Cancel")
|
||||
@@ -3348,6 +3354,20 @@
|
||||
// Refresh the page
|
||||
src.view_flagged_books()
|
||||
|
||||
// Force unlink a discord key
|
||||
else if(href_list["force_discord_unlink"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/target_ckey = href_list["force_discord_unlink"]
|
||||
var/DBQuery/admin_unlink_discord_id = dbcon.NewQuery("DELETE FROM [format_table_name("discord")] WHERE ckey = '[target_ckey]'")
|
||||
if(!admin_unlink_discord_id.Execute())
|
||||
var/err = admin_unlink_discord_id.ErrorMsg()
|
||||
log_game("SQL ERROR while admin-unlinking discord account. Error : \[[err]\]\n")
|
||||
return
|
||||
to_chat(src, "<span class='notice'>Successfully forcefully unlinked discord account from [target_ckey]</span>")
|
||||
message_admins("[key_name_admin(usr)] forcefully unlinked the discord account belonging to [target_ckey]")
|
||||
log_admin("[key_name_admin(usr)] forcefully unlinked the discord account belonging to [target_ckey]")
|
||||
|
||||
/client/proc/create_eventmob_for(var/mob/living/carbon/human/H, var/killthem = 0)
|
||||
if(!check_rights(R_EVENT))
|
||||
return
|
||||
|
||||
@@ -103,31 +103,46 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
|
||||
if(check_rights(R_MENTOR, 0, X.mob))
|
||||
mentorholders += X
|
||||
continue
|
||||
var/ticketNum // Holder for the ticket number
|
||||
var/prunedmsg ="[src]: [msg]" // Message without links
|
||||
var/datum/ticket/T
|
||||
var/isMhelp = selected_type == "Mentorhelp"
|
||||
var/span
|
||||
if(isMhelp)
|
||||
span = "<span class='mentorhelp'>"
|
||||
if(SSmentor_tickets.checkForOpenTicket(src)) // If user already has an open ticket
|
||||
T = SSmentor_tickets.checkForOpenTicket(src)
|
||||
else
|
||||
ticketNum = SSmentor_tickets.getTicketCounter() // ticketNum is the ticket ready to be assigned.
|
||||
else //Ahelp
|
||||
span = "<span class='adminhelp'>"
|
||||
if(SStickets.checkForOpenTicket(src)) // If user already has an open ticket
|
||||
T = SStickets.checkForOpenTicket(src) // Make T equal to the ticket they have open
|
||||
else
|
||||
ticketNum = SStickets.getTicketCounter() // ticketNum is the ticket ready to be assigned.
|
||||
|
||||
if(T)
|
||||
ticketNum = T.ticketNum // ticketNum is the number of their ticket.
|
||||
T.addResponse(src, msg)
|
||||
|
||||
msg = "[span][selected_type]: </span><span class='boldnotice'>[key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;[isMhelp ? "openmentorticket" : "openadminticket"]=[ticketNum]'>TICKET</A>) [ai_found ? "(<A HREF='?_src_=holder;adminchecklaws=[mob.UID()]'>CL</A>)" : ""] (<A HREF='?_src_=holder;take_question=[ticketNum][isMhelp ? ";is_mhelp=1" : ""]'>TAKE</A>) :</span> [span][msg]</span>"
|
||||
if(isMhelp)
|
||||
//Open a new adminticket and inform the user.
|
||||
SSmentor_tickets.newTicket(src, prunedmsg, msg)
|
||||
for(var/client/X in mentorholders + modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_MENTORHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
to_chat(X, msg)
|
||||
else //Ahelp
|
||||
//Open a new adminticket and inform the user.
|
||||
SStickets.newTicket(src, prunedmsg, msg)
|
||||
for(var/client/X in modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
window_flash(X)
|
||||
to_chat(X, msg)
|
||||
|
||||
switch(selected_type)
|
||||
if("Mentorhelp")
|
||||
msg = "<span class='mentorhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[UID()]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[mob.UID()]'>CL</A>)" : ""] (<A HREF='?_src_=holder;take_question=[mob.UID()];is_mhelp=1'>TAKE</A>) :</span> <span class='mentorhelp'>[msg]</span>"
|
||||
for(var/client/X in mentorholders + modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
to_chat(X, msg)
|
||||
if("Adminhelp")
|
||||
var/ticketNum // Holder for the ticket number
|
||||
var/prunedmsg ="[usr.client]: [msg]" // Message without links
|
||||
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 = 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)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_SM(mob,"SM")]) ([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=[mob.UID()]'>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.
|
||||
SStickets.newTicket(src, prunedmsg, msg)
|
||||
for(var/client/X in modholders + adminholders)
|
||||
if(X.prefs.sound & SOUND_ADMINHELP)
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
window_flash(X)
|
||||
to_chat(X, msg)
|
||||
|
||||
|
||||
//show it to the person adminhelping too
|
||||
to_chat(src, "<span class='boldnotice'>[selected_type]</b>: [original_msg]</span>")
|
||||
|
||||
@@ -71,6 +71,9 @@
|
||||
var/turf/T = locate(tx, ty, tz)
|
||||
if(T)
|
||||
admin_forcemove(usr, T)
|
||||
if(isobserver(usr))
|
||||
var/mob/dead/observer/O = usr
|
||||
O.ManualFollow(T)
|
||||
feedback_add_details("admin_verb","JC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
if(!isobserver(usr))
|
||||
message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]")
|
||||
|
||||
@@ -182,23 +182,28 @@
|
||||
else
|
||||
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
|
||||
to_chat(X, "<span class='boldnotice'>[type]: [key_name(src, TRUE, type)]->[key_name(C, TRUE, type)]: [emoji_msg]</span>")
|
||||
|
||||
if(type == "Mentorhelp")
|
||||
return
|
||||
|
||||
//Check if the mob being PM'd has any open admin tickets.
|
||||
var/tickets = list()
|
||||
tickets = SStickets.checkForTicket(C)
|
||||
if(type == "Mentorhelp")
|
||||
tickets = SSmentor_tickets.checkForTicket(C)
|
||||
else
|
||||
tickets = SStickets.checkForTicket(C)
|
||||
if(tickets)
|
||||
for(var/datum/admin_ticket/i in tickets)
|
||||
for(var/datum/ticket/i in tickets)
|
||||
i.addResponse(src, msg) // Add this response to their open tickets.
|
||||
return
|
||||
|
||||
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 = SStickets.checkForTicket(src)
|
||||
if(tickets)
|
||||
for(var/datum/admin_ticket/i in tickets)
|
||||
i.addResponse(src, msg)
|
||||
return
|
||||
if(type == "Mentorhelp")
|
||||
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets
|
||||
tickets = SSmentor_tickets.checkForTicket(src)
|
||||
else // Ahelp
|
||||
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 = SStickets.checkForTicket(src)
|
||||
|
||||
if(tickets)
|
||||
for(var/datum/ticket/i in tickets)
|
||||
i.addResponse(src, msg)
|
||||
return
|
||||
|
||||
|
||||
/client/proc/cmd_admin_irc_pm()
|
||||
|
||||
@@ -115,14 +115,14 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
|
||||
return
|
||||
|
||||
if(!A || !IsValidSrc(A))
|
||||
to_chat(usr, "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>")
|
||||
to_chat(src, "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>")
|
||||
return
|
||||
message_admins("[key_name_admin(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
|
||||
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
|
||||
|
||||
spawn()
|
||||
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
|
||||
to_chat(usr, "<span class='notice'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</span>")
|
||||
to_chat(src, "<span class='notice'>[procname] returned: [!isnull(returnval) ? returnval : "null"]</span>")
|
||||
|
||||
feedback_add_details("admin_verb","DPC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
@@ -72,6 +72,7 @@
|
||||
H.mind_initialize()
|
||||
H.mind.assigned_role = "Event Character"
|
||||
H.mind.special_role = "Event Character"
|
||||
H.mind.offstation_role = TRUE
|
||||
|
||||
H.key = thisplayer.key
|
||||
|
||||
|
||||
@@ -93,6 +93,7 @@ var/global/sent_honksquad = 0
|
||||
new_honksquad.mind_initialize()
|
||||
new_honksquad.mind.assigned_role = SPECIAL_ROLE_HONKSQUAD
|
||||
new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD
|
||||
new_honksquad.mind.offstation_role = TRUE
|
||||
new_honksquad.add_language("Clownish")
|
||||
ticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||
new_honksquad.equip_honksquad(honk_leader_selected)
|
||||
@@ -106,8 +107,8 @@ var/global/sent_honksquad = 0
|
||||
equip_to_slot_or_del(new /obj/item/storage/backpack/clown(src), slot_back)
|
||||
equip_to_slot_or_del(new /obj/item/storage/box/survival(src), slot_in_backpack)
|
||||
if(src.gender == FEMALE)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/sexyclown(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/sexyclown(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat/sexy(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown/sexy(src), slot_w_uniform)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(src), slot_wear_mask)
|
||||
@@ -119,6 +120,7 @@ var/global/sent_honksquad = 0
|
||||
equip_to_slot_or_del(new /obj/item/stamp/clown(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/toy/crayon/rainbow(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/reagent_containers/spray/waterflower(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/reagent_containers/food/pill/patch/jestosterone(src), slot_r_store)
|
||||
if(prob(50))
|
||||
equip_to_slot_or_del(new /obj/item/gun/energy/clown(src), slot_in_backpack)
|
||||
else
|
||||
|
||||
@@ -35,9 +35,6 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
var/tctext = input(src, "How much TC do you want to give each team member? Suggested: 20-30. They cannot trade TC.") as num
|
||||
var/tcamount = text2num(tctext)
|
||||
tcamount = between(0, tcamount, 1000)
|
||||
var/spawn_sit_mgmt = 0
|
||||
if(alert("Spawn a syndicate mob for you, so you can brief them before they go?",,"Yes","No")=="Yes")
|
||||
spawn_sit_mgmt = 1
|
||||
if(sent_syndicate_infiltration_team == 1)
|
||||
if(alert("A Syndicate Infiltration Team has already been sent. Sure you want to send another?",,"Yes","No")=="No")
|
||||
return
|
||||
@@ -85,7 +82,7 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
var/mob/living/carbon/human/new_syndicate_infiltrator = create_syndicate_infiltrator(L, syndicate_leader_selected, tcamount, 0)
|
||||
if(infiltrators.len)
|
||||
var/mob/theguy = pick(infiltrators)
|
||||
if(!spawn_sit_mgmt || theguy.key != key)
|
||||
if(theguy.key != key)
|
||||
new_syndicate_infiltrator.key = theguy.key
|
||||
new_syndicate_infiltrator.internal = new_syndicate_infiltrator.s_store
|
||||
new_syndicate_infiltrator.update_action_buttons_icon()
|
||||
@@ -99,7 +96,7 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
new_syndicate_infiltrator.loc = warpto.loc
|
||||
sit_spawns_leader -= warpto
|
||||
team_leader = new_syndicate_infiltrator
|
||||
to_chat(new_syndicate_infiltrator, "<span class='danger'>As team leader, it is up to you to organize your team! Give the job to someone else if you can't handle it. Only your ID opens the exit door.</span>")
|
||||
to_chat(new_syndicate_infiltrator, "<span class='danger'>As team leader, it is up to you to organize your team! Give the job to someone else if you can't handle it.</span>")
|
||||
else
|
||||
to_chat(new_syndicate_infiltrator, "<span class='danger'>Your team leader is: [team_leader]. They are in charge!</span>")
|
||||
teamsize--
|
||||
@@ -114,23 +111,6 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
num_spawned++
|
||||
if(!teamsize)
|
||||
break
|
||||
if(spawn_sit_mgmt)
|
||||
for(var/obj/effect/landmark/L in sit_spawns_mgmt)
|
||||
var/mob/living/carbon/human/syndimgmtmob = create_syndicate_infiltrator(L, 1, 100, 1)
|
||||
syndimgmtmob.key = key
|
||||
syndimgmtmob.internal = syndimgmtmob.s_store
|
||||
syndimgmtmob.update_action_buttons_icon()
|
||||
syndimgmtmob.faction += "syndicate"
|
||||
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite, slot_wear_suit)
|
||||
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite, slot_head)
|
||||
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate, slot_wear_mask)
|
||||
var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
|
||||
opshud.join_hud(syndimgmtmob.mind.current)
|
||||
set_antag_hud(syndimgmtmob.mind.current, "hudoperative")
|
||||
syndimgmtmob.mind.special_role = "Syndicate Management Consultant"
|
||||
syndimgmtmob.regenerate_icons()
|
||||
to_chat(syndimgmtmob, "<span class='userdanger'>You have spawned as Syndicate Management. You should brief them on their mission before they go.</span>")
|
||||
message_admins("[key_name_admin(src)] has spawned a Syndicate Infiltration Team.", 1)
|
||||
log_admin("[key_name(src)] used Spawn Syndicate Infiltration Team.")
|
||||
feedback_add_details("admin_verb","SPAWNSIT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -151,6 +131,7 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
new_syndicate_infiltrator.mind_initialize()
|
||||
new_syndicate_infiltrator.mind.assigned_role = "Syndicate Infiltrator"
|
||||
new_syndicate_infiltrator.mind.special_role = "Syndicate Infiltrator"
|
||||
new_syndicate_infiltrator.mind.offstation_role = TRUE //they can flee to z2 so make them inelligible as antag targets
|
||||
ticker.mode.traitors |= new_syndicate_infiltrator.mind //Adds them to extra antag list
|
||||
new_syndicate_infiltrator.equip_syndicate_infiltrator(syndicate_leader_selected, uplink_tc, is_mgmt)
|
||||
return new_syndicate_infiltrator
|
||||
@@ -172,7 +153,7 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
|
||||
// Implants:
|
||||
// Uplink
|
||||
var/obj/item/implant/uplink/U = new /obj/item/implant/uplink(src)
|
||||
var/obj/item/implant/uplink/sit/U = new /obj/item/implant/uplink/sit(src)
|
||||
U.implant(src)
|
||||
if (flag_mgmt)
|
||||
U.hidden_uplink.uses = 500
|
||||
|
||||
@@ -415,7 +415,7 @@ client/proc/one_click_antag()
|
||||
new_syndicate_commando.mind_initialize()
|
||||
new_syndicate_commando.mind.assigned_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
|
||||
new_syndicate_commando.mind.special_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
|
||||
|
||||
new_syndicate_commando.mind.offstation_role = TRUE
|
||||
//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||
ticker.mode.traitors += new_syndicate_commando.mind
|
||||
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
|
||||
log_admin("[key_name(usr)] used there can be only one.")
|
||||
nologevent = 1
|
||||
world << sound('sound/music/THUNDERDOME.ogg')
|
||||
world << sound('sound/music/thunderdome.ogg')
|
||||
|
||||
/client/proc/only_me()
|
||||
if(!ticker)
|
||||
@@ -101,4 +101,4 @@
|
||||
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ME! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
|
||||
log_admin("[key_name(usr)] used there can be only me.")
|
||||
nologevent = 1
|
||||
world << sound('sound/music/THUNDERDOME.ogg')
|
||||
world << sound('sound/music/thunderdome.ogg')
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
set name = "Pray"
|
||||
|
||||
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
|
||||
if(!msg) return
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
if(usr.client)
|
||||
if(usr.client.prefs.muted & MUTE_PRAY)
|
||||
@@ -29,7 +30,7 @@
|
||||
deity = ticker.cultdat.entity_name
|
||||
|
||||
log_say("(PRAYER) [msg]", usr)
|
||||
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""]:</font>[key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_SC(src,"SC")]) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
|
||||
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""][mind && mind.isholy ? " (blessings: [mind.num_blessed])" : ""]:</font> [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) ([ADMIN_SC(src,"SC")]) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
|
||||
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
|
||||
@@ -2,25 +2,29 @@
|
||||
set category = "Event"
|
||||
set name = "Unleash Floor Cluwne"
|
||||
set desc = "Pick a specific target or just let it select randomly and spawn the floor cluwne mob on the station. Be warned: spawning more than one may cause issues!"
|
||||
var/target
|
||||
var/mob/living/carbon/human/target
|
||||
|
||||
if(!check_rights(R_EVENT))
|
||||
return
|
||||
|
||||
var/confirm = alert("Are you sure you want to release a floor cluwne and kill alot of people?", "Confirm Massacre", "Yes", "No")
|
||||
var/confirm = alert("Are you sure you want to release a floor cluwne and kill a lot of people?", "Confirm Massacre", "Yes", "No")
|
||||
if(confirm == "Yes")
|
||||
|
||||
var/turf/T = get_turf(usr)
|
||||
target = input("Any specific target in mind? Please note only live, non cluwned, human targets are valid.", "Target", target) as null|anything in GLOB.player_list
|
||||
if(isnull(target))
|
||||
var/list/potential_targets = list()
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(!istype(H))
|
||||
continue
|
||||
if(H.mind.assigned_role == "Cluwne")
|
||||
continue
|
||||
potential_targets += H
|
||||
if(!potential_targets.len) //You're probably the only player on this damn station, spawn it yourself
|
||||
to_chat(src, "<span class='notice'>No valid targets!</span>")
|
||||
return
|
||||
if(target && ishuman(target))
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(T)
|
||||
FC.Acquire_Victim(H)
|
||||
else
|
||||
new /mob/living/simple_animal/hostile/floor_cluwne(T)
|
||||
log_admin("[key_name(usr)] spawned floor cluwne.")
|
||||
message_admins("[key_name(usr)] spawned floor cluwne.")
|
||||
else
|
||||
return
|
||||
target = input("Any specific target in mind? Please note only live, non cluwned, human targets are valid.", "Target", target) as null|anything in potential_targets
|
||||
var/mob/living/simple_animal/hostile/floor_cluwne/FC = new /mob/living/simple_animal/hostile/floor_cluwne(T)
|
||||
if(target)
|
||||
FC.Acquire_Victim(target)
|
||||
log_admin("[key_name(usr)] spawned floor cluwne[target ? ", initially targetting [target]": null].")
|
||||
message_admins("[key_name(usr)] spawned floor cluwne[target ? ", initially targetting [target]": null].")
|
||||
|
||||
@@ -85,6 +85,7 @@ var/global/sent_strike_team = 0
|
||||
R.mind.original = R
|
||||
R.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD
|
||||
R.mind.special_role = SPECIAL_ROLE_DEATHSQUAD
|
||||
R.mind.offstation_role = TRUE
|
||||
if(!(R.mind in ticker.minds))
|
||||
ticker.minds += R.mind
|
||||
ticker.mode.traitors += R.mind
|
||||
@@ -178,7 +179,7 @@ var/global/sent_strike_team = 0
|
||||
equip_to_slot_or_del(new /obj/item/flashlight(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/pinpointer(src), slot_in_backpack)
|
||||
if(is_leader)
|
||||
equip_to_slot_or_del(new /obj/item/disk/nuclear(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/disk/nuclear/unrestricted(src), slot_in_backpack)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
|
||||
|
||||
|
||||
@@ -85,14 +85,13 @@ var/global/sent_syndicate_strike_team = 0
|
||||
|
||||
to_chat(new_syndicate_commando, "<span class='notice'>You are an Elite Syndicate [is_leader ? "<B>TEAM LEADER</B>" : "commando"] in the service of the Syndicate. \nYour current mission is: <span class='userdanger'>[input]</span></span>")
|
||||
new_syndicate_commando.faction += "syndicate"
|
||||
var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
|
||||
opshud.join_hud(new_syndicate_commando.mind.current)
|
||||
set_antag_hud(new_syndicate_commando.mind.current, "hudoperative")
|
||||
new_syndicate_commando.regenerate_icons()
|
||||
is_leader = FALSE
|
||||
syndicate_commando_number--
|
||||
|
||||
for(var/obj/effect/landmark/L in GLOB.landmarks_list)
|
||||
if(L.name == "Syndicate-Commando-Bomb")
|
||||
new /obj/effect/spawner/newbomb/timer/syndicate(L.loc)
|
||||
qdel(L)
|
||||
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] has spawned a Syndicate strike squad.</span>", 1)
|
||||
log_admin("[key_name(usr)] used Spawn Syndicate Squad.")
|
||||
feedback_add_details("admin_verb","SDTHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -117,54 +116,52 @@ var/global/sent_syndicate_strike_team = 0
|
||||
new_syndicate_commando.mind_initialize()
|
||||
new_syndicate_commando.mind.assigned_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
|
||||
new_syndicate_commando.mind.special_role = SPECIAL_ROLE_SYNDICATE_DEATHSQUAD
|
||||
new_syndicate_commando.mind.offstation_role = TRUE
|
||||
ticker.mode.traitors |= new_syndicate_commando.mind //Adds them to current traitor list. Which is really the extra antagonist list.
|
||||
new_syndicate_commando.equip_syndicate_commando(is_leader)
|
||||
qdel(spawn_location)
|
||||
return new_syndicate_commando
|
||||
|
||||
/mob/living/carbon/human/proc/equip_syndicate_commando(is_leader = FALSE)
|
||||
|
||||
/mob/living/carbon/human/proc/equip_syndicate_commando(is_leader = FALSE, full_gear = FALSE)
|
||||
var/obj/item/radio/R = new /obj/item/radio/headset/syndicate/alt/syndteam(src)
|
||||
R.set_frequency(SYNDTEAM_FREQ)
|
||||
equip_to_slot_or_del(R, slot_l_ear)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(src), slot_w_uniform)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes)
|
||||
if(is_leader)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(src), slot_wear_suit)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/strike(src), slot_wear_suit)
|
||||
if(!full_gear)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves)
|
||||
if(is_leader)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/red/strike(src), slot_head)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/strike(src), slot_head)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/storage/backpack/security(src), slot_back)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45)
|
||||
equip_to_slot_or_del(new /obj/item/storage/box/survival_syndi(src), slot_in_backpack)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/gun/projectile/revolver(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/a357(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/reagent_containers/hypospray/combat/nanites(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/flashlight(src), slot_in_backpack)
|
||||
if(is_leader)
|
||||
equip_to_slot_or_del(new /obj/item/pinpointer(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/disk/nuclear(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/disk/nuclear/unrestricted(src), slot_in_backpack)
|
||||
else
|
||||
equip_to_slot_or_del(new /obj/item/grenade/plastic/x4(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/card/emag(src), slot_in_backpack)
|
||||
equip_to_slot_or_del(new /obj/item/melee/energy/sword/saber(src), slot_l_store)
|
||||
equip_to_slot_or_del(new /obj/item/grenade/empgrenade(src), slot_r_store)
|
||||
equip_to_slot_or_del(new /obj/item/tank/emergency_oxygen/double/full(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/pistol/m1911(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/card/emag(src), slot_r_store)
|
||||
equip_to_slot_or_del(new /obj/item/melee/energy/sword/saber/red(src), slot_l_store)
|
||||
|
||||
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/l6_saw(src), slot_r_hand)
|
||||
if(full_gear)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/sst(src), slot_head)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(src), slot_wear_mask)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite/sst(src), slot_wear_suit)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
|
||||
equip_to_slot_or_del(new /obj/item/storage/belt/military/sst(src), slot_belt)
|
||||
equip_to_slot_or_del(new /obj/item/tank/jetpack/oxygen/harness(src), slot_s_store)
|
||||
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/syndie/advance(src), slot_shoes)
|
||||
equip_to_slot_or_del(new /obj/item/gun/projectile/automatic/l6_saw(src), slot_r_hand)
|
||||
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/mm556x45(src), slot_in_backpack)
|
||||
|
||||
var/obj/item/implant/dust/D = new /obj/item/implant/dust(src)
|
||||
D.implant(src)
|
||||
var/obj/item/card/id/syndicate/W = new(src) //Untrackable by AI
|
||||
W.name = "[real_name]'s ID Card"
|
||||
W.icon_state = "syndie"
|
||||
W.access = get_all_accesses()//They get full station access because obviously the syndicate has HAAAX, and can make special IDs for their most elite members.
|
||||
W.assignment = "Syndicate Commando"
|
||||
W.access += get_syndicate_access(W.assignment)
|
||||
W.registered_name = real_name
|
||||
|
||||
@@ -10,7 +10,6 @@
|
||||
/obj/item/antag_spawner/proc/equip_antag(mob/target)
|
||||
return
|
||||
|
||||
|
||||
/obj/item/antag_spawner/borg_tele
|
||||
name = "syndicate cyborg teleporter"
|
||||
desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field."
|
||||
@@ -19,7 +18,8 @@
|
||||
var/checking = FALSE
|
||||
var/TC_cost = 0
|
||||
var/borg_to_spawn
|
||||
var/list/possible_types = list("Assault", "Medical")
|
||||
var/upload_mind
|
||||
var/list/possible_types = list("Assault", "Medical", "Saboteur")
|
||||
|
||||
/obj/item/antag_spawner/borg_tele/attack_self(mob/user)
|
||||
if(used)
|
||||
@@ -34,19 +34,42 @@
|
||||
borg_to_spawn = input("What type of borg would you like to teleport?", "Cyborg Type", type) as null|anything in possible_types
|
||||
if(!borg_to_spawn || checking || used)
|
||||
return
|
||||
checking = TRUE
|
||||
to_chat(user, "<span class='notice'>The device is now checking for possible borgs.</span>")
|
||||
var/list/borg_candidates = pollCandidates("Do you want to play as a Syndicate [borg_to_spawn] borg?", ROLE_OPERATIVE, 1)
|
||||
if(borg_candidates.len > 0 && !used)
|
||||
checking = FALSE
|
||||
used = TRUE
|
||||
var/mob/M = pick(borg_candidates)
|
||||
var/client/C = M.client
|
||||
spawn_antag(C, get_turf(src.loc), "syndieborg")
|
||||
else
|
||||
checking = FALSE
|
||||
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
|
||||
upload_mind = input("Would you like to continue playing as an operative or take over the cyborg? (Another player will control your old self)", "Play as") as null|anything in list("Nuclear Operative", "Syndicate Cyborg")
|
||||
if(!upload_mind || checking || used)
|
||||
return
|
||||
if(upload_mind == "Nuclear Operative")
|
||||
checking = TRUE
|
||||
to_chat(user, "<span class='notice'>The device is now checking for possible borgs.</span>")
|
||||
var/list/borg_candidates = pollCandidates("Do you want to play as a Syndicate [borg_to_spawn] borg?", ROLE_OPERATIVE, 1)
|
||||
if(borg_candidates.len > 0 && !used)
|
||||
checking = FALSE
|
||||
used = TRUE
|
||||
var/mob/M = pick(borg_candidates)
|
||||
var/client/C = M.client
|
||||
spawn_antag(C, get_turf(loc), "syndieborg")
|
||||
qdel(src)
|
||||
else
|
||||
checking = FALSE
|
||||
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
|
||||
return
|
||||
else if(upload_mind == "Syndicate Cyborg")
|
||||
checking = TRUE
|
||||
to_chat(user, "<span class='notice'>You attempt to upload your consciousness into a new syndicate cyborg.</span>")
|
||||
var/list/nuclear_candidates = pollCandidates("Do you want to play as the Syndicate Nuclear Operative [user.real_name]?", ROLE_OPERATIVE, 1)
|
||||
if(nuclear_candidates.len > 0 && !used)
|
||||
checking = FALSE
|
||||
used = TRUE
|
||||
var/mob/M = pick(nuclear_candidates)
|
||||
var/client/nukeop_client = M.client
|
||||
var/client/borg_client = user.client
|
||||
spawn_antag(borg_client, get_turf(loc), "syndieborg")
|
||||
user.key = nukeop_client.key
|
||||
ticker.mode.greet_syndicate(user.mind)
|
||||
qdel(src)
|
||||
else
|
||||
checking = FALSE
|
||||
to_chat(user, "<span class='notice'>Unable to connect to Syndicate command. Please wait and try again later or refund your teleporter through your uplink.</span>")
|
||||
return
|
||||
|
||||
/obj/item/antag_spawner/borg_tele/spawn_antag(client/C, turf/T, type = "")
|
||||
if(!borg_to_spawn) //If there's no type at all, let it still be used but don't do anything
|
||||
@@ -57,6 +80,8 @@
|
||||
switch(borg_to_spawn)
|
||||
if("Medical")
|
||||
R = new /mob/living/silicon/robot/syndicate/medical(T)
|
||||
if("Saboteur")
|
||||
R = new /mob/living/silicon/robot/syndicate/saboteur(T)
|
||||
else
|
||||
R = new /mob/living/silicon/robot/syndicate(T) //Assault borg by default
|
||||
R.key = C.key
|
||||
@@ -95,7 +120,7 @@
|
||||
spawn_antag(C, get_turf(src.loc), initial(demon_type.name), user)
|
||||
to_chat(user, "[shatter_msg]")
|
||||
to_chat(user, "[veil_msg]")
|
||||
playsound(user.loc, 'sound/effects/Glassbr1.ogg', 100, 1)
|
||||
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
|
||||
qdel(src)
|
||||
else
|
||||
used = FALSE
|
||||
@@ -123,7 +148,6 @@
|
||||
to_chat(S, "<B>Objective #[1]</B>: [KillDaWiz.explanation_text]")
|
||||
to_chat(S, "<B>Objective #[2]</B>: [KillDaCrew.explanation_text]")
|
||||
|
||||
|
||||
/obj/item/antag_spawner/slaughter_demon/laughter
|
||||
name = "vial of tickles"
|
||||
desc = "A magically infused bottle of clown love, distilled from \
|
||||
@@ -134,3 +158,59 @@
|
||||
lurking just beyond the veil...</span>"
|
||||
objective_verb = "Hug and Tickle"
|
||||
demon_type = /mob/living/simple_animal/slaughter/laughter
|
||||
|
||||
/obj/item/antag_spawner/morph
|
||||
name = "vial of ooze"
|
||||
desc = "A magically infused bottle of ooze, distilled by methods rather not be spoken of. Used to awaken an all-consuming monstrosity."
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "vialooze"
|
||||
var/shatter_msg = "<span class='notice'>You shatter the bottle, no \
|
||||
turning back now!</span>"
|
||||
var/veil_msg = "<span class='warning'>The sludge is awake and seeps \
|
||||
away...</span>"
|
||||
var/objective_verb = "Eat"
|
||||
var/mob/living/morph_type = /mob/living/simple_animal/hostile/morph
|
||||
|
||||
/obj/item/antag_spawner/morph/attack_self(mob/user)
|
||||
if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a morph from the Den..
|
||||
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
|
||||
return
|
||||
|
||||
if(used)
|
||||
to_chat(user, "<span class='notice'>This bottle already has a broken seal.</span>")
|
||||
return
|
||||
used = TRUE
|
||||
to_chat(user, "<span class='notice'>You break the seal on the bottle, calling upon the dire sludge to awaken...</span>")
|
||||
|
||||
var/list/candidates = pollCandidates("Do you want to play as a morph awakened by [user.real_name]?", ROLE_MORPH, 1, 100)
|
||||
|
||||
if(candidates.len > 0)
|
||||
var/mob/C = pick(candidates)
|
||||
spawn_antag(C, get_turf(src.loc), initial(morph_type.name), user)
|
||||
to_chat(user, "[shatter_msg]")
|
||||
to_chat(user, "[veil_msg]")
|
||||
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
|
||||
qdel(src)
|
||||
else
|
||||
used = FALSE
|
||||
to_chat(user, "<span class='notice'>The sludge does not respond to your attempt to awake it. Perhaps you should try again later.</span>")
|
||||
|
||||
/obj/item/antag_spawner/morph/spawn_antag(client/C, turf/T, type = "", mob/user)
|
||||
var/mob/living/simple_animal/hostile/morph/M = new /mob/living/simple_animal/hostile/morph(pick(xeno_spawn))
|
||||
M.key = C.key
|
||||
M.mind.assigned_role = SPECIAL_ROLE_MORPH
|
||||
M.mind.special_role = SPECIAL_ROLE_MORPH
|
||||
to_chat(M, M.playstyle_string)
|
||||
ticker.mode.traitors += M.mind
|
||||
var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate
|
||||
KillDaWiz.owner = M.mind
|
||||
KillDaWiz.target = user.mind
|
||||
KillDaWiz.explanation_text = "[objective_verb] [user.real_name], the one who was foolish enough to awake you."
|
||||
M.mind.objectives += KillDaWiz
|
||||
var/datum/objective/KillDaCrew = new /datum/objective
|
||||
KillDaCrew.owner = M.mind
|
||||
KillDaCrew.explanation_text = "[objective_verb] everyone and everything else while you're at it."
|
||||
M.mind.objectives += KillDaCrew
|
||||
to_chat(M, "<B>Objective #[1]</B>: [KillDaWiz.explanation_text]")
|
||||
to_chat(M, "<B>Objective #[2]</B>: [KillDaCrew.explanation_text]")
|
||||
M << 'sound/magic/mutate.ogg'
|
||||
@@ -70,9 +70,6 @@
|
||||
H.dna.SetSEState(JUMPBLOCK, TRUE)
|
||||
genemutcheck(H, JUMPBLOCK, null, MUTCHK_FORCED)
|
||||
|
||||
H.dna.SetSEState(SUPERFARTBLOCK, TRUE)
|
||||
genemutcheck(H, SUPERFARTBLOCK, null, MUTCHK_FORCED)
|
||||
|
||||
H.dna.SetSEState(IMMOLATEBLOCK, TRUE)
|
||||
genemutcheck(H, IMMOLATEBLOCK, null, MUTCHK_FORCED)
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
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)
|
||||
playsound(src.loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
addtimer(CALLBACK(src, .update_icon), 10)
|
||||
|
||||
/obj/machinery/arcade/claw/start_play(mob/user as mob)
|
||||
|
||||
@@ -9,23 +9,20 @@
|
||||
anchored = 1
|
||||
var/obj/item/nanomob_card/card
|
||||
var/datum/mob_hunt/mob_info
|
||||
var/obj/effect/landmark/battle_mob_point/avatar_point
|
||||
var/obj/effect/nanomob/battle/avatar
|
||||
var/ready = 0
|
||||
var/team = "Grey"
|
||||
var/avatar_x_offset = 4
|
||||
var/avatar_y_offset = 0
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/red
|
||||
pixel_y = 24
|
||||
dir = SOUTH
|
||||
team = "Red"
|
||||
avatar_y_offset = -1
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/blue
|
||||
pixel_y = -24
|
||||
dir = NORTH
|
||||
team = "Blue"
|
||||
avatar_y_offset = 1
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/red/Initialize()
|
||||
..()
|
||||
@@ -94,7 +91,11 @@
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/update_avatar()
|
||||
//if we don't have avatars yet, spawn them
|
||||
if(!avatar)
|
||||
avatar = new(locate((x + avatar_x_offset), (y + avatar_y_offset), z))
|
||||
if(!avatar_point)
|
||||
log_debug("[src] attempted to spawn a battle mob avatar without a spawn point!")
|
||||
return
|
||||
else
|
||||
avatar = new(get_turf(avatar_point))
|
||||
//update avatar info from card
|
||||
if(mob_info)
|
||||
avatar.mob_info = mob_info
|
||||
@@ -211,6 +212,29 @@
|
||||
if(SSmob_hunt && !SSmob_hunt.blue_terminal)
|
||||
SSmob_hunt.blue_terminal = src
|
||||
|
||||
find_avatar_spawn_point()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/find_avatar_spawn_point()
|
||||
if(avatar_point)
|
||||
return
|
||||
var/obj/effect/landmark/battle_mob_point/closest
|
||||
for(var/obj/effect/landmark/battle_mob_point/bmp in GLOB.landmarks_list)
|
||||
if(!istype(bmp, /obj/effect/landmark/battle_mob_point))
|
||||
continue
|
||||
if(bmp.z != z) //only match with points on the same z-level)
|
||||
continue
|
||||
if(!closest || isnull(closest))
|
||||
closest = bmp
|
||||
continue
|
||||
if(closest == bmp)
|
||||
continue
|
||||
if((abs(x-bmp.x)+abs(y-bmp.y)) < (abs(x-closest.x)+abs(y-closest.y))) //get_dist would be preferable if it didn't count diagonals as 1 distance, so we have to rely on actual x/y distances in this janky way.
|
||||
closest = bmp
|
||||
if(closest)
|
||||
avatar_point = closest
|
||||
else
|
||||
log_debug("[src] was unable to locate a nearby mob battle landmark! Unable to spawn battle avatars!")
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/do_attack()
|
||||
if(!ready) //no attacking if you arent ready to fight (duh)
|
||||
return
|
||||
|
||||
@@ -222,6 +222,12 @@ var/global/datum/prizes/global_prizes = new
|
||||
typepath = /obj/item/spellbook/oneuse/fake_gib
|
||||
cost = 100
|
||||
|
||||
/datum/prize_item/fakefingergun
|
||||
name = "Miming Manual : Finger Gun"
|
||||
desc = "..."
|
||||
typepath = /obj/item/spellbook/oneuse/mime/fingergun/fake
|
||||
cost = 100
|
||||
|
||||
/datum/prize_item/magic_conch
|
||||
name = "Magic Conch Shell"
|
||||
desc = "All hail the magic conch!"
|
||||
@@ -270,6 +276,12 @@ var/global/datum/prizes/global_prizes = new
|
||||
typepath = /obj/item/toy/griffin
|
||||
cost = 125
|
||||
|
||||
/datum/prize_item/codex_gigas
|
||||
name = "Toy Codex Gigas"
|
||||
desc = "For helping you come up with writing ideas for your diabolical adventures."
|
||||
typepath = /obj/item/toy/codex_gigas/
|
||||
cost = 75
|
||||
|
||||
/datum/prize_item/esword
|
||||
name = "Toy Energy Sword"
|
||||
desc = "A plastic replica of an energy blade."
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
throw_range = 10
|
||||
origin_tech = "magnets=1;engineering=1"
|
||||
toolspeed = 1
|
||||
usesound = 'sound/items/Deconstruct.ogg'
|
||||
usesound = 'sound/items/deconstruct.ogg'
|
||||
|
||||
var/bomb_name = "bomb" // used for naming bombs / mines
|
||||
|
||||
|
||||
@@ -85,9 +85,9 @@
|
||||
if(bombassembly)
|
||||
bombassembly.on_found(finder)
|
||||
|
||||
/obj/item/onetankbomb/hear_talk(mob/living/M, msg)
|
||||
/obj/item/onetankbomb/hear_talk(mob/living/M, list/message_pieces)
|
||||
if(bombassembly)
|
||||
bombassembly.hear_talk(M, msg)
|
||||
bombassembly.hear_talk(M, message_pieces)
|
||||
|
||||
/obj/item/onetankbomb/hear_message(mob/living/M, msg)
|
||||
if(bombassembly)
|
||||
|
||||
@@ -98,11 +98,11 @@
|
||||
a_right.on_found(finder)
|
||||
|
||||
|
||||
/obj/item/assembly_holder/hear_talk(mob/living/M, msg)
|
||||
/obj/item/assembly_holder/hear_talk(mob/living/M, list/message_pieces)
|
||||
if(a_left)
|
||||
a_left.hear_talk(M, msg)
|
||||
a_left.hear_talk(M, message_pieces)
|
||||
if(a_right)
|
||||
a_right.hear_talk(M, msg)
|
||||
a_right.hear_talk(M, message_pieces)
|
||||
|
||||
/obj/item/assembly_holder/hear_message(mob/living/M, msg)
|
||||
if(a_left)
|
||||
@@ -121,7 +121,7 @@
|
||||
return
|
||||
|
||||
/obj/item/assembly_holder/pickup()
|
||||
..()
|
||||
. = ..()
|
||||
process_movement()
|
||||
|
||||
/obj/item/assembly_holder/Bump()
|
||||
|
||||
@@ -148,6 +148,7 @@
|
||||
|
||||
for(var/mob/O in hearers(1, loc))
|
||||
O.show_message("[bicon(src)] *beep* *beep*", 3, "*beep* *beep*", 2)
|
||||
return TRUE
|
||||
|
||||
/obj/item/assembly/signaler/proc/set_frequency(new_frequency)
|
||||
if(!radio_controller)
|
||||
@@ -167,9 +168,9 @@
|
||||
receiving = TRUE
|
||||
|
||||
/obj/item/assembly/signaler/anomaly/receive_signal(datum/signal/signal)
|
||||
..()
|
||||
for(var/obj/effect/anomaly/A in orange(0, src))
|
||||
A.anomalyNeutralize()
|
||||
if(..())
|
||||
for(var/obj/effect/anomaly/A in orange(0, src))
|
||||
A.anomalyNeutralize()
|
||||
|
||||
/obj/item/assembly/signaler/anomaly/attack_self()
|
||||
return
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
else
|
||||
return "[src] is deactivated."
|
||||
|
||||
/obj/item/assembly/voice/hear_talk(mob/living/M as mob, msg)
|
||||
hear_input(M, msg, 0)
|
||||
/obj/item/assembly/voice/hear_talk(mob/living/M as mob, list/message_pieces)
|
||||
hear_input(M, multilingual_to_message(message_pieces), 0)
|
||||
|
||||
/obj/item/assembly/voice/hear_message(mob/living/M as mob, msg)
|
||||
hear_input(M, msg, 1)
|
||||
hear_input(M, msg, 1)
|
||||
|
||||
/obj/item/assembly/voice/proc/hear_input(mob/living/M as mob, msg, type)
|
||||
if(!istype(M,/mob/living))
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
/obj/item/assembly/voice/noise
|
||||
name = "noise sensor"
|
||||
desc = "A simple noise sensor that triggers on vocalizations other then speech."
|
||||
desc = "A simple noise sensor that triggers on vocalizations other than speech."
|
||||
icon_state = "voice"
|
||||
materials = list(MAT_METAL=100, MAT_GLASS=10)
|
||||
origin_tech = "magnets=1;engineering=1"
|
||||
@@ -68,7 +68,7 @@
|
||||
/obj/item/assembly/voice/noise/describe()
|
||||
return "[src] does not appear to have any controls."
|
||||
|
||||
/obj/item/assembly/voice/noise/hear_talk(mob/living/M as mob, msg)
|
||||
/obj/item/assembly/voice/noise/hear_talk(mob/living/M as mob, list/message_pieces)
|
||||
return
|
||||
|
||||
/obj/item/assembly/voice/noise/hear_message(mob/living/M as mob, msg)
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/attack_ghost(mob/user)
|
||||
var/mob/dead/observer/O = user
|
||||
if(ticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable)
|
||||
return
|
||||
if(!uses)
|
||||
@@ -41,6 +42,12 @@
|
||||
if(jobban_isbanned(user, banType))
|
||||
to_chat(user, "<span class='warning'>You are jobanned!</span>")
|
||||
return
|
||||
if(cannotPossess(user))
|
||||
to_chat(user, "<span class='warning'>Upon using the antagHUD you forfeited the ability to join the round.</span>")
|
||||
return
|
||||
if(!O.can_reenter_corpse)
|
||||
to_chat(user, "<span class='warning'>You have forfeited the right to respawn.</span>")
|
||||
return
|
||||
if(QDELETED(src) || QDELETED(user))
|
||||
return
|
||||
var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No")
|
||||
@@ -242,7 +249,7 @@
|
||||
|
||||
|
||||
/obj/effect/mob_spawn/human/alive
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
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
|
||||
@@ -256,7 +263,7 @@
|
||||
mob_type = /mob/living/simple_animal/mouse
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "Squeak!"
|
||||
|
||||
@@ -267,7 +274,7 @@
|
||||
death = FALSE
|
||||
roundstart = FALSE
|
||||
mob_gender = FEMALE
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "Moo!"
|
||||
|
||||
@@ -306,7 +313,7 @@
|
||||
roundstart = FALSE
|
||||
random = TRUE
|
||||
name = "sleeper"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "<span class='big bold'>You are a space doctor!</span>"
|
||||
assignedrole = "Space Doctor"
|
||||
@@ -351,7 +358,7 @@
|
||||
|
||||
/obj/effect/mob_spawn/human/clown/Initialize()
|
||||
mob_name = pick(GLOB.clown_names)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/clownmili
|
||||
name = "Clown Soldier"
|
||||
@@ -359,7 +366,7 @@
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/clownmili/Initialize()
|
||||
mob_name = "Officer [pick(GLOB.clown_names)]"
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/clownoff
|
||||
name = "Clown Officer"
|
||||
@@ -367,7 +374,7 @@
|
||||
|
||||
/obj/effect/mob_spawn/human/corpse/clownoff/Initialize()
|
||||
mob_name = "Honk Specialist [pick(GLOB.clown_names)]"
|
||||
..()
|
||||
return ..()
|
||||
|
||||
|
||||
/datum/outfit/clownsoldier
|
||||
@@ -398,7 +405,7 @@
|
||||
|
||||
/obj/effect/mob_spawn/human/mime/Initialize()
|
||||
mob_name = pick(GLOB.mime_names)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/scientist
|
||||
name = "Scientist"
|
||||
@@ -437,7 +444,7 @@
|
||||
roundstart = FALSE
|
||||
random = TRUE
|
||||
name = "bartender sleeper"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "<span class='big bold'>You are a space bartender!</span><b> Time to mix drinks and change lives.</b>"
|
||||
assignedrole = "Space Bartender"
|
||||
@@ -461,7 +468,7 @@
|
||||
random = TRUE
|
||||
mob_name = "Beach Bum"
|
||||
name = "beach bum sleeper"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
flavour_text = "You are a beach bum!"
|
||||
assignedrole = "Beach Bum"
|
||||
|
||||
@@ -179,11 +179,6 @@
|
||||
(the writing trails off, as if the writer was interrupted)<br>
|
||||
"}
|
||||
|
||||
/obj/item/paper/terrorspiders9
|
||||
name = "paper - 'Research Notes'"
|
||||
info = "<b>The notes appear gibberish to you. Perhaps a destructive analyzer in R&D could make sense of them.</b>"
|
||||
origin_tech = "combat=4;materials=4;engineering=4;biotech=4"
|
||||
|
||||
/obj/item/gun/energy/laser/awaymission_aeg
|
||||
name = "Wireless Energy Gun"
|
||||
desc = "An energy gun that recharges wirelessly during away missions. Does not work on the main station."
|
||||
|
||||
@@ -0,0 +1,138 @@
|
||||
//Golem shells: Spawns in Free Golem ships in lavaland, or through xenobiology adamantine extract.
|
||||
//Xenobiology golems are slaved to their creator.
|
||||
|
||||
/obj/item/golem_shell
|
||||
name = "incomplete free golem shell"
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "construct"
|
||||
desc = "The incomplete body of a golem. Add ten sheets of any mineral to finish."
|
||||
var/shell_type = /obj/effect/mob_spawn/human/golem
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
|
||||
/obj/item/golem_shell/servant
|
||||
name = "incomplete servant golem shell"
|
||||
shell_type = /obj/effect/mob_spawn/human/golem/servant
|
||||
|
||||
/obj/item/golem_shell/attackby(obj/item/I, mob/user, params)
|
||||
..()
|
||||
var/static/list/golem_shell_species_types = list(
|
||||
/obj/item/stack/sheet/metal = /datum/species/golem,
|
||||
/obj/item/stack/sheet/glass = /datum/species/golem/glass,
|
||||
/obj/item/stack/sheet/plasteel = /datum/species/golem/plasteel,
|
||||
/obj/item/stack/ore/glass = /datum/species/golem/sand,
|
||||
/obj/item/stack/sheet/mineral/sandstone = /datum/species/golem/sand,
|
||||
/obj/item/stack/sheet/mineral/plasma = /datum/species/golem/plasma,
|
||||
/obj/item/stack/sheet/mineral/diamond = /datum/species/golem/diamond,
|
||||
/obj/item/stack/sheet/mineral/gold = /datum/species/golem/gold,
|
||||
/obj/item/stack/sheet/mineral/silver = /datum/species/golem/silver,
|
||||
/obj/item/stack/sheet/mineral/uranium = /datum/species/golem/uranium,
|
||||
/obj/item/stack/sheet/mineral/bananium = /datum/species/golem/bananium,
|
||||
/obj/item/stack/sheet/mineral/tranquillite = /datum/species/golem/tranquillite,
|
||||
/obj/item/stack/sheet/mineral/titanium = /datum/species/golem/titanium,
|
||||
/obj/item/stack/sheet/mineral/plastitanium = /datum/species/golem/plastitanium,
|
||||
/obj/item/stack/sheet/mineral/abductor = /datum/species/golem/alloy,
|
||||
/obj/item/stack/sheet/wood = /datum/species/golem/wood,
|
||||
/obj/item/stack/sheet/bluespace_crystal = /datum/species/golem/bluespace,
|
||||
/obj/item/stack/sheet/mineral/adamantine = /datum/species/golem/adamantine,
|
||||
/obj/item/stack/sheet/plastic = /datum/species/golem/plastic)
|
||||
|
||||
if(istype(I, /obj/item/stack))
|
||||
var/obj/item/stack/O = I
|
||||
var/species = golem_shell_species_types[O.merge_type]
|
||||
if(species)
|
||||
if(O.use(10))
|
||||
to_chat(user, "You finish up the golem shell with ten sheets of [O].")
|
||||
new shell_type(get_turf(src), species, user)
|
||||
qdel(src)
|
||||
else
|
||||
to_chat(user, "You need at least ten sheets to finish a golem.")
|
||||
else
|
||||
to_chat(user, "You can't build a golem out of this kind of material.")
|
||||
|
||||
/obj/effect/mob_spawn/human/golem
|
||||
name = "inert free golem shell"
|
||||
desc = "A humanoid shape, empty, lifeless, and full of potential."
|
||||
mob_name = "a free golem"
|
||||
icon = 'icons/obj/wizard.dmi'
|
||||
icon_state = "construct"
|
||||
mob_species = /datum/species/golem
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
anchored = FALSE
|
||||
move_resist = MOVE_FORCE_NORMAL
|
||||
density = FALSE
|
||||
var/has_owner = FALSE
|
||||
var/can_transfer = TRUE //if golems can switch bodies to this new shell
|
||||
var/mob/living/owner = null //golem's owner if it has one
|
||||
flavour_text = "<span class='big bold'>You are a Free Golem.</span><b> Your family worships <span class='danger'>The Liberator</span>. In his infinite and divine wisdom, he set your clan free to \
|
||||
travel the stars with a single declaration: \"Yeah go do whatever.\" Though you are bound to the one who created you, it is customary in your society to repeat those same words to newborn \
|
||||
golems, so that no golem may ever be forced to serve again.</b>"
|
||||
|
||||
/obj/effect/mob_spawn/human/golem/Initialize(mapload, datum/species/golem/species = null, mob/creator = null)
|
||||
if(species) //spawners list uses object name to register so this goes before ..()
|
||||
name += " ([initial(species.prefix)])"
|
||||
mob_species = species
|
||||
. = ..()
|
||||
var/area/A = get_area(src)
|
||||
if(!mapload && A)
|
||||
notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in [A.name].", source = src)
|
||||
if(has_owner && creator)
|
||||
flavour_text = "<span class='big bold'>You are a Golem.</span><b> You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. \
|
||||
Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost.</b>"
|
||||
owner = creator
|
||||
|
||||
/obj/effect/mob_spawn/human/golem/special(mob/living/new_spawn, name)
|
||||
var/datum/species/golem/X = mob_species
|
||||
to_chat(new_spawn, "[initial(X.info_text)]")
|
||||
if(!owner)
|
||||
to_chat(new_spawn, "<span class='notice'>It is common in free golem societies to respect Adamantine golems as elders, however you do not have to obey them. \
|
||||
Adamantine golems are the only golems that can resonate to all golems.</span>")
|
||||
to_chat(new_spawn, "Build golem shells in the autolathe, and feed refined mineral sheets to the shells to bring them to life! You are generally a peaceful group unless provoked.")
|
||||
to_chat(new_spawn, "<span class='warning'>You are not an antagonist, but you are not a crewmember either. \
|
||||
You may interact or trade with crew you come across, aswell as defend yourself and your ship \
|
||||
but avoid actively interfering with the station unless you have a valid roleplay reason to do so, such as an invitation by crewmembers.</span>")
|
||||
else
|
||||
new_spawn.mind.store_memory("<b>Serve [owner.real_name], your creator.</b>")
|
||||
log_game("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].")
|
||||
log_admin("[key_name(new_spawn)] possessed a golem shell enslaved to [key_name(owner)].")
|
||||
if(ishuman(new_spawn))
|
||||
var/mob/living/carbon/human/H = new_spawn
|
||||
if(has_owner)
|
||||
var/datum/species/golem/G = H.dna.species
|
||||
G.owner = owner
|
||||
if(!name)
|
||||
H.rename_character(null, H.dna.species.get_random_name())
|
||||
else
|
||||
H.rename_character(null, name)
|
||||
if(has_owner)
|
||||
new_spawn.mind.assigned_role = "Servant Golem"
|
||||
else
|
||||
new_spawn.mind.assigned_role = "Free Golem"
|
||||
|
||||
/obj/effect/mob_spawn/human/golem/attack_hand(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(isgolem(user) && can_transfer)
|
||||
var/transfer_choice = alert("Transfer your soul to [src]? (Warning, your old body will die!)",,"Yes","No")
|
||||
if(transfer_choice != "Yes")
|
||||
return
|
||||
if(QDELETED(src) || uses <= 0)
|
||||
return
|
||||
log_game("[key_name(user)] golem-swapped into [src]")
|
||||
user.visible_message("<span class='notice'>A faint light leaves [user], moving to [src] and animating it!</span>","<span class='notice'>You leave your old body behind, and transfer into [src]!</span>")
|
||||
create(ckey = user.ckey, name = user.real_name)
|
||||
user.death()
|
||||
return
|
||||
|
||||
/obj/effect/mob_spawn/human/golem/servant
|
||||
has_owner = TRUE
|
||||
name = "inert servant golem shell"
|
||||
mob_name = "a servant golem"
|
||||
|
||||
/obj/effect/mob_spawn/human/golem/adamantine
|
||||
name = "dust-caked free golem shell"
|
||||
desc = "A humanoid shape, empty, lifeless, and full of potential."
|
||||
mob_name = "a free golem"
|
||||
can_transfer = FALSE
|
||||
mob_species = /datum/species/golem/adamantine
|
||||
@@ -0,0 +1,110 @@
|
||||
//Ancient cryogenic sleepers. Players become NT crewmen from a hundred year old space station, now on the verge of collapse.
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsec
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a security uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a security officer"
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are a security officer working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/security
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
id = /obj/item/card/id/away/old/sec
|
||||
r_pocket = /obj/item/restraints/handcuffs
|
||||
l_pocket = /obj/item/flash
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsec/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/oldmed
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a medical uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a medical doctor"
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are a medical working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/medical
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
id = /obj/item/card/id/away/old/med
|
||||
l_pocket = /obj/item/stack/medical/ointment
|
||||
r_pocket = /obj/item/stack/medical/ointment
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldmed/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/oldeng
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise an engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "an engineer"
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are an engineer working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/engineering
|
||||
shoes = /obj/item/clothing/shoes/workboots
|
||||
id = /obj/item/card/id/away/old/eng
|
||||
gloves = /obj/item/clothing/gloves/color/fyellow/old
|
||||
l_pocket = /obj/item/tank/emergency_oxygen
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldeng/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsci
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a science uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a scientist"
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are a scientist working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/science
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
id = /obj/item/card/id/away/old/sci
|
||||
l_pocket = /obj/item/stack/medical/bruise_pack
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsci/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/structure/showcase/machinery/oldpod
|
||||
name = "damaged cryogenic pod"
|
||||
desc = "A damaged cryogenic pod long since lost to time, including its former occupant..."
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "sleeper-open"
|
||||
|
||||
/obj/structure/showcase/machinery/oldpod/used
|
||||
name = "opened cryogenic pod"
|
||||
desc = "A cryogenic pod that has recently discharged its occupant. The pod appears non-functional."
|
||||
@@ -360,116 +360,4 @@
|
||||
|
||||
/area/ruin/space/ancientstation/hivebot
|
||||
name = "Hivebot Mothership"
|
||||
icon_state = "teleporter"
|
||||
|
||||
// Mob Spawners
|
||||
//Ancient cryogenic sleepers. Players become NT crewmen from a hundred year old space station, now on the verge of collapse.
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsec
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a security uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a security officer"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are a security officer working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/security
|
||||
shoes = /obj/item/clothing/shoes/jackboots
|
||||
id = /obj/item/card/id/away/old/sec
|
||||
r_pocket = /obj/item/restraints/handcuffs
|
||||
l_pocket = /obj/item/flash
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsec/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/oldmed
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a medical uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a medical doctor"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are a medical working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/medical
|
||||
shoes = /obj/item/clothing/shoes/black
|
||||
id = /obj/item/card/id/away/old/med
|
||||
l_pocket = /obj/item/stack/medical/ointment
|
||||
r_pocket = /obj/item/stack/medical/ointment
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldmed/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/oldeng
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise an engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "an engineer"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are an engineer working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/engineering
|
||||
shoes = /obj/item/clothing/shoes/workboots
|
||||
id = /obj/item/card/id/away/old/eng
|
||||
gloves = /obj/item/clothing/gloves/color/fyellow/old
|
||||
l_pocket = /obj/item/tank/emergency_oxygen
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldeng/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsci
|
||||
name = "old cryogenics pod"
|
||||
desc = "A humming cryo pod. You can barely recognise a science uniform underneath the built up ice. The machine is attempting to wake up its occupant."
|
||||
mob_name = "a scientist"
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper"
|
||||
roundstart = FALSE
|
||||
death = FALSE
|
||||
random = TRUE
|
||||
mob_species = /datum/species/human
|
||||
flavour_text = "<span class='big bold'>You are a scientist working for Nanotrasen,</span><b> stationed onboard a state of the art research station. You vaguely recall rushing into a \
|
||||
cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
|
||||
your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
|
||||
Work as a team with your fellow survivors and do not abandon them.</b>"
|
||||
uniform = /obj/item/clothing/under/retro/science
|
||||
shoes = /obj/item/clothing/shoes/laceup
|
||||
id = /obj/item/card/id/away/old/sci
|
||||
l_pocket = /obj/item/stack/medical/bruise_pack
|
||||
assignedrole = "Ancient Crew"
|
||||
|
||||
/obj/effect/mob_spawn/human/oldsci/Destroy()
|
||||
new /obj/structure/showcase/machinery/oldpod/used(drop_location())
|
||||
return ..()
|
||||
|
||||
/obj/structure/showcase/machinery/oldpod
|
||||
name = "damaged cryogenic pod"
|
||||
desc = "A damaged cryogenic pod long since lost to time, including its former occupant..."
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "sleeper-open"
|
||||
|
||||
/obj/structure/showcase/machinery/oldpod/used
|
||||
name = "opened cryogenic pod"
|
||||
desc = "A cryogenic pod that has recently discharged its occupant. The pod appears non-functional."
|
||||
icon_state = "teleporter"
|
||||
@@ -0,0 +1,17 @@
|
||||
//stuff for the crashed wizard shuttle space ruin (wizardcrash.dmm)
|
||||
|
||||
/obj/item/paper/fluff/ruins/wizardcrash
|
||||
name = "Mission Briefing"
|
||||
info = "To the Magnificent Z.A.P.<BR>A small mining base has been created within our territory by wandless scum. Send them a message from the wizard federation they will not forget. I know your kind is rather fragile, but a group of lightly armed miners should not pose any threat to you at all. Just be warned they have a security cyborg for self defence, you might want to tune your spells to that threat. I look forward to hearing of your success.<BR>Grand Magus Abra the Wonderous"
|
||||
|
||||
|
||||
/obj/effect/spawner/lootdrop/wizardcrash
|
||||
loot = list(
|
||||
/obj/item/guardiancreator = 1, //jackpot.
|
||||
/obj/item/spellbook/oneuse/knock = 1, //tresspassing charges incoming
|
||||
/obj/item/gun/magic/wand/resurrection = 1, //medbay's best friend
|
||||
/obj/item/spellbook/oneuse/charge = 20, //and now for less useful stuff to dilute the good loot chances
|
||||
/obj/item/spellbook/oneuse/summonitem = 20,
|
||||
/obj/item/spellbook/oneuse/forcewall = 10,
|
||||
/obj/item/soulstone = 15 //spooky wizard stuff
|
||||
)
|
||||
@@ -89,12 +89,12 @@
|
||||
// The door to a hotel room, but also metadata for the room itself
|
||||
/obj/machinery/door/unpowered/hotel_door
|
||||
name = "Room Door"
|
||||
icon = 'icons/obj/doors/Doorsand.dmi'
|
||||
icon = 'icons/obj/doors/doorsand.dmi'
|
||||
icon_state = "door_closed"
|
||||
autoclose = 1
|
||||
var/doorOpen = 'sound/machines/airlock_open.ogg'
|
||||
var/doorClose = 'sound/machines/airlock_close.ogg'
|
||||
var/doorDeni = 'sound/machines/DeniedBeep.ogg'
|
||||
var/doorDeni = 'sound/machines/deniedbeep.ogg'
|
||||
var/id // the room number, eg 101
|
||||
var/obj/item/card/hotel_card/card// room's key card
|
||||
var/mob/living/occupant = null // the current room occupant
|
||||
|
||||
@@ -46,17 +46,17 @@
|
||||
if(!M.id || M.id == "")
|
||||
M.id = input(user, "Please select an ID for the button", "Buildmode", "")
|
||||
if(!M.id || M.id == "")
|
||||
goto(line_jump)
|
||||
if(P.id_tag == M.id && (P in range(M.range, M)) && P.id_tag && P.id_tag != "")
|
||||
goto line_jump
|
||||
if(P.id_tag == M.id && P.id_tag && P.id_tag != "")
|
||||
P.id_tag = null
|
||||
to_chat(user, "[P] unlinked.")
|
||||
goto(line_jump)
|
||||
goto line_jump
|
||||
if(!M.normaldoorcontrol)
|
||||
if(link_lines.len && alert(user, "Warning: This will disable links to connected pod doors. Continue?", "Buildmode", "Yes", "No") == "No")
|
||||
goto(line_jump)
|
||||
goto line_jump
|
||||
M.normaldoorcontrol = 1
|
||||
if(P.id_tag && alert(user, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No")
|
||||
goto(line_jump)
|
||||
goto line_jump
|
||||
P.id_tag = M.id
|
||||
if(istype(link_obj, /obj/machinery/door_control) && istype(object, /obj/machinery/door/poddoor))
|
||||
var/obj/machinery/door_control/M = link_obj
|
||||
@@ -64,21 +64,21 @@
|
||||
if(!M.id || M.id == "")
|
||||
M.id = input(user, "Please select an ID for the button", "Buildmode", "")
|
||||
if(!M.id || M.id == "")
|
||||
goto(line_jump)
|
||||
goto line_jump
|
||||
if(P.id_tag == M.id && P.id_tag && P.id_tag != "")
|
||||
P.id_tag = null
|
||||
to_chat(user, "[P] unlinked.")
|
||||
goto(line_jump)
|
||||
goto line_jump
|
||||
if(M.normaldoorcontrol)
|
||||
if(link_lines.len && alert(user, "Warning: This will disable links to connected airlocks. Continue?", "Buildmode", "Yes", "No") == "No")
|
||||
goto(line_jump)
|
||||
goto line_jump
|
||||
M.normaldoorcontrol = 0
|
||||
if(!M.id || M.id == "")
|
||||
M.id = input(user, "Please select an ID for the button", "Buildmode", "")
|
||||
if(!M.id || M.id == "")
|
||||
goto(line_jump)
|
||||
goto line_jump
|
||||
if(P.id_tag && P.id_tag != 1 && alert(user, "Warning: This will unlink something else from the door. Continue?", "Buildmode", "Yes", "No") == "No")
|
||||
goto(line_jump)
|
||||
goto line_jump
|
||||
P.id_tag = M.id
|
||||
|
||||
line_jump // For the goto
|
||||
@@ -86,7 +86,7 @@
|
||||
|
||||
if(istype(link_obj, /obj/machinery/door_control))
|
||||
var/obj/machinery/door_control/M = link_obj
|
||||
for(var/obj/machinery/door/airlock/P in range(M.range,M))
|
||||
for(var/obj/machinery/door/airlock/P in GLOB.airlocks)
|
||||
if(P.id_tag == M.id)
|
||||
form_connection(M, P, M.normaldoorcontrol)
|
||||
for(var/obj/machinery/door/poddoor/P in GLOB.airlocks)
|
||||
|
||||
@@ -17,8 +17,8 @@ You can set verify to TRUE if you want send() to sleep until the client has the
|
||||
//When sending mutiple assets, how many before we give the client a quaint little sending resources message
|
||||
#define ASSET_CACHE_TELL_CLIENT_AMOUNT 8
|
||||
|
||||
//When passively preloading assets, how many to send at once? Too high creates noticable lag where as too low can flood the client's cache with "verify" files
|
||||
#define ASSET_CACHE_PRELOAD_CONCURRENT 3
|
||||
//When passively preloading assets, how many to send at once? Too high creates noticable lag where as too low can flood the client's cache with "verify" files
|
||||
#define ASSET_CACHE_PRELOAD_CONCURRENT 3
|
||||
|
||||
/client
|
||||
var/list/cache = list() // List of all assets sent to this client by the asset cache.
|
||||
@@ -44,6 +44,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
|
||||
if(client.cache.Find(asset_name) || client.sending.Find(asset_name))
|
||||
return 0
|
||||
|
||||
log_asset("Sending asset [asset_name] to client [client]")
|
||||
client << browse_rsc(SSassets.cache[asset_name], asset_name)
|
||||
if(!verify) // Can't access the asset cache browser, rip.
|
||||
client.cache += asset_name
|
||||
@@ -92,6 +93,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
|
||||
to_chat(client, "Sending Resources...")
|
||||
for(var/asset in unreceived)
|
||||
if(asset in SSassets.cache)
|
||||
log_asset("Sending asset [asset] to client [client]")
|
||||
client << browse_rsc(SSassets.cache[asset], asset)
|
||||
|
||||
if(!verify) // Can't access the asset cache browser, rip.
|
||||
@@ -191,6 +193,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
|
||||
"large_stamp-cent.png" = 'icons/paper_icons/large_stamp-cent.png',
|
||||
"large_stamp-syndicate.png" = 'icons/paper_icons/large_stamp-syndicate.png',
|
||||
"large_stamp-rep.png" = 'icons/paper_icons/large_stamp-rep.png',
|
||||
"large_stamp-magistrate.png"= 'icons/paper_icons/large_stamp-magistrate.png',
|
||||
"talisman.png" = 'icons/paper_icons/talisman.png',
|
||||
"ntlogo.png" = 'icons/paper_icons/ntlogo.png'
|
||||
)
|
||||
@@ -291,7 +294,7 @@ You can set verify to TRUE if you want send() to sleep until the client has the
|
||||
/datum/asset/chem_master/register()
|
||||
for(var/i = 1 to 20)
|
||||
assets["pill[i].png"] = icon('icons/obj/chemical.dmi', "pill[i]")
|
||||
for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle"))
|
||||
for(var/i in list("bottle", "small_bottle", "wide_bottle", "round_bottle", "reagent_bottle"))
|
||||
assets["[i].png"] = icon('icons/obj/chemical.dmi', "[i]")
|
||||
for(var/asset_name in assets)
|
||||
register_asset(asset_name, assets[asset_name])
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
var/area = null
|
||||
var/time_died_as_mouse = null //when the client last died as a mouse
|
||||
|
||||
var/typing = FALSE // Prevents typing window stacking
|
||||
|
||||
var/adminhelped = 0
|
||||
|
||||
var/gc_destroyed //Time when this object was destroyed.
|
||||
@@ -65,25 +67,6 @@
|
||||
// Set on login.
|
||||
var/datum/media_manager/media = null
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
//adv. hotkey mode vars, code using them in /interface/interface.dm//
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
var/hotkeytype = "QWERTY" //what set of hotkeys is in use(defaulting to QWERTY because I can't be bothered to make this save on SQL)
|
||||
var/hotkeyon = 0 //is the hotkey on?
|
||||
|
||||
var/hotkeylist = list( //list defining hotkey types, look at lists in place for structure if adding any if the future
|
||||
"QWERTY" = list(
|
||||
"on" = "hotkeymode",
|
||||
"off" = "macro"),
|
||||
"AZERTY" = list(
|
||||
"on" = "AZERTYon",
|
||||
"off" = "AZERTYoff"),
|
||||
"Cyborg" = list(
|
||||
"on" = "borghotkeymode",
|
||||
"off" = "borgmacro")
|
||||
)
|
||||
|
||||
var/topic_debugging = 0 //if set to true, allows client to see nanoUI errors -- yes i realize this is messy but it'll make live testing infinitely easier
|
||||
|
||||
control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS
|
||||
|
||||
@@ -290,6 +290,10 @@
|
||||
return null
|
||||
if(byond_version < MIN_CLIENT_VERSION) // Too out of date to play at all. Unfortunately, we can't send them a message here.
|
||||
return null
|
||||
if(byond_build < config.minimum_client_build)
|
||||
alert(src, "You are using a byond build which is not supported by this server. Please use a build version of atleast [config.minimum_client_build].", "Incorrect build", "OK")
|
||||
del(src)
|
||||
return
|
||||
if(byond_version < SUGGESTED_CLIENT_VERSION) // Update is suggested, but not required.
|
||||
to_chat(src,"<span class='userdanger'>Your BYOND client (v: [byond_version]) is out of date. This can cause glitches. We highly suggest you download the latest client from http://www.byond.com/ before playing. </span>")
|
||||
|
||||
@@ -310,6 +314,11 @@
|
||||
GLOB.directory[ckey] = src
|
||||
|
||||
//Admin Authorisation
|
||||
// Automatically makes localhost connection an admin
|
||||
if(!config.disable_localhost_admin)
|
||||
var/localhost_addresses = list("127.0.0.1", "::1") // Adresses
|
||||
if(!isnull(address) && address in localhost_addresses)
|
||||
new /datum/admins("!LOCALHOST!", R_HOST, ckey) // Makes localhost rank
|
||||
holder = admin_datums[ckey]
|
||||
if(holder)
|
||||
GLOB.admins += src
|
||||
@@ -366,10 +375,21 @@
|
||||
|
||||
send_resources()
|
||||
|
||||
if(prefs.toggles & UI_DARKMODE) // activates dark mode if its flagged. -AA07
|
||||
if(establish_db_connection())
|
||||
activate_darkmode()
|
||||
|
||||
if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates. -CP
|
||||
if(establish_db_connection())
|
||||
winset(src, "rpane.changelog", "background-color=#f4aa94;font-style=bold")
|
||||
to_chat(src, "<span class='info'>Changelog has changed since your last visit.</span>")
|
||||
update_changelog_button()
|
||||
|
||||
if(prefs.toggles & DISABLE_KARMA) // activates if karma is disabled
|
||||
if(establish_db_connection())
|
||||
to_chat(src,"<span class='notice'>You have disabled karma gains.") // reminds those who have it disabled
|
||||
else
|
||||
if(establish_db_connection())
|
||||
to_chat(src,"<span class='notice'>You have enabled karma gains.")
|
||||
|
||||
if(!void)
|
||||
void = new()
|
||||
@@ -660,3 +680,93 @@
|
||||
|
||||
/client/proc/on_varedit()
|
||||
var_edited = TRUE
|
||||
|
||||
/////////////////
|
||||
// DARKMODE UI //
|
||||
/////////////////
|
||||
// IF YOU CHANGE ANYTHING IN ACTIVATE, MAKE SURE IT HAS A DEACTIVATE METHOD, -AA07
|
||||
/client/proc/activate_darkmode()
|
||||
///// BUTTONS /////
|
||||
update_changelog_button()
|
||||
/* Rpane */
|
||||
winset(src, "rpane.textb", "background-color=#40628a;text-color=#FFFFFF")
|
||||
winset(src, "rpane.infob", "background-color=#40628a;text-color=#FFFFFF")
|
||||
winset(src, "rpane.wikib", "background-color=#40628a;text-color=#FFFFFF")
|
||||
winset(src, "rpane.forumb", "background-color=#40628a;text-color=#FFFFFF")
|
||||
winset(src, "rpane.rulesb", "background-color=#40628a;text-color=#FFFFFF")
|
||||
winset(src, "rpane.githubb", "background-color=#40628a;text-color=#FFFFFF")
|
||||
/* Mainwindow */
|
||||
winset(src, "mainwindow.saybutton", "background-color=#40628a;text-color=#FFFFFF")
|
||||
winset(src, "mainwindow.mebutton", "background-color=#40628a;text-color=#FFFFFF")
|
||||
winset(src, "mainwindow.hotkey_toggle", "background-color=#40628a;text-color=#FFFFFF")
|
||||
///// UI ELEMENTS /////
|
||||
/* Mainwindow */
|
||||
winset(src, "mainwindow", "background-color=#272727")
|
||||
winset(src, "mainwindow.mainvsplit", "background-color=#272727")
|
||||
winset(src, "mainwindow.tooltip", "background-color=#272727")
|
||||
/* Outputwindow */
|
||||
winset(src, "outputwindow.outputwindow", "background-color=#272727")
|
||||
winset(src, "outputwindow.browseroutput", "background-color=#272727")
|
||||
/* Rpane */
|
||||
winset(src, "rpane", "background-color=#272727")
|
||||
winset(src, "rpane.rpane", "background-color=#272727")
|
||||
winset(src, "rpane.rpanewindow", "background-color=#272727")
|
||||
/* Browserwindow */
|
||||
winset(src, "browserwindow", "background-color=#272727")
|
||||
winset(src, "browserwindow.browser", "background-color=#272727")
|
||||
/* Infowindow */
|
||||
winset(src, "infowindow", "background-color=#272727;text-color=#FFFFFF")
|
||||
winset(src, "infowindow.info", "background-color=#272727;text-color=#FFFFFF;highlight-color=#009900;tab-text-color=#FFFFFF;tab-background-color=#272727")
|
||||
// NOTIFY USER
|
||||
to_chat(src, "<span class='notice'>Darkmode Enabled</span>")
|
||||
|
||||
/client/proc/deactivate_darkmode()
|
||||
///// BUTTONS /////
|
||||
update_changelog_button()
|
||||
/* Rpane */
|
||||
winset(src, "rpane.textb", "background-color=none;text-color=#000000")
|
||||
winset(src, "rpane.infob", "background-color=none;text-color=#000000")
|
||||
winset(src, "rpane.wikib", "background-color=none;text-color=#000000")
|
||||
winset(src, "rpane.forumb", "background-color=none;text-color=#000000")
|
||||
winset(src, "rpane.rulesb", "background-color=none;text-color=#000000")
|
||||
winset(src, "rpane.githubb", "background-color=none;text-color=#000000")
|
||||
/* Mainwindow */
|
||||
winset(src, "mainwindow.saybutton", "background-color=none;text-color=#000000")
|
||||
winset(src, "mainwindow.mebutton", "background-color=none;text-color=#000000")
|
||||
winset(src, "mainwindow.hotkey_toggle", "background-color=none;text-color=#000000")
|
||||
///// UI ELEMENTS /////
|
||||
/* Mainwindow */
|
||||
winset(src, "mainwindow", "background-color=none")
|
||||
winset(src, "mainwindow.mainvsplit", "background-color=none")
|
||||
winset(src, "mainwindow.tooltip", "background-color=none")
|
||||
/* Outputwindow */
|
||||
winset(src, "outputwindow.outputwindow", "background-color=none")
|
||||
winset(src, "outputwindow.browseroutput", "background-color=none")
|
||||
/* Rpane */
|
||||
winset(src, "rpane", "background-color=none")
|
||||
winset(src, "rpane.rpane", "background-color=none")
|
||||
winset(src, "rpane.rpanewindow", "background-color=none")
|
||||
/* Browserwindow */
|
||||
winset(src, "browserwindow", "background-color=none")
|
||||
winset(src, "browserwindow.browser", "background-color=none")
|
||||
/* Infowindow */
|
||||
winset(src, "infowindow", "background-color=none;text-color=#000000")
|
||||
winset(src, "infowindow.info", "background-color=none;text-color=#000000;highlight-color=#007700;tab-text-color=#000000;tab-background-color=none")
|
||||
///// NOTIFY USER /////
|
||||
to_chat(src, "<span class='notice'>Darkmode Disabled</span>") // what a sick fuck
|
||||
|
||||
// Better changelog button handling
|
||||
/client/proc/update_changelog_button()
|
||||
if(establish_db_connection())
|
||||
if(prefs.lastchangelog != changelog_hash)
|
||||
winset(src, "rpane.changelog", "background-color=#bb7700;text-color=#FFFFFF;font-style=bold")
|
||||
else
|
||||
if(prefs.toggles & UI_DARKMODE)
|
||||
winset(src, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF")
|
||||
else
|
||||
winset(src, "rpane.changelog", "background-color=none;text-color=#000000")
|
||||
else
|
||||
if(prefs.toggles & UI_DARKMODE)
|
||||
winset(src, "rpane.changelog", "background-color=#40628a;text-color=#FFFFFF")
|
||||
else
|
||||
winset(src, "rpane.changelog", "background-color=none;text-color=#000000")
|
||||
|
||||
@@ -23,6 +23,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
ROLE_NINJA = 21,
|
||||
ROLE_GSPIDER = 21,
|
||||
ROLE_ABDUCTOR = 30,
|
||||
ROLE_DEVIL = 14
|
||||
)
|
||||
|
||||
/proc/player_old_enough_antag(client/C, role)
|
||||
@@ -280,7 +281,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(species == "Vox")
|
||||
dat += "<b>N2 Tank:</b> <a href='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Large N2 Tank" : "Specialized N2 Tank"]</a><br>"
|
||||
if(species == "Grey")
|
||||
dat += "<b>Voice:</b> <a href ='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Wingdings" : "Normal"]</a><BR>"
|
||||
dat += "<b>Wingdings:</b> Set in disabilities<br>"
|
||||
dat += "<b>Voice Translator:</b> <a href ='?_src_=prefs;preference=speciesprefs;task=input'>[speciesprefs ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Secondary Language:</b> <a href='?_src_=prefs;preference=language;task=input'>[language]</a><br>"
|
||||
if(S.autohiss_basic_map)
|
||||
dat += "<b>Auto-accent:</b> <a href='?_src_=prefs;preference=autohiss_mode;task=input'>[autohiss_mode == AUTOHISS_FULL ? "Full" : (autohiss_mode == AUTOHISS_BASIC ? "Basic" : "Off")]</a><br>"
|
||||
@@ -433,37 +435,35 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
dat += "</td></tr></table>"
|
||||
|
||||
if(TAB_GAME) // General Preferences
|
||||
// LEFT SIDE OF THE PAGE
|
||||
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
|
||||
dat += "<h2>General Settings</h2>"
|
||||
dat += "<b>Fancy NanoUI:</b> <a href='?_src_=prefs;preference=nanoui'>[(nanoui_fancy) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Ghost-Item Attack Animation:</b> <a href='?_src_=prefs;preference=ghost_att_anim'>[(show_ghostitem_attack) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Window Flashing:</b> <a href='?_src_=prefs;preference=winflash'>[(windowflashing) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>Custom UI settings:</b><br>"
|
||||
dat += " - <b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
|
||||
dat += " - <b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <table style='display:inline;' bgcolor='[UI_style_color]'<tr><td>__</td></tr></table><br>"
|
||||
dat += " - <b>Alpha (transparency):</b> <a href='?_src_=prefs;preference=UIalpha'><b>[UI_style_alpha]</b></a><br>"
|
||||
dat += "<br>"
|
||||
dat += "<b>Play admin midis:</b> <a href='?_src_=prefs;preference=hear_midis'><b>[(sound & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Play lobby music:</b> <a href='?_src_=prefs;preference=lobby_music'><b>[(sound & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Attack Animations:</b> <a href='?_src_=prefs;preference=ghost_att_anim'>[(show_ghostitem_attack) ? "Yes" : "No"]</a><br>"
|
||||
if(user.client.holder)
|
||||
dat += "<b>Adminhelp sound:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=hear_adminhelps'><b>[(sound & SOUND_ADMINHELP)?"On":"Off"]</b></a><br>"
|
||||
|
||||
if(check_rights(R_ADMIN,0))
|
||||
dat += "<b>OOC:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : normal_ooc_colour];'> </span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
|
||||
if(config.allow_Metadata)
|
||||
dat += "<b>OOC notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'><b>Edit</b></a><br>"
|
||||
dat += "<b>Adminhelp sound:</b> <a href='?_src_=prefs;preference=hear_adminhelps'><b>[(sound & SOUND_ADMINHELP)?"On":"Off"]</b></a><br>"
|
||||
if(unlock_content)
|
||||
dat += "<b>BYOND Membership Publicity:</b> <a href='?_src_=prefs;preference=publicity'><b>[(toggles & MEMBER_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
|
||||
dat += "<b>Custom UI settings:</b><br>"
|
||||
dat += " - <b>Alpha (transparency):</b> <a href='?_src_=prefs;preference=UIalpha'><b>[UI_style_alpha]</b></a><br>"
|
||||
dat += " - <b>Color:</b> <a href='?_src_=prefs;preference=UIcolor'><b>[UI_style_color]</b></a> <span style='border: 1px solid #161616; background-color: [UI_style_color];'> </span><br>"
|
||||
dat += " - <b>UI Style:</b> <a href='?_src_=prefs;preference=ui'><b>[UI_style]</b></a><br>"
|
||||
dat += "<b>Deadchat Anonymity:</b> <a href='?_src_=prefs;preference=ghost_anonsay'><b>[ghost_anonsay ? "Anonymous" : "Not Anonymous"]</b></a><br>"
|
||||
if(user.client.donator_level >= DONATOR_LEVEL_ONE)
|
||||
dat += "<b>Donator Publicity:</b> <a href='?_src_=prefs;preference=donor_public'><b>[(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"]</b></a><br>"
|
||||
|
||||
dat += "<b>Randomized character slot:</b> <a href='?_src_=prefs;preference=randomslot'><b>[randomslot ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Ghost ears:</b> <a href='?_src_=prefs;preference=ghost_ears'><b>[(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</b></a><br>"
|
||||
dat += "<b>Ghost sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]</b></a><br>"
|
||||
dat += "<b>Ghost radio:</b> <a href='?_src_=prefs;preference=ghost_radio'><b>[(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]</b></a><br>"
|
||||
dat += "<b>Deadchat anonymity:</b> <a href='?_src_=prefs;preference=ghost_anonsay'><b>[ghost_anonsay ? "Anonymous" : "Not Anonymous"]</b></a><br>"
|
||||
dat += "<b>Fancy NanoUI:</b> <a href='?_src_=prefs;preference=nanoui'>[(nanoui_fancy) ? "Yes" : "No"]</a><br>"
|
||||
dat += "<b>FPS:</b> <a href='?_src_=prefs;preference=clientfps;task=input'>[clientfps]</a><br>"
|
||||
dat += "<b>Ghost Ears:</b> <a href='?_src_=prefs;preference=ghost_ears'><b>[(toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]</b></a><br>"
|
||||
dat += "<b>Ghost Sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]</b></a><br>"
|
||||
dat += "<b>Ghost Radio:</b> <a href='?_src_=prefs;preference=ghost_radio'><b>[(toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]</b></a><br>"
|
||||
if(check_rights(R_ADMIN,0))
|
||||
dat += "<b>OOC Color:</b> <span style='border: 1px solid #161616; background-color: [ooccolor ? ooccolor : normal_ooc_colour];'> </span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
|
||||
if(config.allow_Metadata)
|
||||
dat += "<b>OOC Notes:</b> <a href='?_src_=prefs;preference=metadata;task=input'><b>Edit</b></a><br>"
|
||||
dat += "<b>Play Admin MIDIs:</b> <a href='?_src_=prefs;preference=hear_midis'><b>[(sound & SOUND_MIDI) ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Play Lobby Music:</b> <a href='?_src_=prefs;preference=lobby_music'><b>[(sound & SOUND_LOBBY) ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Randomized Character Slot:</b> <a href='?_src_=prefs;preference=randomslot'><b>[randomslot ? "Yes" : "No"]</b></a><br>"
|
||||
dat += "<b>Window Flashing:</b> <a href='?_src_=prefs;preference=winflash'>[(windowflashing) ? "Yes" : "No"]</a><br>"
|
||||
// RIGHT SIDE OF THE PAGE
|
||||
dat += "</td><td width='300px' height='300px' valign='top'>"
|
||||
dat += "<h2>Special Role Settings</h2>"
|
||||
if(jobban_isbanned(user, "Syndicate"))
|
||||
@@ -552,7 +552,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
dat += "<a href='?_src_=prefs;preference=reset_all'>Reset Setup</a>"
|
||||
dat += "</center>"
|
||||
|
||||
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 820, 640)
|
||||
var/datum/browser/popup = new(user, "preferences", "<div align='center'>Character Setup</div>", 820, 660)
|
||||
popup.set_content(dat)
|
||||
popup.open(0)
|
||||
|
||||
@@ -827,29 +827,30 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
return 1
|
||||
|
||||
/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label)
|
||||
/datum/preferences/proc/ShowDisabilityState(mob/user, flag, label)
|
||||
var/datum/species/S = GLOB.all_species[species]
|
||||
if(flag==DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))
|
||||
if(flag == DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))
|
||||
return "<li><i>[species] cannot be fat.</i></li>"
|
||||
return "<li><b>[label]:</b> <a href=\"?_src_=prefs;task=input;preference=disabilities;disability=[flag]\">[disabilities & flag ? "Yes" : "No"]</a></li>"
|
||||
|
||||
/datum/preferences/proc/SetDisabilities(mob/user)
|
||||
var/datum/species/S = GLOB.all_species[species]
|
||||
var/HTML = "<body>"
|
||||
HTML += "<tt><center>"
|
||||
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs glasses")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_COLOURBLIND,"Colourblind")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_TOURETTES,"Tourettes syndrome") // this will / can not be abused. It also SEVERELY stuns. It's just for fun.
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NERVOUS,"Stutter")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_SWEDISH,"Swedish accent")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_LISP,"Lisp")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DIZZY,"Dizziness")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_SCRAMBLED,"Can't speak properly")
|
||||
if(CAN_WINGDINGS in S.species_traits)
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_WINGDINGS, "Speak in Wingdings")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_NEARSIGHTED, "Nearsighted")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_COLOURBLIND, "Colourblind")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_BLIND, "Blind")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_DEAF, "Deaf")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_MUTE, "Mute")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_FAT, "Obese")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_NERVOUS, "Stutter")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_SWEDISH, "Swedish accent")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_CHAV, "Chav accent")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_LISP, "Lisp")
|
||||
HTML += ShowDisabilityState(user, DISABILITY_FLAG_DIZZY, "Dizziness")
|
||||
|
||||
|
||||
HTML += {"</ul>
|
||||
@@ -857,7 +858,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
<a href=\"?_src_=prefs;task=reset;preference=disabilities\">\[Reset\]</a>
|
||||
</center></tt>"}
|
||||
|
||||
var/datum/browser/popup = new(user, "disabil", "<div align='center'>Choose Disabilities</div>", 350, 300)
|
||||
var/datum/browser/popup = new(user, "disabil", "<div align='center'>Choose Disabilities</div>", 350, 380)
|
||||
popup.set_content(HTML)
|
||||
popup.open(0)
|
||||
|
||||
@@ -2191,47 +2192,53 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
character.change_eye_color(e_colour)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.dna.species.species_traits))
|
||||
character.dna.SetSEState(FATBLOCK,1,1)
|
||||
character.dna.SetSEState(FATBLOCK, TRUE, TRUE)
|
||||
character.overeatduration = 600
|
||||
character.dna.default_blocks.Add(FATBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_NEARSIGHTED)
|
||||
character.dna.SetSEState(GLASSESBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_EPILEPTIC)
|
||||
character.dna.SetSEState(EPILEPSYBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_DEAF)
|
||||
character.dna.SetSEState(DEAFBLOCK,1,1)
|
||||
character.dna.SetSEState(GLASSESBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(GLASSESBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_BLIND)
|
||||
character.dna.SetSEState(BLINDBLOCK,1,1)
|
||||
character.dna.SetSEState(BLINDBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(BLINDBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_DEAF)
|
||||
character.dna.SetSEState(DEAFBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(DEAFBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_COLOURBLIND)
|
||||
character.dna.SetSEState(COLOURBLINDBLOCK,1,1)
|
||||
character.dna.SetSEState(COLOURBLINDBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(COLOURBLINDBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_MUTE)
|
||||
character.dna.SetSEState(MUTEBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_TOURETTES)
|
||||
character.dna.SetSEState(TWITCHBLOCK,1,1)
|
||||
character.dna.SetSEState(MUTEBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(MUTEBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_NERVOUS)
|
||||
character.dna.SetSEState(NERVOUSBLOCK,1,1)
|
||||
character.dna.SetSEState(NERVOUSBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(NERVOUSBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SWEDISH)
|
||||
character.dna.SetSEState(SWEDEBLOCK,1,1)
|
||||
character.dna.SetSEState(SWEDEBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(SWEDEBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
|
||||
if(disabilities & DISABILITY_FLAG_CHAV)
|
||||
character.dna.SetSEState(CHAVBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(CHAVBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_LISP)
|
||||
character.dna.SetSEState(LISPBLOCK,1,1)
|
||||
character.dna.SetSEState(LISPBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(LISPBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_DIZZY)
|
||||
character.dna.SetSEState(DIZZYBLOCK,1,1)
|
||||
character.dna.SetSEState(DIZZYBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(DIZZYBLOCK)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
|
||||
if(disabilities & DISABILITY_FLAG_WINGDINGS && (CAN_WINGDINGS in character.dna.species.species_traits))
|
||||
character.dna.SetSEState(WINGDINGSBLOCK, TRUE, TRUE)
|
||||
character.dna.default_blocks.Add(WINGDINGSBLOCK)
|
||||
|
||||
character.dna.species.handle_dna(character)
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
|
||||
UI_style = sanitize_inlist(UI_style, list("White", "Midnight"), initial(UI_style))
|
||||
default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot))
|
||||
toggles = sanitize_integer(toggles, 0, 65535, initial(toggles))
|
||||
toggles = sanitize_integer(toggles, 0, 2097151, initial(toggles))
|
||||
sound = sanitize_integer(sound, 0, 65535, initial(sound))
|
||||
UI_style_color = sanitize_hexcolor(UI_style_color, initial(UI_style_color))
|
||||
UI_style_alpha = sanitize_integer(UI_style_alpha, 0, 255, initial(UI_style_alpha))
|
||||
@@ -482,7 +482,10 @@
|
||||
|
||||
/datum/preferences/proc/SetChangelog(client/C,hash)
|
||||
lastchangelog=hash
|
||||
winset(C, "rpane.changelog", "background-color=none;font-style=")
|
||||
if(preferences_datums[C.ckey].toggles & UI_DARKMODE)
|
||||
winset(C, "rpane.changelog", "background-color=#40628a;font-color=#ffffff;font-style=none")
|
||||
else
|
||||
winset(C, "rpane.changelog", "background-color=none;font-style=none")
|
||||
var/DBQuery/query = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastchangelog='[lastchangelog]' WHERE ckey='[C.ckey]'")
|
||||
if(!query.Execute())
|
||||
var/err = query.ErrorMsg()
|
||||
|
||||
@@ -46,6 +46,17 @@
|
||||
to_chat(usr, "You will [(prefs.sound & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive.")
|
||||
feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/togglementorhelpsound()
|
||||
set name = "Hear/Silence Mentorhelp Bwoinks"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggle hearing a notification when mentorhelps are recieved"
|
||||
if(!holder)
|
||||
return
|
||||
prefs.sound ^= SOUND_MENTORHELP
|
||||
prefs.save_preferences(src)
|
||||
to_chat(usr, "You will [(prefs.sound & SOUND_MENTORHELP) ? "now" : "no longer"] hear a sound when mentorhelps arrive.")
|
||||
feedback_add_details("admin_verb","MHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/deadchat() // Deadchat toggle is usable by anyone.
|
||||
set name = "Show/Hide Deadchat"
|
||||
set category = "Preferences"
|
||||
@@ -195,4 +206,40 @@
|
||||
set category = "Preferences"
|
||||
set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will."
|
||||
prefs.current_tab = 1
|
||||
prefs.ShowChoices(usr)
|
||||
prefs.ShowChoices(usr)
|
||||
|
||||
/client/verb/toggle_darkmode()
|
||||
set name = "Toggle Darkmode"
|
||||
set category = "Preferences"
|
||||
set desc = "Toggles UI style between dark and light"
|
||||
prefs.toggles ^= UI_DARKMODE
|
||||
prefs.save_preferences(src)
|
||||
if(prefs.toggles & UI_DARKMODE)
|
||||
activate_darkmode()
|
||||
else
|
||||
deactivate_darkmode()
|
||||
feedback_add_details("admin_verb","TDarkmode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_karma()
|
||||
set name = "Toggle Karma Gains"
|
||||
set category = "Special Verbs"
|
||||
set desc = "This button will allow you to stop other people giving you karma."
|
||||
prefs.toggles ^= DISABLE_KARMA
|
||||
prefs.save_preferences(src)
|
||||
if(prefs.toggles & DISABLE_KARMA)
|
||||
to_chat(usr, "<span class='notice'>You have disabled karma gains.")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You have enabled karma gains.")
|
||||
return
|
||||
|
||||
/client/verb/toggle_popup_limiter()
|
||||
set name = "Toggle Text Popup Limiter"
|
||||
set category = "Preferences"
|
||||
set desc = "Will let you limit the text input popups to one at a time."
|
||||
prefs.toggles ^= TYPING_ONCE
|
||||
prefs.save_preferences(src)
|
||||
if(prefs.toggles & TYPING_ONCE)
|
||||
to_chat(usr, "<span class='notice'>You have enabled text popup limiting.")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>You have disabled text popup limiting.")
|
||||
return
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
var/toggle_cooldown = null
|
||||
var/cooldown = 0
|
||||
var/species_disguise = null
|
||||
var/magical = FALSE
|
||||
|
||||
//BS12: Species-restricted clothing check.
|
||||
/obj/item/clothing/mob_can_equip(M as mob, slot)
|
||||
|
||||
@@ -409,6 +409,18 @@
|
||||
origin_tech = "magnets=3;syndicate=4"
|
||||
prescription_upgradable = 1
|
||||
|
||||
/obj/item/clothing/glasses/thermal/syndi/sunglasses
|
||||
name = "sunglasses"
|
||||
desc = "Strangely ancient technology used to help provide rudimentary eye cover."
|
||||
icon_state = "sun"
|
||||
item_state = "sunglasses"
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/thermal/monocle
|
||||
name = "Thermoncle"
|
||||
desc = "A monocle thermal."
|
||||
@@ -520,6 +532,10 @@
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
up = 0
|
||||
tint = 0
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/tajblind/eng
|
||||
name = "industrial veil"
|
||||
|
||||
@@ -83,6 +83,7 @@
|
||||
origin_tech = "magnets=3;combat=2"
|
||||
var/global/list/jobs[0]
|
||||
HUDType = DATA_HUD_SECURITY_ADVANCED
|
||||
var/read_only = FALSE
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
@@ -114,6 +115,9 @@
|
||||
invis_view = SEE_INVISIBLE_MINIMUM //don't render darkness while wearing these
|
||||
prescription_upgradable = 0
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/sunglasses/read_only
|
||||
read_only = TRUE
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/sunglasses
|
||||
name = "HUDSunglasses"
|
||||
desc = "Sunglasses with a HUD."
|
||||
@@ -161,6 +165,10 @@
|
||||
flags_cover = GLASSESCOVERSEYES
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
up = 0
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/tajblind/attack_self()
|
||||
toggle_veil()
|
||||
@@ -173,6 +181,10 @@
|
||||
flags_cover = GLASSESCOVERSEYES
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
up = 0
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/health/tajblind/attack_self()
|
||||
toggle_veil()
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
description_antag = "These are a pair of power gloves, and can be used to fire bolts of electricity while standing over powered power cables."
|
||||
var/old_mclick_override
|
||||
var/datum/middleClickOverride/power_gloves/mclick_override = new /datum/middleClickOverride/power_gloves
|
||||
var/last_shocked = 0
|
||||
var/shock_delay = 40
|
||||
var/unlimited_power = FALSE // Does this really need explanation?
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power/equipped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
@@ -21,7 +24,10 @@
|
||||
if(H.middleClickOverride)
|
||||
old_mclick_override = H.middleClickOverride
|
||||
H.middleClickOverride = mclick_override
|
||||
to_chat(H, "<span class='notice'>You feel electricity begin to build up in [src].</span>")
|
||||
if(!unlimited_power)
|
||||
to_chat(H, "<span class='notice'>You feel electricity begin to build up in [src].</span>")
|
||||
else
|
||||
to_chat(H, "<span class='biggerdanger'>You feel like you have UNLIMITED POWER!!</span>")
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power/dropped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
@@ -34,6 +40,12 @@
|
||||
else
|
||||
H.middleClickOverride = null
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/power/unlimited
|
||||
name = "UNLIMITED POWER gloves"
|
||||
desc = "These gloves possess UNLIMITED POWER."
|
||||
shock_delay = 0
|
||||
unlimited_power = TRUE
|
||||
|
||||
/obj/item/clothing/gloves/color/yellow/fake
|
||||
desc = "These gloves will protect the wearer from electric shock. They don't feel like rubber..."
|
||||
siemens_coefficient = 1
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
icon_state = "ironring"
|
||||
item_state = ""
|
||||
icon = 'icons/obj/clothing/rings.dmi'
|
||||
var/fluff_material = FALSE //If true, will ignore the material when examining
|
||||
var/material = "iron"
|
||||
var/stud = 0
|
||||
|
||||
@@ -21,7 +22,8 @@
|
||||
|
||||
/obj/item/clothing/gloves/ring/examine(mob/user)
|
||||
..(user)
|
||||
to_chat(user, "This one is made of [material].")
|
||||
if(!fluff_material)
|
||||
to_chat(user, "This one is made of [material].")
|
||||
if(stud)
|
||||
to_chat(user, "It is adorned with a single gem.")
|
||||
|
||||
|
||||
@@ -5,18 +5,21 @@
|
||||
icon_state = "hardhat0_yellow"
|
||||
item_state = "hardhat0_yellow"
|
||||
var/brightness_on = 4 //luminosity when on
|
||||
var/on = 0
|
||||
var/on = FALSE
|
||||
item_color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite)
|
||||
armor = list(melee = 15, bullet = 5, laser = 20, energy = 10, bomb = 20, bio = 10, rad = 20)
|
||||
flags_inv = 0
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_light)
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/hardhat/attack_self(mob/user)
|
||||
on = !on
|
||||
icon_state = "hardhat[on]_[item_color]"
|
||||
item_state = "hardhat[on]_[item_color]"
|
||||
|
||||
if(on)
|
||||
set_light(brightness_on)
|
||||
else
|
||||
@@ -26,6 +29,13 @@
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/clothing/head/hardhat/extinguish_light()
|
||||
if(on)
|
||||
on = FALSE
|
||||
set_light(0)
|
||||
icon_state = "hardhat0_[item_color]"
|
||||
item_state = "hardhat0_[item_color]"
|
||||
visible_message("<span class='danger'>[src]'s light fades and turns off.</span>")
|
||||
|
||||
/obj/item/clothing/head/hardhat/orange
|
||||
icon_state = "hardhat0_orange"
|
||||
|
||||
@@ -103,7 +103,7 @@
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_light)
|
||||
can_toggle = 1
|
||||
toggle_cooldown = 20
|
||||
active_sound = 'sound/items/WEEOO1.ogg'
|
||||
active_sound = 'sound/items/weeoo1.ogg'
|
||||
|
||||
/obj/item/clothing/head/helmet/justice/escape
|
||||
name = "alarm helmet"
|
||||
@@ -173,7 +173,7 @@
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
|
||||
can_toggle = 1
|
||||
toggle_cooldown = 20
|
||||
toggle_sound = 'sound/items/ZippoClose.ogg'
|
||||
toggle_sound = 'sound/items/zippoclose.ogg'
|
||||
|
||||
obj/item/clothing/head/helmet/redtaghelm
|
||||
name = "red laser tag helmet"
|
||||
|
||||
@@ -20,6 +20,12 @@
|
||||
icon_state = "pwig"
|
||||
item_state = "pwig"
|
||||
|
||||
/obj/item/clothing/head/justice_wig
|
||||
name = "Justice wig"
|
||||
desc = "A fancy powdered wig given to arbitrators of the law. It looks itchy."
|
||||
icon_state = "jwig"
|
||||
item_state = "jwig"
|
||||
|
||||
/obj/item/clothing/head/beret/blue
|
||||
icon_state = "beret_blue"
|
||||
|
||||
@@ -70,6 +76,11 @@
|
||||
desc = "A plastic replica of a syndicate agent's space helmet, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
|
||||
|
||||
/obj/item/clothing/head/cueball
|
||||
name = "cueball helmet"
|
||||
@@ -79,6 +90,10 @@
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/snowman
|
||||
name = "snowman head"
|
||||
@@ -88,6 +103,10 @@
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/that
|
||||
name = "sturdy top-hat"
|
||||
@@ -246,6 +265,10 @@
|
||||
icon_state = "chickenhead"
|
||||
item_state = "chickensuit"
|
||||
flags = BLOCKHAIR
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/corgi
|
||||
name = "corgi suit head"
|
||||
@@ -396,6 +419,10 @@
|
||||
item_state = "griffinhat"
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
actions_types = list(/datum/action/item_action/caw)
|
||||
|
||||
/obj/item/clothing/head/griffin/attack_self()
|
||||
@@ -403,7 +430,7 @@
|
||||
|
||||
/obj/item/clothing/head/griffin/proc/caw()
|
||||
if(cooldown < world.time - 20) // A cooldown, to stop people being jerks
|
||||
playsound(src.loc, 'sound/misc/caw.ogg', 50, 1)
|
||||
playsound(src.loc, 'sound/creatures/caw.ogg', 50, 1)
|
||||
cooldown = world.time
|
||||
|
||||
|
||||
@@ -425,6 +452,10 @@
|
||||
icon_state = "papersack"
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEFACE|HIDEEARS
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/papersack/smiley
|
||||
name = "paper sack hat"
|
||||
@@ -432,6 +463,10 @@
|
||||
icon_state = "papersack_smile"
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEFACE|HIDEEARS
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/crown
|
||||
name = "crown"
|
||||
@@ -443,3 +478,9 @@
|
||||
name = "magnificent crown"
|
||||
desc = "A crown worn by only the highest emperors of the land."
|
||||
icon_state = "fancycrown"
|
||||
|
||||
/obj/item/clothing/head/zepelli
|
||||
name = "chequered diamond hat"
|
||||
desc = "Wearing this makes you feel like a real mozzarella cheeseball. "
|
||||
icon_state = "zepelli"
|
||||
item_state = "zepelli"
|
||||
@@ -6,6 +6,7 @@
|
||||
* Pumpkin head
|
||||
* Kitty ears
|
||||
* Cardborg Disguise
|
||||
* Head Mirror
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -131,6 +132,10 @@
|
||||
flags_inv = HIDEEARS
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/ushanka/attack_self(mob/user as mob)
|
||||
if(src.icon_state == "ushankadown")
|
||||
@@ -154,6 +159,10 @@
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
brightness_on = 2 //luminosity when on
|
||||
@@ -221,6 +230,11 @@
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
|
||||
species_disguise = "High-tech robot"
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
|
||||
/obj/item/clothing/head/cardborg/equipped(mob/living/user, slot)
|
||||
..()
|
||||
@@ -233,3 +247,19 @@
|
||||
/obj/item/clothing/head/cardborg/dropped(mob/living/user)
|
||||
..()
|
||||
user.remove_alt_appearance("standard_borg_disguise")
|
||||
|
||||
/*
|
||||
* Head Mirror
|
||||
*/
|
||||
/obj/item/clothing/head/headmirror
|
||||
name = "head mirror"
|
||||
desc = "A band of rubber with a very reflective looking mirror attached to the front of it. One of the early signs of medical budget cuts."
|
||||
icon_state = "head_mirror"
|
||||
item_state = "head_mirror"
|
||||
species_fit = list("Vox, Drask")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/head.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
|
||||
@@ -119,12 +119,20 @@
|
||||
to_chat(M, "Your Clown Mask has now morphed into [choice], all praise the Honk Mother!")
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/mask/gas/clown_hat/sexy
|
||||
name = "sexy-clown wig and mask"
|
||||
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
|
||||
icon_state = "sexyclown"
|
||||
item_state = "sexyclown"
|
||||
|
||||
/obj/item/clothing/mask/gas/clownwiz
|
||||
name = "wizard clown wig and mask"
|
||||
desc = "Some pranksters are truly magical."
|
||||
icon_state = "wizzclown"
|
||||
item_state = "wizzclown"
|
||||
flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
|
||||
flags_inv = HIDEEARS | HIDEEYES
|
||||
magical = TRUE
|
||||
|
||||
/obj/item/clothing/mask/gas/virusclown_hat
|
||||
name = "clown wig and mask"
|
||||
@@ -133,13 +141,6 @@
|
||||
item_state = "clown_hat"
|
||||
flags = NODROP
|
||||
|
||||
/obj/item/clothing/mask/gas/sexyclown
|
||||
name = "sexy-clown wig and mask"
|
||||
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
|
||||
icon_state = "sexyclown"
|
||||
item_state = "sexyclown"
|
||||
burn_state = FLAMMABLE
|
||||
|
||||
/obj/item/clothing/mask/gas/mime
|
||||
name = "mime mask"
|
||||
desc = "The traditional mime's mask. It has an eerie facial posture."
|
||||
@@ -187,7 +188,7 @@
|
||||
|
||||
/obj/item/clothing/mask/gas/owl_mask/proc/hoot()
|
||||
if(cooldown < world.time - 35) // A cooldown, to stop people being jerks
|
||||
playsound(src.loc, 'sound/misc/hoot.ogg', 50, 1)
|
||||
playsound(src.loc, 'sound/creatures/hoot.ogg', 50, 1)
|
||||
cooldown = world.time
|
||||
|
||||
// ********************************************************************
|
||||
@@ -203,7 +204,7 @@
|
||||
var/safety = 1
|
||||
actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust, /datum/action/item_action/selectphrase)
|
||||
var/phrase_list = list(
|
||||
|
||||
|
||||
"halt" = "HALT! HALT! HALT! HALT!",
|
||||
"bobby" = "Stop in the name of the Law.",
|
||||
"compliance" = "Compliance is in your best interest.",
|
||||
@@ -272,11 +273,11 @@
|
||||
else if(actiontype == /datum/action/item_action/selectphrase)
|
||||
var/key = phrase_list[phrase]
|
||||
var/message = phrase_list[key]
|
||||
|
||||
|
||||
if (!safety)
|
||||
to_chat(user, "<span class='notice'>You set the restrictor to: FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT.</span>")
|
||||
return
|
||||
|
||||
|
||||
switch(aggressiveness)
|
||||
if(1)
|
||||
phrase = (phrase < 6) ? (phrase + 1) : 1
|
||||
|
||||
@@ -80,12 +80,6 @@
|
||||
to_chat(usr, "You lack the ability to manipulate the lock.")
|
||||
|
||||
|
||||
/obj/item/clothing/mask/muzzle/gag
|
||||
name = "gag"
|
||||
desc = "Stick this in their mouth to stop the noise."
|
||||
icon_state = "gag"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
/obj/item/clothing/mask/muzzle/tapegag
|
||||
name = "tape gag"
|
||||
desc = "MHPMHHH!"
|
||||
@@ -104,14 +98,13 @@
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user)
|
||||
var/atom/movable/R = new /obj/item/trash/tapetrash
|
||||
var/turf/T = get_turf(src)
|
||||
R.loc = T
|
||||
transfer_fingerprints_to(R)
|
||||
playsound(src,'sound/items/poster_ripped.ogg',40,1)
|
||||
/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/user)
|
||||
var/obj/item/trash/tapetrash/TT = new(drop_location(src))
|
||||
transfer_fingerprints_to(TT)
|
||||
user.transfer_fingerprints_to(TT)
|
||||
playsound(src, 'sound/items/poster_ripped.ogg', 40, 1)
|
||||
..()
|
||||
user.emote("scream")
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/mask/muzzle/safety
|
||||
name = "safety muzzle"
|
||||
@@ -182,9 +175,9 @@
|
||||
trigger.HasProximity(AM)
|
||||
|
||||
|
||||
/obj/item/clothing/mask/muzzle/safety/shock/hear_talk(mob/living/M as mob, msg)
|
||||
/obj/item/clothing/mask/muzzle/safety/shock/hear_talk(mob/living/M as mob, list/message_pieces)
|
||||
if(trigger)
|
||||
trigger.hear_talk(M, msg)
|
||||
trigger.hear_talk(M, message_pieces)
|
||||
|
||||
/obj/item/clothing/mask/muzzle/safety/shock/hear_message(mob/living/M as mob, msg)
|
||||
if(trigger)
|
||||
@@ -301,8 +294,10 @@
|
||||
var/voicechange = 0
|
||||
var/temporaryname = " the Horse"
|
||||
var/originalname = ""
|
||||
|
||||
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/horsehead/equipped(mob/user, slot)
|
||||
if(flags & NODROP) //cursed masks only
|
||||
@@ -496,5 +491,6 @@
|
||||
/obj/item/clothing/mask/cursedclown/suicide_act(mob/user)
|
||||
user.visible_message("<span class='danger'>[user] gazes into the eyes of [src]. [src] gazes back!</span>")
|
||||
spawn(10)
|
||||
user.gib()
|
||||
return BRUTELOSS
|
||||
if(user)
|
||||
user.gib()
|
||||
return OBLITERATION
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
var/magpulse = 0
|
||||
var/slowdown_active = 2
|
||||
var/slowdown_passive = SHOES_SLOWDOWN
|
||||
var/magpulse_name = "mag-pulse traction system"
|
||||
actions_types = list(/datum/action/item_action/toggle)
|
||||
strip_delay = 70
|
||||
put_on_delay = 70
|
||||
@@ -21,7 +22,7 @@
|
||||
slowdown = slowdown_active
|
||||
magpulse = !magpulse
|
||||
icon_state = "[magboot_state][magpulse]"
|
||||
to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.")
|
||||
to_chat(user, "You [magpulse ? "enable" : "disable"] the [magpulse_name].")
|
||||
user.update_inv_shoes() //so our mob-overlays update
|
||||
user.update_gravity(user.mob_has_gravity())
|
||||
for(var/X in actions)
|
||||
@@ -33,7 +34,7 @@
|
||||
|
||||
/obj/item/clothing/shoes/magboots/examine(mob/user)
|
||||
..(user)
|
||||
to_chat(user, "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"].")
|
||||
to_chat(user, "Its [magpulse_name] appears to be [magpulse ? "enabled" : "disabled"].")
|
||||
|
||||
|
||||
/obj/item/clothing/shoes/magboots/advance
|
||||
@@ -65,7 +66,28 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team
|
||||
slowdown = SHOES_SLOWDOWN+1
|
||||
slowdown_active = SHOES_SLOWDOWN+1
|
||||
slowdown_passive = SHOES_SLOWDOWN+1
|
||||
magpulse_name = "honk-powered traction system"
|
||||
item_color = "clown"
|
||||
silence_steps = 1
|
||||
shoe_sound = "clownstep"
|
||||
origin_tech = "magnets=4;syndicate=2"
|
||||
origin_tech = "magnets=4;syndicate=2"
|
||||
|
||||
/obj/item/clothing/shoes/magboots/wizard //bundled with the wiz hardsuit
|
||||
name = "boots of gripping"
|
||||
desc = "These magical boots, once activated, will stay gripped to any surface without slowing you down."
|
||||
icon_state = "wizmag0"
|
||||
magboot_state = "wizmag"
|
||||
slowdown_active = SHOES_SLOWDOWN //wiz hardsuit already slows you down, no need to double it
|
||||
magpulse_name = "gripping ability"
|
||||
magical = TRUE
|
||||
|
||||
/obj/item/clothing/shoes/magboots/wizard/attack_self(mob/user)
|
||||
if(user)
|
||||
if(user.mind in ticker.mode.wizards)
|
||||
if(magpulse) //faint blue light when shoes are turned on gives a reason to turn them off when not needed in maint
|
||||
set_light(0)
|
||||
else
|
||||
set_light(2, 1, LIGHT_COLOR_LIGHTBLUE)
|
||||
..()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You poke the gem on [src]. Nothing happens.</span>")
|
||||
@@ -44,6 +44,7 @@
|
||||
icon_state = "wizard"
|
||||
strip_delay = 50
|
||||
put_on_delay = 50
|
||||
magical = TRUE
|
||||
|
||||
/obj/item/clothing/shoes/sandal/marisa
|
||||
desc = "A pair of magic, black shoes."
|
||||
@@ -79,9 +80,13 @@
|
||||
slowdown = SHOES_SLOWDOWN+1
|
||||
item_color = "clown"
|
||||
var/footstep = 1 //used for squeeks whilst walking
|
||||
silence_steps = 1
|
||||
shoe_sound = "clownstep"
|
||||
|
||||
/obj/item/clothing/shoes/clown_shoes/magical
|
||||
name = "magical clown shoes"
|
||||
desc = "Standard-issue shoes of the wizarding class clown. Damn they're huge! And powerful! Somehow."
|
||||
magical = TRUE
|
||||
|
||||
/obj/item/clothing/shoes/jackboots
|
||||
name = "jackboots"
|
||||
desc = "Nanotrasen-issue Security combat boots for combat scenarios or combat situations. All combat, all the time."
|
||||
@@ -93,7 +98,6 @@
|
||||
put_on_delay = 50
|
||||
burn_state = FIRE_PROOF
|
||||
var/footstep = 1
|
||||
silence_steps = 1
|
||||
shoe_sound = "jackboot"
|
||||
|
||||
/obj/item/clothing/shoes/jackboots/jacksandals
|
||||
@@ -182,10 +186,10 @@
|
||||
item_state = "noble_boot"
|
||||
|
||||
/obj/item/clothing/shoes/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/stack/tape_roll))
|
||||
if(istype(I, /obj/item/stack/tape_roll) && !silence_steps)
|
||||
var/obj/item/stack/tape_roll/TR = I
|
||||
if((!silence_steps || shoe_sound) && TR.use(4))
|
||||
silence_steps = 1
|
||||
silence_steps = TRUE
|
||||
shoe_sound = null
|
||||
to_chat(user, "You tape the soles of [src] to silence your footsteps.")
|
||||
else
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
icon_state = "chronohelmet"
|
||||
item_state = "chronohelmet"
|
||||
slowdown = 1
|
||||
armor = list(melee = 60, bullet = 30/*bullet through the visor*/, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90)
|
||||
armor = list(melee = 60, bullet = 30, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90)
|
||||
var/obj/item/clothing/suit/space/chronos/suit = null
|
||||
|
||||
/obj/item/clothing/head/helmet/space/chronos/dropped()
|
||||
@@ -208,4 +208,4 @@
|
||||
holder.remote_control = null
|
||||
if(holder.client && (holder.client.eye == src))
|
||||
holder.client.eye = holder
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
@@ -57,6 +57,11 @@
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/extinguish_light()
|
||||
if(on)
|
||||
toggle_light()
|
||||
visible_message("<span class='danger'>[src]'s light fades and turns off.</span>")
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot)
|
||||
if(slot == slot_head)
|
||||
return 1
|
||||
@@ -67,7 +72,7 @@
|
||||
icon_state = "hardsuit-engineering"
|
||||
item_state = "eng_hardsuit"
|
||||
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
|
||||
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/t_scanner, /obj/item/rcd)
|
||||
allowed = list(/obj/item/flashlight,/obj/item/tank,/obj/item/t_scanner, /obj/item/rcd, /obj/item/rpd)
|
||||
siemens_coefficient = 0
|
||||
actions_types = list(/datum/action/item_action/toggle_helmet)
|
||||
|
||||
@@ -339,7 +344,7 @@
|
||||
linkedsuit = loc
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user)
|
||||
|
||||
|
||||
if(!linkedsuit)
|
||||
to_chat(user, "<span class='notice'>You must attach the helmet to a syndicate hardsuit to toggle combat mode!</span>")
|
||||
return
|
||||
@@ -462,6 +467,16 @@
|
||||
name = "elite syndicate hardsuit (combat)"
|
||||
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
|
||||
|
||||
//Strike team hardsuits
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/sst
|
||||
armor = list(melee = 70, bullet = 70, laser = 50, energy = 40, bomb = 80, bio = 100, rad = 100) //Almost as good as DS gear, but unlike DS can switch to combat for mobility
|
||||
icon_state = "hardsuit0-sst"
|
||||
item_color = "sst"
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/syndi/elite/sst
|
||||
armor = list(melee = 70, bullet = 70, laser = 50, energy = 40, bomb = 80, bio = 100, rad = 100)
|
||||
icon_state = "hardsuit0-sst"
|
||||
item_color = "sst"
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/syndi/freedom
|
||||
name = "eagle suit"
|
||||
@@ -479,15 +494,15 @@
|
||||
icon_state = "hardsuit0-wiz"
|
||||
item_state = "wiz_helm"
|
||||
item_color = "wiz"
|
||||
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
|
||||
unacidable = TRUE //No longer shall our kind be foiled by lone chemists with spray bottles!
|
||||
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
|
||||
heat_protection = HEAD //Uncomment to enable firesuit protection
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
magical = TRUE
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/wizard
|
||||
icon_state = "hardsuit-wiz"
|
||||
@@ -495,13 +510,13 @@
|
||||
desc = "A bizarre gem-encrusted suit that radiates magical energies."
|
||||
item_state = "wiz_hardsuit"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
unacidable = 1
|
||||
unacidable = TRUE
|
||||
armor = list(melee = 40, bullet = 40, laser = 40, energy = 20, bomb = 35, bio = 100, rad = 50)
|
||||
allowed = list(/obj/item/teleportation_scroll,/obj/item/tank)
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
sprite_sheets = null
|
||||
magical = TRUE
|
||||
|
||||
//Medical hardsuit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/medical
|
||||
@@ -634,7 +649,7 @@
|
||||
/obj/item/clothing/suit/space/hardsuit/shielded/process()
|
||||
if(world.time > recharge_cooldown && current_charges < max_charges)
|
||||
current_charges = Clamp((current_charges + recharge_rate), 0, max_charges)
|
||||
playsound(loc, 'sound/magic/Charge.ogg', 50, 1)
|
||||
playsound(loc, 'sound/magic/charge.ogg', 50, 1)
|
||||
if(current_charges == max_charges)
|
||||
playsound(loc, 'sound/machines/ding.ogg', 50, 1)
|
||||
processing_objects.Remove(src)
|
||||
|
||||
@@ -99,8 +99,22 @@
|
||||
name = "Santa's hat"
|
||||
desc = "Ho ho ho. Merrry X-mas!"
|
||||
icon_state = "santahat"
|
||||
species_fit = list("Grey, Drask")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/Grey/head.dmi',
|
||||
"Drask" = 'icons/mob/species/Drask/helmet.dmi'
|
||||
)
|
||||
flags = BLOCKHAIR | STOPSPRESSUREDMAGE
|
||||
flags_cover = HEADCOVERSEYES
|
||||
/obj/item/clothing/head/helmet/space/santahat/attack_self(mob/user as mob)
|
||||
if(src.icon_state == "santahat")
|
||||
src.icon_state = "santahat_beard"
|
||||
src.item_state = "santahat_beard"
|
||||
to_chat(user, "Santa's beard expands out from the hat!")
|
||||
else
|
||||
src.icon_state = "santahat"
|
||||
src.item_state = "santahat"
|
||||
to_chat(user, "The beard slinks back into the hat...")
|
||||
|
||||
/obj/item/clothing/suit/space/santa
|
||||
name = "Santa's suit"
|
||||
@@ -165,10 +179,9 @@
|
||||
desc = "A brand new paramedic EVA suit. The nitrile seems a bit too thin to be space proof. Used for retrieving bodies in space."
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
|
||||
species_restricted = list("exclude", "Diona", "Wryn")
|
||||
species_fit = list("Vox", "Grey" , "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
|
||||
species_fit = list("Vox", "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/suit.dmi',
|
||||
"Skrell" = 'icons/mob/species/skrell/suit.dmi',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/suit.dmi',
|
||||
|
||||
@@ -102,6 +102,11 @@
|
||||
var/datum/action/A = X
|
||||
A.UpdateButtonIcon()
|
||||
|
||||
/obj/item/clothing/head/helmet/space/eva/plasmaman/extinguish_light()
|
||||
if(on)
|
||||
toggle_light()
|
||||
visible_message("<span class='danger'>[src]'s light fades and turns off.</span>")
|
||||
|
||||
// ENGINEERING
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/atmostech
|
||||
name = "plasmaman atmospheric suit"
|
||||
@@ -403,8 +408,10 @@
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/wizard
|
||||
name = "robed plasmaman suit"
|
||||
icon_state = "plasmamanWizardBlue_suit"
|
||||
magical = TRUE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/eva/plasmaman/wizard
|
||||
name = "wizard hat"
|
||||
icon_state = "plasmamanWizardBlue_helmet0"
|
||||
base_state = "plasmamanWizardBlue_helmet"
|
||||
magical = TRUE
|
||||
|
||||
@@ -440,7 +440,7 @@
|
||||
name = "emergency response team security armor"
|
||||
desc = "A set of armor worn by security members of the Nanotrasen Emergency Response Team. Has red highlights."
|
||||
icon_state = "ertarmor_sec"
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/suit/armor/vest/ert/security/paranormal
|
||||
name = "emergency response team paranormal armor"
|
||||
@@ -465,3 +465,15 @@
|
||||
name = "emergency response team janitor armor"
|
||||
desc = "A set of armor worn by janitorial members of the Nanotrasen Emergency Response Team. Has red and white highlights."
|
||||
icon_state = "ertarmor_jan"
|
||||
|
||||
//same defense as basic sec armor
|
||||
/obj/item/clothing/suit/storage/lawyer/blackjacket/armored
|
||||
desc = "A snappy dress jacket, reinforced with a layer of armor protecting the torso."
|
||||
allowed = list(/obj/item/tank/emergency_oxygen, /obj/item/gun/projectile/revolver, /obj/item/gun/projectile/automatic/pistol)
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO
|
||||
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
|
||||
heat_protection = UPPER_TORSO|LOWER_TORSO
|
||||
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
|
||||
burn_state = FIRE_PROOF
|
||||
armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
|
||||
@@ -9,10 +9,11 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
|
||||
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Grey")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi'
|
||||
)
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/bio_suit
|
||||
name = "bio suit"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
item_state = "bluetag"
|
||||
blood_overlay_type = "armor"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
allowed = list (/obj/item/gun/energy/laser/bluetag)
|
||||
allowed = list (/obj/item/gun/energy/laser/tag/blue)
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
@@ -30,7 +30,7 @@
|
||||
item_state = "redtag"
|
||||
blood_overlay_type = "armor"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
allowed = list (/obj/item/gun/energy/laser/redtag)
|
||||
allowed = list (/obj/item/gun/energy/laser/tag/red)
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
|
||||
@@ -28,8 +28,8 @@
|
||||
pockets.emp_act(severity)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/storage/hear_talk(mob/M, var/msg)
|
||||
pockets.hear_talk(M, msg)
|
||||
/obj/item/clothing/suit/storage/hear_talk(mob/M, list/message_pieces)
|
||||
pockets.hear_talk(M, message_pieces)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/suit/storage/hear_message(mob/M, var/msg)
|
||||
|
||||
@@ -77,7 +77,8 @@
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/bomb_suit
|
||||
@@ -130,7 +131,8 @@
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/head.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/head.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/radiation
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
//Not given any special protective value since the magic robes are full-body protection --NEO
|
||||
strip_delay = 50
|
||||
put_on_delay = 50
|
||||
magical = TRUE
|
||||
|
||||
/obj/item/clothing/head/wizard/red
|
||||
name = "red wizard hat"
|
||||
@@ -35,6 +36,7 @@
|
||||
gas_transfer_coefficient = 1
|
||||
permeability_coefficient = 1
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
magical = FALSE
|
||||
|
||||
/obj/item/clothing/head/wizard/marisa
|
||||
name = "Witch Hat"
|
||||
@@ -67,6 +69,7 @@
|
||||
strip_delay = 50
|
||||
put_on_delay = 50
|
||||
burn_state = FIRE_PROOF
|
||||
magical = TRUE
|
||||
|
||||
/obj/item/clothing/suit/wizrobe/red
|
||||
name = "red wizard robe"
|
||||
@@ -120,6 +123,7 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
unacidable = 0
|
||||
burn_state = FLAMMABLE
|
||||
magical = FALSE
|
||||
|
||||
/obj/item/clothing/head/wizard/marisa/fake
|
||||
name = "Witch Hat"
|
||||
@@ -130,6 +134,7 @@
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
unacidable = 0
|
||||
burn_state = FLAMMABLE
|
||||
magical = FALSE
|
||||
|
||||
/obj/item/clothing/suit/wizrobe/marisa/fake
|
||||
name = "Witch Robe"
|
||||
@@ -140,4 +145,5 @@
|
||||
permeability_coefficient = 1
|
||||
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
unacidable = 0
|
||||
burn_state = FLAMMABLE
|
||||
burn_state = FLAMMABLE
|
||||
magical = FALSE
|
||||
@@ -40,8 +40,8 @@
|
||||
hold.emp_act(severity)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/accessory/storage/hear_talk(mob/M, var/msg, verb, datum/language/speaking)
|
||||
hold.hear_talk(M, msg, verb, speaking)
|
||||
/obj/item/clothing/accessory/storage/hear_talk(mob/M, list/message_pieces, verb)
|
||||
hold.hear_talk(M, message_pieces, verb)
|
||||
..()
|
||||
|
||||
/obj/item/clothing/accessory/storage/hear_message(mob/M, var/msg, verb, datum/language/speaking)
|
||||
|
||||
@@ -81,6 +81,13 @@
|
||||
score_clownabuse++
|
||||
return ..()
|
||||
|
||||
/obj/item/clothing/under/rank/clown/sexy
|
||||
name = "sexy-clown suit"
|
||||
desc = "It makes you look HONKable!"
|
||||
icon_state = "sexyclown"
|
||||
item_state = "sexyclown"
|
||||
item_color = "sexyclown"
|
||||
|
||||
/obj/item/clothing/under/rank/head_of_personnel
|
||||
desc = "It's a jumpsuit worn by someone who works in the position of \"Head of Personnel\"."
|
||||
name = "head of personnel's jumpsuit"
|
||||
|
||||
@@ -53,13 +53,6 @@
|
||||
item_state = "b_suit"
|
||||
item_color = "mailman"
|
||||
|
||||
/obj/item/clothing/under/sexyclown
|
||||
name = "sexy-clown suit"
|
||||
desc = "It makes you look HONKable!"
|
||||
icon_state = "sexyclown"
|
||||
item_state = "sexyclown"
|
||||
item_color = "sexyclown"
|
||||
|
||||
/obj/item/clothing/under/rank/vice
|
||||
name = "vice officer's jumpsuit"
|
||||
desc = "It's the standard issue pretty-boy outfit, as seen on Holo-Vision."
|
||||
@@ -145,6 +138,19 @@
|
||||
..()
|
||||
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Ensign\" and bears [station_name()] on the left shoulder."
|
||||
|
||||
/obj/item/clothing/under/rank/centcom/magistrate
|
||||
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Magistrate\" and bears \"N.S.S. Cyberiad\" on the left shoulder."
|
||||
name = "\improper Nanotrasen Navy Uniform"
|
||||
icon_state = "officer"
|
||||
item_state = "g_suit"
|
||||
item_color = "officer"
|
||||
displays_id = 0
|
||||
flags_size = ONESIZEFITSALL
|
||||
|
||||
/obj/item/clothing/under/rank/centcom/magistrate/New()
|
||||
..()
|
||||
desc = "Gold trim on space-black cloth, this uniform displays the rank of \"Magistrate\" and bears [station_name()] on the left shoulder."
|
||||
|
||||
/obj/item/clothing/under/rank/centcom/diplomatic
|
||||
desc = "A very gaudy and official looking uniform of the Nanotrasen Diplomatic Corps."
|
||||
name = "\improper Nanotrasen Diplomatic Uniform"
|
||||
@@ -798,7 +804,6 @@
|
||||
flags = NODROP
|
||||
has_sensor = 0 // HUNKE
|
||||
|
||||
|
||||
/obj/item/clothing/under/victdress
|
||||
name = "black victorian dress"
|
||||
desc = "A victorian style dress, fancy!"
|
||||
@@ -840,3 +845,10 @@
|
||||
item_state = "medicalgown"
|
||||
item_color = "medicalgown"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
|
||||
/obj/item/clothing/under/burial
|
||||
name = "burial garments"
|
||||
desc = "Traditional burial garments from the early 22nd century."
|
||||
icon_state = "burial"
|
||||
item_state = "burial"
|
||||
item_color = "burial"
|
||||
|
||||
@@ -79,11 +79,4 @@
|
||||
name = "camo pants"
|
||||
desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station."
|
||||
icon_state = "camopants"
|
||||
item_color = "camopants"
|
||||
|
||||
/obj/item/clothing/under/pants/chaps
|
||||
name = "black leather assless chaps"
|
||||
desc = "For those brave enough to weather the breeze."
|
||||
icon_state = "chaps"
|
||||
item_color = "chaps"
|
||||
flags_size = ONESIZEFITSALL
|
||||
item_color = "camopants"
|
||||
@@ -6,7 +6,8 @@
|
||||
var/time = 30 //time in deciseconds
|
||||
var/parts[] = list() //type paths of items that will be placed in the result
|
||||
var/chem_catalysts[] = list() //like tools but for reagents
|
||||
var/category = CAT_MISC // Recipe category
|
||||
var/category = CAT_NONE // Recipe category
|
||||
var/roundstart_enabled = TRUE //Set to FALSE if you don't want a particular crafting recipe to be available all the time
|
||||
|
||||
/datum/crafting_recipe/proc/AdjustChems(var/obj/resultobj as obj)
|
||||
//This proc is to replace the make_food proc of recipes from microwaves and such that are being converted to table crafting recipes.
|
||||
@@ -80,6 +81,19 @@
|
||||
time = 60
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/griefsky
|
||||
name = "General Griefsky"
|
||||
result = /mob/living/simple_animal/bot/secbot/griefsky
|
||||
reqs = list(/obj/item/assembly/signaler = 1,
|
||||
/obj/item/clothing/head/helmet = 1,
|
||||
/obj/item/melee/energy/sword = 4,
|
||||
/obj/item/assembly/prox_sensor = 1,
|
||||
/obj/item/robot_parts/r_arm = 2,
|
||||
/obj/item/robot_parts/l_arm = 2)
|
||||
tools = list(/obj/item/weldingtool)
|
||||
time = 120
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/cleanbot
|
||||
name = "Cleanbot"
|
||||
result = /mob/living/simple_animal/bot/cleanbot
|
||||
@@ -89,6 +103,17 @@
|
||||
time = 40
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/honkbot
|
||||
name = "Honkbot"
|
||||
result = /mob/living/simple_animal/bot/honkbot
|
||||
reqs = list(/obj/item/robot_parts/r_arm = 1,
|
||||
/obj/item/bikehorn = 1,
|
||||
/obj/item/assembly/prox_sensor = 1,
|
||||
/obj/item/storage/box/clown = 1,
|
||||
/obj/item/instrument/trombone = 1)
|
||||
time = 40
|
||||
category = CAT_ROBOT
|
||||
|
||||
/datum/crafting_recipe/floorbot
|
||||
name = "Floorbot"
|
||||
result = /mob/living/simple_animal/bot/floorbot
|
||||
@@ -239,6 +264,7 @@
|
||||
reqs = list(/obj/item/camera = 1,
|
||||
/datum/reagent/holywater = 10)
|
||||
parts = list(/obj/item/camera = 1)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/papersack
|
||||
name = "Paper Sack"
|
||||
@@ -247,12 +273,21 @@
|
||||
reqs = list(/obj/item/paper = 5)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/sushimat
|
||||
name = "Sushi Mat"
|
||||
result = /obj/item/kitchen/sushimat
|
||||
time = 10
|
||||
reqs = list(/obj/item/stack/sheet/wood = 1,
|
||||
/obj/item/stack/cable_coil = 2)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/notreallysoap
|
||||
name = "Homemade Soap"
|
||||
result = /obj/item/soap/ducttape
|
||||
time = 50
|
||||
reqs = list(/obj/item/stack/tape_roll = 1,
|
||||
/datum/reagent/liquidgibs = 10)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/garrote
|
||||
name = "Makeshift Garrote"
|
||||
@@ -289,6 +324,7 @@
|
||||
time = 15
|
||||
reqs = list(/obj/item/clothing/gloves/color/latex = 1,
|
||||
/obj/item/stack/cable_coil = 5)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/gold_horn
|
||||
name = "Golden bike horn"
|
||||
@@ -388,4 +424,24 @@
|
||||
/obj/item/stack/rods = 2,
|
||||
/obj/item/assembly/prox_sensor = 1) // Not a timer because the system sees a diamond drill as a drill too, letting you make both otherwise.
|
||||
tools = list(/obj/item/screwdriver, /obj/item/wrench)
|
||||
category = CAT_MISC
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/faketoolbox
|
||||
name = "Black and Red toolbox"
|
||||
result = /obj/item/storage/toolbox/fakesyndi
|
||||
time = 40
|
||||
reqs = list(/datum/reagent/paint/red = 10,
|
||||
/datum/reagent/paint/black = 30,
|
||||
/obj/item/storage/toolbox = 1) //Paint in reagents so it doesnt take the container up, yet still take it from the beaker
|
||||
tools = list(/obj/item/reagent_containers/glass/rag = 1) //need something to paint with it
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/snowman
|
||||
name = "Snowman"
|
||||
result = /obj/structure/snowman/built
|
||||
reqs = list(/obj/item/snowball = 10,
|
||||
/obj/item/reagent_containers/food/snacks/grown/carrot = 1,
|
||||
/obj/item/grown/log = 2)
|
||||
time = 50
|
||||
category = CAT_MISC
|
||||
roundstart_enabled = FALSE
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
var/tattoo_g = 1
|
||||
var/tattoo_b = 1
|
||||
toolspeed = 1
|
||||
usesound = 'sound/items/Welder2.ogg'
|
||||
usesound = 'sound/items/welder2.ogg'
|
||||
|
||||
/obj/item/fluff/tattoo_gun/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
@@ -154,7 +154,7 @@
|
||||
|
||||
/obj/item/fluff/rsik_katana/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] tries to stab [src] into [user.p_their()] stomach! Except [src] shatters! [user.p_they(TRUE)] look[user.p_s()] as if [user.p_they()] might die from the shame.</span>")
|
||||
return(BRUTELOSS)
|
||||
return BRUTELOSS
|
||||
|
||||
/obj/item/crowbar/fluff/zelda_creedy_1 // Zomgponies: Griffin Rowley
|
||||
name = "Zelda's Crowbar"
|
||||
@@ -514,8 +514,6 @@
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
|
||||
#undef USED_MOD_HELM
|
||||
#undef USED_MOD_SUIT
|
||||
|
||||
/obj/item/fluff/merchant_sallet_modkit //Travelling Merchant: Trav Noble. This is what they spawn in with
|
||||
name = "SG Helmet modkit"
|
||||
@@ -552,7 +550,7 @@
|
||||
|
||||
sallet.add_fingerprint(H)
|
||||
target.transfer_fingerprints_to(sallet)
|
||||
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
|
||||
playsound(src.loc, 'sound/items/screwdriver.ogg', 50, 1)
|
||||
to_chat(user, "<span class='notice'>You modify [target] with [src].</span>")
|
||||
H.update_inv_head()
|
||||
qdel(target)
|
||||
@@ -584,8 +582,6 @@
|
||||
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"
|
||||
@@ -639,6 +635,70 @@
|
||||
return
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
|
||||
|
||||
/obj/item/fluff/sylus_conversion_kit //Decemviri: Sylus Cain
|
||||
name = "cerberus pattern conversion kit"
|
||||
desc = "A securirty hardsuit conversion kit."
|
||||
icon_state = "modkit"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/fluff/sylus_conversion_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 = "cerberus pattern security hardsuit helmet"
|
||||
P.desc = "A special helmet that protects against hazardous, low pressure environments. Has an additional layer of armor and rigging for combat duty."
|
||||
P.icon = 'icons/obj/custom_items.dmi'
|
||||
P.icon_state = "hardsuit0-secc"
|
||||
P.item_state = "hardsuit0-secc"
|
||||
P.sprite_sheets = null
|
||||
P.item_color = "secc"
|
||||
user.update_icons()
|
||||
|
||||
if(P == H.head)
|
||||
H.update_inv_head()
|
||||
if(used & USED_MOD_HELM && used & USED_MOD_SUIT)
|
||||
qdel(src)
|
||||
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 = "cerberus pattern security hardsuit"
|
||||
P.desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor and rigging for combat duty"
|
||||
P.icon = 'icons/obj/custom_items.dmi'
|
||||
P.icon_state = "hardsuit-secc"
|
||||
P.item_state = "hardsuit-secc"
|
||||
P.sprite_sheets = null
|
||||
user.update_icons()
|
||||
|
||||
if(P == H.wear_suit)
|
||||
H.update_inv_wear_suit()
|
||||
if(used & USED_MOD_HELM && used & USED_MOD_SUIT)
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
|
||||
|
||||
#undef USED_MOD_HELM
|
||||
#undef USED_MOD_SUIT
|
||||
|
||||
|
||||
//////////////////////////////////
|
||||
//////////// Clothing ////////////
|
||||
//////////////////////////////////
|
||||
@@ -787,6 +847,15 @@
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/storage/labcoat/fluff/pulsecoat //ozewse : Daniel Harper : Donated to them by Runemeds, who is the original donor.
|
||||
name = "EMT pulse coat"
|
||||
desc = "An EMT labcoat modified to track the wearer's heartbeat. It's so worn out that it doesn't seem to accurately track heartbeat anymore. Also, the zipper is stuck."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "pulsecoat"
|
||||
item_state = "pulsecoat"
|
||||
ignore_suitadjust = 1
|
||||
actions_types = list()
|
||||
|
||||
/obj/item/clothing/suit/jacket/miljacket/patch // sniper_fairy : P.A.T.C.H.
|
||||
name = "custom purple military jacket"
|
||||
desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one has a medical patch on it."
|
||||
@@ -840,6 +909,13 @@
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
|
||||
icon_state = "dusty_jacket"
|
||||
|
||||
/obj/item/clothing/suit/fluff/cheeky_sov_coat //CheekyCrenando: Srusu Rskuzu
|
||||
name = "Srusu's Greatcoat"
|
||||
desc = "A heavy wool Soviet-style greatcoat. A name is written in fancy handwriting on the inside tag: Srusu Rskuzu"
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
item_state = "cheeky_sov_coat"
|
||||
icon_state = "cheeky_sov_coat"
|
||||
|
||||
/obj/item/clothing/suit/fluff/supplymaster_jacket //Denthamos: Henry Grandpa Gadow
|
||||
name = "faded NT Supply Master's Coat"
|
||||
desc = "A faded leather overcoat bearing a worn out badge from the NAS Crescent on the shoulder, and a designation tag of Supply Master on the front. A tarnished gold nameplate says H.Gadow on it."
|
||||
@@ -924,6 +1000,14 @@
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/storage/labcoat/fluff/ionward_labcoat // Ionward: Gemini
|
||||
name = "Technocracy labcoat"
|
||||
desc = "A thin, faded, carbon fiber labcoat. On the back, a Technocracy vessel's logo. Inside, the name 'Gemini' is printed on the collar."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "ionward_labcoat_open"
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/fluff/stobarico_greatcoat // Stobarico: F.U.R.R.Y
|
||||
name = "\improper F.U.R.R.Y's Nanotrasen Greatcoat"
|
||||
desc = "A greatcoat with Nanotrasen colors."
|
||||
@@ -1040,6 +1124,64 @@
|
||||
flags = NODROP|BLOCKHAIR
|
||||
flags_inv = HIDEEARS
|
||||
|
||||
/obj/item/clothing/suit/fluff/pineapple //Pineapple Salad: Dan Jello
|
||||
name = "red trench coat"
|
||||
desc = "A red coat with cheaply made plastic accessories."
|
||||
icon_state = "pineapple_trench"
|
||||
|
||||
/obj/item/fluff/pinapplehairgel ////Pineapple Salad: Dan Jello
|
||||
name = "slime hair gel"
|
||||
desc = "A bottle containing extra..material..for custom 'hair' styling."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "ps_hairgel"
|
||||
attack_verb = list("smacked")
|
||||
hitsound = 'sound/weapons/tap.ogg'
|
||||
force = 0
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/fluff/pinapplehairgel/attack_self(mob/user)
|
||||
var/mob/living/carbon/human/target = user
|
||||
if(!istype(target) || !isslimeperson(target))
|
||||
return
|
||||
|
||||
if(target.change_hair("Sasook Hair", 1))
|
||||
to_chat(target, "<span class='notice'>You dump some of [src] on your head and style it around.</span>")
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/fluff/shesi //MrSynnester : Shesi Skaklas
|
||||
name = "custom made winter coat"
|
||||
desc = "A custom made winter coat with the arms removed. Looks comfy."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "shesicoat"
|
||||
item_state = "shesicoat"
|
||||
hoodtype = /obj/item/clothing/head/hood/fluff/shesi
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO
|
||||
|
||||
/obj/item/clothing/head/hood/fluff/shesi //MrSynnester : Shesi Skaklas
|
||||
name = "custom made winter hood"
|
||||
desc = "A custom made winter coat hood. Looks comfy."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "shesicoat_hood2"
|
||||
body_parts_covered = HEAD
|
||||
flags = NODROP|BLOCKHAIR
|
||||
flags_inv = HIDEEARS
|
||||
|
||||
/obj/item/clothing/suit/jacket/dtx //AffectedArc07: DTX
|
||||
name = "telecommunications bomber jacket"
|
||||
desc = "Looks like something only a nerd would buy. Has a tag inside reading <i>Property of DTX</i>."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "dtxbomber"
|
||||
item_state = "dtxbomber"
|
||||
ignore_suitadjust = 0
|
||||
allowed = list(/obj/item/flashlight,/obj/item/tank/emergency_oxygen,/obj/item/toy,/obj/item/storage/fancy/cigarettes,/obj/item/lighter)
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
actions_types = list(/datum/action/item_action/zipper)
|
||||
adjust_flavour = "unzip"
|
||||
|
||||
//////////// Uniforms ////////////
|
||||
/obj/item/clothing/under/fluff/counterfeitguise_uniform // thatdanguy23 : Rissa Williams
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
@@ -1238,6 +1380,13 @@
|
||||
/obj/item/toy/plushie/fluff/fox/ui_action_click()
|
||||
change_color()
|
||||
|
||||
/obj/item/clothing/suit/jacket/miljacket/desert/fox
|
||||
name = "rugged military jacket"
|
||||
desc = "A rugged brown military jacket with a stylized 'A' embroidered on the back. It seems very old, yet is in near mint condition. Has a tag on the inside collar signed 'Fox McCloud'."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "fox_coat"
|
||||
item_color = "fox_coat"
|
||||
|
||||
// TheFlagbearer: Willow Walker
|
||||
/obj/item/clothing/under/fluff/arachno_suit
|
||||
name = "Arachno-Man costume"
|
||||
@@ -1371,6 +1520,13 @@
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "ssscratches_backpack"
|
||||
|
||||
/obj/item/storage/backpack/duffel/fluff/thebrew //Greey: Korala Ice
|
||||
name = "The Brew"
|
||||
desc = "Amber colored duffle bag resembling a long lost friend, a spirit long forgotten."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "greeyfluff"
|
||||
item_state = "greeyfluff"
|
||||
|
||||
/obj/item/clothing/head/wizard/fake/fluff/dreamy //phantasmicdream : Dreamy Rockwall
|
||||
name = "strange witch hat"
|
||||
desc = "A shapeshifting witch hat. A strange aura comes from it..."
|
||||
@@ -1537,3 +1693,84 @@
|
||||
item_color = "Xann_necklace"
|
||||
slot_flags = SLOT_TIE
|
||||
|
||||
/obj/item/clothing/accessory/rbscarf //Rb303: Isthel Eisenwald
|
||||
name = "Old purple scarf"
|
||||
desc = "An old, striped purple scarf. It appears to be hand-knitted and has the name 'Isthel' written on it in bad handwriting."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "rbscarf"
|
||||
item_state = "rbscarf"
|
||||
item_color = "rbscarf"
|
||||
|
||||
/obj/item/instrument/accordion/fluff/asmer_accordion //Asmerath: Coloratura
|
||||
name = "Rara's Somber Accordion"
|
||||
desc = "A blue colored accordion with claw indentations on the keys made special for vulpkanins."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "asmer_accordion"
|
||||
item_state = "asmer_accordion"
|
||||
|
||||
|
||||
/obj/item/clothing/head/rabbitears/fluff/pinesalad_bunny // Pineapple Salad : Dan Jello
|
||||
name = "Bluespace rabbit ears"
|
||||
desc = "A pair of sparkly bluespace rabbit ears, with a small tag on them that reads, 'Dan Jello~'. Yuck, \
|
||||
there's some pink slime on the part that goes on your head!"
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "ps_bunny"
|
||||
|
||||
|
||||
/obj/item/clothing/under/fluff/kiaoutfit //FullOfSkittles: Kiachi
|
||||
name = "Suspicious Outfit"
|
||||
desc = "A very expensive top with intricate details tailored to fit a vox and paired with a glittery blue skirt, probably illegal."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list("Vox" = 'icons/mob/species/vox/uniform.dmi')
|
||||
icon_state = "kiaoutfit"
|
||||
item_state = "kiaoutfit"
|
||||
item_color = "kiaoutfit"
|
||||
displays_id = FALSE
|
||||
species_restricted = list("Vox")
|
||||
|
||||
/obj/item/clothing/head/fluff/kiahat //FullOfSkittles: Kiachi
|
||||
name = "Suspicious Witch Hat"
|
||||
desc = "A black witch hat with a blue sash decorated with tiny glimmering stars and a gold squid-like medallion, probably possessed."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
|
||||
icon_state = "kiahat"
|
||||
item_state = "kiahat"
|
||||
item_color = "kiahat"
|
||||
|
||||
/obj/item/clothing/mask/gas/fluff/kiamask //FullOfSkittles: Kiachi
|
||||
name = "Suspicious Mask"
|
||||
desc = "A sleek mask that blends in with the owner's existing quills using strange technology. It might even be magic..."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list("Vox" = 'icons/mob/species/vox/mask.dmi')
|
||||
icon_state = "kiamask"
|
||||
item_state = "kiamask"
|
||||
item_color = "kiamask"
|
||||
species_restricted = list("Vox")
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/ring/fluff
|
||||
name = "fluff ring"
|
||||
desc = "Someone forgot to set this fluff item's description, notify a coder!"
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
fluff_material = TRUE
|
||||
|
||||
/obj/item/clothing/gloves/ring/fluff/update_icon()
|
||||
return
|
||||
|
||||
/obj/item/clothing/gloves/ring/fluff/attackby(obj/item/I as obj, mob/user as mob, params)
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/item/clothing/gloves/ring/fluff/benjaminfallout //Benjaminfallout: Pretzel Brassheart
|
||||
name = "Pretzel's Ring"
|
||||
desc = "A small platinum ring with a large light blue diamond. Engraved inside the band are the words: 'To my lovely Pristine Princess. Forever yours, Savinien.'"
|
||||
icon_state = "benjaminfallout_ring"
|
||||
@@ -21,6 +21,7 @@
|
||||
can_be_placed_into = null
|
||||
flags = NOBLUDGEON
|
||||
container_type = OPENCONTAINER
|
||||
has_lid = FALSE
|
||||
var/wipespeed = 30
|
||||
|
||||
/obj/item/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
// DONT TOUCH ANYTHING IN HERE UNLESS YOU KNOW WHAT YOU ARE DOING -affected
|
||||
/client/verb/linkdiscord()
|
||||
set category = "Special Verbs"
|
||||
set name = "Link Discord Account"
|
||||
set desc = "Link your discord account to your BYOND account."
|
||||
var/user_ckey = sanitizeSQL(usr.ckey) // Probably not neccassary but better safe than sorry
|
||||
if(!config.sql_enabled)
|
||||
to_chat(src, "<span class='warning'>This is feature requires the SQL backend</span>")
|
||||
return
|
||||
var/DBQuery/db_discord_id = dbcon.NewQuery("SELECT discord_id FROM [format_table_name("discord")] WHERE ckey = '[user_ckey]'")
|
||||
if(!db_discord_id.Execute())
|
||||
var/err = db_discord_id.ErrorMsg()
|
||||
log_game("SQL ERROR while selecting discord account. Error : \[[err]\]\n")
|
||||
to_chat(src, "<span class='warning'>Error checking Discord account. Please inform an administrator</span>")
|
||||
return
|
||||
var/stored_id
|
||||
while(db_discord_id.NextRow())
|
||||
stored_id = db_discord_id.item[1]
|
||||
if(!stored_id) // Not linked
|
||||
var/know_how = alert("Do you know how to get a discord user ID? This ID is NOT your discord username and numbers!","Question","Yes","No")
|
||||
if(know_how == "No") // Opens discord support on how to collect IDs
|
||||
src << link("https://support.discordapp.com/hc/en-us/articles/206346498-Where-can-I-find-my-User-Server-Message-ID")
|
||||
var/entered_id = input("Please enter your Discord ID.", "Enter Discord ID", null, null) as text|null
|
||||
var/sql_id = sanitizeSQL(entered_id)
|
||||
var/DBQuery/store_discord_id = dbcon.NewQuery("INSERT INTO [format_table_name("discord")] (ckey, discord_id, notify) VALUES ('[user_ckey]', [sql_id], 0)")
|
||||
if(!store_discord_id.Execute())
|
||||
var/err = db_discord_id.ErrorMsg()
|
||||
log_game("SQL ERROR while linking discord account. Error : \[[err]\]\n")
|
||||
to_chat(src, "<span class='warning'>Error linking Discord account. Please inform an administrator</span>")
|
||||
return
|
||||
to_chat(src, "<span class='notice'>Successfully linked discord account [entered_id] to [user_ckey]</span>")
|
||||
else // Linked
|
||||
var/choice = alert("You already have the Discord Account [stored_id] linked to [user_ckey]. Would you like to unlink or replace","Already Linked","Unlink","Replace")
|
||||
switch(choice)
|
||||
if("Unlink")
|
||||
var/DBQuery/unlink_discord_id = dbcon.NewQuery("DELETE FROM [format_table_name("discord")] WHERE ckey = '[user_ckey]'")
|
||||
if(!unlink_discord_id.Execute())
|
||||
var/err = unlink_discord_id.ErrorMsg()
|
||||
log_game("SQL ERROR while unlinking discord account. Error : \[[err]\]\n")
|
||||
to_chat(src, "<span class='warning'>Error unlinking Discord account. Please inform an administrator</span>")
|
||||
return
|
||||
to_chat(src, "<span class='notice'>Successfully unlinked discord account</span>")
|
||||
if("Replace")
|
||||
var/entered_id = input("Please enter your Discord ID. Instructions can be found at https://bit.ly/2AfUu40", "Enter Discord ID", null, null) as text|null
|
||||
var/sql_id = sanitizeSQL(entered_id)
|
||||
var/DBQuery/store_discord_id = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET discord_id = '[sql_id]' WHERE ckey='[user_ckey]'")
|
||||
if(!store_discord_id.Execute())
|
||||
var/err = db_discord_id.ErrorMsg()
|
||||
to_chat(src, "<span class='warning'>Error replacing Discord account. Please inform an administrator</span>")
|
||||
log_game("SQL ERROR while linking discord account. Error : \[[err]\]\n")
|
||||
return
|
||||
to_chat(src, "<span class='notice'>Successfully linked discord account [entered_id] to [user_ckey]</span>")
|
||||
@@ -0,0 +1,48 @@
|
||||
// DONT TOUCH ANYTHING IN HERE UNLESS YOU KNOW WHAT YOU ARE DOING -affected
|
||||
/client/verb/notify_restart()
|
||||
set category = "Special Verbs"
|
||||
set name = "Notify Restart"
|
||||
set desc = "Notifies you on Discord when the server restarts."
|
||||
if(!config.sql_enabled)
|
||||
to_chat(src, "<span class='warning'>This is feature requires the SQL backend</span>")
|
||||
return
|
||||
var/DBQuery/db_discord_id = dbcon.NewQuery("SELECT discord_id FROM [format_table_name("discord")] WHERE ckey = '[ckey]'")
|
||||
if(!db_discord_id.Execute())
|
||||
var/err = db_discord_id.ErrorMsg()
|
||||
log_game("SQL ERROR while selecting discord account. Error : \[[err]\]\n")
|
||||
to_chat(src, "<span class='warning'>Error checking Discord account. Please inform an administrator</span>")
|
||||
return
|
||||
var/stored_id
|
||||
while(db_discord_id.NextRow())
|
||||
stored_id = db_discord_id.item[1]
|
||||
if(!stored_id) // Not linked
|
||||
to_chat(src, "<span class='warning'>This requires you to link your Discord account with the \"Link Discord Account\" verb.</span>")
|
||||
return
|
||||
else // Linked
|
||||
var/DBQuery/toggle_status = dbcon.NewQuery("SELECT notify FROM [format_table_name("discord")] WHERE ckey = '[ckey]'")
|
||||
if(!toggle_status.Execute())
|
||||
var/err = toggle_status.ErrorMsg()
|
||||
log_game("SQL ERROR while getting discord account. Error : \[[err]\]\n")
|
||||
var/notify_status
|
||||
while(toggle_status.NextRow())
|
||||
notify_status = toggle_status.item[1]
|
||||
if(notify_status) // Data is there
|
||||
switch(notify_status)
|
||||
if("0")
|
||||
var/DBQuery/update_notify = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET notify = 1 WHERE ckey='[ckey]'")
|
||||
if(!update_notify.Execute())
|
||||
var/err = db_discord_id.ErrorMsg()
|
||||
to_chat(src, "<span class='warning'>Error updating notify status. Please inform an administrator</span>")
|
||||
log_game("SQL ERROR while updating notify status. Error : \[[err]\]\n")
|
||||
return
|
||||
to_chat(src, "<span class='notice'>You will now be notified on discord when the next round is starting</span>")
|
||||
if("1")
|
||||
var/DBQuery/update_notify = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET notify = 0 WHERE ckey='[ckey]'")
|
||||
if(!update_notify.Execute())
|
||||
var/err = db_discord_id.ErrorMsg()
|
||||
to_chat(src, "<span class='warning'>Error updating notify status. Please inform an administrator</span>")
|
||||
log_game("SQL ERROR while updating notify status. Error : \[[err]\]\n")
|
||||
return
|
||||
to_chat(src, "<span class='notice'>You will no longer be notified on discord when the next round is starting</span>")
|
||||
else // Oh fuck what the hell happened
|
||||
to_chat(src, "<span class='danger'>Something has gone VERY wrong, or affected cant code.</span>")
|
||||
@@ -40,7 +40,7 @@ We hope you enjoy the lights.", "Harmless ions approaching", new_sound = 'sound/
|
||||
event_announcement.Announce("The Aurora Caelus event is now ending. Starlight conditions will slowly return to normal. \
|
||||
When this has concluded, please return to your workplace and continue work as normal. \
|
||||
Have a pleasant shift, [station_name()], and thank you for watching with us.",
|
||||
"Harmless ions approaching", new_sound = 'sound/misc/notice2.ogg', from = "Nanotrasen Meteorology Division")
|
||||
"Harmless ions dissipating", new_sound = 'sound/misc/notice2.ogg', from = "Nanotrasen Meteorology Division")
|
||||
|
||||
/datum/event/aurora_caelus/proc/fade_to_black(turf/space/S)
|
||||
set waitfor = FALSE
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
var/turf/T = pick(blobstart)
|
||||
if(!T)
|
||||
return kill()
|
||||
var/list/candidates = pollCandidates("Do you want to play as a blob?", ROLE_BLOB, 1)
|
||||
var/list/candidates = pollCandidates("Do you want to play as a blob infested mouse?", ROLE_BLOB, 1)
|
||||
if(!candidates.len)
|
||||
return kill()
|
||||
var/list/vents = list()
|
||||
|
||||
@@ -170,6 +170,7 @@ var/list/event_last_fired = list()
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Brand Intelligence", /datum/event/brand_intelligence, 50, list(ASSIGNMENT_ENGINEER = 25), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 50)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Dimensional Tear", /datum/event/tear, 0, list(ASSIGNMENT_SECURITY = 35)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Honknomoly", /datum/event/tear/honk, 0),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vent Clog", /datum/event/vent_clog, 250),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 150),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Pyro Anomaly", /datum/event/anomaly/anomaly_pyro, 75, list(ASSIGNMENT_ENGINEER = 60)),
|
||||
@@ -193,7 +194,7 @@ var/list/event_last_fired = list()
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 5), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1),
|
||||
new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 15), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 0, is_one_shot = 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 180, is_one_shot = 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, list(ASSIGNMENT_SECURITY = 15), is_one_shot = 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Floor Cluwne", /datum/event/spawn_floor_cluwne, 15, is_one_shot = 1)
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
/datum/event/grid_check //NOTE: Times are measured in master controller ticks!
|
||||
announceWhen = 5
|
||||
|
||||
|
||||
/datum/event/grid_check/setup()
|
||||
endWhen = rand(30,120)
|
||||
|
||||
/datum/event/grid_check/start()
|
||||
power_failure(0)
|
||||
|
||||
var/sound/S = sound('sound/effects/powerloss.ogg')
|
||||
for(var/mob/living/M in GLOB.player_list)
|
||||
var/turf/T = get_turf(M)
|
||||
if(!M.client || !is_station_level(T.z))
|
||||
continue
|
||||
SEND_SOUND(M, S)
|
||||
|
||||
/datum/event/grid_check/announce()
|
||||
event_announcement.Announce("Abnormal activity detected in [station_name()]'s powernet. As a precautionary measure, the station's power will be shut off for an indeterminate duration.", "Automated Grid Check", new_sound = 'sound/AI/poweroff.ogg')
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/datum/event/carp_migration
|
||||
/datum/event/carp_migration/koi
|
||||
spawned_mobs = list(
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/koi = 95,
|
||||
/mob/living/simple_animal/hostile/retaliate/carp/koi/honk = 2,
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
announceWhen = 1
|
||||
|
||||
/datum/event/radiation_storm/announce()
|
||||
priority_announcement.Announce("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert", 'sound/ai/radiation.ogg')
|
||||
priority_announcement.Announce("High levels of radiation detected near the station. Maintenance is best shielded from radiation.", "Anomaly Alert", 'sound/AI/radiation.ogg')
|
||||
//sound not longer matches the text, but an audible warning is probably good
|
||||
|
||||
/datum/event/radiation_storm/start()
|
||||
|
||||
@@ -33,7 +33,10 @@
|
||||
SA.key = SG.key
|
||||
SA.universal_speak = 1
|
||||
SA.sentience_act()
|
||||
SA.maxHealth = max(SA.maxHealth, 200)
|
||||
SA.can_collar = 1
|
||||
SA.maxHealth = max(SA.maxHealth + 200)
|
||||
SA.melee_damage_lower = max(SA.melee_damage_lower + 15)
|
||||
SA.melee_damage_upper = max(SA.melee_damage_upper + 15)
|
||||
SA.health = SA.maxHealth
|
||||
SA.del_on_death = FALSE
|
||||
greet_sentient(SA)
|
||||
|
||||
@@ -684,6 +684,7 @@
|
||||
wither()
|
||||
|
||||
/obj/structure/spacevine/temperature_expose(null, temp, volume)
|
||||
..()
|
||||
var/override = 0
|
||||
for(var/datum/spacevine_mutation/SM in mutations)
|
||||
override += SM.process_temperature(src, temp, volume)
|
||||
|
||||
@@ -33,12 +33,26 @@
|
||||
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/queen
|
||||
spawncount = 1
|
||||
if(5)
|
||||
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/mother
|
||||
spawncount = 1
|
||||
spider_type = /mob/living/simple_animal/hostile/poison/terror_spider/princess
|
||||
spawncount = 2
|
||||
while(spawncount >= 1 && vents.len)
|
||||
var/obj/vent = pick(vents)
|
||||
var/obj/structure/spider/spiderling/terror_spiderling/S = new(vent.loc)
|
||||
S.grow_as = spider_type
|
||||
S.amount_grown = 90
|
||||
var/obj/machinery/atmospherics/unary/vent_pump/vent = pick(vents)
|
||||
|
||||
if(vent.welded)
|
||||
vents -= vent
|
||||
continue
|
||||
|
||||
// If the vent we picked has any living mob nearby, just remove it from the list, loop again, and pick something else.
|
||||
|
||||
var/turf/T = get_turf(vent)
|
||||
var/hostiles_present = FALSE
|
||||
for(var/mob/living/L in viewers(T))
|
||||
if(L.stat != DEAD)
|
||||
hostiles_present = TRUE
|
||||
break
|
||||
|
||||
vents -= vent
|
||||
spawncount--
|
||||
if(!hostiles_present)
|
||||
new spider_type(vent.loc)
|
||||
spawncount--
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
density = 0
|
||||
anchored = 1
|
||||
luminosity = 3
|
||||
var/list/tear_critters = list()
|
||||
|
||||
/obj/effect/tear/New()
|
||||
..()
|
||||
@@ -38,10 +39,10 @@
|
||||
animation.master = src
|
||||
// flick("newtear",usr)
|
||||
spawn(15)
|
||||
if(animation) qdel(animation)
|
||||
if(animation)
|
||||
qdel(animation)
|
||||
|
||||
spawn(rand(30,120))
|
||||
var/list/tear_critters = list()
|
||||
for(var/T in typesof(/mob/living/simple_animal))
|
||||
var/mob/living/simple_animal/SA = T
|
||||
if(initial(SA.gold_core_spawnable) == CHEM_MOB_SPAWN_HOSTILE)
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
/datum/event/tear/honk
|
||||
var/obj/effect/tear/honk/HE //i could just inherit but its being finicky.
|
||||
|
||||
/datum/event/tear/honk/announce()
|
||||
event_announcement.Announce("A Honknomoly has opened. Expected location: [impact_area.name].", "Honknomoly Alert", 'sound/items/airhorn.ogg')
|
||||
|
||||
/datum/event/tear/honk/start()
|
||||
var/turf/T = pick(get_area_turfs(impact_area))
|
||||
if(T)
|
||||
HE = new /obj/effect/tear/honk(T.loc)
|
||||
|
||||
/datum/event/tear/honk/end()
|
||||
if(HE)
|
||||
qdel(HE)
|
||||
|
||||
/obj/effect/tear/honk
|
||||
name="Honkmensional Tear"
|
||||
desc="A tear in the dimensional fabric of sanity."
|
||||
icon='icons/effects/tear.dmi'
|
||||
icon_state="tear"
|
||||
tear_critters = list(/mob/living/simple_animal/hostile/retaliate/clown/goblin)
|
||||
|
||||
/obj/effect/tear/honk/New()
|
||||
var/atom/movable/overlay/animation = null
|
||||
animation = new(loc)
|
||||
animation.icon_state = "newtear"
|
||||
animation.icon = 'icons/effects/tear.dmi'
|
||||
animation.master = src
|
||||
spawn(15)
|
||||
if(animation)
|
||||
qdel(animation)
|
||||
|
||||
spawn(rand(30,120))
|
||||
|
||||
for(var/i in 1 to 6)
|
||||
var/chosen = pick(tear_critters)
|
||||
var/mob/living/simple_animal/C = new chosen
|
||||
C.forceMove(get_turf(src))
|
||||
if(prob(50))
|
||||
for(var/j = 1, j <= rand(1, 3), j++)
|
||||
step(C, pick(NORTH,SOUTH,EAST,WEST))
|
||||
@@ -6,7 +6,7 @@ var/global/list/unused_trade_stations = list("sol")
|
||||
/datum/event/traders
|
||||
var/success_spawn = 0
|
||||
var/station = null
|
||||
var/spawn_count = 3
|
||||
var/spawn_count = 2
|
||||
var/list/trader_objectives = list()
|
||||
|
||||
/datum/event/traders/setup()
|
||||
@@ -16,6 +16,10 @@ var/global/list/unused_trade_stations = list("sol")
|
||||
/datum/event/traders/start()
|
||||
if(!station) // If there are no unused stations, just no.
|
||||
return
|
||||
if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED)
|
||||
event_announcement.Announce("A trading shuttle from Jupiter Station has been denied docking permission due to the heightened security alert aboard [station_name()].", "Trader Shuttle Docking Request Refused")
|
||||
return
|
||||
|
||||
var/list/spawnlocs = list()
|
||||
for(var/obj/effect/landmark/landmark in GLOB.landmarks_list)
|
||||
if(landmark.name == "traderstart_[station]")
|
||||
@@ -35,53 +39,38 @@ var/global/list/unused_trade_stations = list("sol")
|
||||
var/turf/picked_loc = spawnlocs[index]
|
||||
index++
|
||||
var/mob/C = pick_n_take(candidates)
|
||||
spawn_count--
|
||||
if(C)
|
||||
GLOB.respawnable_list -= C.client
|
||||
var/mob/living/carbon/human/M = create_trader(picked_loc)
|
||||
M.ckey = C.ckey
|
||||
var/mob/living/carbon/human/M = new /mob/living/carbon/human(picked_loc)
|
||||
M.ckey = C.ckey // must be before equipOutfit, or that will runtime due to lack of mind
|
||||
M.equipOutfit(/datum/outfit/admin/sol_trader)
|
||||
M.dna.species.after_equip_job(null, M)
|
||||
M.mind.objectives += trader_objectives
|
||||
M.mind.offstation_role = TRUE
|
||||
greet_trader(M)
|
||||
success_spawn = 1
|
||||
if(!success_spawn)
|
||||
if(success_spawn)
|
||||
event_announcement.Announce("A trading shuttle from Jupiter Station has been granted docking permission at [station_name()] arrivals port 4.", "Trader Shuttle Docking Request Accepted")
|
||||
else
|
||||
unused_trade_stations += station // Return the station to the list of usable stations.
|
||||
|
||||
/datum/event/traders/proc/create_trader(var/turf/picked_loc)
|
||||
var/mob/living/carbon/human/M
|
||||
switch(station)
|
||||
if("sol")
|
||||
M = new /mob/living/carbon/human(picked_loc)
|
||||
M.equip_to_slot_or_del(new /obj/item/radio/headset(M), slot_l_ear)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(M), slot_w_uniform)
|
||||
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
|
||||
M.equip_to_slot_or_del(new /obj/item/storage/backpack/industrial(M), slot_back)
|
||||
var/obj/item/card/id/supply/W = new(M)
|
||||
W.name = "[M.real_name]'s ID Card (Sol Trader)"
|
||||
W.assignment = "Sol Trader"
|
||||
W.registered_name = M.real_name
|
||||
W.access = list(access_trade_sol, access_maint_tunnels, access_external_airlocks)
|
||||
M.equip_to_slot_or_del(W, slot_wear_id)
|
||||
return M
|
||||
|
||||
/datum/event/traders/proc/greet_trader(var/mob/living/carbon/human/M)
|
||||
to_chat(M, "<span class='boldnotice'>You are a trader!</span>")
|
||||
to_chat(M, "<span class='notice'>You are currently docked at [get_area(M)].</span>")
|
||||
to_chat(M, "<span class='notice'>You are about to trade with [station_name()].</span>")
|
||||
to_chat(M, "<span class='notice'>Negotiate an agreement, and request docking.</span>")
|
||||
spawn(25)
|
||||
show_objectives(M.mind)
|
||||
|
||||
/datum/event/traders/proc/forge_trader_objectives()
|
||||
var/i = 1
|
||||
var/max_objectives = pick(2, 2, 2, 2, 3, 3, 3, 4)
|
||||
var/list/objs = list()
|
||||
var/list/goals = list("stockparts")
|
||||
while(i<= max_objectives)
|
||||
var/goal = pick(goals)
|
||||
var/datum/objective/trade/O
|
||||
if(goal == "stockparts")
|
||||
O = new /datum/objective/trade/stock(station)
|
||||
O.choose_target()
|
||||
objs += O
|
||||
|
||||
i++
|
||||
var/datum/objective/trade/plasma/P = new /datum/objective/trade/plasma
|
||||
P.choose_target()
|
||||
objs += P
|
||||
|
||||
var/datum/objective/trade/credits/C = new /datum/objective/trade/credits
|
||||
C.choose_target()
|
||||
objs += C
|
||||
|
||||
return objs
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
R.add_reagent(pick(gunk), 50)
|
||||
|
||||
var/datum/effect_system/smoke_spread/chem/smoke = new
|
||||
smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1)
|
||||
smoke.set_up(R, vent, TRUE)
|
||||
playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
|
||||
smoke.start(3)
|
||||
qdel(R)
|
||||
|
||||
@@ -55,6 +55,11 @@
|
||||
then click where you want to fire. After firing, you will need to pump the gun, by clicking on the gun in your hand. To reload, load more shotgun \
|
||||
shells into the gun."
|
||||
|
||||
/obj/item/toy/russian_revolver/trick_revolver //oh no
|
||||
description_info = "This is a ballistic weapon. To fire the weapon, have your gun mode set to 'fire', \
|
||||
then click where you want to fire. To reload, click the weapon in your hand to unload (if needed), then add the appropriate ammo. The description \
|
||||
will tell you what caliber you need."
|
||||
|
||||
//*******
|
||||
//*Melee*
|
||||
//*******
|
||||
|
||||
@@ -60,12 +60,3 @@
|
||||
stat(null,"<font color='#298A08'><b>[description_holders["fluff"]]</b></font>") //Yellow, fluff-related text.
|
||||
if(description_holders["antag"])
|
||||
stat(null,"<font color='#8A0808'><b>[description_holders["antag"]]</b></font>") //Red, malicious antag-related text
|
||||
|
||||
//override examinate verb to update description holders when things are examined
|
||||
/mob/examinate(atom/A as mob|obj|turf in view())
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
var/is_antag = (isAntag(src) || isobserver(src)) //ghosts don't have minds
|
||||
if(client)
|
||||
client.update_description_holders(A, is_antag)
|
||||
|
||||
@@ -1,14 +1,18 @@
|
||||
/proc/send2irc(var/channel, var/msg)
|
||||
/proc/send2irc(var/channel, var/msg, var/lesser_sanitize = FALSE)
|
||||
if(config.use_irc_bot && config.irc_bot_host.len)
|
||||
for(var/IP in config.irc_bot_host)
|
||||
spawn(0)
|
||||
// I have no means of trusting you, cmd
|
||||
ext_python("ircbot_message.py", "[config.comms_password] [IP] [channel] [paranoid_sanitize(msg)]")
|
||||
if(lesser_sanitize == 7355608) // Super random number because this could be bad if done accidentally
|
||||
// Runs sanitization but allows <> and // (Needed for discord)
|
||||
ext_python("ircbot_message.py", "[config.comms_password] [IP] [channel] [not_as_paranoid_sanitize(msg)]")
|
||||
else
|
||||
// I have no means of trusting you, cmd
|
||||
ext_python("ircbot_message.py", "[config.comms_password] [IP] [channel] [paranoid_sanitize(msg)]")
|
||||
return
|
||||
|
||||
/proc/send2mainirc(var/msg)
|
||||
/proc/send2mainirc(var/msg, var/lesser_sanitize = FALSE)
|
||||
if(config.main_irc)
|
||||
send2irc(config.main_irc, msg)
|
||||
send2irc(config.main_irc, msg, lesser_sanitize)
|
||||
return
|
||||
|
||||
/proc/send2adminirc(var/msg)
|
||||
@@ -17,5 +21,18 @@
|
||||
return
|
||||
|
||||
/hook/startup/proc/ircNotify()
|
||||
send2mainirc("Server starting up on [station_name()]. Connect to: [config.server? "[config.server]" : "[world.address]:[world.port]"]")
|
||||
var/people_to_ping = ""
|
||||
var/DBQuery/pull_notify = dbcon.NewQuery("SELECT discord_id FROM [format_table_name("discord")] WHERE notify = 1")
|
||||
if(!pull_notify.Execute())
|
||||
var/err = pull_notify.ErrorMsg()
|
||||
log_game("SQL ERROR while pulling notify people. Error : \[[err]\]\n")
|
||||
else
|
||||
while(pull_notify.NextRow())
|
||||
people_to_ping += "<@" + pull_notify.item[1] + "> "
|
||||
send2mainirc("Server starting up on [station_name()]. Connect to: <byond://[config.server? "[config.server]" : "[world.address]:[world.port]"]> "+people_to_ping, 7355608)
|
||||
// Set notify to 0 so people arent pinged round after round
|
||||
var/DBQuery/reset_notify = dbcon.NewQuery("UPDATE [format_table_name("discord")] SET notify = 0 WHERE notify = 1")
|
||||
if(!reset_notify.Execute())
|
||||
var/err = reset_notify.ErrorMsg()
|
||||
log_game("SQL ERROR while resetting notify status. Error : \[[err]\]\n")
|
||||
return 1
|
||||
|
||||
@@ -25,9 +25,9 @@
|
||||
throw_speed = 3
|
||||
throw_range = 7
|
||||
|
||||
suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw
|
||||
to_chat(viewers(user), "<span class='warning'>[user] places the [src.name] on top of [user.p_their()] head, [user.p_their()] fingers tangled in the netting! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
return(OXYLOSS)
|
||||
/obj/item/fish_net/suicide_act(mob/user) //"A tiny net is a death sentence: it's a net and it's tiny!" https://www.youtube.com/watch?v=FCI9Y4VGCVw
|
||||
to_chat(viewers(user), "<span class='warning'>[user] places the [src.name] on top of [user.p_their()] head, [user.p_their()] fingers tangled in the netting! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
return OXYLOSS
|
||||
|
||||
/obj/item/fishfood
|
||||
name = "fish food can"
|
||||
@@ -51,9 +51,9 @@
|
||||
throw_range = 7
|
||||
attack_verb = list("scrubbed", "brushed", "scraped")
|
||||
|
||||
suicide_act(mob/user)
|
||||
to_chat(viewers(user), "<span class='warning'>[user] is vigorously scrubbing [user.p_them()]self raw with the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
return(BRUTELOSS|FIRELOSS)
|
||||
/obj/item/tank_brush/suicide_act(mob/user)
|
||||
to_chat(viewers(user), "<span class='warning'>[user] is vigorously scrubbing [user.p_them()]self raw with the [name]! It looks like [user.p_theyre()] trying to commit suicide.</span>")
|
||||
return BRUTELOSS|FIRELOSS
|
||||
|
||||
//////////////////////////////////////////////
|
||||
// Fish Items //
|
||||
|
||||
@@ -547,7 +547,7 @@
|
||||
else
|
||||
playsound(src, 'sound/weapons/tap.ogg', 50, 1)
|
||||
if(BURN)
|
||||
playsound(src, 'sound/items/Welder.ogg', 100, 1)
|
||||
playsound(src, 'sound/items/welder.ogg', 100, 1)
|
||||
|
||||
/obj/machinery/fishtank/deconstruct(disassembled = TRUE)
|
||||
if(QDELETED(src))
|
||||
|
||||
@@ -357,7 +357,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
switch(rand(1,5))
|
||||
if(1) //Laser fight
|
||||
for(var/i in 0 to hits)
|
||||
target.playsound_local(null, 'sound/weapons/Laser.ogg', 25, 1)
|
||||
target.playsound_local(null, 'sound/weapons/laser.ogg', 25, 1)
|
||||
if(prob(75))
|
||||
addtimer(CALLBACK(target, /mob/.proc/playsound_local, null, 'sound/weapons/sear.ogg', 25, 1), rand(10,20))
|
||||
else
|
||||
@@ -506,7 +506,7 @@ Gunshots/explosions/opening doors/less rare audio (done)
|
||||
A.override = 1
|
||||
if(target.client)
|
||||
to_chat(target, "<span class='italics'>...wabbajack...wabbajack...</span>")
|
||||
target.playsound_local(target,'sound/magic/Staff_Change.ogg', 50, 1, -1)
|
||||
target.playsound_local(target,'sound/magic/staff_change.ogg', 50, 1, -1)
|
||||
delusion = A
|
||||
target.client.images |= A
|
||||
sleep(duration)
|
||||
@@ -698,13 +698,13 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
|
||||
doors += I
|
||||
if(target.client)
|
||||
target.client.images |= I
|
||||
target.playsound_local(get_turf(A), 'sound/machines/BoltsDown.ogg',30,0,3)
|
||||
target.playsound_local(get_turf(A), 'sound/machines/boltsdown.ogg',30,0,3)
|
||||
sleep(rand(6,12))
|
||||
sleep(100)
|
||||
for(var/image/B in doors)
|
||||
if(target.client)
|
||||
target.client.images.Remove(B)
|
||||
target.playsound_local(get_turf(B), 'sound/machines/BoltsUp.ogg',30,0,3)
|
||||
target.playsound_local(get_turf(B), 'sound/machines/boltsup.ogg',30,0,3)
|
||||
sleep(rand(6,12))
|
||||
qdel(src)
|
||||
|
||||
@@ -728,7 +728,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
|
||||
people += H
|
||||
if(person) //Basic talk
|
||||
var/image/speech_overlay = image('icons/mob/talk.dmi', person, "h0", layer = ABOVE_MOB_LAYER)
|
||||
target.hear_say(pick(speak_messages),language = pick(person.languages),speaker = person)
|
||||
target.hear_say(message_to_multilingual(pick(speak_messages), pick(person.languages)), speaker = person)
|
||||
if(target.client)
|
||||
target.client.images |= speech_overlay
|
||||
sleep(30)
|
||||
@@ -738,7 +738,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
|
||||
for(var/mob/living/carbon/human/H in GLOB.living_mob_list)
|
||||
humans += H
|
||||
person = pick(humans)
|
||||
target.hear_radio(pick(radio_messages),language = pick(person.languages),speaker = person, part_a = "<span class='[frequency_span_class(PUB_FREQ)]'><b>\[[get_frequency_name(PUB_FREQ)]\]</b> <span class='name'>", part_b = "</span> <span class='message'>")
|
||||
target.hear_radio(message_to_multilingual(pick(radio_messages), pick(person.languages)), speaker = person, part_a = "<span class='[frequency_span_class(PUB_FREQ)]'><b>\[[get_frequency_name(PUB_FREQ)]\]</b> <span class='name'>", part_b = "</span> <span class='message'>")
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/hallucination/message
|
||||
@@ -754,7 +754,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
|
||||
"<span class='warning'>You feel a tiny prick!</span>",
|
||||
"<B>[target]</B> sneezes.",
|
||||
"<span class='warning'>You feel faint.</span>",
|
||||
"<span class='noticealien'>You hear a strange, alien voice in your head...</span>[pick("Hiss","Ssss")]",
|
||||
"<span class='noticealien'>You hear a strange, alien voice in your head...</span> [pick("Hiss","Ssss")]",
|
||||
"<span class='notice'>You can see...everything!</span>")
|
||||
to_chat(target, chosen)
|
||||
qdel(src)
|
||||
@@ -797,42 +797,42 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
|
||||
playsound_local(null,'sound/machines/airlock_open.ogg', 15, 1)
|
||||
if(2)
|
||||
if(prob(50))
|
||||
playsound_local(null,'sound/effects/Explosion1.ogg', 50, 1)
|
||||
playsound_local(null,'sound/effects/explosion1.ogg', 50, 1)
|
||||
else
|
||||
playsound_local(null, 'sound/effects/Explosion2.ogg', 50, 1)
|
||||
playsound_local(null, 'sound/effects/explosion2.ogg', 50, 1)
|
||||
if(3)
|
||||
playsound_local(null, 'sound/effects/explosionfar.ogg', 50, 1)
|
||||
if(4)
|
||||
playsound_local(null, pick('sound/effects/Glassbr1.ogg','sound/effects/Glassbr2.ogg','sound/effects/Glassbr3.ogg'), 50, 1)
|
||||
playsound_local(null, pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg'), 50, 1)
|
||||
if(5)
|
||||
playsound_local(null, 'sound/weapons/ring.ogg', 35)
|
||||
for(var/i in 0 to 2)
|
||||
sleep(15)
|
||||
playsound_local(null, 'sound/weapons/ring.ogg', 35)
|
||||
if(6)
|
||||
playsound_local(null, 'sound/magic/Summon_guns.ogg', 50, 1)
|
||||
playsound_local(null, 'sound/magic/summon_guns.ogg', 50, 1)
|
||||
if(7)
|
||||
playsound_local(null, 'sound/machines/Alarm.ogg', 100, 0)
|
||||
playsound_local(null, 'sound/machines/alarm.ogg', 100, 0)
|
||||
if(8)
|
||||
playsound_local(null, 'sound/voice/bfreeze.ogg', 35, 0)
|
||||
if(9)
|
||||
//To make it more realistic, I added two gunshots (enough to kill)
|
||||
playsound_local(null, 'sound/weapons/Gunshot.ogg', 25, 1)
|
||||
playsound_local(null, 'sound/weapons/gunshots/gunshot.ogg', 25, 1)
|
||||
var/timer_pause = rand(10,30)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, 'sound/weapons/Gunshot.ogg', 25, 1), timer_pause)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, 'sound/weapons/gunshots/gunshot.ogg', 25, 1), timer_pause)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, sound(get_sfx("bodyfall"), 25), 25, 1), timer_pause+rand(5,10))
|
||||
if(10)
|
||||
playsound_local(null, 'sound/effects/pray_chaplain.ogg', 50)
|
||||
if(11)
|
||||
//Same as above, but with tasers.
|
||||
playsound_local(null, 'sound/weapons/Taser.ogg', 25, 1)
|
||||
playsound_local(null, 'sound/weapons/taser.ogg', 25, 1)
|
||||
var/timer_pause = rand(10,30)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, 'sound/weapons/Taser.ogg', 25, 1), timer_pause)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, 'sound/weapons/taser.ogg', 25, 1), timer_pause)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound_local, null, sound(get_sfx("bodyfall"), 25), 25, 1), timer_pause+rand(5,10))
|
||||
//Rare audio
|
||||
if(12)
|
||||
//These sounds are (mostly) taken from Hidden: Source
|
||||
var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
|
||||
var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/heartbeat.ogg', 'sound/effects/screech.ogg',\
|
||||
'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
|
||||
'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
|
||||
'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
|
||||
@@ -845,13 +845,13 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
|
||||
to_chat(src, "<br><br><span class='alert'>The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.</span><br><br>")
|
||||
playsound_local(null, 'sound/AI/shuttledock.ogg', 100)
|
||||
if(15)
|
||||
playsound_local(null, 'sound/items/Welder.ogg', 15, 1)
|
||||
playsound_local(null, 'sound/items/welder.ogg', 15, 1)
|
||||
sleep(105)
|
||||
playsound_local(null, 'sound/items/Welder2.ogg', 15, 1)
|
||||
playsound_local(null, 'sound/items/welder2.ogg', 15, 1)
|
||||
sleep(15)
|
||||
playsound_local(null, 'sound/items/Ratchet.ogg', 15, 1)
|
||||
playsound_local(null, 'sound/items/ratchet.ogg', 15, 1)
|
||||
if(16)
|
||||
playsound_local(null, 'sound/items/Screwdriver.ogg', 15, 1)
|
||||
playsound_local(null, 'sound/items/screwdriver.ogg', 15, 1)
|
||||
sleep(rand(10,30))
|
||||
for(var/i in 0 to rand(1,3))
|
||||
playsound_local(null, 'sound/weapons/empty.ogg', 15, 1)
|
||||
@@ -993,7 +993,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_
|
||||
halimage = image('icons/turf/floors/Chasms.dmi',target,"smooth",TURF_LAYER)
|
||||
if(4)
|
||||
halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
|
||||
|
||||
|
||||
if(client)
|
||||
client.images += halimage
|
||||
sleep(rand(40,60)) //Only seen for a brief moment.
|
||||
|
||||
@@ -64,9 +64,8 @@ proc/Ellipsis(original_msg, chance = 50)
|
||||
if(chance <= 0) return "..."
|
||||
if(chance >= 100) return original_msg
|
||||
|
||||
var/list
|
||||
words = splittext(original_msg," ")
|
||||
new_words = list()
|
||||
var/list/words = splittext(original_msg," ")
|
||||
var/list/new_words = list()
|
||||
|
||||
var/new_msg = ""
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
possible_transfer_amounts = list(5,10,15,20,25,30,50)
|
||||
volume = 50
|
||||
burn_state = FIRE_PROOF
|
||||
antable = FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/New()
|
||||
..()
|
||||
@@ -106,15 +107,6 @@
|
||||
|
||||
return FALSE
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/attackby(obj/item/I, mob/user, params)
|
||||
if(istype(I, /obj/item/clothing/mask/cigarette)) //ciggies are weird
|
||||
return FALSE
|
||||
if(is_hot(I))
|
||||
if(reagents)
|
||||
reagents.chem_temp += 15
|
||||
to_chat(user, "<span class='notice'>You heat [src] with [I].</span>")
|
||||
reagents.handle_reactions()
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/examine(mob/user)
|
||||
if(!..(user, 1))
|
||||
return
|
||||
@@ -195,13 +187,13 @@
|
||||
list_reagents = list("coffee" = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/ice
|
||||
name = "Ice Cup"
|
||||
name = "ice cup"
|
||||
desc = "Careful, cold ice, do not chew."
|
||||
icon_state = "icecup"
|
||||
list_reagents = list("ice" = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/tea
|
||||
name = "Duke Purple Tea"
|
||||
name = "Duke Purple tea"
|
||||
desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
|
||||
icon_state = "teacup"
|
||||
item_state = "coffee"
|
||||
@@ -213,34 +205,34 @@
|
||||
reagents.add_reagent("mugwort", 3)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/mugwort
|
||||
name = "Mugwort Tea"
|
||||
name = "mugwort tea"
|
||||
desc = "A bitter herbal tea."
|
||||
icon_state = "manlydorfglass"
|
||||
item_state = "coffee"
|
||||
list_reagents = list("mugwort" = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/h_chocolate
|
||||
name = "Dutch Hot Coco"
|
||||
name = "Dutch hot coco"
|
||||
desc = "Made in Space South America."
|
||||
icon_state = "hot_coco"
|
||||
item_state = "coffee"
|
||||
list_reagents = list("hot_coco" = 30, "sugar" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/chocolate
|
||||
name = "Hot Chocolate"
|
||||
name = "hot chocolate"
|
||||
desc = "Made in Space Switzerland."
|
||||
icon_state = "hot_coco"
|
||||
item_state = "coffee"
|
||||
list_reagents = list("chocolate" = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/weightloss
|
||||
name = "Weight-Loss Shake"
|
||||
name = "weight-loss shake"
|
||||
desc = "A shake designed to cause weight loss. The package proudly proclaims that it is 'tapeworm free.'"
|
||||
icon_state = "weightshake"
|
||||
list_reagents = list("lipolicide" = 30, "chocolate" = 5)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/dry_ramen
|
||||
name = "Cup Ramen"
|
||||
name = "cup ramen"
|
||||
desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years."
|
||||
icon_state = "ramen"
|
||||
item_state = "ramen"
|
||||
@@ -252,7 +244,7 @@
|
||||
reagents.add_reagent("enzyme", 3)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/chicken_soup
|
||||
name = "Canned Chicken Soup"
|
||||
name = "canned chicken soup"
|
||||
desc = "A delicious and soothing can of chicken noodle soup; just like spessmom used to microwave it."
|
||||
icon_state = "soupcan"
|
||||
item_state = "soupcan"
|
||||
@@ -329,7 +321,7 @@
|
||||
volume = 50
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/flask/lithium
|
||||
name = "Lithium Flask"
|
||||
name = "lithium flask"
|
||||
desc = "A flask with a Lithium Atom symbol on it."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "lithiumflask"
|
||||
@@ -351,13 +343,13 @@
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bag
|
||||
name = "Drink bag"
|
||||
name = "drink bag"
|
||||
desc = "Normally put in wine boxes, or down pants at stadium events."
|
||||
icon_state = "goonbag"
|
||||
volume = 70
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bag/goonbag
|
||||
name = "Goon from a Blue Toolbox special edition"
|
||||
name = "goon from a Blue Toolbox special edition"
|
||||
desc = "Wine from the land down under, where the dingos roam and the roos do wander."
|
||||
icon_state = "goonbag"
|
||||
list_reagents = list("wine" = 70)
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
list_reagents = list("rum" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/holywater
|
||||
name = "Flask of Holy Water"
|
||||
name = "flask of holy water"
|
||||
desc = "A flask of the chaplain's holy water."
|
||||
icon_state = "holyflask"
|
||||
list_reagents = list("holywater" = 100)
|
||||
@@ -232,8 +232,8 @@
|
||||
list_reagents = list("wine" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/absinthe
|
||||
name = "Extra-Strong Absinthe"
|
||||
desc = "A strong alcoholic drink brewed and distributed by REDACTED."
|
||||
name = "Yellow Marquee Absinthe"
|
||||
desc = "A strong alcoholic drink brewed and distributed by Yellow Marquee."
|
||||
icon_state = "absinthebottle"
|
||||
list_reagents = list("absinthe" = 100)
|
||||
|
||||
@@ -252,7 +252,7 @@
|
||||
//////////////////////////JUICES AND STUFF ///////////////////////
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
|
||||
name = "Orange Juice"
|
||||
name = "orange juice"
|
||||
desc = "Full of vitamins and deliciousness!"
|
||||
icon_state = "orangejuice"
|
||||
item_state = "carton"
|
||||
@@ -260,7 +260,7 @@
|
||||
list_reagents = list("orangejuice" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/cream
|
||||
name = "Milk Cream"
|
||||
name = "milk cream"
|
||||
desc = "It's cream. Made from milk. What else did you think you'd find in there?"
|
||||
icon_state = "cream"
|
||||
item_state = "carton"
|
||||
@@ -268,7 +268,7 @@
|
||||
list_reagents = list("cream" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice
|
||||
name = "Tomato Juice"
|
||||
name = "tomato juice"
|
||||
desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness."
|
||||
icon_state = "tomatojuice"
|
||||
item_state = "carton"
|
||||
@@ -276,7 +276,7 @@
|
||||
list_reagents = list("tomatojuice" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/limejuice
|
||||
name = "Lime Juice"
|
||||
name = "lime juice"
|
||||
desc = "Sweet-sour goodness."
|
||||
icon_state = "limejuice"
|
||||
item_state = "carton"
|
||||
@@ -284,7 +284,7 @@
|
||||
list_reagents = list("limejuice" = 100)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/bottle/milk
|
||||
name = "Milk"
|
||||
name = "milk"
|
||||
desc = "Soothing milk."
|
||||
icon_state = "milk"
|
||||
item_state = "carton"
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
crushed_can.is_glass = is_glass
|
||||
crushed_can.is_plastic = is_plastic
|
||||
if(is_glass)
|
||||
playsound(user.loc, 'sound/effects/Glassbr3.ogg', rand(10, 50), 1)
|
||||
playsound(user.loc, 'sound/effects/glassbr3.ogg', rand(10, 50), 1)
|
||||
crushed_can.name = "broken bottle"
|
||||
else
|
||||
playsound(user.loc, 'sound/weapons/pierce.ogg', rand(10, 50), 1)
|
||||
@@ -59,34 +59,34 @@
|
||||
return ..(target, user, proximity)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/cans/cola
|
||||
name = "Space Cola"
|
||||
name = "space cola"
|
||||
desc = "Cola. in space."
|
||||
icon_state = "cola"
|
||||
list_reagents = list("cola" = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/cans/beer
|
||||
name = "Space Beer"
|
||||
name = "space beer"
|
||||
desc = "Contains only water, malt and hops."
|
||||
icon_state = "beer"
|
||||
is_glass = 1
|
||||
list_reagents = list("beer" = 30)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/cans/adminbooze
|
||||
name = "Admin Booze"
|
||||
name = "admin booze"
|
||||
desc = "Bottled Griffon tears. Drink with caution."
|
||||
icon_state = "adminbooze"
|
||||
is_glass = 1
|
||||
list_reagents = list("adminordrazine" = 5, "capsaicin" = 5, "methamphetamine"= 20, "thirteenloko" = 20)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/cans/madminmalt
|
||||
name = "Madmin Malt"
|
||||
name = "madmin malt"
|
||||
desc = "Bottled essence of angry admins. Drink with <i>EXTREME</i> caution."
|
||||
icon_state = "madminmalt"
|
||||
is_glass = 1
|
||||
list_reagents = list("hell_water" = 20, "neurotoxin" = 15, "thirteenloko" = 15)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/cans/badminbrew
|
||||
name = "Badmin Brew"
|
||||
name = "badmin brew"
|
||||
desc = "Bottled trickery and terrible admin work. Probably shouldn't drink this one at all."
|
||||
icon_state = "badminbrew"
|
||||
is_glass = 1
|
||||
@@ -156,7 +156,7 @@
|
||||
list_reagents = list("tonic" = 50)
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/cans/sodawater
|
||||
name = "Soda Water"
|
||||
name = "soda water"
|
||||
desc = "A can of soda water. Still water's more refreshing cousin."
|
||||
icon_state = "sodawater"
|
||||
list_reagents = list("sodawater" = 50)
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/fire_act()
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
|
||||
if(!reagents.total_volume)
|
||||
return
|
||||
..()
|
||||
@@ -63,6 +63,6 @@
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/devilskiss
|
||||
list_reagents = list("devilskiss" = 50)
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/drinks/drinkingglass/alliescocktail
|
||||
list_reagents = list("alliescocktail" = 50)
|
||||
list_reagents = list("alliescocktail" = 25, "omnizine" = 25)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user