mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 03:57:13 +01:00
Merge remote-tracking branch 'upstream/master' into radio_comms_fluff
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
|
||||
var/global/BSACooldown = 0
|
||||
var/global/nologevent = 0
|
||||
|
||||
@@ -103,9 +102,14 @@ var/global/nologevent = 0
|
||||
<A href='?_src_=holder;narrateto=\ref[M]'>Narrate to</A> |
|
||||
<A href='?_src_=holder;subtlemessage=\ref[M]'>Subtle message</A>
|
||||
"}
|
||||
|
||||
if(check_rights(R_EVENT, 0))
|
||||
body += {" | <A href='?_src_=holder;Bless=[M.UID()]'>Bless</A> | <A href='?_src_=holder;Smite=[M.UID()]'>Smite</A>"}
|
||||
|
||||
if(isLivingSSD(M))
|
||||
if(!istype(M.loc, /obj/machinery/cryopod))
|
||||
body += {" | <A href='?_src_=holder;cryossd=[M.UID()]'>Cryo</A> "}
|
||||
|
||||
if(M.client)
|
||||
if(!istype(M, /mob/new_player))
|
||||
body += "<br><br>"
|
||||
|
||||
@@ -79,6 +79,7 @@ var/list/admin_verbs_admin = list(
|
||||
/client/proc/reset_all_tcs, /*resets all telecomms scripts*/
|
||||
/client/proc/toggle_mentor_chat,
|
||||
/client/proc/toggle_advanced_interaction, /*toggle admin ability to interact with not only machines, but also atoms such as buttons and doors*/
|
||||
/client/proc/list_ssds,
|
||||
)
|
||||
var/list/admin_verbs_ban = list(
|
||||
/client/proc/unban_panel,
|
||||
@@ -107,6 +108,8 @@ var/list/admin_verbs_event = list(
|
||||
/client/proc/toggle_random_events,
|
||||
/client/proc/toggle_ert_calling,
|
||||
/client/proc/cmd_admin_change_custom_event,
|
||||
/client/proc/cmd_admin_custom_event_info,
|
||||
/client/proc/cmd_view_custom_event_info,
|
||||
/datum/admins/proc/access_news_network, /*allows access of newscasters*/
|
||||
/client/proc/cmd_admin_direct_narrate, /*send text directly to a player with no padding. Useful for narratives and fluff-text*/
|
||||
/client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/
|
||||
@@ -346,10 +349,12 @@ var/list/admin_verbs_snpc = list(
|
||||
if(mob.invisibility == INVISIBILITY_OBSERVER)
|
||||
mob.invisibility = initial(mob.invisibility)
|
||||
to_chat(mob, "<span class='danger'>Invisimin off. Invisibility reset.</span>")
|
||||
mob.add_to_all_human_data_huds()
|
||||
//TODO: Make some kind of indication for the badmin that they are currently invisible
|
||||
else
|
||||
mob.invisibility = INVISIBILITY_OBSERVER
|
||||
to_chat(mob, "<span class='notice'>Invisimin on. You are now as invisible as a ghost.</span>")
|
||||
mob.remove_from_all_data_huds()
|
||||
|
||||
/client/proc/player_panel()
|
||||
set name = "Player Panel"
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
var/jobban_runonce // Updates legacy bans with new info
|
||||
var/jobban_keylist[0] // Linear list of jobban strings, kept around for the legacy system
|
||||
var/jobban_assoclist[0] // Associative list, for efficiency
|
||||
|
||||
@@ -100,3 +100,9 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself.
|
||||
return 0
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/datum/admins/vv_edit_var(var_name, var_value)
|
||||
return FALSE // no admin abuse
|
||||
|
||||
/datum/admins/can_vv_delete()
|
||||
return FALSE // don't break shit either
|
||||
@@ -101,7 +101,7 @@
|
||||
to_chat(usr, "<span class='notice'>Admin rank changed.</span>")
|
||||
|
||||
/datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission)
|
||||
if(config.admin_legacy_system)
|
||||
if(config.admin_legacy_system)
|
||||
return
|
||||
|
||||
if(!usr.client)
|
||||
@@ -153,13 +153,15 @@
|
||||
var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.[format_table_name("admin_log")] (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')")
|
||||
log_query.Execute()
|
||||
to_chat(usr, "<span class='notice'>Permission added.</span>")
|
||||
|
||||
|
||||
/datum/admins/proc/updateranktodb(ckey,newrank)
|
||||
establish_db_connection()
|
||||
if(!dbcon.IsConnected())
|
||||
return
|
||||
if(!check_rights(R_PERMISSIONS))
|
||||
return
|
||||
var/sql_ckey = sanitizeSQL(ckey)
|
||||
var/sql_admin_rank = sanitizeSQL(newrank)
|
||||
|
||||
var/DBQuery/query_update = dbcon.NewQuery("UPDATE [format_table_name("player")] SET lastadminrank = '[sql_admin_rank]' WHERE ckey = '[sql_ckey]'")
|
||||
query_update.Execute()
|
||||
query_update.Execute()
|
||||
|
||||
+135
-51
@@ -242,16 +242,23 @@
|
||||
|
||||
else if(task == "permissions")
|
||||
if(!D) return
|
||||
var/list/permissionlist = list()
|
||||
for(var/i=1, i<=R_MAXPERMISSION, i<<=1) //that <<= is shorthand for i = i << 1. Which is a left bitshift
|
||||
permissionlist[rights2text(i)] = i
|
||||
var/new_permission = input("Select a permission to turn on/off", "Permission toggle", null, null) as null|anything in permissionlist
|
||||
if(!new_permission) return
|
||||
D.rights ^= permissionlist[new_permission]
|
||||
while(TRUE)
|
||||
var/list/permissionlist = list()
|
||||
for(var/i=1, i<=R_MAXPERMISSION, i<<=1) //that <<= is shorthand for i = i << 1. Which is a left bitshift
|
||||
permissionlist[rights2text(i)] = i
|
||||
var/new_permission = input("Select a permission to turn on/off", adm_ckey + "'s Permissions", null, null) as null|anything in permissionlist
|
||||
if(!new_permission)
|
||||
return
|
||||
var/oldrights = D.rights
|
||||
var/toggleresult = "ON"
|
||||
D.rights ^= permissionlist[new_permission]
|
||||
if(oldrights > D.rights)
|
||||
toggleresult = "OFF"
|
||||
|
||||
message_admins("[key_name_admin(usr)] toggled the [new_permission] permission of [adm_ckey] to [toggleresult]")
|
||||
log_admin("[key_name(usr)] toggled the [new_permission] permission of [adm_ckey] to [toggleresult]")
|
||||
log_admin_permission_modification(adm_ckey, permissionlist[new_permission])
|
||||
|
||||
message_admins("[key_name_admin(usr)] toggled the [new_permission] permission of [adm_ckey]")
|
||||
log_admin("[key_name(usr)] toggled the [new_permission] permission of [adm_ckey]")
|
||||
log_admin_permission_modification(adm_ckey, permissionlist[new_permission])
|
||||
|
||||
edit_admin_permissions()
|
||||
|
||||
@@ -1741,6 +1748,9 @@
|
||||
btypes += "Heal Over Time"
|
||||
btypes += "Permanent Regeneration"
|
||||
btypes += "Super Powers"
|
||||
btypes += "Scarab Guardian"
|
||||
btypes += "Human Protector"
|
||||
btypes += "Pet"
|
||||
var/blessing = input(owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes
|
||||
if(!(blessing in btypes))
|
||||
return
|
||||
@@ -1766,6 +1776,7 @@
|
||||
H.dna.SetSEState(REGENERATEBLOCK, 1)
|
||||
genemutcheck(H, REGENERATEBLOCK, null, MUTCHK_FORCED)
|
||||
H.update_mutations()
|
||||
H.gene_stability = 100
|
||||
logmsg = "permanent regeneration."
|
||||
if("Super Powers")
|
||||
var/list/default_genes = list(REGENERATEBLOCK, NOBREATHBLOCK, COLDBLOCK)
|
||||
@@ -1773,7 +1784,44 @@
|
||||
H.dna.SetSEState(gene, 1)
|
||||
genemutcheck(H, gene, null, MUTCHK_FORCED)
|
||||
H.update_mutations()
|
||||
H.gene_stability = 100
|
||||
logmsg = "superpowers."
|
||||
if("Scarab Guardian")
|
||||
var/obj/item/weapon/guardiancreator/biological/scarab = new /obj/item/weapon/guardiancreator/biological(H)
|
||||
var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Random")
|
||||
var/typechoice = input("Select Guardian Type", "Type") as null|anything in possible_guardians
|
||||
if(isnull(typechoice))
|
||||
return
|
||||
if(typechoice != "Random")
|
||||
possible_guardians -= "Random"
|
||||
scarab.possible_guardians = list()
|
||||
scarab.possible_guardians += typechoice
|
||||
scarab.attack_self(H)
|
||||
spawn(700)
|
||||
qdel(scarab)
|
||||
logmsg = "scarab guardian."
|
||||
if("Pet")
|
||||
var/pets = subtypesof(/mob/living/simple_animal/pet)
|
||||
var/petchoice = input("Select pet type", "Pets") as null|anything in pets
|
||||
if(isnull(petchoice))
|
||||
return
|
||||
var/mob/living/simple_animal/pet/P = new petchoice(H.loc)
|
||||
var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [P], pet of [H]?", poll_time = 100, min_hours = 10)
|
||||
var/mob/dead/observer/theghost = null
|
||||
if(candidates.len)
|
||||
theghost = pick(candidates)
|
||||
P.key = theghost.key
|
||||
P.master_commander = H
|
||||
spawn(30)
|
||||
var/newname = sanitize(copytext(input(P, "You are [P], pet of [H]. Would you like to change your name to something else?", "Name change", P.name) as null|text,1,MAX_NAME_LEN))
|
||||
if(newname && newname != P.name)
|
||||
P.name = newname
|
||||
if(P.mind)
|
||||
P.mind.name = newname
|
||||
logmsg = "pet ([P])."
|
||||
if("Human Protector")
|
||||
usr.client.create_eventmob_for(H, 0)
|
||||
logmsg = "syndie protector."
|
||||
if(logmsg)
|
||||
log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a blessing: [logmsg]")
|
||||
message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a blessing: [logmsg]")
|
||||
@@ -1797,8 +1845,8 @@
|
||||
ptypes += "Mutagen Cookie"
|
||||
ptypes += "Hellwater Cookie"
|
||||
ptypes += "Assassin"
|
||||
ptypes += "Priest"
|
||||
ptypes += "Lynch"
|
||||
ptypes += "Hunter"
|
||||
ptypes += "Crew Traitor"
|
||||
var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
|
||||
if(!(punishment in ptypes))
|
||||
return
|
||||
@@ -1856,47 +1904,12 @@
|
||||
H.drop_l_hand()
|
||||
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
|
||||
logmsg = "a hellwater cookie."
|
||||
if("Priest")
|
||||
logmsg = "priest."
|
||||
if("Hunter")
|
||||
logmsg = "hunter."
|
||||
H.mutations |= NOCLONE
|
||||
message_admins("[key_name_admin(owner)] is sending a dark priest to assassinate [key_name_admin(M)]...")
|
||||
var/list/candidates = pollCandidates("Do you want to play as a murderous dark priest?")
|
||||
if(!candidates.len)
|
||||
to_chat(usr, "ERROR: Could not create priest. No valid candidates.")
|
||||
return
|
||||
var/mob/C = pick(candidates)
|
||||
var/key_of_priest = C.key
|
||||
if(!key_of_priest)
|
||||
to_chat(usr, "ERROR: Could not create priest. Could not pick key.")
|
||||
return
|
||||
var/datum/mind/priest_mind = new /datum/mind(key_of_priest)
|
||||
priest_mind.active = 1
|
||||
var/mob/living/carbon/human/priest_mob = new /mob/living/carbon/human(pick(latejoin))
|
||||
priest_mind.transfer_to(priest_mob)
|
||||
var/datum/outfit/admin/dark_priest/O = new /datum/outfit/admin/dark_priest
|
||||
priest_mob.equipOutfit(O, FALSE)
|
||||
var/obj/item/weapon/pinpointer/advpinpointer/N = new /obj/item/weapon/pinpointer/advpinpointer(priest_mob)
|
||||
priest_mob.equip_to_slot_or_del(N, slot_r_store)
|
||||
N.active = 1
|
||||
N.mode = 2
|
||||
N.target = H
|
||||
N.point_at(N.target)
|
||||
N.flags |= NODROP
|
||||
var/datum/objective/assassinate/kill_objective = new
|
||||
kill_objective.owner = priest_mind
|
||||
kill_objective.target = H.mind
|
||||
kill_objective.explanation_text = "Murder [H.real_name], the [H.mind.assigned_role], in the name of the dark gods."
|
||||
priest_mind.objectives += kill_objective
|
||||
ticker.mode.traitors |= priest_mob.mind
|
||||
to_chat(priest_mob, "<span class='danger'>ATTENTION:</span> You are now a dark priest!")
|
||||
to_chat(priest_mob, "<B>Goal: <span class='danger'>MURDER [H.real_name]</span>, currently in [get_area(H.loc)], in the name of the dark gods. </B>");
|
||||
to_chat(priest_mob, "<B>The gods will prevent their revival.</B>");
|
||||
priest_mob.mind.special_role = SPECIAL_ROLE_TRAITOR
|
||||
var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
|
||||
tatorhud.join_hud(priest_mob)
|
||||
ticker.mode.set_antag_hud(priest_mob, "hudsyndicate")
|
||||
if("Assassin")
|
||||
logmsg = "assassin."
|
||||
usr.client.create_eventmob_for(H, 1)
|
||||
if("Crew Traitor")
|
||||
logmsg = "crew traitor."
|
||||
var/list/possible_traitors = list()
|
||||
for(var/mob/living/player in living_mob_list)
|
||||
if(player.client && player.mind && !player.mind.special_role && player.stat != DEAD && player != H)
|
||||
@@ -1944,6 +1957,20 @@
|
||||
if(logmsg)
|
||||
log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a smiting: [logmsg]")
|
||||
message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a smiting: [logmsg]")
|
||||
else if(href_list["cryossd"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/mob/living/carbon/human/H = locateUID(href_list["cryossd"])
|
||||
if(!istype(H))
|
||||
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human")
|
||||
return
|
||||
if(!isLivingSSD(H))
|
||||
to_chat(usr, "This can only be used on living, SSD players.")
|
||||
return
|
||||
var/success = cryo_ssd(H)
|
||||
if(success)
|
||||
log_admin("[key_name(usr)] sent [H.job] [H] to cryo.")
|
||||
message_admins("[key_name_admin(usr)] sent [H.job] [H] to cryo.")
|
||||
else if(href_list["FaxReplyTemplate"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
@@ -3330,6 +3357,63 @@
|
||||
// Refresh the page
|
||||
src.view_flagged_books()
|
||||
|
||||
/client/proc/create_eventmob_for(var/mob/living/carbon/human/H, var/killthem = 0)
|
||||
if(!check_rights(R_EVENT))
|
||||
return
|
||||
var/admin_outfits = subtypesof(/datum/outfit/admin)
|
||||
var/hunter_outfits = list()
|
||||
for(var/type in admin_outfits)
|
||||
var/datum/outfit/admin/O = type
|
||||
hunter_outfits[initial(O.name)] = type
|
||||
var/dresscode = input("Select type", "Contracted Agents") as null|anything in hunter_outfits
|
||||
if(isnull(dresscode))
|
||||
return
|
||||
var/datum/outfit/O = hunter_outfits[dresscode]
|
||||
message_admins("[key_name_admin(mob)] is sending a ([dresscode]) to [killthem ? "assassinate" : "protect"] [key_name_admin(H)]...")
|
||||
var/list/candidates = pollCandidates("Play as a [killthem ? "murderous" : "protective"] [dresscode]?", ROLE_TRAITOR, 1)
|
||||
if(!candidates.len)
|
||||
to_chat(usr, "ERROR: Could not create eventmob. No valid candidates.")
|
||||
return
|
||||
var/mob/C = pick(candidates)
|
||||
var/key_of_hunter = C.key
|
||||
if(!key_of_hunter)
|
||||
to_chat(usr, "ERROR: Could not create eventmob. Could not pick key.")
|
||||
return
|
||||
var/datum/mind/hunter_mind = new /datum/mind(key_of_hunter)
|
||||
hunter_mind.active = 1
|
||||
var/mob/living/carbon/human/hunter_mob = new /mob/living/carbon/human(pick(latejoin))
|
||||
hunter_mind.transfer_to(hunter_mob)
|
||||
hunter_mob.equipOutfit(O, FALSE)
|
||||
var/obj/item/weapon/pinpointer/advpinpointer/N = new /obj/item/weapon/pinpointer/advpinpointer(hunter_mob)
|
||||
hunter_mob.equip_to_slot_or_del(N, slot_in_backpack)
|
||||
N.active = 1
|
||||
N.mode = 2
|
||||
N.target = H
|
||||
N.point_at(N.target)
|
||||
if(!locate(/obj/item/weapon/implant/dust, hunter_mob))
|
||||
var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(hunter_mob)
|
||||
D.implant(hunter_mob)
|
||||
if(killthem)
|
||||
var/datum/objective/assassinate/kill_objective = new
|
||||
kill_objective.owner = hunter_mind
|
||||
kill_objective.target = H.mind
|
||||
kill_objective.explanation_text = "Kill [H.real_name], the [H.mind.assigned_role]."
|
||||
hunter_mind.objectives += kill_objective
|
||||
else
|
||||
var/datum/objective/protect/protect_objective = new
|
||||
protect_objective.owner = hunter_mind
|
||||
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
|
||||
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)
|
||||
to_chat(hunter_mob, "<B>If you kill them, they cannot be revived.</B>");
|
||||
hunter_mob.mind.special_role = SPECIAL_ROLE_TRAITOR
|
||||
var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
|
||||
tatorhud.join_hud(hunter_mob)
|
||||
ticker.mode.set_antag_hud(hunter_mob, "hudsyndicate")
|
||||
|
||||
/proc/admin_jump_link(var/atom/target)
|
||||
if(!target) return
|
||||
|
||||
@@ -89,6 +89,11 @@
|
||||
|
||||
if("delete")
|
||||
for(var/d in objs)
|
||||
if(istype(d, /datum))
|
||||
var/datum/D = d
|
||||
if(!D.can_vv_delete())
|
||||
to_chat(usr, "[D] rejected your deletion")
|
||||
continue
|
||||
qdel(d)
|
||||
|
||||
if("select")
|
||||
@@ -124,11 +129,10 @@
|
||||
if(++i == sets.len)
|
||||
if(istype(temp, /turf) && (v == "x" || v == "y" || v == "z"))
|
||||
continue
|
||||
if(istype(temp.vars[v], /datum/admins))
|
||||
continue
|
||||
temp.vars[v] = SDQL_expression(d, set_list[sets])
|
||||
if(!temp.vv_edit_var(v, SDQL_expression(d, set_list[sets])))
|
||||
to_chat(usr, "[temp] rejected your varedit.")
|
||||
break
|
||||
if(temp.vars.Find(v) && (istype(temp.vars[v], /datum) || istype(temp.vars[v], /client)) && !istype(temp.vars[v], /datum/admins))
|
||||
if(temp.vars.Find(v) && (istype(temp.vars[v], /datum) || istype(temp.vars[v], /client)))
|
||||
temp = temp.vars[v]
|
||||
else
|
||||
break
|
||||
|
||||
@@ -38,3 +38,49 @@
|
||||
to_chat(src, "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>")
|
||||
to_chat(src, "<span class='alert'>[html_encode(custom_event_msg)]</span>")
|
||||
to_chat(src, "<br>")
|
||||
|
||||
//admin event info to be view by admins
|
||||
|
||||
/client/proc/cmd_admin_custom_event_info()
|
||||
set category = "Event"
|
||||
set name = "Change Custom Admin Event Info"
|
||||
|
||||
if(!check_rights(R_EVENT))
|
||||
to_chat(src, "Only administrators may use this command.")
|
||||
return
|
||||
|
||||
var/input = input(usr, "Enter the description of the custom event. This is informations for admins only. Use it to notify other admins of event info but not players.", "Custom Event Info", custom_event_msg) as message|null
|
||||
if(!input || input == "")
|
||||
custom_event_admin_msg = null
|
||||
log_admin("[key_name(usr)] has cleared the custom admin event info text.")
|
||||
message_admins("[key_name_admin(usr)] has cleared the custom admin event text.")
|
||||
return
|
||||
|
||||
log_admin("[key_name(usr)] has changed the custom admin event info text.")
|
||||
message_admins("[key_name_admin(usr)] has changed the custom admin event info text.")
|
||||
|
||||
custom_event_admin_msg = input
|
||||
|
||||
for(var/client/X in admins)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
to_chat(X, "<h1 class='alert'>Custom Admin Event Info</h1>")
|
||||
to_chat(X, "<h2 class='alert'>A custom event is starting. OOC Admin Info:</h2>")
|
||||
to_chat(X, "<span class='alert'>[html_encode(custom_event_admin_msg)]</span>")
|
||||
to_chat(X,"<br>")
|
||||
|
||||
/client/proc/cmd_view_custom_event_info()
|
||||
set category = "Event"
|
||||
set name = "Custom Event Admin Info"
|
||||
|
||||
if(!check_rights(R_EVENT))
|
||||
to_chat(src, "Only administrators may use this command.")
|
||||
return
|
||||
|
||||
if(!custom_event_admin_msg || custom_event_admin_msg == "")
|
||||
to_chat(src, "There currently is no known custom admin event taking place.")
|
||||
return
|
||||
|
||||
to_chat(src, "<h1 class='alert'>Custom Event Info</h1>")
|
||||
to_chat(src, "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>")
|
||||
to_chat(src, "<span class='alert'>[html_encode(custom_event_admin_msg)]</span>")
|
||||
to_chat(src, "<br>")
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
return
|
||||
if(alert("Do you want to spawn a Gimmick Team at YOUR CURRENT LOCATION?",,"Yes","No")=="No")
|
||||
return
|
||||
var/turf/T = get_turf(mob)
|
||||
var/pick_manually = 0
|
||||
if(alert("Pick the team members manually? If you select yes, you pick from ghosts. If you select no, ghosts get offered the chance to join.",,"Yes","No")=="Yes")
|
||||
pick_manually = 1
|
||||
@@ -34,6 +35,9 @@
|
||||
var/dresscode = input("Select Outfit", "Dress-a-mob") as null|anything in outfit_list
|
||||
if(isnull(dresscode))
|
||||
return
|
||||
var/is_syndicate = 0
|
||||
if(alert("Do you want these characters automatically classified as antagonists?",,"Yes","No")=="Yes")
|
||||
is_syndicate = 1
|
||||
|
||||
var/list/players_to_spawn = list()
|
||||
if(pick_manually)
|
||||
@@ -55,7 +59,8 @@
|
||||
return 0
|
||||
|
||||
var/datum/outfit/O = outfit_list[dresscode]
|
||||
var/turf/T = get_turf(mob)
|
||||
|
||||
var/players_spawned = 0
|
||||
for(var/mob/thisplayer in players_to_spawn)
|
||||
var/mob/living/carbon/human/H = new /mob/living/carbon/human(T)
|
||||
H.name = random_name(pick(MALE,FEMALE))
|
||||
@@ -67,13 +72,20 @@
|
||||
H.mind_initialize()
|
||||
H.mind.assigned_role = "MODE"
|
||||
H.mind.special_role = "Event Character"
|
||||
ticker.mode.traitors |= H.mind //Adds them to extra antag list
|
||||
|
||||
H.key = thisplayer.key
|
||||
|
||||
H.equipOutfit(O, FALSE)
|
||||
|
||||
to_chat(H, "<BR><span class='danger'><B>[themission]</B></span>")
|
||||
H.mind.store_memory("<B>[themission]</B><BR><BR>")
|
||||
|
||||
if(is_syndicate)
|
||||
ticker.mode.traitors |= H.mind //Adds them to extra antag list
|
||||
|
||||
players_spawned++
|
||||
if(players_spawned >= teamsize)
|
||||
break
|
||||
|
||||
|
||||
message_admins("[key_name_admin(src)] has spawned a Gimmick Team.", 1)
|
||||
|
||||
@@ -93,6 +93,7 @@ var/global/sent_honksquad = 0
|
||||
new_honksquad.mind_initialize()
|
||||
new_honksquad.mind.assigned_role = "MODE"
|
||||
new_honksquad.mind.special_role = SPECIAL_ROLE_HONKSQUAD
|
||||
new_honksquad.add_language("Clownish")
|
||||
ticker.mode.traitors |= new_honksquad.mind//Adds them to current traitor list. Which is really the extra antagonist list.
|
||||
new_honksquad.equip_honksquad(honk_leader_selected)
|
||||
return new_honksquad
|
||||
|
||||
@@ -58,7 +58,7 @@ var/global/sent_syndicate_infiltration_team = 0
|
||||
infiltrators += candidate
|
||||
else
|
||||
to_chat(src, "Polling candidates...")
|
||||
infiltrators = pollCandidates("Do you want to play as a SYNDICATE INFILTRATOR?") // ROLE_TRAITOR, 7
|
||||
infiltrators = pollCandidates("Do you want to play as a SYNDICATE INFILTRATOR?", ROLE_TRAITOR, 1)
|
||||
|
||||
if(!infiltrators.len)
|
||||
to_chat(src, "Nobody volunteered.")
|
||||
|
||||
@@ -22,360 +22,251 @@
|
||||
src.massmodify_variables(A, var_name, method)
|
||||
feedback_add_details("admin_verb","MEV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
/client/proc/massmodify_variables(var/atom/O, var/var_name = "", var/method = 0)
|
||||
if(!check_rights(R_VAREDIT)) return
|
||||
|
||||
var/list/locked = list("vars", "key", "ckey", "client")
|
||||
|
||||
for(var/p in forbidden_varedit_object_types)
|
||||
if( istype(O,p) )
|
||||
to_chat(usr, "<span class='danger'>It is forbidden to edit this object's variables.</span>")
|
||||
return
|
||||
|
||||
var/list/names = list()
|
||||
for(var/V in O.vars)
|
||||
names += V
|
||||
|
||||
names = sortList(names)
|
||||
/client/proc/massmodify_variables(datum/O, var_name = "", method = 0)
|
||||
if(!check_rights(R_VAREDIT))
|
||||
return
|
||||
if(!istype(O))
|
||||
return
|
||||
|
||||
var/variable = ""
|
||||
|
||||
if(!var_name)
|
||||
variable = input("Which var?","Var") as null|anything in names
|
||||
var/list/names = list()
|
||||
for(var/V in O.vars)
|
||||
names += V
|
||||
|
||||
names = sortList(names)
|
||||
|
||||
variable = input("Which var?", "Var") as null|anything in names
|
||||
else
|
||||
variable = var_name
|
||||
|
||||
if(!variable) return
|
||||
if(!variable || !O.can_vv_get(variable))
|
||||
return
|
||||
var/default
|
||||
var/var_value = O.vars[variable]
|
||||
var/dir
|
||||
|
||||
if(variable == "holder" || (variable in locked))
|
||||
if(!check_rights(R_DEBUG)) return
|
||||
if(variable in VVckey_edit)
|
||||
to_chat(src, "It's forbidden to mass-modify ckeys. It'll crash everyone's client you dummy.")
|
||||
return
|
||||
if(variable in VVlocked)
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
if(variable in VVicon_edit_lock)
|
||||
if(!check_rights(R_EVENT | R_DEBUG))
|
||||
return
|
||||
if(variable in VVpixelmovement)
|
||||
if(!check_rights(R_DEBUG))
|
||||
return
|
||||
var/prompt = alert(src, "Editing this var may irreparably break tile gliding for the rest of the round. THIS CAN'T BE UNDONE", "DANGER", "ABORT ", "Continue", " ABORT")
|
||||
if(prompt != "Continue")
|
||||
return
|
||||
|
||||
if(isnull(var_value))
|
||||
to_chat(usr, "Unable to determine variable type.")
|
||||
|
||||
else if(isnum(var_value))
|
||||
to_chat(usr, "Variable appears to be <b>NUM</b>.")
|
||||
default = "num"
|
||||
dir = 1
|
||||
|
||||
else if(istext(var_value))
|
||||
to_chat(usr, "Variable appears to be <b>TEXT</b>.")
|
||||
default = "text"
|
||||
|
||||
else if(isloc(var_value))
|
||||
to_chat(usr, "Variable appears to be <b>REFERENCE</b>.")
|
||||
default = "reference"
|
||||
|
||||
else if(isicon(var_value))
|
||||
to_chat(usr, "Variable appears to be <b>ICON</b>.")
|
||||
var_value = "[bicon(var_value)]"
|
||||
default = "icon"
|
||||
|
||||
else if(istype(var_value,/atom) || istype(var_value,/datum))
|
||||
to_chat(usr, "Variable appears to be <b>TYPE</b>.")
|
||||
default = "type"
|
||||
|
||||
else if(istype(var_value,/list))
|
||||
to_chat(usr, "Variable appears to be <b>LIST</b>.")
|
||||
default = "list"
|
||||
|
||||
else if(istype(var_value,/client))
|
||||
to_chat(usr, "Variable appears to be <b>CLIENT</b>.")
|
||||
default = "cancel"
|
||||
default = vv_get_class(var_value)
|
||||
|
||||
if(isnull(default))
|
||||
to_chat(src, "Unable to determine variable type.")
|
||||
else
|
||||
to_chat(usr, "Variable appears to be <b>FILE</b>.")
|
||||
default = "file"
|
||||
to_chat(src, "Variable appears to be <b>[uppertext(default)]</b>.")
|
||||
|
||||
to_chat(usr, "Variable contains: [var_value]")
|
||||
if(dir)
|
||||
switch(var_value)
|
||||
if(1)
|
||||
dir = "NORTH"
|
||||
if(2)
|
||||
dir = "SOUTH"
|
||||
if(4)
|
||||
dir = "EAST"
|
||||
if(8)
|
||||
dir = "WEST"
|
||||
if(5)
|
||||
dir = "NORTHEAST"
|
||||
if(6)
|
||||
dir = "SOUTHEAST"
|
||||
if(9)
|
||||
dir = "NORTHWEST"
|
||||
if(10)
|
||||
dir = "SOUTHWEST"
|
||||
else
|
||||
dir = null
|
||||
if(dir)
|
||||
to_chat(usr, "If a direction, direction is: [dir]")
|
||||
to_chat(src, "Variable contains: [var_value]")
|
||||
|
||||
var/class = input("What kind of variable?","Variable Type",default) as null|anything in list("text",
|
||||
"num","type","icon","file","edit referenced object","restore to default")
|
||||
if(default == VV_NUM)
|
||||
var/dir_text = ""
|
||||
if(dir < 0 && dir < 16)
|
||||
if(dir & 1)
|
||||
dir_text += "NORTH"
|
||||
if(dir & 2)
|
||||
dir_text += "SOUTH"
|
||||
if(dir & 4)
|
||||
dir_text += "EAST"
|
||||
if(dir & 8)
|
||||
dir_text += "WEST"
|
||||
|
||||
if(!class)
|
||||
if(dir_text)
|
||||
to_chat(src, "If a direction, direction is: [dir_text]")
|
||||
|
||||
var/value = vv_get_value(default_class = default)
|
||||
var/new_value = value["value"]
|
||||
var/class = value["class"]
|
||||
|
||||
if(!class || !new_value == null && class != VV_NULL)
|
||||
return
|
||||
|
||||
var/original_name
|
||||
if(class == VV_MESSAGE)
|
||||
class = VV_TEXT
|
||||
|
||||
if(!istype(O, /atom))
|
||||
original_name = "\ref[O] ([O])"
|
||||
else
|
||||
original_name = O:name
|
||||
if(value["type"])
|
||||
class = VV_NEW_TYPE
|
||||
|
||||
var/original_name = "[O]"
|
||||
|
||||
var/rejected = 0
|
||||
var/accepted = 0
|
||||
|
||||
switch(class)
|
||||
if(VV_RESTORE_DEFAULT)
|
||||
to_chat(src, "Finding items...")
|
||||
var/list/items = get_all_of_type(O.type, method)
|
||||
to_chat(src, "Changing [items.len] items...")
|
||||
for(var/thing in items)
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/D = thing
|
||||
if(D.vv_edit_var(variable, initial(D.vars[variable])) != FALSE)
|
||||
accepted++
|
||||
else
|
||||
rejected++
|
||||
CHECK_TICK
|
||||
|
||||
if("restore to default")
|
||||
O.vars[variable] = initial(O.vars[variable])
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
M.on_varedit(variable)
|
||||
if(VV_TEXT)
|
||||
var/list/varsvars = vv_parse_text(O, new_value)
|
||||
var/pre_processing = new_value
|
||||
var/unique
|
||||
if(varsvars && varsvars.len)
|
||||
unique = alert(usr, "Process vars unique to each instance, or same for all?", "Variable Association", "Unique", "Same")
|
||||
if(unique == "Unique")
|
||||
unique = TRUE
|
||||
else
|
||||
unique = FALSE
|
||||
for(var/V in varsvars)
|
||||
new_value = replacetext(new_value,"\[[V]]","[O.vars[V]]")
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
to_chat(src, "Finding items...")
|
||||
var/list/items = get_all_of_type(O.type, method)
|
||||
to_chat(src, "Changing [items.len] items...")
|
||||
for(var/thing in items)
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/D = thing
|
||||
if(unique)
|
||||
new_value = pre_processing
|
||||
for(var/V in varsvars)
|
||||
new_value = replacetext(new_value,"\[[V]]","[D.vars[V]]")
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
if(D.vv_edit_var(variable, new_value) != FALSE)
|
||||
accepted++
|
||||
else
|
||||
rejected++
|
||||
CHECK_TICK
|
||||
|
||||
if(VV_NEW_TYPE)
|
||||
var/many = alert(src, "Create only one [value["type"]] and assign each or a new one for each thing", "How Many", "One", "Many", "Cancel")
|
||||
if(many == "Cancel")
|
||||
return
|
||||
if(many == "Many")
|
||||
many = TRUE
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
M.on_varedit(variable)
|
||||
many = FALSE
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
var/type = value["type"]
|
||||
to_chat(src, "Finding items...")
|
||||
var/list/items = get_all_of_type(O.type, method)
|
||||
to_chat(src, "Changing [items.len] items...")
|
||||
for(var/thing in items)
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/D = thing
|
||||
if(many && !new_value)
|
||||
new_value = new type()
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
A.on_varedit(variable)
|
||||
if(D.vv_edit_var(variable, new_value) != FALSE)
|
||||
accepted++
|
||||
else
|
||||
rejected++
|
||||
new_value = null
|
||||
CHECK_TICK
|
||||
|
||||
if("edit referenced object")
|
||||
return .(O.vars[variable])
|
||||
else
|
||||
to_chat(src, "Finding items...")
|
||||
var/list/items = get_all_of_type(O.type, method)
|
||||
to_chat(src, "Changing [items.len] items...")
|
||||
for(var/thing in items)
|
||||
if(!thing)
|
||||
continue
|
||||
var/datum/D = thing
|
||||
if(D.vv_edit_var(variable, new_value) != FALSE)
|
||||
accepted++
|
||||
else
|
||||
rejected++
|
||||
CHECK_TICK
|
||||
|
||||
if("text")
|
||||
var/new_value = input("Enter new text:","Text",O.vars[variable]) as message|null
|
||||
if(new_value == null) return
|
||||
O.vars[variable] = new_value
|
||||
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
var/count = rejected+accepted
|
||||
if(!count)
|
||||
to_chat(src, "No objects found")
|
||||
return
|
||||
if(!accepted)
|
||||
to_chat(src, "Every object rejected your edit")
|
||||
return
|
||||
if(rejected)
|
||||
to_chat(src, "[rejected] out of [count] objects rejected your edit")
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
log_to_dd("### MassVarEdit by [src]: [O.type] (A/R [accepted]/[rejected]) [variable]=[html_encode("[O.vars[variable]]")]([list2params(value)])")
|
||||
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
|
||||
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
/proc/get_all_of_type(var/T, subtypes = TRUE)
|
||||
var/list/typecache = list()
|
||||
typecache[T] = 1
|
||||
if(subtypes)
|
||||
typecache = typecacheof(typecache)
|
||||
. = list()
|
||||
if(ispath(T, /mob))
|
||||
for(var/mob/thing in mob_list)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /obj/machinery/door))
|
||||
for(var/obj/machinery/door/thing in airlocks)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /obj/machinery))
|
||||
for(var/obj/machinery/thing in machines)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
if("num")
|
||||
var/new_value = input("Enter new number:","Num",\
|
||||
O.vars[variable]) as num|null
|
||||
if(new_value == null) return
|
||||
else if(ispath(T, /obj))
|
||||
for(var/obj/thing in world)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
if(variable=="light_range")
|
||||
O.set_light(new_value)
|
||||
else
|
||||
O.vars[variable] = new_value
|
||||
else if(ispath(T, /atom/movable))
|
||||
for(var/atom/movable/thing in world)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
if(variable=="light_range")
|
||||
M.set_light(new_value)
|
||||
else
|
||||
M.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /turf))
|
||||
for(var/turf/thing in world)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
if(variable=="light_range")
|
||||
A.set_light(new_value)
|
||||
else
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /atom))
|
||||
for(var/atom/thing in world)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
if(variable=="light_range")
|
||||
A.set_light(new_value)
|
||||
else
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /client))
|
||||
for(var/client/thing in clients)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
if(variable=="light_range")
|
||||
M.set_light(new_value)
|
||||
else
|
||||
M.vars[variable] = O.vars[variable]
|
||||
else if(ispath(T, /datum))
|
||||
for(var/datum/thing)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
if(variable=="light_range")
|
||||
A.set_light(new_value)
|
||||
else
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
if(variable=="light_range")
|
||||
A.set_light(new_value)
|
||||
else
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
if("type")
|
||||
var/new_value
|
||||
new_value = input("Enter type:","Type",O.vars[variable]) as null|anything in typesof(/obj,/mob,/area,/turf)
|
||||
if(new_value == null) return
|
||||
O.vars[variable] = new_value
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
if("file")
|
||||
var/new_value = input("Pick file:","File",O.vars[variable]) as null|file
|
||||
if(new_value == null) return
|
||||
O.vars[variable] = new_value
|
||||
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O.type, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O.type, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O.type, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O.type, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
if("icon")
|
||||
var/new_value = input("Pick icon:","Icon",O.vars[variable]) as null|icon
|
||||
if(new_value == null) return
|
||||
O.vars[variable] = new_value
|
||||
if(method)
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if( istype(M , O.type) )
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if( istype(A , O.type) )
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else
|
||||
if(istype(O, /mob))
|
||||
for(var/mob/M in mob_list)
|
||||
if(M.type == O.type)
|
||||
M.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /obj))
|
||||
for(var/obj/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
else if(istype(O, /turf))
|
||||
for(var/turf/A in world)
|
||||
if(A.type == O.type)
|
||||
A.vars[variable] = O.vars[variable]
|
||||
|
||||
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]")
|
||||
message_admins("[key_name_admin(src)] mass modified [original_name]'s [variable] to [O.vars[variable]]", 1)
|
||||
else
|
||||
for(var/datum/thing in world)
|
||||
if(typecache[thing.type])
|
||||
. += thing
|
||||
CHECK_TICK
|
||||
File diff suppressed because it is too large
Load Diff
@@ -513,7 +513,7 @@ client/proc/one_click_antag()
|
||||
new_vox.update_eyes()
|
||||
|
||||
for(var/obj/item/organ/external/limb in new_vox.bodyparts)
|
||||
limb.status &= ~(ORGAN_DESTROYED | ORGAN_ROBOT)
|
||||
limb.status &= ~ORGAN_ROBOT
|
||||
|
||||
//Now apply cortical stack.
|
||||
var/obj/item/weapon/implant/cortical/I = new(new_vox)
|
||||
|
||||
@@ -6,7 +6,7 @@ var/list/sounds_cache = list()
|
||||
if(!check_rights(R_SOUNDS))
|
||||
return
|
||||
|
||||
var/sound/awful_sound = sound(null, repeat = 0, wait = 0, channel = 777)
|
||||
var/sound/awful_sound = sound(null, repeat = 0, wait = 0, channel = CHANNEL_ADMIN)
|
||||
|
||||
log_admin("[key_name(src)] stopped admin sounds.")
|
||||
message_admins("[key_name_admin(src)] stopped admin sounds.", 1)
|
||||
@@ -18,7 +18,7 @@ var/list/sounds_cache = list()
|
||||
set name = "Play Global Sound"
|
||||
if(!check_rights(R_SOUNDS)) return
|
||||
|
||||
var/sound/uploaded_sound = sound(S, repeat = 0, wait = 1, channel = 777)
|
||||
var/sound/uploaded_sound = sound(S, repeat = 0, wait = 1, channel = CHANNEL_ADMIN)
|
||||
uploaded_sound.priority = 250
|
||||
|
||||
sounds_cache += S
|
||||
|
||||
@@ -13,7 +13,22 @@
|
||||
return
|
||||
|
||||
var/image/cross = image('icons/obj/storage.dmi',"bible")
|
||||
msg = "<span class='notice'>[bicon(cross)] <b><font color=purple>PRAY: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=[UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;adminspawncookie=\ref[src]'>SC</a>) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
|
||||
var/font_color = "purple"
|
||||
var/prayer_type = "PRAYER"
|
||||
var/deity
|
||||
if(usr.job == "Chaplain")
|
||||
if(ticker && ticker.Bible_deity_name)
|
||||
deity = ticker.Bible_deity_name
|
||||
cross = image('icons/obj/storage.dmi',"kingyellow")
|
||||
font_color = "blue"
|
||||
prayer_type = "CHAPLAIN PRAYER"
|
||||
else if(iscultist(usr))
|
||||
cross = image('icons/obj/storage.dmi',"tome")
|
||||
font_color = "red"
|
||||
prayer_type = "CULTIST PRAYER"
|
||||
deity = ticker.mode.cultdat.entity_name
|
||||
|
||||
msg = "<span class='notice'>[bicon(cross)]<b><font color=[font_color]>[prayer_type][deity ? " (to [deity])" : ""]:</font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=[UID()]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;adminspawncookie=\ref[src]'>SC</a>) (<A HREF='?_src_=holder;Bless=[UID()]'>BLESS</A>) (<A HREF='?_src_=holder;Smite=[UID()]'>SMITE</A>):</b> [msg]</span>"
|
||||
|
||||
for(var/client/X in admins)
|
||||
if(check_rights(R_EVENT,0,X.mob))
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
if(usr)
|
||||
if(usr.client)
|
||||
if(usr.client.holder)
|
||||
to_chat(M, "<b>old You hear a voice in your head... <i>[msg]</i></b>")
|
||||
to_chat(M, "<b>You hear a voice in your head... <i>[msg]</i></b>")
|
||||
|
||||
log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]")
|
||||
message_admins("<span class='boldnotice'>SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]</span>", 1)
|
||||
@@ -588,22 +588,30 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view())
|
||||
/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in view())
|
||||
set category = "Admin"
|
||||
set name = "Delete"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
if(alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
|
||||
log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
|
||||
message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])", 1)
|
||||
admin_delete(A)
|
||||
|
||||
/client/proc/admin_delete(datum/D)
|
||||
if(istype(D) && !D.can_vv_delete())
|
||||
to_chat(src, "[D] rejected your deletion")
|
||||
return
|
||||
var/atom/A = D
|
||||
var/coords = istype(A) ? "at ([A.x], [A.y], [A.z])" : ""
|
||||
if(alert(src, "Are you sure you want to delete:\n[D]\n[coords]?", "Confirmation", "Yes", "No") == "Yes")
|
||||
log_admin("[key_name(usr)] deleted [D][coords]")
|
||||
message_admins("[key_name_admin(usr)] deleted [D][coords]", 1)
|
||||
feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
if(istype(O, /turf))
|
||||
var/turf/T = O
|
||||
if(isturf(D))
|
||||
var/turf/T = D
|
||||
T.ChangeTurf(/turf/space)
|
||||
return
|
||||
qdel(O)
|
||||
else
|
||||
qdel(D)
|
||||
|
||||
/client/proc/cmd_admin_list_open_jobs()
|
||||
set category = "Admin"
|
||||
@@ -687,7 +695,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1)
|
||||
|
||||
if(istype(M, /mob/dead/observer))
|
||||
gibs(M.loc, M.viruses)
|
||||
gibs(M.loc)
|
||||
return
|
||||
|
||||
M.gib()
|
||||
@@ -882,6 +890,48 @@ Traitors and the like can also be revived with the previous role mostly intact.
|
||||
message_admins("[key_name_admin(usr)] blanked all telecomms scripts.")
|
||||
feedback_add_details("admin_verb","RAT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/proc/list_ssds()
|
||||
set category = "Admin"
|
||||
set name = "List SSDs"
|
||||
set desc = "Lists SSD players"
|
||||
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
|
||||
var/msg = "<html><head><title>SSD Report</title></head><body>"
|
||||
msg += "SSD Players:<BR><TABLE border='1'>"
|
||||
msg += "<TR><TD><B>Key</B></TD><TD><B>Real Name</B></TD><TD><B>Job</B></TD><TD><B>Mins SSD</B></TD><TD><B>Special Role</B></TD><TD><B>Area</B></TD><TD><B>PPN</B></TD><TD><B>Cryo</B></TD></TR>"
|
||||
var/mins_ssd
|
||||
var/job_string
|
||||
var/key_string
|
||||
var/role_string
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
if(!isLivingSSD(H))
|
||||
continue
|
||||
mins_ssd = round((world.time - H.last_logout) / 600)
|
||||
if(H.job)
|
||||
job_string = H.job
|
||||
else
|
||||
job_string = "-"
|
||||
key_string = H.key
|
||||
if(job_string in command_positions)
|
||||
job_string = "<U>" + job_string + "</U>"
|
||||
role_string = "-"
|
||||
if(H.mind)
|
||||
if(H.mind.special_role)
|
||||
role_string = "<U>[H.mind.special_role]</U>"
|
||||
if(!H.key && H.mind.key)
|
||||
key_string = H.mind.key
|
||||
msg += "<TR><TD>[key_string]</TD><TD>[H.real_name]</TD><TD>[job_string]</TD><TD>[mins_ssd]</TD><TD>[role_string]</TD>"
|
||||
msg += "<TD>[get_area(H)]</TD><TD><A HREF='?_src_=holder;adminplayeropts=\ref[H]'>PP</A></TD>"
|
||||
if(istype(H.loc, /obj/machinery/cryopod))
|
||||
msg += "<TD>In Cryo</TD>"
|
||||
else
|
||||
msg += "<TD><A href='?_src_=holder;cryossd=[H.UID()]'>Cryo</A></TD>"
|
||||
msg += "</TR>"
|
||||
msg += "</TABLE></BODY></HTML>"
|
||||
src << browse(msg, "window=Player_ssd_check")
|
||||
|
||||
/client/proc/toggle_ert_calling()
|
||||
set category = "Event"
|
||||
set name = "Toggle ERT"
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
/*
|
||||
SwapMaps library by Lummox JR
|
||||
developed for digitalBYOND
|
||||
|
||||
@@ -179,6 +179,10 @@
|
||||
(the writing trails off, as if the writer was interrupted)<br>
|
||||
"}
|
||||
|
||||
/obj/item/weapon/paper/terrorspiders9
|
||||
name = "paper - 'Research Notes'"
|
||||
info = "<b>The notes appear gibberish to you. Perhaps a destructive analyser in R&D could make sense of them.</b>"
|
||||
origin_tech = "combat=4;materials=4;engineering=4;biotech=4"
|
||||
|
||||
/obj/item/weapon/gun/energy/laser/awaymission_aeg
|
||||
name = "Wireless Energy Gun"
|
||||
|
||||
@@ -436,6 +436,8 @@
|
||||
on_holder_add()
|
||||
add_admin_verbs()
|
||||
admin_memo_output("Show", 0, 1)
|
||||
if(custom_event_admin_msg && custom_event_admin_msg != "" && check_rights(R_EVENT))
|
||||
cmd_view_custom_event_info()
|
||||
|
||||
// Forcibly enable hardware-accelerated graphics, as we need them for the lighting overlays.
|
||||
// (but turn them off first, since sometimes BYOND doesn't turn them on properly otherwise)
|
||||
|
||||
@@ -142,5 +142,62 @@
|
||||
display_name = "simple necklace"
|
||||
path = /obj/item/clothing/accessory/necklace
|
||||
|
||||
/datum/gear/accessory/corset
|
||||
display_name = "corset, black"
|
||||
path = /obj/item/clothing/accessory/corset
|
||||
|
||||
/datum/gear/accessory/corsetred
|
||||
display_name = "corset, red"
|
||||
path = /obj/item/clothing/accessory/corset/red
|
||||
|
||||
/datum/gear/accessory/corsetblue
|
||||
display_name = "corset, blue"
|
||||
path = /obj/item/clothing/accessory/corset/blue
|
||||
|
||||
|
||||
/datum/gear/accessory/armband_red
|
||||
display_name = "armband"
|
||||
path = /obj/item/clothing/accessory/armband
|
||||
|
||||
/datum/gear/accessory/armband_civ
|
||||
display_name = "armband, blue-yellow"
|
||||
path = /obj/item/clothing/accessory/armband/yb
|
||||
|
||||
/datum/gear/accessory/armband_sec
|
||||
display_name = " armband, security"
|
||||
path = /obj/item/clothing/accessory/armband/sec
|
||||
allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Brig Physician")
|
||||
|
||||
/datum/gear/accessory/armband_cargo
|
||||
display_name = "cargo armband"
|
||||
path = /obj/item/clothing/accessory/armband/cargo
|
||||
allowed_roles = list("Quartermaster","Cargo Technician", "Shaft Miner")
|
||||
|
||||
/datum/gear/accessory/armband_medical
|
||||
display_name = "armband, medical"
|
||||
path = /obj/item/clothing/accessory/armband/med
|
||||
allowed_roles = list("Chief Medical Officer", "Medical Doctor", "Coroner", "Paramedic", "Brig Physician")
|
||||
|
||||
/datum/gear/accessory/armband_emt
|
||||
display_name = "armband, EMT"
|
||||
path = /obj/item/clothing/accessory/armband/medgreen
|
||||
allowed_roles = list("Paramedic", "Brig Physician")
|
||||
|
||||
/datum/gear/accessory/armband_engineering
|
||||
display_name = "armband, engineering"
|
||||
path = /obj/item/clothing/accessory/armband/engine
|
||||
allowed_roles = list("Chief Engineer","Station Engineer", "Life Support Specialist")
|
||||
|
||||
/datum/gear/accessory/armband_hydro
|
||||
display_name = "armband, hydroponics"
|
||||
path = /obj/item/clothing/accessory/armband/hydro
|
||||
allowed_roles = list("Botanist")
|
||||
|
||||
/datum/gear/accessory/armband_sci
|
||||
display_name = "armband, science"
|
||||
path = /obj/item/clothing/accessory/armband/science
|
||||
allowed_roles = list("Research Director","Scientist", "Roboticist")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -147,4 +147,12 @@
|
||||
/datum/gear/hat/surgicalcap_green
|
||||
display_name = "surgical cap, green"
|
||||
path = /obj/item/clothing/head/surgery/green
|
||||
allowed_roles = list("Chief Medical Officer", "Medical Doctor")
|
||||
allowed_roles = list("Chief Medical Officer", "Medical Doctor")
|
||||
|
||||
/datum/gear/hat/flowerpin
|
||||
display_name = "hair flower"
|
||||
path = /obj/item/clothing/head/hairflower
|
||||
|
||||
/datum/gear/hat/flowerpinpurp
|
||||
display_name = "hair flower, purple"
|
||||
path = /obj/item/clothing/head/hairflower/purple
|
||||
@@ -8,6 +8,7 @@
|
||||
display_name = "embroidered veil"
|
||||
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races."
|
||||
path = /obj/item/clothing/glasses/tajblind
|
||||
cost = 1
|
||||
|
||||
/datum/gear/racial/tajsec
|
||||
display_name = "sleek veil"
|
||||
@@ -37,4 +38,9 @@
|
||||
display_name = "khaki veil"
|
||||
description = "A common traditional nano-fiber veil worn by many Tajaran, It is rare and offensive to see it on other races. It is light and comfy!"
|
||||
path = /obj/item/clothing/glasses/tajblind/cargo
|
||||
allowed_roles = list("Quartermaster","Cargo Technician", "Miner")
|
||||
allowed_roles = list("Quartermaster","Cargo Technician", "Miner")
|
||||
|
||||
/datum/gear/racial/footwraps
|
||||
display_name = "cloth footwraps"
|
||||
path = /obj/item/clothing/shoes/footwraps
|
||||
cost = 1
|
||||
@@ -223,3 +223,4 @@
|
||||
/datum/gear/uniform/pants/caopants
|
||||
display_name = "pants, camo"
|
||||
path = /obj/item/clothing/under/pants/camo
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
|
||||
|
||||
var/list/preferences_datums = list()
|
||||
|
||||
var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles
|
||||
@@ -112,9 +110,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
var/socks = "Nude" //socks type
|
||||
var/backbag = GBACKPACK //backpack type
|
||||
var/ha_style = "None" //Head accessory style
|
||||
var/r_headacc = 0 //Head accessory colour
|
||||
var/g_headacc = 0 //Head accessory colour
|
||||
var/b_headacc = 0 //Head accessory colour
|
||||
var/hacc_colour = "#000000" //Head accessory colour
|
||||
var/list/m_styles = list(
|
||||
"head" = "None",
|
||||
"body" = "None",
|
||||
@@ -126,26 +122,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
"tail" = "#000000"
|
||||
) //Marking colours.
|
||||
var/h_style = "Bald" //Hair type
|
||||
var/r_hair = 0 //Hair color
|
||||
var/g_hair = 0 //Hair color
|
||||
var/b_hair = 0 //Hair color
|
||||
var/r_hair_sec = 0 //Secondary hair color
|
||||
var/g_hair_sec = 0 //Secondary hair color
|
||||
var/b_hair_sec = 0 //Secondary hair color
|
||||
var/h_colour = "#000000" //Hair color
|
||||
var/h_sec_colour = "#000000" //Secondary hair color
|
||||
var/f_style = "Shaved" //Facial hair type
|
||||
var/r_facial = 0 //Facial hair color
|
||||
var/g_facial = 0 //Facial hair color
|
||||
var/b_facial = 0 //Facial hair color
|
||||
var/r_facial_sec = 0 //Secondary facial hair color
|
||||
var/g_facial_sec = 0 //Secondary facial hair color
|
||||
var/b_facial_sec = 0 //Secondary facial hair color
|
||||
var/f_colour = "#000000" //Facial hair color
|
||||
var/f_sec_colour = "#000000" //Secondary facial hair color
|
||||
var/s_tone = 0 //Skin tone
|
||||
var/r_skin = 0 //Skin color
|
||||
var/g_skin = 0 //Skin color
|
||||
var/b_skin = 0 //Skin color
|
||||
var/r_eyes = 0 //Eye color
|
||||
var/g_eyes = 0 //Eye color
|
||||
var/b_eyes = 0 //Eye color
|
||||
var/s_colour = "#000000" //Skin color
|
||||
var/e_colour = "#000000" //Eye color
|
||||
var/alt_head = "None" //Alt head style.
|
||||
var/species = "Human"
|
||||
var/language = "None" //Secondary language
|
||||
@@ -241,8 +225,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
save_preferences(C)
|
||||
save_character(C) //let's save this new random character so it doesn't keep generating new ones.
|
||||
|
||||
/datum/preferences/proc/color_square(r, g, b)
|
||||
return "<span style='font-face: fixedsys; background-color: #[num2hex(r, 2)][num2hex(g, 2)][num2hex(b, 2)]; color: #[num2hex(r, 2)][num2hex(g, 2)][num2hex(b, 2)]'>___</span>"
|
||||
/datum/preferences/proc/color_square(colour)
|
||||
return "<span style='font-face: fixedsys; background-color: [colour]; color: [colour]'>___</span>"
|
||||
|
||||
// Hello I am a proc full of snowflake species checks how are you
|
||||
/datum/preferences/proc/ShowChoices(mob/user)
|
||||
@@ -319,45 +303,45 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
headaccessoryname = "Horns: "
|
||||
dat += "<b>[headaccessoryname]</b>"
|
||||
dat += "<a href='?_src_=prefs;preference=ha_style;task=input'>[ha_style]</a> "
|
||||
dat += "<a href='?_src_=prefs;preference=headaccessory;task=input'>Color</a> [color_square(r_headacc, g_headacc, b_headacc)]<br>"
|
||||
dat += "<a href='?_src_=prefs;preference=headaccessory;task=input'>Color</a> [color_square(hacc_colour)]<br>"
|
||||
|
||||
if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings.
|
||||
dat += "<b>Head Markings:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=m_style_head;task=input'>[m_styles["head"]]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=m_head_colour;task=input'>Color</a> [color_square(color2R(m_colours["head"]), color2G(m_colours["head"]), color2B(m_colours["head"]))]<br>"
|
||||
dat += "<a href='?_src_=prefs;preference=m_head_colour;task=input'>Color</a> [color_square(m_colours["head"])]<br>"
|
||||
if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings/tattoos.
|
||||
dat += "<b>Body Markings:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=m_style_body;task=input'>[m_styles["body"]]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=m_body_colour;task=input'>Color</a> [color_square(color2R(m_colours["body"]), color2G(m_colours["body"]), color2B(m_colours["body"]))]<br>"
|
||||
dat += "<a href='?_src_=prefs;preference=m_body_colour;task=input'>Color</a> [color_square(m_colours["body"])]<br>"
|
||||
if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
|
||||
dat += "<b>Tail Markings:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=m_style_tail;task=input'>[m_styles["tail"]]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=m_tail_colour;task=input'>Color</a> [color_square(color2R(m_colours["tail"]), color2G(m_colours["tail"]), color2B(m_colours["tail"]))]<br>"
|
||||
dat += "<a href='?_src_=prefs;preference=m_tail_colour;task=input'>Color</a> [color_square(m_colours["tail"])]<br>"
|
||||
|
||||
dat += "<b>Hair:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=h_style;task=input'>[h_style]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=hair;task=input'>Color</a> [color_square(r_hair, g_hair, b_hair)]"
|
||||
var/datum/sprite_accessory/temp_hair_style = hair_styles_list[h_style]
|
||||
dat += "<a href='?_src_=prefs;preference=hair;task=input'>Color</a> [color_square(h_colour)]"
|
||||
var/datum/sprite_accessory/temp_hair_style = hair_styles_public_list[h_style]
|
||||
if(temp_hair_style && temp_hair_style.secondary_theme && !temp_hair_style.no_sec_colour)
|
||||
dat += " <a href='?_src_=prefs;preference=secondary_hair;task=input'>Color #2</a> [color_square(r_hair_sec, g_hair_sec, b_hair_sec)]"
|
||||
dat += " <a href='?_src_=prefs;preference=secondary_hair;task=input'>Color #2</a> [color_square(h_sec_colour)]"
|
||||
dat += "<br>"
|
||||
|
||||
dat += "<b>Facial Hair:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=f_style;task=input'>[f_style ? "[f_style]" : "Shaved"]</a>"
|
||||
dat += "<a href='?_src_=prefs;preference=facial;task=input'>Color</a> [color_square(r_facial, g_facial, b_facial)]"
|
||||
dat += "<a href='?_src_=prefs;preference=facial;task=input'>Color</a> [color_square(f_colour)]"
|
||||
var/datum/sprite_accessory/temp_facial_hair_style = facial_hair_styles_list[f_style]
|
||||
if(temp_facial_hair_style && temp_facial_hair_style.secondary_theme && !temp_facial_hair_style.no_sec_colour)
|
||||
dat += " <a href='?_src_=prefs;preference=secondary_facial;task=input'>Color #2</a> [color_square(r_facial_sec, g_facial_sec, b_facial_sec)]"
|
||||
dat += " <a href='?_src_=prefs;preference=secondary_facial;task=input'>Color #2</a> [color_square(f_sec_colour)]"
|
||||
dat += "<br>"
|
||||
|
||||
|
||||
if(!(S.flags & ALL_RPARTS))
|
||||
if(!(S.bodyflags & ALL_RPARTS))
|
||||
dat += "<b>Eyes:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=eyes;task=input'>Color</a> [color_square(r_eyes, g_eyes, b_eyes)]<br>"
|
||||
dat += "<a href='?_src_=prefs;preference=eyes;task=input'>Color</a> [color_square(e_colour)]<br>"
|
||||
|
||||
if((S.bodyflags & HAS_SKIN_COLOR) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user)) //admins can always fuck with this, because they are admins
|
||||
dat += "<b>Body Color:</b> "
|
||||
dat += "<a href='?_src_=prefs;preference=skin;task=input'>Color</a> [color_square(r_skin, g_skin, b_skin)]<br>"
|
||||
dat += "<a href='?_src_=prefs;preference=skin;task=input'>Color</a> [color_square(s_colour)]<br>"
|
||||
|
||||
if(body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
|
||||
dat += "<b>Body Accessory:</b> "
|
||||
@@ -827,7 +811,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
/datum/preferences/proc/ShowDisabilityState(mob/user,flag,label)
|
||||
var/datum/species/S = all_species[species]
|
||||
if(flag==DISABILITY_FLAG_FAT && !(S.flags & CAN_BE_FAT))
|
||||
if(flag==DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))
|
||||
return "<li><i>[species] cannot be fat.</i></li>"
|
||||
return "<li><b>[label]:</b> <a href=\"?_src_=prefs;task=input;preference=disabilities;disability=[flag]\">[disabilities & flag ? "Yes" : "No"]</a></li>"
|
||||
|
||||
@@ -835,13 +819,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
var/HTML = "<body>"
|
||||
HTML += "<tt><center>"
|
||||
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs Glasses")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NEARSIGHTED,"Needs glasses")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_FAT,"Obese")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_EPILEPTIC,"Seizures")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DEAF,"Deaf")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_BLIND,"Blind")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_COLOURBLIND,"Colourblind")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_MUTE,"Mute")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_TOURETTES,"Tourettes syndrome") // this will / can not be abused. It also SEVERELY stuns. It's just for fun.
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_NERVOUS,"Stutter")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_SWEDISH,"Swedish accent")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_LISP,"Lisp")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_DIZZY,"Dizziness")
|
||||
HTML += ShowDisabilityState(user,DISABILITY_FLAG_SCRAMBLED,"Can't speak properly")
|
||||
|
||||
|
||||
HTML += {"</ul>
|
||||
@@ -1089,7 +1079,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if("input")
|
||||
var/dflag=text2num(href_list["disability"])
|
||||
if(dflag >= 0)
|
||||
if(!(dflag==DISABILITY_FLAG_FAT && !(S.flags & CAN_BE_FAT))) //If the disability isn't fatness, toggle it. If it IS fatness, check to see if the species can be fat before going ahead.
|
||||
if(!(dflag==DISABILITY_FLAG_FAT && !(CAN_BE_FAT in S.species_traits))) //If the disability isn't fatness, toggle it. If it IS fatness, check to see if the species can be fat before going ahead.
|
||||
disabilities ^= text2num(href_list["disability"]) //MAGIC
|
||||
SetDisabilities(user)
|
||||
else
|
||||
@@ -1175,43 +1165,36 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
switch(href_list["task"])
|
||||
if("random")
|
||||
var/datum/robolimb/robohead
|
||||
if(S.flags & ALL_RPARTS)
|
||||
if(S.bodyflags & ALL_RPARTS)
|
||||
var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
|
||||
robohead = all_robolimbs[head_model]
|
||||
switch(href_list["preference"])
|
||||
if("name")
|
||||
real_name = random_name(gender,species)
|
||||
if(isnewplayer(user))
|
||||
var/mob/new_player/N = user
|
||||
N.new_player_panel_proc()
|
||||
if("age")
|
||||
age = rand(AGE_MIN, AGE_MAX)
|
||||
if("hair")
|
||||
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
|
||||
r_hair = rand(0,255)
|
||||
g_hair = rand(0,255)
|
||||
b_hair = rand(0,255)
|
||||
h_colour = rand_hex_color()
|
||||
if("secondary_hair")
|
||||
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
|
||||
r_hair_sec = rand(0,255)
|
||||
g_hair_sec = rand(0,255)
|
||||
b_hair_sec = rand(0,255)
|
||||
h_sec_colour = rand_hex_color()
|
||||
if("h_style")
|
||||
h_style = random_hair_style(gender, species, robohead)
|
||||
if("facial")
|
||||
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
|
||||
r_facial = rand(0,255)
|
||||
g_facial = rand(0,255)
|
||||
b_facial = rand(0,255)
|
||||
f_colour = rand_hex_color()
|
||||
if("secondary_facial")
|
||||
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
|
||||
r_facial_sec = rand(0,255)
|
||||
g_facial_sec = rand(0,255)
|
||||
b_facial_sec = rand(0,255)
|
||||
f_sec_colour = rand_hex_color()
|
||||
if("f_style")
|
||||
f_style = random_facial_hair_style(gender, species, robohead)
|
||||
if("headaccessory")
|
||||
if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories.
|
||||
r_headacc = rand(0,255)
|
||||
g_headacc = rand(0,255)
|
||||
b_headacc = rand(0,255)
|
||||
hacc_colour = rand_hex_color()
|
||||
if("ha_style")
|
||||
if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species that have head accessories.
|
||||
ha_style = random_head_accessory(species)
|
||||
@@ -1220,19 +1203,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
|
||||
if("m_head_colour")
|
||||
if(S.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings.
|
||||
m_colours["head"] = rgb(rand(0,255), rand(0,255), rand(0,255))
|
||||
m_colours["head"] = rand_hex_color()
|
||||
if("m_style_body")
|
||||
if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings.
|
||||
m_styles["body"] = random_marking_style("body", species)
|
||||
if("m_body_colour")
|
||||
if(S.bodyflags & HAS_BODY_MARKINGS) //Species with body markings.
|
||||
m_colours["body"] = rgb(rand(0,255), rand(0,255), rand(0,255))
|
||||
m_colours["body"] = rand_hex_color()
|
||||
if("m_style_tail")
|
||||
if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
|
||||
m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
|
||||
if("m_tail_colour")
|
||||
if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
|
||||
m_colours["tail"] = rgb(rand(0,255), rand(0,255), rand(0,255))
|
||||
m_colours["tail"] = rand_hex_color()
|
||||
if("underwear")
|
||||
underwear = random_underwear(gender, species)
|
||||
ShowChoices(user)
|
||||
@@ -1243,17 +1226,13 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
socks = random_socks(gender, species)
|
||||
ShowChoices(user)
|
||||
if("eyes")
|
||||
r_eyes = rand(0,255)
|
||||
g_eyes = rand(0,255)
|
||||
b_eyes = rand(0,255)
|
||||
e_colour = rand_hex_color()
|
||||
if("s_tone")
|
||||
if(S.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE))
|
||||
s_tone = random_skin_tone()
|
||||
if("s_color")
|
||||
if(S.bodyflags & HAS_SKIN_COLOR)
|
||||
r_skin = rand(0,255)
|
||||
g_skin = rand(0,255)
|
||||
b_skin = rand(0,255)
|
||||
s_colour = rand_hex_color()
|
||||
if("bag")
|
||||
backbag = pick(backbaglist)
|
||||
/*if("skin_style")
|
||||
@@ -1268,6 +1247,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
var/new_name = reject_bad_name(raw_name, 1)
|
||||
if(new_name)
|
||||
real_name = new_name
|
||||
if(isnewplayer(user))
|
||||
var/mob/new_player/N = user
|
||||
N.new_player_panel_proc()
|
||||
else
|
||||
to_chat(user, "<font color='red'>Invalid name. Your name should be at least 2 and at most [MAX_NAME_LEN] characters long. It may only contain the characters A-Z, a-z, -, ' and .</font>")
|
||||
|
||||
@@ -1300,7 +1282,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(NS.has_gender && gender == PLURAL)
|
||||
gender = pick(MALE,FEMALE)
|
||||
var/datum/robolimb/robohead
|
||||
if(NS.flags & ALL_RPARTS)
|
||||
if(NS.bodyflags & ALL_RPARTS)
|
||||
var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
|
||||
robohead = all_robolimbs[head_model]
|
||||
//grab one of the valid hair styles for the newly chosen species
|
||||
@@ -1313,9 +1295,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
ha_style = random_head_accessory(species)
|
||||
else
|
||||
ha_style = "None" // No Vulp ears on Unathi
|
||||
r_headacc = 0
|
||||
g_headacc = 0
|
||||
b_headacc = 0
|
||||
hacc_colour = rand_hex_color()
|
||||
|
||||
if(NS.bodyflags & HAS_HEAD_MARKINGS) //Species with head markings.
|
||||
m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
|
||||
@@ -1355,9 +1335,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
s_tone = 0
|
||||
|
||||
if(!(NS.bodyflags & HAS_SKIN_COLOR))
|
||||
r_skin = 0
|
||||
g_skin = 0
|
||||
b_skin = 0
|
||||
s_colour = "#000000"
|
||||
|
||||
alt_head = "None" //No alt heads on species that don't have them.
|
||||
speciesprefs = 0 //My Vox tank shouldn't change how my future Grey talks.
|
||||
@@ -1413,31 +1391,27 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if("hair")
|
||||
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have hair. (No HAS_HAIR flag)
|
||||
var/input = "Choose your character's hair colour:"
|
||||
var/new_hair = input(user, input, "Character Preference", rgb(r_hair, g_hair, b_hair)) as color|null
|
||||
var/new_hair = input(user, input, "Character Preference", h_colour) as color|null
|
||||
if(new_hair)
|
||||
r_hair = color2R(new_hair)
|
||||
g_hair = color2G(new_hair)
|
||||
b_hair = color2B(new_hair)
|
||||
h_colour = new_hair
|
||||
|
||||
if("secondary_hair")
|
||||
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
|
||||
var/datum/sprite_accessory/hair_style = hair_styles_list[h_style]
|
||||
var/datum/sprite_accessory/hair_style = hair_styles_public_list[h_style]
|
||||
if(hair_style.secondary_theme && !hair_style.no_sec_colour)
|
||||
var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", rgb(r_hair_sec, g_hair_sec, b_hair_sec)) as color|null
|
||||
var/new_hair = input(user, "Choose your character's secondary hair colour:", "Character Preference", h_sec_colour) as color|null
|
||||
if(new_hair)
|
||||
r_hair_sec = color2R(new_hair)
|
||||
g_hair_sec = color2G(new_hair)
|
||||
b_hair_sec = color2B(new_hair)
|
||||
h_sec_colour = new_hair
|
||||
|
||||
if("h_style")
|
||||
var/list/valid_hairstyles = list()
|
||||
for(var/hairstyle in hair_styles_list)
|
||||
var/datum/sprite_accessory/SA = hair_styles_list[hairstyle]
|
||||
for(var/hairstyle in hair_styles_public_list)
|
||||
var/datum/sprite_accessory/SA = hair_styles_public_list[hairstyle]
|
||||
|
||||
if(hairstyle == "Bald") //Just in case.
|
||||
valid_hairstyles += hairstyle
|
||||
continue
|
||||
if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads.
|
||||
if(S.bodyflags & ALL_RPARTS) //Species that can use prosthetic heads.
|
||||
var/head_model
|
||||
if(!rlimb_data["head"]) //Handle situations where the head is default.
|
||||
head_model = "Morpheus Cyberkinetics"
|
||||
@@ -1461,11 +1435,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if("headaccessory")
|
||||
if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species with head accessories.
|
||||
var/input = "Choose the colour of your your character's head accessory:"
|
||||
var/new_head_accessory = input(user, input, "Character Preference", rgb(r_headacc, g_headacc, b_headacc)) as color|null
|
||||
var/new_head_accessory = input(user, input, "Character Preference", hacc_colour) as color|null
|
||||
if(new_head_accessory)
|
||||
r_headacc = color2R(new_head_accessory)
|
||||
g_headacc = color2G(new_head_accessory)
|
||||
b_headacc = color2B(new_head_accessory)
|
||||
hacc_colour = new_head_accessory
|
||||
|
||||
if("ha_style")
|
||||
if(S.bodyflags & HAS_HEAD_ACCESSORY) //Species with head accessories.
|
||||
@@ -1520,7 +1492,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(M.heads_allowed && !("All" in M.heads_allowed))
|
||||
continue
|
||||
|
||||
if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads.
|
||||
if(S.bodyflags & ALL_RPARTS) //Species that can use prosthetic heads.
|
||||
var/head_model
|
||||
if(!rlimb_data["head"]) //Handle situations where the head is default.
|
||||
head_model = "Morpheus Cyberkinetics"
|
||||
@@ -1620,21 +1592,17 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
if("facial")
|
||||
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox")) //Species that have facial hair. (No HAS_HAIR_FACIAL flag)
|
||||
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", rgb(r_facial, g_facial, b_facial)) as color|null
|
||||
var/new_facial = input(user, "Choose your character's facial-hair colour:", "Character Preference", f_colour) as color|null
|
||||
if(new_facial)
|
||||
r_facial = color2R(new_facial)
|
||||
g_facial = color2G(new_facial)
|
||||
b_facial = color2B(new_facial)
|
||||
f_colour = new_facial
|
||||
|
||||
if("secondary_facial")
|
||||
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
|
||||
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
|
||||
if(facial_hair_style.secondary_theme && !facial_hair_style.no_sec_colour)
|
||||
var/new_facial = input(user, "Choose your character's secondary facial-hair colour:", "Character Preference", rgb(r_facial_sec, g_facial_sec, b_facial_sec)) as color|null
|
||||
var/new_facial = input(user, "Choose your character's secondary facial-hair colour:", "Character Preference", f_sec_colour) as color|null
|
||||
if(new_facial)
|
||||
r_facial_sec = color2R(new_facial)
|
||||
g_facial_sec = color2G(new_facial)
|
||||
b_facial_sec = color2B(new_facial)
|
||||
f_sec_colour = new_facial
|
||||
|
||||
if("f_style")
|
||||
var/list/valid_facial_hairstyles = list()
|
||||
@@ -1648,7 +1616,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
continue
|
||||
if(gender == FEMALE && SA.gender == MALE)
|
||||
continue
|
||||
if(S.flags & ALL_RPARTS) //Species that can use prosthetic heads.
|
||||
if(S.bodyflags & ALL_RPARTS) //Species that can use prosthetic heads.
|
||||
var/head_model
|
||||
if(!rlimb_data["head"]) //Handle situations where the head is default.
|
||||
head_model = "Morpheus Cyberkinetics"
|
||||
@@ -1717,11 +1685,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
socks = new_socks
|
||||
|
||||
if("eyes")
|
||||
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", rgb(r_eyes, g_eyes, b_eyes)) as color|null
|
||||
var/new_eyes = input(user, "Choose your character's eye colour:", "Character Preference", e_colour) as color|null
|
||||
if(new_eyes)
|
||||
r_eyes = color2R(new_eyes)
|
||||
g_eyes = color2G(new_eyes)
|
||||
b_eyes = color2B(new_eyes)
|
||||
e_colour = new_eyes
|
||||
|
||||
if("s_tone")
|
||||
if(S.bodyflags & HAS_SKIN_TONE)
|
||||
@@ -1744,12 +1710,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
if("skin")
|
||||
if((S.bodyflags & HAS_SKIN_COLOR) || body_accessory_by_species[species] || check_rights(R_ADMIN, 0, user))
|
||||
var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", rgb(r_skin, g_skin, b_skin)) as color|null
|
||||
var/new_skin = input(user, "Choose your character's skin colour: ", "Character Preference", s_colour) as color|null
|
||||
if(new_skin)
|
||||
r_skin = color2R(new_skin)
|
||||
g_skin = color2G(new_skin)
|
||||
b_skin = color2B(new_skin)
|
||||
|
||||
s_colour = new_skin
|
||||
|
||||
if("ooccolor")
|
||||
var/new_ooccolor = input(user, "Choose your OOC colour:", "Game Preference", ooccolor) as color|null
|
||||
@@ -1767,7 +1730,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
nanotrasen_relation = new_relation
|
||||
|
||||
if("flavor_text")
|
||||
var/msg = input(usr,"Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!","Flavor Text",html_decode(flavor_text)) as message
|
||||
var/msg = input(usr,"Set the flavor text in your 'examine' verb. The flavor text should be a physical descriptor of your character at a glance. SFW Drawn Art of your character is acceptable.","Flavor Text",html_decode(flavor_text)) as message
|
||||
|
||||
if(msg != null)
|
||||
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
|
||||
@@ -1777,7 +1740,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
if("limbs")
|
||||
var/valid_limbs = list("Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
|
||||
if(S.flags & ALL_RPARTS)
|
||||
if(S.bodyflags & ALL_RPARTS)
|
||||
valid_limbs = list("Torso", "Lower Body", "Head", "Left Leg", "Right Leg", "Left Arm", "Right Arm", "Left Foot", "Right Foot", "Left Hand", "Right Hand")
|
||||
var/limb_name = input(user, "Which limb do you want to change?") as null|anything in valid_limbs
|
||||
if(!limb_name) return
|
||||
@@ -1813,19 +1776,19 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
second_limb = "r_hand"
|
||||
if("Left Foot")
|
||||
limb = "l_foot"
|
||||
if(!(S.flags & ALL_RPARTS))
|
||||
if(!(S.bodyflags & ALL_RPARTS))
|
||||
third_limb = "l_leg"
|
||||
if("Right Foot")
|
||||
limb = "r_foot"
|
||||
if(!(S.flags & ALL_RPARTS))
|
||||
if(!(S.bodyflags & ALL_RPARTS))
|
||||
third_limb = "r_leg"
|
||||
if("Left Hand")
|
||||
limb = "l_hand"
|
||||
if(!(S.flags & ALL_RPARTS))
|
||||
if(!(S.bodyflags & ALL_RPARTS))
|
||||
third_limb = "l_arm"
|
||||
if("Right Hand")
|
||||
limb = "r_hand"
|
||||
if(!(S.flags & ALL_RPARTS))
|
||||
if(!(S.bodyflags & ALL_RPARTS))
|
||||
third_limb = "r_arm"
|
||||
|
||||
var/new_state = input(user, "What state do you wish the limb to be in?") as null|anything in valid_limb_states
|
||||
@@ -1835,7 +1798,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if("Normal")
|
||||
if(limb == "head")
|
||||
m_styles["head"] = "None"
|
||||
h_style = hair_styles_list["Bald"]
|
||||
h_style = hair_styles_public_list["Bald"]
|
||||
f_style = facial_hair_styles_list["Shaved"]
|
||||
organ_data[limb] = null
|
||||
rlimb_data[limb] = null
|
||||
@@ -1881,12 +1844,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(subchoice)
|
||||
choice = subchoice
|
||||
if(limb in list("head", "chest", "groin"))
|
||||
if(!(S.flags & ALL_RPARTS))
|
||||
if(!(S.bodyflags & ALL_RPARTS))
|
||||
return
|
||||
if(limb == "head")
|
||||
ha_style = "None"
|
||||
alt_head = null
|
||||
h_style = hair_styles_list["Bald"]
|
||||
h_style = hair_styles_public_list["Bald"]
|
||||
f_style = facial_hair_styles_list["Shaved"]
|
||||
m_styles["head"] = "None"
|
||||
rlimb_data[limb] = choice
|
||||
@@ -2032,10 +1995,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
if("lobby_music")
|
||||
sound ^= SOUND_LOBBY
|
||||
if(sound & SOUND_LOBBY)
|
||||
user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1)
|
||||
if((sound & SOUND_LOBBY) && user.client)
|
||||
user.client.playtitlemusic()
|
||||
else
|
||||
user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)
|
||||
user.stop_sound_channel(CHANNEL_LOBBYMUSIC)
|
||||
|
||||
if("ghost_ears")
|
||||
toggles ^= CHAT_GHOSTEARS
|
||||
@@ -2074,6 +2037,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
real_name = random_name(gender)
|
||||
save_character(user)
|
||||
close_load_dialog(user)
|
||||
if(isnewplayer(user))
|
||||
var/mob/new_player/N = user
|
||||
N.new_player_panel_proc()
|
||||
|
||||
if("tab")
|
||||
if(href_list["tab"])
|
||||
@@ -2115,21 +2081,13 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
//Head-specific
|
||||
var/obj/item/organ/external/head/H = character.get_organ("head")
|
||||
|
||||
H.r_hair = r_hair
|
||||
H.g_hair = g_hair
|
||||
H.b_hair = b_hair
|
||||
H.hair_colour = h_colour
|
||||
|
||||
H.r_hair_sec = r_hair_sec
|
||||
H.g_hair_sec = g_hair_sec
|
||||
H.b_hair_sec = b_hair_sec
|
||||
H.sec_hair_colour = h_sec_colour
|
||||
|
||||
H.r_facial = r_facial
|
||||
H.g_facial = g_facial
|
||||
H.b_facial = b_facial
|
||||
H.facial_colour = f_colour
|
||||
|
||||
H.r_facial_sec = r_facial_sec
|
||||
H.g_facial_sec = g_facial_sec
|
||||
H.b_facial_sec = b_facial_sec
|
||||
H.sec_facial_colour = f_sec_colour
|
||||
|
||||
H.h_style = h_style
|
||||
H.f_style = f_style
|
||||
@@ -2137,9 +2095,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
H.alt_head = alt_head
|
||||
//End of head-specific.
|
||||
|
||||
character.r_skin = r_skin
|
||||
character.g_skin = g_skin
|
||||
character.b_skin = b_skin
|
||||
character.skin_colour = s_colour
|
||||
|
||||
character.s_tone = s_tone
|
||||
|
||||
@@ -2154,7 +2110,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
|
||||
else if(status == "cyborg")
|
||||
if(rlimb_data[name])
|
||||
O.robotize(rlimb_data[name])
|
||||
O.robotize(rlimb_data[name], convert_all = 0)
|
||||
else
|
||||
O.robotize()
|
||||
else
|
||||
@@ -2170,7 +2126,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
// Wheelchair necessary?
|
||||
var/obj/item/organ/external/l_foot = character.get_organ("l_foot")
|
||||
var/obj/item/organ/external/r_foot = character.get_organ("r_foot")
|
||||
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
|
||||
if(!l_foot && !r_foot)
|
||||
var/obj/structure/stool/bed/chair/wheelchair/W = new /obj/structure/stool/bed/chair/wheelchair (character.loc)
|
||||
character.buckled = W
|
||||
character.update_canmove()
|
||||
@@ -2183,9 +2139,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
character.socks = socks
|
||||
|
||||
if(character.species.bodyflags & HAS_HEAD_ACCESSORY)
|
||||
H.r_headacc = r_headacc
|
||||
H.g_headacc = g_headacc
|
||||
H.b_headacc = b_headacc
|
||||
H.headacc_colour = hacc_colour
|
||||
H.ha_style = ha_style
|
||||
if(character.species.bodyflags & HAS_MARKINGS)
|
||||
character.m_colours = m_colours
|
||||
@@ -2202,9 +2156,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
|
||||
character.change_gender(MALE)
|
||||
|
||||
character.change_eye_color(r_eyes, g_eyes, b_eyes)
|
||||
character.change_eye_color(e_colour)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_FAT && character.species.flags & CAN_BE_FAT)
|
||||
if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.species.species_traits))
|
||||
character.dna.SetSEState(FATBLOCK,1,1)
|
||||
character.overeatduration = 600
|
||||
|
||||
@@ -2226,6 +2180,27 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
|
||||
if(disabilities & DISABILITY_FLAG_MUTE)
|
||||
character.dna.SetSEState(MUTEBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_TOURETTES)
|
||||
character.dna.SetSEState(TWITCHBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_NERVOUS)
|
||||
character.dna.SetSEState(NERVOUSBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SWEDISH)
|
||||
character.dna.SetSEState(SWEDEBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_LISP)
|
||||
character.dna.SetSEState(LISPBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_DIZZY)
|
||||
character.dna.SetSEState(DIZZYBLOCK,1,1)
|
||||
|
||||
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
|
||||
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
|
||||
|
||||
S.handle_dna(character)
|
||||
|
||||
if(character.dna.dirtySE)
|
||||
|
||||
@@ -118,34 +118,20 @@
|
||||
age,
|
||||
species,
|
||||
language,
|
||||
hair_red,
|
||||
hair_green,
|
||||
hair_blue,
|
||||
secondary_hair_red,
|
||||
secondary_hair_green,
|
||||
secondary_hair_blue,
|
||||
facial_red,
|
||||
facial_green,
|
||||
facial_blue,
|
||||
secondary_facial_red,
|
||||
secondary_facial_green,
|
||||
secondary_facial_blue,
|
||||
hair_colour,
|
||||
secondary_hair_colour,
|
||||
facial_hair_colour,
|
||||
secondary_facial_hair_colour,
|
||||
skin_tone,
|
||||
skin_red,
|
||||
skin_green,
|
||||
skin_blue,
|
||||
skin_colour,
|
||||
marking_colours,
|
||||
head_accessory_red,
|
||||
head_accessory_green,
|
||||
head_accessory_blue,
|
||||
head_accessory_colour,
|
||||
hair_style_name,
|
||||
facial_style_name,
|
||||
marking_styles,
|
||||
head_accessory_style_name,
|
||||
alt_head_name,
|
||||
eyes_red,
|
||||
eyes_green,
|
||||
eyes_blue,
|
||||
eye_colour,
|
||||
underwear,
|
||||
undershirt,
|
||||
backbag,
|
||||
@@ -194,61 +180,46 @@
|
||||
species = query.item[6]
|
||||
language = query.item[7]
|
||||
|
||||
//colors to be consolidated into hex strings (requires some work with dna code)
|
||||
r_hair = text2num(query.item[8])
|
||||
g_hair = text2num(query.item[9])
|
||||
b_hair = text2num(query.item[10])
|
||||
r_hair_sec = text2num(query.item[11])
|
||||
g_hair_sec = text2num(query.item[12])
|
||||
b_hair_sec = text2num(query.item[13])
|
||||
r_facial = text2num(query.item[14])
|
||||
g_facial = text2num(query.item[15])
|
||||
b_facial = text2num(query.item[16])
|
||||
r_facial_sec = text2num(query.item[17])
|
||||
g_facial_sec = text2num(query.item[18])
|
||||
b_facial_sec = text2num(query.item[19])
|
||||
s_tone = text2num(query.item[20])
|
||||
r_skin = text2num(query.item[21])
|
||||
g_skin = text2num(query.item[22])
|
||||
b_skin = text2num(query.item[23])
|
||||
m_colours = params2list(query.item[24])
|
||||
r_headacc = text2num(query.item[25])
|
||||
g_headacc = text2num(query.item[26])
|
||||
b_headacc = text2num(query.item[27])
|
||||
h_style = query.item[28]
|
||||
f_style = query.item[29]
|
||||
m_styles = params2list(query.item[30])
|
||||
ha_style = query.item[31]
|
||||
alt_head = query.item[32]
|
||||
r_eyes = text2num(query.item[33])
|
||||
g_eyes = text2num(query.item[34])
|
||||
b_eyes = text2num(query.item[35])
|
||||
underwear = query.item[36]
|
||||
undershirt = query.item[37]
|
||||
backbag = query.item[38]
|
||||
b_type = query.item[39]
|
||||
h_colour = query.item[8]
|
||||
h_sec_colour = query.item[9]
|
||||
f_colour = query.item[10]
|
||||
f_sec_colour = query.item[11]
|
||||
s_tone = text2num(query.item[12])
|
||||
s_colour = query.item[13]
|
||||
m_colours = params2list(query.item[14])
|
||||
hacc_colour = query.item[15]
|
||||
h_style = query.item[16]
|
||||
f_style = query.item[17]
|
||||
m_styles = params2list(query.item[18])
|
||||
ha_style = query.item[19]
|
||||
alt_head = query.item[20]
|
||||
e_colour = query.item[21]
|
||||
underwear = query.item[22]
|
||||
undershirt = query.item[23]
|
||||
backbag = query.item[24]
|
||||
b_type = query.item[25]
|
||||
|
||||
|
||||
//Jobs
|
||||
alternate_option = text2num(query.item[40])
|
||||
job_support_high = text2num(query.item[41])
|
||||
job_support_med = text2num(query.item[42])
|
||||
job_support_low = text2num(query.item[43])
|
||||
job_medsci_high = text2num(query.item[44])
|
||||
job_medsci_med = text2num(query.item[45])
|
||||
job_medsci_low = text2num(query.item[46])
|
||||
job_engsec_high = text2num(query.item[47])
|
||||
job_engsec_med = text2num(query.item[48])
|
||||
job_engsec_low = text2num(query.item[49])
|
||||
job_karma_high = text2num(query.item[50])
|
||||
job_karma_med = text2num(query.item[51])
|
||||
job_karma_low = text2num(query.item[52])
|
||||
alternate_option = text2num(query.item[26])
|
||||
job_support_high = text2num(query.item[27])
|
||||
job_support_med = text2num(query.item[28])
|
||||
job_support_low = text2num(query.item[29])
|
||||
job_medsci_high = text2num(query.item[30])
|
||||
job_medsci_med = text2num(query.item[31])
|
||||
job_medsci_low = text2num(query.item[32])
|
||||
job_engsec_high = text2num(query.item[33])
|
||||
job_engsec_med = text2num(query.item[34])
|
||||
job_engsec_low = text2num(query.item[35])
|
||||
job_karma_high = text2num(query.item[36])
|
||||
job_karma_med = text2num(query.item[37])
|
||||
job_karma_low = text2num(query.item[38])
|
||||
|
||||
//Miscellaneous
|
||||
flavor_text = query.item[53]
|
||||
med_record = query.item[54]
|
||||
sec_record = query.item[55]
|
||||
gen_record = query.item[56]
|
||||
flavor_text = query.item[39]
|
||||
med_record = query.item[40]
|
||||
sec_record = query.item[41]
|
||||
gen_record = query.item[42]
|
||||
// Apparently, the preceding vars weren't always encoded properly...
|
||||
if(findtext(flavor_text, "<")) // ... so let's clumsily check for tags!
|
||||
flavor_text = html_encode(flavor_text)
|
||||
@@ -258,18 +229,18 @@
|
||||
sec_record = html_encode(sec_record)
|
||||
if(findtext(gen_record, "<"))
|
||||
gen_record = html_encode(gen_record)
|
||||
disabilities = text2num(query.item[57])
|
||||
player_alt_titles = params2list(query.item[58])
|
||||
organ_data = params2list(query.item[59])
|
||||
rlimb_data = params2list(query.item[60])
|
||||
nanotrasen_relation = query.item[61]
|
||||
speciesprefs = text2num(query.item[62])
|
||||
disabilities = text2num(query.item[43])
|
||||
player_alt_titles = params2list(query.item[44])
|
||||
organ_data = params2list(query.item[45])
|
||||
rlimb_data = params2list(query.item[46])
|
||||
nanotrasen_relation = query.item[47]
|
||||
speciesprefs = text2num(query.item[48])
|
||||
|
||||
//socks
|
||||
socks = query.item[63]
|
||||
body_accessory = query.item[64]
|
||||
gear = params2list(query.item[65])
|
||||
autohiss_mode = text2num(query.item[66])
|
||||
socks = query.item[49]
|
||||
body_accessory = query.item[50]
|
||||
gear = params2list(query.item[51])
|
||||
autohiss_mode = text2num(query.item[52])
|
||||
|
||||
//Sanitize
|
||||
var/datum/species/SP = all_species[species]
|
||||
@@ -283,36 +254,22 @@
|
||||
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
|
||||
gender = sanitize_gender(gender, FALSE, !SP.has_gender)
|
||||
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
|
||||
r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair))
|
||||
g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair))
|
||||
b_hair = sanitize_integer(b_hair, 0, 255, initial(b_hair))
|
||||
r_hair_sec = sanitize_integer(r_hair_sec, 0, 255, initial(r_hair_sec))
|
||||
g_hair_sec = sanitize_integer(g_hair_sec, 0, 255, initial(g_hair_sec))
|
||||
b_hair_sec = sanitize_integer(b_hair_sec, 0, 255, initial(b_hair_sec))
|
||||
r_facial = sanitize_integer(r_facial, 0, 255, initial(r_facial))
|
||||
g_facial = sanitize_integer(g_facial, 0, 255, initial(g_facial))
|
||||
b_facial = sanitize_integer(b_facial, 0, 255, initial(b_facial))
|
||||
r_facial_sec = sanitize_integer(r_facial_sec, 0, 255, initial(r_facial_sec))
|
||||
g_facial_sec = sanitize_integer(g_facial_sec, 0, 255, initial(g_facial_sec))
|
||||
b_facial_sec = sanitize_integer(b_facial_sec, 0, 255, initial(b_facial_sec))
|
||||
h_colour = sanitize_hexcolor(h_colour)
|
||||
h_sec_colour = sanitize_hexcolor(h_sec_colour)
|
||||
f_colour = sanitize_hexcolor(f_colour)
|
||||
f_sec_colour = sanitize_hexcolor(f_sec_colour)
|
||||
s_tone = sanitize_integer(s_tone, -185, 34, initial(s_tone))
|
||||
r_skin = sanitize_integer(r_skin, 0, 255, initial(r_skin))
|
||||
g_skin = sanitize_integer(g_skin, 0, 255, initial(g_skin))
|
||||
b_skin = sanitize_integer(b_skin, 0, 255, initial(b_skin))
|
||||
s_colour = sanitize_hexcolor(s_colour)
|
||||
for(var/marking_location in m_colours)
|
||||
m_colours[marking_location] = sanitize_hexcolor(m_colours[marking_location], DEFAULT_MARKING_COLOURS[marking_location])
|
||||
r_headacc = sanitize_integer(r_headacc, 0, 255, initial(r_headacc))
|
||||
g_headacc = sanitize_integer(g_headacc, 0, 255, initial(g_headacc))
|
||||
b_headacc = sanitize_integer(b_headacc, 0, 255, initial(b_headacc))
|
||||
h_style = sanitize_inlist(h_style, hair_styles_list, initial(h_style))
|
||||
hacc_colour = sanitize_hexcolor(hacc_colour)
|
||||
h_style = sanitize_inlist(h_style, hair_styles_public_list, initial(h_style))
|
||||
f_style = sanitize_inlist(f_style, facial_hair_styles_list, initial(f_style))
|
||||
for(var/marking_location in m_styles)
|
||||
m_styles[marking_location] = sanitize_inlist(m_styles[marking_location], marking_styles_list, DEFAULT_MARKING_STYLES[marking_location])
|
||||
ha_style = sanitize_inlist(ha_style, head_accessory_styles_list, initial(ha_style))
|
||||
alt_head = sanitize_inlist(alt_head, alt_heads_list, initial(alt_head))
|
||||
r_eyes = sanitize_integer(r_eyes, 0, 255, initial(r_eyes))
|
||||
g_eyes = sanitize_integer(g_eyes, 0, 255, initial(g_eyes))
|
||||
b_eyes = sanitize_integer(b_eyes, 0, 255, initial(b_eyes))
|
||||
e_colour = sanitize_hexcolor(e_colour)
|
||||
underwear = sanitize_text(underwear, initial(underwear))
|
||||
undershirt = sanitize_text(undershirt, initial(undershirt))
|
||||
backbag = sanitize_text(backbag, initial(backbag))
|
||||
@@ -373,34 +330,20 @@
|
||||
age='[age]',
|
||||
species='[sanitizeSQL(species)]',
|
||||
language='[sanitizeSQL(language)]',
|
||||
hair_red='[r_hair]',
|
||||
hair_green='[g_hair]',
|
||||
hair_blue='[b_hair]',
|
||||
secondary_hair_red='[r_hair_sec]',
|
||||
secondary_hair_green='[g_hair_sec]',
|
||||
secondary_hair_blue='[b_hair_sec]',
|
||||
facial_red='[r_facial]',
|
||||
facial_green='[g_facial]',
|
||||
facial_blue='[b_facial]',
|
||||
secondary_facial_red='[r_facial_sec]',
|
||||
secondary_facial_green='[g_facial_sec]',
|
||||
secondary_facial_blue='[b_facial_sec]',
|
||||
hair_colour='[h_colour]',
|
||||
secondary_hair_colour='[h_sec_colour]',
|
||||
facial_hair_colour='[f_colour]',
|
||||
secondary_facial_hair_colour='[f_sec_colour]',
|
||||
skin_tone='[s_tone]',
|
||||
skin_red='[r_skin]',
|
||||
skin_green='[g_skin]',
|
||||
skin_blue='[b_skin]',
|
||||
skin_colour='[s_colour]',
|
||||
marking_colours='[sanitizeSQL(markingcolourslist)]',
|
||||
head_accessory_red='[r_headacc]',
|
||||
head_accessory_green='[g_headacc]',
|
||||
head_accessory_blue='[b_headacc]',
|
||||
head_accessory_colour='[hacc_colour]',
|
||||
hair_style_name='[sanitizeSQL(h_style)]',
|
||||
facial_style_name='[sanitizeSQL(f_style)]',
|
||||
marking_styles='[sanitizeSQL(markingstyleslist)]',
|
||||
head_accessory_style_name='[sanitizeSQL(ha_style)]',
|
||||
alt_head_name='[sanitizeSQL(alt_head)]',
|
||||
eyes_red='[r_eyes]',
|
||||
eyes_green='[g_eyes]',
|
||||
eyes_blue='[b_eyes]',
|
||||
eye_colour='[e_colour]',
|
||||
underwear='[underwear]',
|
||||
undershirt='[undershirt]',
|
||||
backbag='[backbag]',
|
||||
@@ -446,19 +389,17 @@
|
||||
var/DBQuery/query = dbcon.NewQuery({"
|
||||
INSERT INTO [format_table_name("characters")] (ckey, slot, OOC_Notes, real_name, name_is_always_random, gender,
|
||||
age, species, language,
|
||||
hair_red, hair_green, hair_blue,
|
||||
secondary_hair_red, secondary_hair_green, secondary_hair_blue,
|
||||
facial_red, facial_green, facial_blue,
|
||||
secondary_facial_red, secondary_facial_green, secondary_facial_blue,
|
||||
skin_tone, skin_red, skin_green, skin_blue,
|
||||
hair_colour, secondary_hair_colour,
|
||||
facial_hair_colour, secondary_facial_hair_colour,
|
||||
skin_tone, skin_colour,
|
||||
marking_colours,
|
||||
head_accessory_red, head_accessory_green, head_accessory_blue,
|
||||
head_accessory_colour,
|
||||
hair_style_name,
|
||||
facial_style_name,
|
||||
marking_styles,
|
||||
head_accessory_style_name,
|
||||
alt_head_name,
|
||||
eyes_red, eyes_green, eyes_blue,
|
||||
eye_colour,
|
||||
underwear, undershirt,
|
||||
backbag, b_type, alternate_option,
|
||||
job_support_high, job_support_med, job_support_low,
|
||||
@@ -476,19 +417,17 @@
|
||||
VALUES
|
||||
('[C.ckey]', '[default_slot]', '[sanitizeSQL(metadata)]', '[sanitizeSQL(real_name)]', '[be_random_name]','[gender]',
|
||||
'[age]', '[sanitizeSQL(species)]', '[sanitizeSQL(language)]',
|
||||
'[r_hair]', '[g_hair]', '[b_hair]',
|
||||
'[r_hair_sec]', '[g_hair_sec]', '[b_hair_sec]',
|
||||
'[r_facial]', '[g_facial]', '[b_facial]',
|
||||
'[r_facial_sec]', '[g_facial_sec]', '[b_facial_sec]',
|
||||
'[s_tone]', '[r_skin]', '[g_skin]', '[b_skin]',
|
||||
'[h_colour]', '[h_sec_colour]',
|
||||
'[f_colour]', '[f_sec_colour]',
|
||||
'[s_tone]', '[s_colour]',
|
||||
'[sanitizeSQL(markingcolourslist)]',
|
||||
'[r_headacc]', '[g_headacc]', '[b_headacc]',
|
||||
'[hacc_colour]',
|
||||
'[sanitizeSQL(h_style)]',
|
||||
'[sanitizeSQL(f_style)]',
|
||||
'[sanitizeSQL(markingstyleslist)]',
|
||||
'[sanitizeSQL(ha_style)]',
|
||||
'[sanitizeSQL(alt_head)]',
|
||||
'[r_eyes]', '[g_eyes]', '[b_eyes]',
|
||||
'[e_colour]',
|
||||
'[underwear]', '[undershirt]',
|
||||
'[backbag]', '[b_type]', '[alternate_option]',
|
||||
'[job_support_high]', '[job_support_med]', '[job_support_low]',
|
||||
|
||||
@@ -95,12 +95,11 @@
|
||||
prefs.save_preferences(src)
|
||||
if(prefs.sound & SOUND_LOBBY)
|
||||
to_chat(src, "You will now hear music in the game lobby.")
|
||||
if(istype(mob, /mob/new_player))
|
||||
playtitlemusic()
|
||||
if(isnewplayer(usr))
|
||||
usr.client.playtitlemusic()
|
||||
else
|
||||
to_chat(src, "You will no longer hear music in the game lobby.")
|
||||
if(istype(mob, /mob/new_player))
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// stop the jamsz
|
||||
usr.stop_sound_channel(CHANNEL_LOBBYMUSIC)
|
||||
|
||||
feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -113,9 +112,7 @@
|
||||
if(prefs.sound & SOUND_MIDI)
|
||||
to_chat(src, "You will now hear any sounds uploaded by admins.")
|
||||
else
|
||||
var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777)
|
||||
break_sound.priority = 250
|
||||
src << break_sound //breaks the client's sound output on channel 777
|
||||
usr.stop_sound_channel(CHANNEL_ADMIN)
|
||||
|
||||
to_chat(src, "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled.")
|
||||
feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
@@ -150,7 +147,7 @@
|
||||
to_chat(src, "You will now hear ambient sounds.")
|
||||
else
|
||||
to_chat(src, "You will no longer hear ambient sounds.")
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
|
||||
usr.stop_sound_channel(CHANNEL_AMBIENCE)
|
||||
feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/Toggle_Buzz() //No more headaches because headphones bump up shipambience.ogg to insanity levels.
|
||||
@@ -163,7 +160,7 @@
|
||||
to_chat(src, "You will now hear ambient white noise.")
|
||||
else
|
||||
to_chat(src, "You will no longer hear ambient white noise.")
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
|
||||
usr.stop_sound_channel(CHANNEL_BUZZ)
|
||||
feedback_add_details("admin_verb","TBuzz") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
|
||||
@@ -177,8 +174,7 @@
|
||||
to_chat(src, "You will now hear heartbeat sounds.")
|
||||
else
|
||||
to_chat(src, "You will no longer hear heartbeat sounds.")
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
|
||||
usr.stop_sound_channel(CHANNEL_HEARTBEAT)
|
||||
feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
// This needs a toggle because you people are awful and spammed terrible music
|
||||
|
||||
@@ -332,7 +332,7 @@ BLIND // can't see anything
|
||||
mask_adjusted = 1
|
||||
if(adjusted_flags)
|
||||
slot_flags = adjusted_flags
|
||||
if(ishuman(user) && H.internal && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals.
|
||||
if(ishuman(user) && H.internal && !H.get_organ_slot("breathing_tube") && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals.
|
||||
Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/
|
||||
H.update_internals_hud_icon(0)
|
||||
H.internal = null
|
||||
@@ -372,6 +372,8 @@ BLIND // can't see anything
|
||||
var/silence_steps = 0
|
||||
var/shoe_sound_footstep = 1
|
||||
var/shoe_sound = null
|
||||
var/blood_state = BLOOD_STATE_NOT_BLOODY
|
||||
var/list/bloody_shoes = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0)
|
||||
|
||||
permeability_coefficient = 0.50
|
||||
slowdown = SHOES_SLOWDOWN
|
||||
|
||||
@@ -69,7 +69,6 @@
|
||||
attack_verb = list("sliced")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharp = 1
|
||||
edge = 1
|
||||
|
||||
/obj/item/clothing/glasses/meson/cyber
|
||||
name = "Eye Replacement Implant"
|
||||
@@ -90,7 +89,8 @@
|
||||
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'
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
actions_types = list(/datum/action/item_action/toggle_research_scanner)
|
||||
|
||||
@@ -138,7 +138,8 @@
|
||||
item_state = "eyepatch"
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/monocle
|
||||
@@ -150,7 +151,8 @@
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/eyes.dmi'
|
||||
"Drask" = 'icons/mob/species/drask/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/material
|
||||
@@ -163,7 +165,8 @@
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/eyes.dmi'
|
||||
"Drask" = 'icons/mob/species/drask/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/material/cyber
|
||||
@@ -182,7 +185,8 @@
|
||||
prescription = 1
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/regular/hipster
|
||||
@@ -198,7 +202,8 @@
|
||||
item_state = "3d"
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/gglasses
|
||||
@@ -208,7 +213,8 @@
|
||||
item_state = "gglasses"
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
prescription_upgradable = 1
|
||||
|
||||
@@ -379,7 +385,8 @@
|
||||
flash_protect = -1
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
|
||||
emp_act(severity)
|
||||
|
||||
@@ -62,7 +62,8 @@
|
||||
HUDType = DATA_HUD_DIAGNOSTIC
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/diagnostic/night
|
||||
@@ -85,7 +86,8 @@
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/eyes.dmi'
|
||||
"Drask" = 'icons/mob/species/drask/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/security/chameleon
|
||||
@@ -138,7 +140,8 @@
|
||||
HUDType = DATA_HUD_HYDROPONIC
|
||||
species_fit = list("Vox")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/eyes.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/eyes.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/glasses/hud/hydroponic/night
|
||||
|
||||
@@ -77,13 +77,18 @@
|
||||
/obj/item/clothing/gloves/color/black/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
|
||||
if(istype(W, /obj/item/weapon/wirecutters))
|
||||
if(can_be_cut && icon_state == initial(icon_state))//only if not dyed
|
||||
to_chat(user, "<span class='notice'>You snip the fingertips off of [src].</span>")
|
||||
playsound(user.loc, W.usesound, rand(10,50), 1)
|
||||
var/obj/item/clothing/gloves/fingerless/F = new/obj/item/clothing/gloves/fingerless(user.loc)
|
||||
if(pickpocket)
|
||||
F.pickpocket = 1
|
||||
qdel(src)
|
||||
return
|
||||
var/confirm = alert("Do you want to cut off the gloves fingertips? Warning: It might destroy their functionality.","Cut tips?","Yes","No")
|
||||
if(get_dist(user, src) > 1)
|
||||
to_chat(user, "You have moved too far away.")
|
||||
return
|
||||
if(confirm == "Yes")
|
||||
to_chat(user, "<span class='notice'>You snip the fingertips off of [src].</span>")
|
||||
playsound(user.loc, W.usesound, rand(10,50), 1)
|
||||
var/obj/item/clothing/gloves/fingerless/F = new/obj/item/clothing/gloves/fingerless(user.loc)
|
||||
if(pickpocket)
|
||||
F.pickpocket = FALSE
|
||||
qdel(src)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/clothing/gloves/color/orange
|
||||
|
||||
@@ -70,4 +70,8 @@
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
@@ -13,10 +13,11 @@
|
||||
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
|
||||
strip_delay = 60
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox", "Drask")
|
||||
species_fit = list("Vox", "Drask", "Grey")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi'
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/attack_self(mob/user)
|
||||
|
||||
@@ -24,12 +24,13 @@
|
||||
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")
|
||||
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',
|
||||
"Tajaran" = 'icons/mob/species/tajaran/helmet.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi'
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/welding/flamedecal
|
||||
@@ -183,14 +184,10 @@
|
||||
var/obj/item/organ/external/head/head_organ = user.get_organ("head")
|
||||
|
||||
mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty")
|
||||
// mob2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kitty2") - Commented out because it seemingly does nothing.
|
||||
mob.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
|
||||
// mob2.Blend(rgb(user.r_hair, user.g_hair, user.b_hair), ICON_ADD) - Commented out because it seemingly does nothing.
|
||||
mob.Blend(head_organ.hair_colour, ICON_ADD)
|
||||
|
||||
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner")
|
||||
// var/icon/earbit2 = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "kittyinner2") - Commented out because it seemingly does nothing.
|
||||
mob.Blend(earbit, ICON_OVERLAY)
|
||||
// mob2.Blend(earbit2, ICON_OVERLAY) - Commented out because it seemingly does nothing.
|
||||
|
||||
icon_override = mob
|
||||
|
||||
@@ -209,7 +206,7 @@
|
||||
if(!istype(user)) return
|
||||
var/obj/item/organ/external/head/head_organ = user.get_organ("head")
|
||||
mob = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mousey")
|
||||
mob.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
|
||||
mob.Blend(head_organ.hair_colour, ICON_ADD)
|
||||
|
||||
var/icon/earbit = new/icon("icon" = 'icons/mob/head.dmi', "icon_state" = "mouseyinner")
|
||||
mob.Blend(earbit, ICON_OVERLAY)
|
||||
|
||||
@@ -8,12 +8,13 @@
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
adjusted_flags = SLOT_HEAD
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
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'
|
||||
)
|
||||
|
||||
@@ -28,12 +29,13 @@
|
||||
flags = BLOCKHAIR
|
||||
flags_inv = HIDEFACE
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
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'
|
||||
)
|
||||
|
||||
|
||||
@@ -10,13 +10,14 @@
|
||||
permeability_coefficient = 0.50
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
burn_state = FIRE_PROOF
|
||||
species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin")
|
||||
species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin", "Grey" )
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/mask.dmi',
|
||||
"Vox Armalis" = 'icons/mob/species/armalis/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'
|
||||
)
|
||||
|
||||
@@ -30,7 +31,7 @@
|
||||
item_state = "medical"
|
||||
permeability_coefficient = 0.01
|
||||
put_on_delay = 10
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
|
||||
|
||||
/obj/item/clothing/mask/breath/vox
|
||||
desc = "A weirdly-shaped breath mask."
|
||||
|
||||
@@ -34,18 +34,17 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
resist_time = 150
|
||||
mute = 0
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
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'
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/muzzle/tapegag/dropped(mob/living/carbon/human/user)
|
||||
var/atom/movable/R = new /obj/item/trash/tapetrash
|
||||
if(user.species.bodyflags & HAS_FUR)
|
||||
R.desc += " Is that...fur?"
|
||||
var/turf/T = get_turf(src)
|
||||
R.loc = T
|
||||
transfer_fingerprints_to(R)
|
||||
@@ -65,12 +64,13 @@
|
||||
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")
|
||||
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'
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi'
|
||||
)
|
||||
|
||||
|
||||
@@ -83,12 +83,13 @@
|
||||
icon_state = "fake-moustache"
|
||||
flags_inv = HIDEFACE
|
||||
actions_types = list(/datum/action/item_action/pontificate)
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
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'
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/mask/fakemoustache/attack_self(mob/user)
|
||||
@@ -267,12 +268,13 @@
|
||||
slot_flags = SLOT_MASK
|
||||
adjusted_flags = SLOT_HEAD
|
||||
icon_state = "bandbotany"
|
||||
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
|
||||
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'
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/mask.dmi'
|
||||
)
|
||||
actions_types = list(/datum/action/item_action/adjust)
|
||||
|
||||
@@ -337,6 +339,7 @@
|
||||
icon = 'icons/goonstation/objects/clothing/mask.dmi'
|
||||
icon_state = "cursedclown"
|
||||
item_state = "cclown_hat"
|
||||
unacidable = 1 // HUNKE
|
||||
icon_override = 'icons/goonstation/mob/clothing/mask.dmi'
|
||||
lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
|
||||
righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
|
||||
|
||||
@@ -181,7 +181,7 @@
|
||||
if((!silence_steps || shoe_sound) && TR.use(4))
|
||||
silence_steps = 1
|
||||
shoe_sound = null
|
||||
to_chat(user, "You tape the soles of [src] to silence their footsteps.")
|
||||
to_chat(user, "You tape the soles of [src] to silence your footsteps.")
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -244,3 +244,12 @@
|
||||
desc = "For a Rustlin' tustlin' cowgirl."
|
||||
icon_state = "cowboyboots_pink"
|
||||
item_color = "cowboyboots_pink"
|
||||
|
||||
/obj/item/clothing/shoes/footwraps
|
||||
name = "cloth footwraps"
|
||||
desc = "A roll of treated canvas used for wrapping claws or paws."
|
||||
icon_state = "clothwrap"
|
||||
item_state = "clothwrap"
|
||||
force = 0
|
||||
silence_steps = TRUE
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
@@ -9,6 +9,10 @@
|
||||
var/obj/machinery/camera/camera
|
||||
var/has_camera = TRUE
|
||||
strip_delay = 130
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/ert/attack_self(mob/user)
|
||||
if(camera || !has_camera)
|
||||
|
||||
@@ -20,14 +20,15 @@
|
||||
"Skrell" = 'icons/mob/species/skrell/helmet.dmi',
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi'
|
||||
"Drask" = 'icons/mob/species/drask/helmet.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
sprite_sheets_obj = list(
|
||||
"Unathi" = 'icons/obj/clothing/species/unathi/hats.dmi',
|
||||
"Tajaran" = 'icons/obj/clothing/species/tajaran/hats.dmi',
|
||||
"Skrell" = 'icons/obj/clothing/species/skrell/hats.dmi',
|
||||
"Vox" = 'icons/obj/clothing/species/vox/hats.dmi',
|
||||
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi',
|
||||
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/equip_to_best_slot(mob/M)
|
||||
@@ -83,7 +84,7 @@
|
||||
"Tajaran" = 'icons/obj/clothing/species/tajaran/suits.dmi',
|
||||
"Skrell" = 'icons/obj/clothing/species/skrell/suits.dmi',
|
||||
"Vox" = 'icons/obj/clothing/species/vox/suits.dmi',
|
||||
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi',
|
||||
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/suits.dmi'
|
||||
)
|
||||
|
||||
//Breach thresholds, should ideally be inherited by most (if not all) hardsuits.
|
||||
@@ -320,7 +321,7 @@
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user)
|
||||
on = !on
|
||||
if(on)
|
||||
to_chat(user, "<span class='notice'>You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.</span>")
|
||||
to_chat(user, "<span class='notice'>You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed.</span>")
|
||||
name = initial(name)
|
||||
desc = initial(desc)
|
||||
set_light(brightness_on)
|
||||
@@ -364,7 +365,7 @@
|
||||
/obj/item/clothing/suit/space/hardsuit/syndi/attack_self(mob/user)
|
||||
on = !on
|
||||
if(on)
|
||||
to_chat(user, "<span class='notice'>You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.</span>")
|
||||
to_chat(user, "<span class='notice'>You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed.</span>")
|
||||
name = "blood-red hardsuit"
|
||||
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
|
||||
slowdown = 1
|
||||
@@ -440,7 +441,10 @@
|
||||
heat_protection = HEAD //Uncomment to enable firesuit protection
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
unacidable = 1
|
||||
sprite_sheets = null
|
||||
species_fit = list("Grey")
|
||||
sprite_sheets = list(
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/wizard
|
||||
icon_state = "hardsuit-wiz"
|
||||
@@ -538,7 +542,6 @@
|
||||
icon_state = "hardsuit0-hos"
|
||||
item_color = "hos"
|
||||
armor = list(melee = 45, bullet = 25, laser = 30,energy = 10, bomb = 25, bio = 100, rad = 50)
|
||||
sprite_sheets = null
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/security/hos
|
||||
|
||||
@@ -8,9 +8,10 @@
|
||||
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")
|
||||
species_fit = list("Vox", "Grey")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/head/helmet/space/capspace/equipped(mob/living/carbon/human/user, slot)
|
||||
@@ -136,9 +137,10 @@
|
||||
desc = "A paramedic EVA helmet. Used in the recovery of bodies from space."
|
||||
icon_state = "paramedic-eva-helmet"
|
||||
item_state = "paramedic-eva-helmet"
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Grey")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
sprite_sheets_obj = list(
|
||||
"Vox" = 'icons/obj/clothing/species/vox/hats.dmi'
|
||||
@@ -187,12 +189,13 @@
|
||||
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")
|
||||
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',
|
||||
"Vox" = 'icons/mob/species/vox/helmet.dmi',
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi'
|
||||
"Vulpkanin" = 'icons/mob/species/vulpkanin/helmet.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/helmet.dmi'
|
||||
)
|
||||
sprite_sheets_obj = list(
|
||||
"Vox" = 'icons/obj/clothing/species/vox/hats.dmi',
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
|
||||
flash_protect = 2
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/engineer
|
||||
name = "plasmaman engineer suit"
|
||||
icon_state = "plasmamanEngineer_suit"
|
||||
@@ -128,7 +128,7 @@
|
||||
base_state = "plasmamanEngineer_helmet"
|
||||
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
|
||||
flash_protect = 2
|
||||
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
|
||||
name = "plasmaman chief engineer suit"
|
||||
icon_state = "plasmaman_CE"
|
||||
@@ -269,6 +269,24 @@
|
||||
icon_state = "plasmaman_CMO_helmet0"
|
||||
base_state = "plasmaman_CMO_helmet"
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/medical/coroner
|
||||
name = "plasmaman coroner suit"
|
||||
icon_state = "plasmaman_Coroner"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/coroner
|
||||
name = "plasmaman coroner helmet"
|
||||
icon_state = "plasmaman_Coroner_helmet0"
|
||||
base_state = "plasmaman_Coroner_helmet"
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/medical/virologist
|
||||
name = "plasmaman virologist suit"
|
||||
icon_state = "plasmaman_Virologist"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/virologist
|
||||
name = "plasmaman virologist helmet"
|
||||
icon_state = "plasmaman_Virologist_helmet0"
|
||||
base_state = "plasmaman_Virologist_helmet"
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/science
|
||||
name = "plasmaman scientist suit"
|
||||
icon_state = "plasmamanScience_suit"
|
||||
@@ -278,6 +296,15 @@
|
||||
icon_state = "plasmamanScience_helmet0"
|
||||
base_state = "plasmamanScience_helmet"
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/science/geneticist
|
||||
name = "plasmaman geneticist suit"
|
||||
icon_state = "plasmaman_Geneticist"
|
||||
|
||||
/obj/item/clothing/head/helmet/space/eva/plasmaman/science/geneticist
|
||||
name = "plasmaman geneticist helmet"
|
||||
icon_state = "plasmaman_Geneticist_helmet0"
|
||||
base_state = "plasmaman_Geneticist_helmet"
|
||||
|
||||
/obj/item/clothing/suit/space/eva/plasmaman/science/rd
|
||||
name = "plasmaman research director suit"
|
||||
icon_state = "plasmaman_RD"
|
||||
|
||||
@@ -56,20 +56,8 @@
|
||||
interface_desc = "A diamond-tipped industrial drill."
|
||||
suit_overlay_active = "mounted-drill"
|
||||
suit_overlay_inactive = "mounted-drill"
|
||||
|
||||
device_type = /obj/item/weapon/pickaxe/diamonddrill
|
||||
|
||||
/obj/item/rig_module/device/anomaly_scanner
|
||||
name = "hardsuit anomaly scanner"
|
||||
desc = "You think it's called an Elder Sarsparilla or something."
|
||||
icon_state = "eldersasparilla"
|
||||
interface_name = "Alden-Saraspova counter"
|
||||
interface_desc = "An exotic particle detector commonly used by xenoarchaeologists."
|
||||
engage_string = "Begin Scan"
|
||||
usable = 1
|
||||
selectable = 0
|
||||
device_type = /obj/item/device/ano_scanner
|
||||
|
||||
/obj/item/rig_module/device/orescanner
|
||||
name = "ore scanner module"
|
||||
desc = "A clunky old ore scanner."
|
||||
|
||||
@@ -978,10 +978,6 @@
|
||||
else
|
||||
M.stop_pulling()
|
||||
|
||||
if(wearer.pinned.len)
|
||||
to_chat(src, "<span class='notice'>Your host is pinned to a wall by [wearer.pinned[1]]</span>!")
|
||||
return 0
|
||||
|
||||
// AIs are a bit slower than regular and ignore move intent.
|
||||
wearer_move_delay = world.time + ai_controlled_move_delay
|
||||
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
|
||||
helm_type = /obj/item/clothing/head/helmet/space/new_rig/ert
|
||||
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils)
|
||||
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/gps,/obj/item/device/radio/beacon)
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
@@ -167,9 +167,7 @@
|
||||
|
||||
initial_modules = list(
|
||||
/obj/item/rig_module/ai_container,
|
||||
/obj/item/rig_module/maneuvering_jets,
|
||||
/obj/item/rig_module/device/anomaly_scanner
|
||||
)
|
||||
/obj/item/rig_module/maneuvering_jets)
|
||||
|
||||
/obj/item/weapon/rig/medical
|
||||
|
||||
|
||||
@@ -4,14 +4,14 @@
|
||||
desc = "Top secret Spess Helmet."
|
||||
icon_state = "syndicate"
|
||||
item_state = "syndicate"
|
||||
desc = "Has a tag: Totally not property of an enemy corporation, honest."
|
||||
desc = "Has a tag on it: Totally not property of a hostile corporation, honest!"
|
||||
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
|
||||
/obj/item/clothing/suit/space/syndicate
|
||||
name = "red space suit"
|
||||
icon_state = "syndicate"
|
||||
item_state = "space_suit_syndicate"
|
||||
desc = "Has a tag on it: Totally not property of of a hostile corporation, honest!"
|
||||
desc = "Has a tag on it: Totally not property of a hostile corporation, honest!"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
|
||||
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
user.visible_message("[user] places \the [src] against [M]'s chest and listens attentively.", "You place \the [src] against [M]'s chest...")
|
||||
var/obj/item/organ/internal/H = M.get_int_organ(/obj/item/organ/internal/heart)
|
||||
var/obj/item/organ/internal/L = M.get_int_organ(/obj/item/organ/internal/lungs)
|
||||
if((H && M.pulse) || (L && !(NO_BREATH in M.mutations) && !(M.species.flags & NO_BREATH)))
|
||||
if((H && M.pulse) || (L && !(NO_BREATH in M.mutations) && !(NO_BREATH in M.species.species_traits)))
|
||||
var/color = "notice"
|
||||
if(H)
|
||||
var/heart_sound
|
||||
@@ -550,11 +550,35 @@
|
||||
icon_state = "cowboyshirt_reds"
|
||||
item_state = "cowboyshirt_reds"
|
||||
item_color = "cowboyshirt_reds"
|
||||
species_fit = list("Vox")
|
||||
species_fit = list("Vox", "Drask", "Grey")
|
||||
sprite_sheets = list(
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi'
|
||||
"Vox" = 'icons/mob/species/vox/suit.dmi',
|
||||
"Drask" = 'icons/mob/species/drask/suit.dmi',
|
||||
"Grey" = 'icons/mob/species/grey/suit.dmi'
|
||||
)
|
||||
|
||||
/obj/item/clothing/accessory/corset
|
||||
name = "black corset"
|
||||
desc = "A black corset for those fancy nights out."
|
||||
icon_state = "corset"
|
||||
item_state = "corset"
|
||||
item_color = "corset"
|
||||
|
||||
|
||||
/obj/item/clothing/accessory/corset/red
|
||||
name = "red corset"
|
||||
desc = "A red corset those fancy nights out."
|
||||
icon_state = "corset_red"
|
||||
item_state = "corset_red"
|
||||
item_color = "corset_red"
|
||||
|
||||
/obj/item/clothing/accessory/corset/blue
|
||||
name = "blue corset"
|
||||
desc = "A blue corset for those fancy nights out."
|
||||
icon_state = "corset_blue"
|
||||
item_state = "corset_blue"
|
||||
item_color = "corset_blue"
|
||||
|
||||
/obj/item/clothing/accessory/petcollar
|
||||
name = "pet collar"
|
||||
desc = "The latest fashion accessory for your favorite pets!"
|
||||
@@ -620,7 +644,7 @@
|
||||
return
|
||||
|
||||
var/area/t = get_area(M)
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null)
|
||||
var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(src)
|
||||
if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) )
|
||||
//give the syndicats a bit of stealth
|
||||
a.autosay("[M] has been vandalized in Space!", "[M]'s Death Alarm")
|
||||
|
||||
@@ -5,6 +5,18 @@
|
||||
item_color = "red"
|
||||
slot = "armband"
|
||||
|
||||
/obj/item/clothing/accessory/armband/sec
|
||||
name = "security armband"
|
||||
desc = "An armband, worn by the crew to display which department they're assigned to. This one is white and red."
|
||||
icon_state = "whitered"
|
||||
item_color = "whitered"
|
||||
|
||||
/obj/item/clothing/accessory/armband/yb
|
||||
name = "blue-yellow armband"
|
||||
desc = "A fancy blue and yellow armband!"
|
||||
icon_state = "solblue"
|
||||
item_color = "solblue"
|
||||
|
||||
/obj/item/clothing/accessory/armband/cargo
|
||||
name = "cargo armband"
|
||||
desc = "An armband, worn by the crew to display which department they're assigned to. This one is brown."
|
||||
|
||||
@@ -787,6 +787,7 @@
|
||||
lefthand_file = 'icons/goonstation/mob/inhands/clothing_lefthand.dmi'
|
||||
righthand_file = 'icons/goonstation/mob/inhands/clothing_righthand.dmi'
|
||||
flags = NODROP
|
||||
has_sensor = 0 // HUNKE
|
||||
|
||||
|
||||
/obj/item/clothing/under/victdress
|
||||
@@ -822,3 +823,11 @@
|
||||
icon_state = "victorianredvest"
|
||||
item_state = "victorianredvest"
|
||||
item_color = "victorianredvest"
|
||||
|
||||
/obj/item/clothing/under/medigown
|
||||
name = "medical gown"
|
||||
desc = "a flimsy examination gown, the back ties never close."
|
||||
icon_state = "medicalgown"
|
||||
item_state = "medicalgown"
|
||||
item_color = "medicalgown"
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO
|
||||
@@ -9,15 +9,19 @@
|
||||
var/atom/attached_to
|
||||
color = "#ff0000"
|
||||
var/text_size = 4
|
||||
var/started = 0
|
||||
var/started = FALSE
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
anchored = 1
|
||||
layer = 5
|
||||
anchored = TRUE
|
||||
layer = GHOST_LAYER
|
||||
|
||||
/obj/effect/countdown/New(atom/A)
|
||||
. = ..()
|
||||
attach(A)
|
||||
|
||||
/obj/effect/countdown/examine(mob/user)
|
||||
. = ..()
|
||||
to_chat(user, "This countdown is displaying: [displayed_text]")
|
||||
|
||||
/obj/effect/countdown/proc/attach(atom/A)
|
||||
attached_to = A
|
||||
loc = get_turf(A)
|
||||
@@ -25,13 +29,13 @@
|
||||
/obj/effect/countdown/proc/start()
|
||||
if(!started)
|
||||
fast_processing += src
|
||||
started = 1
|
||||
started = TRUE
|
||||
|
||||
/obj/effect/countdown/proc/stop()
|
||||
if(started)
|
||||
maptext = null
|
||||
fast_processing -= src
|
||||
started = 0
|
||||
started = FALSE
|
||||
|
||||
/obj/effect/countdown/proc/get_value()
|
||||
// Get the value from our atom
|
||||
@@ -56,6 +60,19 @@
|
||||
fast_processing -= src
|
||||
return ..()
|
||||
|
||||
/obj/effect/countdown/ex_act(severity) //immune to explosions
|
||||
return
|
||||
|
||||
/obj/effect/countdown/syndicatebomb
|
||||
name = "syndicate bomb countdown"
|
||||
|
||||
/obj/effect/countdown/syndicatebomb/get_value()
|
||||
var/obj/machinery/syndicatebomb/S = attached_to
|
||||
if(!istype(S))
|
||||
return
|
||||
else if(S.active)
|
||||
return S.seconds_remaining()
|
||||
|
||||
/obj/effect/countdown/clonepod
|
||||
name = "cloning pod countdown"
|
||||
text_size = 1
|
||||
|
||||
@@ -324,6 +324,30 @@
|
||||
/obj/item/stack/rods = 1)
|
||||
category = CAT_MISC
|
||||
|
||||
/datum/crafting_recipe/chemical_payload
|
||||
name = "Chemical Payload (C4)"
|
||||
result = /obj/item/weapon/bombcore/chemical
|
||||
reqs = list(
|
||||
/obj/item/weapon/stock_parts/matter_bin = 1,
|
||||
/obj/item/weapon/grenade/plastic/c4 = 1,
|
||||
/obj/item/weapon/grenade/chem_grenade = 2
|
||||
)
|
||||
parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2)
|
||||
time = 30
|
||||
category = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/chemical_payload2
|
||||
name = "Chemical Payload (gibtonite)"
|
||||
result = /obj/item/weapon/bombcore/chemical
|
||||
reqs = list(
|
||||
/obj/item/weapon/stock_parts/matter_bin = 1,
|
||||
/obj/item/weapon/twohanded/required/gibtonite = 1,
|
||||
/obj/item/weapon/grenade/chem_grenade = 2
|
||||
)
|
||||
parts = list(/obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/grenade/chem_grenade = 2)
|
||||
time = 50
|
||||
category = CAT_WEAPON
|
||||
|
||||
/datum/crafting_recipe/bonfire
|
||||
name = "Bonfire"
|
||||
time = 60
|
||||
|
||||
@@ -131,7 +131,6 @@
|
||||
desc = "A replica claymore with strange markings scratched into the blade."
|
||||
force = 5
|
||||
sharp = 0
|
||||
edge = 0
|
||||
|
||||
/obj/item/weapon/claymore/fluff/hit_reaction()
|
||||
return 0
|
||||
@@ -246,7 +245,7 @@
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/cans/cola(src)
|
||||
|
||||
|
||||
/obj/item/device/guitar/jello_guitar //Antcolon3: Dan Jello
|
||||
/obj/item/device/instrument/guitar/jello_guitar //Antcolon3: Dan Jello
|
||||
name = "Dan Jello's Pink Guitar"
|
||||
desc = "Dan Jello's special pink guitar."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
@@ -277,8 +276,67 @@
|
||||
to_chat(target, "<span class='notice'>You comb your tail with the [src].</span>")
|
||||
used = 1
|
||||
|
||||
/obj/item/device/fluff/desolate_baton_kit //DesolateG: Michael steampunk_witch
|
||||
name = "stun baton converstion kit"
|
||||
/obj/item/device/fluff/desolate_coat_kit //DesolateG: Michael Smith
|
||||
name = "armored jacket conversion kit"
|
||||
desc = "Flaps of dark fabric, probably used to somehow modify some sort of an armored garment. Won't help with protection, though."
|
||||
icon_state = "modkit"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/device/fluff/desolate_coat_kit/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity || !ishuman(user) || user.incapacitated())
|
||||
return
|
||||
|
||||
if(!istype(target, /obj/item/clothing/suit/armor/hos))
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You modify the appearance of [target].</span>")
|
||||
var/obj/item/clothing/suit/armor/jacket = target
|
||||
jacket.icon_state = "desolate_coat_open"
|
||||
jacket.icon = 'icons/obj/custom_items.dmi'
|
||||
jacket.ignore_suitadjust = 0
|
||||
jacket.suit_adjusted = 1
|
||||
var/has_action = FALSE
|
||||
for(var/datum/action/A in jacket.actions)
|
||||
if(istype(A, /datum/action/item_action/openclose))
|
||||
has_action = TRUE
|
||||
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)
|
||||
|
||||
/obj/item/device/fluff/fei_gasmask_kit //Fei Hazelwood: Tariq Yon-Dale
|
||||
name = "gas mask conversion kit"
|
||||
desc = "A gas mask conversion kit."
|
||||
icon_state = "modkit"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/device/fluff/fei_gasmask_kit/afterattack(atom/target, mob/user, proximity)
|
||||
if(!proximity || !ishuman(user) || user.incapacitated())
|
||||
return
|
||||
|
||||
if(istype(target, /obj/item/clothing/mask/gas) && !istype(target, /obj/item/clothing/mask/gas/welding))
|
||||
to_chat(user, "<span class='notice'>You modify the appearance of [target].</span>")
|
||||
var/obj/item/clothing/mask/gas/M = target
|
||||
M.name = "Prescription Gas Mask"
|
||||
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'
|
||||
)
|
||||
user.update_icons()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='warning'>You can't modify [target]!</span>")
|
||||
|
||||
/obj/item/device/fluff/desolate_baton_kit //DesolateG: Michael Smith
|
||||
name = "stun baton conversion kit"
|
||||
desc = "Some sci-fi looking parts for a stun baton."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "scifikit"
|
||||
@@ -534,6 +592,13 @@
|
||||
icon_state = "hairflowerp"
|
||||
item_state = "hairflowerp"
|
||||
|
||||
/obj/item/clothing/head/valkyriehelmet //R3Valkyrie: Rikki
|
||||
name = "charred visor"
|
||||
desc = "A visor of alien origin, charred by fire and completely non-functioning. It's been impeccably polished, shiny!"
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "charred_visor"
|
||||
species_restricted = list("Vox")
|
||||
|
||||
/obj/item/clothing/head/bearpelt/fluff/polar //Gibson1027: Sploosh
|
||||
name = "polar bear pelt hat"
|
||||
desc = "Fuzzy, and also stained with blood."
|
||||
@@ -641,6 +706,43 @@
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/jacket/miljacket/patch // sniper_fairy : P.A.T.C.H.
|
||||
name = "custom purple military jacket"
|
||||
desc = "A canvas jacket styled after classical American military garb. Feels sturdy, yet comfortable. This one has a medical patch on it."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "shazjacket_purple_open"
|
||||
ignore_suitadjust = 0
|
||||
suit_adjusted = 1
|
||||
actions_types = list(/datum/action/item_action/openclose)
|
||||
adjust_flavour = "unbutton"
|
||||
|
||||
/obj/item/clothing/suit/jacket/miljacket/patch/attack_self(mob/user)
|
||||
var/list/options = list()
|
||||
options["purple"] = "shazjacket_purple"
|
||||
options["yellow"] = "shazjacket_yellow"
|
||||
options["blue"] = "shazjacket_blue"
|
||||
options["brown"] = "shazjacket_brown"
|
||||
options["orange"] = "shazjacket_orange"
|
||||
options["grey"] = "shazjacket_grey"
|
||||
options["black"] ="shazjacket_black"
|
||||
options["red"] ="shazjacket_red"
|
||||
options["navy"] ="shazjacket_navy"
|
||||
options["white"] ="shazjacket_white"
|
||||
|
||||
var/choice = input(user, "What color do you wish your jacket to be?", "Change color") as null|anything in options
|
||||
|
||||
if(choice && !user.stat && in_range(user, src))
|
||||
if(suit_adjusted)
|
||||
icon_state = "[options[choice]]_open"
|
||||
else
|
||||
icon_state = options[choice]
|
||||
to_chat(user, "You turn your coat inside out and now it's [choice]!")
|
||||
name = "custom [choice] military jacket"
|
||||
user.update_inv_wear_suit()
|
||||
return 1
|
||||
|
||||
. = ..()
|
||||
|
||||
/obj/item/clothing/suit/fluff/dusty_jacket //ComputerlessCitizen: Screech
|
||||
name = "Dusty Jacket"
|
||||
desc = "A worn leather jacket. Some burn holes have been patched."
|
||||
@@ -667,6 +769,17 @@
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/jacket/fluff/jacksvest // Anxipal: Jack Harper
|
||||
name = "Jack's vest"
|
||||
desc = "A rugged leather vest with a tag labelled \"President\"."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "jacksvest"
|
||||
ignore_suitadjust = TRUE
|
||||
actions_types = list()
|
||||
adjust_flavour = null
|
||||
species_fit = null
|
||||
sprite_sheets = null
|
||||
|
||||
/obj/item/clothing/suit/fluff/kluys // Kluys: Cripty Pandaen
|
||||
name = "Nano Fibre Jacket"
|
||||
desc = "A Black Suit made out of nanofibre. The newest of cyberpunk fashion using hightech liquid to solid materials."
|
||||
@@ -724,6 +837,17 @@
|
||||
/obj/item/clothing/head/hood/fluff/linda //Epic_Charger: Linda Clark
|
||||
icon_state = "greenhood"
|
||||
|
||||
/obj/item/clothing/suit/hooded/hoodie/hylo //Hylocereus: Sam Aria
|
||||
name = "worn assymetrical hoodie"
|
||||
desc = "A soft, cozy longline hoodie. It looks old and worn, but well cared for. There's no label, but a series of dates and names is penned on a scrap of fabric sewn on the inside of the left side of the chest - 'Sam Aria' is scrawled atop them all, next to the words 'Please Remember'."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "sam_hoodie"
|
||||
hoodtype = /obj/item/clothing/head/hood/hylo
|
||||
|
||||
/obj/item/clothing/head/hood/hylo
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "sam_hood"
|
||||
|
||||
/obj/item/clothing/suit/hooded/fluff/bone //Doru7: Jack Bone
|
||||
name = "skeleton suit"
|
||||
desc = "A spooky full-body suit! This one doesn't glow in the dark."
|
||||
@@ -773,6 +897,25 @@
|
||||
to_chat(user, "You turn the [src]'s lighting system [flavour].")
|
||||
user.update_inv_wear_suit()
|
||||
|
||||
/obj/item/clothing/suit/hooded/hoodie/fluff/xantholne // Xantholne: Meex Zwichsnicrur
|
||||
name = "stripped winter coat"
|
||||
desc = "A velvety smooth black winter coat with white and red stripes on the side."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "xantholne_wintercoat"
|
||||
hoodtype = /obj/item/clothing/head/hood/fluff/xantholne
|
||||
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS
|
||||
allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/toy, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/lighter)
|
||||
|
||||
|
||||
/obj/item/clothing/head/hood/fluff/xantholne // Xantholne: Meex Zwichsnicrur
|
||||
name = "black winter hood"
|
||||
desc = "A black hood attached to a stripped winter coat."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "xantholne_winterhood"
|
||||
body_parts_covered = HEAD
|
||||
flags = NODROP|BLOCKHAIR
|
||||
flags_inv = HIDEEARS
|
||||
|
||||
//////////// Uniforms ////////////
|
||||
/obj/item/clothing/under/fluff/kharshai // Kharshai: Athena Castile
|
||||
name = "Castile formal outfit"
|
||||
@@ -1052,6 +1195,26 @@
|
||||
return 1
|
||||
..()
|
||||
|
||||
/obj/item/fluff/zekemirror //phantasmicdream : Zeke Varloss
|
||||
name = "engraved hand mirror"
|
||||
desc = "A very classy hand mirror, with fancy detailing."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
icon_state = "hand_mirror"
|
||||
attack_verb = list("smacked")
|
||||
hitsound = 'sound/weapons/tap.ogg'
|
||||
force = 0
|
||||
throwforce = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/fluff/zekemirror/attack_self(mob/user)
|
||||
var/mob/living/carbon/human/target = user
|
||||
if(!istype(target) || target.get_species() != "Skrell") // It'd be strange to see other races with head tendrils.
|
||||
return
|
||||
|
||||
if(target.change_hair("Zekes Tentacles", 1))
|
||||
to_chat(target, "<span class='notice'>You take time to admire yourself in [src], brushing your tendrils down and revealing their true length.</span>")
|
||||
|
||||
|
||||
/obj/item/clothing/accessory/necklace/locket/fluff/fethasnecklace //Fethas: Sefra'neem
|
||||
name = "Orange gemmed locket"
|
||||
desc = "A locket with a orange gem set on the front, the picture inside seems to be of a Tajaran."
|
||||
@@ -1060,3 +1223,13 @@
|
||||
item_state = "fethasnecklace"
|
||||
item_color = "fethasnecklace"
|
||||
slot_flags = SLOT_MASK | SLOT_TIE
|
||||
|
||||
/obj/item/weapon/bedsheet/fluff/hugosheet //HugoLuman: Dan Martinez
|
||||
name = "Cosmic space blankie"
|
||||
desc = "Made from the dreams of space children everywhere."
|
||||
icon = 'icons/obj/custom_items.dmi'
|
||||
lefthand_file = 'icons/mob/inhands/fluff_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/fluff_righthand.dmi'
|
||||
icon_state = "sheetcosmos"
|
||||
item_state = "sheetcosmos"
|
||||
item_color = "sheetcosmos"
|
||||
@@ -6,10 +6,10 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
|
||||
if(M.gloves && istype(M.gloves,/obj/item/clothing/))
|
||||
var/obj/item/clothing/gloves/G = M.gloves
|
||||
if(G.transfer_blood > 1) //bloodied gloves transfer blood to touched objects
|
||||
if(add_blood(G.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
|
||||
if(add_blood(G.blood_DNA, G.blood_color)) //only reduces the bloodiness of our gloves if the item wasn't already bloody
|
||||
G.transfer_blood--
|
||||
else if(M.bloody_hands > 1)
|
||||
if(add_blood(M.bloody_hands_mob))
|
||||
if(add_blood(M.blood_DNA, M.hand_blood_color))
|
||||
M.bloody_hands--
|
||||
if(!suit_fibers) suit_fibers = list()
|
||||
var/fibertext
|
||||
|
||||
@@ -1,18 +1,13 @@
|
||||
|
||||
/mob
|
||||
var/bloody_hands = 0
|
||||
var/mob/living/carbon/human/bloody_hands_mob
|
||||
var/track_blood = 0
|
||||
var/list/feet_blood_DNA
|
||||
var/track_blood_type
|
||||
var/feet_blood_color
|
||||
var/blood_state = BLOOD_STATE_NOT_BLOODY
|
||||
var/list/bloody_feet = list(BLOOD_STATE_HUMAN = 0, BLOOD_STATE_XENO = 0, BLOOD_STATE_NOT_BLOODY = 0)
|
||||
|
||||
/obj/item/clothing/gloves
|
||||
var/transfer_blood = 0
|
||||
var/mob/living/carbon/human/bloody_hands_mob
|
||||
|
||||
/obj/item/clothing/shoes/
|
||||
var/track_blood = 0
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/rag
|
||||
name = "damp rag"
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
/datum/event/alien_infestation
|
||||
announceWhen = 400
|
||||
var/spawncount = 1
|
||||
var/spawncount = 2
|
||||
var/successSpawn = 0 //So we don't make a command report if nothing gets spawned.
|
||||
|
||||
/datum/event/alien_infestation/setup()
|
||||
announceWhen = rand(announceWhen, announceWhen + 50)
|
||||
if(prob(50))
|
||||
spawncount++
|
||||
|
||||
/datum/event/alien_infestation/announce()
|
||||
if(successSpawn)
|
||||
|
||||
@@ -18,22 +18,22 @@
|
||||
continue
|
||||
if(!H.client)
|
||||
continue
|
||||
if(H.species.virus_immune) //don't let virus immune things get diseases they're not supposed to get.
|
||||
if(VIRUSIMMUNE in H.species.species_traits) //don't let virus immune things get diseases they're not supposed to get.
|
||||
continue
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
continue
|
||||
if(!is_station_level(T.z))
|
||||
continue
|
||||
var/foundAlready = 0 // don't infect someone that already has the virus
|
||||
for(var/datum/disease/D in H.viruses)
|
||||
foundAlready = 1
|
||||
var/foundAlready = FALSE // don't infect someone that already has the virus
|
||||
for(var/thing in H.viruses)
|
||||
foundAlready = TRUE
|
||||
break
|
||||
if(H.stat == DEAD || foundAlready)
|
||||
continue
|
||||
|
||||
var/datum/disease/D
|
||||
D = new virus_type()
|
||||
D.carrier = 1
|
||||
D.carrier = TRUE
|
||||
H.AddDisease(D)
|
||||
break
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
/datum/event/mass_hallucination/start()
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
var/armor = H.getarmor(type = "rad")
|
||||
if((H.species.flags & RADIMMUNE) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected
|
||||
if((RADIMMUNE in H.species.species_traits) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected
|
||||
continue
|
||||
H.AdjustHallucinate(rand(50, 100))
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
for(var/i = 0, i < 10, i++)
|
||||
for(var/mob/living/carbon/human/H in living_mob_list)
|
||||
var/armor = H.getarmor(type = "rad")
|
||||
if((H.species.flags & RADIMMUNE) || armor >= 100) // Leave radiation-immune species/fully rad armored players completely unaffected
|
||||
if((RADIMMUNE in H.species.species_traits) || armor >= 100) // Leave radiation-immune species/fully rad armored players completely unaffected
|
||||
continue
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T)
|
||||
|
||||
@@ -4,13 +4,12 @@
|
||||
continue
|
||||
if(!H.client)
|
||||
continue
|
||||
if(H.species.virus_immune) //don't count things that are virus immune; they'll just get picked and auto-cure
|
||||
continue
|
||||
if(!H.get_int_organ(/obj/item/organ/internal/appendix))
|
||||
continue
|
||||
var/foundAlready = 0 //don't infect someone that already has the virus
|
||||
for(var/datum/disease/D in H.viruses)
|
||||
foundAlready = 1
|
||||
var/foundAlready = FALSE //don't infect someone that already has appendicitis
|
||||
for(var/datum/disease/appendicitis/A in H.viruses)
|
||||
foundAlready = TRUE
|
||||
break
|
||||
if(H.stat == DEAD || foundAlready)
|
||||
continue
|
||||
|
||||
|
||||
@@ -49,8 +49,17 @@
|
||||
description_holders["icon"] = "[bicon(A)]"
|
||||
description_holders["desc"] = A.desc
|
||||
|
||||
// Byond seemingly calls stat, each tick.
|
||||
// Calling things each tick can get expensive real quick.
|
||||
// So we slow this down a little.
|
||||
// See: http://www.byond.com/docs/ref/info.html#/client/proc/Stat
|
||||
/client/Stat()
|
||||
. = ..()
|
||||
if(holder)
|
||||
sleep(1)
|
||||
else
|
||||
sleep(5)
|
||||
stoplag()
|
||||
if(usr && statpanel("Examine"))
|
||||
stat(null,"[description_holders["icon"]] <font size='5'>[description_holders["name"]]</font>") //The name, written in big letters.
|
||||
stat(null,"[description_holders["desc"]]") //the default examine text.
|
||||
|
||||
@@ -2,7 +2,8 @@
|
||||
if(config.use_irc_bot && config.irc_bot_host.len)
|
||||
for(var/IP in config.irc_bot_host)
|
||||
spawn(0)
|
||||
ext_python("ircbot_message.py", "[config.comms_password] [IP] [channel] [msg]")
|
||||
// I have no means of trusting you, cmd
|
||||
ext_python("ircbot_message.py", "[config.comms_password] [IP] [channel] [paranoid_sanitize(msg)]")
|
||||
return
|
||||
|
||||
/proc/send2mainirc(var/msg)
|
||||
|
||||
@@ -4,6 +4,6 @@
|
||||
if(world.system_type == MS_WINDOWS)
|
||||
script = replacetext(script, "/", "\\")
|
||||
|
||||
var/command = config.python_path + " " + script + " " + args
|
||||
var/command = python_path + " " + script + " " + args
|
||||
shell("[command]")
|
||||
return
|
||||
return
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
proc/Intoxicated(phrase)
|
||||
phrase = html_decode(phrase)
|
||||
var/leng=lentext(phrase)
|
||||
|
||||
@@ -286,7 +286,7 @@
|
||||
drink_container.desc = "[recipe_to_use.description]"
|
||||
flick("bottler_on", src)
|
||||
spawn(45)
|
||||
QDEL_LIST_ASSOC_VAL(slots)
|
||||
resetSlots()
|
||||
bottling = 0
|
||||
drink_container.forceMove(loc)
|
||||
updateUsrDialog()
|
||||
@@ -405,3 +405,7 @@
|
||||
icon_state = "bottler_on"
|
||||
else
|
||||
icon_state = "bottler_off"
|
||||
|
||||
/obj/machinery/bottler/proc/resetSlots()
|
||||
QDEL_LIST_ASSOC_VAL(slots)
|
||||
slots.len = 3
|
||||
@@ -136,7 +136,6 @@
|
||||
attack_verb = list("stabbed", "slashed", "attacked")
|
||||
var/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken")
|
||||
sharp = 1
|
||||
edge = 1
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/gin
|
||||
name = "Griffeater Gin"
|
||||
@@ -174,6 +173,12 @@
|
||||
icon_state = "bottleofnothing"
|
||||
list_reagents = list("nothing" = 100)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofbanana
|
||||
name = "Jolly Jug"
|
||||
desc = "A jug filled with banana juice."
|
||||
icon_state = "bottleofjolly"
|
||||
list_reagents = list("banana" = 100)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/patron
|
||||
name = "Wrapp Artiste Patron"
|
||||
desc = "Silver laced tequila, served in space night clubs across the galaxy."
|
||||
|
||||
@@ -5,10 +5,16 @@
|
||||
amount_per_transfer_from_this = 15
|
||||
volume = 15
|
||||
materials = list(MAT_GLASS=100)
|
||||
var/light_intensity = 2
|
||||
light_color = LIGHT_COLOR_LIGHTBLUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/on_reagent_change()
|
||||
overlays.Cut()
|
||||
if(!isShotFlammable() && burn_state == ON_FIRE)
|
||||
extinguish()
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/update_icon()
|
||||
overlays.Cut()
|
||||
if(reagents.total_volume)
|
||||
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]1")
|
||||
|
||||
@@ -20,9 +26,77 @@
|
||||
filling.icon_state = "[icon_state]5"
|
||||
if(80 to INFINITY)
|
||||
filling.icon_state = "[icon_state]12"
|
||||
|
||||
filling.icon += mix_color_from_reagents(reagents.reagent_list)
|
||||
overlays += filling
|
||||
name = "shot glass of " + reagents.get_master_reagent_name() //No matter what, the glass will tell you the reagent's name. Might be too abusable in the future.
|
||||
if(burn_state == ON_FIRE)
|
||||
overlays += "shotglass_fire"
|
||||
name = "flaming [name]"
|
||||
else
|
||||
name = "shot glass"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/proc/clumsilyDrink(mob/living/carbon/human/user) //Clowns beware
|
||||
if(burn_state != ON_FIRE)
|
||||
return
|
||||
user.visible_message("<span class = 'warning'>[user] pours [src] all over themself!</span>", "<span class = 'danger'>You pour [src] all over yourself!</span>", "<span class = 'warning'>You hear a 'whoompf' and a sizzle.</span>")
|
||||
extinguish(TRUE)
|
||||
reagents.reaction(user, TOUCH)
|
||||
reagents.clear_reagents()
|
||||
user.IgniteMob()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/proc/isShotFlammable()
|
||||
var/datum/reagent/R = reagents.get_master_reagent()
|
||||
if(istype(R, /datum/reagent/consumable/ethanol))
|
||||
var/datum/reagent/consumable/ethanol/A = R
|
||||
if(A.volume >= 5 && A.alcohol_perc >= 0.35) //Only an approximation to if something's flammable but it will do
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/fire_act(global_overlay = FALSE)
|
||||
if(!isShotFlammable() || burn_state == ON_FIRE) //You can't light a shot that's not flammable!
|
||||
return
|
||||
..()
|
||||
set_light(light_intensity, null, light_color)
|
||||
visible_message("<span class = 'notice'>[src] begins to burn with a blue hue!</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/extinguish(silent = FALSE)
|
||||
..()
|
||||
set_light(0)
|
||||
if(!silent)
|
||||
visible_message("<span class = 'notice'>The dancing flame on [src] dies out.</span>")
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/burn() //Let's override fire deleting the reagents inside the shot
|
||||
return
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/attack(mob/living/carbon/human/user)
|
||||
if((CLUMSY in user.mutations) && prob(50) && burn_state == ON_FIRE)
|
||||
clumsilyDrink(user)
|
||||
else
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/attackby(obj/item/W)
|
||||
..()
|
||||
if(is_hot(W))
|
||||
fire_act()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/attack_hand(mob/user, pickupfireoverride = TRUE)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/attack_self(mob/living/carbon/human/user)
|
||||
..()
|
||||
if(burn_state != ON_FIRE)
|
||||
return
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
clumsilyDrink(user)
|
||||
else
|
||||
user.visible_message("<span class = 'notice'>[user] places their hand over [src] to put it out!</span>", "<span class = 'notice'>You use your hand to extinguish [src]!</span>")
|
||||
extinguish()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/shotglass/MouseDrop(mob/living/carbon/human/user)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
if((CLUMSY in user.mutations) && prob(50) && burn_state == ON_FIRE)
|
||||
clumsilyDrink(user)
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -12,9 +12,10 @@
|
||||
var/apply_method = "swallow"
|
||||
var/transfer_efficiency = 1.0
|
||||
var/instant_application = 0 //if we want to bypass the forcedfeed delay
|
||||
var/taste = TRUE//whether you can taste eating from this
|
||||
burn_state = FLAMMABLE
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/New()
|
||||
..()
|
||||
pixel_x = rand(-5, 5) //Randomizes postion
|
||||
pixel_y = rand(-5, 5)
|
||||
pixel_y = rand(-5, 5)
|
||||
|
||||
@@ -194,17 +194,22 @@
|
||||
if(isanimal(M))
|
||||
M.changeNext_move(CLICK_CD_MELEE)
|
||||
if(iscorgi(M))
|
||||
if(bitecount >= 4)
|
||||
var/mob/living/simple_animal/pet/corgi/G = M
|
||||
if(world.time < (G.last_eaten + 300))
|
||||
to_chat(G, "<span class='notice'>You are too full to try eating [src] right now.</span>")
|
||||
else if(bitecount >= 4)
|
||||
M.visible_message("[M] [pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where [src] was")].","<span class='notice'>You swallow up the last part of [src].</span>")
|
||||
playsound(loc,'sound/items/eatfood.ogg', rand(10,50), 1)
|
||||
var/mob/living/simple_animal/pet/corgi/C = M
|
||||
C.adjustBruteLoss(-5)
|
||||
C.adjustFireLoss(-5)
|
||||
qdel(src)
|
||||
G.last_eaten = world.time
|
||||
else
|
||||
M.visible_message("[M] takes a bite of [src].","<span class='notice'>You take a bite of [src].</span>")
|
||||
playsound(loc,'sound/items/eatfood.ogg', rand(10,50), 1)
|
||||
bitecount++
|
||||
G.last_eaten = world.time
|
||||
else if(ismouse(M))
|
||||
var/mob/living/simple_animal/mouse/N = M
|
||||
to_chat(N, text("<span class='notice'>You nibble away at [src].</span>"))
|
||||
@@ -960,6 +965,13 @@
|
||||
junkiness = 25
|
||||
list_reagents = list("nutriment" = 1, "beans" = 3, "msg" = 4, "sugar" = 2)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chinese/sweetsourchickenball
|
||||
name = "Sweet & Sour Chicken Balls"
|
||||
desc = "Is this chicken cooked? The odds are better than wok paper scissors."
|
||||
icon_state = "chickenball"
|
||||
junkiness = 25
|
||||
list_reagents = list("nutriment" = 2, "msg" = 4, "sugar" = 2)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chinese/tao
|
||||
name = "Admiral Yamamoto carp"
|
||||
desc = "Tastes like chicken."
|
||||
@@ -1902,6 +1914,12 @@
|
||||
icon_state = "watermelonslice"
|
||||
filling_color = "#FF3867"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pineappleslice
|
||||
name = "Pineapple Slices"
|
||||
desc = "Rings of pineapple."
|
||||
icon_state = "pineappleslice"
|
||||
filling_color = "#e5b437"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/applecake
|
||||
name = "Apple Cake"
|
||||
desc = "A cake centered with Apple."
|
||||
@@ -2025,6 +2043,20 @@
|
||||
icon_state = "vegetablepizzaslice"
|
||||
filling_color = "#BAA14C"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/hawaiianpizza
|
||||
name = "Hawaiian Pizza"
|
||||
desc = "Love it or hate it, this pizza divides opinions. Complete with juicy pineapple."
|
||||
icon_state = "hawaiianpizza" //NEEDED
|
||||
slice_path = /obj/item/weapon/reagent_containers/food/snacks/hawaiianpizzaslice
|
||||
slices_num = 6
|
||||
list_reagents = list("protein" = 15, "tomatojuice" = 6, "plantmatter" = 20, "pineapplejuice" = 6, "vitamin" = 5)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/hawaiianpizzaslice
|
||||
name = "Hawaiian pizza slice"
|
||||
desc = "A slice of polarising pizza."
|
||||
icon_state = "hawaiianpizzaslice"
|
||||
filling_color = "#e5b437"
|
||||
|
||||
/obj/item/pizzabox
|
||||
name = "pizza box"
|
||||
desc = "A box suited for pizzas."
|
||||
@@ -2198,6 +2230,10 @@
|
||||
pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/meatpizza(src)
|
||||
boxtag = "Meatlover's Supreme"
|
||||
|
||||
/obj/item/pizzabox/hawaiian/New()
|
||||
pizza = new /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/hawaiianpizza(src)
|
||||
boxtag = "Hawaiian Feast"
|
||||
|
||||
////////////////////////////////FOOD ADDITIONS////////////////////////////////////////////
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/wrap
|
||||
@@ -2478,3 +2514,11 @@
|
||||
icon_state = "tatortot"
|
||||
list_reagents = list("nutriment" = 4)
|
||||
filling_color = "FFD700"
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/onionrings
|
||||
name = "onion rings"
|
||||
desc = "Onion slices coated in batter."
|
||||
icon_state = "onionrings"
|
||||
list_reagents = list("nutriment" = 3)
|
||||
filling_color = "#C0C9A0"
|
||||
gender = PLURAL
|
||||
@@ -27,6 +27,7 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries = "berryjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = "pumpkinjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = "blumpkinjuice",
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/pineapple = "pineapplejuice"
|
||||
)
|
||||
|
||||
/obj/machinery/juicer/New()
|
||||
@@ -182,3 +183,4 @@
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/berries(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/banana(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/grapes(src)
|
||||
new/obj/item/weapon/reagent_containers/food/snacks/grown/pineapple(src)
|
||||
|
||||
@@ -541,6 +541,10 @@ datum/recipe/microwave/slimesandwich
|
||||
being_cooked.reagents.del_reagent("toxin")
|
||||
return being_cooked
|
||||
|
||||
/datum/recipe/microwave/onionrings
|
||||
items = list(/obj/item/weapon/reagent_containers/food/snacks/onion_slice)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/onionrings
|
||||
|
||||
////////////////////////////FOOD ADDITTIONS///////////////////////////////
|
||||
|
||||
/datum/recipe/microwave/wrap
|
||||
|
||||
@@ -253,6 +253,17 @@
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza
|
||||
|
||||
/datum/recipe/oven/hawaiianpizza
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pineappleslice,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/pineappleslice,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meat,
|
||||
)
|
||||
result = /obj/item/weapon/reagent_containers/food/snacks/sliceable/pizza/hawaiianpizza
|
||||
|
||||
/datum/recipe/oven/amanita_pie
|
||||
items = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
|
||||
|
||||
@@ -71,8 +71,7 @@
|
||||
|
||||
var/datum/reagent/R = null
|
||||
if(random_reagent)
|
||||
R = pick(subtypesof(/datum/reagent))
|
||||
R = chemical_reagents_list[initial(R.id)]
|
||||
R = get_random_reagent_id()
|
||||
|
||||
queen_bee = new(src)
|
||||
queen_bee.beehome = src
|
||||
@@ -89,13 +88,12 @@
|
||||
B.beehome = src
|
||||
B.assign_reagent(R)
|
||||
|
||||
|
||||
/obj/structure/beebox/premade/random
|
||||
random_reagent = TRUE
|
||||
|
||||
|
||||
/obj/structure/beebox/process()
|
||||
if(queen_bee)
|
||||
if(queen_bee && (!queen_bee.beegent || !queen_bee.beegent.can_synth))
|
||||
if(bee_resources >= BEE_RESOURCE_HONEYCOMB_COST)
|
||||
if(honeycombs.len < get_max_honeycomb())
|
||||
bee_resources = max(bee_resources-BEE_RESOURCE_HONEYCOMB_COST, 0)
|
||||
@@ -172,11 +170,13 @@
|
||||
|
||||
var/obj/item/queen_bee/qb = I
|
||||
user.unEquip(qb)
|
||||
|
||||
qb.queen.forceMove(src)
|
||||
bees += qb.queen
|
||||
queen_bee = qb.queen
|
||||
qb.queen = null
|
||||
if(!qb.queen.beegent || (qb.queen.beegent && qb.queen.beegent.can_synth))
|
||||
qb.queen.forceMove(src)
|
||||
bees += qb.queen
|
||||
queen_bee = qb.queen
|
||||
qb.queen = null
|
||||
else
|
||||
visible_message("<span class='notice'>The [qb] refuses to settle down. Maybe it's something to do with its reagent?</span>")
|
||||
|
||||
if(queen_bee)
|
||||
visible_message("<span class='notice'>[user] sets [qb] down inside the apiary, making it their new home.</span>")
|
||||
|
||||
@@ -15,11 +15,12 @@
|
||||
|
||||
var/datum/plant_gene/target
|
||||
var/operation = ""
|
||||
var/rating = 0
|
||||
var/max_extract_pot = 50
|
||||
// The cap on potency gene extraction.
|
||||
// This number is for T1, each upgraded part adds 5% for a tech level above T1.
|
||||
// At T4, it reaches 95%.
|
||||
var/max_potency = 50 // See RefreshParts() for how these work
|
||||
var/max_yield = 2
|
||||
var/min_production = 12
|
||||
var/max_endurance = 10 // IMPT: ALSO AFFECTS LIFESPAN
|
||||
var/min_wchance = 67
|
||||
var/min_wrate = 10
|
||||
|
||||
/obj/machinery/plantgenes/New()
|
||||
..()
|
||||
@@ -40,13 +41,27 @@
|
||||
QDEL_NULL(disk)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/plantgenes/RefreshParts()
|
||||
rating = 0
|
||||
for(var/I in component_parts)
|
||||
if(istype(I, /obj/item/weapon/stock_parts))
|
||||
var/obj/item/weapon/stock_parts/S = I
|
||||
rating += S.rating-1
|
||||
max_extract_pot = initial(max_extract_pot) + rating*5
|
||||
/obj/machinery/plantgenes/RefreshParts() // Comments represent the max you can set per tier, respectively. seeds.dm [219] clamps these for us but we don't want to mislead the viewer.
|
||||
for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
|
||||
if(M.rating > 3)
|
||||
max_potency = 95
|
||||
else
|
||||
max_potency = initial(max_potency) + (M.rating**3) // 51,58,77,95 Clamps at 100
|
||||
|
||||
max_yield = initial(max_yield) + (M.rating*2) // 4,6,8,10 Clamps at 10
|
||||
|
||||
for(var/obj/item/weapon/stock_parts/scanning_module/SM in component_parts)
|
||||
if(SM.rating > 3) //If you create t5 parts I'm a step ahead mwahahaha!
|
||||
min_production = 1
|
||||
else
|
||||
min_production = 12 - (SM.rating * 3) //9,6,3,1. Requires if to avoid going below clamp [1]
|
||||
|
||||
max_endurance = initial(max_endurance) + (SM.rating * 25) // 35,60,85,100 Clamps at 10min 100max
|
||||
|
||||
for(var/obj/item/weapon/stock_parts/micro_laser/ML in component_parts)
|
||||
var/wratemod = ML.rating * 2.5
|
||||
min_wrate = Floor(10-wratemod) // 7,5,2,0 Clamps at 0 and 10 You want this low
|
||||
min_wchance = 67-(ML.rating*16) // 48,35,19,3 Clamps at 0 and 67 You want this low
|
||||
|
||||
/obj/machinery/plantgenes/update_icon()
|
||||
..()
|
||||
@@ -133,11 +148,36 @@
|
||||
if("extract")
|
||||
dat += "<span class='highlight'>[target.get_name()]</span> gene from \the <span class='highlight'>[seed]</span>?<br>"
|
||||
dat += "<span class='bad'>The sample will be destroyed in process!</span>"
|
||||
if(istype(target, /datum/plant_gene/core/potency))
|
||||
if(istype(target, /datum/plant_gene/core))
|
||||
var/datum/plant_gene/core/gene = target
|
||||
if(gene.value > max_extract_pot)
|
||||
dat += "<br><br>This device's extraction capabilities are currently limited to [max_extract_pot] potency. "
|
||||
dat += "Target gene will be degraded to [max_extract_pot] potency on extraction."
|
||||
if(istype(target, /datum/plant_gene/core/potency))
|
||||
if(gene.value > max_potency)
|
||||
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[max_potency]</span> potency. "
|
||||
dat += "Target gene will be degraded to <span class='highlight'>[max_potency]</span> potency on extraction."
|
||||
else if(istype(target, /datum/plant_gene/core/lifespan))
|
||||
if(gene.value > max_endurance)
|
||||
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[max_endurance]</span> lifespan. "
|
||||
dat += "Target gene will be degraded to <span class='highlight'>[max_endurance]</span> Lifespan on extraction."
|
||||
else if(istype(target, /datum/plant_gene/core/endurance))
|
||||
if(gene.value > max_endurance)
|
||||
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[max_endurance]</span> endurance. "
|
||||
dat += "Target gene will be degraded to <span class='highlight'>[max_endurance]</span> endurance on extraction."
|
||||
else if(istype(target, /datum/plant_gene/core/yield))
|
||||
if(gene.value > max_yield)
|
||||
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[max_yield]</span> yield. "
|
||||
dat += "Target gene will be degraded to <span class='highlight'>[max_yield]</span> yield on extraction."
|
||||
else if(istype(target, /datum/plant_gene/core/production))
|
||||
if(gene.value < min_production)
|
||||
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[min_production]</span> production. "
|
||||
dat += "Target gene will be degraded to <span class='highlight'>[min_production]</span> production on extraction."
|
||||
else if(istype(target, /datum/plant_gene/core/weed_rate))
|
||||
if(gene.value < min_wrate)
|
||||
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[min_wrate]</span> weed rate. "
|
||||
dat += "Target gene will be degraded to <span class='highlight'>[min_wrate]</span> weed rate on extraction."
|
||||
else if(istype(target, /datum/plant_gene/core/weed_chance))
|
||||
if(gene.value < min_wchance)
|
||||
dat += "<br><br>This device's extraction capabilities are currently limited to <span class='highlight'>[min_wchance]</span> weed chance. "
|
||||
dat += "Target gene will be degraded to <span class='highlight'>[min_wchance]</span> weed chance on extraction."
|
||||
if("replace")
|
||||
dat += "<span class='highlight'>[target.get_name()]</span> gene with <span class='highlight'>[disk.gene.get_name()]</span>?<br>"
|
||||
if("insert")
|
||||
@@ -292,9 +332,22 @@
|
||||
if("extract")
|
||||
if(disk && !disk.read_only)
|
||||
disk.gene = G.Copy()
|
||||
if(istype(disk.gene, /datum/plant_gene/core/potency))
|
||||
if(istype(disk.gene, /datum/plant_gene/core))
|
||||
var/datum/plant_gene/core/gene = disk.gene
|
||||
gene.value = min(gene.value, max_extract_pot)
|
||||
if(istype(disk.gene, /datum/plant_gene/core/potency))
|
||||
gene.value = min(gene.value, max_potency)
|
||||
else if(istype(disk.gene, /datum/plant_gene/core/lifespan))
|
||||
gene.value = min(gene.value, max_endurance) //INTENDED
|
||||
else if(istype(disk.gene, /datum/plant_gene/core/endurance))
|
||||
gene.value = min(gene.value, max_endurance)
|
||||
else if(istype(disk.gene, /datum/plant_gene/core/production))
|
||||
gene.value = max(gene.value, min_production)
|
||||
else if(istype(disk.gene, /datum/plant_gene/core/yield))
|
||||
gene.value = min(gene.value, max_yield)
|
||||
else if(istype(disk.gene, /datum/plant_gene/core/weed_rate))
|
||||
gene.value = max(gene.value, min_wrate)
|
||||
else if(istype(disk.gene, /datum/plant_gene/core/weed_chance))
|
||||
gene.value = max(gene.value, min_wchance)
|
||||
disk.update_name()
|
||||
QDEL_NULL(seed)
|
||||
update_icon()
|
||||
@@ -397,7 +450,7 @@
|
||||
|
||||
/obj/item/weapon/disk/plantgene/proc/update_name()
|
||||
if(gene)
|
||||
name = "plant data disk - '[gene.get_name()]'"
|
||||
name = "[gene.get_name()] (Plant Data Disk)"
|
||||
else
|
||||
name = "plant data disk"
|
||||
|
||||
|
||||
@@ -112,6 +112,7 @@
|
||||
for(var/datum/plant_gene/trait/trait in seed.genes)
|
||||
trait.on_squash(src, target)
|
||||
|
||||
reagents.reaction(T)
|
||||
for(var/A in T)
|
||||
if(reagents)
|
||||
reagents.reaction(A)
|
||||
@@ -131,6 +132,11 @@
|
||||
T.on_cross(src, AM)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/on_trip(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if(. && seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_slip(src, H)
|
||||
|
||||
// Glow gene procs
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/generate_trash(atom/location)
|
||||
|
||||
@@ -113,9 +113,12 @@
|
||||
/obj/item/weapon/grown/bananapeel/specialpeel //used by /obj/item/clothing/shoes/clown_shoes/banana_shoes
|
||||
name = "synthesized banana peel"
|
||||
desc = "A synthetic banana peel."
|
||||
trip_stun = 2
|
||||
trip_weaken = 2
|
||||
trip_chance = 100
|
||||
trip_walksafe = FALSE
|
||||
trip_verb = TV_SLIP
|
||||
|
||||
/obj/item/weapon/grown/bananapeel/specialpeel/Crossed(AM)
|
||||
if(iscarbon(AM))
|
||||
var/mob/living/carbon/carbon = AM
|
||||
if(carbon.slip("[src]", 2, 2))
|
||||
qdel(src)
|
||||
/obj/item/weapon/grown/bananapeel/specialpeel/on_trip(mob/living/carbon/human/H)
|
||||
if(..())
|
||||
qdel(src)
|
||||
|
||||
@@ -1,18 +1,30 @@
|
||||
// Weeds
|
||||
/obj/item/seeds/weeds
|
||||
name = "pack of weed seeds"
|
||||
desc = "Yo mang, want some weeds?"
|
||||
icon_state = "seed"
|
||||
species = "weeds"
|
||||
// Starthistle
|
||||
/obj/item/seeds/starthistle
|
||||
name = "pack of starthistle seeds"
|
||||
desc = "A robust species of weed that often springs up in-between the cracks of spaceship parking lots"
|
||||
icon_state = "seed-starthistle"
|
||||
species = "starthistle"
|
||||
plantname = "Starthistle"
|
||||
lifespan = 100
|
||||
lifespan = 70
|
||||
endurance = 50 // damm pesky weeds
|
||||
maturation = 5
|
||||
production = 1
|
||||
yield = -1
|
||||
potency = -1
|
||||
growthstages = 4
|
||||
yield = 2
|
||||
potency = 10
|
||||
growthstages = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing_flowers.dmi'
|
||||
genes = list(/datum/plant_gene/trait/plant_type/weed_hardy)
|
||||
mutatelist = list(/obj/item/seeds/harebell)
|
||||
|
||||
/obj/item/seeds/starthistle/harvest(mob/user)
|
||||
var/obj/machinery/hydroponics/parent = loc
|
||||
if(prob(getYield() * 20))
|
||||
var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc
|
||||
for(var/i in 1 to yield+1)
|
||||
var/obj/item/seeds/starthistle/harvestseeds = Copy()
|
||||
harvestseeds.forceMove(output_loc)
|
||||
|
||||
parent.update_tray()
|
||||
|
||||
|
||||
// Cabbage
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
/obj/item/seeds/onion
|
||||
name = "pack of onion seeds"
|
||||
desc = "These seeds grow into onions."
|
||||
icon_state = "seed-onion"
|
||||
species = "onion"
|
||||
plantname = "Onion Sprouts"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/onion
|
||||
lifespan = 20
|
||||
maturation = 3
|
||||
production = 4
|
||||
yield = 6
|
||||
endurance = 25
|
||||
growthstages = 3
|
||||
weed_chance = 3
|
||||
growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi'
|
||||
reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1)
|
||||
mutatelist = list(/obj/item/seeds/onion/red)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/onion
|
||||
seed = /obj/item/seeds/onion
|
||||
name = "onion"
|
||||
desc = "Nothing to cry over."
|
||||
icon_state = "onion"
|
||||
filling_color = "#C0C9A0"
|
||||
bitesize_mod = 2
|
||||
slice_path = /obj/item/weapon/reagent_containers/food/snacks/onion_slice
|
||||
slices_num = 2
|
||||
|
||||
/obj/item/seeds/onion/red
|
||||
name = "pack of red onion seeds"
|
||||
desc = "For growing exceptionally potent onions."
|
||||
icon_state = "seed-onionred"
|
||||
species = "onion_red"
|
||||
plantname = "Red Onion Sprouts"
|
||||
weed_chance = 1
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/onion/red
|
||||
reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1, "onionjuice" = 0.05)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/onion/red
|
||||
seed = /obj/item/seeds/onion/red
|
||||
name = "red onion"
|
||||
desc = "Purple despite the name."
|
||||
icon_state = "onion_red"
|
||||
filling_color = "#C29ACF"
|
||||
slice_path = /obj/item/weapon/reagent_containers/food/snacks/onion_slice/red
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/onion_slice
|
||||
name = "onion slices"
|
||||
desc = "Rings, not for wearing."
|
||||
icon_state = "onionslice"
|
||||
list_reagents = list("plantmatter" = 5, "vitamin" = 2)
|
||||
filling_color = "#C0C9A0"
|
||||
gender = PLURAL
|
||||
cooked_type = /obj/item/weapon/reagent_containers/food/snacks/onionrings
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/onion_slice/red
|
||||
name = "red onion slices"
|
||||
desc = "They shine like exceptionally low quality amethyst."
|
||||
icon_state = "onionslice_red"
|
||||
filling_color = "#C29ACF"
|
||||
list_reagents = list("plantmatter" = 5, "vitamin" = 2, "onionjuice" = 2.5)
|
||||
@@ -0,0 +1,27 @@
|
||||
/obj/item/seeds/pineapple
|
||||
name = "pack of pineapple seeds"
|
||||
desc = "These seeds grow into pineapple plants."
|
||||
icon_state = "seed-pineapple" //NEEDED
|
||||
species = "pineapple"
|
||||
plantname = "Pineapple Plant"
|
||||
product = /obj/item/weapon/reagent_containers/food/snacks/grown/pineapple
|
||||
maturation = 6
|
||||
lifespan = 55
|
||||
endurance = 35
|
||||
growthstages = 4
|
||||
growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi'
|
||||
icon_grow = "pineapple-grow" //NEEDED
|
||||
icon_dead = "pineapple-dead" //NEEDED
|
||||
genes = list(/datum/plant_gene/trait/repeated_harvest)
|
||||
reagents_add = list("water" = 0.1, "vitamin" = 0.03, "sugar" = 0.02, "plantmatter" = 0.2)
|
||||
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/pineapple
|
||||
seed = /obj/item/seeds/pineapple
|
||||
name = "pineapple"
|
||||
desc = "A soft sweet interior surrounded by a spiky skin."
|
||||
slice_path = /obj/item/weapon/reagent_containers/food/snacks/pineappleslice
|
||||
slices_num = 4
|
||||
icon_state = "pineapple"
|
||||
filling_color = "#e5b437"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
bitesize_mod = 3
|
||||
@@ -50,6 +50,9 @@
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/deus,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat)
|
||||
|
||||
/obj/item/weapon/grown/log/New()
|
||||
..()
|
||||
accepted = typecacheof(accepted)
|
||||
|
||||
/obj/item/weapon/grown/log/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(is_sharp(W))
|
||||
@@ -66,7 +69,7 @@
|
||||
to_chat(user, "<span class='notice'>You add the newly-formed [plank_name] to the stack. It now contains [plank.amount] [plank_name].</span>")
|
||||
qdel(src)
|
||||
|
||||
if(is_type_in_list(W,accepted))
|
||||
if(is_type_in_typecache(W, accepted))
|
||||
var/obj/item/weapon/reagent_containers/food/snacks/grown/leaf = W
|
||||
if(leaf.dry)
|
||||
user.show_message("<span class='notice'>You wrap \the [W] around the log, turning it into a torch!</span>")
|
||||
@@ -138,7 +141,7 @@
|
||||
|
||||
/obj/structure/bonfire/proc/CheckOxygen()
|
||||
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
|
||||
if(G.oxygen > 16)
|
||||
if(G.oxygen > 13)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -57,8 +57,14 @@
|
||||
T.on_cross(src, AM)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/grown/on_trip(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if(. && seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_slip(src, H)
|
||||
|
||||
/obj/item/weapon/grown/throw_impact(atom/hit_atom)
|
||||
if(!..()) //was it caught by a mob?
|
||||
if(seed)
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_throw_impact(src, hit_atom)
|
||||
T.on_throw_impact(src, hit_atom)
|
||||
|
||||
@@ -89,7 +89,6 @@
|
||||
attack_verb = list("chopped", "torn", "cut")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharp = 1
|
||||
edge = 1
|
||||
|
||||
/obj/item/weapon/hatchet/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is chopping at \himself with the [src.name]! It looks like \he's trying to commit suicide.</span>")
|
||||
@@ -119,7 +118,6 @@
|
||||
attack_verb = list("chopped", "sliced", "cut", "reaped")
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
sharp = 1
|
||||
edge = 1
|
||||
var/extend = 1
|
||||
|
||||
/obj/item/weapon/scythe/suicide_act(mob/user)
|
||||
@@ -128,7 +126,7 @@
|
||||
var/mob/living/carbon/human/H = user
|
||||
var/obj/item/organ/external/affecting = H.get_organ("head")
|
||||
if(affecting)
|
||||
affecting.droplimb(1, DROPLIMB_EDGE)
|
||||
affecting.droplimb(1, DROPLIMB_SHARP)
|
||||
playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'), 50, 1, -1)
|
||||
return (BRUTELOSS)
|
||||
|
||||
@@ -139,7 +137,6 @@
|
||||
desc = "A sharp and curved blade on a collapsable fibre metal handle, this tool is the pinnacle of covert reaping technology."
|
||||
force = 3
|
||||
sharp = 0
|
||||
edge = 0
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
extend = 0
|
||||
slot_flags = SLOT_BELT
|
||||
@@ -172,7 +169,6 @@
|
||||
//Collapse sound (blade sheath)
|
||||
playsound(src.loc, 'sound/weapons/blade_sheath.ogg', 50, 1) //Sound credit to Q.K. of Freesound.org
|
||||
sharp = extend
|
||||
edge = extend
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.update_inv_l_hand()
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
var/lid_state = 0
|
||||
var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpollinate one plant
|
||||
var/using_irrigation = FALSE //If the tray is connected to other trays via irrigation hoses
|
||||
var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood.
|
||||
var/self_sufficiency_progress = 0
|
||||
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
|
||||
hud_possible = list (PLANT_NUTRIENT_HUD, PLANT_WATER_HUD, PLANT_STATUS_HUD, PLANT_HEALTH_HUD, PLANT_TOXIN_HUD, PLANT_PEST_HUD, PLANT_WEED_HUD)
|
||||
|
||||
@@ -358,6 +360,9 @@
|
||||
if(!self_sustaining)
|
||||
to_chat(user, "<span class='info'>Water: [waterlevel]/[maxwater]</span>")
|
||||
to_chat(user, "<span class='info'>Nutrient: [nutrilevel]/[maxnutri]</span>")
|
||||
if(self_sufficiency_progress > 0)
|
||||
var/percent_progress = round(self_sufficiency_progress * 100 / self_sufficiency_req)
|
||||
to_chat(user, "<span class='info'>Treatment for self-sustenance are [percent_progress]% complete.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='info'>It doesn't require any water or nutrients.</span>")
|
||||
|
||||
@@ -392,7 +397,7 @@
|
||||
if(4 to 5)
|
||||
myseed = new /obj/item/seeds/plump(src)
|
||||
else
|
||||
myseed = new /obj/item/seeds/weeds(src)
|
||||
myseed = new /obj/item/seeds/starthistle(src)
|
||||
age = 0
|
||||
plant_health = myseed.endurance
|
||||
lastcycle = world.time
|
||||
@@ -546,6 +551,14 @@
|
||||
adjustNutri(round(S.get_reagent_amount("fishwater") * 0.75))
|
||||
adjustWater(round(S.get_reagent_amount("fishwater") * 1))
|
||||
|
||||
// Ambrosia Gaia produces earthsblood.
|
||||
if(S.has_reagent("earthsblood"))
|
||||
self_sufficiency_progress += S.get_reagent_amount("earthsblood")
|
||||
if(self_sufficiency_progress >= self_sufficiency_req)
|
||||
become_self_sufficient()
|
||||
else if(!self_sustaining)
|
||||
to_chat(user, "<span class='notice'>[src] warms as it might on a spring day under a genuine Sun.</span>")
|
||||
|
||||
// Antitoxin binds shit pretty well. So the tox goes significantly down
|
||||
if(S.has_reagent("charcoal", 1))
|
||||
adjustToxic(-round(S.get_reagent_amount("charcoal") * 2))
|
||||
@@ -720,33 +733,7 @@
|
||||
|
||||
/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, params)
|
||||
//Called when mob user "attacks" it with object O
|
||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown/ambrosia/gaia)) //Checked early on so it doesn't have to deal with composting checks
|
||||
if(self_sustaining)
|
||||
to_chat(user, "<span class='warning'>This [name] is already self-sustaining!</span>")
|
||||
return
|
||||
if(myseed || weedlevel)
|
||||
to_chat(user, "<span class='warning'>[src] needs to be clear of plants and weeds!</span>")
|
||||
return
|
||||
if(alert(user, "This will make [src] self-sustaining but consume [O] forever. Are you sure?", "[name]", "I'm Sure", "Abort") == "Abort" || !user)
|
||||
return
|
||||
if(!O || qdeleted(O))
|
||||
return
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
if(self_sustaining)
|
||||
to_chat(user, "<span class='warning'>This [name] is already self-sustaining!</span>")
|
||||
return
|
||||
if(myseed || weedlevel)
|
||||
to_chat(user, "<span class='warning'>[src] needs to be clear of plants and weeds!</span>")
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] gently pulls open the soil for [O] and places it inside.</span>", "<span class='notice'>You tenderly root [O] into [src].</span>")
|
||||
user.drop_item()
|
||||
qdel(O)
|
||||
visible_message("<span class='boldnotice'>[src] begins to glow with a beautiful light!</span>")
|
||||
self_sustaining = TRUE
|
||||
update_icon()
|
||||
|
||||
else if(istype(O, /obj/item/weapon/reagent_containers) ) // Syringe stuff (and other reagent containers now too)
|
||||
if(istype(O, /obj/item/weapon/reagent_containers)) // Syringe stuff (and other reagent containers now too)
|
||||
var/obj/item/weapon/reagent_containers/reagent_source = O
|
||||
|
||||
if(istype(reagent_source, /obj/item/weapon/reagent_containers/syringe))
|
||||
@@ -988,6 +975,11 @@
|
||||
var/mob/living/simple_animal/hostile/C = new chosen
|
||||
C.faction = list("plants")
|
||||
|
||||
/obj/machinery/hydroponics/proc/become_self_sufficient() // Ambrosia Gaia effect
|
||||
visible_message("<span class='boldnotice'>[src] begins to glow with a beautiful light!</span>")
|
||||
self_sustaining = TRUE
|
||||
update_icon()
|
||||
|
||||
///Diona Nymph Related Procs///
|
||||
/obj/machinery/hydroponics/CanPass(atom/movable/mover, turf/target, height=0) //So nymphs can climb over top of trays.
|
||||
if(height==0)
|
||||
|
||||
@@ -204,24 +204,23 @@
|
||||
rate = 0.1
|
||||
examine_line = "<span class='info'>It has a very slippery skin.</span>"
|
||||
|
||||
/datum/plant_gene/trait/slip/on_cross(obj/item/weapon/reagent_containers/food/snacks/grown/G, atom/target)
|
||||
if(iscarbon(target))
|
||||
var/obj/item/seeds/seed = G.seed
|
||||
var/mob/living/carbon/M = target
|
||||
/datum/plant_gene/trait/slip/on_new(obj/item/weapon/reagent_containers/food/snacks/grown/G, newloc)
|
||||
. = ..()
|
||||
if(istype(G) && ispath(G.trash, /obj/item/weapon/grown))
|
||||
return
|
||||
|
||||
var/stun_len = seed.potency * rate * 0.8
|
||||
if(istype(G) && ispath(G.trash, /obj/item/weapon/grown))
|
||||
return
|
||||
var/stun_len = G.seed.potency * rate * 0.8
|
||||
|
||||
if(!istype(G, /obj/item/weapon/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube")))
|
||||
stun_len /= 3
|
||||
if(!istype(G, /obj/item/weapon/grown/bananapeel) && (!G.reagents || !G.reagents.has_reagent("lube")))
|
||||
stun_len /= 3
|
||||
|
||||
var/stun = min(stun_len, 7)
|
||||
var/weaken = min(stun_len, 7)
|
||||
stun_len = min(stun_len, 7) // No fun allowed
|
||||
|
||||
if(M.slip("[G]", stun, weaken))
|
||||
for(var/datum/plant_gene/trait/T in seed.genes)
|
||||
T.on_slip(G, M)
|
||||
G.trip_stun = stun_len
|
||||
G.trip_weaken = stun_len
|
||||
G.trip_chance = 100
|
||||
G.trip_verb = TV_SLIP
|
||||
G.trip_walksafe = FALSE
|
||||
|
||||
/datum/plant_gene/trait/cell_charge
|
||||
// Cell recharging trait. Charges all mob's power cells to (potency*rate)% mark when eaten.
|
||||
@@ -268,7 +267,7 @@
|
||||
rate = 0.03
|
||||
examine_line = "<span class='info'>It emits a soft glow.</span>"
|
||||
trait_id = "glow"
|
||||
var/glow_color = "#AAD84B"
|
||||
var/glow_color = "#C3E381"
|
||||
|
||||
/datum/plant_gene/trait/glow/proc/glow_range(obj/item/seeds/S)
|
||||
return 1.4 + S.potency*rate
|
||||
@@ -285,6 +284,7 @@
|
||||
//adds -potency*(rate*0.05) light power to products
|
||||
name = "Shadow Emission"
|
||||
rate = 0.04
|
||||
glow_color = "#AAD84B"
|
||||
|
||||
/datum/plant_gene/trait/glow/shadow/glow_power(obj/item/seeds/S)
|
||||
return -max(S.potency*(rate*0.05), 0.075)
|
||||
|
||||
@@ -151,6 +151,7 @@ datum/martial_art/krav_maga/grab_act(var/mob/living/carbon/human/A, var/mob/livi
|
||||
|
||||
/obj/item/clothing/gloves/color/black/krav_maga
|
||||
var/datum/martial_art/krav_maga/style = new
|
||||
can_be_cut = FALSE
|
||||
|
||||
/obj/item/clothing/gloves/color/black/krav_maga/equipped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
new /obj/item/weapon/ore/diamond(src)
|
||||
if(21 to 25)
|
||||
for(var/i in 1 to 5)
|
||||
new /obj/item/weapon/contraband/poster(src)
|
||||
new /obj/item/weapon/poster/random_contraband(src)
|
||||
if(26 to 35)
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/weapon/reagent_containers/glass/beaker/noreact(src)
|
||||
@@ -125,6 +125,7 @@
|
||||
new /obj/item/weapon/bikehorn(src)
|
||||
new /obj/item/toy/crayon/rainbow(src)
|
||||
new /obj/item/weapon/reagent_containers/spray/waterflower(src)
|
||||
new /obj/item/weapon/reagent_containers/food/drinks/bottle/bottleofbanana(src)
|
||||
if(95)
|
||||
new /obj/item/clothing/under/mime(src)
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
@@ -216,4 +217,4 @@
|
||||
qdel(AM)
|
||||
var/turf/T = get_turf(src)
|
||||
explosion(T, -1, -1, 1, 1)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
@@ -978,7 +978,6 @@
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("smashes", "crushes", "cleaves", "chops", "pulps")
|
||||
sharp = 1
|
||||
edge = 1
|
||||
var/charged = 1
|
||||
var/charge_time = 16
|
||||
var/atom/mark = null
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
item_state = "spectral"
|
||||
flags = CONDUCT
|
||||
sharp = 1
|
||||
edge = 1
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
force = 1
|
||||
throwforce = 1
|
||||
|
||||
@@ -87,7 +87,6 @@
|
||||
var/list/digsound = list('sound/effects/picaxe1.ogg','sound/effects/picaxe2.ogg','sound/effects/picaxe3.ogg')
|
||||
var/drill_verb = "picking"
|
||||
sharp = 1
|
||||
edge = 1
|
||||
var/excavation_amount = 100
|
||||
usesound = 'sound/effects/picaxe1.ogg'
|
||||
toolspeed = 1
|
||||
@@ -482,7 +481,7 @@
|
||||
var/obj/item/weapon/storage/pill_bottle/dice/D = new(src)
|
||||
load(D)
|
||||
else
|
||||
var/obj/item/device/guitar/G = new(src)
|
||||
var/obj/item/device/instrument/guitar/G = new(src)
|
||||
load(G)
|
||||
|
||||
//Fans
|
||||
|
||||
@@ -61,6 +61,11 @@
|
||||
|
||||
SetCollectBehavior()
|
||||
|
||||
/mob/living/simple_animal/hostile/mining_drone/emp_act(severity)
|
||||
adjustHealth(100 / severity)
|
||||
to_chat(src, "<span class='userdanger'>NOTICE: EMP detected, systems damaged!</span>")
|
||||
visible_message("<span class='warning'>[src] crackles and buzzes violently!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/mining_drone/sentience_act()
|
||||
AIStatus = AI_OFF
|
||||
check_friendly_fire = 0
|
||||
|
||||
@@ -251,11 +251,4 @@
|
||||
score_oremined++ //When ore spawns, increment score. Only include ore spawned on mining asteroid (No Clown Planet)
|
||||
|
||||
/obj/item/weapon/ore/ex_act()
|
||||
return
|
||||
|
||||
/obj/item/weapon/ore/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/device/core_sampler))
|
||||
var/obj/item/device/core_sampler/C = W
|
||||
C.sample_item(src, user)
|
||||
else
|
||||
return ..()
|
||||
return
|
||||
@@ -657,7 +657,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
return FALSE
|
||||
|
||||
/mob/dead/observer/incapacitated()
|
||||
/mob/dead/observer/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
|
||||
return TRUE
|
||||
|
||||
//this is a mob verb instead of atom for performance reasons
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
animation.master = src
|
||||
|
||||
// flick("gibbed-m", animation)
|
||||
gibs(loc, viruses, dna)
|
||||
gibs(loc, dna)
|
||||
dead_mob_list -= src
|
||||
if(client)
|
||||
respawnable_list += src
|
||||
|
||||
@@ -91,6 +91,10 @@
|
||||
desc = "It's a small maintenance robot."
|
||||
icon_state = "drone"
|
||||
|
||||
/obj/item/weapon/holder/drone/emagged
|
||||
name = "maintenance drone"
|
||||
icon_state = "drone-emagged"
|
||||
|
||||
/obj/item/weapon/holder/pai
|
||||
name = "pAI"
|
||||
desc = "It's a little robot."
|
||||
|
||||
@@ -96,6 +96,9 @@
|
||||
return (copytext(message, length(message)) == "!") ? 2 : 1
|
||||
|
||||
/datum/language/proc/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
if(!check_can_speak(speaker))
|
||||
return FALSE
|
||||
|
||||
log_say("[key_name(speaker)]: ([name]) [message]")
|
||||
|
||||
if(!speaker_mask)
|
||||
@@ -114,6 +117,9 @@
|
||||
/datum/language/proc/check_special_condition(mob/other, mob/living/speaker)
|
||||
return TRUE
|
||||
|
||||
/datum/language/proc/check_can_speak(mob/living/speaker)
|
||||
return TRUE
|
||||
|
||||
/datum/language/proc/get_spoken_verb(msg_end)
|
||||
switch(msg_end)
|
||||
if("!")
|
||||
@@ -292,8 +298,29 @@
|
||||
/datum/language/grey/broadcast(mob/living/speaker, message, speaker_mask)
|
||||
..(speaker,message,speaker.real_name)
|
||||
|
||||
/datum/language/grey/check_can_speak(mob/living/speaker)
|
||||
if(ishuman(speaker))
|
||||
var/mob/living/carbon/human/S = speaker
|
||||
var/obj/item/organ/external/rhand = S.get_organ("r_hand")
|
||||
var/obj/item/organ/external/lhand = S.get_organ("l_hand")
|
||||
if((!rhand || !rhand.is_usable()) && (!lhand || !lhand.is_usable()))
|
||||
to_chat(speaker,"<span class='warning'>You can't communicate without the ability to use your hands!</span>")
|
||||
return FALSE
|
||||
if(speaker.incapacitated(ignore_lying = 1))
|
||||
to_chat(speaker,"<span class='warning'>You can't communicate while unable to move your hands to your head!</span>")
|
||||
return FALSE
|
||||
|
||||
var/their = "their"
|
||||
if(speaker.gender == "female")
|
||||
their = "her"
|
||||
if(speaker.gender == "male")
|
||||
their = "his"
|
||||
speaker.visible_message("<span class='notice'>[speaker] touches [their] fingers to [their] temple.</span>") //If placed in grey/broadcast, it will happen regardless of the success of the action.
|
||||
|
||||
return TRUE
|
||||
|
||||
/datum/language/grey/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker)
|
||||
if(other in range(7, speaker))
|
||||
if(atoms_share_level(other, speaker))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
@@ -153,14 +153,10 @@
|
||||
return has_fine_manipulation
|
||||
|
||||
/mob/living/carbon/alien/Stat()
|
||||
|
||||
..()
|
||||
statpanel("Status")
|
||||
stat(null, "Intent: [a_intent]")
|
||||
stat(null, "Move Mode: [m_intent]")
|
||||
|
||||
..()
|
||||
|
||||
|
||||
show_stat_emergency_shuttle_eta()
|
||||
|
||||
/mob/living/carbon/alien/SetStunned(amount, updating = 1, force = 0)
|
||||
@@ -294,3 +290,9 @@ Des: Removes all infected images from the alien.
|
||||
playsound(T, S, volume, 1, range)
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/alien/getTrail()
|
||||
if(getBruteLoss() < 200)
|
||||
return pick("xltrails_1", "xltrails_2")
|
||||
else
|
||||
return pick("xttrails_1", "xttrails_2")
|
||||
@@ -14,7 +14,7 @@
|
||||
playsound(src.loc, 'sound/goonstation/effects/gib.ogg', 50, 1)
|
||||
|
||||
flick("gibbed-a", animation)
|
||||
xgibs(loc, viruses)
|
||||
xgibs(loc)
|
||||
dead_mob_list -= src
|
||||
|
||||
spawn(15)
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
var/leap_on_click = 0
|
||||
var/custom_pixel_x_offset = 0 //for admin fuckery.
|
||||
var/custom_pixel_y_offset = 0
|
||||
pressure_resistance = 100 //100 kPa difference required to push
|
||||
throw_pressure_limit = 120 //120 kPa difference required to throw
|
||||
|
||||
//This is fine right now, if we're adding organ specific damage this needs to be updated
|
||||
/mob/living/carbon/alien/humanoid/New()
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
/mob/living/carbon/alien/humanoid
|
||||
oxygen_alert = 0
|
||||
toxins_alert = 0
|
||||
fire_alert = 0
|
||||
pass_flags = PASSTABLE
|
||||
var/temperature_alert = 0
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/Life()
|
||||
@@ -22,15 +19,13 @@
|
||||
if(disabilities & COUGHING)
|
||||
if((prob(5) && paralysis <= 1))
|
||||
drop_item()
|
||||
spawn( 0 )
|
||||
emote("cough")
|
||||
return
|
||||
emote("cough")
|
||||
return
|
||||
if(disabilities & TOURETTES)
|
||||
if((prob(10) && paralysis <= 1))
|
||||
Stun(10)
|
||||
spawn( 0 )
|
||||
emote("twitch")
|
||||
return
|
||||
emote("twitch")
|
||||
return
|
||||
if(disabilities & NERVOUS)
|
||||
if(prob(10))
|
||||
stuttering = max(10, stuttering)
|
||||
@@ -68,8 +63,7 @@
|
||||
//UNCONSCIOUS. NO-ONE IS HOME
|
||||
if((getOxyLoss() > 50) || (config.health_threshold_crit >= health))
|
||||
if(health <= 20 && prob(1))
|
||||
spawn(0)
|
||||
emote("gasp")
|
||||
emote("gasp")
|
||||
if(!reagents.has_reagent("epinephrine"))
|
||||
adjustOxyLoss(1)
|
||||
Paralyse(3)
|
||||
@@ -81,8 +75,7 @@
|
||||
blinded = 1
|
||||
stat = UNCONSCIOUS
|
||||
if(prob(10) && health)
|
||||
spawn(0)
|
||||
emote("hiss")
|
||||
emote("hiss")
|
||||
//CONSCIOUS
|
||||
else
|
||||
stat = CONSCIOUS
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
/mob/living/carbon/alien/larva
|
||||
var/temperature_alert = 0
|
||||
|
||||
/mob/living/carbon/alien/larva/Life()
|
||||
if(..()) //still breathing
|
||||
// GROW!
|
||||
@@ -40,9 +35,8 @@
|
||||
else if(sleeping)
|
||||
blinded = 1
|
||||
stat = UNCONSCIOUS
|
||||
if( prob(10) && health )
|
||||
spawn(0)
|
||||
emote("hiss_")
|
||||
if(prob(10) && health)
|
||||
emote("hiss_")
|
||||
//CONSCIOUS
|
||||
else
|
||||
stat = CONSCIOUS
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
//TODO: Make these simple_animals
|
||||
|
||||
var/const/MIN_IMPREGNATION_TIME = 100 //time it takes to impregnate someone
|
||||
@@ -151,7 +149,10 @@ var/const/MAX_ACTIVE_TIME = 400
|
||||
M.Paralyse(MAX_IMPREGNATION_TIME/6) //something like 25 ticks = 20 seconds with the default settings
|
||||
else if(iscorgi(M))
|
||||
var/mob/living/simple_animal/pet/corgi/C = M
|
||||
loc = C
|
||||
if(C.facehugger)
|
||||
var/obj/item/F = C.facehugger
|
||||
F.forceMove(C.loc)
|
||||
forceMove(C)
|
||||
C.facehugger = src
|
||||
C.regenerate_icons()
|
||||
|
||||
@@ -163,7 +164,7 @@ var/const/MAX_ACTIVE_TIME = 400
|
||||
return 1
|
||||
|
||||
/obj/item/clothing/mask/facehugger/proc/Impregnate(mob/living/target as mob)
|
||||
if(!target || target.stat == DEAD) //was taken off or something
|
||||
if(!target || target.stat == DEAD || loc != target) //was taken off or something
|
||||
return
|
||||
|
||||
if(iscarbon(target))
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user