Skip to content

Commit

Permalink
Feat: Loadout points (#483)
Browse files Browse the repository at this point in the history
  • Loading branch information
msw7007 authored Nov 2, 2024
1 parent 792f35f commit cd64f7c
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 12 deletions.
2 changes: 2 additions & 0 deletions code/modules/loadout/loadout_menu.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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)
Expand Down
6 changes: 5 additions & 1 deletion modular_bandastation/loadout/code/client.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
7 changes: 6 additions & 1 deletion modular_bandastation/loadout/code/loadout_items.dm
Original file line number Diff line number Diff line change
@@ -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()
. = ..()
Expand Down
40 changes: 31 additions & 9 deletions modular_bandastation/loadout/code/loadout_preference.dm
Original file line number Diff line number Diff line change
@@ -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 = " и ")]!"))
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ export const ItemDisplay = (props: {
))}
</Flex.Item>
)}
<Flex.Item mt={1}>
<Box fontSize="10px" textColor={'yellow'}>
Цена: {item.cost}
</Box>
</Flex.Item>
</Flex>
</Button>
);
Expand Down
2 changes: 2 additions & 0 deletions tgui/packages/tgui/interfaces/PreferencesMenu/loadout/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export type LoadoutItem = {
buttons: LoadoutButton[];
reskins: ReskinOption[] | null;
information: string[];
cost: string;
};

// Category of items in the loadout
Expand All @@ -43,4 +44,5 @@ export type LoadoutCategory = {

export type LoadoutManagerData = PreferencesMenuData & {
job_clothes: BooleanLike;
loadout_leftpoints: string;
};
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ const LoadoutSelectedSection = (props: {
const { act, data } = useBackend<LoadoutManagerData>();
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 (
<Section
title="&nbsp;"
Expand All @@ -269,6 +269,7 @@ const LoadoutSelectedSection = (props: {
</Button.Confirm>
}
>
Осталось очков: {loadout_leftpoints}
{loadout_list &&
Object.entries(loadout_list).map(([path, item]) => (
<Fragment key={path}>
Expand Down

0 comments on commit cd64f7c

Please sign in to comment.