Merge branch 'master' into upstream-merge-13038

This commit is contained in:
Nadyr
2022-06-04 20:23:28 -04:00
committed by GitHub
45 changed files with 572 additions and 446 deletions

View File

@@ -1,26 +0,0 @@
<!-- Please DO NOT report 'suggestions' on GitHub. If your issue consists of an opinion about how something should be, it doesn't belong here. -->
<!-- If your issue consists of something not operating as intended, please report it below by filling out the template. -->
<!-- These directions will not appear in the issue, when submitted. -->
<!--Please provide a clear and concise description of what the bug is.-->
#### Brief description of the bug
<!--What normally happens when this occurs? Keep in mind that behavior may be different on other servers.-->
#### What you expected to happen
<!--Please use as much detail as possible when describing the bug behavior, including any context (things you did before) that might be relevant.-->
#### What actually happened
<!-- Same here, please include any context that might have contributed, such as actions taken right before.-->
#### Steps to reproduce
- (Step 1)
- (Step 2)
- (and so on)
<!--Optional, you may remove this section.-->
#### Code Revision
- (Found using the "Show Server Revision" verb under the OOC tab.)
<!--Optional, you may remove this section.-->
#### Anything else you may wish to add:
- (Location if it's a mapping issue, screenshots, sprites, etc.)

View File

@@ -1,25 +1,35 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: 'Type: Bug'
assignees: ''
---
#### Brief description of the issue
<!-- Please DO NOT report 'suggestions' on GitHub. If your issue consists of an opinion about how something should be, it doesn't belong here. -->
<!-- If your issue consists of something not operating as intended, please report it below by filling out the template. -->
<!-- These directions will not appear in the issue, when submitted. -->
<!--Please provide a clear and concise description of what the bug is.-->
#### Brief description of the bug
<!--What normally happens when this occurs? Keep in mind that behavior may be different on other servers.-->
#### What you expected to happen
<!--Please use as much detail as possible when describing the bug behavior, including any context (things you did before) that might be relevant.-->
#### What actually happened
<!-- Same here, please include any context that might have contributed, such as actions taken right before.-->
#### Steps to reproduce
- (Step 1)
- (Step 2)
- (and so on)
<!--Optional, you may remove this section.-->
#### Code Revision
- (Found using the "Show Server Revision" verb under the OOC tab.)
<!--Optional, you may remove this section.-->
#### Anything else you may wish to add:
- (Location if it's a mapping issue, screenshots, sprites, etc.)

View File

@@ -1,8 +0,0 @@
// All religion stuff
GLOBAL_VAR(religion)
GLOBAL_VAR(deity)
//bible
GLOBAL_VAR(bible_name)
GLOBAL_VAR(bible_icon_state)
GLOBAL_VAR(bible_item_state)

View File

@@ -75,6 +75,8 @@
//used to store what traits the player had picked out in their preferences before joining, in text form.
var/list/traits = list()
var/datum/religion/my_religion
/datum/mind/New(var/key)
src.key = key
purchase_log = list()
@@ -571,4 +573,4 @@
/mob/living/simple_mob/construct/juggernaut/mind_initialize()
. = ..()
mind.assigned_role = "Juggernaut"
mind.special_role = "Cultist"
mind.special_role = "Cultist"

View File

@@ -29,20 +29,14 @@
return
var/obj/item/weapon/storage/bible/B = locate(/obj/item/weapon/storage/bible) in H
if(!B)
var/obj/item/weapon/card/id/I = locate(/obj/item/weapon/card/id) in H
if(!B || !I)
return
if(GLOB.religion)
B.deity_name = GLOB.deity
B.name = GLOB.bible_name
B.icon_state = GLOB.bible_icon_state
B.item_state = GLOB.bible_item_state
to_chat(H, "<span class='boldnotice'>There is already an established religion onboard the station. You are an acolyte of [GLOB.deity]. Defer to the [title].</span>")
return
INVOKE_ASYNC(src, .proc/religion_prompts, H, B)
INVOKE_ASYNC(src, .proc/religion_prompts, H, B, I)
/datum/job/chaplain/proc/religion_prompts(mob/living/carbon/human/H, obj/item/weapon/storage/bible/B)
/datum/job/chaplain/proc/religion_prompts(mob/living/carbon/human/H, obj/item/weapon/storage/bible/B, obj/item/weapon/card/id/I)
var/religion_name = "Unitarianism"
var/new_religion = sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Unitarianism", "Name change", religion_name), MAX_NAME_LEN)
if(!new_religion)
@@ -83,18 +77,48 @@
B.name = "Guru Granth Sahib"
else
B.name = "The Holy Book of [new_religion]"
feedback_set_details("religion_name","[new_religion]")
var/deity_name = "Hashem"
var/new_deity = sanitize(input(H, "Would you like to change your deity? Default is Hashem", "Name change", deity_name), MAX_NAME_LEN)
if((length(new_deity) == 0) || (new_deity == "Hashem"))
new_deity = deity_name
B.deity_name = new_deity
GLOB.religion = new_religion
GLOB.bible_name = B.name
GLOB.deity = B.deity_name
feedback_set_details("religion_deity","[new_deity]")
var/new_title = sanitize(input(H, "Would you like to change your title?", "Title Change", I.assignment), MAX_NAME_LEN)
var/list/all_jobs = get_job_datums()
// Are they trying to fake an actual existent job
var/faking_job = FALSE
for (var/datum/job/J in all_jobs)
if (J.title == new_title || (new_title in get_alternate_titles(J.title)))
faking_job = TRUE
if (length(new_title) != 0 && !faking_job)
I.assignment = new_title
H.mind.my_religion = new /datum/religion(new_religion, new_deity, B.name, "bible", "bible", new_title)
B.deity_name = H.mind.my_religion.deity
I.assignment = H.mind.my_religion.title
I.name = text("[I.registered_name]'s ID Card ([I.assignment])")
data_core.manifest_modify(I.registered_name, I.assignment, I.rank)
/datum/religion
var/religion = "Unitarianism"
var/deity = "Hashem"
var/bible_name = "Bible"
var/bible_icon_state = "bible"
var/bible_item_state = "bible"
var/title = "Chaplain"
var/configured = FALSE
/datum/religion/New(var/r, var/d, var/bn, var/bis, var/bits, var/t)
. = ..()
religion = r
deity = d
bible_name = bn
bible_icon_state = bis
bible_item_state = bits
title = t

View File

@@ -26,13 +26,13 @@
data["network"] = network
data["temp"] = temp
var/list/servers = list()
var/list/serverData = list()
for(var/obj/machinery/telecomms/T in servers)
servers.Add(list(list(
serverData.Add(list(list(
"id" = T.id,
"name" = T.name,
)))
data["servers"] = servers
data["servers"] = serverData
data["selectedServer"] = null
if(SelectedServer)

View File

@@ -26,13 +26,13 @@
data["network"] = network
data["temp"] = temp
var/list/machinelist = list()
var/list/machinelistData = list()
for(var/obj/machinery/telecomms/T in machinelist)
machinelist.Add(list(list(
machinelistData.Add(list(list(
"id" = T.id,
"name" = T.name,
)))
data["machinelist"] = machinelist
data["machinelist"] = machinelistData
data["selectedMachine"] = null
if(SelectedMachine)

View File

@@ -14,6 +14,8 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
var/obj/item/device/radio/radio
var/looking_for_personality = 0
var/mob/living/silicon/pai/pai
var/image/screen_layer
var/screen_color = "#00ff0d"
/obj/item/device/paicard/relaymove(var/mob/user, var/direction)
if(user.stat || user.stunned)
@@ -48,12 +50,19 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
return ..()
var/turf/location = get_turf(src)
var/obj/item/device/paicard/card = new(location)
var/mob/living/silicon/pai/new_pai = new(card)
if(istype(src , /obj/item/device/paicard/typeb))
var/obj/item/device/paicard/typeb/card = new(location)
var/mob/living/silicon/pai/new_pai = new(card)
new_pai.key = user.key
card.setPersonality(new_pai)
new_pai.SetName(actual_pai_name)
else
var/obj/item/device/paicard/card = new(location)
var/mob/living/silicon/pai/new_pai = new(card)
new_pai.key = user.key
card.setPersonality(new_pai)
new_pai.SetName(actual_pai_name)
qdel(src)
new_pai.key = user.key
card.setPersonality(new_pai)
new_pai.SetName(actual_pai_name)
return ..()
// VOREStation Edit End
@@ -214,6 +223,7 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
else //</font></font>
dat += "<b>Radio Uplink</b><br>"
dat += "<font color=red><i>Radio firmware not loaded. Please install a pAI personality to load firmware.</i></font><br>"
/* - //A button for instantly deleting people from the game is lame, especially considering that pAIs on our server tend to activate without a master.
dat += {"
<table>
<td class="button_red"><a href='byond://?src=\ref[src];wipe=1' class='button'>Wipe current pAI personality</a>
@@ -221,6 +231,7 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
</td>
</table>
"}
*/
else
if(looking_for_personality)
dat += {"
@@ -304,34 +315,40 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
/obj/item/device/paicard/proc/setPersonality(mob/living/silicon/pai/personality)
src.pai = personality
add_overlay("pai-happy")
setEmotion(1)
/obj/item/device/paicard/proc/removePersonality()
src.pai = null
cut_overlays()
add_overlay("pai-off")
setEmotion(16)
/obj/item/device/paicard
var/current_emotion = 1
/obj/item/device/paicard/proc/setEmotion(var/emotion)
if(pai)
cut_overlays()
qdel(screen_layer)
screen_layer = null
switch(emotion)
if(1) add_overlay("pai-happy")
if(2) add_overlay("pai-cat")
if(3) add_overlay("pai-extremely-happy")
if(4) add_overlay("pai-face")
if(5) add_overlay("pai-laugh")
if(6) add_overlay("pai-off")
if(7) add_overlay("pai-sad")
if(8) add_overlay("pai-angry")
if(9) add_overlay("pai-what")
if(10) add_overlay("pai-neutral")
if(11) add_overlay("pai-silly")
if(12) add_overlay("pai-nose")
if(13) add_overlay("pai-smirk")
if(14) add_overlay("pai-exclamation")
if(15) add_overlay("pai-question")
if(1) screen_layer = image(icon, "pai-neutral")
if(2) screen_layer = image(icon, "pai-what")
if(3) screen_layer = image(icon, "pai-happy")
if(4) screen_layer = image(icon, "pai-cat")
if(5) screen_layer = image(icon, "pai-extremely-happy")
if(6) screen_layer = image(icon, "pai-face")
if(7) screen_layer = image(icon, "pai-laugh")
if(8) screen_layer = image(icon, "pai-sad")
if(9) screen_layer = image(icon, "pai-angry")
if(10) screen_layer = image(icon, "pai-silly")
if(11) screen_layer = image(icon, "pai-nose")
if(12) screen_layer = image(icon, "pai-smirk")
if(13) screen_layer = image(icon, "pai-exclamation")
if(14) screen_layer = image(icon, "pai-question")
if(15) screen_layer = image(icon, "pai-blank")
if(16) screen_layer = image(icon, "pai-off")
screen_layer.color = pai.eye_color
add_overlay(screen_layer)
current_emotion = emotion
/obj/item/device/paicard/proc/alertUpdate()
@@ -396,9 +413,6 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
name = initial(src.name)
to_chat(AI, span_notice("You feel a tad claustrophobic as your mind closes back into your card, ejecting from \the [initial(src.name)]."))
if(user)
<<<<<<< HEAD
to_chat(user, span_notice("You eject the card from \the [initial(src.name)]."))
=======
to_chat(user, span_notice("You eject the card from \the [initial(src.name)]."))
/obj/item/device/paicard/typeb
@@ -411,5 +425,4 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard)
icon_state = "pai"
/obj/random/paicard/item_to_spawn()
return pick(/obj/item/device/paicard ,/obj/item/device/paicard/typeb)
>>>>>>> 1df6e69b74... Merge pull request #13038 from Very-Soft/teppipai
return pick(/obj/item/device/paicard ,/obj/item/device/paicard/typeb)

View File

@@ -0,0 +1,36 @@
/obj/item/device/analyzer
name = "gas analyzer"
desc = "A hand-held environmental scanner which reports current gas levels."
icon_state = "atmos"
item_state = "analyzer"
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
throwforce = 5
throw_speed = 4
throw_range = 20
matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
/obj/item/device/analyzer/atmosanalyze(var/mob/user)
var/air = user.return_air()
if (!air)
return
return atmosanalyzer_scan(src, air, user)
/obj/item/device/analyzer/attack_self(mob/user as mob)
if (user.stat)
return
if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
to_chat(usr, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
analyze_gases(src, user)
return
/obj/item/device/analyzer/afterattack(var/obj/O, var/mob/user, var/proximity)
if(proximity)
analyze_gases(O, user)
return

View File

@@ -0,0 +1,20 @@
/obj/item/device/halogen_counter
name = "halogen counter"
icon_state = "eftpos"
desc = "A hand-held halogen counter, used to detect the level of irradiation of living beings."
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 2)
throwforce = 0
throw_speed = 3
throw_range = 7
/obj/item/device/halogen_counter/attack(mob/living/M as mob, mob/living/user as mob)
if(!iscarbon(M))
to_chat(user, "<span class='warning'>This device can only scan organic beings!</span>")
return
user.visible_message("<span class='warning'>\The [user] has analyzed [M]'s radiation levels!</span>", "<span class='notice'>Analyzing Results for [M]:</span>")
if(M.radiation)
to_chat(user, "<span class='notice'>Radiation Level: [M.radiation]</span>")
else
to_chat(user, "<span class='notice'>No radiation detected.</span>")
return

View File

@@ -1,15 +1,4 @@
#define DEFIB_TIME_LIMIT (10 MINUTES) //VOREStation addition- past this many seconds, defib is useless.
/*
CONTAINS:
T-RAY
DETECTIVE SCANNER
HEALTH ANALYZER
GAS ANALYZER - Analyzes atmosphere, container
MASS SPECTROMETER
REAGENT SCANNER
HALOGEN COUNTER - Radcount on mobs
*/
/obj/item/device/healthanalyzer
name = "health analyzer"
@@ -335,214 +324,4 @@ HALOGEN COUNTER - Radcount on mobs
origin_tech = list(TECH_MAGNET = 7, TECH_BIO = 8)
icon_state = "health3"
/obj/item/device/analyzer
name = "analyzer"
desc = "A hand-held environmental scanner which reports current gas levels."
icon_state = "atmos"
item_state = "analyzer"
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
throwforce = 5
throw_speed = 4
throw_range = 20
matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1)
/obj/item/device/analyzer/atmosanalyze(var/mob/user)
var/air = user.return_air()
if (!air)
return
return atmosanalyzer_scan(src, air, user)
/obj/item/device/analyzer/attack_self(mob/user as mob)
if (user.stat)
return
if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
to_chat(usr, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
analyze_gases(src, user)
return
/obj/item/device/analyzer/afterattack(var/obj/O, var/mob/user, var/proximity)
if(proximity)
analyze_gases(O, user)
return
/obj/item/device/mass_spectrometer
name = "mass spectrometer"
desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample."
icon_state = "spectrometer"
w_class = ITEMSIZE_SMALL
flags = OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 5
throw_speed = 4
throw_range = 20
matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
var/details = 0
var/recent_fail = 0
/obj/item/device/mass_spectrometer/New()
..()
var/datum/reagents/R = new/datum/reagents(5)
reagents = R
R.my_atom = src
/obj/item/device/mass_spectrometer/on_reagent_change()
if(reagents.total_volume)
icon_state = initial(icon_state) + "_s"
else
icon_state = initial(icon_state)
/obj/item/device/mass_spectrometer/attack_self(mob/user as mob)
if (user.stat)
return
if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(reagents.total_volume)
var/list/blood_traces = list()
for(var/datum/reagent/R in reagents.reagent_list)
if(R.id != "blood")
reagents.clear_reagents()
to_chat(user, "<span class='warning'>The sample was contaminated! Please insert another sample</span>")
return
else
blood_traces = params2list(R.data["trace_chem"])
break
var/dat = "Trace Chemicals Found: "
for(var/R in blood_traces)
if(details)
dat += "[R] ([blood_traces[R]] units) "
else
dat += "[R] "
to_chat(user, "[dat]")
reagents.clear_reagents()
return
/obj/item/device/mass_spectrometer/adv
name = "advanced mass spectrometer"
icon_state = "adv_spectrometer"
details = 1
origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)
/obj/item/device/reagent_scanner
name = "reagent scanner"
desc = "A hand-held reagent scanner which identifies chemical agents."
icon_state = "spectrometer"
item_state = "analyzer"
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
throwforce = 5
throw_speed = 4
throw_range = 20
matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
var/details = 0
var/recent_fail = 0
/obj/item/device/reagent_scanner/afterattack(obj/O, mob/living/user, proximity)
if(!proximity || user.stat || !istype(O))
return
if(!istype(user))
return
if(!isnull(O.reagents))
if(!(O.flags & OPENCONTAINER)) // The idea is that the scanner has to touch the reagents somehow. This is done to prevent cheesing unidentified autoinjectors.
to_chat(user, span("warning", "\The [O] is sealed, and cannot be scanned by \the [src] until unsealed."))
return
var/dat = ""
if(O.reagents.reagent_list.len > 0)
var/one_percent = O.reagents.total_volume / 100
for (var/datum/reagent/R in O.reagents.reagent_list)
dat += "\n \t " + span("notice", "[R][details ? ": [R.volume / one_percent]%" : ""]")
if(dat)
to_chat(user, span("notice", "Chemicals found: [dat]"))
else
to_chat(user, span("notice", "No active chemical agents found in [O]."))
else
to_chat(user, span("notice", "No significant chemical agents found in [O]."))
return
/obj/item/device/reagent_scanner/adv
name = "advanced reagent scanner"
icon_state = "adv_spectrometer"
details = 1
origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)
/obj/item/device/slime_scanner
name = "slime scanner"
icon_state = "xenobio"
item_state = "xenobio"
origin_tech = list(TECH_BIO = 1)
w_class = ITEMSIZE_SMALL
throwforce = 0
throw_speed = 3
throw_range = 7
matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
if(!istype(M, /mob/living/simple_mob/slime/xenobio))
to_chat(user, "<B>This device can only scan lab-grown slimes!</B>")
return
var/mob/living/simple_mob/slime/xenobio/S = M
user.show_message("Slime scan results:<br>[S.slime_color] [S.is_adult ? "adult" : "baby"] slime<br>Health: [S.health]<br>Mutation Probability: [S.mutation_chance]")
var/list/mutations = list()
for(var/potential_color in S.slime_mutation)
var/mob/living/simple_mob/slime/xenobio/slime = potential_color
mutations.Add(initial(slime.slime_color))
user.show_message("Potental to mutate into [english_list(mutations)] colors.<br>Extract potential: [S.cores]<br>Nutrition: [S.nutrition]/[S.max_nutrition]")
if (S.nutrition < S.get_starve_nutrition())
user.show_message("<span class='alert'>Warning: Subject is starving!</span>")
else if (S.nutrition < S.get_hunger_nutrition())
user.show_message("<span class='warning'>Warning: Subject is hungry.</span>")
user.show_message("Electric change strength: [S.power_charge]")
if(S.has_AI())
var/datum/ai_holder/simple_mob/xenobio_slime/AI = S.ai_holder
if(AI.resentment)
user.show_message("<span class='warning'>Warning: Subject is harboring resentment.</span>")
if(AI.rabid)
user.show_message("<span class='danger'>Subject is enraged and extremely dangerous!</span>")
if(S.harmless)
user.show_message("Subject has been pacified.")
if(S.unity)
user.show_message("Subject is friendly to other slime colors.")
user.show_message("Growth progress: [S.amount_grown]/10")
/obj/item/device/halogen_counter
name = "halogen counter"
icon_state = "eftpos"
desc = "A hand-held halogen counter, used to detect the level of irradiation of living beings."
w_class = ITEMSIZE_SMALL
origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 2)
throwforce = 0
throw_speed = 3
throw_range = 7
/obj/item/device/halogen_counter/attack(mob/living/M as mob, mob/living/user as mob)
if(!iscarbon(M))
to_chat(user, "<span class='warning'>This device can only scan organic beings!</span>")
return
user.visible_message("<span class='warning'>\The [user] has analyzed [M]'s radiation levels!</span>", "<span class='notice'>Analyzing Results for [M]:</span>")
if(M.radiation)
to_chat(user, "<span class='notice'>Radiation Level: [M.radiation]</span>")
else
to_chat(user, "<span class='notice'>No radiation detected.</span>")
return
#undef DEFIB_TIME_LIMIT //VOREStation addition

View File

@@ -0,0 +1,60 @@
/obj/item/device/mass_spectrometer
name = "mass spectrometer"
desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample."
icon_state = "spectrometer"
w_class = ITEMSIZE_SMALL
flags = OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 5
throw_speed = 4
throw_range = 20
matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
var/details = 0
var/recent_fail = 0
/obj/item/device/mass_spectrometer/New()
..()
var/datum/reagents/R = new/datum/reagents(5)
reagents = R
R.my_atom = src
/obj/item/device/mass_spectrometer/on_reagent_change()
if(reagents.total_volume)
icon_state = initial(icon_state) + "_s"
else
icon_state = initial(icon_state)
/obj/item/device/mass_spectrometer/attack_self(mob/user as mob)
if (user.stat)
return
if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey")
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
if(reagents.total_volume)
var/list/blood_traces = list()
for(var/datum/reagent/R in reagents.reagent_list)
if(R.id != "blood")
reagents.clear_reagents()
to_chat(user, "<span class='warning'>The sample was contaminated! Please insert another sample</span>")
return
else
blood_traces = params2list(R.data["trace_chem"])
break
var/dat = "Trace Chemicals Found: "
for(var/R in blood_traces)
if(details)
dat += "[R] ([blood_traces[R]] units) "
else
dat += "[R] "
to_chat(user, "[dat]")
reagents.clear_reagents()
return
/obj/item/device/mass_spectrometer/adv
name = "advanced mass spectrometer"
icon_state = "adv_spectrometer"
details = 1
origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)

View File

@@ -0,0 +1,46 @@
/obj/item/device/reagent_scanner
name = "reagent scanner"
desc = "A hand-held reagent scanner which identifies chemical agents."
icon_state = "spectrometer"
item_state = "analyzer"
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
throwforce = 5
throw_speed = 4
throw_range = 20
matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
var/details = 0
var/recent_fail = 0
/obj/item/device/reagent_scanner/afterattack(obj/O, mob/living/user, proximity)
if(!proximity || user.stat || !istype(O))
return
if(!istype(user))
return
if(!isnull(O.reagents))
if(!(O.flags & OPENCONTAINER)) // The idea is that the scanner has to touch the reagents somehow. This is done to prevent cheesing unidentified autoinjectors.
to_chat(user, span("warning", "\The [O] is sealed, and cannot be scanned by \the [src] until unsealed."))
return
var/dat = ""
if(O.reagents.reagent_list.len > 0)
var/one_percent = O.reagents.total_volume / 100
for (var/datum/reagent/R in O.reagents.reagent_list)
dat += "\n \t " + span("notice", "[R][details ? ": [R.volume / one_percent]%" : ""]")
if(dat)
to_chat(user, span("notice", "Chemicals found: [dat]"))
else
to_chat(user, span("notice", "No active chemical agents found in [O]."))
else
to_chat(user, span("notice", "No significant chemical agents found in [O]."))
return
/obj/item/device/reagent_scanner/adv
name = "advanced reagent scanner"
icon_state = "adv_spectrometer"
details = 1
origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2)

View File

@@ -300,4 +300,4 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob
if(stored_mind)
icon_state = "[initial(icon_state)]_on"
else
icon_state = initial(icon_state)
icon_state = initial(icon_state)

View File

@@ -0,0 +1,42 @@
/obj/item/device/slime_scanner
name = "slime scanner"
icon_state = "xenobio"
item_state = "xenobio"
origin_tech = list(TECH_BIO = 1)
w_class = ITEMSIZE_SMALL
throwforce = 0
throw_speed = 3
throw_range = 7
matter = list(MAT_STEEL = 30,MAT_GLASS = 20)
/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob)
if(!istype(M, /mob/living/simple_mob/slime/xenobio))
to_chat(user, "<B>This device can only scan lab-grown slimes!</B>")
return
var/mob/living/simple_mob/slime/xenobio/S = M
user.show_message("Slime scan results:<br>[S.slime_color] [S.is_adult ? "adult" : "baby"] slime<br>Health: [S.health]<br>Mutation Probability: [S.mutation_chance]")
var/list/mutations = list()
for(var/potential_color in S.slime_mutation)
var/mob/living/simple_mob/slime/xenobio/slime = potential_color
mutations.Add(initial(slime.slime_color))
user.show_message("Potental to mutate into [english_list(mutations)] colors.<br>Extract potential: [S.cores]<br>Nutrition: [S.nutrition]/[S.max_nutrition]")
if (S.nutrition < S.get_starve_nutrition())
user.show_message("<span class='alert'>Warning: Subject is starving!</span>")
else if (S.nutrition < S.get_hunger_nutrition())
user.show_message("<span class='warning'>Warning: Subject is hungry.</span>")
user.show_message("Electric change strength: [S.power_charge]")
if(S.has_AI())
var/datum/ai_holder/simple_mob/xenobio_slime/AI = S.ai_holder
if(AI.resentment)
user.show_message("<span class='warning'>Warning: Subject is harboring resentment.</span>")
if(AI.rabid)
user.show_message("<span class='danger'>Subject is enraged and extremely dangerous!</span>")
if(S.harmless)
user.show_message("Subject has been pacified.")
if(S.unity)
user.show_message("Subject is friendly to other slime colors.")
user.show_message("Growth progress: [S.amount_grown]/10")

View File

@@ -37,30 +37,35 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
drop_sound = 'sound/bureaucracy/bookclose.ogg'
/obj/item/weapon/storage/bible/attack_self(mob/living/carbon/human/user)
if(GLOB.bible_icon_state)
icon_state = GLOB.bible_icon_state
item_state = GLOB.bible_item_state
return FALSE
if(user?.mind?.assigned_role != "Chaplain")
return FALSE
var/list/skins = list()
for(var/i in 1 to GLOB.biblestates.len)
var/image/bible_image = image(icon = 'icons/obj/storage.dmi', icon_state = GLOB.biblestates[i])
skins += list("[GLOB.biblenames[i]]" = bible_image)
var/choice = show_radial_menu(user, src, skins, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 40, require_near = TRUE)
if(!choice)
if (!user.mind.my_religion)
return FALSE
var/bible_index = GLOB.biblenames.Find(choice)
if(!bible_index)
return FALSE
icon_state = GLOB.biblestates[bible_index]
item_state = GLOB.bibleitemstates[bible_index]
GLOB.bible_icon_state = icon_state
GLOB.bible_item_state = item_state
feedback_set_details("religion_book", "[choice]")
if (!user.mind.my_religion.configured)
var/list/skins = list()
for(var/i in 1 to GLOB.biblestates.len)
var/image/bible_image = image(icon = 'icons/obj/storage.dmi', icon_state = GLOB.biblestates[i])
skins += list("[GLOB.biblenames[i]]" = bible_image)
var/choice = show_radial_menu(user, src, skins, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 40, require_near = TRUE)
if(!choice)
return FALSE
var/bible_index = GLOB.biblenames.Find(choice)
if(!bible_index)
return FALSE
user.mind.my_religion.bible_icon_state = GLOB.biblestates[bible_index]
user.mind.my_religion.bible_item_state = GLOB.bibleitemstates[bible_index]
user.mind.my_religion.configured = TRUE
deity_name = user.mind.my_religion.deity
name = user.mind.my_religion.bible_name
icon_state = user.mind.my_religion.bible_icon_state
item_state = user.mind.my_religion.bible_item_state
to_chat(user, "<span class='notice'>You invoke [user.mind.my_religion.deity] and prepare a copy of [src].</span>")
/**
* Checks if we are allowed to interact with a radial menu
@@ -69,7 +74,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
* * user The mob interacting with the menu
*/
/obj/item/weapon/storage/bible/proc/check_menu(mob/living/carbon/human/user)
if(GLOB.bible_icon_state)
if(user.mind.my_religion.configured)
return FALSE
if(!istype(user))
return FALSE
@@ -107,4 +112,4 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
/obj/item/weapon/storage/bible/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (src.use_sound)
playsound(src, src.use_sound, 50, 1, -5)
..()
..()

View File

@@ -3,28 +3,30 @@
sort_order = 1
/datum/category_item/player_setup_item/player_global/ui/load_preferences(var/savefile/S)
S["UI_style"] >> pref.UI_style
S["UI_style_color"] >> pref.UI_style_color
S["UI_style_alpha"] >> pref.UI_style_alpha
S["ooccolor"] >> pref.ooccolor
S["tooltipstyle"] >> pref.tooltipstyle
S["client_fps"] >> pref.client_fps
S["ambience_freq"] >> pref.ambience_freq
S["ambience_chance"] >> pref.ambience_chance
S["tgui_fancy"] >> pref.tgui_fancy
S["tgui_lock"] >> pref.tgui_lock
S["UI_style"] >> pref.UI_style
S["UI_style_color"] >> pref.UI_style_color
S["UI_style_alpha"] >> pref.UI_style_alpha
S["ooccolor"] >> pref.ooccolor
S["tooltipstyle"] >> pref.tooltipstyle
S["client_fps"] >> pref.client_fps
S["ambience_freq"] >> pref.ambience_freq
S["ambience_chance"] >> pref.ambience_chance
S["tgui_fancy"] >> pref.tgui_fancy
S["tgui_lock"] >> pref.tgui_lock
S["tgui_input_mode"] >> pref.tgui_input_mode
/datum/category_item/player_setup_item/player_global/ui/save_preferences(var/savefile/S)
S["UI_style"] << pref.UI_style
S["UI_style_color"] << pref.UI_style_color
S["UI_style_alpha"] << pref.UI_style_alpha
S["ooccolor"] << pref.ooccolor
S["tooltipstyle"] << pref.tooltipstyle
S["client_fps"] << pref.client_fps
S["ambience_freq"] << pref.ambience_freq
S["ambience_chance"] << pref.ambience_chance
S["tgui_fancy"] << pref.tgui_fancy
S["tgui_lock"] << pref.tgui_lock
S["UI_style"] << pref.UI_style
S["UI_style_color"] << pref.UI_style_color
S["UI_style_alpha"] << pref.UI_style_alpha
S["ooccolor"] << pref.ooccolor
S["tooltipstyle"] << pref.tooltipstyle
S["client_fps"] << pref.client_fps
S["ambience_freq"] << pref.ambience_freq
S["ambience_chance"] << pref.ambience_chance
S["tgui_fancy"] << pref.tgui_fancy
S["tgui_lock"] << pref.tgui_lock
S["tgui_input_mode"] << pref.tgui_input_mode
/datum/category_item/player_setup_item/player_global/ui/sanitize_preferences()
pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_styles, initial(pref.UI_style))
@@ -35,8 +37,9 @@
pref.client_fps = sanitize_integer(pref.client_fps, 0, MAX_CLIENT_FPS, initial(pref.client_fps))
pref.ambience_freq = sanitize_integer(pref.ambience_freq, 0, 60, initial(pref.ambience_freq)) // No more than once per hour.
pref.ambience_chance = sanitize_integer(pref.ambience_chance, 0, 100, initial(pref.ambience_chance)) // 0-100 range.
pref.tgui_fancy = sanitize_integer(pref.tgui_fancy, 0, 1, initial(pref.tgui_fancy))
pref.tgui_lock = sanitize_integer(pref.tgui_lock, 0, 1, initial(pref.tgui_lock))
pref.tgui_fancy = sanitize_integer(pref.tgui_fancy, 0, 1, initial(pref.tgui_fancy))
pref.tgui_lock = sanitize_integer(pref.tgui_lock, 0, 1, initial(pref.tgui_lock))
pref.tgui_input_mode = sanitize_integer(pref.tgui_input_mode, 0, 1, initial(pref.tgui_input_mode))
/datum/category_item/player_setup_item/player_global/ui/content(var/mob/user)
. = "<b>UI Style:</b> <a href='?src=\ref[src];select_style=1'><b>[pref.UI_style]</b></a><br>"
@@ -49,6 +52,7 @@
. += "<b>Ambience Chance:</b> <a href='?src=\ref[src];select_ambience_chance=1'><b>[pref.ambience_chance]</b></a><br>"
. += "<b>tgui Window Mode:</b> <a href='?src=\ref[src];tgui_fancy=1'><b>[(pref.tgui_fancy) ? "Fancy (default)" : "Compatible (slower)"]</b></a><br>"
. += "<b>tgui Window Placement:</b> <a href='?src=\ref[src];tgui_lock=1'><b>[(pref.tgui_lock) ? "Primary Monitor" : "Free (default)"]</b></a><br>"
. += "<b>Input Mode (Say, Me, Whisper, Subtle):</b> <a href='?src=\ref[src];tgui_input_mode=1'><b>[(pref.tgui_input_mode) ? "TGUI" : "BYOND (default)"]</b></a><br>"
if(can_select_ooc_color(user))
. += "<b>OOC Color:</b>"
if(pref.ooccolor == initial(pref.ooccolor))
@@ -118,6 +122,10 @@
pref.tgui_lock = !pref.tgui_lock
return TOPIC_REFRESH
else if(href_list["tgui_input_mode"])
pref.tgui_input_mode = !pref.tgui_input_mode
return TOPIC_REFRESH
else if(href_list["reset"])
switch(href_list["reset"])
if("ui")

View File

@@ -28,6 +28,7 @@ var/list/preferences_datums = list()
var/tgui_fancy = TRUE
var/tgui_lock = FALSE
var/tgui_input_mode = FALSE // Say, Me, Whisper, Subtle Input Mode; Disabled by default; FALSE = BYOND, TRUE = TGUI
//character preferences
var/num_languages = 0 //CHOMPEdit

View File

@@ -78,7 +78,7 @@
adjustOxyLoss(max(getMaxHealth() * 2 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
updatehealth()
/* CHOMP EDIT START: Removing PAI suicide, literally no one needs this.
/*
/mob/living/silicon/pai/verb/suicide()
set category = "pAI Commands"
set desc = "Kill yourself and become a ghost (You will receive a confirmation prompt)"
@@ -93,5 +93,4 @@
death(0)
else
to_chat(src, "Aborting suicide attempt.")
*/

View File

@@ -183,6 +183,7 @@
key = "squish"
emote_sound = 'sound/effects/slime_squish.ogg' //Credit to DrMinky (freesound.org) for the sound.
emote_message_3p = "squishes."
sound_vary = FALSE
/decl/emote/audible/warble
key = "warble"
@@ -211,6 +212,7 @@
emote_message_1p_target = "You chirp in surprise at TARGET!"
emote_message_3p_target = "chirps in surprise at TARGET!"
emote_sound = 'sound/voice/teshsqueak.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio.
sound_vary = FALSE
/decl/emote/audible/teshchirp
key = "tchirp"

View File

@@ -34,6 +34,7 @@
key = "chirp"
emote_message_3p = "chirps!"
emote_sound = 'sound/misc/nymphchirp.ogg'
sound_vary = FALSE
/decl/emote/audible/hoot
key = "hoot"
emote_message_3p = "hoots!"
@@ -109,10 +110,12 @@
key = "snort"
emote_message_3p = "snorts!"
emote_sound = 'sound/voice/Snort.ogg'
sound_vary = FALSE
/decl/emote/audible/meow
key = "meow"
emote_message_3p = "gently meows!"
emote_sound = 'sound/voice/Meow.ogg'
sound_vary = FALSE
/decl/emote/audible/moo
key = "moo"
emote_message_3p = "takes a breath and lets out a moo."

View File

@@ -1,17 +1,18 @@
/decl/emote/audible/synth
key = "beep"
emote_message_3p = "beeps."
emote_sound = 'sound/machines/twobeep.ogg'
key = "ping"
emote_message_3p = "pings."
emote_sound = 'sound/machines/ping.ogg'
/decl/emote/audible/synth/mob_can_use(var/mob/living/user)
if(istype(user) && user.isSynthetic())
return ..()
return FALSE
/decl/emote/audible/synth/ping
key = "ping"
emote_message_3p = "pings."
emote_sound = 'sound/machines/ping.ogg'
/decl/emote/audible/synth/beep
key = "beep"
emote_message_3p = "beeps."
emote_sound = 'sound/machines/twobeep.ogg'
sound_vary = FALSE
/decl/emote/audible/synth/buzz
key = "buzz"
@@ -54,3 +55,19 @@
emote_message_3p_target = "chirps happily at TARGET!"
emote_message_3p = "chirps happily."
emote_sound = 'sound/machines/dwoop.ogg'
/decl/emote/audible/synth/boop
key = "roboboop"
emote_message_1p_target = "You boop at TARGET!"
emote_message_1p = "You boop."
emote_message_3p_target = "boops at TARGET!"
emote_message_3p = "boops."
emote_sound = 'sound/voice/roboboop.ogg'
/decl/emote/audible/synth/robochirp
key = "robochirp"
emote_message_1p_target = "You chirp at TARGET!"
emote_message_1p = "You chirp."
emote_message_3p_target = "chirps at TARGET!"
emote_message_3p = "chirps."
emote_sound = 'sound/voice/robochirp.ogg'

View File

@@ -44,6 +44,7 @@ var/global/list/emotes_by_key
var/emote_range = 0 // If >0, restricts emote visibility to viewers within range.
var/sound_preferences = list(/datum/client_preference/emote_noises) // Default emote sound_preferences is just emote_noises. Belch emote overrides this list for pref-checks.
var/sound_vary = TRUE
/decl/emote/Initialize()
. = ..()
@@ -186,7 +187,7 @@ var/global/list/emotes_by_key
if(islist(sound_to_play) && length(sound_to_play))
sound_to_play = pick(sound_to_play)
if(sound_to_play)
playsound(user.loc, sound_to_play, use_sound["vol"], 0, preference = sound_preferences) //VOREStation Add - Preference
playsound(user.loc, sound_to_play, use_sound["vol"], sound_vary, frequency = null, preference = sound_preferences) //VOREStation Add - Preference
/decl/emote/proc/mob_can_use(var/mob/user)
return istype(user) && user.stat != DEAD && (type in user.get_available_emotes())

View File

@@ -345,14 +345,7 @@
screenstate = 5
if("6")
if(!bibledelay)
var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(src.loc)
if(GLOB.religion)
B.icon_state = GLOB.bible_icon_state
B.item_state = GLOB.bible_item_state
B.name = GLOB.bible_name
B.deity_name = GLOB.deity
new /obj/item/weapon/storage/bible(src.loc)
bibledelay = 1
spawn(60)
bibledelay = 0
@@ -574,4 +567,4 @@
b.icon_state = "book[rand(1,7)]"
qdel(O)
else
..()
..()

View File

@@ -1,12 +1,14 @@
var/list/_human_default_emotes = list(
/decl/emote/visible/blink,
/decl/emote/audible/synth,
/decl/emote/audible/synth/ping,
/decl/emote/audible/synth/beep,
/decl/emote/audible/synth/buzz,
/decl/emote/audible/synth/confirm,
/decl/emote/audible/synth/deny,
/decl/emote/audible/synth/scary,
/decl/emote/audible/synth/dwoop,
/decl/emote/audible/synth/boop,
/decl/emote/audible/synth/robochirp,
/decl/emote/visible/nod,
/decl/emote/visible/shake,
/decl/emote/visible/shiver,

View File

@@ -1,14 +1,23 @@
var/list/_silicon_default_emotes = list(
/decl/emote/audible/synth,
/decl/emote/audible/synth/ping,
/decl/emote/audible/synth/beep,
/decl/emote/audible/synth/buzz,
/decl/emote/audible/synth/confirm,
/decl/emote/audible/synth/deny,
/decl/emote/audible/synth/scary,
/decl/emote/audible/synth/dwoop,
/decl/emote/audible/synth/boop,
/decl/emote/audible/synth/robochirp,
/decl/emote/audible/synth/security,
/decl/emote/audible/synth/security/halt
)
/mob/living/silicon/get_available_emotes()
return global._silicon_default_emotes
/mob/living/silicon/pai/get_available_emotes()
var/list/fulllist = _silicon_default_emotes
fulllist |= _robot_default_emotes
fulllist |= _human_default_emotes
return fulllist

View File

@@ -25,7 +25,9 @@
if(health <= 0)
death(null,"gives one shrill beep before falling lifeless.")
else if(health < maxHealth && istype(src.loc , /obj/item/device/paicard))
adjustBruteLoss(-0.5)
adjustFireLoss(-0.5)
/mob/living/silicon/pai/updatehealth()
if(status_flags & GODMODE)

View File

@@ -31,7 +31,7 @@
"Cat" = "pai-cat",
"Mouse" = "pai-mouse",
"Monkey" = "pai-monkey",
"Corgi" = "pai-borgi",
"Borgi" = "pai-borgi",
"Fox" = "pai-fox",
"Parrot" = "pai-parrot",
"Rabbit" = "pai-rabbit",
@@ -48,11 +48,8 @@
"Duffel" = "pai-duffel",
"Rat" = "rat",
"Panther" = "panther",
<<<<<<< HEAD
=======
"Cyber Elf" = "cyberelf",
"Teppi" = "teppi"
>>>>>>> 1df6e69b74... Merge pull request #13038 from Very-Soft/teppipai
//VOREStation Addition End
)
@@ -414,6 +411,8 @@
resting = 0
icon_state = "[chassis]"
verbs -= /mob/living/silicon/pai/proc/pai_nom //VOREStation edit. Let's remove their nom verb
if(isopenspace(card.loc))
fall()
// No binary for pAIs.
/mob/living/silicon/pai/binarycheck()
@@ -438,10 +437,12 @@
if("Add Access")
idcard.access |= ID.access
to_chat(user, "<span class='notice'>You add the access from the [W] to [src].</span>")
to_chat(src, "<span class='notice'>\The [user] swipes the [W] over you. You copy the access codes.</span>")
return
if("Remove Access")
idcard.access = list()
to_chat(user, "<span class='notice'>You remove the access from [src].</span>")
to_chat(src, "<span class='warning'>\The [user] swipes the [W] over you, removing access codes from you.</span>")
return
if("Cancel")
return
@@ -456,16 +457,16 @@
if(idaccessible == 0)
idaccessible = 1
to_chat(src, "<span class='notice'>You allow access modifications.</span>")
visible_message("<span class='notice'>\The [src] clicks as their access modification slot opens.</span>","<span class='notice'>You allow access modifications.</span>", runemessage = "click")
else
idaccessible = 0
to_chat(src, "<span class='notice'>You block access modfications.</span>")
visible_message("<span class='notice'>\The [src] clicks as their access modification slot closes.</span>","<span class='notice'>You block access modfications.</span>", runemessage = "click")
/mob/living/silicon/pai/verb/wipe_software()
set name = "Wipe Software (CRYO)" //CHOMP EDIT: making this clear on first glance
set category = "pAI Commands" //CHOMP EDIT: moving this to pai commands, where it belongs
set desc = "Wipe your software. This is functionally equivalent to cryo or robotic storage, freeing up your job slot."
set name = "Enter Storage"
set category = "pAI Commands"
set desc = "Upload your personality to the cloud and wipe your software from the card. This is functionally equivalent to cryo or robotic storage, freeing up your job slot."
// Make sure people don't kill themselves accidentally
if(tgui_alert(usr, "WARNING: This will immediately wipe your software and ghost you, removing your character from the round permanently (similar to cryo and robotic storage). Are you entirely sure you want to do this?", "Wipe Software", list("No", "Yes")) != "Yes")

View File

@@ -1,13 +1,15 @@
/mob/living/silicon/pai
var/people_eaten = 0
icon = 'icons/mob/pai_vr.dmi'
softfall = TRUE
var/eye_glow = TRUE
var/image/eye_layer = null // Holds the eye overlay.
var/eye_color = "#00ff0d"
var/global/list/wide_chassis = list(
"rat",
"panther",
"teppi"
)
<<<<<<< HEAD
=======
var/global/list/flying_chassis = list(
"pai-parrot",
"pai-bat",
@@ -43,7 +45,6 @@
verbs |= /mob/living/proc/hide
verbs |= /mob/living/proc/vertical_nom
>>>>>>> 1df6e69b74... Merge pull request #13038 from Very-Soft/teppipai
/mob/living/silicon/pai/proc/pai_nom(var/mob/living/T in oview(1))
set name = "pAI Nom"
@@ -81,17 +82,6 @@
icon_state = "[chassis]_rest_full"
else
icon_state = "[chassis]_rest"
<<<<<<< HEAD
if(chassis in wide_chassis)
icon = 'icons/mob/pai_vr64x64.dmi'
pixel_x = -16
vis_height = 64
else
icon = 'icons/mob/pai_vr.dmi'
pixel_x = 0
vis_height = 32
=======
if(chassis in wide_chassis)
pixel_x = -16
default_pixel_x = -16
@@ -99,7 +89,6 @@
pixel_x = 0
default_pixel_x = 0
add_eyes()
>>>>>>> 1df6e69b74... Merge pull request #13038 from Very-Soft/teppipai
/mob/living/silicon/pai/update_icons() //And other functions cause this to occur, such as digesting someone.
..()
@@ -112,8 +101,6 @@
icon_state = "[chassis]_full"
else if(people_eaten && resting)
icon_state = "[chassis]_rest_full"
<<<<<<< HEAD
=======
if(chassis in wide_chassis)
pixel_x = -16
default_pixel_x = -16
@@ -121,14 +108,7 @@
pixel_x = 0
default_pixel_x = 0
add_eyes()
>>>>>>> 1df6e69b74... Merge pull request #13038 from Very-Soft/teppipai
if(chassis in wide_chassis)
icon = 'icons/mob/pai_vr64x64.dmi'
pixel_x = -16
else
icon = 'icons/mob/pai_vr.dmi'
pixel_x = 0
//proc override to avoid pAI players being invisible while the chassis selection window is open
/mob/living/silicon/pai/proc/choose_chassis()
set category = "pAI Commands"
@@ -138,9 +118,6 @@
choice = tgui_input_list(usr, "What would you like to use for your mobile chassis icon?", "Chassis Choice", possible_chassis)
if(!choice) return
chassis = possible_chassis[choice]
<<<<<<< HEAD
verbs |= /mob/living/proc/hide
=======
if(chassis in wide_chassis)
icon = 'icons/mob/pai_vr64x64.dmi'
vis_height = 64
@@ -179,9 +156,27 @@
to_chat(src, "<span class='warning'>Your selected chassis eye color can not be modified. The color you pick will only apply to supporting chassis and your card screen.</span>")
eye_color = input(src, "Choose your character's eye color:", "Eye Color") as color|null
>>>>>>> 1df6e69b74... Merge pull request #13038 from Very-Soft/teppipai
update_icon()
card.setEmotion(card.current_emotion)
// Release belly contents before being gc'd!
/mob/living/silicon/pai/Destroy()
release_vore_contents()
return ..()
return ..()
/mob/living/silicon/pai/proc/add_eyes()
if(chassis in allows_eye_color)
remove_eyes()
if(!eye_layer)
eye_layer = image(icon, "[icon_state]-eyes")
eye_layer.appearance_flags = appearance_flags
eye_layer.color = eye_color
if(eye_glow)
eye_layer.plane = PLANE_LIGHTING_ABOVE
add_overlay(eye_layer)
/mob/living/silicon/pai/proc/remove_eyes()
if(chassis in allows_eye_color)
cut_overlay(eye_layer)
qdel(eye_layer)
eye_layer = null

View File

@@ -1,19 +1,20 @@
var/list/pai_emotions = list(
"Happy" = 1,
"Cat" = 2,
"Extremely Happy" = 3,
"Face" = 4,
"Laugh" = 5,
"Off" = 6,
"Sad" = 7,
"Angry" = 8,
"What" = 9,
"Neutral" = 10,
"Silly" = 11,
"Nose" = 12,
"Smirk" = 13,
"Exclamation Points" = 14,
"Question Mark" = 15
"Neutral" = 1,
"What" = 2,
"Happy" = 3,
"Cat" = 4,
"Extremely Happy" = 5,
"Face" = 6,
"Laugh" = 7,
"Sad" = 8,
"Angry" = 9,
"Silly" = 10,
"Nose" = 11,
"Smirk" = 12,
"Exclamation Points" = 13,
"Question Mark" = 14,
"Blank" = 15,
"Off" = 16
)

View File

@@ -411,6 +411,35 @@
user.add_language(LANGUAGE_SKRELLIAN)
user.add_language(LANGUAGE_ZADDAT)
user.add_language(LANGUAGE_SCHECHI)
user.add_language(LANGUAGE_DRUDAKAR)
user.add_language(LANGUAGE_SLAVIC)
user.add_language(LANGUAGE_BIRDSONG)
user.add_language(LANGUAGE_SAGARU)
user.add_language(LANGUAGE_CANILUNZT)
user.add_language(LANGUAGE_ECUREUILIAN)
user.add_language(LANGUAGE_DAEMON)
user.add_language(LANGUAGE_ENOCHIAN)
user.add_language(LANGUAGE_VESPINAE)
user.add_language(LANGUAGE_SPACER)
user.add_language(LANGUAGE_CLOWNISH)
user.add_language(LANGUAGE_TAVAN)
user.add_language(LANGUAGE_ECHOSONG)
user.add_language(LANGUAGE_CHIMPANZEE)
user.add_language(LANGUAGE_NEAERA)
user.add_language(LANGUAGE_STOK)
user.add_language(LANGUAGE_FARWA)
user.add_language(LANGUAGE_ROOTLOCAL)
user.add_language(LANGUAGE_VOX)
user.add_language(LANGUAGE_SKRELLIANFAR)
user.add_language(LANGUAGE_MINBUS)
user.add_language(LANGUAGE_ALAI)
user.add_language(LANGUAGE_PROMETHEAN)
user.add_language(LANGUAGE_GIBBERISH)
user.add_language("Mouse")
user.add_language("Cat")
user.add_language("Bird")
user.add_language("Dog")
user.add_language("Teppi")
else
user.remove_language(LANGUAGE_UNATHI)
user.remove_language(LANGUAGE_SIIK)
@@ -418,6 +447,35 @@
user.remove_language(LANGUAGE_SKRELLIAN)
user.remove_language(LANGUAGE_ZADDAT)
user.remove_language(LANGUAGE_SCHECHI)
user.remove_language(LANGUAGE_DRUDAKAR)
user.remove_language(LANGUAGE_SLAVIC)
user.remove_language(LANGUAGE_BIRDSONG)
user.remove_language(LANGUAGE_SAGARU)
user.remove_language(LANGUAGE_CANILUNZT)
user.remove_language(LANGUAGE_ECUREUILIAN)
user.remove_language(LANGUAGE_DAEMON)
user.remove_language(LANGUAGE_ENOCHIAN)
user.remove_language(LANGUAGE_VESPINAE)
user.remove_language(LANGUAGE_SPACER)
user.remove_language(LANGUAGE_CLOWNISH)
user.remove_language(LANGUAGE_TAVAN)
user.remove_language(LANGUAGE_ECHOSONG)
user.remove_language(LANGUAGE_CHIMPANZEE)
user.remove_language(LANGUAGE_NEAERA)
user.remove_language(LANGUAGE_STOK)
user.remove_language(LANGUAGE_FARWA)
user.remove_language(LANGUAGE_ROOTLOCAL)
user.remove_language(LANGUAGE_VOX)
user.remove_language(LANGUAGE_SKRELLIANFAR)
user.remove_language(LANGUAGE_MINBUS)
user.remove_language(LANGUAGE_ALAI)
user.remove_language(LANGUAGE_PROMETHEAN)
user.remove_language(LANGUAGE_GIBBERISH)
user.remove_language("Mouse")
user.remove_language("Cat")
user.remove_language("Bird")
user.remove_language("Dog")
user.remove_language("Teppi")
/datum/pai_software/translator/is_active(mob/living/silicon/pai/user)
return user.translator_on

View File

@@ -16,12 +16,14 @@ var/list/_robot_default_emotes = list(
/decl/emote/visible/spin,
/decl/emote/visible/sidestep,
/decl/emote/audible/synth,
/decl/emote/audible/synth/ping,
/decl/emote/audible/synth/beep,
/decl/emote/audible/synth/buzz,
/decl/emote/audible/synth/confirm,
/decl/emote/audible/synth/deny,
/decl/emote/audible/synth/scary,
/decl/emote/audible/synth/dwoop,
/decl/emote/audible/synth/boop,
/decl/emote/audible/synth/robochirp,
/decl/emote/audible/synth/security,
/decl/emote/audible/synth/security/halt,
//VOREStation Add

View File

@@ -40,7 +40,11 @@
set hidden = 1
set_typing_indicator(TRUE)
var/message = tgui_input_text(usr, "Type your message:", "Say")
var/message
if(usr.client.prefs.tgui_input_mode)
message = tgui_input_text(usr, "Type your message:", "Say")
else
message = input(usr, "Type your message:", "Say") as text
set_typing_indicator(FALSE)
if(message)
@@ -51,7 +55,11 @@
set hidden = 1
set_typing_indicator(TRUE)
var/message = tgui_input_message(usr, "Type your message:", "Emote")
var/message
if(usr.client.prefs.tgui_input_mode)
message = tgui_input_message(usr, "Type your message:", "Emote")
else
message = input(usr, "Type your message:", "Emote") as message
set_typing_indicator(FALSE)
if(message)
@@ -62,7 +70,12 @@
set name = ".Whisper"
set hidden = 1
var/message = tgui_input_text(usr, "Type your message:", "Whisper")
var/message
if(usr.client.prefs.tgui_input_mode)
message = tgui_input_text(usr, "Type your message:", "Whisper")
else
message = input(usr, "Type your message:", "Whisper") as text
if(message)
whisper(message)
@@ -70,6 +83,11 @@
set name = ".Subtle"
set hidden = 1
var/message = tgui_input_message(usr, "Type your message:", "Subtle")
var/message
if(usr.client.prefs.tgui_input_mode)
message = tgui_input_message(usr, "Type your message:", "Subtle")
else
message = input(usr, "Type your message:", "Subtle") as message
if(message)
me_verb_subtle(message)

View File

@@ -237,6 +237,7 @@
P.vore_taste = src.vore_taste
P.vore_smell = src.vore_smell
P.permit_healbelly = src.permit_healbelly
P.noisy = src.noisy
P.show_vore_fx = src.show_vore_fx
P.can_be_drop_prey = src.can_be_drop_prey
P.can_be_drop_pred = src.can_be_drop_pred
@@ -284,6 +285,7 @@
vore_taste = P.vore_taste
vore_smell = P.vore_smell
permit_healbelly = P.permit_healbelly
noisy = P.noisy
show_vore_fx = P.show_vore_fx
can_be_drop_prey = P.can_be_drop_prey
can_be_drop_pred = P.can_be_drop_pred

View File

@@ -53,6 +53,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/digest_leave_remains = FALSE
var/allowmobvore = TRUE
var/permit_healbelly = TRUE
var/noisy = FALSE
// These are 'modifier' prefs, do nothing on their own but pair with drop_prey/drop_pred settings.
var/drop_vore = TRUE
@@ -152,6 +153,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
vore_taste = json_from_file["vore_taste"]
vore_smell = json_from_file["vore_smell"]
permit_healbelly = json_from_file["permit_healbelly"]
noisy = json_from_file["noisy"]
show_vore_fx = json_from_file["show_vore_fx"]
can_be_drop_prey = json_from_file["can_be_drop_prey"]
can_be_drop_pred = json_from_file["can_be_drop_pred"]
@@ -189,6 +191,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
allowmobvore = TRUE
if(isnull(permit_healbelly))
permit_healbelly = TRUE
if (isnull(noisy))
noisy = FALSE
if(isnull(show_vore_fx))
show_vore_fx = TRUE
if(isnull(can_be_drop_prey))
@@ -241,6 +245,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"vore_taste" = vore_taste,
"vore_smell" = vore_smell,
"permit_healbelly" = permit_healbelly,
"noisy" = noisy,
"show_vore_fx" = show_vore_fx,
"can_be_drop_prey" = can_be_drop_prey,
"can_be_drop_pred" = can_be_drop_pred,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 25 KiB

BIN
icons/obj/paicard.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

BIN
sound/voice/roboboop.ogg Normal file

Binary file not shown.

BIN
sound/voice/robochirp.ogg Normal file

Binary file not shown.

View File

@@ -21,10 +21,10 @@ export const TelecommsLogBrowser = (props, context) => {
height={450}
resizable>
<Window.Content scrollable>
{(temp && temp.length) ? (
<NoticeBox warning>
{temp ? (
<NoticeBox danger={temp.color === "bad"} warning={temp.color !== "bad"}>
<Box display="inline-box" verticalAlign="middle">
{temp}
{temp.text}
</Box>
<Button
icon="times-circle"
@@ -97,7 +97,7 @@ const TelecommsServerSelection = (props, context) => {
}
return (
<Section title="Detected Telecommunication Servers">
<Section title="Detected Telecommunications Servers">
<LabeledList>
{servers.map(server => (
<LabeledList.Item

View File

@@ -20,10 +20,10 @@ export const TelecommsMachineBrowser = (props, context) => {
height={450}
resizable>
<Window.Content scrollable>
{(temp && temp.length) ? (
<NoticeBox warning>
{temp ? (
<NoticeBox danger={temp.color === "bad"} warning={temp.color !== "bad"}>
<Box display="inline-box" verticalAlign="middle">
{temp}
{temp.text}
</Box>
<Button
icon="times-circle"

File diff suppressed because one or more lines are too long

View File

@@ -118,7 +118,6 @@
#include "code\_global_vars\bitfields.dm"
#include "code\_global_vars\misc.dm"
#include "code\_global_vars\mobs.dm"
#include "code\_global_vars\religion.dm"
#include "code\_global_vars\sensitive.dm"
#include "code\_global_vars\traits.dm"
#include "code\_global_vars\typecache.dm"
@@ -1258,8 +1257,6 @@
#include "code\game\objects\items\devices\paicard_ch.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"
#include "code\game\objects\items\devices\powersink.dm"
#include "code\game\objects\items\devices\scanners.dm"
#include "code\game\objects\items\devices\scanners_vr.dm"
#include "code\game\objects\items\devices\spy_bug.dm"
#include "code\game\objects\items\devices\starcaster_ch.dm"
#include "code\game\objects\items\devices\suit_cooling.dm"
@@ -1296,6 +1293,13 @@
#include "code\game\objects\items\devices\radio\radio_vr.dm"
#include "code\game\objects\items\devices\radio\radio_yw.dm"
#include "code\game\objects\items\devices\radio\radiopack.dm"
#include "code\game\objects\items\devices\scanners\gas.dm"
#include "code\game\objects\items\devices\scanners\halogen.dm"
#include "code\game\objects\items\devices\scanners\health.dm"
#include "code\game\objects\items\devices\scanners\mass_spectrometer.dm"
#include "code\game\objects\items\devices\scanners\reagents.dm"
#include "code\game\objects\items\devices\scanners\sleevemate.dm"
#include "code\game\objects\items\devices\scanners\slime.dm"
#include "code\game\objects\items\robot\robot_items.dm"
#include "code\game\objects\items\robot\robot_parts.dm"
#include "code\game\objects\items\robot\robot_upgrades.dm"