This commit is contained in:
Keila-coon
2019-12-01 02:38:56 -04:30
379 changed files with 207755 additions and 161420 deletions
+4 -4
View File
@@ -72,16 +72,16 @@
var/choice = input(src,"Please select an IP address to remove from the ToR banlist:","Remove ToR ban",null) as null|anything in F.dir
if(choice)
F.dir.Remove(choice)
src << "<b>Address removed</b>"
to_chat(src, "<b>Address removed</b>")
if("remove all")
src << "<b>[TORFILE] was [fdel(TORFILE)?"":"not "]removed.</b>"
to_chat(src, "<b>[TORFILE] was [fdel(TORFILE)?"":"not "]removed.</b>")
if("find")
var/input = input(src,"Please input an IP address to search for:","Find ToR ban",null) as null|text
if(input)
if(ToRban_isbanned(input))
src << "<font color='green'><b>Address is a known ToR address</b></font>"
to_chat(src, "<font color='green'><b>Address is a known ToR address</b></font>")
else
src << "<font color='red'><b>Address is not a known ToR address</b></font>"
to_chat(src, "<font color='red'><b>Address is not a known ToR address</b></font>")
return
#undef TORFILE
+1 -1
View File
@@ -1305,7 +1305,7 @@ var/datum/announcement/minor/admin_min_announcer = new
set desc = "Should fix any mob sprite update errors."
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(istype(H))
+3 -3
View File
@@ -34,7 +34,7 @@
if("singulo", "telesci") //general one-round-only stuff
var/F = investigate_subject2file(subject)
if(!F)
src << "<font color='red'>Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.</font>"
to_chat(src, "<font color='red'>Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.</font>")
return
src << browse(F,"window=investigate[subject];size=800x300")
@@ -43,8 +43,8 @@
if(href_logfile)
src << browse(href_logfile,"window=investigate[subject];size=800x300")
else
src << "<font color='red'>Error: admin_investigate: No href logfile found.</font>"
to_chat(src, "<font color='red'>Error: admin_investigate: No href logfile found.</font>")
return
else
src << "<font color='red'>Error: admin_investigate: Href Logging is not on.</font>"
to_chat(src, "<font color='red'>Error: admin_investigate: Href Logging is not on.</font>")
return
+3 -3
View File
@@ -22,7 +22,7 @@
return
if("")
F.dir.Remove(ckey)
src << "<b>Memo removed</b>"
to_chat(src, "<b>Memo removed</b>")
return
if( findtext(memo,"<script",1,0) )
return
@@ -35,7 +35,7 @@
var/savefile/F = new(MEMOFILE)
if(F)
for(var/ckey in F.dir)
src << "<center><span class='motd'><b>Admin Memo</b><i> by [F[ckey]]</i></span></center>"
to_chat(src, "<center><span class='motd'><b>Admin Memo</b><i> by [F[ckey]]</i></span></center>")
//delete your own or somebody else's memo
/client/proc/admin_memo_delete()
@@ -48,7 +48,7 @@
ckey = src.ckey
if(ckey)
F.dir.Remove(ckey)
src << "<b>Removed Memo created by [ckey].</b>"
to_chat(src, "<b>Removed Memo created by [ckey].</b>")
#undef MEMOFILE
#undef ENABLE_MEMOS
+5 -3
View File
@@ -149,7 +149,8 @@ client/proc/mark_report_done(ID as num)
for(var/datum/admin_report/N in reports)
if(N.ID == ID)
found = N
if(!found) src << "<b>* An error occured, sorry.</b>"
if(!found)
to_chat(src, "<b>* An error occured, sorry.</b>")
found.done = 1
@@ -158,7 +159,7 @@ client/proc/mark_report_done(ID as num)
client/proc/edit_report(ID as num)
if(!src.holder || src.holder.level < 0)
src << "<b>You tried to modify the news, but you're not an admin!</b>"
to_chat(src, "<b>You tried to modify the news, but you're not an admin!</b>")
return
var/savefile/Reports = new("data/reports.sav")
@@ -170,7 +171,8 @@ client/proc/edit_report(ID as num)
for(var/datum/admin_report/N in reports)
if(N.ID == ID)
found = N
if(!found) src << "<b>* An error occured, sorry.</b>"
if(!found)
to_chat(src, "<b>* An error occured, sorry.</b>")
var/body = input(src.mob, "Enter a body for the news", "Body") as null|message
if(!body) return
+13 -13
View File
@@ -452,7 +452,7 @@ var/list/admin_verbs_event_manager = list(
verbs.Remove(/client/proc/hide_most_verbs, admin_verbs_hideable)
verbs += /client/proc/show_verbs
src << "<span class='interface'>Most of your adminverbs have been hidden.</span>"
to_chat(src, "<span class='interface'>Most of your adminverbs have been hidden.</span>")
feedback_add_details("admin_verb","HMV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
@@ -463,7 +463,7 @@ var/list/admin_verbs_event_manager = list(
remove_admin_verbs()
verbs += /client/proc/show_verbs
src << "<span class='interface'>Almost all of your adminverbs have been hidden.</span>"
to_chat(src, "<span class='interface'>Almost all of your adminverbs have been hidden.</span>")
feedback_add_details("admin_verb","TAVVH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
@@ -474,7 +474,7 @@ var/list/admin_verbs_event_manager = list(
verbs -= /client/proc/show_verbs
add_admin_verbs()
src << "<span class='interface'>All of your adminverbs are now visible.</span>"
to_chat(src, "<span class='interface'>All of your adminverbs are now visible.</span>")
feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -494,7 +494,7 @@ var/list/admin_verbs_event_manager = list(
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else if(istype(mob,/mob/new_player))
src << "<font color='red'>Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.</font>"
to_chat(src, "<font color='red'>Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.</font>")
else
//ghostize
var/mob/body = mob
@@ -656,7 +656,7 @@ var/list/admin_verbs_event_manager = list(
else D = preferences_datums[warned_ckey]
if(!D)
src << "<font color='red'>Error: warn(): No such ckey found.</font>"
to_chat(src, "<font color='red'>Error: warn(): No such ckey found.</font>")
return
if(++D.warns >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:)
@@ -819,7 +819,7 @@ var/list/admin_verbs_event_manager = list(
deadmin_holder.reassociate()
log_admin("[src] re-admined themself.")
message_admins("[src] re-admined themself.", 1)
src << "<span class='interface'>You now have the keys to control the planet, or atleast a small space station</span>"
to_chat(src, "<span class='interface'>You now have the keys to control the planet, or atleast a small space station</span>")
verbs -= /client/proc/readmin_self
/client/proc/deadmin_self()
@@ -831,7 +831,7 @@ var/list/admin_verbs_event_manager = list(
log_admin("[src] deadmined themself.")
message_admins("[src] deadmined themself.", 1)
deadmin()
src << "<span class='interface'>You are now a normal player.</span>"
to_chat(src, "<span class='interface'>You are now a normal player.</span>")
verbs |= /client/proc/readmin_self
feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -842,10 +842,10 @@ var/list/admin_verbs_event_manager = list(
if(config)
if(config.log_hrefs)
config.log_hrefs = 0
src << "<b>Stopped logging hrefs</b>"
to_chat(src, "<b>Stopped logging hrefs</b>")
else
config.log_hrefs = 1
src << "<b>Started logging hrefs</b>"
to_chat(src, "<b>Started logging hrefs</b>")
/client/proc/check_ai_laws()
set name = "Check AI Laws"
@@ -1040,11 +1040,11 @@ var/list/admin_verbs_event_manager = list(
if(config)
if(config.cult_ghostwriter)
config.cult_ghostwriter = 0
src << "<b>Disallowed ghost writers.</b>"
to_chat(src, "<b>Disallowed ghost writers.</b>")
message_admins("Admin [key_name_admin(usr)] has disabled ghost writers.", 1)
else
config.cult_ghostwriter = 1
src << "<b>Enabled ghost writers.</b>"
to_chat(src, "<b>Enabled ghost writers.</b>")
message_admins("Admin [key_name_admin(usr)] has enabled ghost writers.", 1)
/client/proc/toggledrones()
@@ -1054,11 +1054,11 @@ var/list/admin_verbs_event_manager = list(
if(config)
if(config.allow_drone_spawn)
config.allow_drone_spawn = 0
src << "<b>Disallowed maint drones.</b>"
to_chat(src, "<b>Disallowed maint drones.</b>")
message_admins("Admin [key_name_admin(usr)] has disabled maint drones.", 1)
else
config.allow_drone_spawn = 1
src << "<b>Enabled maint drones.</b>"
to_chat(src, "<b>Enabled maint drones.</b>")
message_admins("Admin [key_name_admin(usr)] has enabled maint drones.", 1)
/client/proc/man_up(mob/T as mob in mob_list)
+1 -1
View File
@@ -4,7 +4,7 @@
set name = "Set CKey"
set desc = "Mob to teleport"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/list/keys = list()
+1 -1
View File
@@ -1896,7 +1896,7 @@
else if(href_list["cryoplayer"])
if(!check_rights(R_ADMIN)) return
var/mob/M = locate(href_list["cryoplayer"])
var/mob/living/carbon/M = locate(href_list["cryoplayer"]) //VOREStation edit from just an all mob check to mob/living/carbon
if(!istype(M))
to_chat(usr,"<span class='warning'>Mob doesn't exist!</span>")
return
+1 -1
View File
@@ -91,7 +91,7 @@
keys += M.client
var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys)
if(!selection)
src << "No keys found."
to_chat(src, "No keys found.")
return
var/mob/M = selection:mob
log_admin("[key_name(usr)] jumped to [key_name(M)]")
+2 -2
View File
@@ -3,7 +3,7 @@
set name = "Check Piping"
set background = 1
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -44,7 +44,7 @@
set category = "Mapping"
set name = "Check Power"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
feedback_add_details("admin_verb","CPOW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+7 -7
View File
@@ -4,7 +4,7 @@
set name = "Change Custom Event"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/input = sanitize(input(usr, "Enter the description of the custom event. Be descriptive. To cancel the event, make this blank or hit cancel.", "Custom Event", custom_event_msg) as message|null, MAX_PAPER_MESSAGE_LEN, extra = 0)
@@ -30,11 +30,11 @@
set name = "Custom Event Info"
if(!custom_event_msg || custom_event_msg == "")
src << "There currently is no known custom event taking place."
src << "Keep in mind: it is possible that an admin has not properly set this."
to_chat(src, "There currently is no known custom event taking place.")
to_chat(src, "Keep in mind: it is possible that an admin has not properly set this.")
return
src << "<h1 class='alert'>Custom Event</h1>"
src << "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>"
src << "<span class='alert'>[custom_event_msg]</span>"
src << "<br>"
to_chat(src, "<h1 class='alert'>Custom Event</h1>")
to_chat(src, "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>")
to_chat(src, "<span class='alert'>[custom_event_msg]</span>")
to_chat(src, "<br>")
+3 -3
View File
@@ -3,16 +3,16 @@
set name = "Dsay" //Gave this shit a shorter name so you only have to time out "dsay" rather than "dead say" to use it --NeoFite
set hidden = 1
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(!src.mob)
return
if(prefs.muted & MUTE_DEADCHAT)
src << "<span class='warning'>You cannot send DSAY messages (muted).</span>"
to_chat(src, "<span class='warning'>You cannot send DSAY messages (muted).</span>")
return
if(!is_preference_enabled(/datum/client_preference/show_dsay))
src << "<span class='warning'>You have deadchat muted.</span>"
to_chat(src, "<span class='warning'>You have deadchat muted.</span>")
return
if (src.handle_spam_prevention(msg,MUTE_DEADCHAT))
+1 -1
View File
@@ -562,7 +562,7 @@
SMES.output_level = 75000
if(!found_the_pump && response == "Setup Completely")
src << "<font color='red'>Unable to locate air supply to fill up with coolant, adding some coolant around the supermatter</font>"
to_chat(src, "<font color='red'>Unable to locate air supply to fill up with coolant, adding some coolant around the supermatter</font>")
var/turf/simulated/T = SM.loc
T.zone.air.gas["nitrogen"] += 450
T.zone.air.temperature = 50
+2 -2
View File
@@ -124,7 +124,7 @@
set category = "Debug"
/*
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(!air_master)
@@ -146,7 +146,7 @@
set category = "Debug"
/*
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(!air_master)
+6 -6
View File
@@ -24,12 +24,12 @@
set category = null
if(!src.holder)
src << "<font color='red'>Only Admins may use this command.</font>"
to_chat(src, "<font color='red'>Only Admins may use this command.</font>")
return
var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in GLOB.clients
if(!istype(target,/client))
src << "<font color='red'>Error: giveruntimelog(): Client not found.</font>"
to_chat(src, "<font color='red'>Error: giveruntimelog(): Client not found.</font>")
return
target.verbs |= /client/proc/getruntimelog
@@ -53,7 +53,7 @@
message_admins("[key_name_admin(src)] accessed file: [path]")
src << run( file(path) )
src << "Attempting to send file, this may take a fair few minutes if the file is very large."
to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.")
return
@@ -73,7 +73,7 @@
message_admins("[key_name_admin(src)] accessed file: [path]")
src << run( file(path) )
src << "Attempting to send file, this may take a fair few minutes if the file is very large."
to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.")
return
@@ -89,7 +89,7 @@
if( fexists(path) )
src << run( file(path) )
else
src << "<font color='red'>Error: view_txt_log(): File not found/Invalid path([path]).</font>"
to_chat(src, "<font color='red'>Error: view_txt_log(): File not found/Invalid path([path]).</font>")
return
feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
@@ -107,7 +107,7 @@
if( fexists(path) )
src << run( file(path) )
else
src << "<font color='red'>Error: view_atk_log(): File not found/Invalid path([path]).</font>"
to_chat(src, "<font color='red'>Error: view_atk_log(): File not found/Invalid path([path]).</font>")
return
usr << run( file(path) )
feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+32 -32
View File
@@ -2,7 +2,7 @@
set category = null
set name = "Drop Everything"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/confirm = alert(src, "Make [M] drop everything?", "Message", "Yes", "No")
@@ -20,7 +20,7 @@
set category = "Admin"
set name = "Prison"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if (ismob(M))
if(istype(M, /mob/living/silicon/ai))
@@ -48,7 +48,7 @@
set category = "Admin"
set name = "Check new Players"
if(!holder)
src << "Only staff members may use this command."
to_chat(src, "Only staff members may use this command.")
var/age = alert(src, "Age check", "Show accounts yonger then _____ days","7", "30" , "All")
@@ -70,12 +70,12 @@
msg += "[key_name(C, 1, 1, highlight_special_characters)]: account is [C.player_age] days old<br>"
if(missing_ages)
src << "Some accounts did not have proper ages set in their clients. This function requires database to be present."
to_chat(src, "Some accounts did not have proper ages set in their clients. This function requires database to be present.")
if(msg != "")
src << browse(msg, "window=Player_age_check")
else
src << "No matches for that age range found."
to_chat(src, "No matches for that age range found.")
/client/proc/cmd_admin_subtle_message(mob/M as mob in mob_list)
set category = "Special Verbs"
@@ -83,7 +83,7 @@
if(!ismob(M)) return
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/msg = sanitize(input("Message:", text("Subtle PM to [M.key]")) as text)
@@ -106,7 +106,7 @@
set name = "Global Narrate"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/msg = sanitize(input("Message:", text("Enter the text you wish to appear to everyone:")) as text)
@@ -123,7 +123,7 @@
set name = "Direct Narrate"
if(!holder)
src << "Only administrators and moderators may use this command."
to_chat(src, "Only administrators and moderators may use this command.")
return
if(!M)
@@ -148,7 +148,7 @@
set category = "Special Verbs"
set name = "Godmode"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
M.status_flags ^= GODMODE
usr << "<font color='blue'> Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]</font>"
@@ -216,7 +216,7 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
set category = "Fun"
set name = "Add Random AI Law"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm != "Yes") return
@@ -248,7 +248,7 @@ Ccomp's first proc.
any = 1 //if no ghosts show up, any will just be 0
if(!any)
if(notify)
src << "There doesn't appear to be any ghosts for you to select."
to_chat(src, "There doesn't appear to be any ghosts for you to select.")
return
for(var/mob/M in mobs)
@@ -265,12 +265,12 @@ Ccomp's first proc.
set name = "Allow player to respawn"
set desc = "Let's the player bypass the wait to respawn or allow them to re-enter their corpse."
if(!holder)
src << "Only administrators and moderators may use this command."
to_chat(src, "Only administrators and moderators may use this command.")
var/list/ghosts= get_ghosts(1,1)
var/target = input("Please, select a ghost!", "COME BACK TO LIFE!", null, null) as null|anything in ghosts
if(!target)
src << "Hrm, appears you didn't select a ghost" // Sanity check, if no ghosts in the list we don't want to edit a null variable and cause a runtime error.
to_chat(src, "Hrm, appears you didn't select a ghost") // Sanity check, if no ghosts in the list we don't want to edit a null variable and cause a runtime error.
return
var/mob/observer/dead/G = ghosts[target]
@@ -295,7 +295,7 @@ Ccomp's first proc.
set desc = "Toggles antagHUD usage for observers"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
var/action=""
if(config.antag_hud_allowed)
for(var/mob/observer/dead/g in get_ghosts())
@@ -306,7 +306,7 @@ Ccomp's first proc.
g.has_enabled_antagHUD = 2 // We'll allow them to respawn
g << "<font color='red'><B>The Administrator has disabled AntagHUD </B></font>"
config.antag_hud_allowed = 0
src << "<font color='red'><B>AntagHUD usage has been disabled</B></font>"
to_chat(src, "<font color='red'><B>AntagHUD usage has been disabled</B></font>")
action = "disabled"
else
for(var/mob/observer/dead/g in get_ghosts())
@@ -315,7 +315,7 @@ Ccomp's first proc.
g << "<font color='blue'><B>The Administrator has enabled AntagHUD </B></font>" // Notify all observers they can now use AntagHUD
config.antag_hud_allowed = 1
action = "enabled"
src << "<font color='blue'><B>AntagHUD usage has been enabled</B></font>"
to_chat(src, "<font color='blue'><B>AntagHUD usage has been enabled</B></font>")
log_admin("[key_name(usr)] has [action] antagHUD usage for observers")
@@ -328,14 +328,14 @@ Ccomp's first proc.
set name = "Toggle antagHUD Restrictions"
set desc = "Restricts players that have used antagHUD from being able to join this round."
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
var/action=""
if(config.antag_hud_restricted)
for(var/mob/observer/dead/g in get_ghosts())
g << "<font color='blue'><B>The administrator has lifted restrictions on joining the round if you use AntagHUD</B></font>"
action = "lifted restrictions"
config.antag_hud_restricted = 0
src << "<font color='blue'><B>AntagHUD restrictions have been lifted</B></font>"
to_chat(src, "<font color='blue'><B>AntagHUD restrictions have been lifted</B></font>")
else
for(var/mob/observer/dead/g in get_ghosts())
g << "<font color='red'><B>The administrator has placed restrictions on joining the round if you use AntagHUD</B></font>"
@@ -344,7 +344,7 @@ Ccomp's first proc.
g.has_enabled_antagHUD = 0
action = "placed restrictions"
config.antag_hud_restricted = 1
src << "<font color='red'><B>AntagHUD restrictions have been enabled</B></font>"
to_chat(src, "<font color='red'><B>AntagHUD restrictions have been enabled</B></font>")
log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD")
message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1)
@@ -359,7 +359,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Spawn Character"
set desc = "(Re)Spawn a client's loaded character."
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
//I frontload all the questions so we don't have a half-done process while you're reading.
@@ -443,7 +443,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
switch(location)
if("Right Here") //Spawn them on your turf
if(!src.mob)
src << "You can't use 'Right Here' when you are not 'Right Anywhere'!"
to_chat(src, "You can't use 'Right Here' when you are not 'Right Anywhere'!")
return
spawnloc = get_turf(src.mob)
@@ -452,19 +452,19 @@ Traitors and the like can also be revived with the previous role mostly intact.
spawnloc = pick(latejoin)
else //I have no idea how you're here
src << "Invalid spawn location choice."
to_chat(src, "Invalid spawn location choice.")
return
//Did we actually get a loc to spawn them?
if(!spawnloc)
src << "Couldn't get valid spawn location."
to_chat(src, "Couldn't get valid spawn location.")
return
new_character = new(spawnloc)
//We were able to spawn them, right?
if(!new_character)
src << "Something went wrong and spawning failed."
to_chat(src, "Something went wrong and spawning failed.")
return
//Write the appearance and whatnot out to the character
@@ -517,7 +517,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Fun"
set name = "Add Custom AI law"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/input = sanitize(input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null)
if(!input)
@@ -545,7 +545,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Special Verbs"
set name = "Rejuvenate"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(!mob)
return
@@ -567,7 +567,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Special Verbs"
set name = "Create Command Report"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/input = sanitize(input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null, extra = 0)
var/customname = sanitizeSafe(input(usr, "Pick a title for the report.", "Title") as text|null)
@@ -595,7 +595,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Delete"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
admin_delete(O)
@@ -604,11 +604,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "List free slots"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(job_master)
for(var/datum/job/job in job_master.occupations)
src << "[job.title]: [job.total_positions]"
to_chat(src, "[job.title]: [job.total_positions]")
feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world)
@@ -705,7 +705,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Manual Ban"
set category = "Special Verbs"
if(!authenticated || !holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/mob/M = null
switch(alert("How would you like to ban someone today?", "Manual Ban", "Key List", "Enter Manually", "Cancel"))
@@ -777,7 +777,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Debug"
set name = "Stabilize Atmos."
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
feedback_add_details("admin_verb","STATM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
// DEFERRED
+1 -1
View File
@@ -7,7 +7,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future
set desc = "Spawns a strike team if you want to run an admin event."
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(!ticker)
+1 -1
View File
@@ -19,6 +19,6 @@
if("Yes") config.Tickcomp = 1
else config.Tickcomp = 0
else
src << "<font color='red'>Error: ticklag(): Invalid world.ticklag value. No changes made.</font>"
to_chat(src, "<font color='red'>Error: ticklag(): Invalid world.ticklag value. No changes made.</font>")
+8 -7
View File
@@ -359,13 +359,14 @@
var/list/possibleverbs = list()
possibleverbs += "Cancel" // One for the top...
possibleverbs += typesof(/mob/proc,/mob/verb,/mob/living/proc,/mob/living/verb)
switch(H.type)
if(/mob/living/carbon/human)
possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc)
if(/mob/living/silicon/robot)
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb)
if(/mob/living/silicon/ai)
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb)
if(istype(H,/mob/living/carbon/human))
possibleverbs += typesof(/mob/living/carbon/proc,/mob/living/carbon/verb,/mob/living/carbon/human/verb,/mob/living/carbon/human/proc)
if(istype(H,/mob/living/silicon/robot))
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/robot/proc,/mob/living/silicon/robot/verb)
if(istype(H,/mob/living/silicon/ai))
possibleverbs += typesof(/mob/living/silicon/proc,/mob/living/silicon/ai/proc,/mob/living/silicon/ai/verb)
if(istype(H,/mob/living/simple_mob))
possibleverbs += typesof(/mob/living/simple_mob/proc,/mob/living/simple_mob/verb) //VOREStation edit, Apparently polaris simplemobs have no verbs at all.
possibleverbs -= H.verbs
possibleverbs += "Cancel" // ...And one for the bottom
+4 -1
View File
@@ -5,6 +5,9 @@
// If our holder is able to do anything.
/datum/ai_holder/proc/can_act()
if(!holder) // Holder missing.
SSai.processing -= src
return FALSE
if(holder.stat) // Dead or unconscious.
ai_log("can_act() : Stat was non-zero ([holder.stat]).", AI_LOG_TRACE)
return FALSE
@@ -95,4 +98,4 @@
holder.IMove(get_step(holder,moving_to))
wander_delay = base_wander_delay
ai_log("handle_wander_movement() : Exited.", AI_LOG_DEBUG)
*/
*/
+1 -1
View File
@@ -142,7 +142,7 @@
if(isturf(holder.loc) && can_act())
wander_delay--
if(wander_delay <= 0)
if(!wander_when_pulled && holder.pulledby)
if(!wander_when_pulled && (holder.pulledby || holder.grabbed_by.len))
ai_log("handle_wander_movement() : Being pulled and cannot wander. Exiting.", AI_LOG_DEBUG)
return
+6
View File
@@ -104,6 +104,12 @@
/obj/item/device/assembly_holder/Crossed(atom/movable/AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(a_left)
a_left.Crossed(AM)
if(a_right)
+7 -1
View File
@@ -25,7 +25,7 @@
/obj/item/device/assembly/infra/toggle_secure()
secured = !secured
if(secured)
START_PROCESSING(SSobj, src)
START_PROCESSING(SSobj, src)
else
on = 0
if(first) qdel(first)
@@ -242,6 +242,12 @@
return
/obj/effect/beam/i_beam/Crossed(atom/movable/AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(istype(AM, /obj/effect/beam))
return
spawn(0)
+6
View File
@@ -83,6 +83,12 @@
/obj/item/device/assembly/mousetrap/Crossed(AM as mob|obj)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(armed)
if(ishuman(AM))
var/mob/living/carbon/H = AM
+1
View File
@@ -168,6 +168,7 @@ obj/machinery/gateway/centerstation/process()
update_icon()
stationgate = locate(/obj/machinery/gateway/centerstation)
. = ..()
density = 1 //VOREStation Add
/obj/machinery/gateway/centeraway/update_icon()
@@ -60,6 +60,11 @@
desc = ""
value = CATALOGUER_REWARD_TRIVIAL
/datum/category_item/catalogue/fauna/shadekin
name = "Sapients - Shadekin"
desc = ""
value = CATALOGUER_REWARD_EASY
/datum/category_item/catalogue/fauna/custom_species
name = "Sapients - Other"
desc = "Remote frontiers require people of all sorts of life...\
+8 -8
View File
@@ -78,13 +78,13 @@
//This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc.
/client/AllowUpload(filename, filelength)
if(filelength > UPLOAD_LIMIT)
src << "<font color='red'>Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.</font>"
to_chat(src, "<font color='red'>Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.</font>")
return 0
/* //Don't need this at the moment. But it's here if it's needed later.
//Helps prevent multiple files being uploaded at once. Or right after eachother.
var/time_to_wait = fileaccess_timer - world.time
if(time_to_wait > 0)
src << "<font color='red'>Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds.</font>"
to_chat(src, "<font color='red'>Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds.</font>")
return 0
fileaccess_timer = world.time + FTPDELAY */
return 1
@@ -106,7 +106,7 @@
del(src)
return
src << "<font color='red'>If the title screen is black, resources are still downloading. Please be patient until the title screen appears.</font>"
to_chat(src, "<font color='red'>If the title screen is black, resources are still downloading. Please be patient until the title screen appears.</font>")
GLOB.clients += src
@@ -132,10 +132,10 @@
prefs.sanitize_preferences()
if(custom_event_msg && custom_event_msg != "")
src << "<h1 class='alert'>Custom Event</h1>"
src << "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>"
src << "<span class='alert'>[custom_event_msg]</span>"
src << "<br>"
to_chat(src, "<h1 class='alert'>Custom Event</h1>")
to_chat(src, "<h2 class='alert'>A custom event is taking place. OOC Info:</h2>")
to_chat(src, "<span class='alert'>[custom_event_msg]</span>")
to_chat(src, "<br>")
if(holder)
@@ -161,7 +161,7 @@
screen += void
if(prefs.lastchangelog != changelog_hash) //bolds the changelog button on the interface so we know there are updates.
src << "<span class='info'>You have unread updates in the changelog.</span>"
to_chat(src, "<span class='info'>You have unread updates in the changelog.</span>")
winset(src, "rpane.changelog", "background-color=#eaeaea;font-style=bold")
if(config.aggressive_changelog)
src.changes()
@@ -135,6 +135,12 @@ var/list/_client_preferences_by_type
enabled_description = "Show"
disabled_description = "Hide"
/datum/client_preference/air_pump_noise
description ="Air Pump Ambient Noise"
key = "SOUND_AIRPUMP"
enabled_description = "Audible"
disabled_description = "Silent"
/datum/client_preference/mob_tooltips
description ="Mob tooltips"
key = "MOB_TOOLTIPS"
@@ -0,0 +1,14 @@
/datum/gear_tweak/collar_tag/get_contents(var/metadata)
return "Tag: [metadata]"
/datum/gear_tweak/collar_tag/get_default()
return ""
/datum/gear_tweak/collar_tag/get_metadata(var/user, var/metadata)
return sanitize( input(user, "Choose the tag text", "Character Preference", metadata) as text , MAX_NAME_LEN )
/datum/gear_tweak/collar_tag/tweak_item(var/obj/item/clothing/accessory/collar/C, var/metadata)
if(metadata == "")
return
else
C.initialize_tag(metadata)
@@ -70,10 +70,13 @@ var/list/gear_datums = list()
continue
if(max_cost && G.cost > max_cost)
continue
if(G.ckeywhitelist && !(preference_mob.ckey in G.ckeywhitelist)) //Vorestation Edit
continue //Vorestation Edit
if(G.character_name && !(preference_mob.client.prefs.real_name in G.character_name)) //Vorestation Edit
continue //Vorestation Edit
//VOREStation Edit Start
if(preference_mob && preference_mob.client)
if(G.ckeywhitelist && !(preference_mob.ckey in G.ckeywhitelist))
continue
if(G.character_name && !(preference_mob.client.prefs.real_name in G.character_name))
continue
//VOREStation Edit End
. += gear_name
/datum/category_item/player_setup_item/loadout/sanitize_character()
@@ -150,10 +153,13 @@ var/list/gear_datums = list()
. += "<tr><td colspan=3><hr></td></tr>"
for(var/gear_name in LC.gear)
var/datum/gear/G = LC.gear[gear_name]
if(G.ckeywhitelist && !(preference_mob.ckey in G.ckeywhitelist)) //Vorestation Edit
continue //Vorestation Edit
if(G.character_name && !(preference_mob.client.prefs.real_name in G.character_name)) //Vorestation Edit
continue //Vorestation Edit
//VOREStation Edit Start
if(preference_mob && preference_mob.client)
if(G.ckeywhitelist && !(preference_mob.ckey in G.ckeywhitelist))
continue
if(G.character_name && !(preference_mob.client.prefs.real_name in G.character_name))
continue
//VOREStation Edit End
var/ticked = (G.display_name in pref.gear)
. += "<tr style='vertical-align:top;'><td width=25%><a style='white-space:normal;' [ticked ? "class='linkOn' " : ""]href='?src=\ref[src];toggle_gear=[html_encode(G.display_name)]'>[G.display_name]</a></td>"
. += "<td width = 10% style='vertical-align:top'>[G.cost]</td>"
@@ -271,4 +277,7 @@ var/list/gear_datums = list()
var/item = new gd.path(gd.location)
for(var/datum/gear_tweak/gt in gear_tweaks)
gt.tweak_item(item, metadata["[gt]"])
var/mob/M = location
if(istype(M) && exploitable) //Update exploitable info records for the mob without creating a duplicate object at their feet.
M.amend_exploitable(item)
return item
@@ -6,6 +6,10 @@
slot = slot_tie
sort_category = "Accessories"
/datum/gear/collar/New()
..()
gear_tweaks = list(gear_tweak_collar_tag)
/datum/gear/collar/golden
display_name = "collar, golden"
path = /obj/item/clothing/accessory/collar/gold
@@ -34,6 +34,12 @@
ckeywhitelist = list("aegisoa")
character_name = list("Xander Bevin")
/datum/gear/fluff/xander_medal
path = /obj/item/clothing/accessory/medal/conduct
display_name = "Xander's Conduct Medal"
ckeywhitelist = list("aegisoa")
character_name = list("Xander Bevin")
/datum/gear/fluff/lynn_penlight
path = /obj/item/device/flashlight/pen/fluff/lynn
display_name = "Lynn's Penlight"
@@ -85,6 +91,12 @@
ckeywhitelist = list("beyondmylife")
character_name = list("Ne'tra Ky'ram")
/datum/gear/fluff/nolan_medal
path = /obj/item/clothing/accessory/medal/silver/unity
display_name = "Nolan's Unity Medal"
ckeywhitelist = list("blakeryan")
character_name = list("Nolan Conaway")
/datum/gear/fluff/xin_sovietuniform
path = /obj/item/clothing/under/soviet
display_name = "Xin's Soviet Uniform"
@@ -98,6 +110,24 @@
ckeywhitelist = list("bwoincognito")
character_name = list("Tasald Corlethian")
/datum/gear/fluff/tasald_cartographer_jumpsuit
path = /obj/item/clothing/under/solgov/utility/sifguard/officer/exploration
display_name = "Tasald's Cartographer's uniform - jumpsuit"
ckeywhitelist = list("bwoincognito")
character_name = list("Tasald Corlethian")
/datum/gear/fluff/tasald_cartographer_jacket
path = /obj/item/clothing/suit/storage/service/sifguard/command
display_name = "Tasald's Cartographer's uniform - jacket"
ckeywhitelist = list("bwoincognito")
character_name = list("Tasald Corlethian")
/datum/gear/fluff/tasald_cartographer_beret
path = /obj/item/clothing/head/beret/sol/expedition/command
display_name = "Tasald's Cartographer's uniform - beret"
ckeywhitelist = list("bwoincognito")
character_name = list("Tasald Corlethian")
/datum/gear/fluff/octavius_box
path = /obj/item/weapon/storage/box/fluff/octavious
display_name = "Octavious' Box"
@@ -210,6 +240,12 @@
ckeywhitelist = list("epigraphzero")
character_name = list("Verd Woodrow")
/datum/gear/fluff/erik_medal
path = /obj/item/clothing/accessory/medal/silver/unity
display_name = "Erik's Unity Medal"
ckeywhitelist = list("erikthedog")
character_name = list("Erik Ramadwood")
// F CKEYS
// G CKEYS
@@ -708,6 +744,12 @@
ckeywhitelist = list("techtypes")
character_name = list("Lasshseeki Korss")
/datum/gear/fluff/nick_medal
path = /obj/item/clothing/accessory/medal/conduct
display_name = "Nick's Conduct Medal"
ckeywhitelist = list("thedavestdave")
character_name = list("Nick Sloan")
/datum/gear/fluff/konor_medal
path = /obj/item/clothing/accessory/medal/silver/unity
display_name = "Konor's Unity Medal"
@@ -842,27 +884,30 @@
path = /obj/item/clothing/glasses/omnihud/med/fluff/wickedtemphud
display_name = "Tempest's Medical Hud"
ckeywhitelist = list("wickedtemp")
character_name = list("Chakat Tempest Venesare")
character_name = list("Chakat Tempest Venosare")
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic")
slot = slot_glasses
/datum/gear/fluff/tempest_hypospray
path = /obj/item/weapon/reagent_containers/hypospray/vial/tempest
display_name = "Tempest's Hypospray"
ckeywhitelist = list("wickedtemp")
character_name = list("Chakat Tempest Venesare")
character_name = list("Chakat Tempest Venosare")
allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic")
slot = slot_belt
/datum/gear/fluff/tempest_backpack
path = /obj/item/weapon/storage/backpack/saddlebag/tempest
display_name = "Tempest's Saddlebag"
ckeywhitelist = list("wickedtemp")
character_name = list("Chakat Tempest Venesare")
character_name = list("Chakat Tempest Venosare")
slot = slot_back
/datum/gear/fluff/tempest_implant
path = /obj/item/weapon/implanter/reagent_generator/tempest
display_name = "Tempest's Implant"
ckeywhitelist = list("wickedtemp")
character_name = list("Chakat Tempest Venesare")
character_name = list("Chakat Tempest Venosare")
// X CKEYS
/datum/gear/fluff/penelope_box
@@ -897,3 +942,9 @@
display_name = "Nehi's Radio"
ckeywhitelist = list("zodiacshadow")
character_name = list("Nehi Maximus")
/datum/gear/fluff/star_sweater
path = /obj/item/clothing/accessory/sweater/fluff/star
display_name = "Star Sweater"
ckeywhitelist = list("bacon12366")
character_name = list("Elly Brown")
@@ -160,13 +160,13 @@
// C CKEYS
//cheekycrenando
//Srusu Rskuzu
//Srusu Rskuzu-Ahslru
/datum/gear/fluff/srususovietuniform
path = /obj/item/clothing/under/fluff/srususoviet
display_name = "Soviet Uniform"
description = "Standard issue soviet dress uniform"
ckeywhitelist = list("cheekycrenando")
character_name = list("Srusu Rskuzu")
character_name = list("Srusu Rskuzu-Ahslru")
//captmatt4
//Payton Joghs
@@ -127,7 +127,7 @@
/datum/gear/utility/implant/neural
display_name = "implant, neural assistance web"
description = "A complex web implanted into the subject, medically in order to compensate for neurological disease."
path = /obj/item/weapon/implant/neural/roundstart
path = /obj/item/weapon/implant/neural
cost = 6
/datum/gear/utility/implant/dud1
@@ -89,10 +89,19 @@
pref.b_wing = sanitize_integer(pref.b_wing, 0, 255, initial(pref.b_wing))
if(pref.ear_style)
pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style))
var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style]
if(temp_ear_style.apply_restrictions && (!(pref.species in temp_ear_style.species_allowed)))
pref.ear_style = initial(pref.ear_style)
if(pref.tail_style)
pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style))
var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style]
if(temp_tail_style.apply_restrictions && (!(pref.species in temp_tail_style.species_allowed)))
pref.tail_style = initial(pref.tail_style)
if(pref.wing_style)
pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style))
var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style]
if(temp_wing_style.apply_restrictions && (!(pref.species in temp_wing_style.species_allowed)))
pref.wing_style = initial(pref.wing_style)
/datum/category_item/player_setup_item/vore/ears/copy_to_mob(var/mob/living/carbon/human/character)
character.ear_style = ear_styles_list[pref.ear_style]
@@ -182,7 +191,7 @@
var/list/pretty_ear_styles = list("Normal" = null)
for(var/path in ear_styles_list)
var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
if((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed))
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)))
pretty_ear_styles[instance.name] = path
// Present choice to user
@@ -215,7 +224,7 @@
var/list/pretty_tail_styles = list("Normal" = null)
for(var/path in tail_styles_list)
var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
if((!instance.ckeys_allowed) || (user.ckey in instance.ckeys_allowed))
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)))
pretty_tail_styles[instance.name] = path
// Present choice to user
@@ -248,7 +257,7 @@
var/list/pretty_wing_styles = list("Normal" = null)
for(var/path in wing_styles_list)
var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
if((!instance.ckeys_allowed) || (user.ckey in instance.ckeys_allowed))
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)))
pretty_wing_styles[instance.name] = path
// Present choice to user
@@ -203,7 +203,7 @@
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear jukebox music."
to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear jukebox music.")
SScharacter_setup.queue_preferences_save(prefs)
@@ -224,6 +224,21 @@
feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_air_pump_hum()
set name = "Toggle Air Pump Noise"
set category = "Preferences"
set desc = "Toggles Air Pumps humming"
var/pref_path = /datum/client_preference/air_pump_noise
toggle_preference(pref_path)
to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear air pumps hum, start, and stop.")
SScharacter_setup.queue_preferences_save(prefs)
feedback_add_details("admin_verb","TAirPumpNoise")
/client/verb/toggle_safe_firing()
set name = "Toggle Gun Firing Intent Requirement"
set category = "Preferences"
+2 -2
View File
@@ -13,7 +13,7 @@ datum/preferences
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear eating related vore noises."
to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear eating related vore noises.")
SScharacter_setup.queue_preferences_save(prefs)
@@ -29,7 +29,7 @@ datum/preferences
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear digestion related vore noises."
to_chat(src, "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear digestion related vore noises.")
SScharacter_setup.queue_preferences_save(prefs)
+1 -1
View File
@@ -180,4 +180,4 @@
sprite_sheets = list(
SPECIES_TESHARI = 'icons/mob/species/seromi/head.dmi',
SPECIES_VOX = 'icons/mob/species/vox/head.dmi',
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/head.dmi')
SPECIES_WEREBEAST = 'icons/mob/species/werebeast/head.dmi')
+1 -1
View File
@@ -1016,7 +1016,7 @@
M.stop_pulling()
if(wearer.pinned.len)
src << "<span class='notice'>Your host is pinned to a wall by [wearer.pinned[1]]</span>!"
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.
@@ -211,13 +211,17 @@
desc = initial(desc)
else
to_chat(user,"<span class='notice'>You set the [name]'s tag to '[str]'.</span>")
name = initial(name) + " ([str])"
if(istype(src,/obj/item/clothing/accessory/collar/holo))
desc = initial(desc) + " The tag says \"[str]\"."
else
desc = initial(desc) + " \"[str]\" has been engraved on the tag."
initialize_tag(str)
/obj/item/clothing/accessory/collar/proc/initialize_tag(var/tag)
name = initial(name) + " ([tag])"
desc = initial(desc) + " \"[tag]\" has been engraved on the tag."
writtenon = 1
/obj/item/clothing/accessory/collar/holo/initialize_tag(var/tag)
..()
desc = initial(desc) + " The tag says \"[tag]\"."
/obj/item/clothing/accessory/collar/attackby(obj/item/I, mob/user)
if(istype(src,/obj/item/clothing/accessory/collar/holo))
return
-1
View File
@@ -142,7 +142,6 @@ var/global/list/severity_to_string = list(EVENT_LEVEL_MUNDANE = "Mundane", EVENT
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust , 60, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 50), //VORESTATION AI TEMPORARY REMOVAL
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),
+18 -17
View File
@@ -28,36 +28,38 @@
/datum/event_container/mundane/New()
available_events = list(
// Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 200),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 400),
// Bluescreens APCs, but they still work
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage, 20, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence,20, list(ASSIGNMENT_JANITOR = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Canister Leak", /datum/event/canister_leak, 10, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 0, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
//new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Mundane News", /datum/event/mundane_news, 300),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 1, 25, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lore News", /datum/event/lore_news, 400),
// Spawns mice, lizards, or dud spiderlings
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100), 1),
// Rot only weakens walls, not destroy them
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 20, list(ASSIGNMENT_SECURITY = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
))
/datum/event_container/moderate/New()
available_events = list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 800),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 1600),
// Leaks gas into an unoccupied room.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Atmos Leak", /datum/event/atmos_leak, 30, list(ASSIGNMENT_ENGINEER = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 30), 1),
// Just disables comms for a short while.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 500, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120), 1),
// Just blows out a few lights
@@ -71,37 +73,36 @@
// Opens doors in brig. So just RP fun
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 10, list(ASSIGNMENT_SECURITY = 100), 1),
// Radiation, but only in space.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 0, list(ASSIGNMENT_SECURITY = 20), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 30, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 0, list(ASSIGNMENT_SECURITY = 20, ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 30, list(ASSIGNMENT_SECURITY = 30), 1),
//Evil grubs that drain station power slightly
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 0, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 100, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 20)),
// Not bad (dorms are shielded) but inconvenient
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 50, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Random Antagonist", /datum/event/random_antag, 2.5, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 20, list(ASSIGNMENT_SECURITY = 60)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 80, list(ASSIGNMENT_ENGINEER = 30)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 40), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
))
/datum/event_container/major/New()
available_events = list(
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 900),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 3600),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Atmos Leak", /datum/event/atmos_leak, 30, list(ASSIGNMENT_ENGINEER = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15) ,1)
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 7), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0, list(ASSIGNMENT_ANY = 5), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 10, list(ASSIGNMENT_ENGINEER = 60), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0,list(ASSIGNMENT_ANY = 5)),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
))
+1 -1
View File
@@ -23,7 +23,7 @@
for(var/i = 0, i < 3, i++)
var/turf/target = get_step(T, pick(alldirs))
if(target && istype(target, /turf/simulated/floor))
var/mob/living/simple_mob/corgi/Ian/doge = new(target)
var/mob/living/simple_mob/animal/passive/dog/corgi/Ian/doge = new(target)
doge.name = "Ian " + pick("Alpha", "Beta", "Chi", "Delta", "Epsilon", "Phi",
"Gamma", "Eta", "Iota", "Kappa", "Lambda", "Omicron", "Theta",
"Rho", "Sigma", "Tau", "Upsilon", "Omega", "Psi", "Zeta")
+1 -1
View File
@@ -23,6 +23,6 @@
while((spawncount >= 1) && vents.len)
var/obj/vent = pick(vents)
new /obj/effect/spider/spiderling(vent.loc)
new /obj/effect/spider/spiderling/virgo(vent.loc) //VOREStation Edit - No nurses
vents -= vent
spawncount--
+1 -1
View File
@@ -23,7 +23,7 @@ mob/living/carbon/proc/dream()
spawn(0)
for(var/i = rand(1,4),i > 0, i--)
src << "<font color='blue'><i>... [pick(dreams)] ...</i></font>"
to_chat(src, "<font color='blue'><i>... [pick(dreams)] ...</i></font>")
sleep(rand(40,70))
if(paralysis <= 0)
dreaming = 0
+8 -8
View File
@@ -28,13 +28,13 @@ mob/living/carbon/proc/handle_hallucinations()
switch(halpick)
if(0 to 15)
//Screwy HUD
//src << "Screwy HUD"
//to_chat(src, "Screwy HUD")
hal_screwyhud = pick(1,2,3,3,4,4)
spawn(rand(100,250))
hal_screwyhud = 0
if(16 to 25)
//Strange items
//src << "Traitor Items"
//to_chat(src, "Traitor Items")
if(!halitem)
halitem = new
var/list/slots_free = list(ui_lhand,ui_rhand)
@@ -82,7 +82,7 @@ mob/living/carbon/proc/handle_hallucinations()
halitem = null
if(26 to 40)
//Flashes of danger
//src << "Danger Flash"
//to_chat(src, "Danger Flash")
if(!halimage)
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
@@ -92,13 +92,13 @@ mob/living/carbon/proc/handle_hallucinations()
switch(rand(1,3))
if(1)
//src << "Space"
//to_chat(src, "Space")
halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
if(2)
//src << "Fire"
//to_chat(src, "Fire")
halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
if(3)
//src << "C4"
//to_chat(src, "C4")
halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
@@ -110,7 +110,7 @@ mob/living/carbon/proc/handle_hallucinations()
if(41 to 65)
//Strange audio
//src << "Strange Audio"
//to_chat(src, "Strange Audio")
switch(rand(1,12))
if(1) src << 'sound/machines/airlock.ogg'
if(2)
@@ -144,7 +144,7 @@ mob/living/carbon/proc/handle_hallucinations()
src << pick(creepyasssounds)
if(66 to 70)
//Flashes of danger
//src << "Danger Flash"
//to_chat(src, "Danger Flash")
if(!halbody)
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
+1 -1
View File
@@ -214,4 +214,4 @@
html += "</table></body></html>"
src << browse(html, "window=recipes;file=recipes_drinks.html;display=0")
src << "<span class='notice'>In your byond cache, recipe-xxx.png files and recipes_drinks.html and recipes_food.html now exist. Place recipe-xxx.png files in a subfolder named 'imgrecipes' wherever you put them. The file will take a food.css or drinks.css file if in the same path.</span>"
to_chat(src, "<span class='notice'>In your byond cache, recipe-xxx.png files and recipes_drinks.html and recipes_food.html now exist. Place recipe-xxx.png files in a subfolder named 'imgrecipes' wherever you put them. The file will take a food.css or drinks.css file if in the same path.</span>")
+41 -32
View File
@@ -24,47 +24,50 @@
if(planttype)
plantname = planttype
if(!plantname)
return
/obj/item/weapon/reagent_containers/food/snacks/grown/Initialize()
..()
spawn()
if(!plantname)
return
if(!plant_controller)
sleep(250) // ugly hack, should mean roundstart plants are fine.
if(!plant_controller)
world << "<span class='danger'>Plant controller does not exist and [src] requires it. Aborting.</span>"
qdel(src)
return
if(!plant_controller)
sleep(250) // ugly hack, should mean roundstart plants are fine.
if(!plant_controller)
world << "<span class='danger'>Plant controller does not exist and [src] requires it. Aborting.</span>"
qdel(src)
return
seed = plant_controller.seeds[plantname]
seed = plant_controller.seeds[plantname]
if(!seed)
return
if(!seed)
return
name = "[seed.seed_name]"
trash = seed.get_trash_type()
name = "[seed.seed_name]"
trash = seed.get_trash_type()
update_icon()
update_icon()
if(!seed.chems)
return
if(!seed.chems)
return
potency = seed.get_trait(TRAIT_POTENCY)
potency = seed.get_trait(TRAIT_POTENCY)
for(var/rid in seed.chems)
var/list/reagent_data = seed.chems[rid]
if(reagent_data && reagent_data.len)
var/rtotal = reagent_data[1]
var/list/data = list()
if(reagent_data.len > 1 && potency > 0)
rtotal += round(potency/reagent_data[2])
if(rid == "nutriment")
data[seed.seed_name] = max(1,rtotal)
for(var/rid in seed.chems)
var/list/reagent_data = seed.chems[rid]
if(reagent_data && reagent_data.len)
var/rtotal = reagent_data[1]
var/list/data = list()
if(reagent_data.len > 1 && potency > 0)
rtotal += round(potency/reagent_data[2])
if(rid == "nutriment")
data[seed.seed_name] = max(1,rtotal)
reagents.add_reagent(rid,max(1,rtotal),data)
update_desc()
if(reagents.total_volume > 0)
bitesize = 1+round(reagents.total_volume / 2, 1)
if(seed.get_trait(TRAIT_STINGS))
force = 1
reagents.add_reagent(rid,max(1,rtotal),data)
update_desc()
if(reagents.total_volume > 0)
bitesize = 1+round(reagents.total_volume / 2, 1)
if(seed.get_trait(TRAIT_STINGS))
force = 1
/obj/item/weapon/reagent_containers/food/snacks/grown/proc/update_desc()
@@ -154,6 +157,12 @@
overlays |= plant_icon
/obj/item/weapon/reagent_containers/food/snacks/grown/Crossed(var/mob/living/M)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = M
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(seed && seed.get_trait(TRAIT_JUICY) == 2)
if(istype(M))
@@ -20,6 +20,12 @@
manual_unbuckle(user)
/obj/effect/plant/Crossed(atom/movable/O)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = O
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(isliving(O))
trodden_on(O)
@@ -0,0 +1,61 @@
/*
* Home of the New (NOV 1st, 2019) library books.
*/
/obj/item/weapon/book/custom_library
name = "Book"
desc = "A hardbound book."
description_info = "This book is printed from the custom repo. If you can see this, something went wrong."
icon = 'icons/obj/custom_books.dmi'
icon_state = "book"
// This is the ckey of the book's author.
var/origkey = null
author = "UNKNOWN"
/obj/item/weapon/book/custom_library/fiction
libcategory = "Fiction"
/obj/item/weapon/book/custom_library/nonfiction
libcategory = "Non-Fiction"
/obj/item/weapon/book/custom_library/reference
libcategory = "Reference"
/obj/item/weapon/book/custom_library/religious
libcategory = "Religious"
/*
/obj/item/weapon/book/custom_library/adult
libcategory = "Adult"
*/
/obj/item/weapon/book/bundle/custom_library
name = "Book"
desc = "A hardbound book."
description_info = "This book is printed from the custom repo. If you can see this, something went wrong."
icon = 'icons/obj/custom_books.dmi'
icon_state = "book"
// This is the ckey of the book's author.
var/origkey = null
author = "UNKNOWN"
page = 1 //current page
pages = list() //the contents of each page
/obj/item/weapon/book/bundle/custom_library/fiction
libcategory = "Fiction"
/obj/item/weapon/book/bundle/custom_library/nonfiction
libcategory = "Non-Fiction"
/obj/item/weapon/book/bundle/custom_library/reference
libcategory = "Reference"
/obj/item/weapon/book/bundle/custom_library/religious
libcategory = "Religious"
/*
/obj/item/weapon/book/bundle/custom_library/adult
libcategory = "Adult"
*/
+69
View File
@@ -147,6 +147,7 @@
var/dat // Actual page content
var/due_date = 0 // Game time in 1/10th seconds
var/author // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
var/libcategory = "Miscellaneous" // The library category this book sits in. "Fiction", "Non-Fiction", "Adult", "Reference", "Religion"
var/unique = 0 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified
var/title // The real name of the book.
var/carved = 0 // Has the book been hollowed out for use as a secret storage item?
@@ -260,6 +261,74 @@
M << browse("<TT><I>Penned by [author].</I></TT> <BR>" + "[dat]", "window=book")
user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam
/*
* Book Bundle (Multi-page book)
*/
/obj/item/weapon/book/bundle
var/page = 1 //current page
var/list/pages = list() //the contents of each page
/obj/item/weapon/book/bundle/proc/show_content(mob/user as mob)
var/dat
var/obj/item/weapon/W = pages[page]
// first
if(page == 1)
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'><A href='?src=\ref[src];prev_page=1'>Front</A></DIV>"
dat+= "<DIV STYLE='float:right; text-align:right; width:33.33333%'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV><BR><HR>"
// last
else if(page == pages.len)
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
dat+= "<DIV STYLE='float:right; text-align:right; with:33.33333%'><A href='?src=\ref[src];next_page=1'>Back</A></DIV><BR><HR>"
// middle pages
else
dat+= "<DIV STYLE='float:left; text-align:left; width:33.33333%'><A href='?src=\ref[src];prev_page=1'>Previous Page</A></DIV>"
dat+= "<DIV STYLE='float:right; text-align:right; width:33.33333%'><A href='?src=\ref[src];next_page=1'>Next Page</A></DIV><BR><HR>"
if(istype(pages[page], /obj/item/weapon/paper))
var/obj/item/weapon/paper/P = W
if(!(istype(usr, /mob/living/carbon/human) || isobserver(usr) || istype(usr, /mob/living/silicon)))
dat += "<HTML><HEAD><TITLE>[P.name]</TITLE></HEAD><BODY>[stars(P.info)][P.stamps]</BODY></HTML>"
else
dat += "<HTML><HEAD><TITLE>[P.name]</TITLE></HEAD><BODY>[P.info][P.stamps]</BODY></HTML>"
user << browse(dat, "window=[name]")
else if(istype(pages[page], /obj/item/weapon/photo))
var/obj/item/weapon/photo/P = W
user << browse_rsc(P.img, "tmp_photo.png")
user << browse(dat + "<html><head><title>[P.name]</title></head>" \
+ "<body style='overflow:hidden'>" \
+ "<div> <img src='tmp_photo.png' width = '180'" \
+ "[P.scribble ? "<div> Written on the back:<br><i>[P.scribble]</i>" : ]"\
+ "</body></html>", "window=[name]")
else if(!isnull(pages[page]))
if(!(istype(usr, /mob/living/carbon/human) || isobserver(usr) || istype(usr, /mob/living/silicon)))
dat += "<HTML><HEAD><TITLE>Page [page]</TITLE></HEAD><BODY>[stars(pages[page])]</BODY></HTML>"
else
dat += "<HTML><HEAD><TITLE>Page [page]</TITLE></HEAD><BODY>[pages[page]]</BODY></HTML>"
user << browse(dat, "window=[name]")
/obj/item/weapon/book/bundle/attack_self(mob/user as mob)
src.show_content(user)
add_fingerprint(usr)
update_icon()
return
/obj/item/weapon/book/bundle/Topic(href, href_list)
if(..())
return 1
if((src in usr.contents) || (istype(src.loc, /obj/item/weapon/folder) && (src.loc in usr.contents)))
usr.set_machine(src)
if(href_list["next_page"])
if(page != pages.len)
page++
playsound(src.loc, "pageturn", 50, 1)
if(href_list["prev_page"])
if(page > 1)
page--
playsound(src.loc, "pageturn", 50, 1)
src.attack_self(usr)
updateUsrDialog()
else
to_chat(usr, "<span class='notice'>You need to hold it in your hands!</span>")
/*
* Barcode Scanner
+72 -3
View File
@@ -113,7 +113,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
* Library Computer
*/
// TODO: Make this an actual /obj/machinery/computer that can be crafted from circuit boards and such
// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it.
// It is August 22nd, 2012... This TODO has already been here for months.. I wonder how long it'll last before someone does something about it. // Nov 2019. Nope.
/obj/machinery/librarycomp
name = "Check-In/Out Computer"
icon = 'icons/obj/library.dmi'
@@ -133,6 +133,40 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
var/bibledelay = 0 // LOL NO SPAM (1 minute delay) -- Doohl
var/static/list/all_books
var/static/list/base_genre_books
/obj/machinery/librarycomp/Initialize()
..()
if(!base_genre_books || !base_genre_books.len)
base_genre_books = list(
/obj/item/weapon/book/custom_library/fiction,
/obj/item/weapon/book/custom_library/nonfiction,
/obj/item/weapon/book/custom_library/reference,
/obj/item/weapon/book/custom_library/religious,
/obj/item/weapon/book/bundle/custom_library/fiction,
/obj/item/weapon/book/bundle/custom_library/nonfiction,
/obj/item/weapon/book/bundle/custom_library/reference,
/obj/item/weapon/book/bundle/custom_library/religious
)
if(!all_books || !all_books.len)
all_books = list()
for(var/path in subtypesof(/obj/item/weapon/book/codex/lore))
var/obj/item/weapon/book/C = new path(null)
all_books[C.name] = C
for(var/path in subtypesof(/obj/item/weapon/book/custom_library) - base_genre_books)
var/obj/item/weapon/book/B = new path(null)
all_books[B.title] = B
for(var/path in subtypesof(/obj/item/weapon/book/bundle/custom_library) - base_genre_books)
var/obj/item/weapon/book/M = new path(null)
all_books[M.title] = M
/obj/machinery/librarycomp/attack_hand(var/mob/user as mob)
usr.set_machine(src)
var/dat = "<HEAD><TITLE>Book Inventory Management</TITLE></HEAD><BODY>\n" // <META HTTP-EQUIV='Refresh' CONTENT='10'>
@@ -144,7 +178,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
<A href='?src=\ref[src];switchscreen=3'>3. Check out a Book</A><BR>
<A href='?src=\ref[src];switchscreen=4'>4. Connect to External Archive</A><BR>
<A href='?src=\ref[src];switchscreen=5'>5. Upload New Title to Archive</A><BR>
<A href='?src=\ref[src];switchscreen=6'>6. Print a Bible</A><BR>"}
<A href='?src=\ref[src];switchscreen=6'>6. Print a Bible</A><BR>
<A href='?src=\ref[src];switchscreen=8'>8. Access NT Internal Archive</A><BR>"}
if(src.emagged)
dat += "<A href='?src=\ref[src];switchscreen=7'>7. Access the Forbidden Lore Vault</A><BR>"
if(src.arcanecheckout)
@@ -190,8 +225,11 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
<A href='?src=\ref[src];checkout=1'>(Commit Entry)</A><BR>
<A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"}
if(4)
dat += "<h3>External Archive</h3>"
dat += "<h3>External Archive</h3>" //VOREStation Edit
establish_old_db_connection()
dat += "<h3><font color=red>Warning: System Administrator has slated this archive for removal. Personal uploads should be taken to the NT board of internal literature.</font></h3>"
if(!dbcon_old.IsConnected())
dat += "<font color=red><b>ERROR</b>: Unable to contact External Archive. Please contact your system administrator for assistance.</font>"
else
@@ -210,6 +248,10 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
dat += "</table>"
dat += "<BR><A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"
if(5)
//dat += "<H3>ERROR</H3>" //VOREStation Removal
//dat+= "<FONT color=red>Library Database is in Secure Management Mode.</FONT><BR>\ //VOREStation Removal
//Contact a System Administrator for more information.<BR>" //VOREStation Removal
//VOREstation Edit Start
dat += "<H3>Upload a New Title</H3>"
if(!scanner)
for(var/obj/machinery/libraryscanner/S in range(9))
@@ -227,12 +269,30 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
dat += {"<TT>Author: </TT><A href='?src=\ref[src];setauthor=1'>[scanner.cache.author]</A><BR>
<TT>Category: </TT><A href='?src=\ref[src];setcategory=1'>[upload_category]</A><BR>
<A href='?src=\ref[src];upload=1'>\[Upload\]</A><BR>"}
//VOREStation Edit End
dat += "<A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"
if(7)
dat += {"<h3>Accessing Forbidden Lore Vault v 1.3</h3>
Are you absolutely sure you want to proceed? EldritchTomes Inc. takes no responsibilities for loss of sanity resulting from this action.<p>
<A href='?src=\ref[src];arccheckout=1'>Yes.</A><BR>
<A href='?src=\ref[src];switchscreen=0'>No.</A><BR>"}
if(8)
dat += "<h3>NT Internal Archive</h3>"
if(!all_books || !all_books.len)
dat += "<font color=red><b>ERROR</b> Something has gone seriously wrong. Contact System Administrator for more information.</font>"
else
dat += {"<table>
<tr><td><A href='?src=\ref[src];sort=author>AUTHOR</A></td><td><A href='?src=\ref[src];sort=title>TITLE</A></td><td><A href='?src=\ref[src];sort=category>CATEGORY</A></td><td></td></tr>"}
for(var/name in all_books)
var/obj/item/weapon/book/masterbook = all_books[name]
var/id = masterbook.type
var/author = masterbook.author
var/title = masterbook.name
var/category = masterbook.libcategory
dat += "<tr><td>[author]</td><td>[title]</td><td>[category]</td><td><A href='?src=\ref[src];hardprint=[id]'>\[Order\]</A></td></tr>"
dat += "</table>"
dat += "<BR><A href='?src=\ref[src];switchscreen=0'>(Return to main menu)</A><BR>"
//dat += "<A HREF='?src=\ref[user];mach_close=library'>Close</A><br><br>"
user << browse(dat, "window=library")
@@ -293,6 +353,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
if("7")
screenstate = 7
if("8")
screenstate = 8
if(href_list["arccheckout"])
if(src.emagged)
src.arcanecheckout = 1
@@ -328,6 +390,8 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
var/newcategory = input("Choose a category: ") in list("Fiction", "Non-Fiction", "Adult", "Reference", "Religion")
if(newcategory)
upload_category = newcategory
//VOREStation Edit Start
if(href_list["upload"])
if(scanner)
if(scanner.cache)
@@ -356,6 +420,7 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
else
log_game("[usr.name]/[usr.key] has uploaded the book titled [scanner.cache.name], [length(scanner.cache.dat)] signs")
alert("Upload Complete.")
//VOREStation Edit End
if(href_list["targetid"])
var/sqlid = sanitizeSQL(href_list["targetid"])
@@ -392,6 +457,10 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
spawn() src.Topic(nhref, params2list(nhref), src)
if(href_list["sort"] in list("author", "title", "category"))
sortby = href_list["sort"]
if(href_list["hardprint"])
var/newpath = href_list["hardprint"]
var/obj/item/weapon/book/NewBook = new newpath(get_turf(src))
NewBook.name = "Book: [NewBook.name]"
src.add_fingerprint(usr)
src.updateUsrDialog()
return
+4 -1
View File
@@ -24,13 +24,14 @@
has the words 'Don't Panic' in small, friendly letters on the cover."
icon_state = "codex"
root_type = /datum/lore/codex/category/main_virgo_lore
libcategory = "Reference"
/obj/item/weapon/book/codex/lore/robutt
name = "A Buyer's Guide to Artificial Bodies"
desc = "Recommended reading for the newly cyborgified, new positronics, and the upwardly-mobile FBP."
icon_state = "codex_robutt"
root_type = /datum/lore/codex/category/main_robutts
libcategory = "Reference"
/obj/item/weapon/book/codex/lore/news
name = "Daedalus Pocket Newscaster"
@@ -38,6 +39,7 @@
icon_state = "newscodex"
w_class = ITEMSIZE_SMALL
root_type = /datum/lore/codex/category/main_news
libcategory = "Reference"
/* //VORESTATION REMOVAL
// Combines SOP/Regs/Law
@@ -48,4 +50,5 @@
icon_state = "corp_regs"
root_type = /datum/lore/codex/category/main_corp_regs
throwforce = 5 // Throw the book at 'em.
libcategory = "Reference"
*/
@@ -225,3 +225,14 @@
recipes += new/datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE)
/material/resin/generate_recipes()
recipes = list()
recipes += new/datum/stack_recipe("[display_name] door", /obj/structure/simple_door/resin, 10, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] barricade", /obj/effect/alien/resin/wall, 5, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] nest", /obj/structure/bed/nest, 2, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] wall girders", /obj/structure/girder/resin, 2, time = 5 SECONDS, one_per_turf = 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("crude [display_name] bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] net", /obj/item/weapon/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] membrane", /obj/effect/alien/resin/membrane, 1, time = 2 SECONDS, pass_stack_color = TRUE)
recipes += new/datum/stack_recipe("[display_name] node", /obj/effect/alien/weeds/node, 1, time = 4 SECONDS)
@@ -371,6 +371,15 @@
pass_color = TRUE
strict_color_stacking = TRUE
/obj/item/stack/material/resin
name = "resin"
icon_state = "sheet-resin"
default_type = "resin"
no_variants = TRUE
apply_colour = TRUE
pass_color = TRUE
strict_color_stacking = TRUE
/obj/item/stack/material/cardboard
name = "cardboard"
icon_state = "sheet-card"
+22
View File
@@ -16,6 +16,7 @@
stone
metal
solid
resin
ONLY WALLS
cult
hull
@@ -240,6 +241,10 @@ var/list/name_to_material
/material/proc/combustion_effect(var/turf/T, var/temperature)
return
// Used by walls to do on-touch things, after checking for crumbling and open-ability.
/material/proc/wall_touch_special(var/turf/simulated/wall/W, var/mob/living/L)
return
// Datum definitions follow.
/material/uranium
name = "uranium"
@@ -824,12 +829,18 @@ var/list/name_to_material
/material/resin
name = "resin"
icon_colour = "#35343a"
icon_base = "resin"
dooropen_noise = 'sound/effects/attackblob.ogg'
door_icon_base = "resin"
icon_reinf = "reinf_mesh"
melting_point = T0C+300
sheet_singular_name = "blob"
sheet_plural_name = "blobs"
conductive = 0
explosion_resistance = 60
radiation_resistance = 10
stack_origin_tech = list(TECH_MATERIAL = 8, TECH_PHORON = 4, TECH_BLUESPACE = 4, TECH_BIO = 7)
stack_type = /obj/item/stack/material/resin
/material/resin/can_open_material_door(var/mob/living/user)
var/mob/living/carbon/M = user
@@ -837,6 +848,17 @@ var/list/name_to_material
return 1
return 0
/material/resin/wall_touch_special(var/turf/simulated/wall/W, var/mob/living/L)
var/mob/living/carbon/M = L
if(istype(M) && locate(/obj/item/organ/internal/xenos/hivenode) in M.internal_organs)
to_chat(M, "<span class='alien'>\The [W] shudders under your touch, starting to become porous.</span>")
playsound(W, 'sound/effects/attackblob.ogg', 50, 1)
if(do_after(L, 5 SECONDS))
spawn(2)
playsound(W, 'sound/effects/attackblob.ogg', 100, 1)
W.dismantle_wall()
return 1
return 0
/material/wood
name = MAT_WOOD
+31 -31
View File
@@ -231,7 +231,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Re-enter Corpse"
if(!client) return
if(!(mind && mind.current && can_reenter_corpse))
src << "<span class='warning'>You have no body.</span>"
to_chat(src, "<span class='warning'>You have no body.</span>")
return
if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients
usr << "<span class='warning'>Another consciousness is in your body... it is resisting you.</span>"
@@ -279,10 +279,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set desc = "Toggles AntagHUD allowing you to see who is the antagonist"
if(!config.antag_hud_allowed && !client.holder)
src << "<font color='red'>Admins have disabled this for this round.</font>"
to_chat(src, "<font color='red'>Admins have disabled this for this round.</font>")
return
if(jobban_isbanned(src, "AntagHUD"))
src << "<font color='red'><B>You have been banned from using this feature</B></font>"
to_chat(src, "<font color='red'><B>You have been banned from using this feature</B></font>")
return
if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder)
var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No")
@@ -329,7 +329,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(following && following == target)
return
following = target
src << "<span class='notice'>Now following [target]</span>"
to_chat(src, "<span class='notice'>Now following [target]</span>")
if(ismob(target))
forceMove(get_turf(target))
var/mob/M = target
@@ -406,7 +406,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
forceMove(T)
following = null
else
src << "This mob is not located in the game world."
to_chat(src, "This mob is not located in the game world.")
/*
/mob/observer/dead/verb/boo()
set category = "Ghost"
@@ -425,11 +425,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
/mob/observer/dead/memory()
set hidden = 1
src << "<font color='red'>You are dead! You have no mind to store memory!</font>"
to_chat(src, "<font color='red'>You are dead! You have no mind to store memory!</font>")
/mob/observer/dead/add_memory()
set hidden = 1
src << "<font color='red'>You are dead! You have no mind to store memory!</font>"
to_chat(src, "<font color='red'>You are dead! You have no mind to store memory!</font>")
/mob/observer/dead/Post_Incorpmove()
following = null
@@ -449,16 +449,16 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/pressure = environment.return_pressure()
var/total_moles = environment.total_moles
src << "<font color='blue'><B>Results:</B></font>"
to_chat(src, "<font color='blue'><B>Results:</B></font>")
if(abs(pressure - ONE_ATMOSPHERE) < 10)
src << "<font color='blue'>Pressure: [round(pressure,0.1)] kPa</font>"
to_chat(src, "<font color='blue'>Pressure: [round(pressure,0.1)] kPa</font>")
else
src << "<font color='red'>Pressure: [round(pressure,0.1)] kPa</font>"
to_chat(src, "<font color='red'>Pressure: [round(pressure,0.1)] kPa</font>")
if(total_moles)
for(var/g in environment.gas)
src << "<font color='blue'>[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)</font>"
src << "<font color='blue'>Temperature: [round(environment.temperature-T0C,0.1)]&deg;C ([round(environment.temperature,0.1)]K)</font>"
src << "<font color='blue'>Heat Capacity: [round(environment.heat_capacity(),0.1)]</font>"
to_chat(src, "<font color='blue'>[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)</font>")
to_chat(src, "<font color='blue'>Temperature: [round(environment.temperature-T0C,0.1)]&deg;C ([round(environment.temperature,0.1)]K)</font>")
to_chat(src, "<font color='blue'>Heat Capacity: [round(environment.heat_capacity(),0.1)]</font>")
/mob/observer/dead/verb/check_radiation()
set name = "Check Radiation"
@@ -475,7 +475,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set category = "Ghost"
if(config.disable_player_mice)
src << "<span class='warning'>Spawning as a mouse is currently disabled.</span>"
to_chat(src, "<span class='warning'>Spawning as a mouse is currently disabled.</span>")
return
if(!MayRespawn(1))
@@ -483,14 +483,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/turf/T = get_turf(src)
if(!T || (T.z in using_map.admin_levels))
src << "<span class='warning'>You may not spawn as a mouse on this Z-level.</span>"
to_chat(src, "<span class='warning'>You may not spawn as a mouse on this Z-level.</span>")
return
var/timedifference = world.time - client.time_died_as_mouse
if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600)
var/timedifference_text
timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss")
src << "<span class='warning'>You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.</span>"
to_chat(src, "<span class='warning'>You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.</span>")
return
var/response = alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?","Squeek!","Nope!")
@@ -508,7 +508,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
vent_found = pick(found_vents)
host = new /mob/living/simple_mob/animal/passive/mouse(vent_found)
else
src << "<span class='warning'>Unable to find any unwelded vents to spawn mice at.</span>"
to_chat(src, "<span class='warning'>Unable to find any unwelded vents to spawn mice at.</span>")
if(host)
if(config.uneducated_mice)
@@ -545,7 +545,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC."
if(!(config.cult_ghostwriter))
src << "<font color='red'>That verb is not currently permitted.</font>"
to_chat(src, "<font color='red'>That verb is not currently permitted.</font>")
return
if (!src.stat)
@@ -560,7 +560,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
ghosts_can_write = 1
if(!ghosts_can_write && !check_rights(R_ADMIN, 0)) //Let's allow for admins to write in blood for events and the such.
src << "<font color='red'>The veil is not thin enough for you to do that.</font>"
to_chat(src, "<font color='red'>The veil is not thin enough for you to do that.</font>")
return
var/list/choices = list()
@@ -569,7 +569,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
choices += B
if(!choices.len)
src << "<span class = 'warning'>There is no blood to use nearby.</span>"
to_chat(src, "<span class = 'warning'>There is no blood to use nearby.</span>")
return
var/obj/effect/decal/cleanable/blood/choice = input(src,"What blood would you like to use?") in null|choices
@@ -580,7 +580,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
T = get_step(T,text2dir(direction))
if (!istype(T))
src << "<span class='warning'>You cannot doodle there.</span>"
to_chat(src, "<span class='warning'>You cannot doodle there.</span>")
return
if(!choice || choice.amount == 0 || !(src.Adjacent(choice)))
@@ -592,7 +592,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
for (var/obj/effect/decal/cleanable/blood/writing/W in T)
num_doodles++
if (num_doodles > 4)
src << "<span class='warning'>There is no space to write on!</span>"
to_chat(src, "<span class='warning'>There is no space to write on!</span>")
return
var/max_length = 50
@@ -603,7 +603,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if (length(message) > max_length)
message += "-"
src << "<span class='warning'>You ran out of blood to write with!</span>"
to_chat(src, "<span class='warning'>You ran out of blood to write with!</span>")
var/obj/effect/decal/cleanable/blood/writing/W = new(T)
W.basecolor = doodle_color
@@ -657,14 +657,14 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/toggled_invisible
if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600)
src << "You must gather strength before you can turn visible again..."
to_chat(src, "You must gather strength before you can turn visible again...")
return
if(plane == PLANE_WORLD)
toggled_invisible = world.time
visible_message("<span class='emote'>It fades from sight...</span>", "<span class='info'>You are now invisible.</span>")
else
src << "<span class='info'>You are now visible!</span>"
to_chat(src, "<span class='info'>You are now visible!</span>")
plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS
invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER
@@ -679,9 +679,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
src.anonsay = !src.anonsay
if(anonsay)
src << "<span class='info'>Your key won't be shown when you speak in dead chat.</span>"
to_chat(src, "<span class='info'>Your key won't be shown when you speak in dead chat.</span>")
else
src << "<span class='info'>Your key will be publicly visible again.</span>"
to_chat(src, "<span class='info'>Your key will be publicly visible again.</span>")
/mob/observer/dead/canface()
return 1
@@ -714,11 +714,11 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
return 0
if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse)
if(feedback)
src << "<span class='warning'>Your non-dead body prevent you from respawning.</span>"
to_chat(src, "<span class='warning'>Your non-dead body prevent you from respawning.</span>")
return 0
if(config.antag_hud_restricted && has_enabled_antagHUD == 1)
if(feedback)
src << "<span class='warning'>antagHUD restrictions prevent you from respawning.</span>"
to_chat(src, "<span class='warning'>antagHUD restrictions prevent you from respawning.</span>")
return 0
return 1
@@ -755,12 +755,12 @@ mob/observer/dead/MayRespawn(var/feedback = 0)
if(msg)
log_say("(SPECWHISP to [key_name(M)]): [msg]", src)
M << "<span class='warning'> You hear a strange, unidentifiable voice in your head... <font color='purple'>[msg]</font></span>"
src << "<span class='warning'> You said: '[msg]' to [M].</span>"
to_chat(src, "<span class='warning'> You said: '[msg]' to [M].</span>")
else
return
return 1
else
src << "<span class='danger'>You have not been pulled past the veil!</span>"
to_chat(src, "<span class='danger'>You have not been pulled past the veil!</span>")
/mob/observer/dead/verb/choose_ghost_sprite()
set category = "Ghost"
+2 -2
View File
@@ -10,7 +10,7 @@
if(message)
client.handle_spam_prevention(MUTE_DEADCHAT)
if(src.client.prefs.muted & MUTE_DEADCHAT)
src << "<font color='red'>You cannot talk in deadchat (muted).</font>"
to_chat(src, "<font color='red'>You cannot talk in deadchat (muted).</font>")
return
. = src.say_dead(message)
@@ -31,7 +31,7 @@
if(message)
client.handle_spam_prevention(MUTE_DEADCHAT)
if(src.client.prefs.muted & MUTE_DEADCHAT)
src << "<font color='red'>You cannot emote in deadchat (muted).</font>"
to_chat(src, "<font color='red'>You cannot emote in deadchat (muted).</font>")
return
. = src.emote_dead(message)
+4 -4
View File
@@ -3,7 +3,7 @@
//m_type == 2 --> audible
/mob/proc/custom_emote(var/m_type=1,var/message = null,var/range=world.view)
if(stat || !use_me && usr == src)
src << "You are unable to emote."
to_chat(src, "You are unable to emote.")
return
var/muzzled = is_muzzled()
@@ -62,16 +62,16 @@
/mob/proc/emote_dead(var/message)
if(client.prefs.muted & MUTE_DEADCHAT)
src << "<span class='danger'>You cannot send deadchat emotes (muted).</span>"
to_chat(src, "<span class='danger'>You cannot send deadchat emotes (muted).</span>")
return
if(!is_preference_enabled(/datum/client_preference/show_dsay))
src << "<span class='danger'>You have deadchat muted.</span>"
to_chat(src, "<span class='danger'>You have deadchat muted.</span>")
return
if(!src.client.holder)
if(!config.dsay_allowed)
src << "<span class='danger'>Deadchat is globally muted.</span>"
to_chat(src, "<span class='danger'>Deadchat is globally muted.</span>")
return
+3 -3
View File
@@ -60,9 +60,9 @@
if(is_deaf())
if(!language || !(language.flags & INNATE)) // INNATE is the flag for audible-emote-language, so we don't want to show an "x talks but you cannot hear them" message if it's set
if(speaker == src)
src << "<span class='warning'>You cannot hear yourself speak!</span>"
to_chat(src, "<span class='warning'>You cannot hear yourself speak!</span>")
else
src << "<span class='name'>[speaker_name]</span>[alt_name] talks but you cannot hear."
to_chat(src, "<span class='name'>[speaker_name]</span>[alt_name] talks but you cannot hear.")
else
var/message_to_send = null
if(language)
@@ -251,7 +251,7 @@
if((sdisabilities & DEAF) || ear_deaf)
if(prob(20))
src << "<span class='warning'>You feel your headset vibrate but can hear nothing from it!</span>"
to_chat(src, "<span class='warning'>You feel your headset vibrate but can hear nothing from it!</span>")
else
on_hear_radio(part_a, speaker_name, track, part_b, formatted)
+2 -2
View File
@@ -156,11 +156,11 @@ var/list/holder_mob_icon_cache = list()
if(self_grab)
grabber << "<span class='notice'>\The [src] clambers onto you!</span>"
src << "<span class='notice'>You climb up onto \the [grabber]!</span>"
to_chat(src, "<span class='notice'>You climb up onto \the [grabber]!</span>")
grabber.equip_to_slot_if_possible(H, slot_back, 0, 1)
else
grabber << "<span class='notice'>You scoop up \the [src]!</span>"
src << "<span class='notice'>\The [grabber] scoops you up!</span>"
to_chat(src, "<span class='notice'>\The [grabber] scoops you up!</span>")
H.sync(src)
return H
+1 -1
View File
@@ -56,7 +56,7 @@ var/list/slot_equipment_priority = list( \
else
if(!disable_warning)
src << "<font color='red'>You are unable to equip that.</font>" //Only print if del_on_fail is false
to_chat(src, "<font color='red'>You are unable to equip that.</font>") //Only print if del_on_fail is false
return 0
equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail.
+2 -2
View File
@@ -144,9 +144,9 @@
/mob/observer/dead/hear_broadcast(var/datum/language/language, var/mob/speaker, var/speaker_name, var/message)
if(speaker.name == speaker_name || antagHUD)
src << "<i><span class='game say'>[language.name], <span class='name'>[speaker_name]</span> ([ghost_follow_link(speaker, src)]) [message]</span></i>"
to_chat(src, "<i><span class='game say'>[language.name], <span class='name'>[speaker_name]</span> ([ghost_follow_link(speaker, src)]) [message]</span></i>")
else
src << "<i><span class='game say'>[language.name], <span class='name'>[speaker_name]</span> [message]</span></i>"
to_chat(src, "<i><span class='game say'>[language.name], <span class='name'>[speaker_name]</span> [message]</span></i>")
/datum/language/proc/check_special_condition(var/mob/other)
return 1
+20 -9
View File
@@ -69,7 +69,7 @@
colour = "enochian" //So fancy
key = "i"
syllables = list("salve","sum","loqui","operatur","iusta","et","permittit","facere","effercio","pluribus","enim","hoc",
"mihi","wan","six","salve","tartu")
"mihi","wan","six","tartu")
machine_understands = FALSE
/datum/language/tajsign
@@ -81,17 +81,28 @@
flags = SIGNLANG | NO_STUTTER | NONVERBAL // | WHITELISTED (YWEdit)
/datum/language/bug
name = LANGUAGE_VESPINAE
desc = "A jarring and clicky language developed and used by Vasilissans, it is designed for use with mouthparts and as a result has become a common language for various arthropod species."
speech_verb = "clicks"
ask_verb = "chitters"
exclaim_verb = "rasps"
colour = "bug"
key = "x"
syllables = list("vaur","uyek","uyit","avek","sc'theth","k'ztak","teth","wre'ge","lii","dra'","zo'","ra'","kax'","zz","vh","ik","ak",
name = LANGUAGE_VESPINAE
desc = "A jarring and clicky language developed and used by Vasilissans, it is designed for use with mouthparts and as a result has become a common language for various arthropod species."
speech_verb = "clicks"
ask_verb = "chitters"
exclaim_verb = "rasps"
colour = "bug"
key = "x"
syllables = list("vaur","uyek","uyit","avek","sc'theth","k'ztak","teth","wre'ge","lii","dra'","zo'","ra'","kax'","zz","vh","ik","ak",
"uhk","zir","sc'orth","sc'er","thc'yek","th'zirk","th'esk","k'ayek","ka'mil","sc'","ik'yir","yol","kig","k'zit","'","'","zrk","krg","isk'yet","na'k",
"sc'azz","th'sc","nil","n'ahk","sc'yeth","aur'sk","iy'it","azzg","a'","i'","o'","u'","a","i","o","u","zz","kr","ak","nrk","tzzk","bz","xic'","k'lax'","histh")
/datum/language/shadekin
name = LANGUAGE_SHADEKIN
desc = "Shadekin seem to always know what the others are thinking. This is probably why."
speech_verb = "mars"
ask_verb = "mars"
exclaim_verb = "mars"
colour = "changeling"
key = "m"
machine_understands = FALSE
flags = WHITELISTED | HIVEMIND
/datum/language/human/slavic
name = LANGUAGE_SLAVIC
desc = "The official language of the Independent Colonial Confederation of Gilgamesh, originally established in 2122 by the short-lived United Slavic Confederation on Earth."
+4 -4
View File
@@ -25,15 +25,15 @@
autohiss_mode = (autohiss_mode + 1) % AUTOHISS_NUM
switch(autohiss_mode)
if(AUTOHISS_OFF)
src << "Auto-hiss is now OFF."
to_chat(src, "Auto-hiss is now OFF.")
if(AUTOHISS_BASIC)
src << "Auto-hiss is now BASIC."
to_chat(src, "Auto-hiss is now BASIC.")
if(AUTOHISS_FULL)
src << "Auto-hiss is now FULL."
to_chat(src, "Auto-hiss is now FULL.")
else
soft_assert(0, "invalid autohiss value [autohiss_mode]")
autohiss_mode = AUTOHISS_OFF
src << "Auto-hiss is now OFF."
to_chat(src, "Auto-hiss is now OFF.")
/datum/species
var/list/autohiss_basic_map = null
@@ -25,15 +25,15 @@
var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices
if(!M)
src << "There is nothing nearby to merge with."
to_chat(src, "There is nothing nearby to merge with.")
else if(!do_merge(M))
src << "You fail to merge with \the [M]..."
to_chat(src, "You fail to merge with \the [M]...")
/mob/living/carbon/alien/diona/proc/do_merge(var/mob/living/carbon/human/H)
if(!istype(H) || !src || !(src.Adjacent(H)))
return 0
H << "You feel your being twine with that of \the [src] as it merges with your biomass."
src << "You feel your being twine with that of \the [H] as you merge with its biomass."
to_chat(src, "You feel your being twine with that of \the [H] as you merge with its biomass.")
loc = H
verbs += /mob/living/carbon/alien/diona/proc/split
verbs -= /mob/living/carbon/alien/diona/proc/merge
@@ -53,7 +53,7 @@
return
src.loc << "You feel a pang of loss as [src] splits away from your biomass."
src << "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground."
to_chat(src, "You wiggle out of the depths of [src.loc]'s biomass and plop to the ground.")
var/mob/living/M = src.loc
@@ -5,7 +5,7 @@
return null
if(amount_grown < max_grown)
src << "You are not yet ready for your growth..."
to_chat(src, "You are not yet ready for your growth...")
return null
src.split()
@@ -16,7 +16,7 @@
return
if (src.client)
if (client.prefs.muted & MUTE_IC)
src << "<font color='red'>You cannot send IC messages (muted).</font>"
to_chat(src, "<font color='red'>You cannot send IC messages (muted).</font>")
return
if (stat)
return
@@ -115,7 +115,7 @@
playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0)
m_type = 2
if("help")
src << "burp, chirp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper"
to_chat(src, "burp, chirp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper")
else
src << text("Invalid Emote: []", act)
if ((message && src.stat == 0))
@@ -1,10 +1,10 @@
/mob/living/carbon/alien/larva/confirm_evolution()
src << "<span class='notice'><b>You are growing into a beautiful alien! It is time to choose a caste.</b></span>"
src << "<span class='notice'>There are three to choose from:</span>"
src << "<B>Hunters</B> <span class='notice'> are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.</span>"
src << "<B>Sentinels</B> <span class='notice'> are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.</span>"
src << "<B>Drones</B> <span class='notice'> are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen.</span>"
to_chat(src, "<span class='notice'><b>You are growing into a beautiful alien! It is time to choose a caste.</b></span>")
to_chat(src, "<span class='notice'>There are three to choose from:</span>")
to_chat(src, "<B>Hunters</B> <span class='notice'> are strong and agile, able to hunt away from the hive and rapidly move through ventilation shafts. Hunters generate plasma slowly and have low reserves.</span>")
to_chat(src, "<B>Sentinels</B> <span class='notice'> are tasked with protecting the hive and are deadly up close and at a range. They are not as physically imposing nor fast as the hunters.</span>")
to_chat(src, "<B>Drones</B> <span class='notice'> are the working class, offering the largest plasma storage and generation. They are the only caste which may evolve again, turning into the dreaded alien queen.</span>")
var/alien_caste = alert(src, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
return alien_caste ? "Xenomorph [alien_caste]" : null
+1 -1
View File
@@ -150,7 +150,7 @@
adjustFireLoss((environment.temperature - (T0C+66))/5) // Might be too high, check in testing.
if (fire) fire.icon_state = "fire2"
if(prob(20))
src << "<font color='red'>You feel a searing heat!</font>"
to_chat(src, "<font color='red'>You feel a searing heat!</font>")
else
if (fire) fire.icon_state = "fire0"
@@ -12,11 +12,11 @@
return
if(handcuffed || legcuffed)
src << "<font color='red'>You cannot evolve when you are cuffed.</font>"
to_chat(src, "<font color='red'>You cannot evolve when you are cuffed.</font>")
return
if(amount_grown < max_grown)
src << "<font color='red'>You are not fully grown.</font>"
to_chat(src, "<font color='red'>You are not fully grown.</font>")
return
// confirm_evolution() handles choices and other specific requirements.
+1 -1
View File
@@ -4,7 +4,7 @@
if(client)
if(client.prefs.muted & MUTE_IC)
src << "<font color='red'>You cannot speak in IC (Muted).</font>"
to_chat(src, "<font color='red'>You cannot speak in IC (Muted).</font>")
return
message = sanitize(message)
@@ -17,7 +17,7 @@
return
if (src.client)
if (client.prefs.muted & MUTE_IC)
src << "<font color='red'>You cannot send IC messages (muted).</font>"
to_chat(src, "<font color='red'>You cannot send IC messages (muted).</font>")
return
if (stat)
return
@@ -28,15 +28,15 @@
if ("custom")
return custom_emote(m_type, message)
if ("alarm")
src << "You sound an alarm."
to_chat(src, "You sound an alarm.")
message = "<B>[src]</B> sounds an alarm."
m_type = 2
if ("alert")
src << "You let out a distressed noise."
to_chat(src, "You let out a distressed noise.")
message = "<B>[src]</B> lets out a distressed noise."
m_type = 2
if ("notice")
src << "You play a loud tone."
to_chat(src, "You play a loud tone.")
message = "<B>[src]</B> plays a loud tone."
m_type = 2
if ("flash")
@@ -46,21 +46,21 @@
message = "<B>[src]</B> blinks."
m_type = 1
if ("whistle")
src << "You whistle."
to_chat(src, "You whistle.")
message = "<B>[src]</B> whistles."
m_type = 2
if ("beep")
src << "You beep."
to_chat(src, "You beep.")
message = "<B>[src]</B> beeps."
m_type = 2
if ("boop")
src << "You boop."
to_chat(src, "You boop.")
message = "<B>[src]</B> boops."
m_type = 2
if ("help")
src << "alarm,alert,notice,flash,blink,whistle,beep,boop"
to_chat(src, "alarm,alert,notice,flash,blink,whistle,beep,boop")
else
src << "<font color='blue'>Unusable emote '[act]'. Say *help for a list.</font>"
to_chat(src, "<font color='blue'>Unusable emote '[act]'. Say *help for a list.</font>")
if (message)
log_emote(message, src)
+8 -8
View File
@@ -6,9 +6,9 @@
if (radiation > 100)
radiation = 100
if(!container)//If it's not in an MMI
src << "<font color='red'>You feel weak.</font>"
to_chat(src, "<font color='red'>You feel weak.</font>")
else//Fluff-wise, since the brain can't detect anything itself, the MMI handles thing like that
src << "<font color='red'>STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED.</font>"
to_chat(src, "<font color='red'>STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED.</font>")
switch(radiation)
if(1 to 49)
@@ -23,9 +23,9 @@
if(prob(5))
radiation -= 5
if(!container)
src << "<font color='red'>You feel weak.</font>"
to_chat(src, "<font color='red'>You feel weak.</font>")
else
src << "<font color='red'>STATUS: DANGEROUS LEVELS OF RADIATION DETECTED.</font>"
to_chat(src, "<font color='red'>STATUS: DANGEROUS LEVELS OF RADIATION DETECTED.</font>")
updatehealth()
if(75 to 100)
@@ -115,7 +115,7 @@
silent = 1
if(!alert)//Sounds an alarm, but only once per 'level'
emote("alarm")
src << "<font color='red'>Major electrical distruption detected: System rebooting.</font>"
to_chat(src, "<font color='red'>Major electrical distruption detected: System rebooting.</font>")
alert = 1
if(prob(75))
emp_damage -= 1
@@ -131,7 +131,7 @@
ear_damage = 1
if(!alert)
emote("alert")
src << "<font color='red'>Primary systems are now online.</font>"
to_chat(src, "<font color='red'>Primary systems are now online.</font>")
alert = 1
if(prob(50))
emp_damage -= 1
@@ -143,13 +143,13 @@
if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere)
if(!alert)
emote("notice")
src << "<font color='red'>System reboot nearly complete.</font>"
to_chat(src, "<font color='red'>System reboot nearly complete.</font>")
alert = 1
if(prob(25))
emp_damage -= 1
if(1)
alert = 0
src << "<font color='red'>All systems restored.</font>"
to_chat(src, "<font color='red'>All systems restored.</font>")
emp_damage -= 1
return 1
+1 -1
View File
@@ -42,5 +42,5 @@
message_mode = null
return R.radio.talk_into(src,message,message_mode,verb,speaking)
else
src << "<span class='danger'>Your radio is disabled.</span>"
to_chat(src, "<span class='danger'>Your radio is disabled.</span>")
return 0
+1 -1
View File
@@ -362,7 +362,7 @@
if(buckled)
return 0
stop_pulling()
src << "<span class='warning'>You slipped on [slipped_on]!</span>"
to_chat(src, "<span class='warning'>You slipped on [slipped_on]!</span>")
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
Weaken(FLOOR(stun_duration/2, 1))
return 1
@@ -8,7 +8,7 @@
var/mob/living/simple_mob/animal/borer/B = has_brain_worms()
if(B && B.host_brain)
src << "<span class='danger'>You withdraw your probosci, releasing control of [B.host_brain]</span>"
to_chat(src, "<span class='danger'>You withdraw your probosci, releasing control of [B.host_brain]</span>")
B.detatch()
@@ -17,7 +17,7 @@
verbs -= /mob/living/carbon/proc/spawn_larvae
else
src << "<span class='danger'>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</span>"
to_chat(src, "<span class='danger'>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</span>")
//Brain slug proc for tormenting the host.
/mob/living/carbon/proc/punish_host()
@@ -31,10 +31,10 @@
return
if(B.host_brain.ckey)
src << "<span class='danger'>You send a punishing spike of psychic agony lancing into your host's brain.</span>"
to_chat(src, "<span class='danger'>You send a punishing spike of psychic agony lancing into your host's brain.</span>")
if (!can_feel_pain())
B.host_brain << "<span class='warning'>You feel a strange sensation as a foreign influence prods your mind.</span>"
src << "<span class='danger'>It doesn't seem to be as effective as you hoped.</span>"
to_chat(src, "<span class='danger'>It doesn't seem to be as effective as you hoped.</span>")
else
B.host_brain << "<span class='danger'><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></span>"
@@ -49,7 +49,7 @@
return
if(B.chemicals >= 100)
src << "<span class='danger'>Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.</span>"
to_chat(src, "<span class='danger'>Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.</span>")
visible_message("<span class='danger'>\The [src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</span>")
B.chemicals -= 100
B.has_reproduced = 1
@@ -58,5 +58,5 @@
new /mob/living/simple_mob/animal/borer(get_turf(src))
else
src << "<span class='warning'>You do not have enough chemicals stored to reproduce.</span>"
to_chat(src, "<span class='warning'>You do not have enough chemicals stored to reproduce.</span>")
return
+4 -4
View File
@@ -12,7 +12,7 @@
if(!I)
I = src.get_inactive_hand()
if(!I)
src << "<span class='warning'>You don't have anything in your hands to give to \the [target].</span>"
to_chat(src, "<span class='warning'>You don't have anything in your hands to give to \the [target].</span>")
return
if(alert(target,"[src] wants to give you \a [I]. Will you accept it?","Item Offer","Yes","No") == "No") //VOREStation Edit - make yes on the left to be consistent with other dialogs
@@ -23,18 +23,18 @@
if(!I) return
if(!Adjacent(target))
src << "<span class='warning'>You need to stay in reaching distance while giving an object.</span>"
to_chat(src, "<span class='warning'>You need to stay in reaching distance while giving an object.</span>")
target << "<span class='warning'>\The [src] moved too far away.</span>"
return
if(I.loc != src || !src.item_is_in_hands(I))
src << "<span class='warning'>You need to keep the item in your hands.</span>"
to_chat(src, "<span class='warning'>You need to keep the item in your hands.</span>")
target << "<span class='warning'>\The [src] seems to have given up on passing \the [I] to you.</span>"
return
if(target.hands_are_full())
target << "<span class='warning'>Your hands are full.</span>"
src << "<span class='warning'>Their hands are full.</span>"
to_chat(src, "<span class='warning'>Their hands are full.</span>")
return
if(src.unEquip(I))
@@ -33,7 +33,7 @@
if("ping", "beep", "buzz", "yes", "ye", "no", "rcough", "rsneeze")
if(!isSynthetic())
src << "<span class='warning'>You are not a synthetic.</span>"
to_chat(src, "<span class='warning'>You are not a synthetic.</span>")
return
var/M = null
@@ -83,7 +83,7 @@
if("squish")
/* VOREStation Removal Start - Eh. People can squish maybe.
if(species.bump_flag != SLIME) //This should definitely do it.
src << "<span class='warning'>You are not a slime thing!</span>"
to_chat(src, "<span class='warning'>You are not a slime thing!</span>")
return
*/ //VOREStation Removal End
playsound(src.loc, 'sound/effects/slime_squish.ogg', 50, 0) //Credit to DrMinky (freesound.org) for the sound.
@@ -139,7 +139,7 @@
if (src.client)
if (client.prefs.muted & MUTE_IC)
src << "<font color='red'>You cannot send IC messages (muted).</font>"
to_chat(src, "<font color='red'>You cannot send IC messages (muted).</font>")
return
if (stat)
return
@@ -721,7 +721,7 @@
if("vomit")
if(isSynthetic())
src << "<span class='warning'>You are unable to vomit.</span>"
to_chat(src, "<span class='warning'>You are unable to vomit.</span>")
return
vomit()
return
@@ -741,13 +741,13 @@
message = "makes a light spitting noise, a poor attempt at a whistle."
if ("help") //Adds YAWN EMOTES - Cross/Chirp
src << "blink, blink_r, blush, bow-(none)/mob, burp, chirp, choke, chuckle, clap, collapse, cough, cross, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag, \
to_chat(src, "blink, blink_r, blush, bow-(none)/mob, burp, choke, chirp, chuckle, clap, collapse, cough, cross, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag, \
frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, \
raise, salute, scream, sneeze, shake, shiver, shrug, sigh, signal-#1-10, slap-(none)/mob, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, sway/wag, swish, tremble, twitch, \
twitch_v, vomit, whimper, wink, yawn. Synthetics: beep, buzz, yes, no, rcough, rsneeze, ping"
twitch_v, vomit, whimper, wink, yawn. Synthetics: beep, buzz, yes, no, rcough, rsneeze, ping")
else
src << "<font color='blue'>Unusable emote '[act]'. Say *help for a list.</font>"
to_chat(src, "<font color='blue'>Unusable emote '[act]'. Say *help for a list.</font>")
if (message)
custom_emote(m_type,message)
@@ -1,4 +1,11 @@
/mob
var/nextemote = 1
/mob/living/carbon/human/proc/handle_emote_vr(var/act,var/m_type=1,var/message = null)
//Reduces emote spamming
if(src.nextemote >= world.time)// || user.stat != CONSCIOUS
return 1
src.nextemote = world.time + 12
switch(act)
if ("vwag")
@@ -17,8 +24,37 @@
message = "mlems [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] tongue up over [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] nose. Mlem."
m_type = 1
if ("awoo")
message = "awoos loudly. AwoooOOOOoooo!"
m_type = 2
message = "lets out an awoo."
playsound(loc, 'sound/voice/awoo.ogg', 50, 1, -1)
if ("nya")
message = "lets out a nya."
m_type = 2
playsound(loc, 'sound/voice/nya.ogg', 50, 1, -1)
if ("peep")
message = "peeps like a bird."
m_type = 2
playsound(loc, 'sound/voice/peep.ogg', 50, 1, -1)
if("chirp")
message = "chirps!"
playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0)
m_type = 2
if ("weh")
message = "lets out a weh."
m_type = 2
playsound(loc, 'sound/voice/weh.ogg', 50, 1, -1)
if ("merp")
message = "lets out a merp."
m_type = 2
playsound(loc, 'sound/voice/merp.ogg', 50, 1, -1)
if ("bark")
message = "lets out a bark."
m_type = 2
playsound(loc, 'sound/voice/bark2.ogg', 50, 1, -1)
if ("his")
message = "lets out a hiss."
m_type = 2
playsound(loc, 'sound/voice/hiss.ogg', 50, 1, -1)
if ("nsay")
nsay()
return TRUE
@@ -30,45 +66,16 @@
playsound(src.loc, 'sound/misc/nymphchirp.ogg', 50, 0)
m_type = 2 //End of Yawn Addtion
if ("flip")
var/danger = 1 //Base 1% chance to break something.
var/list/involved_parts = list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)
for(var/organ_name in involved_parts)
var/obj/item/organ/external/E = get_organ(organ_name)
if(!E || E.is_stump() || E.splinted || (E.status & ORGAN_BROKEN))
involved_parts -= organ_name
danger += 5 //Add 5% to the chance for each problem limb
//Taurs are harder to flip
if(istype(tail_style, /datum/sprite_accessory/tail/taur))
danger += 1
//Check if they are physically capable
if(src.sleeping || src.resting || src.buckled || src.weakened || src.restrained() || involved_parts.len < 2)
src << "<span class='warning'>You can't *flip in your current state!</span>"
to_chat(src, "<span class='warning'>You can't *flip in your current state!</span>")
return 1
else
src.SpinAnimation(7,1)
message = "does a flip!"
m_type = 1
if(prob(danger))
spawn(10) //Stick the landing.
var/breaking = pick(involved_parts)
var/obj/item/organ/external/E = get_organ(breaking)
if(isSynthetic())
src.Weaken(5)
E.droplimb(1,DROPLIMB_EDGE)
message += " <span class='danger'>And loses a limb!</span>"
log_and_message_admins("lost their [breaking] with *flip, ahahah.", src)
else
src.Weaken(5)
if(E.cannot_break) //Prometheans go splat
E.droplimb(0,DROPLIMB_BLUNT)
else
E.fracture()
message += " <span class='danger'>And breaks something!</span>"
log_and_message_admins("broke their [breaking] with *flip, ahahah.", src)
if (message)
custom_emote(m_type,message)
return 1
@@ -78,7 +85,7 @@
/mob/living/carbon/human/proc/toggle_tail_vr(var/setting,var/message = 0)
if(!tail_style || !tail_style.ani_state)
if(message)
src << "<span class='warning'>You don't have a tail that supports this.</span>"
to_chat(src, "<span class='warning'>You don't have a tail that supports this.</span>")
return 0
var/new_wagging = isnull(setting) ? !wagging : setting
@@ -90,7 +97,7 @@
/mob/living/carbon/human/proc/toggle_wing_vr(var/setting,var/message = 0)
if(!wing_style || !wing_style.ani_state)
if(message)
src << "<span class='warning'>You don't have a tail that supports this.</span>"
to_chat(src, "<span class='warning'>You don't have a tail that supports this.</span>")
return 0
var/new_flapping = isnull(setting) ? !flapping : setting
+22 -13
View File
@@ -243,6 +243,12 @@
// this handles mulebots and vehicles
// and now mobs on fire
/mob/living/carbon/human/Crossed(var/atom/movable/AM)
//VOREStation Edit begin: SHADEKIN
var/mob/SK = AM
if(istype(SK))
if(SK.shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(istype(AM, /mob/living/bot/mulebot))
var/mob/living/bot/mulebot/MB = AM
MB.runOver(src)
@@ -709,13 +715,13 @@
/mob/living/carbon/human/IsAdvancedToolUser(var/silent)
// VOREstation start
if(feral)
src << "<span class='warning'>Your primitive mind can't grasp the concept of that thing.</span>"
to_chat(src, "<span class='warning'>Your primitive mind can't grasp the concept of that thing.</span>")
return 0
// VOREstation end
if(species.has_fine_manipulation)
return 1
if(!silent)
src << "<span class='warning'>You don't have the dexterity to use that!</span>"
to_chat(src, "<span class='warning'>You don't have the dexterity to use that!</span>")
return 0
/mob/living/carbon/human/abiotic(var/full_body = 0)
@@ -1057,7 +1063,7 @@
if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad.
// All kinds of embedded objects cause bleeding.
if(!can_feel_pain(organ.organ_tag))
src << "<span class='warning'>You feel [O] moving inside your [organ.name].</span>"
to_chat(src, "<span class='warning'>You feel [O] moving inside your [organ.name].</span>")
else
var/msg = pick( \
"<span class='warning'>A spike of pain jolts your [organ.name] as you bump [O] inside.</span>", \
@@ -1223,26 +1229,26 @@
verbs -= /mob/living/carbon/human/proc/bloody_doodle
if (src.gloves)
src << "<span class='warning'>Your [src.gloves] are getting in the way.</span>"
to_chat(src, "<span class='warning'>Your [src.gloves] are getting in the way.</span>")
return
var/turf/simulated/T = src.loc
if (!istype(T)) //to prevent doodling out of mechs and lockers
src << "<span class='warning'>You cannot reach the floor.</span>"
to_chat(src, "<span class='warning'>You cannot reach the floor.</span>")
return
var/direction = input(src,"Which way?","Tile selection") as anything in list("Here","North","South","East","West")
if (direction != "Here")
T = get_step(T,text2dir(direction))
if (!istype(T))
src << "<span class='warning'>You cannot doodle there.</span>"
to_chat(src, "<span class='warning'>You cannot doodle there.</span>")
return
var/num_doodles = 0
for (var/obj/effect/decal/cleanable/blood/writing/W in T)
num_doodles++
if (num_doodles > 4)
src << "<span class='warning'>There is no space to write on!</span>"
to_chat(src, "<span class='warning'>There is no space to write on!</span>")
return
var/max_length = bloody_hands * 30 //tweeter style
@@ -1255,7 +1261,7 @@
if (length(message) > max_length)
message += "-"
src << "<span class='warning'>You ran out of blood to write with!</span>"
to_chat(src, "<span class='warning'>You ran out of blood to write with!</span>")
var/obj/effect/decal/cleanable/blood/writing/W = new(T)
W.basecolor = (hand_blood_color) ? hand_blood_color : "#A10808"
@@ -1283,6 +1289,9 @@
else if (affecting.robotic >= ORGAN_LIFELIKE)
. = 0
fail_msg = "Your needle refuses to penetrate more than a short distance..."
else if (affecting.thick_skin && prob(70 - round(affecting.brute_dam + affecting.burn_dam / 2))) // Allows transplanted limbs with thick skin to maintain their resistance.
. = 0
fail_msg = "Your needle fails to penetrate \the [affecting]'s thick hide..."
else
switch(target_zone)
if(BP_HEAD)
@@ -1412,7 +1421,7 @@
return
if(self)
src << "<span class='warning'>You brace yourself to relocate your [current_limb.joint]...</span>"
to_chat(src, "<span class='warning'>You brace yourself to relocate your [current_limb.joint]...</span>")
else
U << "<span class='warning'>You begin to relocate [S]'s [current_limb.joint]...</span>"
@@ -1422,7 +1431,7 @@
return
if(self)
src << "<span class='danger'>You pop your [current_limb.joint] back in!</span>"
to_chat(src, "<span class='danger'>You pop your [current_limb.joint] back in!</span>")
else
U << "<span class='danger'>You pop [S]'s [current_limb.joint] back in!</span>"
S << "<span class='danger'>[U] pops your [current_limb.joint] back in!</span>"
@@ -1507,11 +1516,11 @@
if(!UWC) return
var/datum/category_item/underwear/UWI = all_underwear[UWC.name]
if(!UWI || UWI.name == "None")
src << "<span class='notice'>You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "\a [UWC.display_name]"].</span>"
to_chat(src, "<span class='notice'>You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "a [UWC.display_name]"].</span>")
return
hide_underwear[UWC.name] = !hide_underwear[UWC.name]
update_underwear(1)
src << "<span class='notice'>You [hide_underwear[UWC.name] ? "take off" : "put on"] your [UWC.display_name].</span>"
to_chat(src, "<span class='notice'>You [hide_underwear[UWC.name] ? "take off" : "put on"] your [UWC.display_name].</span>")
return
/mob/living/carbon/human/verb/pull_punches()
@@ -1521,7 +1530,7 @@
if(stat) return
pulling_punches = !pulling_punches
src << "<span class='notice'>You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"].</span>"
to_chat(src, "<span class='notice'>You are now [pulling_punches ? "pulling your punches" : "not pulling your punches"].</span>")
return
/mob/living/carbon/human/should_have_organ(var/organ_check)
@@ -104,7 +104,7 @@
if(istype(H) && health > config.health_threshold_dead)
adjustOxyLoss(-(min(getOxyLoss(), 5)))
updatehealth()
src << "<span class='notice'>You feel a breath of fresh air enter your lungs. It feels good.</span>"
to_chat(src, "<span class='notice'>You feel a breath of fresh air enter your lungs. It feels good.</span>")
else if(!(M == src && apply_pressure(M, M.zone_sel.selecting)))
help_shake_act(M)
@@ -253,21 +253,21 @@
if (candidates.len)
var/obj/item/organ/external/O = pick(candidates)
O.mutate()
src << "<span class = 'notice'>Something is not right with your [O.name]...</span>"
to_chat(src, "<span class = 'notice'>Something is not right with your [O.name]...</span>")
return
else
if (prob(heal_prob))
for (var/obj/item/organ/external/O in organs)
if (O.status & ORGAN_MUTATED)
O.unmutate()
src << "<span class = 'notice'>Your [O.name] is shaped normally again.</span>"
to_chat(src, "<span class = 'notice'>Your [O.name] is shaped normally again.</span>")
return
if (getCloneLoss() < 1)
for (var/obj/item/organ/external/O in organs)
if (O.status & ORGAN_MUTATED)
O.unmutate()
src << "<span class = 'notice'>Your [O.name] is shaped normally again.</span>"
to_chat(src, "<span class = 'notice'>Your [O.name] is shaped normally again.</span>")
BITSET(hud_updateflag, HEALTH_HUD)
// Defined here solely to take species flags into account without having to recast at mob/living level.
@@ -416,7 +416,7 @@ emp_act
//If the armor absorbs all of the damage, skip the rest of the calculations
var/soaked = get_armor_soak(affecting, "melee", O.armor_penetration)
if(soaked >= throw_damage)
src << "Your armor absorbs the force of [O.name]!"
to_chat(src, "Your armor absorbs the force of [O.name]!")
return
var/armor = run_armor_check(affecting, "melee", O.armor_penetration, "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].") //I guess "melee" is the best fit here
@@ -7,6 +7,47 @@
var/flapping = 0
var/vantag_pref = VANTAG_NONE //What's my status?
var/impersonate_bodytype //For impersonating a bodytype
var/ability_flags = 0 //Shadekin abilities/potentially other species-based?
var/sensorpref = 5 //Suit sensor loadout pref
//TFF 5/8/19 - add and set suit sensor setting define to 5 for random setting
var/sensorpref = 5
/mob/living/carbon/human/proc/shadekin_get_energy()
var/datum/species/shadekin/SK = species
if(!istype(SK))
return 0
return SK.get_energy(src)
/mob/living/carbon/human/proc/shadekin_get_max_energy()
var/datum/species/shadekin/SK = species
if(!istype(SK))
return 0
return SK.get_max_energy(src)
/mob/living/carbon/human/proc/shadekin_set_energy(var/new_energy)
var/datum/species/shadekin/SK = species
if(!istype(SK))
return 0
SK.set_energy(src, new_energy)
/mob/living/carbon/human/proc/shadekin_set_max_energy(var/new_max_energy)
var/datum/species/shadekin/SK = species
if(!istype(SK))
return 0
SK.set_max_energy(src, new_max_energy)
/mob/living/carbon/human/proc/shadekin_adjust_energy(var/amount)
var/datum/species/shadekin/SK = species
if(!istype(SK))
return 0
if(amount > 0 || !(SK.check_infinite_energy(src)))
var/new_amount = SK.get_energy(src) + amount
SK.set_energy(src, new_amount)
@@ -8,9 +8,9 @@
return 1
if(feedback)
if(status[1] == HUMAN_EATING_NO_MOUTH)
src << "Where do you intend to put \the [food]? You don't have a mouth!"
to_chat(src, "Where do you intend to put \the [food]? You don't have a mouth!")
else if(status[1] == HUMAN_EATING_BLOCKED_MOUTH)
src << "<span class='warning'>\The [status[2]] is in the way!</span>"
to_chat(src, "<span class='warning'>\The [status[2]] is in the way!</span>")
return 0
/mob/living/carbon/human/can_force_feed(var/feeder, var/food, var/feedback = 1)
@@ -224,6 +224,10 @@
// Handle footstep sounds
/mob/living/carbon/human/handle_footstep(var/turf/T)
//VOREStation Edit begin: SHADEKIN
if(shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
if(!config.footstep_volume || !T.footstep_sounds || !T.footstep_sounds.len)
return
// Future Upgrades - Multi species support
@@ -42,7 +42,7 @@
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot tackle someone in your current state."
to_chat(src, "You cannot tackle someone in your current state.")
return
var/list/choices = list()
@@ -61,7 +61,7 @@
return
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
src << "You cannot tackle in your current state."
to_chat(src, "You cannot tackle in your current state.")
return
last_special = world.time + 50
@@ -103,7 +103,7 @@
var/mob/M = targets[target]
if(istype(M, /mob/observer/dead) || M.stat == DEAD)
src << "Not even a [src.species.name] can speak to the dead."
to_chat(src, "Not even a [src.species.name] can speak to the dead.")
return
log_say("(COMMUNE to [key_name(M)]) [text]",src)
@@ -138,7 +138,7 @@
if(msg)
log_say("(PWHISPER to [key_name(M)]) [msg]", src)
M << "<font color='green'>You hear a strange, alien voice in your head... <i>[msg]</i></font>"
src << "<font color='green'>You said: \"[msg]\" to [M]</font>"
to_chat(src, "<font color='green'>You said: \"[msg]\" to [M]</font>")
return
/mob/living/carbon/human/proc/diona_split_nymph()
@@ -189,7 +189,7 @@
if(stat == DEAD) return
src << "<span class='notice'>Performing self-diagnostic, please wait...</span>"
to_chat(src, "<span class='notice'>Performing self-diagnostic, please wait...</span>")
sleep(50)
var/output = "<span class='notice'>Self-Diagnostic Results:\n</span>"
@@ -226,17 +226,17 @@
set category = "Abilities"
if(incapacitated())
src << "<span class='warning'>You need to recover before you can use this ability.</span>"
to_chat(src, "<span class='warning'>You need to recover before you can use this ability.</span>")
return
if(world.time < next_sonar_ping)
src << "<span class='warning'>You need another moment to focus.</span>"
to_chat(src, "<span class='warning'>You need another moment to focus.</span>")
return
if(is_deaf() || is_below_sound_pressure(get_turf(src)))
src << "<span class='warning'>You are for all intents and purposes currently deaf!</span>"
to_chat(src, "<span class='warning'>You are for all intents and purposes currently deaf!</span>")
return
next_sonar_ping += 10 SECONDS
var/heard_something = FALSE
src << "<span class='notice'>You take a moment to listen in to your environment...</span>"
to_chat(src, "<span class='notice'>You take a moment to listen in to your environment...</span>")
for(var/mob/living/L in range(client.view, src))
var/turf/T = get_turf(L)
if(!T || L == src || L.stat == DEAD || is_below_sound_pressure(T))
@@ -263,7 +263,7 @@
feedback += "</span>"
src << jointext(feedback,null)
if(!heard_something)
src << "<span class='notice'>You hear no movement but your own.</span>"
to_chat(src, "<span class='notice'>You hear no movement but your own.</span>")
/mob/living/carbon/human/proc/regenerate()
set name = "Regenerate"
@@ -26,6 +26,8 @@
/mob/living/carbon/human/protean/New(var/new_loc)
..(new_loc, "Protean")
/mob/living/carbon/human/alraune/New(var/new_loc)
..(new_loc, "Alraune")
/mob/living/carbon/human/shadekin/New(var/new_loc)
..(new_loc, SPECIES_SHADEKIN)
@@ -7,7 +7,8 @@
img.override = TRUE
add_alt_appearance("animals", img, displayTo = alt_farmanimals)
/mob/living/carbon/human/Destroy()
alt_farmanimals -= src
. = ..()
. = ..()
@@ -327,7 +327,7 @@ This saves us from having to call add_fingerprint() any time something is put in
if(C.attempt_attach_accessory(A, src))
return
else
src << "<font color='red'>You are trying to equip this item to an unsupported inventory slot. How the heck did you manage that? Stop it...</font>"
to_chat(src, "<font color='red'>You are trying to equip this item to an unsupported inventory slot. How the heck did you manage that? Stop it...</font>")
return
if((W == src.l_hand) && (slot != slot_l_hand))
+30 -19
View File
@@ -189,7 +189,7 @@
if (disabilities & EPILEPSY)
if ((prob(1) && paralysis < 1))
src << "<font color='red'>You have a seizure!</font>"
to_chat(src, "<font color='red'>You have a seizure!</font>")
for(var/mob/O in viewers(src, null))
if(O == src)
continue
@@ -223,19 +223,19 @@
custom_pain("Your head feels numb and painful.", 10)
if(getBrainLoss() >= 15)
if(4 <= rn && rn <= 6) if(eye_blurry <= 0)
src << "<span class='warning'>It becomes hard to see for some reason.</span>"
to_chat(src, "<span class='warning'>It becomes hard to see for some reason.</span>")
eye_blurry = 10
if(getBrainLoss() >= 35)
if(7 <= rn && rn <= 9) if(get_active_hand())
src << "<span class='danger'>Your hand won't respond properly, you drop what you're holding!</span>"
to_chat(src, "<span class='danger'>Your hand won't respond properly, you drop what you're holding!</span>")
drop_item()
if(getBrainLoss() >= 45)
if(10 <= rn && rn <= 12)
if(prob(50))
src << "<span class='danger'>You suddenly black out!</span>"
to_chat(src, "<span class='danger'>You suddenly black out!</span>")
Paralyse(10)
else if(!lying)
src << "<span class='danger'>Your legs won't respond properly, you fall down!</span>"
to_chat(src, "<span class='danger'>Your legs won't respond properly, you fall down!</span>")
Weaken(10)
@@ -283,6 +283,12 @@
if(core)
return
//VOREStation Addition start: shadekin
var/obj/item/organ/internal/brain/shadekin/s_brain = locate() in internal_organs
if(s_brain)
return
//VOREStation Addition end: shadekin
var/damage = 0
radiation -= 1 * RADIATION_SPEED_COEFFICIENT
if(prob(25))
@@ -294,13 +300,13 @@
if(!isSynthetic())
if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT))
radiation -= 5 * RADIATION_SPEED_COEFFICIENT
src << "<span class='warning'>You feel weak.</span>"
to_chat(src, "<span class='warning'>You feel weak.</span>")
Weaken(3)
if(!lying)
emote("collapse")
if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT) && species.get_bodytype() == SPECIES_HUMAN) //apes go bald
if((h_style != "Bald" || f_style != "Shaved" ))
src << "<span class='warning'>Your hair falls out.</span>"
to_chat(src, "<span class='warning'>Your hair falls out.</span>")
h_style = "Bald"
f_style = "Shaved"
update_hair()
@@ -312,7 +318,7 @@
if(prob(5))
take_overall_damage(0, 5 * RADIATION_SPEED_COEFFICIENT, used_weapon = "Radiation Burns")
if(prob(1))
src << "<span class='warning'>You feel strange!</span>"
to_chat(src, "<span class='warning'>You feel strange!</span>")
adjustCloneLoss(5 * RADIATION_SPEED_COEFFICIENT)
emote("gasp")
@@ -484,7 +490,7 @@
if(exhaled_pp > safe_exhaled_max)
if (!co2_alert|| prob(15))
var/word = pick("extremely dizzy","short of breath","faint","confused")
src << "<span class='danger'>You feel [word].</span>"
to_chat(src, "<span class='danger'>You feel [word].</span>")
adjustOxyLoss(HUMAN_MAX_OXYLOSS)
co2_alert = 1
@@ -493,7 +499,7 @@
else if(exhaled_pp > safe_exhaled_max * 0.7)
if (!co2_alert || prob(1))
var/word = pick("dizzy","short of breath","faint","momentarily confused")
src << "<span class='warning'>You feel [word].</span>"
to_chat(src, "<span class='warning'>You feel [word].</span>")
//scale linearly from 0 to 1 between safe_exhaled_max and safe_exhaled_max*0.7
var/ratio = 1.0 - (safe_exhaled_max - exhaled_pp)/(safe_exhaled_max*0.3)
@@ -507,7 +513,7 @@
else if(exhaled_pp > safe_exhaled_max * 0.6)
if (prob(0.3))
var/word = pick("a little dizzy","short of breath")
src << "<span class='warning'>You feel [word].</span>"
to_chat(src, "<span class='warning'>You feel [word].</span>")
else
co2_alert = 0
@@ -555,10 +561,10 @@
if(breath.temperature <= species.breath_cold_level_1)
if(prob(20))
src << "<span class='danger'>You feel your face freezing and icicles forming in your lungs!</span>"
to_chat(src, "<span class='danger'>You feel your face freezing and icicles forming in your lungs!</span>")
else if(breath.temperature >= species.breath_heat_level_1)
if(prob(20))
src << "<span class='danger'>You feel your face burning and a searing heat in your lungs!</span>"
to_chat(src, "<span class='danger'>You feel your face burning and a searing heat in your lungs!</span>")
if(breath.temperature >= species.breath_heat_level_1)
if(breath.temperature < species.breath_heat_level_2)
@@ -612,6 +618,11 @@
//Stuff like the xenomorph's plasma regen happens here.
species.handle_environment_special(src)
//VOREStation Edit begin: SHADEKIN
if(shadekin_phasing_check())
return
//VOREStation Edit end: SHADEKIN
//Moved pressure calculations here for use in skip-processing check.
var/pressure = environment.return_pressure()
var/adjusted_pressure = calculate_affecting_pressure(pressure)
@@ -876,7 +887,7 @@
for(var/obj/item/I in src)
if(I.contaminated)
if(check_belly(I)) continue //VOREStation Edit
if(src.species && src.species.get_bodytype() != "Vox")
if(src.species && src.species.get_bodytype() != "Vox" && src.species.get_bodytype() != "Shadekin") //VOREStation Edit: shadekin
// This is hacky, I'm so sorry.
if(I != l_hand && I != r_hand) //If the item isn't in your hands, you're probably wearing it. Full damage for you.
total_phoronloss += vsc.plc.CONTAMINATION_LOSS
@@ -987,7 +998,7 @@
adjustBrainLoss(brainOxPercent * oxyloss)
if(halloss >= species.total_health)
src << "<span class='notice'>You're in too much pain to keep going...</span>"
to_chat(src, "<span class='notice'>You're in too much pain to keep going...</span>")
src.visible_message("<B>[src]</B> slumps to the ground, too weak to continue fighting.")
Paralyse(10)
setHalLoss(species.total_health - 1)
@@ -1528,22 +1539,22 @@
stuttering = max(stuttering, 5)
if(shock_stage == 40)
src << "<span class='danger'>[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!</span>"
to_chat(src, "<span class='danger'>[pick("The pain is excruciating", "Please&#44; just end the pain", "Your whole body is going numb")]!</span>")
if (shock_stage >= 60)
if(shock_stage == 60) emote("me",1,"'s body becomes limp.")
if (prob(2))
src << "<span class='danger'>[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!</span>"
to_chat(src, "<span class='danger'>[pick("The pain is excruciating", "Please&#44; just end the pain", "Your whole body is going numb")]!</span>")
Weaken(20)
if(shock_stage >= 80)
if (prob(5))
src << "<span class='danger'>[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!</span>"
to_chat(src, "<span class='danger'>[pick("The pain is excruciating", "Please&#44; just end the pain", "Your whole body is going numb")]!</span>")
Weaken(20)
if(shock_stage >= 120)
if (prob(2))
src << "<span class='danger'>[pick("You black out", "You feel like you could die any moment now", "You're about to lose consciousness")]!</span>"
to_chat(src, "<span class='danger'>[pick("You black out", "You feel like you could die any moment now", "You are about to lose consciousness")]!</span>")
Paralyse(5)
if(shock_stage == 150)
@@ -76,4 +76,4 @@
src.nutrition -= DEFAULT_HUNGER_FACTOR/10
// Moving around increases germ_level faster
if(germ_level < GERM_LEVEL_MOVE_CAP && prob(8))
germ_level++
germ_level++
@@ -0,0 +1,6 @@
#define NOT_WHILE_SHIFTED 1
#define ONLY_WHILE_SHIFTED 2
#define SHIFTED_OR_NOT 3
#define AB_PHASE_SHIFTED 0x1
#define AB_SHADE_REGEN 0x2
@@ -0,0 +1,253 @@
/datum/species/shadekin
name = SPECIES_SHADEKIN
name_plural = "Shadekin"
icobase = 'icons/mob/human_races/r_shadekin_vr.dmi'
deform = 'icons/mob/human_races/r_shadekin_vr.dmi'
tail = "tail"
icobase_tail = 1
blurb = "Very little is known about these creatures. They appear to be largely mammalian in appearance. \
Seemingly very rare to encounter, there have been widespread myths of these creatures the galaxy over, \
but next to no verifiable evidence to their existence. However, they have recently been more verifiably \
documented in the Virgo system, following a mining bombardment of Virgo 3. The crew of NSB Adephagia have \
taken to calling these creatures 'Shadekin', and the name has generally stuck and spread. " //TODO: Something that's not wiki copypaste
wikilink = "https://wiki.vore-station.net/Shadekin"
catalogue_data = list(/datum/category_item/catalogue/fauna/shadekin)
language = LANGUAGE_SHADEKIN
assisted_langs = list()
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin)
rarity_value = 15 //INTERDIMENSIONAL FLUFFERS
siemens_coefficient = 0
darksight = 10
slowdown = -0.5
item_slowdown_mod = 0.5
brute_mod = 0.7 // Naturally sturdy.
burn_mod = 1.2 // Furry
warning_low_pressure = 50
hazard_low_pressure = -1
warning_high_pressure = 300
hazard_high_pressure = INFINITY
cold_level_1 = -1 //Immune to cold
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = 850 //Resistant to heat
heat_level_2 = 1000
heat_level_3 = 1150
flags = NO_SCAN | NO_MINOR_CUT | NO_INFECT
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
reagent_tag = IS_SHADEKIN // for shadekin-unqiue chem interactions
flesh_color = "#FFC896"
blood_color = "#A10808"
base_color = "#f0f0f0"
color_mult = 1
has_glowing_eyes = TRUE
death_message = "phases to somewhere far away!"
male_cough_sounds = null
female_cough_sounds = null
male_sneeze_sound = null
female_sneeze_sound = null
speech_bubble_appearance = "ghost"
genders = list(PLURAL, NEUTER) //no sexual dymorphism
ambiguous_genders = TRUE //but just in case
virus_immune = 1
breath_type = null
poison_type = null
vision_flags = SEE_SELF|SEE_MOBS
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_UNDERWEAR
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain/shadekin,
O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
)
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/vr/shadekin),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
//SHADEKIN-UNIQUE STUFF GOES HERE
var/list/shadekin_abilities = list(/datum/power/shadekin/phase_shift,
/datum/power/shadekin/regenerate_other,
/datum/power/shadekin/create_shade)
var/list/shadekin_ability_datums = list()
/datum/species/shadekin/New()
..()
for(var/power in shadekin_abilities)
var/datum/power/shadekin/SKP = new power(src)
shadekin_ability_datums.Add(SKP)
/datum/species/shadekin/handle_death(var/mob/living/carbon/human/H)
spawn(1)
for(var/obj/item/W in H)
H.drop_from_inventory(W)
qdel(H)
/datum/species/shadekin/get_bodytype()
return SPECIES_SHADEKIN
/datum/species/shadekin/get_random_name()
return "shadekin"
/datum/species/shadekin/handle_environment_special(var/mob/living/carbon/human/H)
handle_shade(H)
/datum/species/shadekin/can_breathe_water()
return TRUE //they dont quite breathe
/datum/species/shadekin/add_inherent_verbs(var/mob/living/carbon/human/H)
..()
add_shadekin_abilities(H)
/datum/species/shadekin/proc/add_shadekin_abilities(var/mob/living/carbon/human/H)
if(!H.ability_master || !istype(H.ability_master, /obj/screen/movable/ability_master/shadekin))
H.ability_master = null
H.ability_master = new /obj/screen/movable/ability_master/shadekin(H)
for(var/datum/power/shadekin/P in shadekin_ability_datums)
if(!(P.verbpath in H.verbs))
H.verbs += P.verbpath
H.ability_master.add_shadekin_ability(
object_given = H,
verb_given = P.verbpath,
name_given = P.name,
ability_icon_given = P.ability_icon_state,
arguments = list()
)
/datum/species/shadekin/proc/handle_shade(var/mob/living/carbon/human/H)
//Shifted kin don't gain/lose energy (and save time if we're at the cap)
var/darkness = 1
var/dark_gains = 0
var/turf/T = get_turf(H)
if(!T)
dark_gains = 0
return
var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
darkness = 1-brightness //Invert
if(H.ability_flags & AB_PHASE_SHIFTED)
dark_gains = 0
else
//Heal (very) slowly in good darkness
if(darkness >= 0.75)
H.adjustFireLoss(-0.05)
H.adjustBruteLoss(-0.05)
H.adjustToxLoss(-0.05)
dark_gains = 0.75
else
dark_gains = 0.25
set_energy(H, get_energy(H) + dark_gains)
//Update huds
update_shadekin_hud(H)
/datum/species/shadekin/proc/get_energy(var/mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
return shade_organ.dark_energy
/datum/species/shadekin/proc/get_max_energy(var/mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
return shade_organ.max_dark_energy
/datum/species/shadekin/proc/set_energy(var/mob/living/carbon/human/H, var/new_energy)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return
shade_organ.dark_energy = CLAMP(new_energy, 0, get_max_energy(H))
/datum/species/shadekin/proc/set_max_energy(var/mob/living/carbon/human/H, var/new_max_energy)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
shade_organ.max_dark_energy = new_max_energy
/datum/species/shadekin/proc/check_infinite_energy(var/mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
return shade_organ.dark_energy_infinite
/datum/species/shadekin/proc/update_shadekin_hud(var/mob/living/carbon/human/H)
var/turf/T = get_turf(H)
if(!T)
return
if(H.shadekin_energy_display)
H.shadekin_energy_display.invisibility = 0
switch(get_energy(H))
if(80 to INFINITY)
H.shadekin_energy_display.icon_state = "energy0"
if(60 to 80)
H.shadekin_energy_display.icon_state = "energy1"
if(40 to 60)
H.shadekin_energy_display.icon_state = "energy2"
if(20 to 40)
H.shadekin_energy_display.icon_state = "energy3"
if(0 to 20)
H.shadekin_energy_display.icon_state = "energy4"
if(H.shadekin_dark_display)
H.shadekin_dark_display.invisibility = 0
var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
var/darkness = 1-brightness //Invert
switch(darkness)
if(0.80 to 1.00)
H.shadekin_dark_display.icon_state = "dark2"
if(0.60 to 0.80)
H.shadekin_dark_display.icon_state = "dark1"
if(0.40 to 0.60)
H.shadekin_dark_display.icon_state = "dark"
if(0.20 to 0.40)
H.shadekin_dark_display.icon_state = "dark-1"
if(0.00 to 0.20)
H.shadekin_dark_display.icon_state = "dark-2"
return
@@ -0,0 +1,307 @@
/datum/power/shadekin
/////////////////////
/// PHASE SHIFT ///
/////////////////////
//Visual effect for phase in/out
/obj/effect/temp_visual/shadekin
randomdir = FALSE
duration = 5
icon = 'icons/mob/vore_shadekin.dmi'
/obj/effect/temp_visual/shadekin/phase_in
icon_state = "tp_in"
/obj/effect/temp_visual/shadekin/phase_out
icon_state = "tp_out"
/datum/power/shadekin/phase_shift
name = "Phase Shift (100)"
desc = "Shift yourself out of alignment with realspace to travel quickly to different areas."
verbpath = /mob/living/carbon/human/proc/phase_shift
ability_icon_state = "tech_passwall"
/mob/living/carbon/human/proc/phase_shift()
set name = "Phase Shift (100)"
set desc = "Shift yourself out of alignment with realspace to travel quickly to different areas."
set category = "Shadekin"
var/ability_cost = 100
var/datum/species/shadekin/SK = species
if(!istype(SK))
to_chat(src, "<span class='warning'>Only a shadekin can use that!</span>")
return FALSE
else if(stat)
to_chat(src, "<span class='warning'>Can't use that ability in your state!</span>")
return FALSE
else if(shadekin_get_energy() < ability_cost && !(ability_flags & AB_PHASE_SHIFTED))
to_chat(src, "<span class='warning'>Not enough energy for that ability!</span>")
return FALSE
if(!(ability_flags & AB_PHASE_SHIFTED))
shadekin_adjust_energy(-ability_cost)
playsound(src, 'sound/effects/stealthoff.ogg', 75, 1)
var/turf/T = get_turf(src)
if(!T.CanPass(src,T) || loc != T)
to_chat(src,"<span class='warning'>You can't use that here!</span>")
return FALSE
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
//Shifting in
if(ability_flags & AB_PHASE_SHIFTED)
ability_flags &= ~AB_PHASE_SHIFTED
name = real_name
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = initial(B.escapable)
//overlays.Cut()
invisibility = initial(invisibility)
see_invisible = initial(see_invisible)
incorporeal_move = initial(incorporeal_move)
density = initial(density)
force_max_speed = initial(force_max_speed)
update_icon()
//Cosmetics mostly
var/obj/effect/temp_visual/shadekin/phase_in/phaseanim = new /obj/effect/temp_visual/shadekin/phase_in(src.loc)
phaseanim.dir = dir
alpha = 0
custom_emote(1,"phases in!")
sleep(5) //The duration of the TP animation
canmove = original_canmove
alpha = initial(alpha)
//Potential phase-in vore
if(can_be_drop_pred) //Toggleable in vore panel
var/list/potentials = living_mobs(0)
if(potentials.len)
var/mob/living/target = pick(potentials)
if(istype(target) && vore_selected)
target.forceMove(vore_selected)
to_chat(target,"<span class='warning'>\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
//Affect nearby lights
var/destroy_lights = 0
for(var/obj/machinery/light/L in machines)
if(L.z != z || get_dist(src,L) > 10)
continue
if(prob(destroy_lights))
spawn(rand(5,25))
L.broken()
else
L.flicker(10)
//Shifting out
else
ability_flags |= AB_PHASE_SHIFTED
custom_emote(1,"phases out!")
name = "Something"
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = FALSE
var/obj/effect/temp_visual/shadekin/phase_out/phaseanim = new /obj/effect/temp_visual/shadekin/phase_out(src.loc)
phaseanim.dir = dir
alpha = 0
sleep(5)
invisibility = INVISIBILITY_LEVEL_TWO
see_invisible = INVISIBILITY_LEVEL_TWO
//overlays.Cut()
update_icon()
alpha = 127
canmove = original_canmove
incorporeal_move = TRUE
density = FALSE
force_max_speed = TRUE
/mob/living/carbon/human/UnarmedAttack()
if(shadekin_phasing_check())
return FALSE //Nope.
. = ..()
/mob/living/carbon/human/can_fall()
if(shadekin_phasing_check())
return FALSE //Nope!
return ..()
/mob/living/carbon/human/zMove(direction)
if(shadekin_phasing_check())
var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src)
if(destination)
forceMove(destination)
return TRUE //Yup.
return ..()
/mob/proc/shadekin_phasing_check()
var/mob/living/simple_mob/shadekin/s_SK = src
if(istype(s_SK))
if(s_SK.ability_flags & AB_PHASE_SHIFTED)
return TRUE
var/mob/living/carbon/human/h_SK = src
if(istype(h_SK))
if(h_SK.ability_flags & AB_PHASE_SHIFTED)
return TRUE
return FALSE
/*
/mob/living/carbon/human/MouseDrop_T(atom/dropping, mob/user)
if(ability_flags & AB_PHASE_SHIFTED)
return FALSE //Nope!
return ..()
*/
//////////////////////////
/// REGENERATE OTHER ///
//////////////////////////
/datum/power/shadekin/regenerate_other
name = "Regenerate Other (50)"
desc = "Spend energy to heal physical wounds in another creature."
verbpath = /mob/living/carbon/human/proc/regenerate_other
ability_icon_state = "tech_biomedaura"
/mob/living/carbon/human/proc/regenerate_other()
set name = "Regenerate Other (50)"
set desc = "Spend energy to heal physical wounds in another creature."
set category = "Shadekin"
var/ability_cost = 50
var/datum/species/shadekin/SK = species
if(!istype(SK))
to_chat(src, "<span class='warning'>Only a shadekin can use that!</span>")
return FALSE
else if(stat)
to_chat(src, "<span class='warning'>Can't use that ability in your state!</span>")
return FALSE
else if(shadekin_get_energy() < ability_cost)
to_chat(src, "<span class='warning'>Not enough energy for that ability!</span>")
return FALSE
else if(ability_flags & AB_PHASE_SHIFTED)
to_chat(src, "<span class='warning'>You can't use that while phase shifted!</span>")
return FALSE
var/list/viewed = oview(1)
var/list/targets = list()
for(var/mob/living/L in viewed)
targets += L
if(!targets.len)
to_chat(src,"<span class='warning'>Nobody nearby to mend!</span>")
return FALSE
var/mob/living/target = input(src,"Pick someone to mend:","Mend Other") as null|anything in targets
if(!target)
return FALSE
target.add_modifier(/datum/modifier/shadekin/heal_boop,1 MINUTE)
playsound(src, 'sound/effects/EMPulse.ogg', 75, 1)
shadekin_adjust_energy(-ability_cost)
visible_message("<span class='notice'>\The [src] gently places a hand on \the [target]...</span>")
face_atom(target)
return TRUE
/datum/modifier/shadekin/heal_boop
name = "Shadekin Regen"
desc = "You feel serene and well rested."
mob_overlay_state = "green_sparkles"
on_created_text = "<span class='notice'>Sparkles begin to appear around you, and all your ills seem to fade away.</span>"
on_expired_text = "<span class='notice'>The sparkles have faded, although you feel much healthier than before.</span>"
stacks = MODIFIER_STACK_EXTEND
/datum/modifier/shadekin/heal_boop/tick()
if(!holder.getBruteLoss() && !holder.getFireLoss() && !holder.getToxLoss() && !holder.getOxyLoss() && !holder.getCloneLoss()) // No point existing if the spell can't heal.
expire()
return
holder.adjustBruteLoss(-2)
holder.adjustFireLoss(-2)
holder.adjustToxLoss(-2)
holder.adjustOxyLoss(-2)
holder.adjustCloneLoss(-2)
//////////////////////
/// CREATE SHADE ///
//////////////////////
/datum/power/shadekin/create_shade
name = "Create Shade (25)"
desc = "Create a field of darkness that follows you."
verbpath = /mob/living/carbon/human/proc/create_shade
ability_icon_state = "tech_dispelold"
/mob/living/carbon/human/proc/create_shade()
set name = "Create Shade (25)"
set desc = "Create a field of darkness that follows you."
set category = "Shadekin"
var/ability_cost = 25
var/datum/species/shadekin/SK = species
if(!istype(SK))
to_chat(src, "<span class='warning'>Only a shadekin can use that!</span>")
return FALSE
else if(stat)
to_chat(src, "<span class='warning'>Can't use that ability in your state!</span>")
return FALSE
else if(shadekin_get_energy() < ability_cost)
to_chat(src, "<span class='warning'>Not enough energy for that ability!</span>")
return FALSE
else if(ability_flags & AB_PHASE_SHIFTED)
to_chat(src, "<span class='warning'>You can't use that while phase shifted!</span>")
return FALSE
playsound(src, 'sound/effects/bamf.ogg', 75, 1)
add_modifier(/datum/modifier/shadekin/create_shade,20 SECONDS)
shadekin_adjust_energy(-ability_cost)
return TRUE
/datum/modifier/shadekin/create_shade
name = "Shadekin Shadegen"
desc = "Darkness envelops you."
mob_overlay_state = ""
on_created_text = "<span class='notice'>You drag part of The Dark into realspace, enveloping yourself.</span>"
on_expired_text = "<span class='warning'>You lose your grasp on The Dark and realspace reasserts itself.</span>"
stacks = MODIFIER_STACK_EXTEND
var/mob/living/simple_mob/shadekin/my_kin
/datum/modifier/shadekin/create_shade/tick()
if(my_kin.ability_flags & AB_PHASE_SHIFTED)
expire()
/datum/modifier/shadekin/create_shade/on_applied()
my_kin = holder
holder.glow_toggle = TRUE
holder.glow_range = 8
holder.glow_intensity = -10
holder.glow_color = "#FFFFFF"
holder.set_light(8, -10, "#FFFFFF")
/datum/modifier/shadekin/create_shade/on_expire()
holder.glow_toggle = initial(holder.glow_toggle)
holder.glow_range = initial(holder.glow_range)
holder.glow_intensity = initial(holder.glow_intensity)
holder.glow_color = initial(holder.glow_color)
holder.set_light(0)
my_kin = null
@@ -0,0 +1,59 @@
/obj/screen/shadekin
icon = 'icons/mob/shadekin_hud.dmi'
invisibility = 101
/obj/screen/shadekin/darkness
name = "darkness"
icon_state = "dark"
alpha = 150
/obj/screen/shadekin/energy
name = "energy"
icon_state = "energy0"
alpha = 150
/obj/screen/movable/ability_master/shadekin
name = "Shadekin Abilities"
icon = 'icons/mob/screen_spells.dmi'
icon_state = "grey_spell_ready"
ability_objects = list()
showing = 0
open_state = "master_open"
closed_state = "master_closed"
screen_loc = ui_spell_master
/obj/screen/movable/ability_master/shadekin/update_abilities(forced = 0, mob/user) //Different proc to prevent indexing
update_icon()
if(user && user.client)
if(!(src in user.client.screen))
user.client.screen += src
for(var/obj/screen/ability/ability in ability_objects)
ability.update_icon(forced)
/obj/screen/ability/verb_based/shadekin
icon_state = "grey_spell_base"
background_base_state = "grey"
/obj/screen/movable/ability_master/proc/add_shadekin_ability(var/object_given, var/verb_given, var/name_given, var/ability_icon_given, var/arguments)
if(!object_given)
message_admins("ERROR: add_shadekin_ability() was not given an object in its arguments.")
if(!verb_given)
message_admins("ERROR: add_shadekin_ability() was not given a verb/proc in its arguments.")
if(get_ability_by_proc_ref(verb_given))
return // Duplicate
var/obj/screen/ability/verb_based/shadekin/A = new /obj/screen/ability/verb_based/shadekin()
A.ability_master = src
A.object_used = object_given
A.verb_to_call = verb_given
A.ability_icon_state = ability_icon_given
A.name = name_given
if(arguments)
A.arguments_to_use = arguments
ability_objects.Add(A)
if(my_mob.client)
toggle_open(2) //forces the icons to refresh on screen
@@ -0,0 +1,249 @@
/datum/species/shadekin_yw
name = SPECIES_SHADEKIN_YW
name_plural = "Shadekin"
icobase = 'icons/mob/human_races/r_shadekin_vr.dmi'
deform = 'icons/mob/human_races/r_shadekin_vr.dmi'
tail = "tail"
icobase_tail = 1
blurb = "A shadekin, where their powers have been stripped down, their access to the bluespace warp, removed."
catalogue_data = list(/datum/category_item/catalogue/fauna/shadekin)
language = LANGUAGE_SHADEKIN
assisted_langs = list()
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin)
rarity_value = 15 //INTERDIMENSIONAL FLUFFERS
siemens_coefficient = 0
darksight = 10
slowdown = -0.5
item_slowdown_mod = 0.5
brute_mod = 0.7 // Naturally sturdy.
burn_mod = 1.2 // Furry
warning_low_pressure = 50
hazard_low_pressure = -1
warning_high_pressure = 300
hazard_high_pressure = INFINITY
cold_level_1 = -1 //Immune to cold
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = 850 //Resistant to heat
heat_level_2 = 1000
heat_level_3 = 1150
flags = NO_SCAN | NO_MINOR_CUT | NO_INFECT
spawn_flags = SPECIES_CAN_JOIN
reagent_tag = IS_SHADEKIN // for shadekin-unqiue chem interactions
flesh_color = "#FFC896"
blood_color = "#A10808"
base_color = "#f0f0f0"
color_mult = 1
has_glowing_eyes = TRUE
death_message = "phases to somewhere far away!"
male_cough_sounds = null
female_cough_sounds = null
male_sneeze_sound = null
female_sneeze_sound = null
speech_bubble_appearance = "ghost"
genders = list(PLURAL, NEUTER) //no sexual dymorphism
ambiguous_genders = TRUE //but just in case
virus_immune = 1
breath_type = null
poison_type = null
vision_flags = SEE_SELF
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_UNDERWEAR
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
has_organ = list(
O_HEART = /obj/item/organ/internal/heart,
O_VOICE = /obj/item/organ/internal/voicebox,
O_LIVER = /obj/item/organ/internal/liver,
O_KIDNEYS = /obj/item/organ/internal/kidneys,
O_BRAIN = /obj/item/organ/internal/brain/shadekin,
O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
)
has_limbs = list(
BP_TORSO = list("path" = /obj/item/organ/external/chest),
BP_GROIN = list("path" = /obj/item/organ/external/groin),
BP_HEAD = list("path" = /obj/item/organ/external/head/vr/shadekin),
BP_L_ARM = list("path" = /obj/item/organ/external/arm),
BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
BP_L_LEG = list("path" = /obj/item/organ/external/leg),
BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
)
/*
//SHADEKIN-UNIQUE STUFF GOES HERE
var/list/shadekin_abilities = list(/datum/power/shadekin/phase_shift,
/datum/power/shadekin/regenerate_other,
/datum/power/shadekin/create_shade)
var/list/shadekin_ability_datums = list()
/datum/species/shadekin/New()
..()
for(var/power in shadekin_abilities)
var/datum/power/shadekin/SKP = new power(src)
shadekin_ability_datums.Add(SKP)
*/
/datum/species/shadekin_yw/handle_death(var/mob/living/carbon/human/H)
spawn(1)
for(var/obj/item/W in H)
H.drop_from_inventory(W)
qdel(H)
/datum/species/shadekin_yw/get_bodytype()
return SPECIES_SHADEKIN
/datum/species/shadekin_yw/get_random_name()
return "shadekin"
///datum/species/shadekin_yw/handle_environment_special(var/mob/living/carbon/human/H)
// handle_shade(H)
/datum/species/shadekin_yw/can_breathe_water()
return TRUE //they dont quite breathe
/*
/datum/species/shadekin/add_inherent_verbs(var/mob/living/carbon/human/H)
..()
add_shadekin_abilities(H)
/datum/species/shadekin/proc/add_shadekin_abilities(var/mob/living/carbon/human/H)
if(!H.ability_master || !istype(H.ability_master, /obj/screen/movable/ability_master/shadekin))
H.ability_master = null
H.ability_master = new /obj/screen/movable/ability_master/shadekin(H)
for(var/datum/power/shadekin/P in shadekin_ability_datums)
if(!(P.verbpath in H.verbs))
H.verbs += P.verbpath
H.ability_master.add_shadekin_ability(
object_given = H,
verb_given = P.verbpath,
name_given = P.name,
ability_icon_given = P.ability_icon_state,
arguments = list()
/datum/species/shadekin/proc/handle_shade(var/mob/living/carbon/human/H)
//Shifted kin don't gain/lose energy (and save time if we're at the cap)
var/darkness = 1
var/dark_gains = 0
var/turf/T = get_turf(H)
if(!T)
dark_gains = 0
return
var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
darkness = 1-brightness //Invert
if(H.ability_flags & AB_PHASE_SHIFTED)
dark_gains = 0
else
//Heal (very) slowly in good darkness
if(darkness >= 0.75)
H.adjustFireLoss(-0.05)
H.adjustBruteLoss(-0.05)
H.adjustToxLoss(-0.05)
dark_gains = 0.75
else
dark_gains = 0.25
set_energy(H, get_energy(H) + dark_gains)
//Update huds
update_shadekin_hud(H)
/datum/species/shadekin/proc/get_energy(var/mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
return shade_organ.dark_energy
/datum/species/shadekin/proc/get_max_energy(var/mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
return shade_organ.max_dark_energy
/datum/species/shadekin/proc/set_energy(var/mob/living/carbon/human/H, var/new_energy)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return
shade_organ.dark_energy = CLAMP(new_energy, 0, get_max_energy(H))
/datum/species/shadekin/proc/set_max_energy(var/mob/living/carbon/human/H, var/new_max_energy)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
shade_organ.max_dark_energy = new_max_energy
/datum/species/shadekin/proc/check_infinite_energy(var/mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
if(!istype(shade_organ))
return 0
return shade_organ.dark_energy_infinite
/datum/species/shadekin/proc/update_shadekin_hud(var/mob/living/carbon/human/H)
var/turf/T = get_turf(H)
if(!T)
return
if(H.shadekin_energy_display)
H.shadekin_energy_display.invisibility = 0
switch(get_energy(H))
if(80 to INFINITY)
H.shadekin_energy_display.icon_state = "energy0"
if(60 to 80)
H.shadekin_energy_display.icon_state = "energy1"
if(40 to 60)
H.shadekin_energy_display.icon_state = "energy2"
if(20 to 40)
H.shadekin_energy_display.icon_state = "energy3"
if(0 to 20)
H.shadekin_energy_display.icon_state = "energy4"
if(H.shadekin_dark_display)
H.shadekin_dark_display.invisibility = 0
var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
var/darkness = 1-brightness //Invert
switch(darkness)
if(0.80 to 1.00)
H.shadekin_dark_display.icon_state = "dark2"
if(0.60 to 0.80)
H.shadekin_dark_display.icon_state = "dark1"
if(0.40 to 0.60)
H.shadekin_dark_display.icon_state = "dark"
if(0.20 to 0.40)
H.shadekin_dark_display.icon_state = "dark-1"
if(0.00 to 0.20)
H.shadekin_dark_display.icon_state = "dark-2"
return
*/
@@ -46,4 +46,18 @@
if(5)
user.visible_message("<span class='danger'>[user]'s fangs sink deep into [target]'s [affecting.name], one of their veins bulging outwards from the sudden fluid pumped into it!</span>")
to_chat(target, "<font color='red'><b>Your [affecting.name] feels like it's going to burst! Moments later, you simply can't feel your [affecting.name] any longer, the numbness slowly spreading throughout your body!</b></font>")
target.bloodstr.add_reagent("numbenzyme",attack_damage)
target.bloodstr.add_reagent("numbenzyme",attack_damage)
/datum/unarmed_attack/claws/shadekin
var/energy_gain = 3
/datum/unarmed_attack/claws/shadekin/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
user.shadekin_adjust_energy(energy_gain)
/datum/unarmed_attack/bite/sharp/shadekin
var/energy_gain = 3
/datum/unarmed_attack/bite/sharp/shadekin/show_attack(var/mob/living/carbon/human/user, var/mob/living/carbon/human/target, var/zone, var/attack_damage)
..()
user.shadekin_adjust_energy(energy_gain)
@@ -33,7 +33,7 @@
flesh_color = "#5F7BB0"
base_color = "#001144"
tail = "seromitail"
//tail_hair = "feathers" //TESHARI TEMPORARY REMOVAL
//tail_hair = "feathers" //VORESTATION TESHARI TEMPORARY REMOVAL
reagent_tag = IS_TESHARI
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw

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