diff --git a/code/modules/loadout/loadout_menu.dm b/code/modules/loadout/loadout_menu.dm
index 243641faeed5e..8a09a291532e8 100644
--- a/code/modules/loadout/loadout_menu.dm
+++ b/code/modules/loadout/loadout_menu.dm
@@ -33,6 +33,7 @@
/datum/preference_middleware/loadout/proc/action_clear_all(list/params, mob/user)
PRIVATE_PROC(TRUE)
+ preferences.loadout_points = preferences.get_loadout_points() // SS220 ADD - Lodout points
preferences.update_preference(GLOB.preference_entries[/datum/preference/loadout], null)
return TRUE
@@ -97,6 +98,7 @@
/datum/preference_middleware/loadout/get_ui_data(mob/user)
var/list/data = list()
data["job_clothes"] = preferences.character_preview_view.show_job_clothes
+ data["loadout_leftpoints"] = preferences.loadout_points // SS220 ADD - Lodout points
return data
/datum/preference_middleware/loadout/get_ui_static_data(mob/user)
diff --git a/modular_bandastation/loadout/code/client.dm b/modular_bandastation/loadout/code/client.dm
index 03ad62dfba7c8..936fbcf6300fe 100644
--- a/modular_bandastation/loadout/code/client.dm
+++ b/modular_bandastation/loadout/code/client.dm
@@ -3,10 +3,12 @@
#define DONATION_TIER_3 1000
#define DONATION_TIER_4 2220
#define DONATION_TIER_5 10000
+#define BASIC_DONATOR_LEVEL 0
/client
/// Call `proc/get_donator_level()` instead to get a value when possible.
- var/donator_level = 0
+ var/donator_level = BASIC_DONATOR_LEVEL
+ var/can_save_donator_level = FALSE
COOLDOWN_DECLARE(db_check_cooldown)
// For unit-tests
@@ -47,6 +49,8 @@
if(query_get_donator_level.warn_execute() && length(query_get_donator_level.rows))
query_get_donator_level.NextRow()
amount = query_get_donator_level.item[1]
+ //Даем разрешение сохранять лодаут только после успешного запроса к СУБД
+ can_save_donator_level = TRUE
qdel(query_get_donator_level)
switch(amount)
diff --git a/modular_bandastation/loadout/code/loadout_items.dm b/modular_bandastation/loadout/code/loadout_items.dm
index aefed0dd25bc3..c5fbfe954648e 100644
--- a/modular_bandastation/loadout/code/loadout_items.dm
+++ b/modular_bandastation/loadout/code/loadout_items.dm
@@ -1,5 +1,10 @@
/datum/loadout_item
- var/donator_level = 0
+ var/donator_level = BASIC_DONATOR_LEVEL
+ var/cost = 1
+
+/datum/loadout_item/to_ui_data()
+ . = ..()
+ .["cost"] = cost
/datum/loadout_item/get_item_information()
. = ..()
diff --git a/modular_bandastation/loadout/code/loadout_preference.dm b/modular_bandastation/loadout/code/loadout_preference.dm
index 534c42e7ad686..845f8ac5e5007 100644
--- a/modular_bandastation/loadout/code/loadout_preference.dm
+++ b/modular_bandastation/loadout/code/loadout_preference.dm
@@ -1,25 +1,47 @@
-/datum/preferences/load_preferences()
- . = ..()
- parent.get_donator_level()
+/datum/preference_middleware/loadout/on_new_character(mob/user)
+ preferences.loadout_points = preferences.get_loadout_points()
+ .=..()
// Handles selecting from the preferences UI
/datum/preference_middleware/loadout/select_item(datum/loadout_item/selected_item)
var/donator_level = preferences.parent.get_donator_level()
- if(donator_level >= selected_item.donator_level)
+ if(preferences.loadout_points >= selected_item.cost && donator_level >= selected_item.donator_level)
return ..()
- to_chat(preferences.parent.mob, span_warning("У вас недостаточный уровень доната, чтобы взять [selected_item.name]!"))
+ else if(donator_level < selected_item.donator_level)
+ to_chat(preferences.parent.mob, span_warning("У вас недостаточный уровень доната, чтобы взять [selected_item.name]!"))
+ else
+ to_chat(preferences.parent.mob, span_warning("У вас недостаточно свободных очков лодаута, чтобы взять [selected_item.name]!"))
// Removes donator_level items from the user if their donator_level is insufficient
/datum/preference/loadout/deserialize(input, datum/preferences/preferences)
. = ..()
// For loadout purposes, donator_level is updated in middleware on select
var/donator_level = preferences.parent.donator_level
+ var/total_cost = 0
var/removed_items = list()
+ var/left_points = preferences.get_loadout_points()
+
+ // Подсчёт общей стоимости всех предметов в лодауте
for(var/path in .)
var/datum/loadout_item/item = GLOB.all_loadout_datums[path]
- if(donator_level >= item.donator_level)
- continue
- . -= path
- removed_items += item.name
+ total_cost += item.cost
+
+ // Если общая стоимость превышает доступные очки, очищаем весь лодаут
+ if (total_cost > left_points)
+ . = list() // Полностью очищаем список
+ removed_items = . // Добавляем все элементы в список удалённых предметов
+ to_chat(preferences.parent.mob, span_warning("У вас недостаточно очков, для вашего набора. Он был отчищен."))
+ else
+ // Если всё в порядке, выполняем стандартные проверки
+ left_points -= total_cost
+ for(var/path in .)
+ var/datum/loadout_item/item = GLOB.all_loadout_datums[path]
+ if(donator_level <= item.donator_level)
+ //Убираем предметы, на которые не хватает донат-уровня
+ . -= path
+ removed_items += item.name
+
+ preferences.loadout_points = left_points
+ // Сообщение пользователю о том, какие предметы были удалены
if(length(removed_items) && preferences.parent.mob)
to_chat(preferences.parent.mob, span_warning("У вас недостаточный уровень доната, чтобы взять: [english_list(removed_items, and_text = " и ")]!"))
diff --git a/modular_bandastation/preferences/code/modules/client/preferences.dm b/modular_bandastation/preferences/code/modules/client/preferences.dm
index 14c34448f3442..d8aed91f22b87 100644
--- a/modular_bandastation/preferences/code/modules/client/preferences.dm
+++ b/modular_bandastation/preferences/code/modules/client/preferences.dm
@@ -1,3 +1,37 @@
+#define BASE_LOADOUT_POINTS 5
+#define ADD_LOADOUT_POINTS 3
+
/datum/preferences
max_save_slots = 5
+ var/loadout_points = 0
+
+/datum/preferences/load_preferences()
+ . = ..()
+ get_loadout_points()
+
+/datum/preferences/proc/get_loadout_points()
+ var/donation_level = parent.donator_level
+ loadout_points = BASE_LOADOUT_POINTS + donation_level * ADD_LOADOUT_POINTS
+ return loadout_points
+
+/datum/preferences/load_preferences()
+ . = ..() // Вызов базовой загрузки
+
+ // Загрузка донаторского уровня из префов
+ var/donation_level = savefile.get_entry("donator_level", BASIC_DONATOR_LEVEL)
+ parent.donator_level = donation_level
+
+ return TRUE
+
+/datum/preferences/save_preferences()
+ . = ..() // Вызов базового сохранения
+
+ // Костыль 2 - проверка что это не первый вызов (ибо первый приходится на проверку кейбиндов)
+ if(!parent.can_save_donator_level)
+ return TRUE
+ // Сохранение донаторского уровня в префы
+ var/donation_level = parent.donator_level
+ savefile.set_entry("donator_level", donation_level)
+ savefile.save()
+ return TRUE
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/ItemDisplay.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/ItemDisplay.tsx
index 11b20b0097963..6f91549b1ba5a 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/ItemDisplay.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/ItemDisplay.tsx
@@ -86,6 +86,11 @@ export const ItemDisplay = (props: {
))}
)}
+
+
+ Цена: {item.cost}
+
+
);
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/base.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/base.ts
index 33f8cabea9cb0..139c73b112bac 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/base.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/base.ts
@@ -31,6 +31,7 @@ export type LoadoutItem = {
buttons: LoadoutButton[];
reskins: ReskinOption[] | null;
information: string[];
+ cost: string;
};
// Category of items in the loadout
@@ -43,4 +44,5 @@ export type LoadoutCategory = {
export type LoadoutManagerData = PreferencesMenuData & {
job_clothes: BooleanLike;
+ loadout_leftpoints: string;
};
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/index.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/index.tsx
index 211f8ed8ae5e1..9110bf6e1ced2 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/index.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/loadout/index.tsx
@@ -250,7 +250,7 @@ const LoadoutSelectedSection = (props: {
const { act, data } = useBackend();
const { loadout_list } = data.character_preferences.misc;
const { all_tabs, modifyItemDimmer, setModifyItemDimmer } = props;
-
+ const loadout_leftpoints = data.loadout_leftpoints || '0'; // SS220 ADD - Lodout points
return (
}
>
+ Осталось очков: {loadout_leftpoints}
{loadout_list &&
Object.entries(loadout_list).map(([path, item]) => (