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]) => (