From 2a83d9da7fcf085d5d0a776cd973327d520062eb Mon Sep 17 00:00:00 2001 From: Kashargul <144968721+Kashargul@users.noreply.github.com> Date: Sat, 22 Mar 2025 22:10:02 +0100 Subject: [PATCH] allows soulcatcher import and export (#17391) * allows soulcatcher import and export * . * vore pref transfer to define * order them * fix button issue on tgpanel * Update vore_prefs.dm * Update VorePanelExportSoulcatcherString.tsx --- code/__defines/vore_prefs.dm | 60 ++++++++++ code/datums/chat_message.dm | 2 +- code/modules/vore/eating/belly_import.dm | 28 ++++- code/modules/vore/eating/exportpanel_vr.dm | 18 ++- code/modules/vore/eating/living_vr.dm | 108 +----------------- code/modules/vore/eating/soulcatcher.dm | 13 ++- .../modules/vore/eating/soulcatcher_import.dm | 47 ++++++++ code/modules/vore/mob_tf.dm | 49 +------- tgui/packages/tgui-panel/panelFocus.ts | 3 + .../VorePanelExportDownload.tsx | 15 ++- .../VorePanelExportSoulcatcherString.tsx | 53 +++++++++ .../interfaces/VorePanelExport/constants.ts | 14 +++ .../tgui/interfaces/VorePanelExport/types.ts | 13 +++ vorestation.dme | 2 + 14 files changed, 262 insertions(+), 163 deletions(-) create mode 100644 code/__defines/vore_prefs.dm create mode 100644 code/modules/vore/eating/soulcatcher_import.dm create mode 100644 tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportSoulcatcherString.tsx diff --git a/code/__defines/vore_prefs.dm b/code/__defines/vore_prefs.dm new file mode 100644 index 00000000000..9a016bb0067 --- /dev/null +++ b/code/__defines/vore_prefs.dm @@ -0,0 +1,60 @@ +#define VORE_PREF_TRANSFER(target, source) \ + target.digestable = source.digestable; \ + target.devourable = source.devourable; \ + target.feeding = source.feeding; \ + target.absorbable = source.absorbable; \ + target.allowmobvore = source.allowmobvore; \ + target.permit_healbelly = source.permit_healbelly; \ + \ + target.vore_taste = source.vore_taste; \ + target.vore_smell = source.vore_smell; \ + target.noisy = source.noisy; \ + target.show_vore_fx = source.show_vore_fx; \ + target.selective_preference = source.selective_preference; \ + target.digest_leave_remains = source.digest_leave_remains; \ + target.digest_pain = source.digest_pain; \ + target.noisy_full = source.noisy_full; \ + target.eating_privacy_global = source.eating_privacy_global; \ + \ + target.can_be_drop_prey = source.can_be_drop_prey; \ + target.can_be_drop_pred = source.can_be_drop_pred; \ + target.throw_vore = source.throw_vore; \ + target.food_vore = source.food_vore; \ + target.drop_vore = source.drop_vore; \ + target.slip_vore = source.slip_vore; \ + target.stumble_vore = source.stumble_vore; \ + target.phase_vore = source.phase_vore; \ + \ + target.resizable = source.resizable; \ + target.step_mechanics_pref = source.step_mechanics_pref; \ + target.pickup_pref = source.pickup_pref; \ + target.allow_spontaneous_tf = source.allow_spontaneous_tf; \ + target.allow_mind_transfer = source.allow_mind_transfer; \ + target.allow_mimicry = source.allow_mimicry; \ + \ + target.consume_liquid_belly = source.consume_liquid_belly; \ + target.receive_reagents = source.receive_reagents; \ + target.apply_reagents = source.apply_reagents; \ + target.give_reagents = source.give_reagents; \ + \ + target.nutrition_messages = source.nutrition_messages; \ + target.nutrition_message_visible = source.nutrition_message_visible; \ + target.weight_message_visible = source.weight_message_visible; \ + target.weight_messages = source.weight_messages; \ + \ + target.latejoin_vore = source.latejoin_vore; \ + target.latejoin_prey = source.latejoin_prey; \ + target.no_latejoin_vore_warning = source.no_latejoin_vore_warning; \ + target.no_latejoin_prey_warning = source.no_latejoin_prey_warning; \ + target.no_latejoin_vore_warning_time = source.no_latejoin_vore_warning_time; \ + target.no_latejoin_prey_warning_time = source.no_latejoin_prey_warning_time; \ + target.no_latejoin_vore_warning_persists = source.no_latejoin_vore_warning_persists;\ + target.no_latejoin_prey_warning_persists = source.no_latejoin_prey_warning_persists;\ + \ + target.autotransferable = source.autotransferable; \ + target.strip_pref = source.strip_pref; \ + target.vore_sprite_multiply = source.vore_sprite_multiply; \ + target.vore_sprite_color = source.vore_sprite_color; \ + target.belly_rub_target = source.belly_rub_target; \ + \ + target.soulcatcher_pref_flags = source.soulcatcher_pref_flags; diff --git a/code/datums/chat_message.dm b/code/datums/chat_message.dm index b5e90ad54e7..4df23e6c0c3 100644 --- a/code/datums/chat_message.dm +++ b/code/datums/chat_message.dm @@ -211,7 +211,7 @@ var/list/runechat_image_cache = list() // When choosing to update the remaining time we have to be careful not to update the // scheduled time once the EOL has been executed. - var/continuing = 0 + var/continuing = NONE if (time_spent >= time_before_fade) if(m.message.pixel_y < starting_height) var/max_height = m.message.pixel_y + m.approx_lines * CHAT_MESSAGE_APPROX_LHEIGHT - starting_height diff --git a/code/modules/vore/eating/belly_import.dm b/code/modules/vore/eating/belly_import.dm index e7eb74ee32b..114d6f48b9a 100644 --- a/code/modules/vore/eating/belly_import.dm +++ b/code/modules/vore/eating/belly_import.dm @@ -1,8 +1,13 @@ +#define IMPORT_ALL_BELLIES "Import all bellies from VRDB" +#define IMPORT_ONE_BELLY "Import one belly from VRDB" +#define IMPORT_SOULCATCHER "Import Soulcatcher from VRDB" + + /datum/vore_look/proc/import_belly(mob/host) - var/panel_choice = tgui_input_list(host, "Belly Import", "Pick an option", list("Import all bellies from VRDB","Import one belly from VRDB")) + var/panel_choice = tgui_input_list(host, "Belly Import", "Pick an option", list(IMPORT_ALL_BELLIES, IMPORT_ONE_BELLY, IMPORT_SOULCATCHER)) if(!panel_choice) return var/pickOne = FALSE - if(panel_choice == "Import one belly from VRDB") + if(panel_choice == IMPORT_ONE_BELLY) pickOne = TRUE var/input_file = input(host,"Please choose a valid VRDB file to import from.","Belly Import") as file var/input_data @@ -12,6 +17,21 @@ tgui_alert_async(host, "The supplied file contains errors: [e]", "Error!") return FALSE + if(panel_choice == IMPORT_SOULCATCHER) + if(!islist(input_data["soulcatcher"])) + tgui_alert_async(host, "The supplied file was not a valid VRDB >= v0.2 file.", "Error!") + return FALSE + + var/list/soulcatcher_data = input_data["soulcatcher"] + var/return_val = import_soulcatcher(host, soulcatcher_data) + if(return_val) + host.updateVRPanel() + unsaved_changes = TRUE + return return_val + + if(islist(input_data["bellies"])) + input_data = input_data["bellies"] + if(!islist(input_data)) tgui_alert_async(host, "The supplied file was not a valid VRDB file.", "Error!") return FALSE @@ -1155,3 +1175,7 @@ host.handle_belly_update() host.updateVRPanel() unsaved_changes = TRUE + +#undef IMPORT_ALL_BELLIES +#undef IMPORT_ONE_BELLY +#undef IMPORT_SOULCATCHER diff --git a/code/modules/vore/eating/exportpanel_vr.dm b/code/modules/vore/eating/exportpanel_vr.dm index 1959f78e572..4ba562b9c0c 100644 --- a/code/modules/vore/eating/exportpanel_vr.dm +++ b/code/modules/vore/eating/exportpanel_vr.dm @@ -27,7 +27,7 @@ var/list/data = list() var/mob/living/host = user - data["db_version"] = "0.1" + data["db_version"] = "0.2" data["db_repo"] = "vorestation" data["mob_name"] = host.real_name @@ -481,4 +481,20 @@ for(var/msg in B.fullness5_messages) belly_data["fullness5_messages"] += msg + // Soulcatcher export + if(user.soulgem) + var/obj/soulgem/gem = user.soulgem + var/list/soulcatcher_data = list() + soulcatcher_data["name"] = gem.name + soulcatcher_data["setting_flags"] = gem.setting_flags + soulcatcher_data["inside_flavor"] = gem.inside_flavor + soulcatcher_data["capture_message"] = gem.capture_message + soulcatcher_data["transit_message"] = gem.transit_message + soulcatcher_data["release_message"] = gem.release_message + soulcatcher_data["transfer_message"] = gem.transfer_message + soulcatcher_data["delete_message"] = gem.delete_message + soulcatcher_data["linked_belly"] = gem.linked_belly + + data["soulcatcher"] = soulcatcher_data + return data diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 4b8e2bf977d..2d309e0e930 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -250,59 +250,7 @@ var/datum/vore_preferences/P = client.prefs_vr - P.digestable = src.digestable - P.devourable = src.devourable - P.feeding = src.feeding - P.absorbable = src.absorbable - P.resizable = src.resizable - P.digest_leave_remains = src.digest_leave_remains - P.allowmobvore = src.allowmobvore - P.vore_taste = src.vore_taste - P.vore_smell = src.vore_smell - P.permit_healbelly = src.permit_healbelly - P.noisy = src.noisy - P.selective_preference = src.selective_preference - 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 - P.allow_spontaneous_tf = src.allow_spontaneous_tf - P.step_mechanics_pref = src.step_mechanics_pref - P.pickup_pref = src.pickup_pref - P.drop_vore = src.drop_vore - P.slip_vore = src.slip_vore - P.throw_vore = src.throw_vore - P.food_vore = src.food_vore - P.consume_liquid_belly = src.consume_liquid_belly - P.digest_pain = src.digest_pain - P.stumble_vore = src.stumble_vore - P.eating_privacy_global = src.eating_privacy_global - P.allow_mimicry = src.allow_mimicry - - P.nutrition_message_visible = src.nutrition_message_visible - P.nutrition_messages = src.nutrition_messages - P.weight_message_visible = src.weight_message_visible - P.weight_messages = src.weight_messages - P.vore_sprite_color = src.vore_sprite_color - P.allow_mind_transfer = src.allow_mind_transfer - - P.phase_vore = src.phase_vore - P.noisy_full = src.noisy_full - P.latejoin_vore = src.latejoin_vore - P.latejoin_prey = src.latejoin_prey - P.receive_reagents = src.receive_reagents - P.give_reagents = src.give_reagents - P.apply_reagents = src.apply_reagents - P.autotransferable = src.autotransferable - P.strip_pref = src.strip_pref - P.vore_sprite_multiply = src.vore_sprite_multiply - P.no_latejoin_vore_warning = src.no_latejoin_vore_warning - P.no_latejoin_prey_warning = src.no_latejoin_prey_warning - P.no_latejoin_vore_warning_time = src.no_latejoin_vore_warning_time - P.no_latejoin_prey_warning_time = src.no_latejoin_prey_warning_time - P.no_latejoin_vore_warning_persists = src.no_latejoin_vore_warning_persists - P.no_latejoin_prey_warning_persists = src.no_latejoin_prey_warning_persists - P.belly_rub_target = src.belly_rub_target - P.soulcatcher_pref_flags = src.soulcatcher_pref_flags + VORE_PREF_TRANSFER(P, src) var/list/serialized = list() for(var/obj/belly/B as anything in src.vore_organs) @@ -323,59 +271,7 @@ var/datum/vore_preferences/P = client.prefs_vr - digestable = P.digestable - devourable = P.devourable - feeding = P.feeding - absorbable = P.absorbable - resizable = P.resizable - digest_leave_remains = P.digest_leave_remains - allowmobvore = P.allowmobvore - vore_taste = P.vore_taste - vore_smell = P.vore_smell - permit_healbelly = P.permit_healbelly - selective_preference = P.selective_preference - 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 - allow_spontaneous_tf = P.allow_spontaneous_tf - step_mechanics_pref = P.step_mechanics_pref - pickup_pref = P.pickup_pref - drop_vore = P.drop_vore - slip_vore = P.slip_vore - throw_vore = P.throw_vore - stumble_vore = P.stumble_vore - food_vore = P.food_vore - consume_liquid_belly = P.consume_liquid_belly - digest_pain = P.digest_pain - eating_privacy_global = P.eating_privacy_global - allow_mimicry = P.allow_mimicry - - nutrition_message_visible = P.nutrition_message_visible - nutrition_messages = P.nutrition_messages - weight_message_visible = P.weight_message_visible - weight_messages = P.weight_messages - vore_sprite_color = P.vore_sprite_color - allow_mind_transfer = P.allow_mind_transfer - - phase_vore = P.phase_vore - noisy_full = P.noisy_full - latejoin_vore = P.latejoin_vore - latejoin_prey = P.latejoin_prey - receive_reagents = P.receive_reagents - give_reagents = P.give_reagents - apply_reagents = P.apply_reagents - autotransferable = P.autotransferable - strip_pref = P.strip_pref - vore_sprite_multiply = P.vore_sprite_multiply - no_latejoin_vore_warning = P.no_latejoin_vore_warning - no_latejoin_prey_warning = P.no_latejoin_prey_warning - no_latejoin_vore_warning_time = P.no_latejoin_vore_warning_time - no_latejoin_prey_warning_time = P.no_latejoin_prey_warning_time - no_latejoin_vore_warning_persists = P.no_latejoin_vore_warning_persists - no_latejoin_prey_warning_persists = P.no_latejoin_prey_warning_persists - belly_rub_target = P.belly_rub_target - soulcatcher_pref_flags = P.soulcatcher_pref_flags + VORE_PREF_TRANSFER(src, P) if(bellies) if(isliving(src)) diff --git a/code/modules/vore/eating/soulcatcher.dm b/code/modules/vore/eating/soulcatcher.dm index 589cda58523..73264aece5d 100644 --- a/code/modules/vore/eating/soulcatcher.dm +++ b/code/modules/vore/eating/soulcatcher.dm @@ -40,12 +40,17 @@ // Store the vars_to_save into the save file /obj/soulgem/deserialize(list/data) . = ..() - for(var/obj/belly in owner.vore_organs) - if(belly.name == data["linked_belly"]) - update_linked_belly(belly, TRUE) - return + if(apply_stored_belly(data["linked_belly"], TRUE)) + return linked_belly = null +/obj/soulgem/proc/apply_stored_belly(var/belly_string, var/skip_unreg = FALSE) + for(var/obj/belly in owner.vore_organs) + if(belly.name == belly_string) + update_linked_belly(belly, TRUE) + return TRUE + return FALSE + // Allows to transfer the soulgem to the given mob /obj/soulgem/proc/transfer_self(var/mob/target) QDEL_NULL(target.soulgem) diff --git a/code/modules/vore/eating/soulcatcher_import.dm b/code/modules/vore/eating/soulcatcher_import.dm new file mode 100644 index 00000000000..abbc1d75fb6 --- /dev/null +++ b/code/modules/vore/eating/soulcatcher_import.dm @@ -0,0 +1,47 @@ +/datum/vore_look/proc/import_soulcatcher(mob/host, var/list/soulcatcher_data) + if(!host.soulgem) + return FALSE + + if(!islist(soulcatcher_data)) + tgui_alert_async(host, "The supplied file was not a valid VRDB file.", "Error!") + return FALSE + + if(LAZYLEN(soulcatcher_data) == 0) + return FALSE + + var/confirm = tgui_alert(host, "WARNING: This will override your current soulcatcher settings!","Import soulcatcher?",list("Yes","Cancel")) + + if(confirm != "Yes") + return FALSE + + var/obj/soulgem/gem = host.soulgem + + if(istext(soulcatcher_data["name"])) + gem.rename(soulcatcher_data["name"]) + + if(istext(soulcatcher_data["inside_flavor"])) + gem.adjust_interior(soulcatcher_data["inside_flavor"]) + + if(istext(soulcatcher_data["capture_message"])) + gem.set_custom_message("capture", soulcatcher_data["capture_message"]) + + if(istext(soulcatcher_data["transit_message"])) + gem.set_custom_message("transit", soulcatcher_data["transit_message"]) + + if(istext(soulcatcher_data["release_message"])) + gem.set_custom_message("release", soulcatcher_data["release_message"]) + + if(istext(soulcatcher_data["transfer_message"])) + gem.set_custom_message("transfer", soulcatcher_data["transfer_message"]) + + if(istext(soulcatcher_data["delete_message"])) + gem.set_custom_message("delete", soulcatcher_data["delete_message"]) + + if(istext(soulcatcher_data["linked_belly"])) + gem.apply_stored_belly(soulcatcher_data["linked_belly"]) + + if(isnum(soulcatcher_data["setting_flags"])) + gem.setting_flags = NONE + gem.toggle_setting(soulcatcher_data["setting_flags"]) + + return TRUE diff --git a/code/modules/vore/mob_tf.dm b/code/modules/vore/mob_tf.dm index bd6dc085899..df75aa5f332 100644 --- a/code/modules/vore/mob_tf.dm +++ b/code/modules/vore/mob_tf.dm @@ -148,60 +148,15 @@ /mob/living/proc/copy_vore_prefs_to_mob(var/mob/living/new_mob) //For primarily copying vore preference settings from a carbon mob to a simplemob //It can be used for other things, but be advised, if you're using it to put a simplemob into a carbon mob, you're gonna be overriding a bunch of prefs + new_mob.ooc_notes = ooc_notes new_mob.ooc_notes_likes = ooc_notes_likes new_mob.ooc_notes_dislikes = ooc_notes_dislikes - new_mob.digestable = digestable - new_mob.devourable = devourable - new_mob.absorbable = absorbable - new_mob.feeding = feeding - new_mob.can_be_drop_prey = can_be_drop_prey - new_mob.can_be_drop_pred = can_be_drop_pred - new_mob.digest_leave_remains = digest_leave_remains - new_mob.allowmobvore = allowmobvore - new_mob.permit_healbelly = permit_healbelly - new_mob.noisy = noisy - new_mob.selective_preference = selective_preference new_mob.appendage_color = appendage_color new_mob.appendage_alt_setting = appendage_alt_setting - new_mob.drop_vore = drop_vore - new_mob.stumble_vore = stumble_vore - new_mob.slip_vore = slip_vore - new_mob.throw_vore = throw_vore - new_mob.food_vore = food_vore - new_mob.consume_liquid_belly = consume_liquid_belly - new_mob.resizable = resizable - new_mob.show_vore_fx = show_vore_fx - new_mob.step_mechanics_pref = step_mechanics_pref - new_mob.pickup_pref = pickup_pref - new_mob.vore_taste = vore_taste - new_mob.vore_smell = vore_smell - new_mob.nutrition_message_visible = nutrition_message_visible - new_mob.allow_spontaneous_tf = allow_spontaneous_tf - new_mob.eating_privacy_global = eating_privacy_global - new_mob.allow_mimicry = allow_mimicry new_mob.text_warnings = text_warnings - new_mob.allow_mind_transfer = allow_mind_transfer - new_mob.phase_vore = phase_vore - new_mob.latejoin_vore = latejoin_vore - new_mob.latejoin_prey = latejoin_prey - new_mob.receive_reagents = receive_reagents - new_mob.give_reagents = give_reagents - new_mob.apply_reagents = apply_reagents - new_mob.autotransferable = autotransferable - new_mob.strip_pref = strip_pref - new_mob.vore_sprite_color = vore_sprite_color - new_mob.vore_sprite_multiply = vore_sprite_multiply - new_mob.noisy_full = noisy_full - new_mob.no_latejoin_vore_warning = no_latejoin_vore_warning - new_mob.no_latejoin_prey_warning = no_latejoin_prey_warning - new_mob.no_latejoin_vore_warning_time = no_latejoin_vore_warning_time - new_mob.no_latejoin_prey_warning_time = no_latejoin_prey_warning_time - new_mob.no_latejoin_vore_warning_persists = no_latejoin_vore_warning_persists - new_mob.no_latejoin_prey_warning_persists = no_latejoin_prey_warning_persists - new_mob.belly_rub_target = belly_rub_target - new_mob.soulcatcher_pref_flags = soulcatcher_pref_flags + VORE_PREF_TRANSFER(new_mob, src) // Requires a /mob/living type path for transformation. Returns the new mob on success, null in all other cases. // Just handles mob TF right now, but maybe we'll want to do something similar for items in the future. diff --git a/tgui/packages/tgui-panel/panelFocus.ts b/tgui/packages/tgui-panel/panelFocus.ts index d47207d209c..efbc089c6e4 100644 --- a/tgui/packages/tgui-panel/panelFocus.ts +++ b/tgui/packages/tgui-panel/panelFocus.ts @@ -33,6 +33,9 @@ export const setupPanelFocusHacks = () => { if (dist >= MIN_SELECTION_DISTANCE) { focusStolen = true; } + if (document.activeElement?.className.includes('Button')) { + focusStolen = true; + } } if (!focusStolen) { deferredFocusMap(); diff --git a/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportDownload.tsx b/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportDownload.tsx index 6361c4048c8..f92ef2b1b7a 100644 --- a/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportDownload.tsx +++ b/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportDownload.tsx @@ -2,12 +2,13 @@ import { useBackend } from 'tgui/backend'; import { Data } from './types'; import { generateBellyString } from './VorePanelExportBellyString'; +import { generateSoulcatcherString } from './VorePanelExportSoulcatcherString'; import { getCurrentTimestamp } from './VorePanelExportTimestamp'; export const downloadPrefs = (extension: string) => { const { data } = useBackend(); - const { db_version, db_repo, mob_name, bellies } = data; + const { db_version, db_repo, mob_name, bellies, soulcatcher } = data; if (!bellies) { return; @@ -51,6 +52,11 @@ export const downloadPrefs = (extension: string) => { type: 'text/html', }); }); + if (soulcatcher) { + blob = new Blob([blob, generateSoulcatcherString(soulcatcher)], { + type: 'text/html', + }); + } blob = new Blob( [ blob, @@ -63,7 +69,12 @@ export const downloadPrefs = (extension: string) => { } if (extension === '.vrdb') { - blob = new Blob([JSON.stringify(bellies)], { type: 'application/json' }); + blob = new Blob( + [JSON.stringify({ bellies: bellies, soulcatcher: soulcatcher })], + { + type: 'application/json', + }, + ); } Byond.saveBlob(blob, filename, extension); diff --git a/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportSoulcatcherString.tsx b/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportSoulcatcherString.tsx new file mode 100644 index 00000000000..7b0d14c34d8 --- /dev/null +++ b/tgui/packages/tgui/interfaces/VorePanelExport/VorePanelExportSoulcatcherString.tsx @@ -0,0 +1,53 @@ +import { SoulcatcherSettingsFlag } from './constants'; +import type { Soulcatcher } from './types'; + +// prettier-ignore +export const generateSoulcatcherString = (soulcatcher: Soulcatcher) => { + const { name, inside_flavor, capture_message, transit_message, release_message, transfer_message, delete_message, linked_belly, setting_flags } = soulcatcher; + + const index = "sc_1"; + + let result = ''; + result += '

'; + result += '

'; + + result += '
'; + result += '
'; + + result += '== Settings ==
'; + const arr = new Array(); + let parsedFlag = setting_flags; + while(parsedFlag !== 0) { + arr.push(String(parsedFlag)); + parsedFlag = Math.floor(parsedFlag / 2); + } + for(const flag in SoulcatcherSettingsFlag) { + if(arr.includes(flag)) { + result += '' + SoulcatcherSettingsFlag[flag] + ''; + } else { + result += '' + SoulcatcherSettingsFlag[flag] + ''; + + } + + } + + result += '

'; + result += '== Descriptions ==
'; + result += 'Inside Flavor:
' + inside_flavor + '

'; + result += 'Capture Message:
' + capture_message + '

'; + result += 'Transit Message:
' + transit_message + '

'; + result += 'Release Message:
' + release_message + '

'; + result += 'Transfer Message:
' + transfer_message + '

'; + result += 'Delete Message:
' + delete_message + '

'; + result += 'Linked Belly:
' + linked_belly + '

'; + + + result += '
'; + result += '
'; // End Div messagesTabpanel + + result += ''; + + return result; +}; diff --git a/tgui/packages/tgui/interfaces/VorePanelExport/constants.ts b/tgui/packages/tgui/interfaces/VorePanelExport/constants.ts index cf3f9ce9246..8957925a5ca 100644 --- a/tgui/packages/tgui/interfaces/VorePanelExport/constants.ts +++ b/tgui/packages/tgui/interfaces/VorePanelExport/constants.ts @@ -60,3 +60,17 @@ export const AutotransferFlagIcon = { 'Clothes and Bags': '', Food: '', }; + +export const SoulcatcherSettingsFlag = { + '1': 'Catch User', + '2': 'Catch Prey', + '4': 'Ext. hearing', + '8': 'Ext. Vision', + '16': 'Mind Backup', + '32': 'SR Projecting', + '64': 'Catch Ghost', + '128': 'Soulcatcher On', + '256': 'Show SFX', + '512': 'Catch Drain', + '1024': 'SR Vision', +}; diff --git a/tgui/packages/tgui/interfaces/VorePanelExport/types.ts b/tgui/packages/tgui/interfaces/VorePanelExport/types.ts index cc6da7fff6e..96ff94f110a 100644 --- a/tgui/packages/tgui/interfaces/VorePanelExport/types.ts +++ b/tgui/packages/tgui/interfaces/VorePanelExport/types.ts @@ -5,6 +5,7 @@ export type Data = { db_repo: string; mob_name: string; bellies?: Belly[]; + soulcatcher?: Soulcatcher; }; export type Belly = { @@ -218,3 +219,15 @@ export type Belly = { fullness4_messages: string[]; fullness5_messages: string[]; }; + +export type Soulcatcher = { + name: string; + inside_flavor: string; + capture_message: string; + transit_message: string; + release_message: string; + transfer_message: string; + delete_message: string; + linked_belly: string; + setting_flags: number; +}; diff --git a/vorestation.dme b/vorestation.dme index 19b49c033fd..9754f47f009 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -167,6 +167,7 @@ #include "code\__defines\verb_manager.dm" #include "code\__defines\visualnet.dm" #include "code\__defines\vore.dm" +#include "code\__defines\vore_prefs.dm" #include "code\__defines\vote.dm" #include "code\__defines\vv.dm" #include "code\__defines\webhooks.dm" @@ -4374,6 +4375,7 @@ #include "code\modules\vore\eating\simple_animal_vr.dm" #include "code\modules\vore\eating\slipvore_vr.dm" #include "code\modules\vore\eating\soulcatcher.dm" +#include "code\modules\vore\eating\soulcatcher_import.dm" #include "code\modules\vore\eating\soulcatcher_mob.dm" #include "code\modules\vore\eating\soulcatcher_observer.dm" #include "code\modules\vore\eating\stumblevore_vr.dm"