Merge branch 'master' into shep-dev-barky-noises
@@ -54,7 +54,7 @@
|
||||
#define ADMIN_TP(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];traitor=\ref[user]'>TP</a>)"
|
||||
#define ADMIN_BSA(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];BlueSpaceArtillery=\ref[user]'>BSA</a>)"
|
||||
#define ADMIN_KICK(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];boot2=\ref[user]'>KICK</a>)"
|
||||
#define ADMIN_CENTCOM_REPLY(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];CentcommReply=\ref[user]'>RPLY</a>)"
|
||||
#define ADMIN_CENTCOM_REPLY(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];CentComReply=\ref[user]'>RPLY</a>)"
|
||||
#define ADMIN_SYNDICATE_REPLY(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];SyndicateReply=\ref[user]'>RPLY</a>)"
|
||||
#define ADMIN_SC(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];adminspawncookie=\ref[user]'>SC</a>)"
|
||||
#define ADMIN_SMITE(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];adminsmite=\ref[user]'>SMITE</a>)"
|
||||
@@ -65,6 +65,7 @@
|
||||
#define ADMIN_JMP(src) "(<a href='?_src_=holder;[HrefToken(TRUE)];adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)"
|
||||
#define COORD(src) "[src ? "([src.x],[src.y],[src.z])" : "nonexistent location"]"
|
||||
#define ADMIN_COORDJMP(src) "[src ? "[COORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]"
|
||||
#define ADMIN_CA(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];secretsadmin=check_antagonist'>?</a>)"
|
||||
|
||||
#define AHELP_ACTIVE 1
|
||||
#define AHELP_CLOSED 2
|
||||
|
||||
@@ -440,6 +440,14 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
UpdateFactionList(player)
|
||||
//equip_custom_items(player) //VOREStation Removal
|
||||
//player.apply_traits() //VOREStation Removal
|
||||
//VOREStation Addition Start
|
||||
if(player.client)
|
||||
if(player.client.prefs.auto_backup_implant)
|
||||
var/obj/item/weapon/implant/backup/imp = new(src)
|
||||
|
||||
if(imp.handle_implant(player,player.zone_sel.selecting))
|
||||
imp.post_implant(player)
|
||||
//VOREStation Addition End
|
||||
if(captainless)
|
||||
for(var/mob/M in player_list)
|
||||
if(!istype(M,/mob/new_player))
|
||||
|
||||
@@ -348,6 +348,7 @@ var/global/list/PDA_Manifest = list()
|
||||
G.fields["real_rank"] = H.mind.assigned_role
|
||||
G.fields["rank"] = assignment
|
||||
G.fields["age"] = H.age
|
||||
G.fields["languages"] = list2text(H.languages,", ")
|
||||
if(H.get_FBP_type())
|
||||
G.fields["brain_type"] = H.get_FBP_type()
|
||||
else
|
||||
@@ -356,8 +357,9 @@ var/global/list/PDA_Manifest = list()
|
||||
G.fields["p_stat"] = "Active"
|
||||
G.fields["m_stat"] = "Stable"
|
||||
G.fields["sex"] = gender2text(H.gender)
|
||||
G.fields["species"] = H.get_species()
|
||||
G.fields["species"] = "[H.custom_species ? "[H.custom_species] ([H.species.name])" : H.species.name]" //VOREStation Edit
|
||||
G.fields["home_system"] = H.home_system
|
||||
G.fields["birthplace"] = H.birthplace
|
||||
G.fields["citizenship"] = H.citizenship
|
||||
G.fields["faction"] = H.personal_faction
|
||||
G.fields["religion"] = H.religion
|
||||
@@ -366,6 +368,7 @@ var/global/list/PDA_Manifest = list()
|
||||
|
||||
//Medical Record
|
||||
var/datum/data/record/M = CreateMedicalRecord(H.real_name, id, hidden)
|
||||
M.fields["species"] = "[H.custom_species ? "[H.custom_species] ([H.species.name])" : H.species.name]" //VOREStation Edit
|
||||
M.fields["b_type"] = H.b_type
|
||||
M.fields["b_dna"] = H.dna.unique_enzymes
|
||||
M.fields["id_gender"] = gender2text(H.identifying_gender)
|
||||
@@ -378,6 +381,7 @@ var/global/list/PDA_Manifest = list()
|
||||
|
||||
//Security Record
|
||||
var/datum/data/record/S = CreateSecurityRecord(H.real_name, id, hidden)
|
||||
S.fields["species"] = "[H.custom_species ? "[H.custom_species] ([H.species.name])" : H.species.name]" //VOREStation Edit
|
||||
if(H.get_FBP_type())
|
||||
S.fields["brain_type"] = H.get_FBP_type()
|
||||
else
|
||||
@@ -391,6 +395,7 @@ var/global/list/PDA_Manifest = list()
|
||||
L.fields["name"] = H.real_name
|
||||
L.fields["rank"] = H.mind.assigned_role
|
||||
L.fields["age"] = H.age
|
||||
L.fields["languages"] = list2text(H.languages,", ")
|
||||
L.fields["fingerprint"] = md5(H.dna.uni_identity)
|
||||
L.fields["sex"] = gender2text(H.gender)
|
||||
L.fields["id_gender"] = gender2text(H.identifying_gender)
|
||||
@@ -402,8 +407,9 @@ var/global/list/PDA_Manifest = list()
|
||||
L.fields["b_dna"] = H.dna.unique_enzymes
|
||||
L.fields["enzymes"] = H.dna.SE // Used in respawning
|
||||
L.fields["identity"] = H.dna.UI // "
|
||||
L.fields["species"] = H.get_species()
|
||||
L.fields["species"] = "[H.custom_species ? "[H.custom_species] ([H.species.name])" : H.species.name]" //VOREStation Edit
|
||||
L.fields["home_system"] = H.home_system
|
||||
L.fields["birthplace"] = H.birthplace
|
||||
L.fields["citizenship"] = H.citizenship
|
||||
L.fields["faction"] = H.personal_faction
|
||||
L.fields["religion"] = H.religion
|
||||
@@ -443,12 +449,14 @@ var/global/list/PDA_Manifest = list()
|
||||
G.fields["real_rank"] = "Unassigned"
|
||||
G.fields["sex"] = "Unknown"
|
||||
G.fields["age"] = "Unknown"
|
||||
G.fields["languages"] = "Unknown"
|
||||
G.fields["brain_type"] = "Unknown"
|
||||
G.fields["fingerprint"] = "Unknown"
|
||||
G.fields["p_stat"] = "Active"
|
||||
G.fields["m_stat"] = "Stable"
|
||||
G.fields["species"] = SPECIES_HUMAN
|
||||
G.fields["home_system"] = "Unknown"
|
||||
G.fields["birthplace"] = "Unknown"
|
||||
G.fields["citizenship"] = "Unknown"
|
||||
G.fields["faction"] = "Unknown"
|
||||
G.fields["religion"] = "Unknown"
|
||||
@@ -469,6 +477,7 @@ var/global/list/PDA_Manifest = list()
|
||||
var/datum/data/record/R = new /datum/data/record()
|
||||
R.name = "Security Record #[id]"
|
||||
R.fields["name"] = name
|
||||
R.fields["species"] = SPECIES_HUMAN
|
||||
R.fields["id"] = id
|
||||
R.fields["brain_type"] = "Unknown"
|
||||
R.fields["criminal"] = "None"
|
||||
@@ -491,6 +500,7 @@ var/global/list/PDA_Manifest = list()
|
||||
M.name = "Medical Record #[id]"
|
||||
M.fields["id"] = id
|
||||
M.fields["name"] = name
|
||||
M.fields["species"] = SPECIES_HUMAN
|
||||
M.fields["b_type"] = "AB+"
|
||||
M.fields["b_dna"] = md5(name)
|
||||
M.fields["id_gender"] = "Unknown"
|
||||
|
||||
@@ -21,3 +21,14 @@
|
||||
// volume_chan = VOLUME_CHANNEL_INJ_DEATH // Commented out until pain/etc PR is in
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/mob/cozyloop
|
||||
mid_sounds = list('modular_chomp/sound/misc/cozy.ogg'=1)
|
||||
mid_length = 21 SECONDS
|
||||
volume = 40
|
||||
pref_check = /datum/client_preference/sleep_music
|
||||
direct = TRUE // We send this sound directly to the mob, bc they only hear it when they're asleep.
|
||||
exclusive = TRUE // This should only occur once, because we only want one music loop running while we snooze.
|
||||
// volume_chan = VOLUME_CHANNEL_INJ_DEATH // Commented out until pain/etc PR is in
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -281,7 +281,7 @@
|
||||
if (!steal.select_target())
|
||||
return
|
||||
|
||||
if("download","capture","absorb")
|
||||
if("download","capture","absorb", "vore")
|
||||
var/def_num
|
||||
if(objective&&objective.type==text2path("/datum/objective/[new_obj_type]"))
|
||||
def_num = objective.target_amount
|
||||
@@ -300,6 +300,9 @@
|
||||
if("absorb")
|
||||
new_objective = new /datum/objective/absorb
|
||||
new_objective.explanation_text = "Absorb [target_number] compatible genomes."
|
||||
if("vore")
|
||||
new_objective = new /datum/objective/vore
|
||||
new_objective.explanation_text = "Devour [target_number] [target_number == 1 ? "person" : "people"]. What happens to them after you do that is irrelevant."
|
||||
new_objective.owner = src
|
||||
new_objective.target_amount = target_number
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
var/directory_tag
|
||||
var/directory_erptag
|
||||
var/directory_ad
|
||||
var/vore_prey_eaten = 0
|
||||
//CHOMPEdit additions
|
||||
var/vantag_preference = VANTAG_NONE
|
||||
var/directory_gendertag
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
/datum/category_item/underwear/proc/is_default(var/gender)
|
||||
return is_default
|
||||
|
||||
/datum/category_item/underwear/proc/generate_image(var/list/metadata, var/layer = FLOAT_LAYER)
|
||||
/datum/category_item/underwear/proc/generate_image(var/list/metadata, var/layer = FLOAT_LAYER, var/digitigrade = FALSE) //CHOMPEdit
|
||||
if(!icon_state)
|
||||
return
|
||||
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
general.fields["faction"] = random_general_record.fields["faction"]
|
||||
general.fields["fingerprint"] = random_general_record.fields["fingerprint"]
|
||||
general.fields["home_system"] = random_general_record.fields["home_system"]
|
||||
general.fields["birthplace"] = random_general_record.fields["birthplace"]
|
||||
general.fields["religion"] = random_general_record.fields["religion"]
|
||||
if(random_medical_record)
|
||||
medical.fields["b_type"] = random_medical_record.fields["b_type"]
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
feedback_add_details(feedback_tag,"[O.type]|FAIL")
|
||||
failed = TRUE
|
||||
num++
|
||||
if(failed)
|
||||
text += "<br><font color='red'><B>The [role_text] has failed.</B></font>"
|
||||
else
|
||||
text += "<br><font color='green'><B>The [role_text] was successful!</B></font>"
|
||||
if(failed)
|
||||
text += "<br><font color='red'><B>The [role_text] has failed.</B></font>"
|
||||
else
|
||||
text += "<br><font color='green'><B>The [role_text] was successful!</B></font>"
|
||||
|
||||
if(global_objectives && global_objectives.len)
|
||||
text += "<BR><FONT size = 2>Their objectives were:</FONT>"
|
||||
|
||||
@@ -627,6 +627,12 @@ var/global/list/all_objectives = list()
|
||||
else
|
||||
return 0
|
||||
|
||||
/datum/objective/vore/check_completion()
|
||||
if(owner && owner.vore_prey_eaten >= target_amount)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
// Heist objectives.
|
||||
/datum/objective/heist/proc/choose_target()
|
||||
return
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
/obj/machinery/sleeper/attack_hand(var/mob/user)
|
||||
if(!controls_inside)
|
||||
return FALSE
|
||||
|
||||
|
||||
if(user == occupant)
|
||||
tgui_interact(user)
|
||||
|
||||
@@ -481,10 +481,12 @@
|
||||
M.loc = src
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
occupant = M
|
||||
occupant.cozyloop.start() // CHOMPStation Add: Cozy Music
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/sleeper/proc/go_out()
|
||||
if(!occupant || occupant.loc != src)
|
||||
occupant.cozyloop.stop() // CHOMPStation Add: Cozy Music
|
||||
occupant = null // JUST IN CASE
|
||||
return
|
||||
if(occupant.client)
|
||||
@@ -492,6 +494,7 @@
|
||||
occupant.client.perspective = MOB_PERSPECTIVE
|
||||
occupant.Stasis(0)
|
||||
occupant.loc = src.loc
|
||||
occupant.cozyloop.stop() // CHOMPStation Add: Cozy Music
|
||||
occupant = null
|
||||
for(var/atom/movable/A in src) // In case an object was dropped inside or something
|
||||
if(A == beaker || A == circuit)
|
||||
|
||||
@@ -1312,7 +1312,7 @@
|
||||
Mech: Shuttlecraft 500<br>\
|
||||
Rig: Solgov engineering hardsuit control module 500 <br>\
|
||||
Rig: Solgov medical hardsuit control module 500 <br>\
|
||||
Rig: Advanced voidsuit control module 500 <br>\
|
||||
Rig: Advanced hardsuit control module 500 <br>\
|
||||
Rig: Pursuit hardsuit control module 750 <br>\
|
||||
Rig: Combat hardsuit control module 750 <br>\
|
||||
Rig: ERT-J suit control module (Elite Janitor NT approved) 250 <br>\
|
||||
|
||||
@@ -186,7 +186,7 @@
|
||||
CASINO_PRIZE("Mech:Shuttlecraft", /obj/item/weapon/grenade/spawnergrenade/casino/gygax/shuttlecraft, 1, 500, "mechs"),
|
||||
CASINO_PRIZE("Rig: Solgov engineering hardsuit control module", /obj/item/weapon/rig/bayeng, 1, 500, "mechs"),
|
||||
CASINO_PRIZE("Rig: Solgov medical hardsuit control module", /obj/item/weapon/rig/baymed, 1, 500, "mechs"),
|
||||
CASINO_PRIZE("Rig: Advanced voidsuit control module", /obj/item/weapon/rig/ce, 1, 500, "mechs"),
|
||||
CASINO_PRIZE("Rig: Advanced hardsuit control module", /obj/item/weapon/rig/ce, 1, 500, "mechs"),//CHOMPEDIT: Hardsuit
|
||||
CASINO_PRIZE("Rig: Pursuit hardsuit control module", /obj/item/weapon/rig/ch/pursuit, 1, 750, "mechs"),
|
||||
CASINO_PRIZE("Rig: Combat hardsuit control module", /obj/item/weapon/rig/combat, 1, 750, "mechs"),
|
||||
CASINO_PRIZE("Rig: ERT-J suit control module (Elite Janitor NT approved)", /obj/item/weapon/rig/ert/janitor, 1, 250, "mechs"),
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
field_edit_questions = list(
|
||||
// General
|
||||
"sex" = "Please select new sex:",
|
||||
"species" = "Please input new species:",
|
||||
"age" = "Please input new age:",
|
||||
"fingerprint" = "Please input new fingerprint hash:",
|
||||
"p_stat" = "Please select new physical status:",
|
||||
@@ -137,6 +138,7 @@
|
||||
fields[++fields.len] = FIELD("Name", active1.fields["name"], null)
|
||||
fields[++fields.len] = FIELD("ID", active1.fields["id"], null)
|
||||
fields[++fields.len] = FIELD("Sex", active1.fields["sex"], "sex")
|
||||
fields[++fields.len] = FIELD("Species", active1.fields["species"], "species")
|
||||
fields[++fields.len] = FIELD("Age", "[active1.fields["age"]]", "age")
|
||||
fields[++fields.len] = FIELD("Fingerprint", active1.fields["fingerprint"], "fingerprint")
|
||||
fields[++fields.len] = FIELD("Physical Status", active1.fields["p_stat"], "p_stat")
|
||||
@@ -418,6 +420,7 @@
|
||||
if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
|
||||
P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
|
||||
<br>\nSex: [active1.fields["sex"]]
|
||||
<br>\nSpecies: [active1.fields["species"]]
|
||||
<br>\nAge: [active1.fields["age"]]
|
||||
<br>\nFingerprint: [active1.fields["fingerprint"]]
|
||||
<br>\nPhysical Status: [active1.fields["p_stat"]]
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
"name" = "Please enter new name:",
|
||||
"id" = "Please enter new id:",
|
||||
"sex" = "Please select new sex:",
|
||||
"species" = "Please input new species:",
|
||||
"age" = "Please input new age:",
|
||||
"rank" = "Please enter new rank:",
|
||||
"fingerprint" = "Please input new fingerprint hash:",
|
||||
@@ -148,6 +149,7 @@
|
||||
fields[++fields.len] = FIELD("ID", active1.fields["id"], "id")
|
||||
fields[++fields.len] = FIELD("Entity Classification", active1.fields["brain_type"], "brain_type")
|
||||
fields[++fields.len] = FIELD("Sex", active1.fields["sex"], "sex")
|
||||
fields[++fields.len] = FIELD("Species", active1.fields["species"], "species")
|
||||
fields[++fields.len] = FIELD("Age", "[active1.fields["age"]]", "age")
|
||||
fields[++fields.len] = FIELD("Rank", active1.fields["rank"], "rank")
|
||||
fields[++fields.len] = FIELD("Fingerprint", active1.fields["fingerprint"], "fingerprint")
|
||||
@@ -424,6 +426,7 @@
|
||||
if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
|
||||
P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
|
||||
<br>\nSex: [active1.fields["sex"]]
|
||||
<br>\nSpecies: [active1.fields["species"]]
|
||||
<br>\nAge: [active1.fields["age"]]
|
||||
<br>\nFingerprint: [active1.fields["fingerprint"]]
|
||||
<br>\nPhysical Status: [active1.fields["p_stat"]]
|
||||
|
||||
@@ -36,8 +36,15 @@
|
||||
"name" = "Please input new name:",
|
||||
"id" = "Please input new ID:",
|
||||
"sex" = "Please select new sex:",
|
||||
"species" = "Please input new species:",
|
||||
"age" = "Please input new age:",
|
||||
"fingerprint" = "Please input new fingerprint hash:",
|
||||
"home_system" = "Please input new home:",
|
||||
"birthplace" = "Please input new birthplace:",
|
||||
"citizenship" = "Please input new citizenship:",
|
||||
"languages" = "Please input known languages:",
|
||||
"faction" = "Please input new employer:",
|
||||
"religion" = "Please input new religion:",
|
||||
)
|
||||
field_edit_choices = list(
|
||||
// General
|
||||
@@ -109,8 +116,15 @@
|
||||
fields[++fields.len] = FIELD("Name", active1.fields["name"], "name")
|
||||
fields[++fields.len] = FIELD("ID", active1.fields["id"], "id")
|
||||
fields[++fields.len] = FIELD("Sex", active1.fields["sex"], "sex")
|
||||
fields[++fields.len] = FIELD("Species", active1.fields["species"], "species")
|
||||
fields[++fields.len] = FIELD("Age", active1.fields["age"], "age")
|
||||
fields[++fields.len] = FIELD("Fingerprint", active1.fields["fingerprint"], "fingerprint")
|
||||
fields[++fields.len] = FIELD("Home", active1.fields["home_system"], "home_system")
|
||||
fields[++fields.len] = FIELD("Birthplace", active1.fields["birthplace"], "birthplace")
|
||||
fields[++fields.len] = FIELD("Citizenship", active1.fields["citizenship"], "citizenship")
|
||||
fields[++fields.len] = FIELD("Faction", active1.fields["faction"], "faction")
|
||||
fields[++fields.len] = FIELD("Religion", active1.fields["religion"], "religion")
|
||||
fields[++fields.len] = FIELD("Known Languages", active1.fields["languages"], "languages")
|
||||
fields[++fields.len] = FIELD("Physical Status", active1.fields["p_stat"], null)
|
||||
fields[++fields.len] = FIELD("Mental Status", active1.fields["m_stat"], null)
|
||||
var/list/photos = list()
|
||||
@@ -307,8 +321,15 @@
|
||||
if(istype(active1, /datum/data/record) && data_core.general.Find(active1))
|
||||
P.info += {"Name: [active1.fields["name"]] ID: [active1.fields["id"]]
|
||||
<br>\nSex: [active1.fields["sex"]]
|
||||
<br>\nSpecies: [active1.fields["species"]]
|
||||
<br>\nAge: [active1.fields["age"]]
|
||||
<br>\nFingerprint: [active1.fields["fingerprint"]]
|
||||
<br>\nHome: [active1.fields["home_system"]]
|
||||
<br>\nBirthplace: [active1.fields["birthplace"]]
|
||||
<br>\nCitizenship: [active1.fields["citizenship"]]
|
||||
<br>\nFaction: [active1.fields["faction"]]
|
||||
<br>\nReligion: [active1.fields["religion"]]
|
||||
<br>\nKnown Languages: [active1.fields["languages"]]
|
||||
<br>\nPhysical Status: [active1.fields["p_stat"]]
|
||||
<br>\nMental Status: [active1.fields["m_stat"]]<br>
|
||||
<br>\nEmployment/Skills Summary: [active1.fields["notes"]]
|
||||
|
||||
@@ -55,6 +55,7 @@
|
||||
if(!card && user.unEquip(I))
|
||||
I.forceMove(src)
|
||||
card = I
|
||||
playsound(src, 'modular_chomp/sound/effects/insert_id_card.ogg', 75, 0) // CHOMPEdit: Timeclock beepboop. TODO: Make clocks delay reading the card for ~3 seconds to line up with quiet boops
|
||||
SStgui.update_uis(src)
|
||||
update_icon()
|
||||
else if(card)
|
||||
@@ -119,11 +120,13 @@
|
||||
if(card)
|
||||
usr.put_in_hands(card)
|
||||
card = null
|
||||
playsound(src, 'modular_chomp/sound/effects/remove_id_card.ogg', 75, 0) // CHOMPEdit: Timeclock beepboop. TODO: Make clocks delay reading the card for ~3 seconds to line up with quiet boops
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I))
|
||||
I.forceMove(src)
|
||||
card = I
|
||||
playsound(src, 'modular_chomp/sound/effects/insert_id_card.ogg', 75, 0) // CHOMPEdit: Timeclock beepboop. TODO: Make clocks delay reading the card for ~3 seconds to line up with quiet boops
|
||||
update_icon()
|
||||
return TRUE
|
||||
if("switch-to-onduty-rank")
|
||||
@@ -132,6 +135,7 @@
|
||||
makeOnDuty(params["switch-to-onduty-rank"], params["switch-to-onduty-assignment"])
|
||||
usr.put_in_hands(card)
|
||||
card = null
|
||||
playsound(src, 'modular_chomp/sound/effects/remove_id_card.ogg', 75, 0) // CHOMPEdit: Timeclock beepboop. TODO: Make clocks delay reading the card for ~3 seconds to line up with quiet boops
|
||||
update_icon()
|
||||
return TRUE
|
||||
if("switch-to-offduty")
|
||||
@@ -140,6 +144,7 @@
|
||||
makeOffDuty()
|
||||
usr.put_in_hands(card)
|
||||
card = null
|
||||
playsound(src, 'modular_chomp/sound/effects/remove_id_card.ogg', 75, 0) // CHOMPEdit: Timeclock beepboop. TODO: Make clocks delay reading the card for ~3 seconds to line up with quiet boops
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -273,6 +273,7 @@
|
||||
if(occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected
|
||||
occupant.bodytemperature = 261 // Changed to 70 from 140 by Zuhayr due to reoccurance of bug.
|
||||
unbuckle_mob(occupant, force = TRUE)
|
||||
occupant.cozyloop.stop() // CHOMPStation Add: Cozy Music
|
||||
occupant = null
|
||||
current_heat_capacity = initial(current_heat_capacity)
|
||||
update_use_power(USE_POWER_IDLE)
|
||||
@@ -304,6 +305,7 @@
|
||||
if(M.health > -100 && (M.health < 0 || M.sleeping))
|
||||
to_chat(M, "<span class='notice'><b>You feel a cold liquid surround you. Your skin starts to freeze up.</b></span>")
|
||||
occupant = M
|
||||
occupant.cozyloop.start() // CHOMPStation Add: Cozy Music
|
||||
buckle_mob(occupant, forced = TRUE, check_loc = FALSE)
|
||||
vis_contents |= occupant
|
||||
occupant.pixel_y += 19
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
if(breather.internals)
|
||||
breather.internals.icon_state = "internal0"
|
||||
breather.remove_from_mob(contained)
|
||||
breather.cozyloop.stop() // CHOMPStation Add: Cozy Music
|
||||
visible_message("<span class='notice'>\The [contained] rapidly retracts just before /the [src] is destroyed!</span>")
|
||||
breather = null
|
||||
|
||||
@@ -70,6 +71,7 @@
|
||||
breather.remove_from_mob(contained)
|
||||
contained.forceMove(src)
|
||||
src.visible_message("<b>\The [user]</b> makes \the [contained] rapidly retract back into \the [src]!")
|
||||
breather.cozyloop.stop() // CHOMPStation Add: Cozy Music
|
||||
if(breather.internals)
|
||||
breather.internals.icon_state = "internal0"
|
||||
breather = null
|
||||
@@ -160,6 +162,7 @@
|
||||
tank.forceMove(src)
|
||||
breather.remove_from_mob(contained)
|
||||
contained.forceMove(src)
|
||||
breather.cozyloop.stop() // CHOMPStation Add: Cozy Music
|
||||
src.visible_message("<span class='notice'>\The [contained] rapidly retracts back into \the [src]!</span>")
|
||||
breather = null
|
||||
update_use_power(USE_POWER_IDLE)
|
||||
@@ -237,6 +240,23 @@
|
||||
icon_state_open = "anesthetic_tank_open"
|
||||
mask_type = /obj/item/clothing/mask/breath/anesthetic
|
||||
|
||||
// CHOMPStation Add: Cozy Music
|
||||
/obj/machinery/oxygen_pump/anesthetic/attach_mask(var/mob/living/carbon/C)
|
||||
if(C && istype(C))
|
||||
contained.forceMove(get_turf(C))
|
||||
C.equip_to_slot(contained, slot_wear_mask)
|
||||
if(tank)
|
||||
tank.forceMove(C)
|
||||
breather = C
|
||||
spawn(1)
|
||||
if(!breather.internal && tank)
|
||||
breather.internal = tank
|
||||
if(breather.internals)
|
||||
breather.internals.icon_state = "internal1"
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
breather.cozyloop.start()
|
||||
// CHOMPStation Add End
|
||||
|
||||
/obj/machinery/oxygen_pump/mobile
|
||||
name = "portable oxygen pump"
|
||||
icon = 'icons/obj/atmos.dmi'
|
||||
@@ -273,6 +293,23 @@
|
||||
icon_state_open = "medpump_n2o_open"
|
||||
mask_type = /obj/item/clothing/mask/breath/anesthetic
|
||||
|
||||
// CHOMPStation Add: Cozy Music
|
||||
/obj/machinery/oxygen_pump/mobile/anesthetic/attach_mask(var/mob/living/carbon/C)
|
||||
if(C && istype(C))
|
||||
contained.forceMove(get_turf(C))
|
||||
C.equip_to_slot(contained, slot_wear_mask)
|
||||
if(tank)
|
||||
tank.forceMove(C)
|
||||
breather = C
|
||||
spawn(1)
|
||||
if(!breather.internal && tank)
|
||||
breather.internal = tank
|
||||
if(breather.internals)
|
||||
breather.internals.icon_state = "internal1"
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
breather.cozyloop.start()
|
||||
// CHOMPStation Add End
|
||||
|
||||
/obj/machinery/oxygen_pump/mobile/stabilizer
|
||||
name = "portable patient stabilizer"
|
||||
desc = "A portable oxygen pump with a retractable mask used for stabilizing patients in the field."
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
user.drop_item()
|
||||
item.forceMove(src)
|
||||
to_chat(user, "<span class='notice'>You attach the tank to the transfer valve.</span>")
|
||||
message_admins("[key_name_admin(user)] attached both tanks to a transfer valve. (<A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
|
||||
message_admins("[key_name_admin(user)] attached both tanks to a transfer valve. [ADMIN_JMP(location)]")
|
||||
log_game("[key_name_admin(user)] attached both tanks to a transfer valve.")
|
||||
|
||||
update_icon()
|
||||
@@ -49,7 +49,7 @@
|
||||
A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb).
|
||||
|
||||
bombers += "[key_name(user)] attached a [item] to a transfer valve."
|
||||
message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (<A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[location.x];Y=[location.y];Z=[location.z]'>JMP</a>)")
|
||||
message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. [ADMIN_JMP(location)]")
|
||||
log_game("[key_name_admin(user)] attached a [item] to a transfer valve.")
|
||||
attacher = user
|
||||
SStgui.update_uis(src) // update all UIs attached to src
|
||||
@@ -190,16 +190,16 @@
|
||||
else
|
||||
attacher_name = "[attacher.name]([attacher.ckey])"
|
||||
|
||||
var/log_str = "Bomb valve opened in <A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name]</a> "
|
||||
var/log_str = "Bomb valve opened in <A HREF='?_src_=holder;[HrefToken(TRUE)];adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name]</a> "
|
||||
log_str += "with [attached_device ? attached_device : "no device"] attacher: [attacher_name]"
|
||||
|
||||
if(attacher)
|
||||
log_str += "(<A HREF='?_src_=holder;[HrefToken()];adminmoreinfo=\ref[attacher]'>?</A>)"
|
||||
log_str += ADMIN_QUE(attacher)
|
||||
|
||||
var/mob/mob = get_mob_by_key(src.fingerprintslast)
|
||||
var/last_touch_info = ""
|
||||
if(mob)
|
||||
last_touch_info = "(<A HREF='?_src_=holder;[HrefToken()];adminmoreinfo=\ref[mob]'>?</A>)"
|
||||
last_touch_info = ADMIN_QUE(mob)
|
||||
|
||||
log_str += " Last touched by: [src.fingerprintslast][last_touch_info]"
|
||||
bombers += log_str
|
||||
|
||||
@@ -139,6 +139,7 @@
|
||||
data["exploit"]["species"] = html_encode(L.fields["species"])
|
||||
data["exploit"]["rank"] = html_encode(L.fields["rank"])
|
||||
data["exploit"]["home_system"] = html_encode(L.fields["home_system"])
|
||||
data["exploit"]["birthplace"] = html_encode(L.fields["birthplace"])
|
||||
data["exploit"]["citizenship"] = html_encode(L.fields["citizenship"])
|
||||
data["exploit"]["faction"] = html_encode(L.fields["faction"])
|
||||
data["exploit"]["religion"] = html_encode(L.fields["religion"])
|
||||
|
||||
@@ -16,4 +16,10 @@
|
||||
desc = "A \"Space Life\" brand figure of the NLS Southern Cross, the station you work in."
|
||||
icon = 'icons/obj/toy_ch.dmi'
|
||||
icon_state = "station"
|
||||
toysay = "Attention! Alert level elevated to blue."
|
||||
toysay = "Attention! Alert level elevated to blue."
|
||||
|
||||
/obj/item/toy/plushie/green_fox
|
||||
name = "green fox plushie"
|
||||
icon = 'icons/obj/toy_ch.dmi'
|
||||
icon_state = "greenfox"
|
||||
pokephrase = "Weh!"
|
||||
@@ -13,6 +13,7 @@
|
||||
slot_flags = SLOT_ID | SLOT_EARS
|
||||
|
||||
var/age = "\[UNSET\]"
|
||||
var/species = "\[UNSET\]"
|
||||
var/blood_type = "\[UNSET\]"
|
||||
var/dna_hash = "\[UNSET\]"
|
||||
var/fingerprint_hash = "\[UNSET\]"
|
||||
@@ -61,6 +62,7 @@
|
||||
id_card.age = 0
|
||||
id_card.registered_name = real_name
|
||||
id_card.sex = capitalize(gender)
|
||||
id_card.species = SPECIES_HUMAN
|
||||
id_card.set_id_photo(src)
|
||||
|
||||
if(dna)
|
||||
@@ -72,6 +74,7 @@
|
||||
/mob/living/carbon/human/set_id_info(var/obj/item/weapon/card/id/id_card)
|
||||
..()
|
||||
id_card.age = age
|
||||
id_card.species = "[custom_species ? "[custom_species] ([species.name])" : species.name]"
|
||||
id_card.sex = capitalize(name_gender())
|
||||
|
||||
/obj/item/weapon/card/id/tgui_data(mob/user)
|
||||
@@ -79,6 +82,7 @@
|
||||
|
||||
data["registered_name"] = registered_name
|
||||
data["sex"] = sex
|
||||
data["species"] = species
|
||||
data["age"] = age
|
||||
data["assignment"] = assignment
|
||||
data["fingerprint_hash"] = fingerprint_hash
|
||||
|
||||
@@ -249,4 +249,58 @@
|
||||
prob(2);/obj/random/multiple/minevault,
|
||||
prob(1);/obj/random/coin,
|
||||
prob(1);/obj/random/drinkbottle,
|
||||
prob(1);/obj/random/tool/alien)
|
||||
prob(1);/obj/random/tool/alien)
|
||||
|
||||
//Scug spawner for the picnic!
|
||||
/obj/random/mob/wildscugs
|
||||
name = "Random catslug spawner"
|
||||
desc = "Spawns catslugs with random colours!"
|
||||
icon_state = "vore"
|
||||
mob_faction = "vore"
|
||||
spawn_nothing_percentage = 25
|
||||
mob_wander_distance = 4
|
||||
mob_wander = 1
|
||||
mob_returns_home = 1
|
||||
var/newname = null
|
||||
var/newdesc = null
|
||||
|
||||
|
||||
/obj/random/mob/wildscugs/item_to_spawn()
|
||||
return pick(prob(99); /mob/living/simple_mob/vore/alienanimals/catslug,
|
||||
prob(1); /mob/living/simple_mob/vore/alienanimals/catslug/suslug/color) //A super rare surprise
|
||||
|
||||
/obj/random/mob/wildscugs/spawn_item()
|
||||
var/build_path = item_to_spawn()
|
||||
|
||||
var/mob/living/simple_mob/M = new build_path(src.loc)
|
||||
if(!istype(M))
|
||||
return
|
||||
if(M.has_AI())
|
||||
var/datum/ai_holder/AI = M.ai_holder
|
||||
AI.go_sleep() //Don't fight eachother while we're still setting up!
|
||||
AI.returns_home = mob_returns_home
|
||||
AI.wander = mob_wander
|
||||
AI.max_home_distance = mob_wander_distance
|
||||
if(overwrite_hostility)
|
||||
AI.hostile = mob_hostile
|
||||
AI.retaliate = mob_retaliate
|
||||
AI.go_wake() //Now you can kill eachother if your faction didn't override.
|
||||
|
||||
if(pixel_x || pixel_y)
|
||||
M.pixel_x = pixel_x
|
||||
M.pixel_y = pixel_y
|
||||
|
||||
if(mob_faction)
|
||||
M.faction = mob_faction
|
||||
|
||||
M.color = pick(COLOR_WHITE, COLOR_RED, COLOR_PURPLE, COLOR_YELLOW, COLOR_CYAN_BLUE, COLOR_RED_GRAY, COLOR_BEIGE, COLOR_PINK, COLOR_BLACK)
|
||||
if(newname)
|
||||
if(islist(newname))
|
||||
M.name = pick(newname)
|
||||
else
|
||||
M.name = newname
|
||||
if(newdesc)
|
||||
if(islist(newdesc))
|
||||
M.desc = pick(newdesc)
|
||||
else
|
||||
M.desc = newdesc
|
||||
|
||||
@@ -29,11 +29,11 @@
|
||||
handle_fish()
|
||||
// soundloop = new(list(src), FALSE) // CHOMPEdit: Removing soundloop for now.
|
||||
// soundloop.start() // CHOMPEdit: Removing soundloop for now.
|
||||
|
||||
|
||||
/turf/simulated/floor/water/Destroy()
|
||||
// soundloop.stop() // CHOMPEdit: Removing soundloop for now.
|
||||
// QDEL_NULL(soundloop) // CHOMPEdit: Removing soundloop for now.
|
||||
|
||||
|
||||
. = ..()
|
||||
|
||||
/turf/simulated/floor/water/update_icon()
|
||||
@@ -201,6 +201,12 @@ var/list/shoreline_icon_cache = list()
|
||||
add_overlay(shoreline_icon_cache[cache_string])
|
||||
|
||||
/turf/simulated/floor/water/is_safe_to_enter(mob/living/L)
|
||||
//CHOMPEDIT: Aquatic flags simulated water as safe now
|
||||
if(istype(L,/mob/living/carbon))
|
||||
var /mob/living/carbon/A = L
|
||||
if(/datum/trait/positive/aquatic in A.species.traits)
|
||||
return TRUE
|
||||
//CHOMPEDIT: Aquatic flags simulated water as safe now
|
||||
if(L.get_water_protection() < 1)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
@@ -2077,11 +2077,11 @@
|
||||
|
||||
/mob/extra_admin_link(var/source)
|
||||
if(client && eyeobj)
|
||||
return "|<A HREF='?[source];[HrefToken()];adminplayerobservejump=\ref[eyeobj]'>EYE</A>"
|
||||
return "|<A HREF='?[source];[HrefToken(TRUE)];adminplayerobservejump=\ref[eyeobj]'>EYE</A>"
|
||||
|
||||
/mob/observer/dead/extra_admin_link(var/source)
|
||||
if(mind && mind.current)
|
||||
return "|<A HREF='?[source];[HrefToken()];adminplayerobservejump=\ref[mind.current]'>BDY</A>"
|
||||
return "|<A HREF='?[source];[HrefToken(TRUE)];adminplayerobservejump=\ref[mind.current]'>BDY</A>"
|
||||
|
||||
/proc/admin_jump_link(var/atom/target, var/source)
|
||||
if(!target) return
|
||||
@@ -2091,5 +2091,5 @@
|
||||
else
|
||||
source = "_src_=holder"
|
||||
|
||||
. = "<A HREF='?[source];[HrefToken()];adminplayerobservejump=\ref[target]'>JMP</A>"
|
||||
. = "<A HREF='?[source];[HrefToken(TRUE)];adminplayerobservejump=\ref[target]'>JMP</A>"
|
||||
. += target.extra_admin_link(source)
|
||||
|
||||
@@ -279,6 +279,8 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
//send this msg to all admins
|
||||
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(!check_rights(R_ADMIN, 0, X))
|
||||
continue
|
||||
if(X.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping))
|
||||
X << 'sound/effects/adminhelp.ogg'
|
||||
window_flash(X)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
/client/proc/cmd_admin_pm_context(mob/M in mob_list)
|
||||
set category = null
|
||||
set name = "Admin PM Mob"
|
||||
if(!holder)
|
||||
if(!check_rights(R_ADMIN))
|
||||
to_chat(src, "<span class='pm warning'>Error: Admin-PM-Context: Only administrators may use this command.</span>")
|
||||
return
|
||||
if( !ismob(M) || !M.client )
|
||||
@@ -17,7 +17,7 @@
|
||||
/client/proc/cmd_admin_pm_panel()
|
||||
set category = "Admin"
|
||||
set name = "Admin PM"
|
||||
if(!holder)
|
||||
if(!check_rights(R_ADMIN))
|
||||
to_chat(src, "<span class='pm warning'>Error: Admin-PM-Panel: Only administrators may use this command.</span>")
|
||||
return
|
||||
var/list/client/targets[0]
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
log_adminsay(msg,src)
|
||||
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(check_rights(R_ADMIN))
|
||||
if(check_rights(R_ADMIN, 0, C))
|
||||
to_chat(C, "<span class='admin_channel'>" + create_text_tag("admin", "ADMIN:", C) + " <span class='name'>[key_name(usr, 1)]</span>([admin_jump_link(mob, src)]): <span class='message'>[msg]</span></span>")
|
||||
|
||||
feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
return
|
||||
|
||||
var/icon/cross = icon('icons/obj/storage.dmi',"bible")
|
||||
msg = "<font color='blue'>\icon[cross][bicon(cross)] <b><font color=purple>PRAY: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;[HrefToken()];adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;[HrefToken()];adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;[HrefToken()];Vars=\ref[src]'>VV</A>) (<A HREF='?_src_=holder;[HrefToken()];subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src, src)]) (<A HREF='?_src_=holder;[HrefToken()];secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;[HrefToken()];adminspawncookie=\ref[src]'>SC</a>) (<A HREF='?_src_=holder;[HrefToken()];adminsmite=\ref[src]'>SMITE</a>):</b> [msg]</font>"
|
||||
msg = "<font color='blue'>\icon[cross][bicon(cross)] <b><font color=purple>PRAY: </font>[key_name(src, 1)] [ADMIN_QUE(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] ([admin_jump_link(src, src)]) [ADMIN_CA(src)] [ADMIN_SC(src)] [ADMIN_SMITE(src)]:</b> [msg]</font>"
|
||||
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(R_ADMIN|R_EVENT & C.holder.rights)
|
||||
@@ -30,14 +30,14 @@
|
||||
//log_admin("HELP: [key_name(src)]: [msg]")
|
||||
|
||||
/proc/CentCom_announce(var/msg, var/mob/Sender, var/iamessage)
|
||||
msg = "<font color='blue'><b><font color=orange>[uppertext(using_map.boss_short)]M[iamessage ? " IA" : ""]:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;[HrefToken()];adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;[HrefToken()];Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;[HrefToken()];subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;[HrefToken()];secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;[HrefToken()];BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;[HrefToken()];CentComReply=\ref[Sender]'>RPLY</A>):</b> [msg]</font>"
|
||||
msg = "<font color='blue'><b><font color=orange>[uppertext(using_map.boss_short)]M[iamessage ? " IA" : ""]:</font>[key_name(Sender, 1)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] ([admin_jump_link(Sender)]) [ADMIN_CA(Sender)] [ADMIN_BSA(Sender)] [ADMIN_CENTCOM_REPLY(Sender)]:</b> [msg]</font>"
|
||||
for(var/client/C in GLOB.admins) //VOREStation Edit - GLOB admins
|
||||
if(R_ADMIN|R_EVENT & C.holder.rights)
|
||||
to_chat(C,msg)
|
||||
C << 'sound/machines/signal.ogg'
|
||||
|
||||
/proc/Syndicate_announce(var/msg, var/mob/Sender)
|
||||
msg = "<font color='blue'><b><font color=crimson>ILLEGAL:</font>[key_name(Sender, 1)] (<A HREF='?_src_=holder;[HrefToken()];adminplayeropts=\ref[Sender]'>PP</A>) (<A HREF='?_src_=vars;[HrefToken()];Vars=\ref[Sender]'>VV</A>) (<A HREF='?_src_=holder;[HrefToken()];subtlemessage=\ref[Sender]'>SM</A>) ([admin_jump_link(Sender)]) (<A HREF='?_src_=holder;[HrefToken()];secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;[HrefToken()];BlueSpaceArtillery=\ref[Sender]'>BSA</A>) (<A HREF='?_src_=holder;[HrefToken()];SyndicateReply=\ref[Sender]'>RPLY</A>):</b> [msg]</font>"
|
||||
msg = "<font color='blue'><b><font color=crimson>ILLEGAL:</font>[key_name(Sender, 1)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] ([admin_jump_link(Sender)]) [ADMIN_CA(Sender)] [ADMIN_BSA(Sender)] [ADMIN_SYNDICATE_REPLY(Sender)]:</b> [msg]</font>"
|
||||
for(var/client/C in GLOB.admins) //VOREStation Edit - GLOB admins
|
||||
if(R_ADMIN|R_EVENT & C.holder.rights)
|
||||
to_chat(C,msg)
|
||||
|
||||
@@ -2,6 +2,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
|
||||
/datum/preferences
|
||||
var/equip_preview_mob = EQUIP_PREVIEW_ALL
|
||||
var/animations_toggle = FALSE
|
||||
|
||||
var/icon/bgstate = "000"
|
||||
var/list/bgstate_options = list("000", "midgrey", "FFF", "white", "steel", "techmaint", "dark", "plating", "reinforced")
|
||||
@@ -569,6 +570,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
. += "<br><a href='?src=\ref[src];cycle_bg=1'>Cycle background</a>"
|
||||
. += "<br><a href='?src=\ref[src];toggle_preview_value=[EQUIP_PREVIEW_LOADOUT]'>[pref.equip_preview_mob & EQUIP_PREVIEW_LOADOUT ? "Hide loadout" : "Show loadout"]</a>"
|
||||
. += "<br><a href='?src=\ref[src];toggle_preview_value=[EQUIP_PREVIEW_JOB]'>[pref.equip_preview_mob & EQUIP_PREVIEW_JOB ? "Hide job gear" : "Show job gear"]</a>"
|
||||
. += "<br><a href='?src=\ref[src];toggle_animations=1'>[pref.animations_toggle ? "Stop animations" : "Show animations"]</a>"
|
||||
. += "</td></tr></table>"
|
||||
|
||||
. += "<b>Hair</b><br>"
|
||||
@@ -1154,6 +1156,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
|
||||
pref.equip_preview_mob ^= text2num(href_list["toggle_preview_value"])
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["toggle_animations"])
|
||||
pref.animations_toggle = !pref.animations_toggle
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
else if(href_list["synth_color"])
|
||||
pref.synth_color = !pref.synth_color
|
||||
return TOPIC_REFRESH_UPDATE_PREVIEW
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
S["sec_record"] >> pref.sec_record
|
||||
S["gen_record"] >> pref.gen_record
|
||||
S["home_system"] >> pref.home_system
|
||||
S["birthplace"] >> pref.birthplace
|
||||
S["citizenship"] >> pref.citizenship
|
||||
S["faction"] >> pref.faction
|
||||
S["religion"] >> pref.religion
|
||||
@@ -17,6 +18,7 @@
|
||||
S["sec_record"] << pref.sec_record
|
||||
S["gen_record"] << pref.gen_record
|
||||
S["home_system"] << pref.home_system
|
||||
S["birthplace"] << pref.birthplace
|
||||
S["citizenship"] << pref.citizenship
|
||||
S["faction"] << pref.faction
|
||||
S["religion"] << pref.religion
|
||||
@@ -24,6 +26,7 @@
|
||||
|
||||
/datum/category_item/player_setup_item/general/background/sanitize_character()
|
||||
if(!pref.home_system) pref.home_system = "Unset"
|
||||
if(!pref.birthplace) pref.birthplace = "Unset"
|
||||
if(!pref.citizenship) pref.citizenship = "None"
|
||||
if(!pref.faction) pref.faction = "None"
|
||||
if(!pref.religion) pref.religion = "None"
|
||||
@@ -36,6 +39,7 @@
|
||||
character.sec_record = pref.sec_record
|
||||
character.gen_record = pref.gen_record
|
||||
character.home_system = pref.home_system
|
||||
character.birthplace = pref.birthplace
|
||||
character.citizenship = pref.citizenship
|
||||
character.personal_faction = pref.faction
|
||||
character.religion = pref.religion
|
||||
@@ -43,7 +47,8 @@
|
||||
/datum/category_item/player_setup_item/general/background/content(var/mob/user)
|
||||
. += "<b>Background Information</b><br>"
|
||||
. += "Economic Status: <a href='?src=\ref[src];econ_status=1'>[pref.economic_status]</a><br/>"
|
||||
. += "Home System: <a href='?src=\ref[src];home_system=1'>[pref.home_system]</a><br/>"
|
||||
. += "Home: <a href='?src=\ref[src];home_system=1'>[pref.home_system]</a><br/>"
|
||||
. += "Birthplace: <a href='?src=\ref[src];birthplace=1'>[pref.birthplace]</a><br/>"
|
||||
. += "Citizenship: <a href='?src=\ref[src];citizenship=1'>[pref.citizenship]</a><br/>"
|
||||
. += "Faction: <a href='?src=\ref[src];faction=1'>[pref.faction]</a><br/>"
|
||||
. += "Religion: <a href='?src=\ref[src];religion=1'>[pref.religion]</a><br/>"
|
||||
@@ -67,7 +72,7 @@
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["home_system"])
|
||||
var/choice = tgui_input_list(user, "Please choose a home system.", "Character Preference", home_system_choices + list("Unset","Other"), pref.home_system)
|
||||
var/choice = tgui_input_list(user, "Please choose your home planet and/or system. This should be your current primary residence. Select \"Other\" to specify manually.", "Character Preference", home_system_choices + list("Unset","Other"), pref.home_system)
|
||||
if(!choice || !CanUseTopic(user))
|
||||
return TOPIC_NOACTION
|
||||
if(choice == "Other")
|
||||
@@ -78,8 +83,20 @@
|
||||
pref.home_system = choice
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["birthplace"])
|
||||
var/choice = tgui_input_list(user, "Please choose the planet and/or system or other appropriate location that you were born/created. Select \"Other\" to specify manually.", "Character Preference", home_system_choices + list("Unset","Other"), pref.birthplace)
|
||||
if(!choice || !CanUseTopic(user))
|
||||
return TOPIC_NOACTION
|
||||
if(choice == "Other")
|
||||
var/raw_choice = sanitize(tgui_input_text(user, "Please enter a birthplace.", "Character Preference", null, MAX_NAME_LEN), MAX_NAME_LEN)
|
||||
if(raw_choice && CanUseTopic(user))
|
||||
pref.birthplace = raw_choice
|
||||
else
|
||||
pref.birthplace = choice
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["citizenship"])
|
||||
var/choice = tgui_input_list(user, "Please choose your current citizenship.", "Character Preference", citizenship_choices + list("None","Other"), pref.citizenship)
|
||||
var/choice = tgui_input_list(user, "Please select the faction or political entity with which you currently hold citizenship. Select \"Other\" to specify manually.", "Character Preference", citizenship_choices + list("None","Other"), pref.citizenship)
|
||||
if(!choice || !CanUseTopic(user))
|
||||
return TOPIC_NOACTION
|
||||
if(choice == "Other")
|
||||
@@ -91,7 +108,7 @@
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["faction"])
|
||||
var/choice = tgui_input_list(user, "Please choose a faction to work for.", "Character Preference", faction_choices + list("None","Other"), pref.faction)
|
||||
var/choice = tgui_input_list(user, "Please choose the faction you primarily work for, if you are not under the direct employ of NanoTrasen. Select \"Other\" to specify manually.", "Character Preference", faction_choices + list("None","Other"), pref.faction)
|
||||
if(!choice || !CanUseTopic(user))
|
||||
return TOPIC_NOACTION
|
||||
if(choice == "Other")
|
||||
@@ -103,7 +120,7 @@
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["religion"])
|
||||
var/choice = tgui_input_list(user, "Please choose a religion.", "Character Preference", religion_choices + list("None","Other"), pref.religion)
|
||||
var/choice = tgui_input_list(user, "Please choose a religion. Select \"Other\" to specify manually.", "Character Preference", religion_choices + list("None","Other"), pref.religion)
|
||||
if(!choice || !CanUseTopic(user))
|
||||
return TOPIC_NOACTION
|
||||
if(choice == "Other")
|
||||
|
||||
@@ -381,7 +381,7 @@ var/list/_client_preferences_by_type
|
||||
key = "RECEIVE_TIPS"
|
||||
enabled_description = "Enabled"
|
||||
disabled_description = "Disabled"
|
||||
|
||||
|
||||
/datum/client_preference/pain_frequency
|
||||
description = "Pain Messages Cooldown"
|
||||
key = "PAIN_FREQUENCY"
|
||||
@@ -389,6 +389,14 @@ var/list/_client_preferences_by_type
|
||||
enabled_description = "Extended"
|
||||
disabled_description = "Default"
|
||||
|
||||
// CHOMPAdd
|
||||
/datum/client_preference/sleep_music
|
||||
description = "Sleeping Music"
|
||||
key = "SLEEP_MUSIC"
|
||||
enabled_description = "Audible"
|
||||
disabled_description = "Silent"
|
||||
// CHOMPAdd End
|
||||
|
||||
|
||||
/********************
|
||||
* Staff Preferences *
|
||||
|
||||
@@ -247,7 +247,7 @@
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["voice_test"])
|
||||
var/sound/S = pick(pref.voice_sound)
|
||||
var/sound/S
|
||||
switch(pref.voice_sound)
|
||||
if("beep-boop")
|
||||
S = sound(pick(talk_sound))
|
||||
@@ -277,10 +277,10 @@
|
||||
S = sound(pick(goon_speak_roach_sound))
|
||||
if("goon speak skelly")
|
||||
S = sound(pick(goon_speak_skelly_sound))
|
||||
S.frequency = pick(pref.voice_freq)
|
||||
S.volume = 50
|
||||
SEND_SOUND(user, S)
|
||||
return TOPIC_REFRESH // CHOMPEdit
|
||||
if(S)
|
||||
S.frequency = pick(pref.voice_freq)
|
||||
S.volume = 50
|
||||
SEND_SOUND(user, S)
|
||||
// CHOMPEdit Start: Pain/Scream/Death sounds
|
||||
else if(href_list["species_sound_options"]) // You shouldn't be able to see this option if you don't have the option to select a custom icon base, so we don't need to re-check for safety here.
|
||||
var/list/possible_species_sound_types = species_sound_map
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
S["directory_ad"] >> pref.directory_ad
|
||||
S["sensorpref"] >> pref.sensorpref
|
||||
S["capture_crystal"] >> pref.capture_crystal
|
||||
S["auto_backup_implant"] >> pref.auto_backup_implant
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S)
|
||||
S["show_in_directory"] << pref.show_in_directory
|
||||
@@ -21,7 +22,7 @@
|
||||
S["directory_ad"] << pref.directory_ad
|
||||
S["sensorpref"] << pref.sensorpref
|
||||
S["capture_crystal"] << pref.capture_crystal
|
||||
|
||||
S["auto_backup_implant"] << pref.auto_backup_implant
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/copy_to_mob(var/mob/living/carbon/human/character)
|
||||
if(pref.sensorpref > 5 || pref.sensorpref < 1)
|
||||
@@ -37,6 +38,7 @@
|
||||
pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag))
|
||||
pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref))
|
||||
pref.capture_crystal = sanitize_integer(pref.capture_crystal, 0, 1, initial(pref.capture_crystal))
|
||||
pref.auto_backup_implant = sanitize_integer(pref.auto_backup_implant, 0, 1, initial(pref.auto_backup_implant))
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/content(var/mob/user)
|
||||
. += "<br>"
|
||||
@@ -47,7 +49,8 @@
|
||||
. += "<b>Character Directory ERP Tag:</b> <a href='?src=\ref[src];directory_erptag=1'><b>[pref.directory_erptag]</b></a><br>"
|
||||
. += "<b>Character Directory Advertisement:</b> <a href='?src=\ref[src];directory_ad=1'><b>Set Directory Ad</b></a><br>"
|
||||
. += "<b>Suit Sensors Preference:</b> <a [pref.sensorpref ? "" : ""] href='?src=\ref[src];toggle_sensor_setting=1'><b>[sensorpreflist[pref.sensorpref]]</b></a><br>"
|
||||
. += "<b>Capture Crystal Preference</b> <a [pref.capture_crystal ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_capture_crystal=1'><b>[pref.capture_crystal ? "Yes" : "No"]</b></a><br>"
|
||||
. += "<b>Capture Crystal Preference:</b> <a [pref.capture_crystal ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_capture_crystal=1'><b>[pref.capture_crystal ? "Yes" : "No"]</b></a><br>"
|
||||
. += "<b>Spawn With Backup Implant:</b> <a [pref.auto_backup_implant ? "class='linkOn'" : ""] href='?src=\ref[src];toggle_implant=1'><b>[pref.auto_backup_implant ? "Yes" : "No"]</b></a><br>"
|
||||
|
||||
/datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user)
|
||||
if(href_list["toggle_show_in_directory"])
|
||||
@@ -93,5 +96,7 @@
|
||||
else if(href_list["toggle_capture_crystal"])
|
||||
pref.capture_crystal = pref.capture_crystal ? 0 : 1;
|
||||
return TOPIC_REFRESH
|
||||
|
||||
else if(href_list["toggle_implant"])
|
||||
pref.auto_backup_implant = pref.auto_backup_implant ? 0 : 1;
|
||||
return TOPIC_REFRESH
|
||||
return ..();
|
||||
|
||||
@@ -76,8 +76,9 @@ var/list/preferences_datums = list()
|
||||
var/synth_markings = 1 //Enable/disable markings on synth parts. //VOREStation Edit - 1 by default
|
||||
|
||||
//Some faction information.
|
||||
var/home_system = "Unset" //System of birth.
|
||||
var/citizenship = "None" //Current home system.
|
||||
var/home_system = "Unset" //Current home or residence.
|
||||
var/birthplace = "Unset" //Location of birth.
|
||||
var/citizenship = "None" //Government or similar entity with which you hold citizenship.
|
||||
var/faction = "None" //General associated faction.
|
||||
var/religion = "None" //Religious association.
|
||||
var/antag_faction = "None" //Antag associated faction.
|
||||
|
||||
@@ -12,3 +12,18 @@
|
||||
SScharacter_setup.queue_preferences_save(prefs)
|
||||
|
||||
feedback_add_details("admin_verb","TAlarmLoops") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
/client/verb/toggle_sleep_music()
|
||||
set name = "Toggle Sleeping Music"
|
||||
set category = "Preferences"
|
||||
set desc = "When enabled, you will hear cozy music played during surgery, cryo, and sleeper pod usage."
|
||||
|
||||
var/pref_path = /datum/client_preference/sleep_music
|
||||
|
||||
toggle_preference(pref_path)
|
||||
|
||||
to_chat(src, "You are [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hearing sleeping music while in cryo/surgery/sleeper.")
|
||||
|
||||
SScharacter_setup.queue_preferences_save(prefs)
|
||||
|
||||
feedback_add_details("admin_verb", "TSleepMusic")
|
||||
|
||||
@@ -24,29 +24,66 @@ var/global/list/citizenship_choices = list(
|
||||
)
|
||||
|
||||
var/global/list/home_system_choices = list(
|
||||
"Sol",
|
||||
"Vir",
|
||||
"Nyx",
|
||||
"Tau Ceti",
|
||||
"Qerr'valis",
|
||||
"Earth, Sol",
|
||||
"Luna, Sol",
|
||||
"Mars, Sol",
|
||||
"Venus, Sol",
|
||||
"Titan, Sol",
|
||||
"Kara, Vir",
|
||||
"Sif, Vir",
|
||||
"Brinkburn, Nyx",
|
||||
"Binma, Tau Ceti",
|
||||
"Qerr'balak, Qerr'valis",
|
||||
"Epsilon Ursae Minoris",
|
||||
"Rarkajar"
|
||||
"Meralar, Rarkajar",
|
||||
"Tal, Vilous",
|
||||
"Menhir, Alat-Hahr",
|
||||
"Altam, Vazzend",
|
||||
"Uh'Zata, Kelezakata",
|
||||
"Moghes, Uuoea-Esa",
|
||||
"Xohok, Uuoea-Esa",
|
||||
"Varilak, Antares",
|
||||
"Sanctorum, Sanctum",
|
||||
"Infernum, Sanctum",
|
||||
"Abundance in All Things Serene, Beta-Carnelium Ventrum",
|
||||
"Jorhul, Barkalis",
|
||||
"Shelf Flotilla",
|
||||
"Ue-Orsi Flotilla"
|
||||
)
|
||||
|
||||
var/global/list/faction_choices = list(
|
||||
"Sol Central",
|
||||
"Vey Med",
|
||||
"Einstein Engines",
|
||||
"NanoTrasen Incorporated",
|
||||
"Hephaestus Industries",
|
||||
"Vey-Medical",
|
||||
"Zeng-Hu Pharmaceuticals",
|
||||
"Ward-Takahashi GMC",
|
||||
"Bishop Cybernetics",
|
||||
"Morpheus Cyberkinetics",
|
||||
"Xion Manufacturing Group",
|
||||
"Free Trade Union",
|
||||
"NanoTrasen",
|
||||
"Ward-Takahashi GMB",
|
||||
"Gilthari Exports",
|
||||
"Major Bill's Transportation",
|
||||
"Ironcrest Transport Group",
|
||||
"Grayson Manufactories Ltd.",
|
||||
"Aether Atmospherics",
|
||||
"Zeng-Hu Pharmaceuticals",
|
||||
"Hephaestus Industries",
|
||||
"Morpheus Cyberkinetics",
|
||||
"Xion Manufacturing Group"
|
||||
"Focal Point Energistics",
|
||||
"StarFlight Inc.",
|
||||
"Oculum Broadcasting Network",
|
||||
"Periphery Post",
|
||||
"Free Anur Tribune",
|
||||
"Centauri Provisions",
|
||||
"Einstein Engines",
|
||||
"Wulf Aeronautics",
|
||||
"Gilthari Exports",
|
||||
"Coyote Salvage Corp.",
|
||||
"Chimera Genetics Corp.",
|
||||
"Kitsuhana Heavy Industries",
|
||||
"Independent Pilots Association",
|
||||
"Local System Defense Force",
|
||||
"United Solar Defense Force",
|
||||
"Proxima Centauri Risk Control",
|
||||
"HIVE Security",
|
||||
"Stealth Assault Enterprises"
|
||||
)
|
||||
|
||||
var/global/list/antag_faction_choices = list() //Should be populated after brainstorming. Leaving as blank in case brainstorming does not occur.
|
||||
@@ -76,4 +113,4 @@ var/global/list/religion_choices = list(
|
||||
"Tajr-kii Rarkajar",
|
||||
"Agnosticism",
|
||||
"Deism"
|
||||
)
|
||||
)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
var/directory_ad = "" //Advertisement stuff to show in character directory.
|
||||
var/sensorpref = 5 //Set character's suit sensor level
|
||||
var/capture_crystal = 1 //Whether or not someone is able to be caught with capture crystals
|
||||
var/auto_backup_implant = FALSE //Whether someone starts with a backup implant or not.
|
||||
|
||||
var/job_talon_high = 0
|
||||
var/job_talon_med = 0
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
var/seconds = C.last_activity_seconds()
|
||||
entry += " (AFK - [round(seconds / 60)] minutes, [seconds % 60] seconds)"
|
||||
|
||||
entry += " (<A HREF='?_src_=holder;[HrefToken()];adminmoreinfo=\ref[C.mob]'>?</A>)"
|
||||
entry += " [ADMIN_QUE(C.mob)]"
|
||||
Lines += entry
|
||||
|
||||
for(var/line in sortList(Lines))
|
||||
|
||||
@@ -144,12 +144,12 @@
|
||||
/obj/item/rig_module/vision/meson
|
||||
)
|
||||
|
||||
//Chief Engineer's rig. This is sort of a halfway point between the old hardsuits (voidsuits) and the rig class.
|
||||
//Chief Engineer's rig. This is sort of a halfway point between the old hardsuits (voidsuits) and the rig class. //CHOMPEDIT: if its a mechanized suit its a hardsuit
|
||||
/obj/item/weapon/rig/ce
|
||||
|
||||
name = "advanced voidsuit control module"
|
||||
suit_type = "advanced voidsuit"
|
||||
desc = "An advanced voidsuit that protects against hazardous, low pressure environments. Shines with a high polish."
|
||||
name = "advanced hardsuit control module" //CHOMPEDIT: Hardsuit
|
||||
suit_type = "advanced hardsuit" //CHOMPEDIT: Hardsuit
|
||||
desc = "An advanced hardsuit that protects against hazardous, low pressure environments. Shines with a high polish."//CHOMPEDIT: Hardsuit
|
||||
icon_state = "ce_rig"
|
||||
armor = list(melee = 40, bullet = 10, laser = 30,energy = 25, bomb = 40, bio = 100, rad = 100)
|
||||
slowdown = 0
|
||||
|
||||
@@ -80,6 +80,53 @@
|
||||
new /datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("cannon frame", /obj/item/weapon/cannonframe, 10, time = 15, one_per_turf = 0, on_floor = 0, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("regular floor tile", /obj/item/stack/tile/floor, 1, 4, 20, recycle_material = "[name]"),
|
||||
//Eris Floor tiles- Normal
|
||||
new /datum/stack_recipe_list("eris floors-normal", list(
|
||||
new /datum/stack_recipe("floor tile", /obj/item/stack/tile/floor/eris/steel, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("panel tile", /obj/item/stack/tile/floor/eris/steel/panels, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("techfloor tile", /obj/item/stack/tile/floor/eris/steel/techfloor, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("techfloor tile with vents", /obj/item/stack/tile/floor/eris/steel/techfloor_grid, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("brown perforated tile", /obj/item/stack/tile/floor/eris/steel/brown_perforated, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("gray perforated tile", /obj/item/stack/tile/floor/eris/steel/gray_perforated, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("cargo tile", /obj/item/stack/tile/floor/eris/steel/cargo, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("brown platform tile", /obj/item/stack/tile/floor/eris/steel/brown_platform, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("gray platform tile", /obj/item/stack/tile/floor/eris/steel/gray_platform, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("danger tile", /obj/item/stack/tile/floor/eris/steel/danger, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("golden tile", /obj/item/stack/tile/floor/eris/steel/golden, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("monofloor tile", /obj/item/stack/tile/floor/eris/steel/monofloor, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("bar flat tile", /obj/item/stack/tile/floor/eris/steel/bar_flat, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("bar dance tile", /obj/item/stack/tile/floor/eris/steel/bar_dance, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("bar light tile", /obj/item/stack/tile/floor/eris/steel/bar_light, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe_list("corner tiles", list(
|
||||
new /datum/stack_recipe("blue corner tile", /obj/item/stack/tile/floor/eris/steel/bluecorner, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("orange corner tile", /obj/item/stack/tile/floor/eris/steel/orangecorner, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("cyan corner tile", /obj/item/stack/tile/floor/eris/steel/cyancorner, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("violet corner tile", /obj/item/stack/tile/floor/eris/steel/violetcorener, 1, 4, 20, recycle_material = "[name]"),
|
||||
)),
|
||||
|
||||
)),
|
||||
//Eris Floor tiles- Dark
|
||||
new /datum/stack_recipe_list("eris floors-dark", list(
|
||||
new /datum/stack_recipe("dark floor tile", /obj/item/stack/tile/floor/eris/dark, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark panel tile", /obj/item/stack/tile/floor/eris/dark/panels, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark techfloor tile", /obj/item/stack/tile/floor/eris/dark/techfloor, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark techfloor tile with vents", /obj/item/stack/tile/floor/eris/dark/techfloor_grid, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark brown perforated tile", /obj/item/stack/tile/floor/eris/dark/brown_perforated, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark gray perforated tile", /obj/item/stack/tile/floor/eris/dark/gray_perforated, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark cargo tile", /obj/item/stack/tile/floor/eris/dark/cargo, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark brown platform tile", /obj/item/stack/tile/floor/eris/dark/brown_platform, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark gray platform tile", /obj/item/stack/tile/floor/eris/dark/gray_platform, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark danger tile", /obj/item/stack/tile/floor/eris/dark/danger, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark golden tile", /obj/item/stack/tile/floor/eris/dark/golden, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark monofloor tile", /obj/item/stack/tile/floor/eris/dark/monofloor, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe_list("dark corner tiles", list(
|
||||
new /datum/stack_recipe("dark blue corner tile", /obj/item/stack/tile/floor/eris/dark/bluecorner, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark orange corner tile", /obj/item/stack/tile/floor/eris/dark/orangecorner, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark cyan corner tile", /obj/item/stack/tile/floor/eris/dark/cyancorner, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("dark violet corner tile", /obj/item/stack/tile/floor/eris/dark/violetcorener, 1, 4, 20, recycle_material = "[name]"),
|
||||
)),
|
||||
)),
|
||||
|
||||
new /datum/stack_recipe("roofing tile", /obj/item/stack/tile/roofing, 3, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("metal rod", /obj/item/stack/rods, 1, 2, 60, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("frame parts", /obj/item/frame, 5, time = 25, on_floor = 1, recycle_material = "[name]"),
|
||||
|
||||
@@ -24,6 +24,29 @@
|
||||
new /datum/stack_recipe("reagent dispenser cartridge (small)", /obj/item/weapon/reagent_containers/chem_disp_cartridge/small, 1, on_floor=0, pass_stack_color = TRUE, recycle_material = "[name]"), // 100u
|
||||
new /datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/white, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("freezer floor tile", /obj/item/stack/tile/floor/freezer, 1, 4, 20, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
|
||||
//Eris Floor tiles- white
|
||||
new /datum/stack_recipe_list("eris floors-white", list(
|
||||
new /datum/stack_recipe("white floor tile", /obj/item/stack/tile/floor/eris/white, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white panel tile", /obj/item/stack/tile/floor/eris/white/panels, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white techfloor tile", /obj/item/stack/tile/floor/eris/white/techfloor, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white techfloor tile with vents", /obj/item/stack/tile/floor/eris/white/techfloor_grid, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white brown perforated tile", /obj/item/stack/tile/floor/eris/white/brown_perforated, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white gray perforated tile", /obj/item/stack/tile/floor/eris/white/gray_perforated, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white cargo tile", /obj/item/stack/tile/floor/eris/white/cargo, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white brown platform tile", /obj/item/stack/tile/floor/eris/white/brown_platform, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white gray platform tile", /obj/item/stack/tile/floor/eris/white/gray_platform, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white danger tile", /obj/item/stack/tile/floor/eris/white/danger, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white golden tile", /obj/item/stack/tile/floor/eris/white/golden, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white monofloor tile", /obj/item/stack/tile/floor/eris/white/monofloor, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe_list("white corner tiles", list(
|
||||
new /datum/stack_recipe("white blue corner tile", /obj/item/stack/tile/floor/eris/white/bluecorner, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white orange corner tile", /obj/item/stack/tile/floor/eris/white/orangecorner, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white cyan corner tile", /obj/item/stack/tile/floor/eris/white/cyancorner, 1, 4, 20, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("white violet corner tile", /obj/item/stack/tile/floor/eris/white/violetcorener, 1, 4, 20, recycle_material = "[name]"),
|
||||
)),
|
||||
)),
|
||||
|
||||
new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 4, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 4, time = 25, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
new /datum/stack_recipe("water-cooler", /obj/structure/reagent_dispensers/water_cooler, 4, time = 10, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"),
|
||||
|
||||
@@ -67,11 +67,15 @@
|
||||
init_typing_indicator("[cur_bubble_appearance]_typing")
|
||||
|
||||
if(state && !typing)
|
||||
loc.add_overlay(typing_indicator, TRUE)
|
||||
add_overlay(typing_indicator, TRUE)
|
||||
typing = TRUE
|
||||
typing_indicator_active = typing_indicator
|
||||
else if(typing)
|
||||
loc.cut_overlay(typing_indicator, TRUE)
|
||||
cut_overlay(typing_indicator_active, TRUE)
|
||||
typing = FALSE
|
||||
if(typing_indicator_active != typing_indicator)
|
||||
qdel(typing_indicator_active)
|
||||
typing_indicator_active = null
|
||||
|
||||
return state
|
||||
|
||||
|
||||
@@ -326,7 +326,7 @@ var/list/_simple_mob_default_emotes = list(
|
||||
/mob/living/carbon/human/get_available_emotes()
|
||||
. = global._human_default_emotes.Copy()
|
||||
if(length(species?.default_emotes))
|
||||
. |= species.default_emotes
|
||||
return . | species.default_emotes
|
||||
|
||||
/mob/living/simple_mob/get_available_emotes()
|
||||
. = global._simple_mob_default_emotes.Copy()
|
||||
|
||||
@@ -390,6 +390,7 @@
|
||||
if (R.fields["id"] == E.fields["id"])
|
||||
if(hasHUD(usr,"security"))
|
||||
to_chat(usr, "<b>Name:</b> [R.fields["name"]] <b>Criminal Status:</b> [R.fields["criminal"]]")
|
||||
to_chat(usr, "<b>Species:</b> [R.fields["species"]]")
|
||||
to_chat(usr, "<b>Minor Crimes:</b> [R.fields["mi_crim"]]")
|
||||
to_chat(usr, "<b>Details:</b> [R.fields["mi_crim_d"]]")
|
||||
to_chat(usr, "<b>Major Crimes:</b> [R.fields["ma_crim"]]")
|
||||
@@ -506,6 +507,7 @@
|
||||
if (R.fields["id"] == E.fields["id"])
|
||||
if(hasHUD(usr,"medical"))
|
||||
to_chat(usr, "<b>Name:</b> [R.fields["name"]] <b>Blood Type:</b> [R.fields["b_type"]]")
|
||||
to_chat(usr, "<b>Species:</b> [R.fields["species"]]")
|
||||
to_chat(usr, "<b>DNA:</b> [R.fields["b_dna"]]")
|
||||
to_chat(usr, "<b>Minor Disabilities:</b> [R.fields["mi_dis"]]")
|
||||
to_chat(usr, "<b>Details:</b> [R.fields["mi_dis_d"]]")
|
||||
@@ -587,11 +589,14 @@
|
||||
if (R.fields["id"] == E.fields["id"])
|
||||
if(hasHUD(usr,"best"))
|
||||
to_chat(usr, "<b>Name:</b> [R.fields["name"]]")
|
||||
to_chat(usr, "<b>Species:</b> [R.fields["species"]]")
|
||||
to_chat(usr, "<b>Assignment:</b> [R.fields["real_rank"]] ([R.fields["rank"]])")
|
||||
to_chat(usr, "<b>Home System:</b> [R.fields["home_system"]]")
|
||||
to_chat(usr, "<b>Birthplace:</b> [R.fields["birthplace"]]")
|
||||
to_chat(usr, "<b>Citizenship:</b> [R.fields["citizenship"]]")
|
||||
to_chat(usr, "<b>Primary Employer:</b> [R.fields["personal_faction"]]")
|
||||
to_chat(usr, "<b>Religious Beliefs:</b> [R.fields["religion"]]")
|
||||
to_chat(usr, "<b>Known Languages:</b> [R.fields["languages"]]")
|
||||
to_chat(usr, "<b>Notes:</b> [R.fields["notes"]]")
|
||||
to_chat(usr, "<a href='?src=\ref[src];emprecordComment=`'>\[View Comment Log\]</a>")
|
||||
read = 1
|
||||
|
||||
@@ -54,6 +54,7 @@
|
||||
|
||||
// General information
|
||||
var/home_system = ""
|
||||
var/birthplace = ""
|
||||
var/citizenship = ""
|
||||
var/personal_faction = ""
|
||||
var/religion = ""
|
||||
|
||||
@@ -81,8 +81,8 @@
|
||||
excludes = list(/datum/trait/neutral/autohiss_tajaran, /datum/trait/neutral/autohiss_unathi)
|
||||
|
||||
/datum/trait/neutral/gargoyle
|
||||
name = "Gargoyle"
|
||||
desc = "You turn into a statue at will, but also whenever you run out of energy. Being a statue replenishes your energy slowly."
|
||||
name = "Gargoyle (adjustable)"
|
||||
desc = "You turn into a statue (or similiar) at will, but also whenever you run out of energy. Being a statue replenishes your energy slowly."
|
||||
cost = 0
|
||||
custom_only = FALSE //slimes, xenochimera, diona, proteans, etc, basically anything but custom doesn't make sense (as much as I wanna play a petrifying slime)
|
||||
//Nah makes perfect sense, they could just be gene modded, not to mention we can expand this to have the statue and description of it renameable as well as color adjustable, to support general petrification
|
||||
|
||||
@@ -464,7 +464,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
|
||||
if(hide_underwear[category])
|
||||
continue
|
||||
var/datum/category_item/underwear/UWI = all_underwear[category]
|
||||
var/image/wear = UWI.generate_image(all_underwear_metadata[category], layer = BODY_LAYER+UNDERWEAR_LAYER)
|
||||
var/image/wear = UWI.generate_image(all_underwear_metadata[category], layer = BODY_LAYER+UNDERWEAR_LAYER, digitigrade = digitigrade) //CHOMPEdit
|
||||
overlays_standing[UNDERWEAR_LAYER] += wear
|
||||
|
||||
apply_layer(UNDERWEAR_LAYER)
|
||||
|
||||
@@ -58,5 +58,10 @@
|
||||
|
||||
/mob/living/simple_mob/animal/sif/siffet/IIsAlly(mob/living/L)
|
||||
. = ..()
|
||||
if(!. && L.mob_size > 10) //Attacks things it considers small enough to take on, otherwise only attacks if attacked.
|
||||
return TRUE
|
||||
//CHOMPADDIITON: Compatibility with structures
|
||||
if(!. && isnull(L.mob_size))
|
||||
return TRUE
|
||||
//CHOMPADDIITON: Compatibility with structures
|
||||
else
|
||||
if(!. && L.mob_size > 10) //Attacks things it considers small enough to take on, otherwise only attacks if attacked.
|
||||
return TRUE
|
||||
|
||||
@@ -218,6 +218,7 @@
|
||||
|
||||
var/typing
|
||||
var/obj/effect/decal/typing_indicator
|
||||
var/obj/effect/decal/typing_indicator_active
|
||||
var/cur_typing_indicator
|
||||
var/custom_speech_bubble = "default"
|
||||
|
||||
|
||||
@@ -494,6 +494,12 @@
|
||||
AnnounceArrival(character, rank, join_message, announce_channel, character.z)
|
||||
data_core.manifest_inject(character)
|
||||
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
|
||||
if(ishuman(character))
|
||||
if(character.client.prefs.auto_backup_implant)
|
||||
var/obj/item/weapon/implant/backup/imp = new(src)
|
||||
|
||||
if(imp.handle_implant(character,character.zone_sel.selecting))
|
||||
imp.post_implant(character)
|
||||
var/gut = join_props["voreny"]
|
||||
var/mob/living/prey = join_props["prey"]
|
||||
//CHOMPEdit Start - Item TF
|
||||
@@ -520,7 +526,6 @@
|
||||
if(gut)
|
||||
character.forceMove(gut)
|
||||
|
||||
|
||||
qdel(src) // Delete new_player mob
|
||||
|
||||
/mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message, var/channel, var/zlevel)
|
||||
|
||||
@@ -259,8 +259,8 @@
|
||||
mannequin.delete_inventory(TRUE)
|
||||
dress_preview_mob(mannequin)
|
||||
mannequin.update_transform() //VOREStation Edit to update size/shape stuff.
|
||||
mannequin.toggle_tail(setting = TRUE)
|
||||
mannequin.toggle_wing(setting = TRUE)
|
||||
mannequin.toggle_tail(setting = animations_toggle)
|
||||
mannequin.toggle_wing(setting = animations_toggle)
|
||||
mannequin.update_tail_showing()
|
||||
mannequin.ImmediateOverlayUpdate()
|
||||
|
||||
|
||||
@@ -906,4 +906,12 @@
|
||||
/datum/sprite_accessory/ears/syrishroom
|
||||
name = "Orange Mushroom Cap"
|
||||
icon = 'icons/mob/vore/ears_vr.dmi'
|
||||
icon_state = "syrishroom"
|
||||
icon_state = "syrishroom"
|
||||
|
||||
/datum/sprite_accessory/ears/singlesidehorn
|
||||
name = "Single Side Horn"
|
||||
desc = ""
|
||||
icon = 'icons/mob/vore/ears_vr.dmi'
|
||||
icon_state = "single-side-horn"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
@@ -886,3 +886,19 @@
|
||||
body_parts = list(BP_L_FOOT,BP_R_FOOT)
|
||||
hide_body_parts = list(BP_L_FOOT,BP_R_FOOT)
|
||||
organ_override = TRUE
|
||||
|
||||
/datum/sprite_accessory/marking/vr_unathi_blocky_head
|
||||
name = "Unathi alt head (Blocky)"
|
||||
icon = 'icons/mob/human_races/markings_vr.dmi'
|
||||
icon_state = "unathi_blocky_head"
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
body_parts = list(BP_HEAD)
|
||||
hide_body_parts = list(BP_HEAD)
|
||||
organ_override = TRUE
|
||||
|
||||
/datum/sprite_accessory/marking/vr_unathi_blocky_head_eyes
|
||||
name = "Unathi alt head eyes (Blocky)"
|
||||
icon = 'icons/mob/human_races/markings_vr.dmi'
|
||||
icon_state = "unathi_blocky_head_eyes"
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
body_parts = list(BP_HEAD)
|
||||
@@ -1321,6 +1321,13 @@
|
||||
hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case.
|
||||
clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi'
|
||||
clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms.
|
||||
|
||||
/datum/sprite_accessory/tail/blade_like_tail
|
||||
name = "Blade-like Tail"
|
||||
icon = 'icons/mob/vore/tails_vr.dmi'
|
||||
icon_state = "blade-like-tail"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
//LONG TAILS ARE NOT TAUR BUTTS >:O
|
||||
/datum/sprite_accessory/tail/longtail
|
||||
|
||||
@@ -157,6 +157,13 @@
|
||||
icon_state = "soghun_dubhorns"
|
||||
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
|
||||
|
||||
/datum/sprite_accessory/hair/una_quinthorns
|
||||
name = "Quintiple Unathi Horns"
|
||||
icon = 'icons/mob/human_face_vr.dmi'
|
||||
icon_add = 'icons/mob/human_face_vr_add.dmi'
|
||||
icon_state = "unathi_quintiple_horns"
|
||||
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
|
||||
|
||||
/datum/sprite_accessory/hair/taj_ears
|
||||
name = "Tajaran Ears"
|
||||
icon_state = "ears_plain"
|
||||
|
||||
@@ -24,3 +24,12 @@
|
||||
icon_state = "snail_shell"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
/datum/sprite_accessory/wing/dragon2
|
||||
name = "Dragon wings, large, colorable"
|
||||
desc = ""
|
||||
icon = 'modular_chomp/icons/mob/human_races/sprite_accessories/wings.dmi'
|
||||
icon_state = "dragon_2"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "dragon_2_mark"
|
||||
@@ -296,3 +296,11 @@
|
||||
desc = ""
|
||||
icon = 'icons/mob/vore/wings_vr.dmi'
|
||||
icon_state = "dragonfly_tesh"
|
||||
|
||||
/datum/sprite_accessory/wing/snail_shell
|
||||
name = "snail shell, colorable"
|
||||
desc = ""
|
||||
icon_state = "snail_shell"
|
||||
do_colouration = 1
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
extra_overlay = "snail_shell_markings"
|
||||
|
||||
@@ -35,9 +35,13 @@
|
||||
if(state && !typing)
|
||||
add_overlay(typing_indicator, TRUE)
|
||||
typing = TRUE
|
||||
typing_indicator_active = typing_indicator
|
||||
else if(typing)
|
||||
cut_overlay(typing_indicator, TRUE)
|
||||
cut_overlay(typing_indicator_active, TRUE)
|
||||
typing = FALSE
|
||||
if(typing_indicator_active != typing_indicator)
|
||||
qdel(typing_indicator_active)
|
||||
typing_indicator_active = null
|
||||
|
||||
return state
|
||||
|
||||
|
||||
@@ -203,6 +203,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
|
||||
persist_nif_data(human)
|
||||
|
||||
if(durability <= 0)
|
||||
durability = 0 //failsafe us to a minimum of 0% so we don't just wash into massively negative durability from repeated EMPs
|
||||
stat = NIF_TEMPFAIL
|
||||
update_icon()
|
||||
|
||||
@@ -230,6 +231,11 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
|
||||
if(C.get_amount() < 3)
|
||||
to_chat(user,"<span class='warning'>You need at least three coils of wire to add them to \the [src].</span>")
|
||||
return
|
||||
if(durability >= initial(durability))
|
||||
to_chat(user,"<span class='notice'>There's no damaged wiring that needs replacing!</span>")
|
||||
open = 3
|
||||
update_icon()
|
||||
return
|
||||
if(do_after(user, 6 SECONDS, src) && open == 1 && C.use(3))
|
||||
user.visible_message("[user] replaces some wiring in \the [src].","<span class='notice'>You replace any burned out wiring in \the [src].</span>")
|
||||
playsound(src, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
|
||||
@@ -89,6 +89,15 @@ var/global/list/limb_icon_cache = list()
|
||||
mark_s.Blend(markings[M]["color"], mark.color_blend_mode) // VOREStation edit
|
||||
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
|
||||
icon_cache_key = "[M][markings[M]["color"]]"
|
||||
for(var/MM in markings)
|
||||
var/datum/sprite_accessory/marking/mark_style = markings[MM]["datum"]
|
||||
if(mark_style.organ_override)
|
||||
continue
|
||||
var/icon/mark_s_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
|
||||
mark_s.Blend(markings[MM]["color"], mark_style.color_blend_mode) // VOREStation edit
|
||||
add_overlay(mark_s_s) //So when it's not on your body, it has icons
|
||||
mob_icon.Blend(mark_s_s, ICON_OVERLAY) //So when it's on your body, it has icons
|
||||
icon_cache_key += "[MM][markings[MM]["color"]]"
|
||||
|
||||
dir = EAST
|
||||
icon = mob_icon
|
||||
|
||||
@@ -45,7 +45,7 @@ When editing the list, please try and keep similar probabilities near each other
|
||||
prob(50); "[info] Lost on the map? You can find In-Character help by speaking on the Common Radio. You can do this by pressing F3 and typing ' ; ' before your message. Your fellow co-workers will likely help. If OOC help is preferred, press F1 for mentorhelp. ",
|
||||
prob(50); "[info] You may set your suit sensors by clicking on the icon in the bottom left corner, then right click the clothes that appear right above it. It is recommended to turn on suit sensors to 'TRACKING' before doing anything dangerous like mining, and to turn them off before digestion scenes as prey.",
|
||||
prob(35); "[info] You can insert your I.D into your PDA. This frees up your belt from having to carry your PDA. Furthermore, by clicking and dragging the PDA to game screen, you can use it without holding it!",
|
||||
prob(35); "[info] It is never a bad idea to visit the medbay if you get injured - small burns and cuts can get infected and become harder to treat! If there is no medical staff, bathrooms and the bar often has a NanoMed on the wall - with ointments to disinfect cuts and burns, bandages to treat bruises and encourage healing.",
|
||||
prob(35); "[info] It is never a bad idea to visit the medbay if you get injured - small burns and cuts can get infected and become harder to treat! Alternatively, bathrooms and the bar often has a NanoMed on the wall - with ointments to disinfect cuts and burns, bandages to treat bruises and encourage healing.",
|
||||
prob(35); "[info] Your vore-bellies have multiple add-ons! Muffling is excellent to ensure your prey does not accidentally inform everyone about their predicament, and jam suit sensors is a great courtesy to avoid medical being worried about your prey!",
|
||||
prob(25); "[info] Two control modes exist for SS13 - hotkey ON and hotkey OFF. You can swap between the two modes by pressing TAB. In hotkey mode, to chat you need to press T to say anything which creates a small talking bubble. You can consult our list of hotkeys at https://wiki.vore-station.net/Keyboard_Shortcuts",
|
||||
prob(25); "[info] Do you want to shift your character around, for instance to appear as if leaning on the wall? Press CTRL + SHIFT + arrow keys to do so! Moving resets this.",
|
||||
@@ -59,6 +59,7 @@ When editing the list, please try and keep similar probabilities near each other
|
||||
var/info = "The following is a roleplay-focused tip to playing on VOREStation \n"
|
||||
return pick(
|
||||
prob(45); "[info] Our server has a strong 'Bystander Consent' policy, meaning that scenes are expected to be mindful of the preferences of those around them in public, not just their partners. When in doubt, keep it subtle, and communicate via looc!",
|
||||
prob(40); "[info] Sometimes, players may possess creatures that look like monsters or wild animals (e.g: defanged xenomorphs). These are called 'maint preds' and if you encounter them - you should avoid drawing attention to their existence over the radio! They're here to create unique vore scenarios, not to be treated as antags.",
|
||||
prob(40); "[info] Please avoid a character that knows everything. Having only a small set of jobs you are capable of doing can help flesh out your character! It's OK for things to break and fail if nobody is around to fix it - you do not need to do others' jobs.",
|
||||
prob(40); "[info] Just because you see something doesn't mean your character has to. A courtesy 'missing' of contraband or scene details can go a long way towards preserving everyone's fun!",
|
||||
prob(40); "[info] Embrace the limits of your character's skillsets! Seeking out other players to help you with a more challenging task might build friendships, or even lead to a scene!",
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
if(strength > strength_upper_limit)
|
||||
strength = strength_upper_limit
|
||||
else
|
||||
message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](<A HREF='?_src_=holder;[HrefToken()];adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)][ADMIN_QUE(usr)] in [ADMIN_COORDJMP(src)]",0,1)
|
||||
log_game("PACCEL([x],[y],[z]) [key_name(usr)] increased to [strength]")
|
||||
investigate_log("increased to <font color='red'>[strength]</font> by [usr.key]","singulo")
|
||||
strength_change()
|
||||
@@ -99,7 +99,7 @@
|
||||
if(strength < 0)
|
||||
strength = 0
|
||||
else
|
||||
message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)](<A HREF='?_src_=holder;[HrefToken()];adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)][ADMIN_QUE(usr)] in [ADMIN_COORDJMP(src)]",0,1)
|
||||
log_game("PACCEL([x],[y],[z]) [key_name(usr)] decreased to [strength]")
|
||||
investigate_log("decreased to <font color='green'>[strength]</font> by [usr.key]","singulo")
|
||||
strength_change()
|
||||
@@ -184,7 +184,7 @@
|
||||
/obj/machinery/particle_accelerator/control_box/proc/toggle_power()
|
||||
active = !active
|
||||
investigate_log("turned [active?"<font color='red'>ON</font>":"<font color='green'>OFF</font>"] by [usr ? usr.key : "outside forces"]","singulo")
|
||||
message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name(usr, usr.client) : "outside forces"](<A HREF='?_src_=holder;[HrefToken()];adminmoreinfo=\ref[usr]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name(usr, usr.client) : "outside forces"][ADMIN_QUE(usr)] in [ADMIN_COORDJMP(src)]",0,1)
|
||||
log_game("PACCEL([x],[y],[z]) [usr ? key_name(usr, usr.client) : "outside forces"] turned [active?"ON":"OFF"].")
|
||||
if(active)
|
||||
update_use_power(USE_POWER_ACTIVE)
|
||||
|
||||
@@ -325,7 +325,7 @@
|
||||
return
|
||||
if(isnum(angle))
|
||||
setAngle(angle)
|
||||
var/turf/starting = get_turf(src)
|
||||
starting = get_turf(src)
|
||||
if(isnull(Angle)) //Try to resolve through offsets if there's no angle set.
|
||||
if(isnull(xo) || isnull(yo))
|
||||
stack_trace("WARNING: Projectile [type] deleted due to being unable to resolve a target after angle was null!")
|
||||
|
||||
@@ -58,12 +58,11 @@
|
||||
required_reagents = list("unsorbitol" = 1, "phoron" = 1)
|
||||
result_amount = 2
|
||||
|
||||
/decl/chemical_reaction/instant/galactose
|
||||
name = "Galactose"
|
||||
id = "galactose"
|
||||
result = "galactose"
|
||||
required_reagents = list("milk" = 1, "sacid" = 1)
|
||||
result_amount = 3
|
||||
/decl/chemical_reaction/instant/glucose
|
||||
name = "Glucose"
|
||||
result = "glucose"
|
||||
required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1)
|
||||
result_amount = 1
|
||||
///SAP RECIPES//////
|
||||
|
||||
/decl/chemical_reaction/instant/myelamine_sap //This is the clotting agent used by clotting packs.
|
||||
|
||||
@@ -194,21 +194,3 @@
|
||||
chem_effective = 0.75
|
||||
if(alien != IS_DIONA)
|
||||
M.heal_organ_damage(12 * removed * chem_effective, 0)
|
||||
|
||||
/datum/reagent/nutriment/glucose/galactose
|
||||
name = "Galactose"
|
||||
id = "galactose"
|
||||
description = "A clear sweet tasting fluid derived from lactose that is not as dense as glucose for IV application"
|
||||
nutriment_factor = 5 //1/6 of glucose
|
||||
taste_description = "sweetness"
|
||||
color = "#ffffff"
|
||||
overdose = 45
|
||||
|
||||
/datum/reagent/nutriment/glucose/galactose/overdose(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
..()
|
||||
M.eye_blurry = min(20, max(0, M.eye_blurry + 10))
|
||||
if(prob(10)) // 1 in 10 per tick
|
||||
var/mob/living/carbon/human/H = M
|
||||
var/obj/item/organ/internal/brain/br = H.internal_organs_by_name[O_BRAIN] //Give brain damage spaceman, AKA no change at all
|
||||
br?.take_damage(1)
|
||||
to_chat(M, "<span class='warning'>You feel extremely jittery!</span>")
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
entries += list(list("name" = "Name", "value" = S.registered_name))
|
||||
entries += list(list("name" = "Photo", "value" = "Update"))
|
||||
entries += list(list("name" = "Sex", "value" = S.sex))
|
||||
entries += list(list("name" = "Species", "value" = S.species))
|
||||
entries += list(list("name" = "Factory Reset", "value" = "Use With Care"))
|
||||
data["entries"] = entries
|
||||
|
||||
@@ -119,6 +120,12 @@
|
||||
S.sex = new_sex
|
||||
to_chat(usr, "<span class='notice'>Sex changed to '[new_sex]'.</span>")
|
||||
. = TRUE
|
||||
if("species")
|
||||
var/new_species = sanitize(tgui_input_text(usr,"What species would you like to put on this card?","Agent Card Species", S.species))
|
||||
if(!isnull(new_species) && tgui_status(usr, state) == STATUS_INTERACTIVE)
|
||||
S.species = new_species
|
||||
to_chat(usr, "<span class='notice'>Species changed to '[new_species]'.</span>")
|
||||
. = TRUE
|
||||
if("factoryreset")
|
||||
if(tgui_alert(usr, "This will factory reset the card, including access and owner. Continue?", "Factory Reset", list("No", "Yes")) == "Yes" && tgui_status(usr, state) == STATUS_INTERACTIVE)
|
||||
S.age = initial(S.age)
|
||||
@@ -136,6 +143,7 @@
|
||||
S.registered_name = initial(S.registered_name)
|
||||
S.unset_registered_user()
|
||||
S.sex = initial(S.sex)
|
||||
S.species = initial(S.species)
|
||||
S.update_icon()
|
||||
to_chat(usr, "<span class='notice'>All information has been deleted from \the [src].</span>")
|
||||
. = TRUE
|
||||
|
||||
@@ -348,7 +348,7 @@
|
||||
if(special_entrance_sound) //CHOMPEdit: Custom sound set by mob's init_vore or ingame varedits.
|
||||
soundfile = special_entrance_sound
|
||||
if(soundfile)
|
||||
playsound(src, soundfile, vol = sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE) //CHOPEdit
|
||||
playsound(src, soundfile, vol = sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE) //CHOMPEdit
|
||||
recent_sound = TRUE
|
||||
|
||||
//Messages if it's a mob
|
||||
@@ -373,7 +373,7 @@
|
||||
var/taste
|
||||
if(can_taste && (taste = M.get_taste_message(FALSE)))
|
||||
to_chat(owner, "<span class='notice'>[M] tastes of [taste].</span>")
|
||||
vore_fx(M)
|
||||
vore_fx(M, TRUE) //CHOMPEdit: update belleh
|
||||
owner.update_fullness() //CHOMPEdit - This is run whenever a belly's contents are changed.
|
||||
//Stop AI processing in bellies
|
||||
if(M.ai_holder)
|
||||
@@ -638,6 +638,8 @@
|
||||
|
||||
if(prey.ckey)
|
||||
GLOB.prey_eaten_roundstat++
|
||||
if(owner.mind)
|
||||
owner.mind.vore_prey_eaten++
|
||||
|
||||
// Get the line that should show up in Examine message if the owner of this belly
|
||||
// is examined. By making this a proc, we not only take advantage of polymorphism,
|
||||
|
||||
@@ -90,6 +90,16 @@
|
||||
digest_stage = w_class
|
||||
else
|
||||
GLOB.items_digested_roundstat++
|
||||
if(isbelly(item_storage)) //CHOMPEdit Start
|
||||
var/obj/belly/B = item_storage
|
||||
var/soundfile
|
||||
if(w_class >= 4)
|
||||
soundfile = pick('sound/vore/shortgurgles/gurgle_L1.ogg', 'sound/vore/shortgurgles/gurgle_L2.ogg', 'sound/vore/shortgurgles/gurgle_L3.ogg')
|
||||
else if(w_class >= 3)
|
||||
soundfile = pick('sound/vore/shortgurgles/gurgle_M1.ogg', 'sound/vore/shortgurgles/gurgle_M2.ogg', 'sound/vore/shortgurgles/gurgle_M3.ogg')
|
||||
else
|
||||
soundfile = pick('sound/vore/shortgurgles/gurgle_S1.ogg', 'sound/vore/shortgurgles/gurgle_S2.ogg', 'sound/vore/shortgurgles/gurgle_S3.ogg')
|
||||
playsound(src, soundfile, vol = B.sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises, volume_channel = VOLUME_CHANNEL_VORE) //CHOMPEdit End
|
||||
qdel(src)
|
||||
if(g_damage > w_class)
|
||||
return w_class
|
||||
|
||||
@@ -619,11 +619,13 @@
|
||||
host.show_vore_fx = !host.show_vore_fx
|
||||
if(host.client.prefs_vr)
|
||||
host.client.prefs_vr.show_vore_fx = host.show_vore_fx
|
||||
if(!host.show_vore_fx)
|
||||
if (isbelly(host.loc)) //CHOMPEdit
|
||||
var/obj/belly/B = host.loc
|
||||
B.vore_fx(host, TRUE)
|
||||
else
|
||||
host.clear_fullscreen("belly")
|
||||
//host.clear_fullscreen("belly2") //For multilayered stomachs. Not currently implemented.
|
||||
if(!host.hud_used.hud_shown)
|
||||
host.toggle_hud_vis()
|
||||
if(!host.hud_used.hud_shown)
|
||||
host.toggle_hud_vis()
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
if("toggle_noisy")
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
var/mob/living/silicon/robot/R = user
|
||||
for (var/obj/item/weapon/cell/D in R.contents)
|
||||
D.charge += rand() * 100 + 50
|
||||
to_chat(R, "<font color='blue'>SYSTEM ALERT: Large energy boost detected!</font>")
|
||||
to_chat(R, "<span class='notice'>SYSTEM ALERT: Large energy boost detected!</span>")
|
||||
|
||||
|
||||
/datum/artifact_effect/cellcharge/DoEffectAura()
|
||||
@@ -22,21 +22,28 @@
|
||||
if(!turf)
|
||||
return
|
||||
for (var/obj/machinery/power/apc/apc as anything in GLOB.apcs)
|
||||
if (apc.z != turf.z)
|
||||
continue
|
||||
if(get_dist(turf, apc) <= 200)
|
||||
for (var/obj/item/weapon/cell/cell in apc.contents)
|
||||
cell.charge += 25
|
||||
for (var/obj/machinery/power/smes/smes as anything in GLOB.smeses)
|
||||
if (smes.z != turf.z)
|
||||
continue
|
||||
if(get_dist(turf, smes) <= effectrange)
|
||||
smes.charge += 25
|
||||
var/charged_robots
|
||||
for (var/mob/living/silicon/robot/robot as anything in global.silicon_mob_list)
|
||||
if(turf.z != robot.z)
|
||||
continue
|
||||
if(get_dist(turf, robot) < 50)
|
||||
var/charged_cells
|
||||
for (var/obj/item/weapon/cell/cell in robot.contents)
|
||||
cell.charge += 25
|
||||
charged_cells = TRUE
|
||||
if(charged_cells)
|
||||
to_chat(robot, "<font color='blue'>SYSTEM ALERT: Energy boost detected!</font>")
|
||||
if(world.time - last_message > 200)
|
||||
to_chat(robot, "<span class='notice'>SYSTEM ALERT: Energy boost detected!</span>")
|
||||
charged_robots = TRUE
|
||||
if(charged_robots)
|
||||
last_message = world.time
|
||||
@@ -55,5 +62,5 @@
|
||||
for (var/obj/item/weapon/cell/D in M.contents)
|
||||
D.charge += rand() * 100
|
||||
if(world.time - last_message > 200)
|
||||
to_chat(M, "<font color='blue'>SYSTEM ALERT: Energy boost detected!</font>")
|
||||
to_chat(M, "<span class='notice'>SYSTEM ALERT: Energy boost detected!</span>")
|
||||
last_message = world.time
|
||||
|
||||
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 159 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 48 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 7.3 KiB |
@@ -13,6 +13,7 @@
|
||||
#include "pois/outdoors12.dmm"
|
||||
#include "pois/outdoors13.dmm"
|
||||
#include "pois/outdoors14.dmm"
|
||||
#include "pois/outdoors16.dmm"
|
||||
|
||||
#include "pois/cave1.dmm"
|
||||
#include "pois/cave2.dmm"
|
||||
@@ -220,6 +221,7 @@
|
||||
mappath = 'pois/outdoors1.dmm'
|
||||
cost = 10
|
||||
allow_duplicates = TRUE
|
||||
|
||||
/datum/map_template/groundbase/outdoor/thing2
|
||||
name = "Outdoors2"
|
||||
mappath = 'pois/outdoors2.dmm'
|
||||
@@ -267,6 +269,10 @@
|
||||
name = "Outdoors15"
|
||||
mappath = 'pois/outdoors15.dmm'
|
||||
allow_duplicates = FALSE
|
||||
/datum/map_template/groundbase/outdoor/thing16
|
||||
name = "Outdoors16"
|
||||
mappath = 'pois/outdoors16.dmm'
|
||||
allow_duplicates = FALSE
|
||||
|
||||
/datum/map_template/groundbase/maintcaves/cave
|
||||
name = "Cave 1"
|
||||
|
||||
@@ -0,0 +1,221 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chip/nacho/cheese,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
"b" = (
|
||||
/obj/item/weapon/reagent_containers/food/snacks/chip/nacho/salsa,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
"c" = (
|
||||
/obj/random/drinkbottle,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
"d" = (
|
||||
/obj/structure/table/wooden_reinforced,
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/cat/filled{
|
||||
pixel_y = 8
|
||||
},
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/nymph/filled,
|
||||
/obj/item/clothing/suit/leathercoat{
|
||||
desc = "Who would use a leather coat as a tablecloth?!";
|
||||
name = "Tablecloth?!";
|
||||
pixel_x = 5
|
||||
},
|
||||
/obj/item/clothing/suit/greatcoat{
|
||||
desc = "This great coat appears covered in food! Did... it get stolen and reused as ... ?!";
|
||||
name = "Tablecloth?";
|
||||
pixel_x = -9
|
||||
},
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow,
|
||||
/area/template_noop)
|
||||
"g" = (
|
||||
/obj/effect/decal/cleanable/fruit_smudge,
|
||||
/obj/item/weapon/storage/mre/random,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow,
|
||||
/area/template_noop)
|
||||
"h" = (
|
||||
/obj/structure/table/bench/wooden,
|
||||
/obj/effect/decal/cleanable/filth,
|
||||
/obj/random/mob/wildscugs{
|
||||
newdesc = "A wild catslug enjoying the simpler things in life: a picnic!";
|
||||
newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug")
|
||||
},
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow,
|
||||
/area/template_noop)
|
||||
"i" = (
|
||||
/obj/structure/table/wooden_reinforced,
|
||||
/obj/random/pizzabox,
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/mars/filled{
|
||||
pixel_x = -10;
|
||||
pixel_y = 11
|
||||
},
|
||||
/obj/item/weapon/bedsheet/rd{
|
||||
desc = "Is this Nubbins' doing?!";
|
||||
name = "Strange tablecloth";
|
||||
pixel_x = 11;
|
||||
pixel_y = 12
|
||||
},
|
||||
/obj/random/mug,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow,
|
||||
/area/template_noop)
|
||||
"k" = (
|
||||
/obj/random/drinkbottle,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow,
|
||||
/area/template_noop)
|
||||
"m" = (
|
||||
/obj/random/coin,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
"n" = (
|
||||
/obj/effect/decal/cleanable/filth,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow,
|
||||
/area/template_noop)
|
||||
"p" = (
|
||||
/obj/random/junk,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
"s" = (
|
||||
/obj/structure/table/bench/wooden,
|
||||
/obj/random/mob/wildscugs{
|
||||
newdesc = "A wild catslug enjoying the simpler things in life: a picnic!";
|
||||
newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug")
|
||||
},
|
||||
/obj/item/weapon/ore/diamond{
|
||||
name = "porl"
|
||||
},
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow,
|
||||
/area/template_noop)
|
||||
"t" = (
|
||||
/obj/item/pizzavoucher,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
"w" = (
|
||||
/obj/item/trash/chipbasket,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
"z" = (
|
||||
/obj/random/drinksoft,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow,
|
||||
/area/template_noop)
|
||||
"A" = (
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
"F" = (
|
||||
/obj/structure/table/bench/wooden,
|
||||
/obj/random/mob/wildscugs{
|
||||
newdesc = "A wild catslug enjoying the simpler things in life: a picnic!";
|
||||
newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug")
|
||||
},
|
||||
/obj/item/weapon/material/twohanded/spear/foam{
|
||||
desc = "The only way you can hunt things with this is by tickling them to death.";
|
||||
name = "squishy foam spear"
|
||||
},
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow,
|
||||
/area/template_noop)
|
||||
"J" = (
|
||||
/obj/structure/table/bench/wooden,
|
||||
/obj/random/mob/wildscugs{
|
||||
newdesc = "A wild catslug enjoying the simpler things in life: a picnic!";
|
||||
newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug")
|
||||
},
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow,
|
||||
/area/template_noop)
|
||||
"L" = (
|
||||
/obj/effect/decal/remains/lizard,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
"N" = (
|
||||
/obj/structure/table/wooden_reinforced,
|
||||
/obj/item/weapon/bedsheet/hosdouble{
|
||||
desc = "Odd, this tablecloth looks... suspiciously like the bedsheets NanoTrasen security staff use!";
|
||||
name = "Picnic Blanket"
|
||||
},
|
||||
/obj/item/weapon/bedsheet/hosdouble{
|
||||
desc = "Odd, this tablecloth looks... suspiciously like the bedsheets NanoTrasen security staff use!";
|
||||
name = "Picnic Blanket";
|
||||
pixel_x = 11
|
||||
},
|
||||
/obj/item/weapon/storage/toolbox/lunchbox/heart/filled,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow,
|
||||
/area/template_noop)
|
||||
"O" = (
|
||||
/obj/structure/table/bench/wooden,
|
||||
/obj/random/mob/wildscugs{
|
||||
newdesc = "A wild catslug enjoying the simpler things in life: a picnic!";
|
||||
newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug")
|
||||
},
|
||||
/obj/random/mug,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow,
|
||||
/area/template_noop)
|
||||
"Q" = (
|
||||
/obj/random/cigarettes,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
"S" = (
|
||||
/obj/structure/table/bench/wooden,
|
||||
/obj/item/weapon/towel/random,
|
||||
/obj/random/mob/wildscugs{
|
||||
newdesc = "A wild catslug enjoying the simpler things in life: a picnic!";
|
||||
newname = list("happy catslug", "rotund catslug", "anxious catslug", "angry Catslug", "content Catslug", "sad catslug")
|
||||
},
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow,
|
||||
/area/template_noop)
|
||||
"T" = (
|
||||
/obj/effect/decal/cleanable/tomato_smudge,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow,
|
||||
/area/template_noop)
|
||||
"Y" = (
|
||||
/obj/random/drinksoft,
|
||||
/turf/simulated/floor/outdoors/grass/seasonal/nomobs,
|
||||
/area/template_noop)
|
||||
|
||||
(1,1,1) = {"
|
||||
c
|
||||
A
|
||||
A
|
||||
A
|
||||
A
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
T
|
||||
n
|
||||
n
|
||||
Y
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
Q
|
||||
s
|
||||
h
|
||||
J
|
||||
w
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
L
|
||||
N
|
||||
d
|
||||
i
|
||||
b
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
t
|
||||
F
|
||||
O
|
||||
S
|
||||
m
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
L
|
||||
z
|
||||
g
|
||||
k
|
||||
A
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
A
|
||||
A
|
||||
A
|
||||
A
|
||||
p
|
||||
"}
|
||||
@@ -54,6 +54,109 @@
|
||||
/mob/living/simple_mob/tomato/space/Process_Spacemove(var/check_drift = 0)
|
||||
return TRUE
|
||||
|
||||
//Begin tourist ship stuff
|
||||
/mob/living/simple_mob/animal/giant_spider/space
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
|
||||
/mob/living/simple_mob/animal/giant_spider/space/Process_Spacemove(var/check_drift = 0)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_mob/animal/giant_spider/nurse/space
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
|
||||
/mob/living/simple_mob/animal/giant_spider/nurse/space/Process_Spacemove(var/check_drift = 0)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_mob/animal/giant_spider/hunter/space
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
|
||||
/mob/living/simple_mob/animal/giant_spider/hunter/space/Process_Spacemove(var/check_drift = 0)
|
||||
return TRUE
|
||||
|
||||
/mob/living/simple_mob/animal/giant_spider/tunneler/space
|
||||
min_oxy = 0
|
||||
max_oxy = 0
|
||||
min_tox = 0
|
||||
max_tox = 0
|
||||
min_co2 = 0
|
||||
max_co2 = 0
|
||||
min_n2 = 0
|
||||
max_n2 = 0
|
||||
minbodytemp = 0
|
||||
|
||||
/mob/living/simple_mob/animal/giant_spider/tunneler/space/Process_Spacemove(var/check_drift = 0)
|
||||
return TRUE
|
||||
|
||||
/obj/structure/ghost_pod/manual/survivor/spidership
|
||||
name = "Damaged Emergency Cryopod"
|
||||
desc = "A damaged cryopod smeared with blood. An badly injured body seems frozen in time within."
|
||||
occupant_type = "survivor aboard a spider infested ship"
|
||||
|
||||
start_injured = TRUE
|
||||
suffer_brute = TRUE //default damage of 3d20 brute where each dice is rolled for a separate limb is good
|
||||
suffer_burn = TRUE
|
||||
burn_severity = 15 //Rapid cooling will give frostbite
|
||||
burn_instances = 1 //Burning them once for up to 15 burn. Done to increase risk of infection
|
||||
suffer_toxloss = TRUE
|
||||
tox_severity = 5
|
||||
//Damage is minimum 3 brute, 1 burn, 1 toxloss, maximum 60 brute, 15 burn, 5 toxloss - near crit, but still able to walk.
|
||||
|
||||
|
||||
|
||||
/obj/item/device/taperecorder/tourist
|
||||
name = "Body-Microphone"
|
||||
desc = "A sort of liability device worn by security on luxury yachts. Records everything they say. Strange that the captain was wearing it."
|
||||
mytape = /obj/item/device/tape/touristguard
|
||||
|
||||
/obj/item/device/tape/touristguard/New()
|
||||
storedinfo += "01:37 *sounds of metal creaking"
|
||||
storedinfo += "01:55 *sounds of distant screaming!"
|
||||
storedinfo += "01:37 *Sounds of hissing, both airlocks and spiders alike. Screaming continues."
|
||||
storedinfo += "06:03 a mechanical voice - perhaps the PA? 'All visitors are to report to the head and follow emergency orders. This is not a drill."
|
||||
storedinfo += "07:19 a voice, muffled by an enclosed helmet, 'Get into the cryopods already!! We don't have time! They should keep you safe! Hurry! Hurry!'"
|
||||
storedinfo += "09:13 *gruesome sounds of machines exploding, wet splatter and ominous hissing"
|
||||
used_capacity = 1755 //almost full
|
||||
|
||||
/obj/item/space_spider_egg
|
||||
name = "ruptured giant spider egg"
|
||||
desc = "An attempt by space-adapted giant spiders to reproduce! Unfortunately, their young cannot yet survive hard vacuum. Yet."
|
||||
icon = 'icons/obj/egg_new_vr.dmi' //VOREStation Edit
|
||||
icon_state = "egg_slimeglob"
|
||||
origin_tech = list(TECH_BIO = 10)
|
||||
|
||||
/obj/item/space_spider_egg/attack_self(mob/user as mob)
|
||||
var/turf/drop_loc = user.loc
|
||||
to_chat(user, SPAN_WARNING("The egg cracks open, splattering disgusting goop at your feet...\n \
|
||||
Whatever life laid within shall never awaken, if it was even alive."))
|
||||
new /obj/effect/decal/cleanable/spiderling_remains(drop_loc)
|
||||
qdel(src)
|
||||
|
||||
// End of Tourist ship stuff
|
||||
|
||||
/obj/random/slimecore
|
||||
name = "random slime core"
|
||||
desc = "Random slime core."
|
||||
@@ -102,4 +205,4 @@ we managed to bait her into one of the escape pods. fired her out into the black
|
||||
hope nobody ever has to read this. has to find her.<br>\
|
||||
if you do, im sorry.<br>\
|
||||
i just hope whatever happens, she finds the mercy we werent equipped to give her.<br>\
|
||||
<i>The author's signature is smudged beyond recognition.</i>"}
|
||||
<i>The author's signature is smudged beyond recognition.</i>"}
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
var/mob/living/carbon/human/gargoyle //easy reference
|
||||
var/obj/structure/gargoyle/statue //another easy ref
|
||||
|
||||
//Adjustable mod
|
||||
var/identifier = "statue"
|
||||
var/adjective = "hardens"
|
||||
var/material = "stone"
|
||||
var/tint = rgb(255,255,255)
|
||||
|
||||
/datum/component/gargoyle/Initialize()
|
||||
if (!ishuman(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
@@ -15,6 +21,11 @@
|
||||
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_transformation
|
||||
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_pause
|
||||
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_checkenergy
|
||||
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_verbAdjective
|
||||
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_verbIdentifier
|
||||
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_verbMaterial
|
||||
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_verbColor
|
||||
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
/datum/component/gargoyle/process()
|
||||
@@ -59,7 +70,7 @@
|
||||
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
|
||||
if (comp)
|
||||
if (comp.energy <= 0 && isturf(loc))
|
||||
to_chat(src, "<span class='danger'>You suddenly turn into a statue as you run out of energy!</span>")
|
||||
to_chat(src, "<span class='danger'>You suddenly turn into a [comp.identifier] as you run out of energy!</span>")
|
||||
else if (comp.cooldown > world.time)
|
||||
var/time_to_wait = (comp.cooldown - world.time) / (1 SECONDS)
|
||||
to_chat(src, "<span class='warning'>You can't transform just yet again! Wait for another [round(time_to_wait,0.1)] seconds!</span>")
|
||||
@@ -93,3 +104,55 @@
|
||||
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
|
||||
if (comp)
|
||||
to_chat(src, "<span class='notice'>You have [round(comp.energy,0.01)] energy remaining. It is currently [comp.paused ? "stable" : (comp.transformed ? "increasing" : "decreasing")].</span>")
|
||||
|
||||
/mob/living/carbon/human/proc/Gargoyle_Customizer(var/namer,var/type)
|
||||
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
|
||||
if (comp)
|
||||
if(type==1)
|
||||
return comp.identifier = namer
|
||||
if(type==2)
|
||||
return comp.material = namer
|
||||
if(type==3)
|
||||
return comp.adjective = namer
|
||||
if(type==4)
|
||||
return comp.tint = namer
|
||||
//Add color code here in the future
|
||||
if(type==5)
|
||||
return
|
||||
//Placeholder for being able to pick up statues
|
||||
|
||||
/mob/living/carbon/human/proc/gargoyle_verbIdentifier()
|
||||
set name = "Gargoyle - Name Identifier"
|
||||
set category = "Abilities"
|
||||
set desc = "Renames your statue to something of your choosing but only the statue part of the name."
|
||||
var/user_input = input("Enter your statue identifier")
|
||||
if(!user_input)
|
||||
return
|
||||
Gargoyle_Customizer(user_input,1)
|
||||
|
||||
/mob/living/carbon/human/proc/gargoyle_verbMaterial()
|
||||
set name = "Gargoyle - Name Material"
|
||||
set category = "Abilities"
|
||||
set desc = "Renames your statues material to something of your choosing. by default it is (stone)."
|
||||
var/user_input = input("Enter your petrification material")
|
||||
if(!user_input)
|
||||
return
|
||||
Gargoyle_Customizer(user_input,2)
|
||||
|
||||
/mob/living/carbon/human/proc/gargoyle_verbAdjective()
|
||||
set name = "Gargoyle - Name Adjective"
|
||||
set category = "Abilities"
|
||||
set desc = "Renames your petrification adjective to something of your choosing. by default it is (hardens)."
|
||||
var/user_input = input("Enter your petrification adjective")
|
||||
if(!user_input)
|
||||
return
|
||||
Gargoyle_Customizer(user_input,3)
|
||||
|
||||
/mob/living/carbon/human/proc/gargoyle_verbColor()
|
||||
set name = "Gargoyle - Recolor"
|
||||
set category = "Abilities"
|
||||
set desc = "Recolor your statue to something of your choosing. by default it is grey."
|
||||
var/user_input = input(src, "Choose a tint color!") as color|null
|
||||
if(!user_input)
|
||||
return
|
||||
Gargoyle_Customizer(user_input,4)
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/datum/category_item/underwear/socks/generate_image(var/list/metadata, var/layer = FLOAT_LAYER, var/digitigrade = FALSE) //CHOMPEdit
|
||||
if(!icon_state)
|
||||
return
|
||||
|
||||
var/image/I = image(icon = digitigrade ? 'modular_chomp/icons/mob/human.dmi' : icon, icon_state = icon_state, layer = layer) //CHOMPEdit
|
||||
for(var/datum/gear_tweak/gt in tweaks)
|
||||
gt.tweak_item(I, metadata && metadata["[gt]"] ? metadata["[gt]"] : gt.get_default())
|
||||
return I
|
||||
@@ -15,6 +15,8 @@
|
||||
var/original_int = 100
|
||||
var/max_integrity = 100
|
||||
var/stored_examine
|
||||
var/identifier = "statue"
|
||||
var/material = "stone"
|
||||
|
||||
/obj/structure/gargoyle/Initialize(mapload, var/mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
@@ -23,18 +25,22 @@
|
||||
if (!istype(H) || !isturf(H.loc))
|
||||
return
|
||||
var/datum/component/gargoyle/comp = H.GetComponent(/datum/component/gargoyle)
|
||||
var/tint = rgb(255,255,255)
|
||||
if (comp)
|
||||
comp.cooldown = world.time + (15 SECONDS)
|
||||
comp.statue = src
|
||||
comp.transformed = TRUE
|
||||
comp.paused = FALSE
|
||||
identifier = comp.identifier
|
||||
material = comp.material
|
||||
tint = comp.tint
|
||||
gargoyle = H
|
||||
|
||||
max_integrity = H.getMaxHealth() + 100
|
||||
obj_integrity = H.health + 100
|
||||
original_int = obj_integrity
|
||||
name = "statue of [H.name]"
|
||||
desc = "A very lifelike statue."
|
||||
name = "[identifier] of [H.name]"
|
||||
desc = "A very lifelike [identifier]."
|
||||
stored_examine = H.examine()
|
||||
description_fluff = H.get_description_fluff()
|
||||
|
||||
@@ -42,7 +48,32 @@
|
||||
H.buckled.unbuckle_mob(H, TRUE)
|
||||
icon = H.icon
|
||||
copy_overlays(H)
|
||||
color = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
|
||||
//calculate our tints
|
||||
|
||||
var/list/RGB = list( hex2num( "[tint[2]][tint[3]]" ),
|
||||
hex2num( "[tint[4]][tint[5]]" ),
|
||||
hex2num( "[tint[6]][tint[7]]" )
|
||||
)
|
||||
|
||||
var/colora = rgb( RGB[1]*0.299,
|
||||
RGB[2]*0.299,
|
||||
RGB[3]*0.299
|
||||
)
|
||||
|
||||
var/colorb = rgb( RGB[1]*0.587,
|
||||
RGB[2]*0.587,
|
||||
RGB[3]*0.587
|
||||
)
|
||||
|
||||
var/colorc = rgb( RGB[1]*0.114,
|
||||
RGB[2]*0.114,
|
||||
RGB[3]*0.114
|
||||
)
|
||||
|
||||
color = list( colora, colorb , colorc, rgb(0,0,0))
|
||||
|
||||
|
||||
initial_sleep = H.sleeping
|
||||
initial_blind = H.eye_blind
|
||||
initial_is_shifted = H.is_shifted
|
||||
@@ -61,7 +92,7 @@
|
||||
flapping = H.flapping
|
||||
H.toggle_tail(FALSE, FALSE)
|
||||
H.toggle_wing(FALSE, FALSE)
|
||||
H.visible_message("<span class='warning'>[H]'s skin rapidly turns to stone!</span>", "<span class='warning'>Your skin abruptly hardens as you turn to stone!</span>")
|
||||
H.visible_message("<span class='warning'>[H]'s skin rapidly turns to [material]!</span>", "<span class='warning'>Your skin abruptly [comp.adjective] as you turn to [material]!</span>")
|
||||
H.forceMove(src)
|
||||
H.SetBlinded(0)
|
||||
H.SetSleeping(0)
|
||||
@@ -87,7 +118,7 @@
|
||||
/obj/structure/gargoyle/examine(mob/user)
|
||||
. = ..()
|
||||
if (gargoyle && stored_examine)
|
||||
. += "The statue seems to have a bit more to them..."
|
||||
. += "The [identifier] seems to have a bit more to them..."
|
||||
. += stored_examine
|
||||
return
|
||||
|
||||
@@ -121,10 +152,10 @@
|
||||
var/f = (original_int - obj_integrity) / 10
|
||||
for (var/x in 1 to 10)
|
||||
gargoyle.adjustBruteLoss(f)
|
||||
hurtmessage = " <b>You feel your body take the damage that was dealt while being stone!</b>"
|
||||
hurtmessage = " <b>You feel your body take the damage that was dealt while being [material]!</b>"
|
||||
gargoyle.updatehealth()
|
||||
alpha = 0
|
||||
gargoyle.visible_message("<span class='warning'>[gargoyle]'s skin rapidly softens, returning them to normal!</span>", "<span class='warning'>Your skin softens, freeing your movement once more![hurtmessage]</span>")
|
||||
gargoyle.visible_message("<span class='warning'>[gargoyle]'s skin rapidly reverts, returning them to normal!</span>", "<span class='warning'>Your skin reverts, freeing your movement once more![hurtmessage]</span>")
|
||||
|
||||
/obj/structure/gargoyle/return_air()
|
||||
return return_air_for_internal_lifeform()
|
||||
|
||||
@@ -28,5 +28,5 @@ var/list/talk_sound_map = list(
|
||||
talk_sounds |= talk_sound_map[i] //Thank you BM absolute legend
|
||||
return 1
|
||||
|
||||
proc/get_talk_sound(var/voice_sound)
|
||||
/proc/get_talk_sound(var/voice_sound)
|
||||
return talk_sound_map[voice_sound]
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
/mob/living/carbon
|
||||
var/datum/looping_sound/mob/cozyloop/cozyloop
|
||||
|
||||
/mob/living/carbon/Initialize()
|
||||
. = ..()
|
||||
|
||||
cozyloop = new(list(src), FALSE)
|
||||
|
||||
/mob/living/carbon/Destroy()
|
||||
. = ..()
|
||||
|
||||
QDEL_NULL(cozyloop)
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
Coalesce is a very simple concept in programming, essentially it takes a list of arguments and tells you the first one that is not null
|
||||
|
||||
Natively byond has no such thing but we added it
|
||||
the syntax is coalesce(var1,var2...)
|
||||
*/
|
||||
//As an example lets use A simple fallback system to check for an id
|
||||
//This code is entirely fictional and only demonstrates syntax
|
||||
|
||||
/proc/get_ID(/mob/carbon/m)
|
||||
return coalesce( getID(handslotL),
|
||||
getID(handslotR),
|
||||
getID(beltslot)
|
||||
)
|
||||
//Now assuming getID was a real proc that either returned NULL or an ID in a given storage slot.
|
||||
// This code would check all 3 slots and then return the first ID we find.
|
||||
// This makes it so we do not have to do any extra if/else statements, we simply use whatever is present first.
|
||||
|
||||
//as a second example you can also use coalesce as a fallback
|
||||
/proc/fetch_name_with_fallback(var/name,var/nametwo)
|
||||
coalesce(name, nametwo, "Not found")
|
||||
//Now what this will do is return name, if name is not null, nametwo if name is null but nametwo isnt null
|
||||
//however if both given vars are in fact null we have a hardocded fallback "not found" that will always return instead
|
||||
//now the important part here is the order. Always put the fallback last as arguments are checked based on their occurence in the list.
|
||||
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 1.0 KiB |