Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into cultthings

# Conflicts:
#	paradise.dme
This commit is contained in:
Mark van Alphen
2019-06-09 23:28:41 +02:00
795 changed files with 101167 additions and 8028 deletions
+15 -1
View File
@@ -150,6 +150,8 @@ datum/admins/proc/DB_ban_record(var/bantype, var/mob/banned_mob, var/duration =
if(isjobban)
jobban_client_fullban(ckey, job)
else
flag_account_for_forum_sync(ckey)
datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
@@ -228,6 +230,8 @@ datum/admins/proc/DB_ban_unban(var/ckey, var/bantype, var/job = "")
DB_ban_unban_by_id(ban_id)
if(isjobban)
jobban_unban_client(ckey, job)
else
flag_account_for_forum_sync(ckey)
datum/admins/proc/DB_ban_edit(var/banid = null, var/param = null)
@@ -333,6 +337,8 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
var/DBQuery/query_update = dbcon.NewQuery(sql_update)
query_update.Execute()
flag_account_for_forum_sync(pckey)
/client/proc/DB_ban_panel()
set category = "Admin"
@@ -566,4 +572,12 @@ datum/admins/proc/DB_ban_unban_by_id(var/id)
output += "</table></div>"
usr << browse(output,"window=lookupbans;size=900x700")
usr << browse(output,"window=lookupbans;size=900x700")
/proc/flag_account_for_forum_sync(ckey)
if(!dbcon)
return
var/skey = sanitizeSQL(ckey)
var/sql = "UPDATE [format_table_name("player")] SET fupdate = 1 WHERE ckey = '[skey]'"
var/DBQuery/adm_query = dbcon.NewQuery(sql)
adm_query.Execute()
+16 -1
View File
@@ -1,5 +1,12 @@
//Blocks an attempt to connect before even creating our client datum thing.
world/IsBanned(key,address,computer_id)
world/IsBanned(key, address, computer_id, check_ipintel = TRUE)
if(!config.ban_legacy_system)
if(address)
address = sanitizeSQL(address)
if(computer_id)
computer_id = sanitizeSQL(computer_id)
if(!key || !address || !computer_id)
log_adminwarn("Failed Login (invalid data): [key] [address]-[computer_id]")
return list("reason"="invalid login data", "desc"="Error: Could not check ban status, please try again. Error message: Your computer provided invalid or blank information to the server on connection (BYOND Username, IP, and Computer ID). Provided information for reference: Username: '[key]' IP: '[address]' Computer ID: '[computer_id]'. If you continue to get this error, please restart byond or contact byond support.")
@@ -31,6 +38,14 @@ world/IsBanned(key,address,computer_id)
mistakemessage = "\nIf you believe this is a mistake, please request help at [config.banappeals]."
return list("reason"="using Tor", "desc"="\nReason: The network you are using to connect has been banned.[mistakemessage]")
//check if the IP address is a known proxy/vpn, and the user is not whitelisted
if(check_ipintel && config.ipintel_email && config.ipintel_whitelist && ipintel_is_banned(key, address))
log_adminwarn("Failed Login: [key] [computer_id] [address] - Proxy/VPN")
var/mistakemessage = ""
if(config.banappeals)
mistakemessage = "\nIf you have to use one, request whitelisting at: [config.banappeals]"
return list("reason"="using proxy or vpn", "desc"="\nReason: Proxies/VPNs are not allowed here. [mistakemessage]")
if(config.ban_legacy_system)
//Ban Checking
+46 -29
View File
@@ -21,8 +21,11 @@ var/global/nologevent = 0
to_chat(C, msg)
/proc/message_adminTicket(var/msg)
msg = "<span class='adminticket'><span class='prefix'>ADMIN TICKET:</span> [msg]</span>"
/proc/message_adminTicket(var/msg, var/alt = FALSE)
if(alt)
msg = "<span class=admin_channel>ADMIN TICKET: [msg]</span>"
else
msg = "<span class=adminticket><span class='prefix'>ADMIN TICKET:</span> [msg]</span>"
for(var/client/C in GLOB.admins)
if(R_ADMIN & C.holder.rights)
if(C.prefs && !(C.prefs.toggles & CHAT_NO_TICKETLOGS))
@@ -273,6 +276,15 @@ var/global/nologevent = 0
show_note(key)
/datum/admins/proc/vpn_whitelist()
set category = "Admin"
set name = "VPN Ckey Whitelist"
if(!check_rights(R_ADMIN))
return
var/key = stripped_input(usr, "Enter ckey to add/remove, or leave blank to cancel:", "VPN Whitelist add/remove", max_length=32)
if(key)
vpn_whitelist_panel(key)
/datum/admins/proc/access_news_network() //MARKER
set category = "Event"
set name = "Access Newscaster Network"
@@ -572,7 +584,7 @@ var/global/nologevent = 0
delay = delay * 10
message_admins("[key_name_admin(usr)] has initiated a server restart with a delay of [delay/10] seconds")
log_admin("[key_name(usr)] has initiated a server restart with a delay of [delay/10] seconds")
ticker.delay_end = 0
SSticker.delay_end = 0
feedback_add_details("admin_verb","R") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
world.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", delay)
@@ -672,21 +684,26 @@ var/global/nologevent = 0
if(!check_rights(R_SERVER))
return
if(!ticker)
if(!SSticker)
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.")
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
if(SSticker.current_state == GAME_STATE_PREGAME || SSticker.current_state == GAME_STATE_STARTUP)
SSticker.force_start = TRUE
log_admin("[usr.key] has started the game.")
var/msg = ""
if(SSticker.current_state == GAME_STATE_STARTUP)
msg = " (The server is still setting up, but the round will be started as soon as possible.)"
message_admins("<font color='blue'>[usr.key] has started the game.[msg]</font>")
feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return 1
else
to_chat(usr, "<font color='red'>Error: Start Now: Game has already started.</font>")
return 0
return
/datum/admins/proc/toggleenter()
set category = "Server"
@@ -763,10 +780,10 @@ var/global/nologevent = 0
if(!check_rights(R_SERVER))
return
if(!ticker || ticker.current_state != GAME_STATE_PREGAME)
ticker.delay_end = !ticker.delay_end
log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
message_admins("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1)
if(!SSticker || SSticker.current_state != GAME_STATE_PREGAME)
SSticker.delay_end = !SSticker.delay_end
log_admin("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
message_admins("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1)
return //alert("Round end delayed", null, null, null, null, null)
going = !( going )
if(!( going ))
@@ -780,32 +797,32 @@ var/global/nologevent = 0
////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS
/proc/is_special_character(mob/M as mob) // returns 1 for specail characters and 2 for heroes of gamemode
if(!ticker || !ticker.mode)
if(!SSticker || !SSticker.mode)
return 0
if(!istype(M))
return 0
if((M.mind in ticker.mode.head_revolutionaries) || (M.mind in ticker.mode.revolutionaries))
if(ticker.mode.config_tag == "revolution")
if((M.mind in SSticker.mode.head_revolutionaries) || (M.mind in SSticker.mode.revolutionaries))
if(SSticker.mode.config_tag == "revolution")
return 2
return 1
if(M.mind in ticker.mode.cult)
if(ticker.mode.config_tag == "cult")
if(M.mind in SSticker.mode.cult)
if(SSticker.mode.config_tag == "cult")
return 2
return 1
if(M.mind in ticker.mode.syndicates)
if(ticker.mode.config_tag == "nuclear")
if(M.mind in SSticker.mode.syndicates)
if(SSticker.mode.config_tag == "nuclear")
return 2
return 1
if(M.mind in ticker.mode.wizards)
if(ticker.mode.config_tag == "wizard")
if(M.mind in SSticker.mode.wizards)
if(SSticker.mode.config_tag == "wizard")
return 2
return 1
if(M.mind in ticker.mode.changelings)
if(ticker.mode.config_tag == "changeling")
if(M.mind in SSticker.mode.changelings)
if(SSticker.mode.config_tag == "changeling")
return 2
return 1
if(M.mind in ticker.mode.abductors)
if(ticker.mode.config_tag == "abduction")
if(M.mind in SSticker.mode.abductors)
if(SSticker.mode.config_tag == "abduction")
return 2
return 1
if(isrobot(M))
+1
View File
@@ -53,6 +53,7 @@ var/list/admin_verbs_admin = list(
/datum/admins/proc/PlayerNotes,
/client/proc/cmd_mentor_say,
/datum/admins/proc/show_player_notes,
/datum/admins/proc/vpn_whitelist,
/client/proc/free_slot, /*frees slot for chosen job*/
/client/proc/toggleattacklogs,
/client/proc/toggleadminlogs,
+228
View File
@@ -0,0 +1,228 @@
/datum/ipintel
var/ip
var/intel = 0
var/cache = FALSE
var/cacheminutesago = 0
var/cachedate = ""
var/cacherealtime = 0
/datum/ipintel/New()
cachedate = SQLtime()
cacherealtime = world.realtime
/datum/ipintel/proc/is_valid()
. = FALSE
if(intel < 0)
return
if(intel <= config.ipintel_rating_bad)
if(world.realtime < cacherealtime + (config.ipintel_save_good HOURS))
return TRUE
else
if(world.realtime < cacherealtime + (config.ipintel_save_bad HOURS))
return TRUE
/proc/get_ip_intel(ip, bypasscache = FALSE, updatecache = TRUE)
var/datum/ipintel/res = new()
ip = sanitizeSQL(ip)
res.ip = ip
. = res
if(!ip || !config.ipintel_email || !SSipintel.enabled)
return
if(!bypasscache)
var/datum/ipintel/cachedintel = SSipintel.cache[ip]
if(cachedintel && cachedintel.is_valid())
cachedintel.cache = TRUE
return cachedintel
if(dbcon.IsConnected())
var/rating_bad = config.ipintel_rating_bad
var/DBQuery/query_get_ip_intel = dbcon.NewQuery({"
SELECT date, intel, TIMESTAMPDIFF(MINUTE,date,NOW())
FROM [format_table_name("ipintel")]
WHERE
ip = INET_ATON('[ip]')
AND ((
intel < [rating_bad]
AND
date + INTERVAL [config.ipintel_save_good] HOUR > NOW()
) OR (
intel >= [rating_bad]
AND
date + INTERVAL [config.ipintel_save_bad] HOUR > NOW()
))
"})
if(!query_get_ip_intel.Execute())
qdel(query_get_ip_intel)
return
if(query_get_ip_intel.NextRow())
res.cache = TRUE
res.cachedate = query_get_ip_intel.item[1]
res.intel = text2num(query_get_ip_intel.item[2])
res.cacheminutesago = text2num(query_get_ip_intel.item[3])
res.cacherealtime = world.realtime - (text2num(query_get_ip_intel.item[3])*10*60)
SSipintel.cache[ip] = res
qdel(query_get_ip_intel)
return
qdel(query_get_ip_intel)
res.intel = ip_intel_query(ip)
if(updatecache && res.intel >= 0)
SSipintel.cache[ip] = res
if(dbcon.IsConnected())
var/DBQuery/query_add_ip_intel = dbcon.NewQuery("INSERT INTO [format_table_name("ipintel")] (ip, intel) VALUES (INET_ATON('[ip]'), [res.intel]) ON DUPLICATE KEY UPDATE intel = VALUES(intel), date = NOW()")
query_add_ip_intel.Execute()
qdel(query_add_ip_intel)
/proc/ip_intel_query(ip, var/retryed=0)
. = -1 //default
if(!ip)
return
if(SSipintel.throttle > world.timeofday)
return
if(!SSipintel.enabled)
return
var/list/http[] = world.Export("http://[config.ipintel_domain]/check.php?ip=[ip]&contact=[config.ipintel_email]&format=json&flags=b")
if(http)
var/status = text2num(http["STATUS"])
if(status == 200)
var/response = json_decode(file2text(http["CONTENT"]))
if(response)
if(response["status"] == "success")
var/intelnum = text2num(response["result"])
if(isnum(intelnum))
return text2num(response["result"])
else
ipintel_handle_error("Bad intel from server: [response["result"]].", ip, retryed)
if(!retryed)
sleep(25)
return .(ip, 1)
else
ipintel_handle_error("Bad response from server: [response["status"]].", ip, retryed)
if(!retryed)
sleep(25)
return .(ip, 1)
else if(status == 429)
ipintel_handle_error("Error #429: We have exceeded the rate limit.", ip, 1)
return
else
ipintel_handle_error("Unknown status code: [status].", ip, retryed)
if(!retryed)
sleep(25)
return .(ip, 1)
else
ipintel_handle_error("Unable to connect to API.", ip, retryed)
if(!retryed)
sleep(25)
return .(ip, 1)
/proc/ipintel_handle_error(error, ip, retryed)
if(retryed)
SSipintel.errors++
error += " Could not check [ip]. Disabling IPINTEL for [SSipintel.errors] minute[( SSipintel.errors == 1 ? "" : "s" )]"
SSipintel.throttle = world.timeofday + (2 * SSipintel.errors MINUTES)
else
error += " Attempting retry on [ip]."
log_ipintel(error)
/proc/log_ipintel(text)
log_game("IPINTEL: [text]")
log_debug("IPINTEL: [text]")
/proc/ipintel_is_banned(t_ckey, t_ip)
if(!config.ipintel_email)
return FALSE
if(!config.ipintel_whitelist)
return FALSE
if(!dbcon.IsConnected())
return FALSE
if(!ipintel_badip_check(t_ip))
return FALSE
if(vpn_whitelist_check(t_ckey))
return FALSE
return TRUE
/proc/ipintel_badip_check(target_ip)
var/rating_bad = config.ipintel_rating_bad
if(!rating_bad)
log_debug("ipintel_badip_check reports misconfigured rating_bad directive")
return FALSE
var/valid_hours = config.ipintel_save_bad
if(!valid_hours)
log_debug("ipintel_badip_check reports misconfigured ipintel_save_bad directive")
return FALSE
target_ip = sanitizeSQL(target_ip)
rating_bad = sanitizeSQL(rating_bad)
valid_hours = sanitizeSQL(valid_hours)
var/check_sql = {"SELECT * FROM [format_table_name("ipintel")] WHERE ip = INET_ATON('[target_ip]') AND intel >= [rating_bad] AND (date + INTERVAL [valid_hours] HOUR) > NOW()"}
var/DBQuery/query_get_ip_intel = dbcon.NewQuery(check_sql)
if(!query_get_ip_intel.Execute())
log_debug("ipintel_badip_check reports failed query execution")
qdel(query_get_ip_intel)
return FALSE
if(!query_get_ip_intel.NextRow())
qdel(query_get_ip_intel)
return FALSE
qdel(query_get_ip_intel)
return TRUE
/proc/vpn_whitelist_check(target_ckey)
if(!config.ipintel_whitelist)
return FALSE
var/target_sql_ckey = ckey(target_ckey)
var/DBQuery/query_whitelist_check = dbcon.NewQuery("SELECT * FROM [format_table_name("vpn_whitelist")] WHERE ckey = '[target_sql_ckey]'")
if(!query_whitelist_check.Execute())
var/err = query_whitelist_check.ErrorMsg()
log_debug("SQL ERROR on proc/vpn_whitelist_check for ckey '[target_sql_ckey]'. Error : \[[err]\]\n")
return FALSE
if(query_whitelist_check.NextRow())
return TRUE // At least one row in the whitelist names their ckey. That means they are whitelisted.
return FALSE
/proc/vpn_whitelist_add(target_ckey)
var/target_sql_ckey = ckey(target_ckey)
var/reason_string = input(usr, "Enter link to the URL of their whitelist request on the forum.","Reason required") as message|null
if(!reason_string)
return FALSE
reason_string = sanitizeSQL(reason_string)
var/DBQuery/query_whitelist_add = dbcon.NewQuery("INSERT INTO [format_table_name("vpn_whitelist")] (ckey,reason) VALUES ('[target_sql_ckey]','[reason_string]')")
if(!query_whitelist_add.Execute())
var/err = query_whitelist_add.ErrorMsg()
log_debug("SQL ERROR on proc/vpn_whitelist_add for ckey '[target_sql_ckey]'. Error : \[[err]\]\n")
return FALSE
return TRUE
/proc/vpn_whitelist_remove(target_ckey)
var/target_sql_ckey = ckey(target_ckey)
var/DBQuery/query_whitelist_remove = dbcon.NewQuery("DELETE FROM [format_table_name("vpn_whitelist")] WHERE ckey = '[target_sql_ckey]'")
if(!query_whitelist_remove.Execute())
var/err = query_whitelist_remove.ErrorMsg()
log_debug("SQL ERROR on proc/vpn_whitelist_remove for ckey '[target_sql_ckey]'. Error : \[[err]\]\n")
return FALSE
return TRUE
/proc/vpn_whitelist_panel(target_ckey as text)
if(!check_rights(R_ADMIN))
return
if(!target_ckey)
return
var/is_already_whitelisted = vpn_whitelist_check(target_ckey)
if(is_already_whitelisted)
var/confirm = alert("[target_ckey] is already whitelisted. Remove them?", "Confirm Removal", "No", "Yes")
if(!confirm || confirm != "Yes")
to_chat(usr, "VPN whitelist alteration cancelled.")
return
else if(vpn_whitelist_remove(target_ckey))
to_chat(usr, "[target_ckey] was removed from the VPN whitelist.")
else
to_chat(usr, "VPN whitelist unchanged.")
else
if(vpn_whitelist_add(target_ckey))
to_chat(usr, "[target_ckey] was added to the VPN whitelist.")
else
to_chat(usr, "VPN whitelist unchanged.")
+49 -49
View File
@@ -400,9 +400,9 @@
/datum/admins/proc/check_antagonists()
if(!check_rights(R_ADMIN)) return
if(ticker && ticker.current_state >= GAME_STATE_PLAYING)
if(SSticker && SSticker.current_state >= GAME_STATE_PLAYING)
var/dat = "<html><head><title>Round Status</title></head><body><h1><B>Round Status</B></h1>"
dat += "Current Game Mode: <B>[ticker.mode.name]</B><BR>"
dat += "Current Game Mode: <B>[SSticker.mode.name]</B><BR>"
dat += "Round Duration: <B>[round(ROUND_TIME / 36000)]:[add_zero(num2text(ROUND_TIME / 600 % 60), 2)]:[add_zero(num2text(ROUND_TIME / 10 % 60), 2)]</B><BR>"
dat += "<B>Emergency shuttle</B><BR>"
if(SSshuttle.emergency.mode < SHUTTLE_CALL)
@@ -415,10 +415,10 @@
else
dat += "ETA: <a href='?_src_=holder;edit_shuttle_time=1'>[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]</a><BR>"
dat += "<a href='?src=[UID()];delay_round_end=1'>[ticker.delay_end ? "End Round Normally" : "Delay Round End"]</a><br>"
if(ticker.mode.syndicates.len)
dat += "<a href='?src=[UID()];delay_round_end=1'>[SSticker.delay_end ? "End Round Normally" : "Delay Round End"]</a><br>"
if(SSticker.mode.syndicates.len)
dat += "<br><table cellspacing=5><tr><td><B>Syndicates</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.syndicates)
for(var/datum/mind/N in SSticker.mode.syndicates)
var/mob/M = N.current
if(M)
dat += check_antagonists_line(M)
@@ -439,20 +439,20 @@
dat += "in [disk_loc.loc] at ([disk_loc.x], [disk_loc.y], [disk_loc.z])</td></tr>"
dat += "</table>"
if(ticker.mode.head_revolutionaries.len || ticker.mode.revolutionaries.len)
if(SSticker.mode.head_revolutionaries.len || SSticker.mode.revolutionaries.len)
dat += "<br><table cellspacing=5><tr><td><B>Revolutionaries</B></td><td></td></tr>"
for(var/datum/mind/N in ticker.mode.head_revolutionaries)
for(var/datum/mind/N in SSticker.mode.head_revolutionaries)
var/mob/M = N.current
if(!M)
dat += "<tr><td><i>Head Revolutionary not found!</i></td></tr>"
else
dat += check_antagonists_line(M, "(leader)")
for(var/datum/mind/N in ticker.mode.revolutionaries)
for(var/datum/mind/N in SSticker.mode.revolutionaries)
var/mob/M = N.current
if(M)
dat += check_antagonists_line(M)
dat += "</table><table cellspacing=5><tr><td><B>Target(s)</B></td><td></td><td><B>Location</B></td></tr>"
for(var/datum/mind/N in ticker.mode.get_living_heads())
for(var/datum/mind/N in SSticker.mode.get_living_heads())
var/mob/M = N.current
if(M)
dat += check_antagonists_line(M)
@@ -463,7 +463,7 @@
dat += "</table>"
if(GAMEMODE_IS_BLOB)
var/datum/game_mode/blob/mode = ticker.mode
var/datum/game_mode/blob/mode = SSticker.mode
dat += "<br><table cellspacing=5><tr><td><B>Blob</B></td><td></td><td></td></tr>"
dat += "<tr><td><i>Progress: [blobs.len]/[mode.blobwincount]</i></td></tr>"
@@ -476,67 +476,67 @@
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(SSticker.mode.blob_overminds.len)
dat += check_role_table("Blob Overminds", SSticker.mode.blob_overminds)
if(ticker.mode.changelings.len)
dat += check_role_table("Changelings", ticker.mode.changelings)
if(SSticker.mode.changelings.len)
dat += check_role_table("Changelings", SSticker.mode.changelings)
if(ticker.mode.wizards.len)
dat += check_role_table("Wizards", ticker.mode.wizards)
if(SSticker.mode.wizards.len)
dat += check_role_table("Wizards", SSticker.mode.wizards)
if(ticker.mode.raiders.len)
dat += check_role_table("Raiders", ticker.mode.raiders)
if(SSticker.mode.raiders.len)
dat += check_role_table("Raiders", SSticker.mode.raiders)
/*if(ticker.mode.ninjas.len)
dat += check_role_table("Ninjas", ticker.mode.ninjas)*/
if(ticker.mode.cult.len)
dat += check_role_table("Cultists", ticker.mode.cult, 0)
if(SSticker.mode.cult.len)
dat += check_role_table("Cultists", SSticker.mode.cult, 0)
dat += "<br> use <a href='?src=[UID()];cult_mindspeak=[UID()]'>Cult Mindspeak</a>"
if(GAMEMODE_IS_CULT)
var/datum/game_mode/cult/cult_round = ticker.mode
var/datum/game_mode/cult/cult_round = SSticker.mode
if(!cult_round.narsie_condition_cleared)
dat += "<br><a href='?src=[UID()];cult_nextobj=[UID()]'>complete objective (debug)</a>"
if(ticker.mode.traitors.len)
dat += check_role_table("Traitors", ticker.mode.traitors)
if(SSticker.mode.traitors.len)
dat += check_role_table("Traitors", SSticker.mode.traitors)
if(ticker.mode.shadows.len)
dat += check_role_table("Shadowlings", ticker.mode.shadows)
if(SSticker.mode.shadows.len)
dat += check_role_table("Shadowlings", SSticker.mode.shadows)
if(ticker.mode.shadowling_thralls.len)
dat += check_role_table("Shadowling Thralls", ticker.mode.shadowling_thralls)
if(SSticker.mode.shadowling_thralls.len)
dat += check_role_table("Shadowling Thralls", SSticker.mode.shadowling_thralls)
if(ticker.mode.abductors.len)
dat += check_role_table("Abductors", ticker.mode.abductors)
if(SSticker.mode.abductors.len)
dat += check_role_table("Abductors", SSticker.mode.abductors)
if(ticker.mode.abductees.len)
dat += check_role_table("Abductees", ticker.mode.abductees)
if(SSticker.mode.abductees.len)
dat += check_role_table("Abductees", SSticker.mode.abductees)
if(ticker.mode.vampires.len)
dat += check_role_table("Vampires", ticker.mode.vampires)
if(SSticker.mode.vampires.len)
dat += check_role_table("Vampires", SSticker.mode.vampires)
if(ticker.mode.vampire_enthralled.len)
dat += check_role_table("Vampire Thralls", ticker.mode.vampire_enthralled)
if(SSticker.mode.vampire_enthralled.len)
dat += check_role_table("Vampire Thralls", SSticker.mode.vampire_enthralled)
if(ticker.mode.devils.len)
dat += check_role_table("Devils", ticker.mode.devils)
if(SSticker.mode.devils.len)
dat += check_role_table("Devils", SSticker.mode.devils)
if(ticker.mode.xenos.len)
dat += check_role_table("Xenos", ticker.mode.xenos)
if(SSticker.mode.xenos.len)
dat += check_role_table("Xenos", SSticker.mode.xenos)
if(ticker.mode.superheroes.len)
dat += check_role_table("Superheroes", ticker.mode.superheroes)
if(SSticker.mode.superheroes.len)
dat += check_role_table("Superheroes", SSticker.mode.superheroes)
if(ticker.mode.supervillains.len)
dat += check_role_table("Supervillains", ticker.mode.supervillains)
if(SSticker.mode.supervillains.len)
dat += check_role_table("Supervillains", SSticker.mode.supervillains)
if(ticker.mode.greyshirts.len)
dat += check_role_table("Greyshirts", ticker.mode.greyshirts)
if(SSticker.mode.greyshirts.len)
dat += check_role_table("Greyshirts", SSticker.mode.greyshirts)
if(ticker.mode.eventmiscs.len)
dat += check_role_table("Event Roles", ticker.mode.eventmiscs)
if(SSticker.mode.eventmiscs.len)
dat += check_role_table("Event Roles", SSticker.mode.eventmiscs)
if(ts_spiderlist.len)
var/list/spider_minds = list()
@@ -556,8 +556,8 @@
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)
if(SSticker.mode.ert.len)
dat += check_role_table("ERT", SSticker.mode.ert)
dat += "</body></html>"
usr << browse(dat, "window=roundstatus;size=400x500")
+34 -34
View File
@@ -6,7 +6,7 @@
message_admins("[key_name_admin(usr)] has attempted to override the admin panel!")
return
if(ticker.mode && ticker.mode.check_antagonists_topic(href, href_list))
if(SSticker.mode && SSticker.mode.check_antagonists_topic(href, href_list))
check_antagonists()
return
@@ -315,9 +315,9 @@
else if(href_list["delay_round_end"])
if(!check_rights(R_SERVER)) return
ticker.delay_end = !ticker.delay_end
log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
message_admins("<span class='notice'>[key_name_admin(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].</span>", 1)
SSticker.delay_end = !SSticker.delay_end
log_admin("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].")
message_admins("<span class='notice'>[key_name_admin(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].</span>", 1)
href_list["secretsadmin"] = "check_antagonist"
else if(href_list["simplemake"])
@@ -1085,7 +1085,7 @@
else if(href_list["c_mode"])
if(!check_rights(R_ADMIN)) return
if(ticker && ticker.mode)
if(SSticker && SSticker.mode)
return alert(usr, "The game has already started.", null, null, null, null)
var/dat = {"<B>What mode do you wish to play?</B><HR>"}
for(var/mode in config.modes)
@@ -1098,7 +1098,7 @@
else if(href_list["f_secret"])
if(!check_rights(R_ADMIN)) return
if(ticker && ticker.mode)
if(SSticker && SSticker.mode)
return alert(usr, "The game has already started.", null, null, null, null)
if(master_mode != "secret")
return alert(usr, "The game mode has to be secret!", null, null, null, null)
@@ -1112,7 +1112,7 @@
else if(href_list["c_mode2"])
if(!check_rights(R_ADMIN|R_SERVER)) return
if(ticker && ticker.mode)
if(SSticker && SSticker.mode)
return alert(usr, "The game has already started.", null, null, null, null)
master_mode = href_list["c_mode2"]
log_admin("[key_name(usr)] set the mode as [master_mode].")
@@ -1125,7 +1125,7 @@
else if(href_list["f_secret2"])
if(!check_rights(R_ADMIN|R_SERVER)) return
if(ticker && ticker.mode)
if(SSticker && SSticker.mode)
return alert(usr, "The game has already started.", null, null, null, null)
if(master_mode != "secret")
return alert(usr, "The game mode has to be secret!", null, null, null, null)
@@ -1559,25 +1559,25 @@
alert("Couldn't locate cult mode datum! This shouldn't ever happen, tell a coder!")
return
var/datum/game_mode/cult/cult_round = ticker.mode
var/datum/game_mode/cult/cult_round = SSticker.mode
cult_round.bypass_phase()
message_admins("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.")
log_admin("Admin [key_name_admin(usr)] has unlocked the Cult's next objective.")
else if(href_list["cult_mindspeak"])
var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [ticker.cultdat.entity_name]", "Voice of [ticker.cultdat.entity_name]", "")
var/input = stripped_input(usr, "Communicate to all the cultists with the voice of [SSticker.cultdat.entity_name]", "Voice of [SSticker.cultdat.entity_name]", "")
if(!input)
return
for(var/datum/mind/H in ticker.mode.cult)
for(var/datum/mind/H in SSticker.mode.cult)
if (H.current)
to_chat(H.current, "<span class='danger'>[ticker.cultdat.entity_name]</span> murmurs, <span class='cultlarge'>[input]</span></span>")
to_chat(H.current, "<span class='danger'>[SSticker.cultdat.entity_name]</span> murmurs, <span class='cultlarge'>[input]</span></span>")
for(var/mob/dead/observer/O in GLOB.player_list)
to_chat(O, "<span class='danger'>[ticker.cultdat.entity_name]</span> murmurs, <span class='cultlarge'>[input]</span></span>")
to_chat(O, "<span class='danger'>[SSticker.cultdat.entity_name]</span> murmurs, <span class='cultlarge'>[input]</span></span>")
message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [ticker.cultdat.entity_name].")
log_admin("[key_name(usr)] Voice of [ticker.cultdat.entity_name]: [input]")
message_admins("Admin [key_name_admin(usr)] has talked with the Voice of [SSticker.cultdat.entity_name].")
log_admin("[key_name(usr)] Voice of [SSticker.cultdat.entity_name]: [input]")
else if(href_list["adminplayerobservecoodjump"])
if(!check_rights(R_ADMIN)) return
@@ -1958,8 +1958,8 @@
kill_objective.target = H.mind
kill_objective.explanation_text = "Assassinate [H.real_name], the [H.mind.assigned_role]."
newtraitormind.objectives += kill_objective
ticker.mode.equip_traitor(newtraitor)
ticker.mode.traitors |= newtraitor.mind
SSticker.mode.equip_traitor(newtraitor)
SSticker.mode.traitors |= newtraitor.mind
to_chat(newtraitor, "<span class='danger'>ATTENTION:</span> It is time to pay your debt to the Syndicate...")
to_chat(newtraitor, "<B>You are now a traitor.</B>")
to_chat(newtraitor, "<B>Goal: <span class='danger'>KILL [H.real_name]</span>, currently in [get_area(H.loc)]</B>");
@@ -2341,7 +2341,7 @@
else if(href_list["traitor"])
if(!check_rights(R_ADMIN|R_MOD)) return
if(!ticker || !ticker.mode)
if(!SSticker || !SSticker.mode)
alert("The game hasn't started yet!")
return
@@ -2484,7 +2484,7 @@
else if(href_list["kick_all_from_lobby"])
if(!check_rights(R_ADMIN))
return
if(ticker && ticker.current_state == GAME_STATE_PLAYING)
if(SSticker && SSticker.current_state == GAME_STATE_PLAYING)
var/afkonly = text2num(href_list["afkonly"])
if(alert("Are you sure you want to kick all [afkonly ? "AFK" : ""] clients from the lobby?","Confirmation","Yes","Cancel") != "Yes")
return
@@ -2573,7 +2573,7 @@
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","TriAI")
if("gravity")
if(!(ticker && ticker.mode))
if(!(SSticker && SSticker.mode))
to_chat(usr, "Please wait until the game starts! Not sure how it will work otherwise.")
return
gravity_is_on = !gravity_is_on
@@ -2609,7 +2609,7 @@
message_admins("<span class='notice'>[key_name_admin(usr)] made all SMESs powered</span>", 1)
power_restore_quick()
if("prisonwarp")
if(!ticker)
if(!SSticker)
alert("The game hasn't started yet!", null, null, null, null, null)
return
feedback_inc("admin_secrets_fun_used",1)
@@ -2651,7 +2651,7 @@
H.loc = pick(prisonsecuritywarp)
prisonwarped += H
if("traitor_all")
if(!ticker)
if(!SSticker)
alert("The game hasn't started yet!")
return
var/objective = sanitize(copytext(input("Enter an objective"),1,MAX_MESSAGE_LEN))
@@ -2663,24 +2663,24 @@
if(H.stat == 2 || !H.client || !H.mind) continue
if(is_special_character(H)) continue
//traitorize(H, objective, 0)
ticker.mode.traitors += H.mind
SSticker.mode.traitors += H.mind
H.mind.special_role = SPECIAL_ROLE_TRAITOR
var/datum/objective/new_objective = new
new_objective.owner = H
new_objective.explanation_text = objective
H.mind.objectives += new_objective
ticker.mode.greet_traitor(H.mind)
SSticker.mode.greet_traitor(H.mind)
//ticker.mode.forge_traitor_objectives(H.mind)
ticker.mode.finalize_traitor(H.mind)
SSticker.mode.finalize_traitor(H.mind)
for(var/mob/living/silicon/A in GLOB.player_list)
ticker.mode.traitors += A.mind
SSticker.mode.traitors += A.mind
A.mind.special_role = SPECIAL_ROLE_TRAITOR
var/datum/objective/new_objective = new
new_objective.owner = A
new_objective.explanation_text = objective
A.mind.objectives += new_objective
ticker.mode.greet_traitor(A.mind)
ticker.mode.finalize_traitor(A.mind)
SSticker.mode.greet_traitor(A.mind)
SSticker.mode.finalize_traitor(A.mind)
message_admins("<span class='notice'>[key_name_admin(usr)] used everyone is a traitor secret. Objective is [objective]</span>", 1)
log_admin("[key_name(usr)] used everyone is a traitor secret. Objective is [objective]")
@@ -2776,7 +2776,7 @@
if(sure == "No")
return
SSweather.run_weather(/datum/weather/ash_storm)
message_admins("[key_name_admin(usr)] spawned an ash storm on the mining asteroid")
message_admins("[key_name_admin(usr)] spawned an ash storm on the mining level")
if("retardify")
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","RET")
@@ -2946,10 +2946,10 @@
if("showailaws")
output_ai_laws()
if("showgm")
if(!ticker)
if(!SSticker)
alert("The game hasn't started yet!")
else if(ticker.mode)
alert("The game mode is [ticker.mode.name]")
else if(SSticker.mode)
alert("The game mode is [SSticker.mode.name]")
else alert("For some reason there's a ticker, but not a game mode")
if("manifest")
var/dat = "<B>Showing Crew Manifest.</B><HR>"
@@ -3284,7 +3284,7 @@
return
G.report_message = description
message_admins("[key_name_admin(usr)] created \"[G.name]\" station goal.")
ticker.mode.station_goals += G
SSticker.mode.station_goals += G
modify_goals()
else if(href_list["showdetails"])
@@ -3408,7 +3408,7 @@
protect_objective.target = H.mind
protect_objective.explanation_text = "Protect [H.real_name], the [H.mind.assigned_role]."
hunter_mind.objectives += protect_objective
ticker.mode.traitors |= hunter_mob.mind
SSticker.mode.traitors |= hunter_mob.mind
to_chat(hunter_mob, "<span class='danger'>ATTENTION:</span> You are now on a mission!")
to_chat(hunter_mob, "<B>Goal: <span class='danger'>[killthem ? "MURDER" : "PROTECT"] [H.real_name]</span>, currently in [get_area(H.loc)]. </B>");
if(killthem)
+143
View File
@@ -88,7 +88,9 @@
//get message text, limit it's length.and clean/escape html
if(!msg)
set_typing(C, TRUE)
msg = input(src,"Message:", "Private message to [holder ? key_name(C, FALSE) : key_name_hidden(C, FALSE)]") as text|null
set_typing(C, FALSE)
if(!msg)
return
@@ -130,6 +132,9 @@
var/recieve_message = ""
pm_tracker.add_message(C, src, msg, mob)
C.pm_tracker.add_message(src, src, msg, C.mob)
if(holder && !C.holder)
recieve_message = "<span class='[recieve_span]' size='3'>-- Click the [recieve_pm_type]'s name to reply --</span>\n"
if(C.adminhelped)
@@ -233,3 +238,141 @@
continue
if(check_rights(R_ADMIN|R_MOD|R_MENTOR, 0, X.mob))
to_chat(X, "<B><font color='blue'>PM: [key_name(src, TRUE, 0)]-&gt;IRC-Admins:</B> <span class='notice'>[msg]</span></font>")
/client/verb/open_pms_ui()
set name = "My PMs"
set category = "OOC"
pm_tracker.show_ui(usr)
/client/proc/set_typing(client/target, value)
if(!target)
return
var/datum/pm_convo/convo = target.pm_tracker.pms[key]
if(!convo)
return
convo.typing = value
if(target.pm_tracker.open && target.pm_tracker.current_title == key)
target.pm_tracker.show_ui(target.mob)
/datum/pm_tracker
var/current_title = ""
var/open = FALSE
var/list/pms = list()
var/show_archived = FALSE
var/window_id = "pms_window"
/datum/pm_convo
var/list/messages = list()
var/archived = FALSE
var/client/client
var/read = FALSE
var/typing = FALSE
/datum/pm_convo/New(client/C)
client = C
/datum/pm_convo/proc/add(client/sender, message)
messages.Add("[sender]: [message]")
archived = FALSE
read = FALSE
/datum/pm_tracker/proc/add_message(client/title, client/sender, message, mob/user)
if(!pms[title.key])
pms[title.key] = new /datum/pm_convo(title)
pms[title.key].add(sender, message)
if(!open)
// The next time the window's opened, it'll be open to the most recent message
current_title = title.key
return
// If it's already opened, it'll refresh
show_ui(user)
/datum/pm_tracker/proc/show_ui(mob/user)
var/dat = ""
dat += "<a href='?src=[UID()];refresh=1'>Refresh</a>"
dat += "<a href='?src=[UID()];showarchived=1'>[show_archived ? "Hide" : "Show"] Archived</a>"
dat += "<br>"
for(var/title in pms)
if(pms[title].archived && !show_archived)
continue
var/label = "[title]"
var/class = ""
if(title == current_title)
label = "<b>[label]</b>"
class = "linkOn"
else if(!pms[title].read)
label = "<i>*[label]</i>"
dat += "<a class='[class]' href='?src=[UID()];newtitle=[title]'>[label]</a>"
var/datum/pm_convo/convo = pms[current_title]
if(convo)
convo.read = TRUE
dat += "<h2>[check_rights(R_ADMIN, FALSE, user) ? fancy_title(current_title) : current_title]</h2>"
dat += "<h4>"
dat += "<table style='width:950px; border: 3px solid;'>"
for(var/message in convo.messages)
dat += "<tr><td>[message]</td></tr>"
dat += "</table>"
if(convo.typing)
dat += "<i><span class='typing'>[current_title] is typing</span></i>"
dat += "<br>"
dat += "</h4>"
dat += "<a href='?src=[UID()];reply=[current_title]'>Reply</a>"
dat += "<a href='?src=[UID()];archive=[current_title]'>[convo.archived ? "Unarchive" : "Archive"]</a>"
if(check_rights(R_ADMIN, FALSE, user))
dat += "<a href='?src=[UID()];ping=[current_title]'>Ping</a>"
var/datum/browser/popup = new(user, window_id, "Messages", 1000, 600, src)
popup.set_content(dat)
popup.open()
open = TRUE
/datum/pm_tracker/proc/fancy_title(title)
var/client/C = pms[title].client
if(!C)
return "[title] (Disconnected)"
return "[key_name(C, FALSE)] ([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_SM(C.mob,"SM")]) ([admin_jump_link(C.mob)]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>)"
/datum/pm_tracker/Topic(href, href_list)
if(href_list["archive"])
pms[href_list["archive"]].archived = !pms[href_list["archive"]].archived
show_ui(usr)
return
if(href_list["refresh"])
show_ui(usr)
return
if(href_list["newtitle"])
current_title = href_list["newtitle"]
show_ui(usr)
return
if(href_list["ping"])
var/client/C = pms[href_list["ping"]].client
if(C)
C.pm_tracker.current_title = usr.key
window_flash(C)
C.pm_tracker.show_ui(C.mob)
to_chat(usr, "<span class='notice'>Forced open [C]'s messages window.</span>")
show_ui(usr)
return
if(href_list["reply"])
usr.client.cmd_admin_pm(ckey(href_list["reply"]), null)
show_ui(usr)
return
if(href_list["showarchived"])
show_archived = !show_archived
show_ui(usr)
return
if(href_list["close"])
open = FALSE
return
+2 -2
View File
@@ -3,7 +3,7 @@
set category = "Debug"
set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted.
set hidden = 1
if(!ticker)
if(!SSticker)
return
switch(cinematic)
if("explosion")
@@ -14,4 +14,4 @@
override = input(src, "mode = ?","Enter Parameter", null) as anything in list("nuclear emergency", "fake", "no override")
if(0)
override = input(src, "mode = ?","Enter Parameter", null) as anything in list("blob", "nuclear emergency", "AI malfunction", "no override")
ticker.station_explosion_cinematic(parameter, override)
SSticker.station_explosion_cinematic(parameter, override)
+10 -10
View File
@@ -215,7 +215,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_SPAWN))
return
if(!ticker)
if(!SSticker)
alert("Wait until the game starts")
return
if(istype(M, /mob/living/carbon/human))
@@ -233,7 +233,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_SPAWN))
return
if(!ticker)
if(!SSticker)
alert("Wait until the game starts")
return
@@ -293,7 +293,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_SPAWN))
return
if(!ticker)
if(!SSticker)
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -313,7 +313,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_SPAWN))
return
if(!ticker)
if(!SSticker)
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -333,7 +333,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_SPAWN))
return
if(!ticker)
if(!SSticker)
alert("Wait until the game starts")
return
if(ishuman(M))
@@ -405,7 +405,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_EVENT))
return
if(!ticker)
if(!SSticker)
alert("Wait until the game starts")
return
if(istype(M, /mob/living/carbon/human))
@@ -818,7 +818,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_SPAWN))
return
if(!ticker)
if(!SSticker)
alert("Wait until the game starts")
return
if(istype(M, /mob/living/carbon))
@@ -905,8 +905,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!check_rights(R_DEBUG))
return
global.medals_enabled = !global.medals_enabled
SSmedals.hub_enabled = !SSmedals.hub_enabled
message_admins("<span class='adminnotice'>[key_name_admin(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.</span>")
message_admins("<span class='adminnotice'>[key_name_admin(src)] [SSmedals.hub_enabled ? "disabled" : "enabled"] the medal hub lockout.</span>")
feedback_add_details("admin_verb","TMH") // If...
log_admin("[key_name(src)] [global.medals_enabled ? "disabled" : "enabled"] the medal hub lockout.")
log_admin("[key_name(src)] [SSmedals.hub_enabled ? "disabled" : "enabled"] the medal hub lockout.")
+2 -2
View File
@@ -7,7 +7,7 @@
set desc = "Spawns a group of players in the specified outfit."
if(!check_rights(R_EVENT))
return
if(!ticker)
if(!SSticker)
alert("The game hasn't started yet!")
return
if(alert("Do you want to spawn a Gimmick Team at YOUR CURRENT LOCATION?",,"Yes","No")=="No")
@@ -82,7 +82,7 @@
H.mind.store_memory("<B>[themission]</B><BR><BR>")
if(is_syndicate)
ticker.mode.traitors |= H.mind //Adds them to extra antag list
SSticker.mode.traitors |= H.mind //Adds them to extra antag list
players_spawned++
if(players_spawned >= teamsize)
+2 -2
View File
@@ -4,7 +4,7 @@ var/const/honksquad_possible = 6 //if more Commandos are needed in the future
var/global/sent_honksquad = 0
/client/proc/honksquad()
if(!ticker)
if(!SSticker)
to_chat(usr, "<font color='red'>The game hasn't started yet!</font>")
return
if(world.time < 6000)
@@ -95,7 +95,7 @@ var/global/sent_honksquad = 0
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.
SSticker.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)
return new_honksquad
@@ -10,7 +10,7 @@ var/global/sent_syndicate_infiltration_team = 0
if(!check_rights(R_ADMIN))
to_chat(src, "Only administrators may use this command.")
return
if(!ticker)
if(!SSticker)
alert("The game hasn't started yet!")
return
if(alert("Do you want to send in the Syndicate Infiltration Team?",,"Yes","No")=="No")
@@ -132,7 +132,7 @@ var/global/sent_syndicate_infiltration_team = 0
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
SSticker.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
+12 -7
View File
@@ -29,7 +29,7 @@ client/proc/one_click_antag()
// You pass in ROLE define (optional), the applicant, and the gamemode, and it will return true / false depending on whether the applicant qualify for the candidacy in question
if(jobban_isbanned(M, "Syndicate"))
return FALSE
if(M.stat || !M.mind || M.mind.special_role)
if(M.stat || !M.mind || M.mind.special_role || M.mind.offstation_role)
return FALSE
if(temp)
if((M.mind.assigned_role in temp.restricted_jobs) || (M.client.prefs.species in temp.protected_species))
@@ -175,8 +175,13 @@ client/proc/one_click_antag()
for(var/i = 0, i<numCultists, i++)
H = pick(candidates)
ticker.mode.add_cultist(H.mind)
SSticker.mode.add_cultist(H.mind)
candidates.Remove(H)
if(!summon_spots.len)
while(summon_spots.len < SUMMON_POSSIBILITIES)
var/area/summon = pick(return_sorted_areas() - summon_spots)
if(summon && is_station_level(summon.z) && summon.valid_territory)
summon_spots += summon
return 1
return 0
@@ -247,17 +252,17 @@ client/proc/one_click_antag()
if(closet_spawn)
new /obj/structure/closet/syndicate/nuclear(closet_spawn.loc)
for(var/datum/mind/synd_mind in ticker.mode.syndicates)
for(var/datum/mind/synd_mind in SSticker.mode.syndicates)
if(synd_mind.current)
if(synd_mind.current.client)
for(var/image/I in synd_mind.current.client.images)
if(I.icon_state == "synd")
qdel(I)
for(var/datum/mind/synd_mind in ticker.mode.syndicates)
for(var/datum/mind/synd_mind in SSticker.mode.syndicates)
if(synd_mind.current)
if(synd_mind.current.client)
for(var/datum/mind/synd_mind_1 in ticker.mode.syndicates)
for(var/datum/mind/synd_mind_1 in SSticker.mode.syndicates)
if(synd_mind_1.current)
var/I = image('icons/mob/mob.dmi', loc = synd_mind_1.current, icon_state = "synd")
synd_mind.current.client.images += I
@@ -406,7 +411,7 @@ client/proc/one_click_antag()
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
SSticker.mode.traitors += new_syndicate_commando.mind
new_syndicate_commando.equip_syndicate_commando(syndicate_leader_selected)
return new_syndicate_commando
@@ -466,7 +471,7 @@ client/proc/one_click_antag()
break
new_vox.key = theghost.key
ticker.mode.traitors += new_vox.mind
SSticker.mode.traitors += new_vox.mind
to_chat(new_vox, "<span class='notice'>You are a Vox Primalis, fresh out of the Shoal. Your ship has arrived at the Tau Ceti system hosting the NSV Exodus... or was it the Luna? NSS? Utopia? Nobody is really sure, but everyong is raring to start pillaging! Your current goal is: <span class='danger'> [input]</span></span>")
to_chat(new_vox, "<span class='warning'>Don't forget to turn on your nitrogen internals!</span>")
+4 -4
View File
@@ -1,5 +1,5 @@
/client/proc/only_one()
if(!ticker)
if(!SSticker)
alert("The game hasn't started yet!")
return
@@ -14,7 +14,7 @@
var/datum/preferences/A = new() // Randomize appearance
A.copy_to(H)
ticker.mode.traitors += H.mind
SSticker.mode.traitors += H.mind
H.mind.special_role = SPECIAL_ROLE_TRAITOR
var/datum/objective/hijack/hijack_objective = new
@@ -58,7 +58,7 @@
world << sound('sound/music/thunderdome.ogg')
/client/proc/only_me()
if(!ticker)
if(!SSticker)
alert("The game hasn't started yet!")
return
@@ -66,7 +66,7 @@
if(H.stat == 2 || !(H.client)) continue
if(is_special_character(H)) continue
ticker.mode.traitors += H.mind
SSticker.mode.traitors += H.mind
H.mind.special_role = "[H.real_name] Prime"
var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone
+1 -1
View File
@@ -1,5 +1,5 @@
/client/proc/only_one_team()
if(!ticker)
if(!SSticker)
alert("The game hasn't started yet!")
return
+3 -3
View File
@@ -18,8 +18,8 @@
var/prayer_type = "PRAYER"
var/deity
if(usr.job == "Chaplain")
if(ticker && ticker.Bible_deity_name)
deity = ticker.Bible_deity_name
if(SSticker && SSticker.Bible_deity_name)
deity = SSticker.Bible_deity_name
cross = image('icons/obj/storage.dmi',"kingyellow")
font_color = "blue"
prayer_type = "CHAPLAIN PRAYER"
@@ -27,7 +27,7 @@
cross = image('icons/obj/storage.dmi',"tome")
font_color = "red"
prayer_type = "CULTIST PRAYER"
deity = ticker.cultdat.entity_name
deity = SSticker.cultdat.entity_name
log_say("(PRAYER) [msg]", usr)
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>"
+17 -17
View File
@@ -437,11 +437,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
if("traitor")
SSjobs.AssignRank(new_character, new_character.mind.assigned_role, 0)
SSjobs.EquipRank(new_character, new_character.mind.assigned_role, 1)
ticker.mode.equip_traitor(new_character)
SSticker.mode.equip_traitor(new_character)
if("Wizard")
new_character.loc = pick(wizardstart)
//ticker.mode.learn_basic_spells(new_character)
ticker.mode.equip_wizard(new_character)
SSticker.mode.equip_wizard(new_character)
if("Syndicate")
var/obj/effect/landmark/synd_spawn = locate("landmark*Syndicate-Spawn")
if(synd_spawn)
@@ -651,7 +651,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
if(isturf(D))
var/turf/T = D
T.ChangeTurf(/turf/space)
T.ChangeTurf(T.baseturf)
else
qdel(D)
@@ -858,7 +858,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Admin"
set name = "Toggle Deny Shuttle"
if(!ticker)
if(!SSticker)
return
if(!check_rights(R_ADMIN))
@@ -891,12 +891,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!check_rights(R_SERVER|R_EVENT))
return
if(ticker && ticker.mode)
if(SSticker && SSticker.mode)
to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!")
return
if(ticker.random_players)
ticker.random_players = 0
if(SSticker.random_players)
SSticker.random_players = 0
message_admins("Admin [key_name_admin(usr)] has disabled \"Everyone is Special\" mode.", 1)
to_chat(usr, "Disabled.")
return
@@ -914,7 +914,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
to_chat(usr, "<i>Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet</i>.")
ticker.random_players = 1
SSticker.random_players = 1
feedback_add_details("admin_verb","MER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_random_events()
@@ -1009,13 +1009,13 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!check_rights(R_EVENT))
return
if(ticker.mode.ert_disabled)
ticker.mode.ert_disabled = 0
if(SSticker.mode.ert_disabled)
SSticker.mode.ert_disabled = 0
to_chat(usr, "<span class='notice'>ERT has been <b>Enabled</b>.</span>")
log_admin("Admin [key_name(src)] has enabled ERT calling.")
message_admins("Admin [key_name_admin(usr)] has enabled ERT calling.", 1)
else
ticker.mode.ert_disabled = 1
SSticker.mode.ert_disabled = 1
to_chat(usr, "<span class='warning'>ERT has been <b>Disabled</b>.</span>")
log_admin("Admin [key_name(src)] has disabled ERT calling.")
message_admins("Admin [key_name_admin(usr)] has disabled ERT calling.", 1)
@@ -1033,14 +1033,14 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!input)
return
if(!ticker)
if(!SSticker)
return
ticker.selected_tip = input
SSticker.selected_tip = input
// If we've already tipped, then send it straight away.
if(ticker.tipped)
ticker.send_tip_of_the_round()
if(SSticker.tipped)
SSticker.send_tip_of_the_round()
message_admins("[key_name_admin(usr)] sent a Tip of the round.")
log_admin("[key_name(usr)] sent \"[input]\" as the Tip of the Round.")
@@ -1055,12 +1055,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
holder.modify_goals()
/datum/admins/proc/modify_goals()
if(!ticker || !ticker.mode)
if(!SSticker || !SSticker.mode)
to_chat(usr, "<span class='warning'>This verb can only be used if the round has started.</span>")
return
var/dat = ""
for(var/datum/station_goal/S in ticker.mode.station_goals)
for(var/datum/station_goal/S in SSticker.mode.station_goals)
dat += "[S.name] - <a href='?src=[S.UID()];announce=1'>Announce</a> | <a href='?src=[S.UID()];remove=1'>Remove</a><br>"
dat += "<br><a href='?src=[UID()];add_station_goal=1'>Add New Goal</a>"
usr << browse(dat, "window=goals;size=400x400")
+5 -5
View File
@@ -4,7 +4,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future
var/global/sent_strike_team = 0
/client/proc/strike_team()
if(!ticker)
if(!SSticker)
to_chat(usr, "<span class='userdanger'>The game hasn't started yet!</span>")
return
if(sent_strike_team == 1)
@@ -86,9 +86,9 @@ var/global/sent_strike_team = 0
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
if(!(R.mind in SSticker.minds))
SSticker.minds += R.mind
SSticker.mode.traitors += R.mind
R.key = ghost_mob.key
if(nuke_code)
R.mind.store_memory("<B>Nuke Code:</B> <span class='warning'>[nuke_code].</span>")
@@ -150,7 +150,7 @@ var/global/sent_strike_team = 0
new_commando.mind_initialize()
new_commando.mind.assigned_role = SPECIAL_ROLE_DEATHSQUAD
new_commando.mind.special_role = SPECIAL_ROLE_DEATHSQUAD
ticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
SSticker.mode.traitors |= new_commando.mind//Adds them to current traitor list. Which is really the extra antagonist list.
new_commando.equip_death_commando(is_leader)
return new_commando
@@ -9,7 +9,7 @@ var/global/sent_syndicate_strike_team = 0
if(!src.holder)
to_chat(src, "Only administrators may use this command.")
return
if(!ticker)
if(!SSticker)
alert("The game hasn't started yet!")
return
if(sent_syndicate_strike_team == 1)
@@ -117,7 +117,7 @@ var/global/sent_syndicate_strike_team = 0
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.
SSticker.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
+5 -5
View File
@@ -2,21 +2,21 @@
set category = "Event"
set name = "Create AI Triumvirate"
if(ticker.current_state > GAME_STATE_PREGAME)
if(SSticker.current_state > GAME_STATE_PREGAME)
to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.")
return
if(SSjobs && ticker)
if(SSjobs && SSticker)
var/datum/job/job = SSjobs.GetJob("AI")
if(!job)
to_chat(usr, "Unable to locate the AI job")
return
if(ticker.triai)
ticker.triai = 0
if(SSticker.triai)
SSticker.triai = 0
to_chat(usr, "Only one AI will be spawned at round start.")
message_admins("<span class='notice'>[key_name_admin(usr)] has toggled off triple AIs at round start.</span>", 1)
else
ticker.triai = 1
SSticker.triai = 1
to_chat(usr, "There will be an AI Triumvirate at round start.")
message_admins("<span class='notice'>[key_name_admin(usr)] has toggled on triple AIs at round start.</span>", 1)
return
@@ -18,6 +18,7 @@
icon_state = "locator"
var/borg_to_spawn
var/checking = FALSE
var/rolename = "Syndicate Operative"
/obj/item/antag_spawner/nuke_ops/proc/before_candidate_search(user)
return TRUE
@@ -26,12 +27,12 @@
if(used)
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
return FALSE
if(!(user.mind in ticker.mode.syndicates))
if(!(user.mind in SSticker.mode.syndicates))
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
return FALSE
if(checking)
to_chat(user, "<span class='danger'>The device is already connecting to Syndicate command. Please wait.</span>")
return FALSE
return FALSE
return TRUE
/obj/item/antag_spawner/nuke_ops/attack_self(mob/user)
@@ -45,7 +46,7 @@
checking = TRUE
to_chat(user, "<span class='notice'>You activate [src] and wait for confirmation.</span>")
var/list/nuke_candidates = pollCandidates("Do you want to play as a syndicate [borg_to_spawn ? "[lowertext(borg_to_spawn)] cyborg" : "operative"]?", ROLE_OPERATIVE, TRUE, 150)
var/list/nuke_candidates = pollCandidates("Do you want to play as a [rolename]?", ROLE_OPERATIVE, TRUE, 150)
if(LAZYLEN(nuke_candidates))
checking = FALSE
if(QDELETED(src) || !check_usability(user))
@@ -62,27 +63,27 @@
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
var/agent_number = LAZYLEN(ticker.mode.syndicates) - 1
var/agent_number = LAZYLEN(SSticker.mode.syndicates) - 1
M.real_name = "[syndicate_name()] Operative #[agent_number]"
set_syndicate_values(C, M)
ticker.mode.create_syndicate(M.mind)
ticker.mode.equip_syndicate(M, 0)
ticker.mode.update_syndicate_id(M.mind, FALSE)
SSticker.mode.create_syndicate(M.mind)
SSticker.mode.equip_syndicate(M, 0)
SSticker.mode.update_syndicate_id(M.mind, FALSE)
/obj/item/antag_spawner/nuke_ops/proc/set_syndicate_values(client/C, mob/living/M)
M.key = C.key
ticker.mode.syndicates += M.mind
ticker.mode.update_synd_icons_added(M.mind)
SSticker.mode.syndicates += M.mind
SSticker.mode.update_synd_icons_added(M.mind)
M.mind.assigned_role = SPECIAL_ROLE_NUKEOPS
M.mind.special_role = SPECIAL_ROLE_NUKEOPS
M.mind.offstation_role = TRUE
M.faction = list("syndicate")
ticker.mode.forge_syndicate_objectives(M.mind)
ticker.mode.greet_syndicate(M.mind)
SSticker.mode.forge_syndicate_objectives(M.mind)
SSticker.mode.greet_syndicate(M.mind)
//////SYNDICATE BORG
/obj/item/antag_spawner/nuke_ops/borg_tele
@@ -109,13 +110,15 @@
if(switch_roles_choice == "Syndicate Cyborg")
switch_roles = TRUE
rolename = initial(rolename)
else
switch_roles = FALSE
rolename = "Syndicate [borg_to_spawn] Cyborg"
return TRUE
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, datum/mind/user)
if(!(user in ticker.mode.syndicates))
if(!(user in SSticker.mode.syndicates))
used = FALSE
return
@@ -147,7 +150,7 @@
set_syndicate_values(user.current.client, R)
L.key = C.key
ticker.mode.greet_syndicate(L.mind)
SSticker.mode.greet_syndicate(L.mind)
///////////SLAUGHTER DEMON
@@ -164,7 +167,7 @@
var/mob/living/demon_type = /mob/living/simple_animal/slaughter
/obj/item/antag_spawner/slaughter_demon/attack_self(mob/user)
if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a demon from the Den..
if(level_blocks_magic(user.z)) //this is to make sure the wizard does NOT summon a demon from the Den..
to_chat(user, "<span class='notice'>You should probably wait until you reach the station.</span>")
return
@@ -174,7 +177,10 @@
used = TRUE
to_chat(user, "<span class='notice'>You break the seal on the bottle, calling upon the dire spirits of the underworld...</span>")
var/list/candidates = pollCandidates("Do you want to play as a slaughter demon summoned by [user.real_name]?", ROLE_DEMON, 1, 100)
var/type = "slaughter"
if(demon_type == /mob/living/simple_animal/slaughter/laughter)
type = "laughter"
var/list/candidates = pollCandidates("Do you want to play as a [type] demon summoned by [user.real_name]?", ROLE_DEMON, 1, 100)
if(candidates.len > 0)
var/mob/C = pick(candidates)
@@ -195,7 +201,7 @@
S.key = C.key
S.mind.assigned_role = S.name
S.mind.special_role = S.name
ticker.mode.traitors += S.mind
SSticker.mode.traitors += S.mind
var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate
KillDaWiz.owner = S.mind
KillDaWiz.target = user.mind
@@ -205,7 +211,6 @@
KillDaCrew.owner = S.mind
KillDaCrew.explanation_text = "[objective_verb] everyone else while you're at it."
S.mind.objectives += KillDaCrew
S.mind.objectives += KillDaCrew
to_chat(S, "<B>Objective #[1]</B>: [KillDaWiz.explanation_text]")
to_chat(S, "<B>Objective #[2]</B>: [KillDaCrew.explanation_text]")
@@ -217,7 +222,7 @@
color = "#FF69B4" // HOT PINK
veil_msg = "<span class='warning'>You sense an adorable presence \
lurking just beyond the veil...</span>"
objective_verb = "Hug and Tickle"
objective_verb = "Hug and tickle"
demon_type = /mob/living/simple_animal/slaughter/laughter
///////////MORPH
@@ -245,7 +250,7 @@
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)
var/list/candidates = pollCandidates("Do you want to play as a magical morph awakened by [user.real_name]?", ROLE_MORPH, 1, 100)
if(candidates.len > 0)
var/mob/C = pick(candidates)
@@ -259,12 +264,12 @@
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))
var/mob/living/simple_animal/hostile/morph/wizard/M = new /mob/living/simple_animal/hostile/morph/wizard(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
SSticker.mode.traitors += M.mind
var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate
KillDaWiz.owner = M.mind
KillDaWiz.target = user.mind
+12 -4
View File
@@ -28,13 +28,13 @@
var/datum/disease/disease = null //Do they start with a pre-spawned disease?
var/mob_color //Change the mob's color
var/assignedrole
var/banType = "lavaland"
var/banType = ROLE_GHOST
var/ghost_usable = TRUE
var/offstation_role = TRUE // If set to true, the role of the user's mind will be set to offstation
/obj/effect/mob_spawn/attack_ghost(mob/user)
var/mob/dead/observer/O = user
if(ticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable)
if(SSticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable)
return
if(!uses)
to_chat(user, "<span class='warning'>This spawner is out of charges!</span>")
@@ -111,6 +111,7 @@
MM.objectives += new/datum/objective(objective)
if(assignedrole)
M.mind.assigned_role = assignedrole
M.mind.offstation_role = offstation_role
special(M, name)
MM.name = M.real_name
if(uses > 0)
@@ -204,7 +205,7 @@
var/T = vars[slot]
if(!isnum(T))
outfit.vars[slot] = T
H.equipOutfit(outfit, TRUE)
H.equipOutfit(outfit)
var/list/del_types = list(/obj/item/pda, /obj/item/radio/headset)
for(var/del_type in del_types)
var/obj/item/I = locate(del_type) in H
@@ -449,6 +450,13 @@
flavour_text = "<span class='big bold'>You are a space bartender!</span><b> Time to mix drinks and change lives.</b>"
assignedrole = "Space Bartender"
/obj/effect/mob_spawn/human/beach/alive/lifeguard
flavour_text = "<span class='big bold'>You're a spunky lifeguard!</span><b> It's up to you to make sure nobody drowns or gets eaten by sharks and stuff.</b>"
mob_gender = "female"
name = "lifeguard sleeper"
id_job = "Lifeguard"
uniform = /obj/item/clothing/under/shorts/red
/datum/outfit/spacebartender
name = "Space Bartender"
uniform = /obj/item/clothing/under/rank/bartender
@@ -176,7 +176,7 @@ var/global/dmm_suite/preloader/_preloader = new
for(var/t in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])))
var/turf/T = t
//we do this after we load everything in. if we don't; we'll have weird atmos bugs regarding atmos adjacent turfs
T.AfterChange(1,keep_cabling = TRUE)
T.AfterChange(1, keep_cabling = TRUE)
return bounds
/**
@@ -321,7 +321,7 @@ var/global/dmm_suite/preloader/_preloader = new
var/turf/T = locate(x,y,z)
if(T)
if(ispath(path, /turf))
T.ChangeTurf(path, 1, 0)
T.ChangeTurf(path, defer_change = TRUE, keep_icon = FALSE)
instance = T
else if(ispath(path, /area))
@@ -3,7 +3,7 @@
/area/awaymission/academy
name = "\improper Academy Asteroids"
icon_state = "away"
report_alerts = 0
report_alerts = FALSE
/area/awaymission/academy/headmaster
name = "\improper Academy Fore Block"
@@ -3,7 +3,7 @@
/area/awaymission/centcomAway
name = "XCC-P5831"
icon_state = "away"
report_alerts = 0
report_alerts = FALSE
/area/awaymission/centcomAway/general
name = "XCC-P5831"
@@ -161,7 +161,7 @@ var/sc_safecode5 = "[rand(0,9)]"
desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible."
move_self = 0 //Contianed narsie does not move!
grav_pull = 0 //Contained narsie does not pull stuff in!
var/uneatable = list(/turf/space, /obj/effect/overlay, /atom/movable/lighting_object, /mob/living/simple_animal/hostile/construct)
var/uneatable = list(/turf/space, /obj/effect/overlay, /mob/living/simple_animal/hostile/construct)
//Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment
/obj/singularity/narsie/sc_Narsie/admin_investigate_setup()
@@ -173,14 +173,16 @@ var/sc_safecode5 = "[rand(0,9)]"
mezzer()
/obj/singularity/narsie/sc_Narsie/consume(var/atom/A)
if(!A.simulated)
return FALSE
if(is_type_in_list(A, uneatable))
return 0
return FALSE
if(istype(A,/mob/living))
var/mob/living/L = A
L.gib()
else if(istype(A,/obj/))
var/obj/O = A
O.ex_act(1.0)
O.ex_act(1)
if(O) qdel(O)
else if(isturf(A))
var/turf/T = A
@@ -190,7 +192,7 @@ var/sc_safecode5 = "[rand(0,9)]"
continue
if(O.invisibility == 101)
src.consume(O)
T.ChangeTurf(/turf/space)
T.ChangeTurf(T.baseturf)
return
/obj/singularity/narsie/sc_Narsie/ex_act()
+113 -73
View File
@@ -22,9 +22,6 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
var/atom/A = R
if(A.smooth)
queue_smooth(A)
if(istype(T, /turf/simulated/mineral)) // For the listening post, among other maps
var/turf/simulated/mineral/MT = T
MT.add_edges()
log_debug("\tTook [stop_watch(subtimer)]s")
log_debug("Late setup finished - took [stop_watch(total_timer)]s")
@@ -39,7 +36,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
var/turf/T = thing
for(var/otherthing in T)
qdel(otherthing)
T.ChangeTurf(/turf/space)
T.ChangeTurf(T.baseturf)
/proc/createRandomZlevel()
if(awaydestinations.len) //crude, but it saves another var!
@@ -137,80 +134,123 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away
return potentialMaps
/proc/seedRuins(z_level = 1, budget = 0, whitelist = /area/space, list/potentialRuins = space_ruins_templates)
var/overall_sanity = 100
var/ruins = potentialRuins.Copy()
var/initialbudget = budget
var/watch = start_watch()
/datum/map_template/ruin/proc/try_to_place(z,allowed_areas)
var/sanity = PLACEMENT_TRIES
while(sanity > 0)
sanity--
var/width_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(width / 2)
var/height_border = TRANSITIONEDGE + SPACERUIN_MAP_EDGE_PAD + round(height / 2)
var/turf/central_turf = locate(rand(width_border, world.maxx - width_border), rand(height_border, world.maxy - height_border), z)
var/valid = TRUE
while(budget > 0 && overall_sanity > 0)
// Pick a ruin
var/datum/map_template/ruin/ruin = ruins[pick(ruins)]
// Can we afford it
if(ruin.cost > budget)
overall_sanity--
for(var/turf/check in get_affected_turfs(central_turf,1))
var/area/new_area = get_area(check)
if(!(istype(new_area, allowed_areas)) || check.flags & NO_RUINS)
valid = FALSE
break
if(!valid)
continue
// If so, try to place it
var/sanity = 100
// And if we can't fit it anywhere, give up, try again
while(sanity > 0)
sanity--
// 8: 7 is the normal view distance of a client, +1 so that ruins don't suddenly appear
var/turf/T = locate(rand(TRANSITION_BORDER_WEST + (8 + ruin.width/2), TRANSITION_BORDER_EAST - (8 + ruin.width/2)), rand(TRANSITION_BORDER_SOUTH + (8 + ruin.height/2), TRANSITION_BORDER_NORTH - (8 + ruin.height/2)), z_level)
var/valid = 1
log_world("Ruin \"[name]\" placed at ([central_turf.x], [central_turf.y], [central_turf.z])")
for(var/turf/check in ruin.get_affected_turfs(T,1))
var/area/new_area = get_area(check)
if(!(istype(new_area, whitelist)))
valid = 0
break
for(var/i in get_affected_turfs(central_turf, 1))
var/turf/T = i
for(var/mob/living/simple_animal/monster in T)
qdel(monster)
for(var/obj/structure/flora/ash/plant in T)
qdel(plant)
load(central_turf,centered = TRUE)
loaded++
if(!valid)
for(var/turf/T in get_affected_turfs(central_turf, 1))
T.flags |= NO_RUINS
new /obj/effect/landmark/ruin(central_turf, src)
return TRUE
return FALSE
/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins)
if(!z_levels || !z_levels.len)
WARNING("No Z levels provided - Not generating ruins")
return
for(var/zl in z_levels)
var/turf/T = locate(1, 1, zl)
if(!T)
WARNING("Z level [zl] does not exist - Not generating ruins")
return
var/list/ruins = potentialRuins.Copy()
var/list/forced_ruins = list() //These go first on the z level associated (same random one by default)
var/list/ruins_availible = list() //we can try these in the current pass
var/forced_z //If set we won't pick z level and use this one instead.
//Set up the starting ruin list
for(var/key in ruins)
var/datum/map_template/ruin/R = ruins[key]
if(R.cost > budget) //Why would you do that
continue
if(R.always_place)
forced_ruins[R] = -1
if(R.unpickable)
continue
ruins_availible[R] = R.placement_weight
while(budget > 0 && (ruins_availible.len || forced_ruins.len))
var/datum/map_template/ruin/current_pick
var/forced = FALSE
if(forced_ruins.len) //We have something we need to load right now, so just pick it
for(var/ruin in forced_ruins)
current_pick = ruin
if(forced_ruins[ruin] > 0) //Load into designated z
forced_z = forced_ruins[ruin]
forced = TRUE
break
else //Otherwise just pick random one
current_pick = pickweight(ruins_availible)
var/placement_tries = PLACEMENT_TRIES
var/failed_to_place = TRUE
var/z_placed = 0
while(placement_tries > 0)
placement_tries--
z_placed = pick(z_levels)
if(!current_pick.try_to_place(forced_z ? forced_z : z_placed,whitelist))
continue
else
failed_to_place = FALSE
break
log_world(" Ruin \"[ruin.name]\" loaded in [stop_watch(watch)]s at ([T.x], [T.y], [T.z]).")
//That's done remove from priority even if it failed
if(forced)
//TODO : handle forced ruins with multiple variants
forced_ruins -= current_pick
forced = FALSE
if(failed_to_place)
for(var/datum/map_template/ruin/R in ruins_availible)
if(R.id == current_pick.id)
ruins_availible -= R
log_world("Failed to place [current_pick.name] ruin.")
else
budget -= current_pick.cost
if(!current_pick.allow_duplicates)
for(var/datum/map_template/ruin/R in ruins_availible)
if(R.id == current_pick.id)
ruins_availible -= R
if(current_pick.never_spawn_with)
for(var/blacklisted_type in current_pick.never_spawn_with)
for(var/possible_exclusion in ruins_availible)
if(istype(possible_exclusion,blacklisted_type))
ruins_availible -= possible_exclusion
forced_z = 0
var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T)
R.Load(ruins,ruin)
budget -= ruin.cost
if(!ruin.allow_duplicates)
ruins -= ruin.name
break
if(initialbudget == budget) //Kill me
log_world(" No ruins loaded.")
/obj/effect/ruin_loader
name = "random ruin"
desc = "If you got lucky enough to see this..."
icon = 'icons/obj/items.dmi'
icon_state = "syndballoon"
invisibility = 0
/obj/effect/ruin_loader/proc/Load(list/potentialRuins = space_ruins_templates, datum/map_template/template = null)
var/list/possible_ruins = list()
for(var/A in potentialRuins)
var/datum/map_template/T = potentialRuins[A]
if(!T.loaded)
possible_ruins += T
if(!template && possible_ruins.len)
template = safepick(possible_ruins)
if(!template)
return 0
var/turf/central_turf = get_turf(src)
for(var/i in template.get_affected_turfs(central_turf, 1))
var/turf/T = i
for(var/mob/living/simple_animal/monster in T)
qdel(monster)
for(var/obj/structure/flora/ash/plant in T)
qdel(plant)
template.load(get_turf(src),centered = 1)
template.loaded++
var/datum/map_template/ruin = template
if(istype(ruin))
new /obj/effect/landmark/ruin(central_turf, ruin)
qdel(src)
return 1
//Update the availible list
for(var/datum/map_template/ruin/R in ruins_availible)
if(R.cost > budget)
ruins_availible -= R
log_world("Ruin loader finished with [budget] left to spend.")
+1 -1
View File
@@ -35,7 +35,7 @@
T.ChangeTurf(/turf/simulated/floor/plasteel)
else if(istype(object,/turf/simulated/floor))
var/turf/T = object
T.ChangeTurf(/turf/space)
T.ChangeTurf(T.baseturf)
else if(istype(object,/turf/simulated/wall/r_wall))
var/turf/T = object
T.ChangeTurf(/turf/simulated/wall)
+3
View File
@@ -7,6 +7,7 @@
var/last_message = "" //contains the last message sent by this client - used to protect against copy-paste spamming.
var/last_message_count = 0 //contains a number of how many times a message identical to last_message was sent.
var/last_message_time = 0 //holds the last time (based on world.time) a message was sent
var/datum/pm_tracker/pm_tracker = new()
/////////
//OTHER//
@@ -71,6 +72,8 @@
control_freak = CONTROL_FREAK_ALL | CONTROL_FREAK_SKIN | CONTROL_FREAK_MACROS
var/ip_intel = "Disabled"
var/datum/click_intercept/click_intercept = null
//datum that controls the displaying and hiding of tooltips
+97 -7
View File
@@ -74,7 +74,7 @@
//Admin PM
if(href_list["priv_msg"])
var/client/C = locate(href_list["priv_msg"])
if(!C) // Might be a stealthmin ID, so pass it in straight
C = href_list["priv_msg"]
else if(C.UID() != href_list["priv_msg"])
@@ -229,7 +229,8 @@
if(href_list["ssdwarning"])
ssd_warning_acknowledged = TRUE
to_chat(src, "<span class='notice'>SSD warning acknowledged.</span>")
if(href_list["link_forum_account"])
link_forum_account()
switch(href_list["action"])
if("openLink")
src << link(href_list["link"])
@@ -320,8 +321,7 @@
//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)
if(is_connecting_from_localhost())
new /datum/admins("!LOCALHOST!", R_HOST, ckey) // Makes localhost rank
holder = admin_datums[ckey]
if(holder)
@@ -370,8 +370,9 @@
to_chat(src, message)
clientmessages.Remove(ckey)
donator_check()
donator_check()
check_ip_intel()
send_resources()
if(prefs.toggles & UI_DARKMODE) // activates dark mode if its flagged. -AA07
@@ -393,6 +394,8 @@
generate_clickcatcher()
apply_clickcatcher()
check_forum_link()
if(custom_event_msg && custom_event_msg != "")
to_chat(src, "<h1 class='alert'>Custom Event</h1>")
to_chat(src, "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>")
@@ -409,6 +412,12 @@
Master.UpdateTickRate()
/client/proc/is_connecting_from_localhost()
var/localhost_addresses = list("127.0.0.1", "::1") // Adresses
if(!isnull(address) && address in localhost_addresses)
return TRUE
return FALSE
//////////////
//DISCONNECT//
//////////////
@@ -432,6 +441,7 @@
if(check_rights(R_ADMIN, 0, mob)) // Yes, the mob is required, regardless of other examples in this file, it won't work otherwise
donator_level = DONATOR_LEVEL_MAX
donor_loadout_points()
return
//Donator stuff.
@@ -443,8 +453,13 @@
donator_level = 0
return
donator_level = text2num(query_donor_select.item[2])
donor_loadout_points()
break
/client/proc/donor_loadout_points()
if(donator_level > 0 && prefs)
prefs.max_gear_slots = config.max_loadout_points + 5
/client/proc/log_client_to_db(connectiontopic)
if(IsGuestKey(key))
return
@@ -533,6 +548,81 @@
var/DBQuery/query_accesslog = dbcon.NewQuery("INSERT INTO `[format_table_name("connection_log")]`(`id`,`datetime`,`serverip`,`ckey`,`ip`,`computerid`) VALUES(null,Now(),'[serverip]','[ckey]','[sql_ip]','[sql_computerid]');")
query_accesslog.Execute()
/client/proc/check_ip_intel()
set waitfor = 0 //we sleep when getting the intel, no need to hold up the client connection while we sleep
if(config.ipintel_email)
if(config.ipintel_maxplaytime && config.use_exp_tracking)
var/living_hours = get_exp_type_num(EXP_TYPE_LIVING) / 60
if(living_hours >= config.ipintel_maxplaytime)
return
if(is_connecting_from_localhost())
log_debug("check_ip_intel: skip check for player [key_name_admin(src)] connecting from localhost.")
return
if(vpn_whitelist_check(ckey))
log_debug("check_ip_intel: skip check for player [key_name_admin(src)] [address] on whitelist.")
return
var/datum/ipintel/res = get_ip_intel(address)
ip_intel = res.intel
verify_ip_intel()
/client/proc/verify_ip_intel()
if(ip_intel >= config.ipintel_rating_bad)
var/detailsurl = config.ipintel_detailsurl ? "(<a href='[config.ipintel_detailsurl][address]'>IP Info</a>)" : ""
if(config.ipintel_whitelist)
spawn(40) // This is necessary because without it, they won't see the message, and addtimer cannot be used because the timer system may not have initialized yet
message_admins("<span class='adminnotice'>IPIntel: [key_name_admin(src)] on IP [address] was rejected. [detailsurl]</span>")
var/blockmsg = "<B>Error: proxy/VPN detected. Proxy/VPN use is not allowed here. Deactivate it before you reconnect.</B>"
if(config.banappeals)
blockmsg += "\nIf you are not actually using a proxy/VPN, or have no choice but to use one, request whitelisting at: [config.banappeals]"
to_chat(src, blockmsg)
qdel(src)
else
message_admins("<span class='adminnotice'>IPIntel: [key_name_admin(src)] on IP [address] is likely to be using a Proxy/VPN. [detailsurl]</span>")
/client/proc/check_forum_link()
if(config.forum_link_url && prefs && !prefs.fuid)
to_chat(src, "<B>You do not have your forum account linked. <a href='?src=[UID()];link_forum_account=true'>LINK FORUM ACCOUNT</a></B>")
/client/proc/create_oauth_token()
var/DBQuery/query_find_token = dbcon.NewQuery("SELECT token FROM [format_table_name("oauth_tokens")] WHERE ckey = '[ckey]' limit 1")
if(!query_find_token.Execute())
log_debug("create_oauth_token: failed db read")
return
if(query_find_token.NextRow())
return query_find_token.item[1]
var/tokenstr = md5("[ckey][rand()]")
var/DBQuery/query_insert_token = dbcon.NewQuery("INSERT INTO [format_table_name("oauth_tokens")] (ckey, token) VALUES('[ckey]','[tokenstr]')")
if(!query_insert_token.Execute())
return
return tokenstr
/client/proc/link_forum_account()
if(IsGuestKey(key))
to_chat(src, "Guest keys cannot be linked.")
return
if(prefs && prefs.fuid)
to_chat(src, "Your forum account is already set.")
return
var/DBQuery/query_find_link = dbcon.NewQuery("SELECT fuid FROM [format_table_name("player")] WHERE ckey = '[ckey]' limit 1")
if(!query_find_link.Execute())
log_debug("link_forum_account: failed db read")
return
if(query_find_link.NextRow())
if(query_find_link.item[1])
to_chat(src, "Your forum account is already set. (" + query_find_link.item[1] + ")")
return
var/tokenid = create_oauth_token()
if(!tokenid)
to_chat(src, "link_forum_account: unable to create token")
return
var/url = "[config.forum_link_url][tokenid]"
to_chat(src, {"Now opening a windows to verify your information with the forums. If the window does not load, please go to: <a href="[url]">[url]</a>."})
src << link(url)
return
#undef TOPIC_SPAM_DELAY
#undef UPLOAD_LIMIT
@@ -682,8 +772,8 @@
message += " (RESTRICTED)"
to_chat(world, "[message]")
/client/proc/colour_transition(var/list/colour_to = null, var/time = 10) //Call this with no parameters to reset to default.
animate(src, color=colour_to, time=time, easing=SINE_EASING)
/client/proc/colour_transition(list/colour_to = null, time = 10) //Call this with no parameters to reset to default.
animate(src, color = colour_to, time = time, easing = SINE_EASING)
/client/proc/on_varedit()
var_edited = TRUE
@@ -92,6 +92,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
var/windowflashing = TRUE
var/clientfps = 0
var/atklog = ATKLOG_ALL
var/fuid // forum userid
//ghostly preferences
var/ghost_anonsay = 0
@@ -211,8 +212,6 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
unlock_content = C.IsByondMember()
if(unlock_content)
max_save_slots = MAX_SAVE_SLOTS_MEMBER
if(C.donator_level > 0)
max_gear_slots += 5
loaded_preferences_successfully = load_preferences(C) // Do not call this with no client/C, it generates a runtime / SQL error
if(loaded_preferences_successfully)
@@ -438,9 +437,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
// LEFT SIDE OF THE PAGE
dat += "<table><tr><td width='340px' height='300px' valign='top'>"
dat += "<h2>General Settings</h2>"
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> <a href='?_src_=prefs;preference=hear_adminhelps'><b>[(sound & SOUND_ADMINHELP)?"On":"Off"]</b></a><br>"
dat += "<b>Ambient Occlusion:</b> <a href='?_src_=prefs;preference=ambientocclusion'><b>[toggles & AMBIENT_OCCLUSION ? "Enabled" : "Disabled"]</b></a><br>"
dat += "<b>Attack Animations:</b> <a href='?_src_=prefs;preference=ghost_att_anim'>[(show_ghostitem_attack) ? "Yes" : "No"]</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>"
@@ -451,11 +451,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(user.client.donator_level > 0)
dat += "<b>Donator Publicity:</b> <a href='?_src_=prefs;preference=donor_public'><b>[(toggles & DONATOR_PUBLIC) ? "Public" : "Hidden"]</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>Ambient Occlusion:</b> <a href='?_src_=prefs;preference=ambientocclusion'><b>[toggles & AMBIENT_OCCLUSION ? "Enabled" : "Disabled"]</b></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>"
dat += "<b>Ghost Sight:</b> <a href='?_src_=prefs;preference=ghost_sight'><b>[(toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]</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];'>&nbsp;&nbsp;&nbsp;</span> <a href='?_src_=prefs;preference=ooccolor;task=input'><b>Change</b></a><br>"
if(config.allow_Metadata)
@@ -18,7 +18,8 @@
ghost_anonsay,
exp,
clientfps,
atklog
atklog,
fuid
FROM [format_table_name("player")]
WHERE ckey='[C.ckey]'"}
)
@@ -50,6 +51,7 @@
exp = query.item[16]
clientfps = text2num(query.item[17])
atklog = text2num(query.item[18])
fuid = text2num(query.item[19])
//Sanitize
ooccolor = sanitize_hexcolor(ooccolor, initial(ooccolor))
@@ -69,6 +71,7 @@
exp = sanitize_text(exp, initial(exp))
clientfps = sanitize_integer(clientfps, 0, 1000, initial(clientfps))
atklog = sanitize_integer(atklog, 0, 100, initial(atklog))
fuid = sanitize_integer(fuid, 0, 10000000, initial(fuid))
return 1
/datum/preferences/proc/save_preferences(client/C)
@@ -87,7 +90,7 @@
UI_style_alpha='[UI_style_alpha]',
be_role='[sanitizeSQL(list2params(be_special))]',
default_slot='[default_slot]',
toggles='[toggles]',
toggles='[num2text(toggles, 7)]',
atklog='[atklog]',
sound='[sound]',
randomslot='[randomslot]',
@@ -1,478 +1,516 @@
#define EMP_RANDOMISE_TIME 300
/datum/action/chameleon_outfit
name = "Select Chameleon Outfit"
button_icon_state = "chameleon_outfit"
var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first.
/datum/action/chameleon_outfit/New()
..()
initialize_outfits()
/datum/action/chameleon_outfit/proc/initialize_outfits()
var/static/list/standard_outfit_options
if(!standard_outfit_options)
standard_outfit_options = list()
for(var/path in subtypesof(/datum/outfit/job))
var/datum/outfit/O = path
standard_outfit_options[initial(O.name)] = path
sortTim(standard_outfit_options, /proc/cmp_text_asc)
outfit_options = standard_outfit_options
/datum/action/chameleon_outfit/Trigger()
return select_outfit(owner)
/datum/action/chameleon_outfit/proc/select_outfit(mob/user)
if(!user || !IsAvailable())
return FALSE
var/selected = input("Select outfit to change into", "Chameleon Outfit") as null|anything in outfit_options
if(!IsAvailable() || QDELETED(src) || QDELETED(user))
return FALSE
var/outfit_type = outfit_options[selected]
if(!outfit_type)
return FALSE
var/datum/outfit/O = new outfit_type()
var/list/outfit_types = O.get_chameleon_disguise_info()
for(var/V in user.chameleon_item_actions)
var/datum/action/item_action/chameleon/change/A = V
var/done = FALSE
for(var/T in outfit_types)
for(var/name in A.chameleon_list)
if(A.chameleon_list[name] == T)
A.update_look(user, T)
outfit_types -= T
done = TRUE
break
if(done)
break
//hardsuit helmets/suit hoods
if(ispath(O.suit, /obj/item/clothing/suit/hooded) && ishuman(user))
var/mob/living/carbon/human/H = user
//make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat
if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon))
var/helmet_type
var/obj/item/clothing/suit/hooded/hooded = O.suit
helmet_type = initial(hooded.hoodtype)
if(helmet_type)
var/obj/item/clothing/head/chameleon/hat = H.head
hat.chameleon_action.update_look(user, helmet_type)
qdel(O)
return TRUE
/datum/action/item_action/chameleon/change
name = "Chameleon Change"
var/list/chameleon_blacklist = list() //This is a typecache
var/list/chameleon_list = list()
var/chameleon_type = null
var/chameleon_name = "Item"
var/emp_timer
/datum/action/item_action/chameleon/change/Grant(mob/M)
if(M && (owner != M))
if(!M.chameleon_item_actions)
M.chameleon_item_actions = list(src)
var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit()
O.Grant(M)
else
M.chameleon_item_actions |= src
..()
/datum/action/item_action/chameleon/change/Remove(mob/M)
if(M && (M == owner))
LAZYREMOVE(M.chameleon_item_actions, src)
if(!LAZYLEN(M.chameleon_item_actions))
var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions
qdel(O)
..()
/datum/action/item_action/chameleon/change/proc/initialize_disguises()
if(button)
button.name = "Change [chameleon_name] Appearance"
chameleon_blacklist |= typecacheof(target.type)
for(var/V in typesof(chameleon_type))
if(ispath(V) && ispath(V, /obj/item))
var/obj/item/I = V
if(chameleon_blacklist[V] || (initial(I.flags) & ABSTRACT) || !initial(I.icon_state))
continue
var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])"
chameleon_list[chameleon_item_name] = I
/datum/action/item_action/chameleon/change/proc/select_look(mob/user)
var/obj/item/picked_item
var/picked_name
picked_name = input("Select [chameleon_name] to change into", "Chameleon [chameleon_name]", picked_name) as null|anything in chameleon_list
if(!picked_name)
return
picked_item = chameleon_list[picked_name]
if(!picked_item)
return
update_look(user, picked_item)
/datum/action/item_action/chameleon/change/proc/random_look(mob/user)
var/picked_name = pick(chameleon_list)
// If a user is provided, then this item is in use, and we
// need to update our icons and stuff
if(user)
update_look(user, chameleon_list[picked_name])
// Otherwise, it's likely a random initialisation, so we
// don't have to worry
else
update_item(chameleon_list[picked_name])
/datum/action/item_action/chameleon/change/proc/update_look(mob/user, obj/item/picked_item)
if(isliving(user))
var/mob/living/C = user
if(C.stat != CONSCIOUS)
return
update_item(picked_item)
var/obj/item/thing = target
thing.update_slot_icon()
UpdateButtonIcon()
/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item)
target.name = initial(picked_item.name)
target.desc = initial(picked_item.desc)
target.icon_state = initial(picked_item.icon_state)
if(isitem(target))
var/obj/item/I = target
I.item_state = initial(picked_item.item_state)
I.item_color = initial(picked_item.item_color)
if(istype(I, /obj/item/clothing) && istype(initial(picked_item), /obj/item/clothing))
var/obj/item/clothing/CL = I
var/obj/item/clothing/PCL = picked_item
CL.flags_cover = initial(PCL.flags_cover)
target.icon = initial(picked_item.icon)
/datum/action/item_action/chameleon/change/Trigger()
if(!IsAvailable())
return
select_look(owner)
return 1
/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME)
START_PROCESSING(SSprocessing, src)
random_look(owner)
var/new_value = world.time + amount
if(new_value > emp_timer)
emp_timer = new_value
/datum/action/item_action/chameleon/change/process()
if(world.time > emp_timer)
STOP_PROCESSING(SSprocessing, src)
return
random_look(owner)
/obj/item/clothing/under/chameleon
//starts off as black
name = "black jumpsuit"
icon_state = "black"
item_state = "bl_suit"
item_color = "black"
desc = "It's a plain jumpsuit. It has a small dial on the wrist."
sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle??
random_sensor = FALSE
resistance_flags = NONE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/under/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/under
chameleon_action.chameleon_name = "Jumpsuit"
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank), only_root_path = TRUE)
chameleon_action.initialize_disguises()
/obj/item/clothing/under/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/under/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/suit/chameleon
name = "armor"
desc = "A slim armored vest that protects against most types of damage."
icon_state = "armor"
item_state = "armor"
blood_overlay_type = "armor"
resistance_flags = NONE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/suit/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/suit
chameleon_action.chameleon_name = "Suit"
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor), only_root_path = TRUE)
chameleon_action.initialize_disguises()
/obj/item/clothing/suit/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/suit/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/glasses/chameleon
name = "Optical Meson Scanner"
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
icon_state = "meson"
item_state = "meson"
resistance_flags = NONE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/glasses/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/glasses
chameleon_action.chameleon_name = "Glasses"
chameleon_action.chameleon_blacklist = list()
chameleon_action.initialize_disguises()
/obj/item/clothing/glasses/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/glasses/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/gloves/chameleon
desc = "These gloves will protect the wearer from electric shock."
name = "insulated gloves"
icon_state = "yellow"
item_state = "ygloves"
resistance_flags = NONE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/gloves/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/gloves
chameleon_action.chameleon_name = "Gloves"
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color), only_root_path = TRUE)
chameleon_action.initialize_disguises()
/obj/item/clothing/gloves/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/gloves/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/head/chameleon
name = "grey cap"
desc = "It's a baseball hat in a tasteful grey colour."
icon_state = "greysoft"
item_color = "grey"
resistance_flags = NONE
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/head/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/head
chameleon_action.chameleon_name = "Hat"
chameleon_action.chameleon_blacklist = list()
chameleon_action.initialize_disguises()
/obj/item/clothing/head/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/head/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/mask/chameleon
name = "gas mask"
desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate
icon_state = "gas_alt"
item_state = "gas_alt"
resistance_flags = NONE
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
flags = AIRTIGHT | BLOCK_GAS_SMOKE_EFFECT
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
var/obj/item/voice_changer/voice_changer
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/mask/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/mask
chameleon_action.chameleon_name = "Mask"
chameleon_action.chameleon_blacklist = list()
chameleon_action.initialize_disguises()
voice_changer = new(src)
/obj/item/clothing/mask/chameleon/Destroy()
QDEL_NULL(voice_changer)
return ..()
/obj/item/clothing/mask/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/mask/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/shoes/chameleon
name = "black shoes"
icon_state = "black"
item_color = "black"
desc = "A pair of black shoes."
permeability_coefficient = 0.05
resistance_flags = NONE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/shoes/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/shoes
chameleon_action.chameleon_name = "Shoes"
chameleon_action.chameleon_blacklist = list()
chameleon_action.initialize_disguises()
/obj/item/clothing/shoes/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/shoes/chameleon/noslip
name = "black shoes"
icon_state = "black"
item_color = "black"
desc = "A pair of black shoes."
flags = NOSLIP
/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/storage/backpack/chameleon
name = "backpack"
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/storage/backpack/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/storage/backpack
chameleon_action.chameleon_name = "Backpack"
chameleon_action.initialize_disguises()
/obj/item/storage/backpack/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/storage/backpack/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/storage/belt/chameleon
name = "toolbelt"
desc = "Holds tools."
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/storage/belt/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/storage/belt
chameleon_action.chameleon_name = "Belt"
chameleon_action.initialize_disguises()
/obj/item/storage/belt/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/storage/belt/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/radio/headset/chameleon
name = "radio headset"
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/radio/headset/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/radio/headset
chameleon_action.chameleon_name = "Headset"
chameleon_action.initialize_disguises()
/obj/item/radio/headset/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/radio/headset/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/pda/chameleon
name = "PDA"
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/pda/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/pda
chameleon_action.chameleon_name = "PDA"
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/pda/heads), only_root_path = TRUE)
chameleon_action.initialize_disguises()
/obj/item/pda/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/pda/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/stamp/chameleon
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/stamp/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/stamp
chameleon_action.chameleon_name = "Stamp"
chameleon_action.initialize_disguises()
/obj/item/stamp/chameleon/broken/Initialize()
. = ..()
#define EMP_RANDOMISE_TIME 300
/datum/action/chameleon_outfit
name = "Select Chameleon Outfit"
button_icon_state = "chameleon_outfit"
var/list/outfit_options //By default, this list is shared between all instances. It is not static because if it were, subtypes would not be able to have their own. If you ever want to edit it, copy it first.
/datum/action/chameleon_outfit/New()
..()
initialize_outfits()
/datum/action/chameleon_outfit/proc/initialize_outfits()
var/static/list/standard_outfit_options
if(!standard_outfit_options)
standard_outfit_options = list()
for(var/path in subtypesof(/datum/outfit/job))
var/datum/outfit/O = path
standard_outfit_options[initial(O.name)] = path
sortTim(standard_outfit_options, /proc/cmp_text_asc)
outfit_options = standard_outfit_options
/datum/action/chameleon_outfit/Trigger()
return select_outfit(owner)
/datum/action/chameleon_outfit/proc/select_outfit(mob/user)
if(!user || !IsAvailable())
return FALSE
var/selected = input("Select outfit to change into", "Chameleon Outfit") as null|anything in outfit_options
if(!IsAvailable() || QDELETED(src) || QDELETED(user))
return FALSE
var/outfit_type = outfit_options[selected]
if(!outfit_type)
return FALSE
var/datum/outfit/O = new outfit_type()
var/list/outfit_types = O.get_chameleon_disguise_info()
for(var/V in user.chameleon_item_actions)
var/datum/action/item_action/chameleon/change/A = V
var/done = FALSE
for(var/T in outfit_types)
for(var/name in A.chameleon_list)
if(A.chameleon_list[name] == T)
A.update_look(user, T)
outfit_types -= T
done = TRUE
break
if(done)
break
//hardsuit helmets/suit hoods
if(ispath(O.suit, /obj/item/clothing/suit/hooded) && ishuman(user))
var/mob/living/carbon/human/H = user
//make sure they are actually wearing the suit, not just holding it, and that they have a chameleon hat
if(istype(H.wear_suit, /obj/item/clothing/suit/chameleon) && istype(H.head, /obj/item/clothing/head/chameleon))
var/helmet_type
var/obj/item/clothing/suit/hooded/hooded = O.suit
helmet_type = initial(hooded.hoodtype)
if(helmet_type)
var/obj/item/clothing/head/chameleon/hat = H.head
hat.chameleon_action.update_look(user, helmet_type)
qdel(O)
return TRUE
/datum/action/item_action/chameleon/change
name = "Chameleon Change"
var/list/chameleon_blacklist = list() //This is a typecache
var/list/chameleon_list = list()
var/chameleon_type = null
var/chameleon_name = "Item"
var/emp_timer
/datum/action/item_action/chameleon/change/Grant(mob/M)
if(M && (owner != M))
if(!M.chameleon_item_actions)
M.chameleon_item_actions = list(src)
var/datum/action/chameleon_outfit/O = new /datum/action/chameleon_outfit()
O.Grant(M)
else
M.chameleon_item_actions |= src
..()
/datum/action/item_action/chameleon/change/Remove(mob/M)
if(M && (M == owner))
LAZYREMOVE(M.chameleon_item_actions, src)
if(!LAZYLEN(M.chameleon_item_actions))
var/datum/action/chameleon_outfit/O = locate(/datum/action/chameleon_outfit) in M.actions
qdel(O)
..()
/datum/action/item_action/chameleon/change/proc/initialize_disguises()
if(button)
button.name = "Change [chameleon_name] Appearance"
chameleon_blacklist |= typecacheof(target.type)
for(var/V in typesof(chameleon_type))
if(ispath(V) && ispath(V, /obj/item))
var/obj/item/I = V
if(chameleon_blacklist[V] || (initial(I.flags) & ABSTRACT) || !initial(I.icon_state))
continue
var/chameleon_item_name = "[initial(I.name)] ([initial(I.icon_state)])"
chameleon_list[chameleon_item_name] = I
/datum/action/item_action/chameleon/change/proc/select_look(mob/user)
var/obj/item/picked_item
var/picked_name
picked_name = input("Select [chameleon_name] to change into", "Chameleon [chameleon_name]", picked_name) as null|anything in chameleon_list
if(!picked_name)
return
picked_item = chameleon_list[picked_name]
if(!picked_item)
return
update_look(user, picked_item)
/datum/action/item_action/chameleon/change/proc/random_look(mob/user)
var/picked_name = pick(chameleon_list)
// If a user is provided, then this item is in use, and we
// need to update our icons and stuff
if(user)
update_look(user, chameleon_list[picked_name])
// Otherwise, it's likely a random initialisation, so we
// don't have to worry
else
update_item(chameleon_list[picked_name])
/datum/action/item_action/chameleon/change/proc/update_look(mob/user, obj/item/picked_item)
if(isliving(user))
var/mob/living/C = user
if(C.stat != CONSCIOUS)
return
update_item(picked_item)
var/obj/item/thing = target
thing.update_slot_icon()
UpdateButtonIcon()
/datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item)
// Species-related variables are lists, which can not be retrieved using initial(). As such, we need to instantiate the picked item.
var/obj/item/P = new picked_item(null)
target.name = P.name
target.desc = P.desc
target.icon_state = P.icon_state
if(isitem(target))
var/obj/item/I = target
I.item_state = P.item_state
I.item_color = P.item_color
I.icon_override = P.icon_override
I.sprite_sheets = P.sprite_sheets
if(istype(I, /obj/item/clothing) && istype(P, /obj/item/clothing))
var/obj/item/clothing/CL = I
var/obj/item/clothing/PCL = P
CL.flags_cover = PCL.flags_cover
target.icon = P.icon
qdel(P)
/datum/action/item_action/chameleon/change/Trigger()
if(!IsAvailable())
return
select_look(owner)
return 1
/datum/action/item_action/chameleon/change/proc/emp_randomise(var/amount = EMP_RANDOMISE_TIME)
START_PROCESSING(SSprocessing, src)
random_look(owner)
var/new_value = world.time + amount
if(new_value > emp_timer)
emp_timer = new_value
/datum/action/item_action/chameleon/change/process()
if(world.time > emp_timer)
STOP_PROCESSING(SSprocessing, src)
return
random_look(owner)
/obj/item/clothing/under/chameleon
name = "black jumpsuit"
icon_state = "black"
item_state = "bl_suit"
item_color = "black"
desc = "It's a plain jumpsuit. It has a small dial on the wrist."
sensor_mode = SENSOR_OFF //Hey who's this guy on the Syndicate Shuttle??
random_sensor = FALSE
resistance_flags = NONE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/under/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/under
chameleon_action.chameleon_name = "Jumpsuit"
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/under, /obj/item/clothing/under/color, /obj/item/clothing/under/rank), only_root_path = TRUE)
chameleon_action.initialize_disguises()
/obj/item/clothing/under/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/under/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/suit/chameleon
name = "armor"
desc = "A slim armored vest that protects against most types of damage."
icon_state = "armor"
item_state = "armor"
blood_overlay_type = "armor"
resistance_flags = NONE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/suit/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/suit
chameleon_action.chameleon_name = "Suit"
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/suit/armor/abductor), only_root_path = TRUE)
chameleon_action.initialize_disguises()
/obj/item/clothing/suit/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/suit/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/glasses/chameleon
name = "Optical Meson Scanner"
desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting condition."
icon_state = "meson"
item_state = "meson"
resistance_flags = NONE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/glasses/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/glasses
chameleon_action.chameleon_name = "Glasses"
chameleon_action.chameleon_blacklist = list()
chameleon_action.initialize_disguises()
/obj/item/clothing/glasses/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/glasses/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/gloves/chameleon
desc = "These gloves will protect the wearer from electric shock."
name = "insulated gloves"
icon_state = "yellow"
item_state = "ygloves"
resistance_flags = NONE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/gloves/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/gloves
chameleon_action.chameleon_name = "Gloves"
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/clothing/gloves, /obj/item/clothing/gloves/color), only_root_path = TRUE)
chameleon_action.initialize_disguises()
/obj/item/clothing/gloves/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/gloves/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/head/chameleon
name = "grey cap"
desc = "It's a baseball hat in a tasteful grey colour."
icon_state = "greysoft"
item_color = "grey"
resistance_flags = NONE
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/head/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/head
chameleon_action.chameleon_name = "Hat"
chameleon_action.chameleon_blacklist = list()
chameleon_action.initialize_disguises()
/obj/item/clothing/head/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/head/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/mask/chameleon
name = "gas mask"
desc = "A face-covering mask that can be connected to an air supply. While good for concealing your identity, it isn't good for blocking gas flow." //More accurate
icon_state = "gas_alt"
item_state = "gas_alt"
resistance_flags = NONE
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
flags = AIRTIGHT | BLOCK_GAS_SMOKE_EFFECT
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
var/obj/item/voice_changer/voice_changer
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/mask/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/mask
chameleon_action.chameleon_name = "Mask"
chameleon_action.chameleon_blacklist = list()
chameleon_action.initialize_disguises()
voice_changer = new(src)
/obj/item/clothing/mask/chameleon/Destroy()
QDEL_NULL(voice_changer)
return ..()
/obj/item/clothing/mask/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/mask/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/clothing/shoes/chameleon
name = "black shoes"
icon_state = "black"
item_color = "black"
desc = "A pair of black shoes."
permeability_coefficient = 0.05
resistance_flags = NONE
armor = list("melee" = 10, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/clothing/shoes/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/clothing/shoes
chameleon_action.chameleon_name = "Shoes"
chameleon_action.chameleon_blacklist = list()
chameleon_action.initialize_disguises()
/obj/item/clothing/shoes/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/clothing/shoes/chameleon/noslip
name = "black shoes"
icon_state = "black"
item_color = "black"
desc = "A pair of black shoes."
flags = NOSLIP
/obj/item/clothing/shoes/chameleon/noslip/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/storage/backpack/chameleon
name = "backpack"
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/back.dmi'
)
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/storage/backpack/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/storage/backpack
chameleon_action.chameleon_name = "Backpack"
chameleon_action.initialize_disguises()
/obj/item/storage/backpack/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/storage/backpack/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/storage/belt/chameleon
name = "toolbelt"
desc = "Holds tools."
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/storage/belt/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/storage/belt
chameleon_action.chameleon_name = "Belt"
chameleon_action.initialize_disguises()
/obj/item/storage/belt/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/storage/belt/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/radio/headset/chameleon
name = "radio headset"
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/radio/headset/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/radio/headset
chameleon_action.chameleon_name = "Headset"
chameleon_action.initialize_disguises()
/obj/item/radio/headset/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/radio/headset/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/pda/chameleon
name = "PDA"
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/pda/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/pda
chameleon_action.chameleon_name = "PDA"
chameleon_action.chameleon_blacklist = typecacheof(list(/obj/item/pda/heads), only_root_path = TRUE)
chameleon_action.initialize_disguises()
/obj/item/pda/chameleon/emp_act(severity)
. = ..()
chameleon_action.emp_randomise()
/obj/item/pda/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
/obj/item/stamp/chameleon
var/datum/action/item_action/chameleon/change/chameleon_action
/obj/item/stamp/chameleon/Initialize()
. = ..()
chameleon_action = new(src)
chameleon_action.chameleon_type = /obj/item/stamp
chameleon_action.chameleon_name = "Stamp"
chameleon_action.initialize_disguises()
/obj/item/stamp/chameleon/broken/Initialize()
. = ..()
chameleon_action.emp_randomise(INFINITY)
+9 -6
View File
@@ -213,7 +213,7 @@ BLIND // can't see anything
var/clipped = 0
strip_delay = 20
put_on_delay = 40
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi',
"Drask" = 'icons/mob/species/drask/gloves.dmi'
@@ -404,7 +404,7 @@ BLIND // can't see anything
permeability_coefficient = 0.50
slowdown = SHOES_SLOWDOWN
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/shoes.dmi'
)
@@ -594,12 +594,13 @@ BLIND // can't see anything
permeability_coefficient = 0.90
slot_flags = SLOT_ICLOTHING
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
species_fit = list("Vox", "Drask", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi',
"Drask" = 'icons/mob/species/drask/uniform.dmi',
"Grey" = 'icons/mob/species/grey/uniform.dmi'
)
var/has_sensor = TRUE//For the crew computer 2 = unable to change mode
var/sensor_mode = SENSOR_OFF
var/random_sensor = TRUE
@@ -624,12 +625,14 @@ BLIND // can't see anything
/obj/item/clothing/under/proc/can_attach_accessory(obj/item/clothing/accessory/A)
if(istype(A))
.=1
. = 1
else
return 0
if(accessories.len && (A.slot in list("utility","armband")))
if(accessories.len)
for(var/obj/item/clothing/accessory/AC in accessories)
if(AC.slot == A.slot)
if((A.slot in list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_ARMBAND)) && AC.slot == A.slot)
return 0
if(!A.allow_duplicates && AC.type == A.type)
return 0
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
+29 -20
View File
@@ -39,7 +39,7 @@
vision_flags = SEE_TURFS
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
prescription_upgradable = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
@@ -88,7 +88,7 @@
origin_tech = "magnets=2;engineering=1"
prescription_upgradable = 0
scan_reagents = 1 //You can see reagents while wearing science goggles
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
@@ -112,7 +112,7 @@
desc = "These'll keep the soap out of your eyes."
icon_state = "purple"
item_state = "glasses"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
@@ -125,7 +125,7 @@
origin_tech = "materials=4;magnets=4;plasmatech=4;engineering=4"
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //don't render darkness while wearing these
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
@@ -137,7 +137,7 @@
desc = "Yarr."
icon_state = "eyepatch"
item_state = "eyepatch"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
@@ -149,7 +149,7 @@
icon_state = "monocle"
item_state = "headset" // lol
prescription_upgradable = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
@@ -163,7 +163,7 @@
item_state = "glasses"
origin_tech = "magnets=3;engineering=3"
vision_flags = SEE_OBJS
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
@@ -178,13 +178,22 @@
flags = NODROP
flags_cover = null
/obj/item/clothing/glasses/material/lighting
name = "Neutron Goggles"
desc = "These odd glasses use a form of neutron-based imaging to completely negate the effects of light and darkness."
origin_tech = null
vision_flags = 0
flags = NODROP
lighting_alpha = LIGHTING_PLANE_ALPHA_INVISIBLE
/obj/item/clothing/glasses/regular
name = "prescription glasses"
desc = "Made by Nerd. Co."
icon_state = "glasses"
item_state = "glasses"
prescription = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
@@ -201,7 +210,7 @@
name = "3D glasses"
icon_state = "3d"
item_state = "3d"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
@@ -212,7 +221,7 @@
desc = "Forest green glasses, like the kind you'd wear when hatching a nasty scheme."
icon_state = "gglasses"
item_state = "gglasses"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
@@ -228,7 +237,7 @@
flash_protect = 1
tint = 1
prescription_upgradable = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
@@ -247,16 +256,16 @@
desc = "Somehow these seem even more out-of-date than normal sunglasses."
actions_types = list(/datum/action/item_action/noir)
/obj/item/clothing/glasses/sunglasses/noir/attack_self()
toggle_noir()
/obj/item/clothing/glasses/sunglasses/noir/attack_self(mob/user)
toggle_noir(user)
/obj/item/clothing/glasses/sunglasses/noir/item_action_slot_check(slot)
if(slot == slot_glasses)
return 1
/obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir()
/obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir(mob/user)
color_view = color_view ? null : MATRIX_GREYSCALE //Toggles between null and grayscale, with null being the default option.
usr.update_client_colour()
user.update_client_colour()
/obj/item/clothing/glasses/sunglasses/yeah
name = "agreeable glasses"
@@ -289,7 +298,7 @@
see_in_dark = 1
flash_protect = 1
tint = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
@@ -315,7 +324,7 @@
actions_types = list(/datum/action/item_action/toggle)
flash_protect = 2
tint = 2
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
@@ -385,7 +394,7 @@
vision_flags = SEE_MOBS
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
flash_protect = -1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
@@ -416,7 +425,7 @@
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',
@@ -534,7 +543,7 @@
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'
)
+7 -7
View File
@@ -31,7 +31,7 @@
icon_state = "healthhud"
origin_tech = "magnets=3;biotech=2"
HUDType = DATA_HUD_MEDICAL_ADVANCED
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
@@ -60,7 +60,7 @@
icon_state = "diagnostichud"
origin_tech = "magnets=2;engineering=2"
HUDType = DATA_HUD_DIAGNOSTIC
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
@@ -84,7 +84,7 @@
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',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
@@ -128,7 +128,7 @@
flash_protect = 1
tint = 1
prescription_upgradable = 1
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Drask" = 'icons/mob/species/drask/eyes.dmi',
@@ -143,7 +143,7 @@
desc = "A heads-up display capable of analyzing the health and status of plants growing in hydro trays and soil."
icon_state = "hydroponichud"
HUDType = DATA_HUD_HYDROPONIC
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi',
"Grey" = 'icons/mob/species/grey/eyes.dmi'
@@ -166,7 +166,7 @@
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'
)
@@ -182,7 +182,7 @@
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'
)
+2 -2
View File
@@ -59,7 +59,7 @@
icon_state = "welding"
item_state = "welding"
burn_state = FIRE_PROOF
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
@@ -126,7 +126,7 @@
icon_state = "swat"
item_state = "swat"
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi'
)
+2 -2
View File
@@ -11,7 +11,7 @@
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'
)
@@ -95,7 +95,7 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
cold_protection = HEAD
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
+2 -2
View File
@@ -13,7 +13,7 @@
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
burn_state = FIRE_PROOF
species_fit = list("Vox", "Drask", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Drask" = 'icons/mob/species/drask/helmet.dmi',
@@ -203,7 +203,7 @@ obj/item/clothing/head/blob
item_state = "blobhat"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi'
)
+7 -7
View File
@@ -76,7 +76,7 @@
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'
)
@@ -90,7 +90,7 @@
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'
)
@@ -103,7 +103,7 @@
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'
)
@@ -265,7 +265,7 @@
icon_state = "chickenhead"
item_state = "chickensuit"
flags = BLOCKHAIR
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
@@ -419,7 +419,7 @@
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'
)
@@ -452,7 +452,7 @@
icon_state = "papersack"
flags = BLOCKHAIR
flags_inv = HIDEFACE|HIDEEARS
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
@@ -463,7 +463,7 @@
icon_state = "papersack_smile"
flags = BLOCKHAIR
flags_inv = HIDEFACE|HIDEEARS
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/head.dmi'
)
+8 -8
View File
@@ -25,7 +25,7 @@
flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
actions_types = list(/datum/action/item_action/toggle)
burn_state = FIRE_PROOF
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
@@ -132,7 +132,7 @@
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'
)
@@ -159,7 +159,7 @@
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'
)
@@ -230,7 +230,7 @@
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'
)
@@ -256,10 +256,10 @@
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'
"Vox" = 'icons/mob/species/vox/head.dmi',
"Drask" = 'icons/mob/species/drask/head.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi'
)
+1 -1
View File
@@ -6,7 +6,7 @@
item_color = "cargo"
var/flipped = 0
actions_types = list(/datum/action/item_action/flip_cap)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
)
+2 -2
View File
@@ -8,7 +8,7 @@
w_class = WEIGHT_CLASS_SMALL
actions_types = list(/datum/action/item_action/adjust)
adjusted_flags = SLOT_HEAD
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
@@ -29,7 +29,7 @@
flags = BLOCKHAIR
flags_inv = HIDEFACE
w_class = WEIGHT_CLASS_SMALL
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
+2 -3
View File
@@ -10,14 +10,14 @@
permeability_coefficient = 0.50
actions_types = list(/datum/action/item_action/adjust)
burn_state = FIRE_PROOF
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey" )
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi'
"Drask" = 'icons/mob/species/drask/mask.dmi',
"Plasmaman" = 'icons/mob/species/plasmaman/mask.dmi'
)
/obj/item/clothing/mask/breath/attack_self(var/mob/user)
@@ -36,7 +36,6 @@
item_state = "medical"
permeability_coefficient = 0.01
put_on_delay = 10
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
/obj/item/clothing/mask/breath/vox
desc = "A weirdly-shaped breath mask."
+31 -2
View File
@@ -10,14 +10,14 @@
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
burn_state = FIRE_PROOF
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
"Grey" = 'icons/mob/species/grey/mask.dmi',
"Plasmaman" = 'icons/mob/species/plasmaman/mask.dmi'
)
// **** Welding gas mask ****
@@ -62,6 +62,34 @@
var/datum/action/A = X
A.UpdateButtonIcon()
/obj/item/clothing/mask/gas/explorer
name = "explorer gas mask"
desc = "A military-grade gas mask that can be connected to an air supply."
icon_state = "gas_mining"
actions_types = list(/datum/action/item_action/adjust)
armor = list("melee" = 10, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 0, "bio" = 50, "rad" = 0)
resistance_flags = FIRE_PROOF
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Drask" = 'icons/mob/species/drask/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
/obj/item/clothing/mask/gas/explorer/attack_self(mob/user)
adjustmask(user)
/obj/item/clothing/mask/gas/explorer/adjustmask(user)
..()
w_class = mask_adjusted ? WEIGHT_CLASS_SMALL : WEIGHT_CLASS_NORMAL
/obj/item/clothing/mask/gas/explorer/folded/Initialize()
. = ..()
adjustmask()
//Bane gas mask
/obj/item/clothing/mask/banemask
name = "bane mask"
@@ -194,6 +222,7 @@
name = "security gas mask"
desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device, plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device."
icon_state = "sechailer"
item_state = "sechailer"
var/phrase = 1
var/aggressiveness = 1
var/safety = 1
+7 -7
View File
@@ -11,7 +11,7 @@
var/mute = MUZZLE_MUTE_ALL
var/security_lock = FALSE // Requires brig access to remove 0 - Remove as normal
var/locked = FALSE //Indicates if a mask is locked, should always start as 0.
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi'
)
@@ -89,7 +89,7 @@
resist_time = 150
mute = MUZZLE_MUTE_MUFFLE
flags = DROPDEL
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
@@ -197,7 +197,7 @@
permeability_coefficient = 0.01
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0)
actions_types = list(/datum/action/item_action/adjust)
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
@@ -216,7 +216,7 @@
icon_state = "fake-moustache"
flags_inv = HIDEFACE
actions_types = list(/datum/action/item_action/pontificate)
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
@@ -295,7 +295,7 @@
var/voicechange = 0
var/temporaryname = " the Horse"
var/originalname = ""
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
@@ -390,7 +390,7 @@
desc = "It's the eater of worlds, and of children."
icon_state = "pennywise_mask"
item_state = "pennywise_mask"
species_fit = list("Vox")
flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | BLOCKHAIR
// Bandanas
@@ -403,7 +403,7 @@
slot_flags = SLOT_MASK
adjusted_flags = SLOT_HEAD
icon_state = "bandbotany"
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
+1 -1
View File
@@ -7,7 +7,7 @@
desc = "Row row!"
icon_state = "gar"
item_state = "gar"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
+4 -4
View File
@@ -9,7 +9,7 @@
icon_state = "mushhat"
item_state = "mushhat"
flags = BLOCKHAIR
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
)
@@ -20,7 +20,7 @@
desc = "Poshness incarnate."
icon_state = "goldtophat"
item_state = "goldtophat"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
)
@@ -45,7 +45,7 @@
icon_state = "guardhelm"
item_state = "guardhelm"
flags = BLOCKHAIR
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
)
@@ -57,7 +57,7 @@
icon_state = "blacksombrero"
item_state = "blacksombrero"
flags = BLOCKHAIR
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
)
+1 -1
View File
@@ -83,7 +83,7 @@ obj/item/clothing/shoes/magboots/syndie/advance //For the Syndicate Strike Team
/obj/item/clothing/shoes/magboots/wizard/attack_self(mob/user)
if(user)
if(user.mind in ticker.mode.wizards)
if(user.mind in SSticker.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
@@ -95,6 +95,12 @@
can_cut_open = 1
icon_state = "workboots"
/obj/item/clothing/shoes/workboots/mining
name = "mining boots"
desc = "Steel-toed mining boots for mining in hazardous environments. Very good at keeping toes uncrushed."
icon_state = "explorer"
resistance_flags = FIRE_PROOF
/obj/item/clothing/shoes/winterboots
name = "winter boots"
desc = "Boots lined with 'synthetic' animal fur."
@@ -245,3 +251,35 @@
force = 0
silence_steps = TRUE
w_class = WEIGHT_CLASS_SMALL
/obj/item/clothing/shoes/bhop
name = "jump boots"
desc = "A specialized pair of combat boots with a built-in propulsion system for rapid foward movement."
icon_state = "jetboots"
item_state = "jetboots"
item_color = "hosred"
resistance_flags = FIRE_PROOF
actions_types = list(/datum/action/item_action/bhop)
permeability_coefficient = 0.05
can_cut_open = FALSE
var/jumpdistance = 5 //-1 from to see the actual distance, e.g 4 goes over 3 tiles
var/jumpspeed = 3
var/recharging_rate = 60 //default 6 seconds between each dash
var/recharging_time = 0 //time until next dash
/obj/item/clothing/shoes/bhop/ui_action_click(mob/user, action)
if(!isliving(user))
return
if(recharging_time > world.time)
to_chat(user, "<span class='warning'>The boot's internal propulsion needs to recharge still!</span>")
return
var/atom/target = get_edge_target_turf(user, user.dir) //gets the user's direction
if (user.throw_at(target, jumpdistance, jumpspeed, spin = FALSE, diagonals_first = TRUE))
playsound(src, 'sound/effects/stealthoff.ogg', 50, 1, 1)
user.visible_message("<span class='warning'>[usr] dashes forward into the air!</span>")
recharging_time = world.time + recharging_rate
else
to_chat(user, "<span class='warning'>Something prevents you from dashing forward!</span>")
+2 -13
View File
@@ -9,7 +9,7 @@
var/obj/machinery/camera/camera
var/has_camera = TRUE
strip_delay = 130
species_fit = list("Grey", "Vox")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi',
"Vox" = 'icons/mob/species/vox/helmet.dmi'
@@ -42,7 +42,7 @@
/obj/item/radio, /obj/item/analyzer, /obj/item/gun/energy/laser, /obj/item/gun/energy/pulse, \
/obj/item/gun/energy/gun/advtaser, /obj/item/melee/baton, /obj/item/gun/energy/gun, /obj/item/gun/projectile/automatic/lasercarbine, /obj/item/gun/energy/gun/blueshield, /obj/item/gun/energy/immolator/multi)
strip_delay = 130
species_fit = list("Drask", "Vox")
sprite_sheets = list(
"Drask" = 'icons/mob/species/drask/suit.dmi',
"Vox" = 'icons/mob/species/vox/suit.dmi'
@@ -61,7 +61,6 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "hardsuit0-gammacommander"
item_color = "gammacommander"
species_fit = null
/obj/item/clothing/suit/space/hardsuit/ert/commander
name = "emergency response team commander suit"
@@ -73,7 +72,6 @@
name = "elite emergency response team commander suit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "ert_gcommander"
species_fit = null
//Security
/obj/item/clothing/head/helmet/space/hardsuit/ert/security
@@ -88,7 +86,6 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "hardsuit0-gammasecurity"
item_color = "gammasecurity"
species_fit = null
/obj/item/clothing/suit/space/hardsuit/ert/security
name = "emergency response team security suit"
@@ -100,7 +97,6 @@
name = "elite emergency response team security suit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "ert_gsecurity"
species_fit = null
//Engineer
/obj/item/clothing/head/helmet/space/hardsuit/ert/engineer
@@ -116,7 +112,6 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "hardsuit0-gammaengineer"
item_color = "gammaengineer"
species_fit = null
/obj/item/clothing/suit/space/hardsuit/ert/engineer
name = "emergency response team engineer suit"
@@ -128,7 +123,6 @@
name = "elite emergency response team engineer suit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "ert_gengineer"
species_fit = null
//Medical
/obj/item/clothing/head/helmet/space/hardsuit/ert/medical
@@ -142,7 +136,6 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "hardsuit0-gammamedical"
item_color = "gammamedical"
species_fit = null
/obj/item/clothing/suit/space/hardsuit/ert/medical
name = "emergency response team medical suit"
@@ -153,7 +146,6 @@
name = "elite emergency response team medical suit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "ert_gmedical"
species_fit = null
//Janitor
/obj/item/clothing/head/helmet/space/hardsuit/ert/janitor
@@ -167,8 +159,6 @@
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "hardsuit0-gammajanitor"
item_color = "gammajanitor"
species_fit = null
/obj/item/clothing/suit/space/hardsuit/ert/janitor
name = "emergency response team janitor suit"
desc = "A suit worn by the janitorial of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured, space ready, and fire resistant."
@@ -178,7 +168,6 @@
name = "elite emergency response team janitor suit"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
icon_state = "ert_gjanitor"
species_fit = null
//Paranormal
/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
+1 -1
View File
@@ -498,7 +498,7 @@
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_MAX_TEMP_PROTECT
species_fit = list("Grey")
sprite_sheets = list(
"Grey" = 'icons/mob/species/grey/helmet.dmi'
)
@@ -8,7 +8,7 @@
permeability_coefficient = 0.01
armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Grey" = 'icons/mob/species/grey/helmet.dmi'
@@ -32,7 +32,7 @@
allowed = list(/obj/item/tank, /obj/item/flashlight,/obj/item/gun/energy, /obj/item/gun/projectile, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton,/obj/item/restraints/handcuffs)
armor = list(melee = 40, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -73,7 +73,7 @@
armor = list(melee = 40, bullet = 30, laser = 30, energy = 30, bomb = 50, bio = 90, rad = 20)
strip_delay = 120
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -100,13 +100,14 @@
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"
@@ -159,7 +160,7 @@
item_state = "paramedic-eva-helmet"
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")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Grey" = 'icons/mob/species/grey/helmet.dmi',
@@ -180,7 +181,7 @@
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", "Skrell" , "Tajaran" , "Drask" , "Unathi" , "Vulpkanin")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Skrell" = 'icons/mob/species/skrell/suit.dmi',
@@ -200,7 +201,7 @@
desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies."
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("Tajaran", "Unathi", "Vox", "Vulpkanin")
sprite_sheets = list(
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
@@ -223,7 +224,7 @@
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 20)
flash_protect = 0
species_restricted = list("exclude", "Diona", "Wryn")
species_fit = list("Tajaran", "Unathi", "Vox", "Vulpkanin", "Grey")
sprite_sheets = list(
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
"Unathi" = 'icons/mob/species/unathi/helmet.dmi',
@@ -244,7 +245,6 @@
icon_state = "spacemimehelmet"
item_state = "spacemimehelmet"
species_restricted = list("exclude","Diona","Vox","Wryn")
species_fit = null
sprite_sheets = null
sprite_sheets_obj = null
@@ -255,7 +255,6 @@
icon_state = "spacemime_suit"
item_state = "spacemime_items"
species_restricted = list("exclude","Diona","Vox","Wryn")
species_fit = null
sprite_sheets = null
sprite_sheets_obj = null
@@ -266,7 +265,6 @@
icon_state = "clownhelmet"
item_state = "clownhelmet"
species_restricted = list("exclude","Diona","Vox","Wryn")
species_fit = null
sprite_sheets = null
sprite_sheets_obj = null
@@ -277,6 +275,6 @@
icon_state = "spaceclown_suit"
item_state = "spaceclown_items"
species_restricted = list("exclude","Diona","Vox","Wryn")
species_fit = null
sprite_sheets = null
sprite_sheets_obj = null
@@ -235,6 +235,16 @@
base_state = "plasmamanMiner_helmet"
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
/obj/item/clothing/suit/space/eva/plasmaman/explorer
name = "plasmaman explorer suit"
icon_state = "plasmamanExplorer_suit"
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
/obj/item/clothing/head/helmet/space/eva/plasmaman/explorer
name = "plasmaman explorer helmet"
icon_state = "plasmamanExplorer_helmet0"
base_state = "plasmamanExplorer_helmet"
armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50, fire = 50, acid = 50)
// MEDSCI
-1
View File
@@ -1,6 +1,5 @@
//Unathi clothing.
/obj/item/clothing/suit/unathi/
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
+66 -5
View File
@@ -8,7 +8,7 @@
strip_delay = 60
put_on_delay = 40
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -91,7 +91,6 @@
desc = "A vest drenched in the blood of Greytide. It has seen better days."
icon_state = "bloody_armor"
item_state = "bloody_armor"
species_fit = null
sprite_sheets = null
/obj/item/clothing/suit/armor/secjacket
@@ -137,7 +136,6 @@
icon_state = "jensencoat"
item_state = "jensencoat"
flags_inv = 0
species_fit = null
sprite_sheets = null
/obj/item/clothing/suit/armor/vest/warden
@@ -383,7 +381,6 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
species_fit = null
sprite_sheets = null
armor = list(melee = 80, bullet = 80, laser = 50, energy = 50, bomb = 100, bio = 100, rad = 100)
@@ -476,4 +473,68 @@
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)
armor = list(melee = 25, bullet = 15, laser = 25, energy = 10, bomb = 25, bio = 0, rad = 0)
//LAVALAND!
/obj/item/clothing/suit/hooded/drake
name = "drake armour"
icon_state = "dragon"
item_state = "dragon"
desc = "A suit of armour fashioned from the remains of an ash drake."
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/twohanded/spear)
armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100)
hoodtype = /obj/item/clothing/head/hooded/drake
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
/obj/item/clothing/head/hooded/drake
name = "drake helmet"
icon_state = "dragon"
item_state = "dragon"
desc = "The skull of a dragon."
armor = list("melee" = 70, "bullet" = 30, "laser" = 50, "energy" = 40, "bomb" = 70, "bio" = 60, "rad" = 50, "fire" = 100, "acid" = 100)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
resistance_flags = FIRE_PROOF
flags = BLOCKHAIR
flags_cover = HEADCOVERSEYES
/obj/item/clothing/suit/hooded/goliath
name = "goliath cloak"
icon_state = "goliath_cloak"
item_state = "goliath_cloak"
desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits."
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/twohanded/spear)
armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot
hoodtype = /obj/item/clothing/head/hooded/goliath
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
/obj/item/clothing/head/hooded/goliath
name = "goliath cloak hood"
icon_state = "golhood"
item_state = "golhood"
desc = "A protective & concealing hood."
armor = list("melee" = 35, "bullet" = 10, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
flags = BLOCKHAIR
flags_cover = HEADCOVERSEYES
/obj/item/clothing/suit/armor/bone
name = "bone armor"
desc = "A tribal armor plate, crafted from animal bone."
icon_state = "bonearmor"
item_state = "bonearmor"
blood_overlay_type = "armor"
armor = list("melee" = 35, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS
/obj/item/clothing/head/skullhelmet
name = "skull helmet"
desc = "An intimidating tribal helmet, it doesn't look very comfortable."
flags = BLOCKHAIR
flags_cover = HEADCOVERSEYES
armor = list("melee" = 25, "bullet" = 25, "laser" = 25, "energy" = 10, "bomb" = 10, "bio" = 5, "rad" = 20, "fire" = 40, "acid" = 20)
icon_state = "skull"
item_state = "skull"
+3 -3
View File
@@ -9,7 +9,7 @@
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", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi'
@@ -33,7 +33,7 @@
strip_delay = 70
put_on_delay = 70
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -97,5 +97,5 @@
item_state = "bio_suit"
strip_delay = 40
put_on_delay = 20
species_fit = null
sprite_sheets = null
+6
View File
@@ -23,6 +23,12 @@
/obj/item/clothing/head/berserkerhood
flags = NODROP
/obj/item/clothing/head/hooded/drake
flags = NODROP
/obj/item/clothing/head/hooded/goliath
flags = NODROP
/obj/item/clothing/suit/hooded/New()
MakeHood()
..()
+24 -17
View File
@@ -10,7 +10,7 @@
allowed = list(/obj/item/stack/medical, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/hypospray, /obj/item/reagent_containers/syringe, \
/obj/item/healthanalyzer, /obj/item/flashlight, /obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 10)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -25,7 +25,7 @@
/obj/item/healthanalyzer, /obj/item/flashlight, \
/obj/item/radio, /obj/item/tank/emergency_oxygen,/obj/item/rad_laser)
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -39,7 +39,7 @@
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list(/obj/item/reagent_containers/spray/plantbgone,/obj/item/plant_analyzer,/obj/item/seeds,/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/cultivator,/obj/item/reagent_containers/spray/pestspray,/obj/item/hatchet,/obj/item/storage/bag/plants)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -54,7 +54,7 @@
flags_inv = HIDEJUMPSUIT
flags_size = ONESIZEFITSALL
allowed = list(/obj/item/disk, /obj/item/stamp, /obj/item/reagent_containers/food/drinks/flask, /obj/item/melee, /obj/item/storage/lockbox/medal, /obj/item/flash, /obj/item/storage/box/matches, /obj/item/lighter, /obj/item/clothing/mask/cigarette, /obj/item/storage/fancy/cigarettes, /obj/item/tank/emergency_oxygen)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -66,7 +66,7 @@
item_state = "bio_suit"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_inv = HIDEJUMPSUIT
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -87,7 +87,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
hoodtype = /obj/item/clothing/head/chaplain_hood
allowed = list(/obj/item/storage/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/emergency_oxygen)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -102,7 +102,7 @@
flags_inv = HIDESHOES|HIDEJUMPSUIT
hoodtype = /obj/item/clothing/head/nun_hood
allowed = list(/obj/item/storage/bible, /obj/item/nullrod, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/emergency_oxygen)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -142,7 +142,7 @@
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list (/obj/item/kitchen/knife)
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -185,7 +185,7 @@
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_size = ONESIZEFITSALL
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -222,7 +222,7 @@
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
flags_size = ONESIZEFITSALL
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -236,14 +236,13 @@
blood_overlay_type = "armor"
allowed = list (/obj/item/flashlight, /obj/item/t_scanner, /obj/item/tank/emergency_oxygen)
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
//Lawyer
/obj/item/clothing/suit/storage/lawyer
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -315,7 +314,7 @@
suit_adjusted = 1
actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -330,7 +329,7 @@
ignore_suitadjust = 0
actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -348,7 +347,7 @@
suit_adjusted = 1
actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -360,11 +359,19 @@
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "suspenders"
blood_overlay_type = "armor" //it's the less thing that I can put here
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
// Surgeon
/obj/item/clothing/suit/apron/surgical
name = "surgical apron"
desc = "A sterile blue surgical apron."
icon_state = "surgical"
item_state = "surgical"
allowed = list(/obj/item/scalpel, /obj/item/surgical_drapes, /obj/item/cautery, /obj/item/hemostat, /obj/item/retractor)
//Research Director
/obj/item/clothing/suit/mantle/labcoat
name = "research director's mantle"
@@ -372,4 +379,4 @@
icon_state = "rdmantle"
item_state = "rdmantle"
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/food/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/rad_laser)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0)
+1 -1
View File
@@ -9,7 +9,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/analyzer,/obj/item/stack/medical,/obj/item/dnainjector,/obj/item/reagent_containers/dropper,/obj/item/reagent_containers/syringe,/obj/item/reagent_containers/hypospray,/obj/item/healthanalyzer,/obj/item/flashlight/pen,/obj/item/reagent_containers/glass/bottle,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/food/pill,/obj/item/storage/pill_bottle,/obj/item/paper,/obj/item/rad_laser)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 50, rad = 0)
species_fit = list("Vox","Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Grey" = 'icons/mob/species/grey/suit.dmi'
+17 -17
View File
@@ -18,7 +18,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list (/obj/item/gun/energy/laser/tag/blue)
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -32,7 +32,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list (/obj/item/gun/energy/laser/tag/red)
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -45,7 +45,7 @@
desc = "Yarr."
icon_state = "pirate_old"
item_state = "pirate_old"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -55,7 +55,7 @@
desc = "Yarr."
icon_state = "pirate"
item_state = "pirate"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -117,7 +117,7 @@
item_state = "wcoat"
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -262,7 +262,7 @@
desc = "Your classic, non-racist poncho."
icon_state = "classicponcho"
item_state = "classicponcho"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -351,7 +351,7 @@
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0)
allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
species_fit = list("Vox")
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
/obj/item/clothing/head/winterhood
@@ -363,7 +363,7 @@
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags = NODROP|BLOCKHAIR
flags_inv = HIDEEARS
species_fit = list("Vox")
sprite_sheets = list("Vox" = 'icons/mob/species/vox/head.dmi')
/obj/item/clothing/suit/hooded/wintercoat/captain
@@ -474,7 +474,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
allowed = list(/obj/item/flashlight, /obj/item/tank/emergency_oxygen)
hoodtype = /obj/item/clothing/head/hood
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -487,7 +487,7 @@
cold_protection = HEAD
flags = NODROP|BLOCKHAIR
flags_inv = HIDEEARS
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi'
)
@@ -549,7 +549,7 @@
desc = "A worn out, curiously comfortable t-shirt with a picture of Ian. You wouldn't go so far as to say it feels like being hugged when you wear it but it's pretty close. Good for sleeping in."
icon_state = "ianshirt"
item_state = "ianshirt"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -599,7 +599,7 @@
desc = "It makes you stand out. Just the opposite of why it's typically worn. Nice try trying to blend in while wearing it."
icon_state = "brtrenchcoat"
item_state = "brtrenchcoat"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -609,7 +609,7 @@
desc = "That shade of black just makes you look a bit more evil. Good for those mafia types."
icon_state = "bltrenchcoat"
item_state = "bltrenchcoat"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -626,7 +626,7 @@
suit_adjusted = 1
actions_types = list(/datum/action/item_action/openclose)
adjust_flavour = "unzip"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -760,7 +760,7 @@
cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS
actions_types = list(/datum/action/item_action/zipper)
adjust_flavour = "unzip"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -806,7 +806,7 @@
ignore_suitadjust = 0
actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -819,7 +819,7 @@
ignore_suitadjust = 0
actions_types = list(/datum/action/item_action/button)
adjust_flavour = "unbutton"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
+6 -6
View File
@@ -33,7 +33,7 @@
/obj/item/clothing/suit/fire/firefighter
icon_state = "firesuit"
item_state = "firefighter"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -52,7 +52,7 @@
icon_state = "atmos_firesuit"
item_state = "firesuit_atmos"
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -75,7 +75,7 @@
strip_delay = 70
put_on_delay = 70
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/helmet.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi'
@@ -101,7 +101,7 @@
strip_delay = 70
put_on_delay = 70
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -129,7 +129,7 @@
strip_delay = 60
put_on_delay = 60
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi'
@@ -152,7 +152,7 @@
strip_delay = 60
put_on_delay = 60
burn_state = FIRE_PROOF
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -7,9 +7,10 @@
item_color = "bluetie"
slot_flags = SLOT_TIE
w_class = WEIGHT_CLASS_SMALL
var/slot = "decor"
var/slot = ACCESSORY_SLOT_DECOR
var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to
var/image/inv_overlay = null //overlay used when attached to clothing.
var/allow_duplicates = TRUE // Allow accessories of the same type.
/obj/item/clothing/accessory/New()
..()
@@ -117,7 +118,7 @@
icon_state = "waistcoat"
item_state = "waistcoat"
item_color = "waistcoat"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -378,6 +379,31 @@
item_color = "necklace"
slot_flags = SLOT_TIE
/obj/item/clothing/accessory/necklace/dope
name = "gold necklace"
desc = "Damn, it feels good to be a gangster."
icon_state = "bling"
item_state = "bling"
item_color = "bling"
/obj/item/clothing/accessory/necklace/skullcodpiece
name = "skull codpiece"
desc = "A skull shaped ornament, intended to protect the important things in life."
icon_state = "skull"
item_state = "skull"
item_color = "skull"
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5)
allow_duplicates = FALSE
/obj/item/clothing/accessory/necklace/talisman
name = "bone talisman"
desc = "A hunter's talisman, some say the old gods smile on those who wear it."
icon_state = "talisman"
item_state = "talisman"
item_color = "talisman"
armor = list("melee" = 5, "bullet" = 5, "laser" = 5, "energy" = 5, "bomb" = 20, "bio" = 20, "rad" = 5)
allow_duplicates = FALSE
/obj/item/clothing/accessory/necklace/locket
name = "gold locket"
desc = "A gold locket that seems to have space for a photo within."
@@ -436,7 +462,7 @@
icon_state = "cowboyshirt"
item_state = "cowboyshirt"
item_color = "cowboyshirt"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -447,7 +473,7 @@
icon_state = "cowboyshirt_s"
item_state = "cowboyshirt_s"
item_color = "cowboyshirt_s"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -458,7 +484,7 @@
icon_state = "cowboyshirt_white"
item_state = "cowboyshirt_white"
item_color = "cowboyshirt_white"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -469,7 +495,7 @@
icon_state = "cowboyshirt_whites"
item_state = "cowboyshirt_whites"
item_color = "cowboyshirt_whites"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -480,7 +506,7 @@
icon_state = "cowboyshirt_pink"
item_state = "cowboyshirt_pink"
item_color = "cowboyshirt_pink"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -491,7 +517,7 @@
icon_state = "cowboyshirt_pinks"
item_state = "cowboyshirt_pinks"
item_color = "cowboyshirt_pinks"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -502,7 +528,7 @@
icon_state = "cowboyshirt_navy"
item_state = "cowboyshirt_navy"
item_color = "cowboyshirt_navy"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -513,7 +539,7 @@
icon_state = "cowboyshirt_navys"
item_state = "cowboyshirt_navys"
item_color = "cowboyshirt_navys"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -524,7 +550,7 @@
icon_state = "cowboyshirt_red"
item_state = "cowboyshirt_red"
item_color = "cowboyshirt_red"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
@@ -535,7 +561,7 @@
icon_state = "cowboyshirt_reds"
item_state = "cowboyshirt_reds"
item_color = "cowboyshirt_reds"
species_fit = list("Vox", "Drask", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Drask" = 'icons/mob/species/drask/suit.dmi',
@@ -3,7 +3,7 @@
desc = "A fancy red armband!"
icon_state = "red"
item_color = "red"
slot = "armband"
slot = ACCESSORY_SLOT_ARMBAND
/obj/item/clothing/accessory/armband/sec
name = "security armband"
@@ -3,7 +3,7 @@
desc = "A handgun holster."
icon_state = "holster"
item_color = "holster"
slot = "utility"
slot = ACCESSORY_SLOT_UTILITY
var/holster_allow = /obj/item/gun
var/obj/item/gun/holstered = null
actions_types = list(/datum/action/item_action/accessory/holster)
@@ -3,7 +3,7 @@
desc = "Used to hold things when you don't have enough hands."
icon_state = "webbing"
item_color = "webbing"
slot = "utility"
slot = ACCESSORY_SLOT_UTILITY
var/slots = 3
var/obj/item/storage/internal/hold
actions_types = list(/datum/action/item_action/accessory/storage)
@@ -78,7 +78,7 @@
desc = "Sturdy mess of synthcotton belts and buckles, ready to share your burden."
icon_state = "webbing"
item_color = "webbing"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi'
)
+1 -1
View File
@@ -120,7 +120,7 @@
desc = "Groovy!"
icon_state = "psyche"
item_color = "psyche"
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi'
)
@@ -217,6 +217,15 @@
item_color = "miner"
flags_size = ONESIZEFITSALL
/obj/item/clothing/under/rank/miner/lavaland
desc = "A green uniform for operating in hazardous environments."
name = "shaft miner's jumpsuit"
icon_state = "explorer"
item_state = "explorer"
item_color = "explorer"
sprite_sheets = list()
/obj/item/clothing/under/barber
desc = "It's a barber's uniform."
name = "barber's uniform"
+1 -1
View File
@@ -85,7 +85,7 @@
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
flags_size = ONESIZEFITSALL
strip_delay = 50
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/uniform.dmi'
)
@@ -381,6 +381,10 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
burn_state = FIRE_PROOF
/obj/item/clothing/under/gladiator/ash_walker
desc = "This gladiator uniform appears to be covered in ash and fairly dated."
has_sensor = FALSE
//dress
/obj/item/clothing/under/dress/dress_fire
+71
View File
@@ -391,6 +391,77 @@
reqs = list(/obj/item/grown/log = 5)
result = /obj/structure/bonfire
category = CAT_PRIMAL
/datum/crafting_recipe/boneaxe
name = "Bone Axe"
result = /obj/item/twohanded/fireaxe/boneaxe
time = 50
reqs = list(/obj/item/stack/sheet/bone = 6,
/obj/item/stack/sheet/sinew = 3)
category = CAT_PRIMAL
/datum/crafting_recipe/bonespear
name = "Bone Spear"
result = /obj/item/twohanded/spear/bonespear
time = 30
reqs = list(/obj/item/stack/sheet/bone = 4,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bonedagger
name = "Bone Dagger"
result = /obj/item/kitchen/knife/combat/survival/bone
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2)
category = CAT_PRIMAL
/datum/crafting_recipe/bonecodpiece
name = "Skull Codpiece"
result = /obj/item/clothing/accessory/necklace/skullcodpiece
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/animalhide/goliath_hide = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bonetalisman
name = "Bone Talisman"
result = /obj/item/clothing/accessory/necklace/talisman
time = 20
reqs = list(/obj/item/stack/sheet/bone = 2,
/obj/item/stack/sheet/sinew = 1)
category = CAT_PRIMAL
/datum/crafting_recipe/bonearmor
name = "Bone Armor"
result = /obj/item/clothing/suit/armor/bone
time = 30
reqs = list(/obj/item/stack/sheet/bone = 6)
category = CAT_PRIMAL
/datum/crafting_recipe/skullhelm
name = "Skull Helmet"
result = /obj/item/clothing/head/skullhelmet
time = 30
reqs = list(/obj/item/stack/sheet/bone = 4)
category = CAT_PRIMAL
/datum/crafting_recipe/goliathcloak
name = "Goliath Cloak"
result = /obj/item/clothing/suit/hooded/goliath
time = 50
reqs = list(/obj/item/stack/sheet/leather = 2,
/obj/item/stack/sheet/sinew = 2,
/obj/item/stack/sheet/animalhide/goliath_hide = 2)
category = CAT_PRIMAL
/datum/crafting_recipe/drakecloak
name = "Ash Drake Armour"
result = /obj/item/clothing/suit/hooded/drake
time = 60
reqs = list(/obj/item/stack/sheet/bone = 10,
/obj/item/stack/sheet/sinew = 2,
/obj/item/stack/sheet/animalhide/ashdrake = 5)
category = CAT_PRIMAL
/datum/crafting_recipe/guillotine
name = "Guillotine"
+1 -15
View File
@@ -323,7 +323,6 @@
if(!has_action)
new /datum/action/item_action/openclose(jacket)//this actually works
jacket.adjust_flavour = "unbutton"
jacket.species_fit = null
jacket.sprite_sheets = null
user.update_inv_wear_suit()
qdel(src)
@@ -345,7 +344,6 @@
M.desc = "It looks heavily modified, but otherwise functions as a gas mask. The words “Property of Yon-Dale” can be seen on the inner band."
M.icon = 'icons/obj/custom_items.dmi'
M.icon_state = "gas_tariq"
M.species_fit = list("Vulpkanin")
M.sprite_sheets = list(
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
)
@@ -844,7 +842,6 @@
actions_types = list()
ignore_suitadjust = 1
adjust_flavour = null
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.
@@ -934,7 +931,6 @@
desc = "A labcoat with a few markings denoting it as the labcoat of roboticist."
icon = 'icons/obj/custom_items.dmi'
icon_state = "aeneasrinil_open"
species_fit = null
sprite_sheets = null
/obj/item/clothing/suit/jacket/fluff/kidosvest // Anxipal: Kido Qasteth
@@ -946,7 +942,6 @@
ignore_suitadjust = 1
actions_types = list()
adjust_flavour = null
species_fit = null
sprite_sheets = null
/obj/item/clothing/suit/jacket/fluff/jacksvest // Anxipal: Jack Harper
@@ -957,7 +952,6 @@
ignore_suitadjust = TRUE
actions_types = list()
adjust_flavour = null
species_fit = null
sprite_sheets = null
/obj/item/clothing/suit/fluff/kluys // Kluys: Cripty Pandaen
@@ -997,7 +991,6 @@
desc = "A suit that protects against minor chemical spills. Has a red stripe on the shoulders and rolled up sleeves."
icon = 'icons/obj/custom_items.dmi'
icon_state = "labcoat_red_open"
species_fit = null
sprite_sheets = null
/obj/item/clothing/suit/storage/labcoat/fluff/ionward_labcoat // Ionward: Gemini
@@ -1005,7 +998,6 @@
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
@@ -1059,7 +1051,7 @@
desc = "A somewhat worn but well kept set of vox tactical webbing. It has a couple of pouches attached."
icon = 'icons/obj/custom_items.dmi'
icon_state = "k3_webbing"
species_fit = list("Vox")
sprite_sheets = list("Vox" = 'icons/mob/species/vox/suit.dmi')
ignore_suitadjust = 0
actions_types = list(/datum/action/item_action/toggle)
@@ -1338,7 +1330,6 @@
ignore_suitadjust = TRUE
actions_types = list()
adjust_flavour = null
species_fit = null
sprite_sheets = null
/obj/item/clothing/under/fluff/fox
@@ -1481,7 +1472,6 @@
icon = 'icons/obj/clothing/ties.dmi'
icon_state = "vest_black"
item_state = "vest_black"
species_fit = null
sprite_sheets = null
/obj/item/clothing/under/pants/fluff/combat
@@ -1498,7 +1488,6 @@
item_state = "elliot_windbreaker_open"
adjust_flavour = "unzip"
suit_adjusted = 1
species_fit = null
sprite_sheets = null
/obj/item/storage/backpack/fluff/syndiesatchel //SkeletalElite: Rawkkihiki
@@ -1723,7 +1712,6 @@
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"
@@ -1747,7 +1735,6 @@
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"
@@ -1785,4 +1772,3 @@
item_state = "voxbodysuit"
item_color = "voxbodysuit"
body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
species_fit = list("Vox")
-52
View File
@@ -1,52 +0,0 @@
// 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>")
-48
View File
@@ -1,48 +0,0 @@
// 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>")
+6 -6
View File
@@ -13,11 +13,11 @@
if(candidates.len >= 2)
//Oh god why we can't have static functions
var/number = ticker.mode.abductor_teams + 1
var/number = SSticker.mode.abductor_teams + 1
var/datum/game_mode/abduction/temp
if(ticker.mode.config_tag == "abduction")
temp = ticker.mode
if(SSticker.mode.config_tag == "abduction")
temp = SSticker.mode
else
temp = new
@@ -42,10 +42,10 @@
temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind)
temp.post_setup_team(number)
ticker.mode.abductor_teams++
SSticker.mode.abductor_teams++
if(ticker.mode.config_tag != "abduction")
ticker.mode.abductors |= temp.abductors
if(SSticker.mode.config_tag != "abduction")
SSticker.mode.abductors |= temp.abductors
processing = 1 //So it will get gc'd
return 1
else
+2 -2
View File
@@ -27,8 +27,8 @@
GLOB.respawnable_list -= C.client
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
new_xeno.key = C.key
if(ticker && ticker.mode)
ticker.mode.xenos += new_xeno.mind
if(SSticker && SSticker.mode)
SSticker.mode.xenos += new_xeno.mind
spawncount--
successSpawn = 1
+1 -2
View File
@@ -23,6 +23,5 @@
var/mob/M = pick(candidates)
B.key = M.key
to_chat(B, "<span class='userdanger'>You are now a mouse, infected with blob spores. Find somewhere isolated... before you burst and become the blob! Use ventcrawl (alt-click on vents) to move around.</span>")
var/image/alert_overlay = image('icons/mob/blob.dmi', "blank_blob")
notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B, alert_overlay = alert_overlay)
notify_ghosts("Infected Mouse has appeared in [get_area(B)].", source = B)
processing = TRUE // Let it naturally end, if it runs successfully
+19 -17
View File
@@ -34,7 +34,6 @@
qdel(O)
wormholes.Cut()
/obj/effect/portal/wormhole
name = "wormhole"
desc = "It looks highly unstable; It could close at any moment."
@@ -42,23 +41,26 @@
icon_state = "anom"
failchance = 0
/obj/effect/portal/wormhole/attack_hand(mob/user)
teleport(user)
/obj/effect/portal/wormhole/can_teleport(atom/movable/M)
. = ..()
/obj/effect/portal/wormhole/attackby(obj/item/I, mob/user, params)
teleport(user)
if(istype(M, /obj/singularity))
. = FALSE
/obj/effect/portal/wormhole/teleport(atom/movable/M)
if(istype(M, /obj/effect)) //sparks don't teleport
return
if(M.anchored && istype(M, /obj/mecha))
return
if(!can_teleport(M))
return FALSE
if(istype(M, /atom/movable))
var/turf/target
if(GLOB.portals.len)
var/obj/effect/portal/P = pick(GLOB.portals)
if(P && isturf(P.loc))
target = P.loc
if(!target) return
do_teleport(M, target, 1, 1, 0, 0) ///You will appear adjacent to the beacon
var/turf/target
if(GLOB.portals.len)
var/obj/effect/portal/P = pick(GLOB.portals)
if(P && isturf(P.loc))
target = P.loc
if(!target)
return FALSE
if(!do_teleport(M, target, 1, TRUE)) ///You will appear adjacent to the beacon
return FALSE
return TRUE
-17
View File
@@ -19,20 +19,3 @@
if(config.admin_irc)
send2irc(config.admin_irc, msg)
return
/hook/startup/proc/ircNotify()
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
@@ -354,31 +354,6 @@
icon_state = "goonbag"
list_reagents = list("wine" = 70)
/obj/item/reagent_containers/food/drinks/waterbottle
name = "bottle of water"
desc = "A bottle of water filled at an old Earth bottling facility."
icon = 'icons/obj/drinks.dmi'
icon_state = "smallbottle"
item_state = "bottle"
list_reagents = list("water" = 49.5, "fluorine" = 0.5) //see desc, don't think about it too hard
materials = list(MAT_GLASS = 0)
volume = 50
amount_per_transfer_from_this = 10
/obj/item/reagent_containers/food/drinks/waterbottle/empty
list_reagents = list()
/obj/item/reagent_containers/food/drinks/waterbottle/large
desc = "A fresh commercial-sized bottle of water."
icon_state = "largebottle"
materials = list(MAT_GLASS = 0)
list_reagents = list("water" = 100)
volume = 100
amount_per_transfer_from_this = 20
/obj/item/reagent_containers/food/drinks/waterbottle/large/empty
list_reagents = list()
/obj/item/reagent_containers/food/drinks/oilcan
name = "oil can"
desc = "Contains oil intended for use on cyborgs, robots, and other synthetics."
@@ -125,6 +125,17 @@
icon_state = "spidereggs"
list_reagents = list("protein" = 2, "toxin" = 2)
/obj/item/reagent_containers/food/snacks/goliath
name = "goliath meat"
desc = "A slab of goliath meat. It's not very edible now, but it cooks great in lava."
icon_state = "goliathmeat"
list_reagents = list("protein" = 3, "toxin" = 5)
/obj/item/reagent_containers/food/snacks/goliath/burn()
visible_message("[src] finishes cooking!")
new /obj/item/reagent_containers/food/snacks/goliath_steak(loc)
qdel(src)
//////////////////////
// Cooked Meat //
//////////////////////
@@ -205,6 +216,13 @@
filling_color = "#43DE18"
list_reagents = list("nutriment" = 6, "soysauce" = 5, "vitamin" = 2)
/obj/item/reagent_containers/food/snacks/goliath_steak
name = "goliath steak"
desc = "A delicious, lava cooked steak."
resistance_flags = LAVA_PROOF | FIRE_PROOF
icon_state = "goliathsteak"
trash = null
list_reagents = list("protein" = 6, "vitamin" = 2)
//////////////////////
// Cubes //
@@ -216,11 +234,13 @@
icon_state = "monkeycube"
bitesize = 12
filling_color = "#ADAC7F"
var/faction
var/datum/species/monkey_type = /datum/species/monkey
list_reagents = list("nutriment" = 2)
/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
if(volume >= 5)
/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature, source, method = TOUCH)
. = ..()
if(volume >= 1)
return Expand()
/obj/item/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source)
@@ -236,11 +256,16 @@
else
log_game("Cube ([monkey_type]) inflated, last touched by: NO_DATA")
var/mob/living/carbon/human/creature = new /mob/living/carbon/human(get_turf(src))
if(faction)
creature.faction = faction
if(LAZYLEN(fingerprintshidden))
creature.fingerprintshidden = fingerprintshidden.Copy()
creature.set_species(monkey_type)
qdel(src)
/obj/item/reagent_containers/food/snacks/monkeycube/syndicate
faction = list("neutral", "syndicate")
/obj/item/reagent_containers/food/snacks/monkeycube/farwacube
name = "farwa cube"
monkey_type = /datum/species/monkey/tajaran
@@ -11,17 +11,15 @@
idle_power_usage = 5
active_power_usage = 100
var/max_n_of_items = 1500
var/icon_on = "smartfridge"
var/icon_off = "smartfridge-off"
var/icon_panel = "smartfridge-panel"
var/item_quants = list()
var/seconds_electrified = 0;
var/shoot_inventory = 0
var/locked = 0
var/scan_id = 1
var/is_secure = 0
var/seconds_electrified = 0
var/shoot_inventory = FALSE
var/locked = FALSE
var/scan_id = TRUE
var/is_secure = FALSE
var/can_dry = FALSE
var/drying = FALSE
var/visible_contents = TRUE
var/datum/wires/smartfridge/wires = null
/obj/machinery/smartfridge/New()
@@ -65,8 +63,6 @@
desc = "When you need seeds fast!"
icon = 'icons/obj/vending.dmi'
icon_state = "seeds"
icon_on = "seeds"
icon_off = "seeds-off"
/obj/machinery/smartfridge/seeds/accept_check(obj/item/O)
if(istype(O,/obj/item/seeds/))
@@ -77,7 +73,6 @@
name = "\improper Refrigerated Medicine Storage"
desc = "A refrigerated storage unit for storing medicine and chemicals."
icon_state = "smartfridge" //To fix the icon in the map editor.
icon_on = "smartfridge_chem"
/obj/machinery/smartfridge/medbay/accept_check(obj/item/O)
if(istype(O,/obj/item/reagent_containers/glass))
@@ -104,7 +99,6 @@
name = "\improper Secure Refrigerated Medicine Storage"
desc = "A refrigerated storage unit for storing medicine and chemicals."
icon_state = "smartfridge" //To fix the icon in the map editor.
icon_on = "smartfridge_chem"
req_one_access_txt = "5;33"
/obj/machinery/smartfridge/secure/medbay/accept_check(obj/item/O)
@@ -122,7 +116,6 @@
name = "\improper Smart Chemical Storage"
desc = "A refrigerated storage unit for medicine and chemical storage."
icon_state = "smartfridge" //To fix the icon in the map editor.
icon_on = "smartfridge_chem"
req_access_txt = "33"
var/list/spawn_meds = list()
@@ -139,12 +132,33 @@
item_quants[I.name] = 1
SSnanoui.update_uis(src)
amount--
update_icon()
/obj/machinery/smartfridge/chemistry/accept_check(obj/item/O)
/obj/machinery/smartfridge/secure/chemistry/accept_check(obj/item/O)
if(istype(O,/obj/item/storage/pill_bottle) || istype(O,/obj/item/reagent_containers))
return 1
return 0
/obj/machinery/smartfridge/secure/chemistry/preloaded
spawn_meds = list(
/obj/item/reagent_containers/food/pill/epinephrine = 12,
/obj/item/reagent_containers/food/pill/charcoal = 5,
/obj/item/reagent_containers/glass/bottle/epinephrine = 1,
/obj/item/reagent_containers/glass/bottle/charcoal = 1)
/obj/machinery/smartfridge/secure/chemistry/preloaded/syndicate
req_access_txt = null
req_access = list(access_syndicate)
/obj/machinery/smartfridge/disks
name = "disk compartmentalizer"
desc = "A machine capable of storing a variety of disks. Denoted by most as the DSU (disk storage unit)."
icon_state = "disktoaster"
pass_flags = PASSTABLE
visible_contents = FALSE
/obj/machinery/smartfridge/disks/accept_check(obj/item/O)
return istype(O, /obj/item/disk)
// ----------------------------
// Virology Medical Smartfridge
@@ -165,6 +179,20 @@
return 1
return 0
/obj/machinery/smartfridge/secure/chemistry/virology/preloaded
spawn_meds = list(
/obj/item/reagent_containers/syringe/antiviral = 4,
/obj/item/reagent_containers/glass/bottle/cold = 1,
/obj/item/reagent_containers/glass/bottle/flu_virion = 1,
/obj/item/reagent_containers/glass/bottle/mutagen = 1,
/obj/item/reagent_containers/glass/bottle/plasma = 1,
/obj/item/reagent_containers/glass/bottle/reagent/synaptizine = 1,
/obj/item/reagent_containers/glass/bottle/reagent/formaldehyde = 1)
/obj/machinery/smartfridge/secure/chemistry/virology/preloaded/syndicate
req_access_txt = null
req_access = list(access_syndicate)
/obj/machinery/smartfridge/drinks
name = "\improper Drink Showcase"
desc = "A refrigerated storage unit for tasty tasty alcohol."
@@ -189,10 +217,19 @@
/obj/machinery/smartfridge/update_icon()
if(stat & (BROKEN|NOPOWER))
icon_state = icon_off
icon_state = "[initial(icon_state)]-off"
else if(visible_contents)
switch(contents.len)
if(0)
icon_state = "[initial(icon_state)]"
if(1 to 25)
icon_state = "[initial(icon_state)]1"
if(26 to 75)
icon_state = "[initial(icon_state)]2"
if(76 to INFINITY)
icon_state = "[initial(icon_state)]3"
else
icon_state = icon_on
icon_state = "[initial(icon_state)]"
/*******************
* Item Adding
@@ -231,6 +268,7 @@
if(load(O, user))
user.visible_message("<span class='notice'>[user] has added \the [O] to \the [src].</span>", "<span class='notice'>You add \the [O] to \the [src].</span>")
SSnanoui.update_uis(src)
update_icon()
else if(istype(O, /obj/item/storage/bag))
var/obj/item/storage/bag/P = O
@@ -244,6 +282,7 @@
to_chat(user, "<span class='notice'>Some items are refused.</span>")
SSnanoui.update_uis(src)
update_icon()
else if(!istype(O, /obj/item/card/emag))
to_chat(user, "<span class='notice'>\The [src] smartly refuses [O].</span>")
@@ -373,6 +412,7 @@
for(var/obj/O in contents)
if(O.name == K)
O.forceMove(loc)
adjust_item_drop_location(O)
update_icon()
i--
if(i <= 0)
@@ -413,13 +453,12 @@
name = "drying rack"
desc = "A wooden contraption, used to dry plant products, food and leather."
icon = 'icons/obj/hydroponics/equipment.dmi'
icon_state = "drying_rack_on"
icon_state = "drying_rack"
use_power = IDLE_POWER_USE
idle_power_usage = 5
active_power_usage = 200
icon_on = "drying_rack_on"
icon_off = "drying_rack"
can_dry = TRUE
visible_contents = FALSE
/obj/machinery/smartfridge/drying_rack/New()
..()
@@ -477,6 +516,7 @@
/obj/machinery/smartfridge/drying_rack/update_icon()
..()
overlays.Cut()
if(drying)
overlays += "drying_rack_drying"
@@ -227,6 +227,12 @@
)
result = /obj/item/reagent_containers/food/snacks/sushi_Tai
/datum/recipe/grill/goliath
items = list(
/obj/item/reagent_containers/food/snacks/goliath
)
result = /obj/item/reagent_containers/food/snacks/goliath_steak
/datum/recipe/grill/shrimp_skewer
items = list(
/obj/item/reagent_containers/food/snacks/shrimp,
@@ -244,4 +250,4 @@
/obj/item/reagent_containers/food/snacks/salmonmeat,
/obj/item/stack/rods,
)
result = /obj/item/reagent_containers/food/snacks/fish_skewer
result = /obj/item/reagent_containers/food/snacks/fish_skewer
@@ -13,5 +13,5 @@
icon_state = "beekeeper"
item_state = "beekeeper"
flags = THICKMATERIAL
allowed = list (/obj/item/reagent_containers/spray,/obj/item/plant_analyzer,/obj/item/seeds,/obj/item/reagent_containers/glass/bottle,/obj/item/cultivator)
allowed = list(/obj/item/melee/flyswatter, /obj/item/reagent_containers/spray, /obj/item/plant_analyzer, /obj/item/seeds, /obj/item/reagent_containers/glass/bottle, /obj/item/cultivator)
+10
View File
@@ -32,6 +32,16 @@
component_parts += new /obj/item/stock_parts/manipulator(null)
RefreshParts()
/obj/machinery/plantgenes/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/plantgenes(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new /obj/item/stock_parts/scanning_module/phasic(null)
component_parts += new /obj/item/stock_parts/micro_laser/ultra(null)
component_parts += new /obj/item/stock_parts/manipulator/pico(null)
RefreshParts()
/obj/machinery/plantgenes/Destroy()
core_genes.Cut()
reagent_genes.Cut()
@@ -112,6 +112,9 @@
var/burning = 0
var/fire_stack_strength = 5
/obj/structure/bonfire/dense
density = TRUE
/obj/structure/bonfire/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stack/rods) && !can_buckle)
var/obj/item/stack/rods/R = W
+1 -1
View File
@@ -59,7 +59,7 @@ var/list/karma_spenders = list()
if(config.disable_karma)
to_chat(src, "<span class='warning'>Karma is disabled.</span>")
return FALSE
if(!ticker || !GLOB.player_list.len || (ticker.current_state == GAME_STATE_PREGAME))
if(!SSticker || !GLOB.player_list.len || (SSticker.current_state == GAME_STATE_PREGAME))
to_chat(src, "<span class='warning'>You can't award karma until the game has started.</span>")
return FALSE
if(client.karma_spent || (ckey in karma_spenders))
+5 -5
View File
@@ -320,11 +320,11 @@
if(!bibledelay)
var/obj/item/storage/bible/B = new /obj/item/storage/bible(src.loc)
if(ticker && ( ticker.Bible_icon_state && ticker.Bible_item_state) )
B.icon_state = ticker.Bible_icon_state
B.item_state = ticker.Bible_item_state
B.name = ticker.Bible_name
B.deity_name = ticker.Bible_deity_name
if(SSticker && ( SSticker.Bible_icon_state && SSticker.Bible_item_state) )
B.icon_state = SSticker.Bible_icon_state
B.item_state = SSticker.Bible_item_state
B.name = SSticker.Bible_name
B.deity_name = SSticker.Bible_deity_name
bibledelay = 1
spawn(60)
+85
View File
@@ -0,0 +1,85 @@
/obj/item/book/manual/random
icon_state = "random_book"
/obj/item/book/manual/random/New()
..()
var/static/banned_books = list(/obj/item/book/manual/random, /obj/item/book/manual/nuclear)
var/newtype = pick(subtypesof(/obj/item/book/manual) - banned_books)
new newtype(loc)
qdel(src)
/obj/item/book/random
icon_state = "random_book"
var/amount = 1
var/category = null
/obj/item/book/random/Initialize()
..()
create_random_books(amount, src.loc, TRUE, category)
qdel(src)
/obj/item/book/random/triple
amount = 3
/obj/structure/bookcase/random
var/category = null
var/book_count = 2
icon_state = "random_bookcase"
anchored = TRUE
/obj/structure/bookcase/random/New()
. = ..()
if(!book_count || !isnum(book_count))
update_icon()
return
book_count += pick(-1,-1,0,1,1)
create_random_books(book_count, src, FALSE, category)
update_icon()
/proc/create_random_books(amount = 2, location, fail_loud = FALSE, category = null)
. = list()
if(!isnum(amount) || amount<1)
return
if(!dbcon.IsConnected())
if(fail_loud || prob(5))
var/obj/item/paper/P = new(location)
P.info = "There once was a book from Nantucket<br>But the database failed us, so f*$! it.<br>I tried to be good to you<br>Now this is an I.O.U<br>If you're feeling entitled, well, stuff it!<br><br><font color='gray'>~</font>"
P.update_icon()
return
if(prob(25))
category = null
var/c = category? " AND category='[sanitizeSQL(category)]'" :""
var/DBQuery/query_get_random_books = dbcon.NewQuery("SELECT * FROM [format_table_name("library")] WHERE (isnull(flagged) OR flagged = 0)[c] GROUP BY title ORDER BY rand() LIMIT [amount];")
query_get_random_books.Execute()
while(query_get_random_books.NextRow())
var/obj/item/book/B = new(location)
. += B
B.author = query_get_random_books.item[2]
B.title = query_get_random_books.item[3]
B.dat = query_get_random_books.item[4]
B.name = "Book: [B.title]"
B.icon_state= "book[rand(1,8)]"
/obj/structure/bookcase/random/fiction
name = "bookcase (Fiction)"
category = "Fiction"
/obj/structure/bookcase/random/nonfiction
name = "bookcase (Non-Fiction)"
category = "Non-fiction"
/obj/structure/bookcase/random/religion
name = "bookcase (Religion)"
category = "Religion"
/obj/structure/bookcase/random/adult
name = "bookcase (Adult)"
category = "Adult"
/obj/structure/bookcase/random/reference
name = "bookcase (Reference)"
category = "Reference"
var/ref_book_prob = 20
/obj/structure/bookcase/random/reference/Initialize(mapload)
. = ..()
while(book_count > 0 && prob(ref_book_prob))
book_count--
new /obj/item/book/manual/random(src)
@@ -0,0 +1,138 @@
/*****************Marker Beacons**************************/
GLOBAL_LIST_INIT(marker_beacon_colors, list(
"Random" = FALSE, //not a true color, will pick a random color
"Burgundy" = LIGHT_COLOR_FLARE,
"Bronze" = LIGHT_COLOR_ORANGE,
"Yellow" = LIGHT_COLOR_YELLOW,
"Lime" = LIGHT_COLOR_SLIME_LAMP,
"Olive" = LIGHT_COLOR_GREEN,
"Jade" = LIGHT_COLOR_BLUEGREEN,
"Teal" = LIGHT_COLOR_LIGHT_CYAN,
"Cerulean" = LIGHT_COLOR_BLUE,
"Indigo" = LIGHT_COLOR_DARK_BLUE,
"Purple" = LIGHT_COLOR_PURPLE,
"Violet" = LIGHT_COLOR_LAVENDER,
"Fuchsia" = LIGHT_COLOR_PINK))
/obj/item/stack/marker_beacon
name = "marker beacon"
singular_name = "marker beacon"
desc = "Prism-brand path illumination devices. Used by miners to mark paths and warn of danger."
icon = 'icons/obj/lighting.dmi'
icon_state = "marker"
merge_type = /obj/item/stack/marker_beacon
max_amount = 100
var/picked_color = "random"
/obj/item/stack/marker_beacon/ten //miners start with 10 of these
amount = 10
/obj/item/stack/marker_beacon/thirty //and they're bought in stacks of 1, 10, or 30
amount = 30
/obj/item/stack/marker_beacon/Initialize(mapload)
. = ..()
update_icon()
/obj/item/stack/marker_beacon/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Use in-hand to place a [singular_name].</span>")
to_chat(user, "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>")
/obj/item/stack/marker_beacon/update_icon()
icon_state = "[initial(icon_state)][lowertext(picked_color)]"
/obj/item/stack/marker_beacon/attack_self(mob/user)
if(!isturf(user.loc))
to_chat(user, "<span class='warning'>You need more space to place a [singular_name] here.</span>")
return
if(locate(/obj/structure/marker_beacon) in user.loc)
to_chat(user, "<span class='warning'>There is already a [singular_name] here.</span>")
return
if(use(1))
to_chat(user, "<span class='notice'>You activate and anchor [amount ? "a":"the"] [singular_name] in place.</span>")
playsound(user, 'sound/machines/click.ogg', 50, 1)
var/obj/structure/marker_beacon/M = new(user.loc, picked_color)
transfer_fingerprints_to(M)
/obj/item/stack/marker_beacon/AltClick(mob/living/user)
if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE)
return
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors
if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE)
return
if(input_color)
picked_color = input_color
update_icon()
/obj/structure/marker_beacon
name = "marker beacon"
desc = "A Prism-brand path illumination device. It is anchored in place and glowing steadily."
icon = 'icons/obj/lighting.dmi'
icon_state = "marker"
layer = BELOW_OPEN_DOOR_LAYER
armor = list("melee" = 50, "bullet" = 75, "laser" = 75, "energy" = 75, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 25, "acid" = 0)
max_integrity = 50
anchored = TRUE
light_range = 2
light_power = 3
var/remove_speed = 15
var/picked_color
/obj/structure/marker_beacon/Initialize(mapload, set_color)
. = ..()
picked_color = set_color
update_icon()
/obj/structure/marker_beacon/deconstruct(disassembled = TRUE)
if(can_deconstruct)
var/obj/item/stack/marker_beacon/M = new(loc)
M.picked_color = picked_color
M.update_icon()
qdel(src)
/obj/structure/marker_beacon/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Alt-click to select a color. Current color is [picked_color].</span>")
/obj/structure/marker_beacon/update_icon()
while(!picked_color || !GLOB.marker_beacon_colors[picked_color])
picked_color = pick(GLOB.marker_beacon_colors)
icon_state = "[initial(icon_state)][lowertext(picked_color)]-on"
set_light(light_range, light_power, GLOB.marker_beacon_colors[picked_color])
/obj/structure/marker_beacon/attack_hand(mob/living/user)
. = ..()
if(.)
return
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
if(do_after(user, remove_speed, target = src))
var/obj/item/stack/marker_beacon/M = new(loc)
M.picked_color = picked_color
M.update_icon()
transfer_fingerprints_to(M)
if(user.put_in_hands(M, TRUE)) //delete the beacon if it fails
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
qdel(src) //otherwise delete us
/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stack/marker_beacon))
var/obj/item/stack/marker_beacon/M = I
to_chat(user, "<span class='notice'>You start picking [src] up...</span>")
if(do_after(user, remove_speed, target = src) && M.amount + 1 <= M.max_amount)
M.add(1)
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
qdel(src)
return
return ..()
/obj/structure/marker_beacon/AltClick(mob/living/user)
..()
if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE)
return
var/input_color = input(user, "Choose a color.", "Beacon Color") as null|anything in GLOB.marker_beacon_colors
if(!istype(user) || CanUseTopic(user, physical_state) != STATUS_INTERACTIVE)
return
if(input_color)
picked_color = input_color
update_icon()
@@ -0,0 +1,357 @@
/area/survivalpod
name = "\improper Emergency Shelter"
icon_state = "away"
requires_power = FALSE
has_gravity = TRUE
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
/obj/item/survivalcapsule
name = "bluespace shelter capsule"
desc = "An emergency shelter stored within a pocket of bluespace."
icon_state = "capsule"
icon = 'icons/obj/mining.dmi'
w_class = WEIGHT_CLASS_TINY
origin_tech = "engineering=3;bluespace=3"
var/template_id = "shelter_alpha"
var/datum/map_template/shelter/template
var/used = FALSE
/obj/item/survivalcapsule/proc/get_template()
if(template)
return
template = shelter_templates[template_id]
if(!template)
log_runtime("Shelter template ([template_id]) not found!", src)
qdel(src)
/obj/item/survivalcapsule/examine(mob/user)
. = ..()
get_template()
to_chat(user, "This capsule has the [template.name] stored.")
to_chat(user, template.description)
/obj/item/survivalcapsule/attack_self()
// Can't grab when capsule is New() because templates aren't loaded then
get_template()
if(used == FALSE)
loc.visible_message("<span class='warning'>[src] begins to shake. Stand back!</span>")
used = TRUE
sleep(50)
var/turf/deploy_location = get_turf(src)
var/status = template.check_deploy(deploy_location)
switch(status)
if(SHELTER_DEPLOY_BAD_AREA)
loc.visible_message("<span class='warning'>[src] will not function in this area.</span>")
if(SHELTER_DEPLOY_BAD_TURFS, SHELTER_DEPLOY_ANCHORED_OBJECTS)
var/width = template.width
var/height = template.height
loc.visible_message("<span class='warning'>[src] doesn't have room to deploy! You need to clear a [width]x[height] area!</span>")
if(status != SHELTER_DEPLOY_ALLOWED)
used = FALSE
return
playsound(get_turf(src), 'sound/effects/phasein.ogg', 100, 1)
var/turf/T = deploy_location
if(!is_mining_level(T.z))//only report capsules away from the mining/lavaland level
message_admins("[key_name_admin(usr)] ([ADMIN_QUE(usr,"?")]) ([ADMIN_FLW(usr,"FLW")]) activated a bluespace capsule away from the mining level! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)")
log_admin("[key_name(usr)] activated a bluespace capsule away from the mining level at [T.x], [T.y], [T.z]")
template.load(deploy_location, centered = TRUE)
new /obj/effect/particle_effect/smoke(get_turf(src))
qdel(src)
/obj/item/survivalcapsule/luxury
name = "luxury bluespace shelter capsule"
desc = "An exorbitantly expensive luxury suite stored within a pocket of bluespace."
origin_tech = "engineering=3;bluespace=4"
template_id = "shelter_beta"
//Pod turfs and objects
//Window
/obj/structure/window/shuttle/survival_pod
name = "pod window"
icon = 'icons/obj/smooth_structures/pod_window.dmi'
icon_state = "smooth"
dir = FULLTILE_WINDOW_DIR
max_integrity = 100
fulltile = TRUE
reinf = TRUE
heat_resistance = 1600
armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 100, "rad" = 100)
smooth = SMOOTH_MORE
canSmoothWith = list(/turf/simulated/wall/mineral/titanium/survival, /obj/machinery/door/airlock/survival_pod, /obj/structure/window/shuttle/survival_pod)
explosion_block = 3
level = 3
glass_type = /obj/item/stack/sheet/titaniumglass
glass_amount = 2
/obj/structure/window/reinforced/survival_pod
name = "pod window"
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "pwindow"
//Floors
/turf/simulated/floor/pod
name = "pod floor"
icon_state = "podfloor"
icon_regular_floor = "podfloor"
floor_tile = /obj/item/stack/tile/pod
/turf/simulated/floor/pod/light
icon_state = "podfloor_light"
icon_regular_floor = "podfloor_light"
floor_tile = /obj/item/stack/tile/pod/light
/turf/simulated/floor/pod/dark
icon_state = "podfloor_dark"
icon_regular_floor = "podfloor_dark"
floor_tile = /obj/item/stack/tile/pod/dark
//Door
/obj/machinery/door/airlock/survival_pod
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
assemblytype = /obj/structure/door_assembly/door_assembly_pod
/obj/machinery/door/airlock/survival_pod/glass
opacity = FALSE
glass = TRUE
/obj/structure/door_assembly/door_assembly_pod
name = "pod airlock assembly"
icon = 'icons/obj/doors/airlocks/survival/survival.dmi'
base_name = "pod airlock"
overlays_file = 'icons/obj/doors/airlocks/survival/survival_overlays.dmi'
airlock_type = /obj/machinery/door/airlock/survival_pod
glass_type = /obj/machinery/door/airlock/survival_pod/glass
//Windoor
/obj/machinery/door/window/survival_pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "windoor"
base_state = "windoor"
//Table
/obj/structure/table/survival_pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "table"
smooth = SMOOTH_FALSE
//Sleeper
/obj/machinery/sleeper/survival_pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "sleeper-open"
density = FALSE
/obj/machinery/sleeper/survival_pod/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/sleeper/survival(null)
var/obj/item/stock_parts/matter_bin/B = new(null)
B.rating = initial_bin_rating
component_parts += B
component_parts += new /obj/item/stock_parts/manipulator(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null, 1)
RefreshParts()
//NanoMed
/obj/machinery/vending/wallmed1/survival_pod
name = "survival pod medical supply"
desc = "Wall-mounted Medical Equipment dispenser. This one seems just a tiny bit smaller."
req_access = list()
refill_canister = null
products = list(/obj/item/reagent_containers/food/pill/patch/styptic = 5,
/obj/item/reagent_containers/food/pill/patch/silver_sulf = 5,
/obj/item/reagent_containers/food/pill/charcoal = 2,
/obj/item/stack/medical/bruise_pack/advanced = 1,
/obj/item/stack/medical/ointment/advanced = 1,
/obj/item/reagent_containers/hypospray/autoinjector = 2,
/obj/item/stack/medical/splint = 1)
contraband = list(/obj/item/reagent_containers/food/pill/tox = 2,
/obj/item/reagent_containers/food/pill/morphine = 2)
//Computer
/obj/item/gps/computer
name = "pod computer"
icon_state = "pod_computer"
icon = 'icons/obj/lavaland/pod_computer.dmi'
anchored = 1
density = 1
pixel_y = -32
/obj/item/gps/computer/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/wrench))
playsound(loc, W.usesound, 50, 1)
user.visible_message("<span class='warning'>[user] disassembles the gps.</span>", \
"<span class='notice'>You start to disassemble the gps...</span>", "You hear clanking and banging noises.")
if(do_after(user, 20 * W.toolspeed, target = src))
new /obj/item/gps(loc)
qdel(src)
return ..()
/obj/item/gps/computer/attack_hand(mob/user)
attack_self(user)
//Bed
/obj/structure/bed/pod
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "bed"
//Survival Storage Unit
/obj/machinery/smartfridge/survival_pod
name = "survival pod storage"
desc = "A heated storage unit."
icon_state = "donkvendor"
icon = 'icons/obj/lavaland/donkvendor.dmi'
light_range = 8
light_power = 1.2
light_color = "#DDFFD3"
max_n_of_items = 10
pixel_y = -4
can_deconstruct = FALSE
var/empty = FALSE
/obj/machinery/smartfridge/survival_pod/Initialize(mapload)
. = ..()
if(empty)
return
for(var/i in 1 to 5)
var/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak/W = new(src)
load(W)
if(prob(50))
var/obj/item/storage/pill_bottle/dice/D = new(src)
load(D)
else
var/obj/item/instrument/guitar/G = new(src)
load(G)
/obj/machinery/smartfridge/survival_pod/update_icon()
return
/obj/machinery/smartfridge/survival_pod/accept_check(obj/item/O)
return isitem(O)
/obj/machinery/smartfridge/survival_pod/empty
name = "dusty survival pod storage"
desc = "A heated storage unit. This one's seen better days."
empty = TRUE
//Fans
/obj/structure/fans
icon = 'icons/obj/lavaland/survival_pod.dmi'
icon_state = "fans"
name = "environmental regulation system"
desc = "A large machine releasing a constant gust of air."
anchored = 1
density = 1
var/arbitraryatmosblockingvar = 1
var/buildstacktype = /obj/item/stack/sheet/metal
var/buildstackamount = 5
/obj/structure/fans/Initialize(loc)
..()
air_update_turf(1)
/obj/structure/fans/Destroy()
arbitraryatmosblockingvar = 0
air_update_turf(1)
return ..()
/obj/structure/fans/CanAtmosPass(turf/T)
return !arbitraryatmosblockingvar
/obj/structure/fans/deconstruct()
if(buildstacktype)
new buildstacktype(loc, buildstackamount)
qdel(src)
/obj/structure/fans/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/wrench))
playsound(loc, W.usesound, 50, 1)
user.visible_message("<span class='warning'>[user] disassembles the fan.</span>", \
"<span class='notice'>You start to disassemble the fan...</span>", "You hear clanking and banging noises.")
if(do_after(user, 20 * W.toolspeed, target = src))
deconstruct()
return ..()
/obj/structure/fans/tiny
name = "tiny fan"
desc = "A tiny fan, releasing a thin gust of air."
layer = TURF_LAYER+0.1
density = 0
icon_state = "fan_tiny"
buildstackamount = 2
/obj/structure/fans/tiny/invisible
name = "air flow blocker"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF
unacidable = TRUE
invisibility = INVISIBILITY_ABSTRACT
//Signs
/obj/structure/sign/mining
name = "nanotrasen mining corps sign"
desc = "A sign of relief for weary miners, and a warning for would-be competitors to Nanotrasen's mining claims."
icon = 'icons/turf/walls/survival_pod_walls.dmi'
icon_state = "ntpod"
/obj/structure/sign/mining/survival
name = "shelter sign"
desc = "A high visibility sign designating a safe shelter."
icon = 'icons/turf/walls/survival_pod_walls.dmi'
icon_state = "survival"
//Fluff
/obj/structure/tubes
icon_state = "tubes"
icon = 'icons/obj/lavaland/survival_pod.dmi'
name = "tubes"
anchored = 1
layer = MOB_LAYER - 0.2
density = 0
/obj/structure/tubes/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/wrench))
playsound(loc, W.usesound, 50, 1)
user.visible_message("<span class='warning'>[user] disassembles [src].</span>", \
"<span class='notice'>You start to disassemble [src]...</span>", "You hear clanking and banging noises.")
if(do_after(user, 20 * W.toolspeed, target = src))
new /obj/item/stack/rods(loc)
qdel(src)
return ..()
/obj/item/fakeartefact
name = "expensive forgery"
icon = 'icons/mob/screen_gen.dmi'
icon_state = "x2"
var/possible = list(/obj/item/ship_in_a_bottle,
/obj/item/gun/energy/pulse,
/obj/item/sleeping_carp_scroll,
/obj/item/shield/changeling,
/obj/item/lava_staff,
/obj/item/katana/energy,
/obj/item/hierophant_staff,
/obj/item/storage/toolbox/green/memetic,
/obj/item/gun/projectile/automatic/l6_saw,
/obj/item/gun/magic/staff/chaos,
/obj/item/gun/magic/staff/spellblade,
/obj/item/gun/magic/wand/death,
/obj/item/gun/magic/wand/fireball,
/obj/item/stack/telecrystal/twenty,
/obj/item/banhammer)
/obj/item/fakeartefact/New()
. = ..()
var/obj/item/I = pick(possible)
name = initial(I.name)
icon = initial(I.icon)
desc = initial(I.desc)
icon_state = initial(I.icon_state)
item_state = initial(I.item_state)
+164 -111
View File
@@ -401,44 +401,53 @@
anchored = 1.0
var/obj/item/card/id/inserted_id
var/list/prize_list = list(
new /datum/data/mining_equipment("Stimpack", /obj/item/reagent_containers/hypospray/autoinjector/stimpack, 50),
new /datum/data/mining_equipment("Teporone MediPen", /obj/item/reagent_containers/hypospray/autoinjector/teporone, 50),
new /datum/data/mining_equipment("MediPen Bundle", /obj/item/storage/box/autoinjector/utility, 200),
new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 400),
new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/hivelordstabilizer, 400),
new /datum/data/mining_equipment("Mining Drone", /obj/item/mining_drone_cube, 500),
new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
new /datum/data/mining_equipment("Drone Health Upgrade",/obj/item/mine_bot_upgrade/health, 400),
new /datum/data/mining_equipment("Drone Ranged Upgrade",/obj/item/mine_bot_upgrade/cooldown, 600),
new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/mining_hammer, 750),
new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 600),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800),
new /datum/data/mining_equipment("Lazarus Capsule belt",/obj/item/storage/belt/lazarus, 200),
new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000),
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
new /datum/data/mining_equipment("Stimpack", /obj/item/reagent_containers/hypospray/autoinjector/stimpack, 50),
new /datum/data/mining_equipment("Teporone MediPen", /obj/item/reagent_containers/hypospray/autoinjector/teporone, 50),
new /datum/data/mining_equipment("MediPen Bundle", /obj/item/storage/box/autoinjector/utility, 200),
new /datum/data/mining_equipment("Whiskey", /obj/item/reagent_containers/food/drinks/bottle/whiskey, 100),
new /datum/data/mining_equipment("Cigar", /obj/item/clothing/mask/cigarette/cigar/havana, 150),
new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Advanced Scanner", /obj/item/t_scanner/adv_mining_scanner, 400),
new /datum/data/mining_equipment("Hivelord Stabilizer", /obj/item/hivelordstabilizer, 400),
new /datum/data/mining_equipment("Mining Drone", /obj/item/mining_drone_cube, 500),
new /datum/data/mining_equipment("Drone Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
new /datum/data/mining_equipment("Drone Health Upgrade", /obj/item/mine_bot_upgrade/health, 400),
new /datum/data/mining_equipment("Drone Ranged Upgrade", /obj/item/mine_bot_upgrade/cooldown, 600),
new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
new /datum/data/mining_equipment("Explorer\'s Webbing", /obj/item/storage/belt/mining, 500),
new /datum/data/mining_equipment("Drone AI Upgrade", /obj/item/slimepotion/sentience/mining, 1000),
new /datum/data/mining_equipment("GAR mesons", /obj/item/clothing/glasses/meson/gar, 500),
new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 600),
new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 600),
new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750),
new /datum/data/mining_equipment("Resonator", /obj/item/resonator, 800),
new /datum/data/mining_equipment("Lazarus Injector", /obj/item/lazarus_injector, 1000),
new /datum/data/mining_equipment("Silver Pickaxe", /obj/item/pickaxe/silver, 1000),
new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/mobcapsule, 800),
new /datum/data/mining_equipment("Lazarus Capsule belt", /obj/item/storage/belt/lazarus, 200),
new /datum/data/mining_equipment("Jetpack", /obj/item/tank/jetpack/carbondioxide/mining, 2000),
new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500),
new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500),
new /datum/data/mining_equipment("Mining Hardsuit", /obj/item/storage/box/mininghardsuit, 2000),
new /datum/data/mining_equipment("1 Marker Beacon", /obj/item/stack/marker_beacon, 10),
new /datum/data/mining_equipment("10 Marker Beacons", /obj/item/stack/marker_beacon/ten, 100),
new /datum/data/mining_equipment("30 Marker Beacons", /obj/item/stack/marker_beacon/thirty, 300),
new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
new /datum/data/mining_equipment("KA Adjustable Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer/adjustable, 150),
new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
new /datum/data/mining_equipment("KA Cooldown Decrease",/obj/item/borg/upgrade/modkit/cooldown, 1000),
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
new /datum/data/mining_equipment("KA Super Chassis", /obj/item/borg/upgrade/modkit/chassis_mod, 250),
new /datum/data/mining_equipment("KA Hyper Chassis", /obj/item/borg/upgrade/modkit/chassis_mod/orange, 300),
new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
new /datum/data/mining_equipment("Point Transfer Card", /obj/item/card/mining_point_card, 500),
new /datum/data/mining_equipment("Mining Conscription Kit", /obj/item/storage/backpack/duffel/mining_conscript, 1000),
)
/obj/machinery/mineral/equipment_vendor/golem
@@ -468,15 +477,15 @@
new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000)
)
/datum/data/mining_equipment/
/datum/data/mining_equipment
var/equipment_name = "generic"
var/equipment_path = null
var/cost = 0
/datum/data/mining_equipment/New(name, path, cost)
src.equipment_name = name
src.equipment_path = path
src.cost = cost
/datum/data/mining_equipment/New(name, path, equipment_cost)
equipment_name = name
equipment_path = path
cost = equipment_cost
/obj/machinery/mineral/equipment_vendor/New()
..()
@@ -588,20 +597,33 @@
..()
/obj/machinery/mineral/equipment_vendor/proc/RedeemVoucher(obj/item/mining_voucher/voucher, mob/redeemer)
var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in list("Kinetic Accelerator", "Resonator", "Mining Drone", "Advanced Scanner", "Crusher")
if(!selection || !Adjacent(redeemer) || voucher.loc != redeemer)
var/items = list("Kinetic Accelerator", "Survival Capsule and Explorer's Webbing", "Resonator Kit", "Minebot Kit", "Crusher Kit", "Mining Conscription Kit", "Advanced Scanner")
var/selection = input(redeemer, "Pick your equipment", "Mining Voucher Redemption") as null|anything in items
if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer)
return
var/drop_location = loc
switch(selection)
if("Kinetic Accelerator")
new /obj/item/gun/energy/kinetic_accelerator(src.loc)
if("Resonator")
new /obj/item/resonator(src.loc)
if("Mining Drone")
new /obj/item/storage/box/drone_kit(src.loc)
new /obj/item/gun/energy/kinetic_accelerator(drop_location)
if("Survival Capsule and Explorer's Webbing")
new /obj/item/storage/belt/mining(drop_location)
if("Resonator Kit")
new /obj/item/extinguisher/mini(drop_location)
new /obj/item/resonator(drop_location)
if("Minebot Kit")
new /obj/item/mining_drone_cube(drop_location)
new /obj/item/weldingtool/hugetank(drop_location)
new /obj/item/clothing/head/welding(drop_location)
if("Crusher Kit")
new /obj/item/extinguisher/mini(drop_location)
new /obj/item/twohanded/required/kinetic_crusher(drop_location)
if("Mining Conscription Kit")
new /obj/item/storage/backpack/duffel/mining_conscript(drop_location)
if("Advanced Scanner")
new /obj/item/t_scanner/adv_mining_scanner(src.loc)
if("Crusher")
new /obj/item/twohanded/required/mining_hammer(loc)
new /obj/item/t_scanner/adv_mining_scanner(drop_location)
qdel(voucher)
/obj/machinery/mineral/equipment_vendor/ex_act(severity, target)
@@ -643,11 +665,41 @@
..(user)
to_chat(user, "There's [points] points on the card.")
/**********************Conscription Kit**********************/
/obj/item/card/id/mining_access_card
name = "mining access card"
desc = "A small card, that when used on any ID, will add mining access."
icon_state = "data_1"
/obj/item/card/id/mining_access_card/afterattack(atom/movable/AM, mob/user, proximity)
. = ..()
if(istype(AM, /obj/item/card/id) && proximity)
var/obj/item/card/id/I = AM
I.access |= list(access_mining, access_mining_station, access_mineral_storeroom, access_cargo)
to_chat(user, "You upgrade [I] with mining access.")
qdel(src)
/obj/item/storage/backpack/duffel/mining_conscript
name = "mining conscription kit"
desc = "A kit containing everything a crewmember needs to support a shaft miner in the field."
/obj/item/storage/backpack/duffel/mining_conscript/New()
..()
new /obj/item/pickaxe(src)
new /obj/item/clothing/glasses/meson(src)
new /obj/item/t_scanner/adv_mining_scanner/lesser(src)
new /obj/item/storage/bag/ore(src)
new /obj/item/clothing/under/rank/miner/lavaland(src)
new /obj/item/encryptionkey/headset_cargo(src)
new /obj/item/clothing/mask/gas(src)
new /obj/item/card/id/mining_access_card(src)
/**********************Jaunter**********************/
/obj/item/wormhole_jaunter
name = "wormhole jaunter"
desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to blue space for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least."
desc = "A single use device harnessing outdated wormhole technology, Nanotrasen has since turned its eyes to bluespace for more accurate teleportation. The wormholes it creates are unpleasant to travel through, to say the least.\nThanks to modifications provided by the Free Golems, this jaunter can be worn on the belt to provide protection from chasms."
icon = 'icons/obj/items.dmi'
icon_state = "Jaunter"
item_state = "electronic"
@@ -656,55 +708,71 @@
throw_speed = 3
throw_range = 5
origin_tech = "bluespace=2"
slot_flags = SLOT_BELT
/obj/item/wormhole_jaunter/attack_self(mob/user)
user.visible_message("<span class='notice'>[user.name] activates the [name]!</span>")
activate(user, TRUE)
/obj/item/wormhole_jaunter/proc/turf_check(mob/user)
var/turf/device_turf = get_turf(user)
if(!device_turf || !is_teleport_allowed(device_turf.z))
to_chat(user, "<span class='notice'>You're having difficulties getting the [src.name] to work.</span>")
return
else
user.visible_message("<span class='notice'>[user.name] activates the [src.name]!</span>")
var/list/L = list()
for(var/obj/item/radio/beacon/B in world)
var/turf/T = get_turf(B)
if(is_station_level(T.z))
L += B
if(!L.len)
to_chat(user, "<span class='notice'>The [src.name] failed to create a wormhole.</span>")
return
var/chosen_beacon = pick(L)
var/obj/effect/portal/wormhole/jaunt_tunnel/J = new /obj/effect/portal/wormhole/jaunt_tunnel(get_turf(src), chosen_beacon, lifespan=100)
try_move_adjacent(J)
playsound(src,'sound/effects/sparks4.ogg',50,1)
qdel(src)
to_chat(user, "<span class='notice'>You're having difficulties getting the [name] to work.</span>")
return FALSE
return TRUE
/obj/effect/portal/wormhole/jaunt_tunnel
/obj/item/wormhole_jaunter/proc/get_destinations(mob/user)
var/list/destinations = list()
for(var/obj/item/radio/beacon/B in world)
var/turf/T = get_turf(B)
if(is_station_level(T.z))
destinations += B
return destinations
/obj/item/wormhole_jaunter/proc/activate(mob/user, adjacent)
if(!turf_check(user))
return
var/list/L = get_destinations(user)
if(!L.len)
to_chat(user, "<span class='notice'>The [name] found no beacons in the world to anchor a wormhole to.</span>")
return
var/chosen_beacon = pick(L)
var/obj/effect/portal/jaunt_tunnel/J = new(get_turf(src), get_turf(chosen_beacon), src, 100)
if(adjacent)
try_move_adjacent(J)
else
J.teleport(user)
playsound(src,'sound/effects/sparks4.ogg',50,1)
qdel(src)
/obj/item/wormhole_jaunter/proc/chasm_react(mob/user)
if(user.get_item_by_slot(slot_belt) == src)
to_chat(user, "Your [name] activates, saving you from the chasm!</span>")
activate(user, FALSE)
else
to_chat(user, "[src] is not attached to your belt, preventing it from saving you from the chasm. RIP.</span>")
/obj/effect/portal/jaunt_tunnel
name = "jaunt tunnel"
icon = 'icons/effects/effects.dmi'
icon_state = "bhole3"
desc = "A stable hole in the universe made by a wormhole jaunter. Turbulent doesn't even begin to describe how rough passage through one of these is, but at least it will always get you somewhere near a beacon."
failchance = 0
/obj/effect/portal/wormhole/jaunt_tunnel/teleport(atom/movable/M)
if(istype(M, /obj/effect))
return
if(istype(M, /atom/movable))
if(do_teleport(M, target, 6))
if(isliving(M))
var/mob/living/L = M
L.Weaken(3)
if(ishuman(L))
shake_camera(L, 20, 1)
var/mob/living/carbon/human/H = L
spawn(20)
if(H && H.check_has_mouth())
H.visible_message("<span class='danger'>[L.name] vomits from travelling through the [src.name]!</span>", "<span class='userdanger'>You throw up from travelling through the [src.name]!</span>")
H.nutrition -= 20
H.adjustToxLoss(-3)
var/turf/T = get_turf(H)
T.add_vomit_floor()
else
visible_message("<span class='warning'>[src] flickers and fails, due to bluespace interference!</span>")
qdel(src)
/obj/effect/portal/jaunt_tunnel/teleport(atom/movable/M)
. = ..()
if(.)
// KERPLUNK
playsound(M,'sound/weapons/resonator_blast.ogg', 50, 1)
if(iscarbon(M))
var/mob/living/carbon/L = M
L.Weaken(6)
if(ishuman(L))
shake_camera(L, 20, 1)
addtimer(CALLBACK(L, /mob/living/carbon.proc/vomit), 20)
/**********************Resonator**********************/
@@ -822,21 +890,6 @@
new /mob/living/simple_animal/hostile/mining_drone(get_turf(src))
qdel(src)
/**********************Mining drone kit**********************/
/obj/item/storage/box/drone_kit
name = "Drone Kit"
desc = "A boxed kit that includes one mining drone cube and a welding tool with an increased capacity."
icon_state = "implant"
max_w_class = WEIGHT_CLASS_NORMAL
storage_slots = 2
can_hold = list(/obj/item/mining_drone_cube, /obj/item/weldingtool/hugetank)
/obj/item/storage/box/drone_kit/New()
..()
new /obj/item/mining_drone_cube(src)
new /obj/item/weldingtool/hugetank(src)
/**********************Lazarus Injector**********************/
/obj/item/lazarus_injector
@@ -1057,7 +1110,7 @@
qdel(src)
/*********************Mining Hammer****************/
/obj/item/twohanded/required/mining_hammer
/obj/item/twohanded/required/kinetic_crusher
icon = 'icons/obj/mining.dmi'
icon_state = "mining_hammer1"
item_state = "mining_hammer1"
@@ -1091,7 +1144,7 @@
damage_type = BRUTE
flag = "bomb"
range = 6
var/obj/item/twohanded/required/mining_hammer/hammer_synced = null
var/obj/item/twohanded/required/kinetic_crusher/hammer_synced = null
/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = 0, hit_zone)
if(hammer_synced)
@@ -1114,7 +1167,7 @@
M.gets_drilled(firer)
..()
/obj/item/twohanded/required/mining_hammer/afterattack(atom/target, mob/user, proximity_flag)
/obj/item/twohanded/required/kinetic_crusher/afterattack(atom/target, mob/user, proximity_flag)
if(!proximity_flag && charged)//Mark a target, or mine a tile.
var/turf/proj_turf = get_turf(src)
if(!istype(proj_turf, /turf))
@@ -1149,7 +1202,7 @@
else
L.apply_damage(50, BRUTE, blocked = def_check)
/obj/item/twohanded/required/mining_hammer/proc/Recharge()
/obj/item/twohanded/required/kinetic_crusher/proc/Recharge()
if(!charged)
charged = 1
icon_state = "mining_hammer1"
+43
View File
@@ -0,0 +1,43 @@
/****************Explorer's Suit and Mask****************/
/obj/item/clothing/suit/hooded/explorer
name = "explorer suit"
desc = "An armoured suit for exploring harsh environments."
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
hoodtype = /obj/item/clothing/head/hooded/explorer
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
allowed = list(/obj/item/flashlight, /obj/item/tank, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe)
resistance_flags = FIRE_PROOF
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/suit.dmi',
"Drask" = 'icons/mob/species/drask/suit.dmi',
"Tajaran" = 'icons/mob/species/tajaran/suit.dmi',
"Unathi" = 'icons/mob/species/unathi/suit.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/suit.dmi'
)
/obj/item/clothing/head/hooded/explorer
name = "explorer hood"
desc = "An armoured hood for exploring harsh environments."
icon_state = "explorer"
item_state = "explorer"
body_parts_covered = HEAD
flags = BLOCKHAIR | NODROP
flags_cover = HEADCOVERSEYES
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
armor = list("melee" = 30, "bullet" = 20, "laser" = 20, "energy" = 20, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50)
resistance_flags = FIRE_PROOF
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/head.dmi',
"Drask" = 'icons/mob/species/drask/head.dmi',
"Grey" = 'icons/mob/species/grey/head.dmi',
"Skrell" = 'icons/mob/species/skrell/head.dmi'
)
@@ -1,6 +0,0 @@
/turf/simulated/mineral/random/labormineral
mineralSpawnChanceList = list("Uranium" = 1, "Iron" = 100, "Diamond" = 1, "Gold" = 1, "Silver" = 1, "Plasma" = 1)
/turf/simulated/mineral/random/labormineral/New()
icon_state = "rock"
..()
@@ -4,6 +4,7 @@
icon_state = "l_mushroom"
name = "large mushrooms"
desc = "A number of large mushrooms, covered in a faint layer of ash and what can only be spores."
anchored = TRUE
var/harvested_name = "shortened mushrooms"
var/harvested_desc = "Some quickly regrowing mushrooms, formerly known to be quite large."
var/needs_sharp_harvest = TRUE
@@ -72,7 +72,7 @@
var/mob/dead/observer/current_spirits = list()
for(var/mob/dead/observer/O in GLOB.player_list)
if(is_type_in_list(O.following, contents))
if((O.following in contents))
ghost_counter++
O.invisibility = 0
current_spirits |= O
@@ -161,9 +161,9 @@
hitsound = 'sound/weapons/sear.ogg'
burn_state = LAVA_PROOF | FIRE_PROOF
unacidable = 1
var/turf_type = /turf/unsimulated/floor/lava // /turf/simulated/floor/plating/lava/smooth once Lavaland turfs are added
var/turf_type = /turf/simulated/floor/plating/lava/smooth
var/transform_string = "lava"
var/reset_turf_type = /turf/simulated/floor/plating/airless/asteroid // /turf/simulated/floor/plating/asteroid/basalt once Lavaland turfs are added
var/reset_turf_type = /turf/simulated/floor/plating/asteroid/basalt
var/reset_string = "basalt"
var/create_cooldown = 100
var/create_delay = 30
@@ -198,7 +198,7 @@
user.visible_message("<span class='danger'>[user] turns \the [T] into [transform_string]!</span>")
message_admins("[key_name_admin(user)] fired the lava staff at [get_area(target)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>).")
log_game("[key_name(user)] fired the lava staff at [get_area(target)] ([T.x], [T.y], [T.z]).")
T.ChangeTurf(turf_type)
T.TerraformTurf(turf_type, keep_icon = FALSE)
timer = world.time + create_cooldown
qdel(L)
else
@@ -207,7 +207,7 @@
return
else
user.visible_message("<span class='danger'>[user] turns \the [T] into [reset_string]!</span>")
T.ChangeTurf(reset_turf_type)
T.TerraformTurf(reset_turf_type, keep_icon = FALSE)
timer = world.time + reset_cooldown
playsound(T,'sound/magic/fireball.ogg', 200, 1)
@@ -5,8 +5,6 @@
desc = "A completely indestructible chunk of crystal, rumoured to predate the start of this universe. It looks like you could store things inside it."
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "blackbox"
icon_on = "blackbox"
icon_off = "blackbox"
luminosity = 8
max_n_of_items = INFINITY
unacidable = 1
@@ -38,7 +36,7 @@
/obj/machinery/smartfridge/black_box/process()
..()
if(!memory_saved && ticker.current_state == GAME_STATE_FINISHED)
if(!memory_saved && SSticker.current_state == GAME_STATE_FINISHED)
WriteMemory()
/obj/machinery/smartfridge/black_box/proc/WriteMemory()
@@ -189,7 +187,7 @@
terrain_theme = pick("lavaland","winter","jungle","alien")
switch(terrain_theme)
if("lavaland")//Depressurizes the place... and free cult metal, I guess.
NewTerrainFloors = /turf/simulated/floor/basalt // Needs to be updated after turf update
NewTerrainFloors = /turf/simulated/floor/plating/asteroid/basalt // Needs to be updated after turf update
NewTerrainWalls = /turf/simulated/wall/cult
NewFlora = list(/mob/living/simple_animal/hostile/asteroid/goldgrub)
florachance = 1
@@ -126,12 +126,13 @@
icon = 'icons/obj/lavaland/dragonboat.dmi'
keytype = /obj/item/oar
burn_state = LAVA_PROOF | FIRE_PROOF
resistance_flags = LAVA_PROOF | FIRE_PROOF
/obj/vehicle/lavaboat/relaymove(mob/user, direction)
var/turf/next = get_step(src, direction)
var/turf/current = get_turf(src)
if(istype(next, /turf/unsimulated/floor/lava) || istype(current, /turf/unsimulated/floor/lava)) //We can move from land to lava, or lava to land, but not from land to land
if(istype(next, /turf/simulated/floor/plating/lava/smooth) || istype(current, /turf/simulated/floor/plating/lava/smooth)) //We can move from land to lava, or lava to land, but not from land to land
..()
else
to_chat(user, "<span class='warning'>Boats don't go on land!</span>")
@@ -168,6 +169,7 @@
desc = "A tiny ship inside a bottle."
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "ship_bottle"
resistance_flags = LAVA_PROOF | FIRE_PROOF
/obj/item/ship_in_a_bottle/attack_self(mob/user)
to_chat(user, "You're not sure how they get the ships in these things, but you're pretty sure you know how to get it out.")
@@ -30,7 +30,6 @@
if(6)
new /obj/item/pickaxe/diamond(src)
if(7)
new /obj/item/clothing/head/culthood(src)
new /obj/item/clothing/suit/hooded/cultrobes(src)
new /obj/item/bedsheet/cult(src)
if(8)

Some files were not shown because too many files have changed in this diff Show More