Merge branch 'master' into shep-dev-barky-noises

This commit is contained in:
Rykka Stormheart
2023-03-10 01:54:26 -08:00
110 changed files with 244876 additions and 10451 deletions
+2 -1
View File
@@ -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
+8
View File
@@ -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))
+12 -2
View File
@@ -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"
+11
View File
@@ -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
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+4 -1
View File
@@ -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
+1
View File
@@ -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
+1 -1
View File
@@ -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
+1
View File
@@ -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"]
+4 -4
View File
@@ -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>"
+6
View File
@@ -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
+4 -1
View File
@@ -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)
+1 -1
View File
@@ -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"),
+3
View File
@@ -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"]]
+3
View File
@@ -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"]]
+21
View File
@@ -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
+2
View File
@@ -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
+37
View File
@@ -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"])
+7 -1
View File
@@ -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
+55 -1
View File
@@ -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
+8 -2
View File
@@ -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 ..()
+3 -3
View File
@@ -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)
+2
View File
@@ -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)
+2 -2
View File
@@ -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]
+1 -1
View File
@@ -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!
+3 -3
View File
@@ -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 ..();
+3 -2
View File
@@ -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.
+15
View File
@@ -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")
+53 -16
View File
@@ -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"
)
)
+1
View File
@@ -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
+1 -1
View File
@@ -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
+1
View File
@@ -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"
+6 -1
View File
@@ -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"
+5 -1
View File
@@ -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
+6
View File
@@ -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)
+9
View File
@@ -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)
+1 -1
View File
@@ -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>")
+8
View File
@@ -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
+4 -2
View File
@@ -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,
+10
View File
@@ -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
+6 -4
View File
@@ -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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

+6
View File
@@ -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"
+221
View File
@@ -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
"}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -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>"}
File diff suppressed because it is too large Load Diff
@@ -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()
+1 -1
View File
@@ -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)
+24
View File
@@ -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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

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