Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] Pushup #922

Merged
merged 64 commits into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
3e19392
update paths
Legendaxe Dec 16, 2023
e3a43f1
Merge branch 'master' of https://github.com/PhantornRU/Paradise-Remak…
PhantornRU Dec 19, 2023
fc00ad8
Merge branch 'ss220club:master' into master
PhantornRU Jan 18, 2024
815d5c5
Merge branch 'master' of https://github.com/PhantornRU/Paradise-Remak…
PhantornRU Jan 18, 2024
4f1c89c
[FEAT] Security Rank Attachment
PhantornRU Jan 19, 2024
e90e962
Аттачменты, аксессуары, лодауты
PhantornRU Jan 19, 2024
60046a6
Apply suggestions from code review
PhantornRU Jan 20, 2024
b87a844
Apply suggestions from code review
PhantornRU Jan 20, 2024
fba6cd0
Отжимания, корректировка рангов
PhantornRU Jan 20, 2024
db5392a
Подсчет механических органов
PhantornRU Jan 20, 2024
245a1f8
Выбиваем дыхалку, добавляем сообщения, добавляем хлопки
PhantornRU Jan 20, 2024
c204dcc
Apply suggestions from code review
PhantornRU Jan 20, 2024
8c56891
Убираем lawyerbadge
PhantornRU Jan 20, 2024
e47ecf9
Merge branch 'rank_name' of https://github.com/PhantornRU/Paradise-Re…
PhantornRU Jan 20, 2024
28b6de7
Замедляем отжимания когда сделали их много
PhantornRU Jan 20, 2024
7004e71
pushap_div, добавлено медленное отжимание
PhantornRU Jan 20, 2024
99a7400
Убираем прапорщиков
PhantornRU Jan 20, 2024
157e474
Корректируем часы суприма
PhantornRU Jan 20, 2024
b7be2ae
конвертируем подсчет опыта из минут в часы
PhantornRU Jan 20, 2024
8d41b65
Усложнение отжиманий если сделано слишком много
PhantornRU Jan 20, 2024
15b358d
Отбираем голопогоны у кадета, фиксим аксессуары
PhantornRU Jan 20, 2024
3578c87
багфикс часов
PhantornRU Jan 20, 2024
8e6bf1a
Пробелы после Ст. Мл.
PhantornRU Jan 21, 2024
613dae0
Добавляем вардену КООРДИНАТОРа, убираем тюремного начальника
PhantornRU Jan 21, 2024
021ead6
Apply suggestions from code review
PhantornRU Jan 21, 2024
76797af
Выносим принадлежность в описание, фиксим баги с дубликатом ранга
PhantornRU Jan 21, 2024
ce6abe0
погоны правильно называются
PhantornRU Jan 21, 2024
9a10e7b
Снижаем часы требуемые для открытия звания
PhantornRU Jan 21, 2024
369ff11
Добавляем возможность щитспавна отдельных должностей
PhantornRU Jan 21, 2024
389257d
Убираем прапорщика у блющилда
PhantornRU Jan 21, 2024
1435ea2
Правка описания
PhantornRU Jan 21, 2024
51afacc
Мелкоправка
PhantornRU Jan 21, 2024
77adba1
Убираем пробел, добавляем пробел
PhantornRU Jan 21, 2024
2c500a9
Apply suggestions from code review
PhantornRU Jan 21, 2024
ddf5d38
Apply suggestions from code review
PhantornRU Jan 21, 2024
2129797
Переносим отжимания в папку с эмоутами
PhantornRU Jan 21, 2024
c8d6191
Merge branch 'rank_name' of https://github.com/PhantornRU/Paradise-Re…
PhantornRU Jan 21, 2024
e2c30c0
Заменяем 1 звук хлопка на лучший по звучанию
PhantornRU Jan 21, 2024
232c135
Засовываем кейбинд эмоции в файл с кейбиндами
PhantornRU Jan 21, 2024
d0e72ef
Корректируем Вардена до Сержанта
PhantornRU Jan 21, 2024
b657df6
Снижаем немного часы на ГСБ
PhantornRU Jan 21, 2024
6b9041c
Рефактор датумов отжиманий
PhantornRU Jan 21, 2024
f2502ac
Убираем отступы комментариев
PhantornRU Jan 21, 2024
1a15504
Проверки на нахождение на тайле других существ, корректный рассчет опыта
PhantornRU Jan 22, 2024
cbe0df0
Добавляем дополнительную проверку на безопасность
PhantornRU Jan 22, 2024
5bb8c33
Добавляем cooldown 10 секунд и проверку что стамина свежая
PhantornRU Jan 22, 2024
e3a8663
Переносим проверку "может ли сделать пушап" в эмоут во избежании дублей
PhantornRU Jan 22, 2024
678ecb6
Добавляем ограничитель на максимальное число затрачиваемой стамины
PhantornRU Jan 22, 2024
98576c6
Животные больше не отжимаются на коленях
PhantornRU Jan 22, 2024
3ad66ca
split_message для быстрых отжиманий
PhantornRU Jan 22, 2024
2abdd77
Добавляем в конце сообщение "сколько раз успели отжаться".
PhantornRU Jan 22, 2024
319599f
исключаем спам, убрав вывод подсчета в общее сообщение
PhantornRU Jan 22, 2024
d9b166a
Убираем вывод количества раз самому себе
PhantornRU Jan 22, 2024
5b18807
Багфикс рантайма
PhantornRU Jan 22, 2024
d8a6ff3
Возвращаем пробел
PhantornRU Jan 22, 2024
75e132d
Понижаем значения быстрых пушапов
PhantornRU Jan 22, 2024
3684239
Рефактор, теперь упражнения - общий тип
PhantornRU Jan 23, 2024
49339d7
Переименовывание типовых файлов с упражнениями
PhantornRU Jan 23, 2024
bf38448
Решаем то что не должно быть решено из-за линтера.
PhantornRU Jan 23, 2024
5a326fb
Фикс лишних упражнений
PhantornRU Jan 23, 2024
ed9944e
Update modular_ss220/emotes/code/exercise/exercise_emotes.dm
PhantornRU Jan 24, 2024
2e2890e
Удаляем возможность получить ранги СБшнику и Блющилду
PhantornRU Jan 25, 2024
2b38676
Merge branch 'master' into rank_name
PhantornRU Jan 29, 2024
1e00e6a
Вырезаем ранги в ноль и больше никогда о них не вспоминаем, пошли они…
PhantornRU Jan 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions code/modules/clothing/clothing.dm
Original file line number Diff line number Diff line change
Expand Up @@ -744,15 +744,15 @@
var/mob/living/carbon/human/H = user
if(H.get_item_by_slot(SLOT_HUD_JUMPSUIT) == src)
for(var/obj/item/clothing/accessory/A in accessories)
A.attached_unequip()
A.attached_unequip(user) // SS220 EDIT - FIX
PhantornRU marked this conversation as resolved.
Show resolved Hide resolved

/obj/item/clothing/under/equipped(mob/user, slot, initial)
..()
if(!ishuman(user))
return
if(slot == SLOT_HUD_JUMPSUIT)
for(var/obj/item/clothing/accessory/A in accessories)
A.attached_equip()
A.attached_equip(user) // SS220 EDIT - FIX

/*
* # can_attach_accessory
Expand Down
4 changes: 2 additions & 2 deletions modular_ss220/emotes/_emotes.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/datum/modpack/emotes
name = "Панель эмоций"
desc = "Добавляет панель эмоций в меню. Добавляет опциональное ТГУИ меню эмоций в IC"
author = "furior, larentoun, Aylong"
desc = "Добавляет панель эмоций в меню. Добавляет опциональное ТГУИ меню эмоций в IC. Добавляет новые эмоции."
author = "furior, larentoun, Aylong, PhantomRU"
6 changes: 6 additions & 0 deletions modular_ss220/emotes/_emotes.dme
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
#include "_emotes.dm"

#include "code/exercise/exercises/exercise.dm"
#include "code/exercise/exercises/pushup.dm"
#include "code/exercise/exercises/squat.dm"
#include "code/exercise/exercise_animation.dm"
#include "code/exercise/exercise_datum.dm"
#include "code/exercise/exercise_emotes.dm"
#include "code/emote_keybindings.dm"
#include "code/emote_panel_names.dm"
#include "code/emote_panel.dm"
Expand Down
Binary file added modular_ss220/emotes/audio/claps/clap1.ogg
Binary file not shown.
Binary file added modular_ss220/emotes/audio/claps/clap2.ogg
Binary file not shown.
Binary file added modular_ss220/emotes/audio/claps/clap3.ogg
Binary file not shown.
Binary file added modular_ss220/emotes/audio/claps/clap_low.ogg
Binary file not shown.
12 changes: 12 additions & 0 deletions modular_ss220/emotes/code/emote_keybindings.dm
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,15 @@
/datum/keybinding/emote/carbon/human/whip
linked_emote = /datum/emote/living/carbon/human/whip
name = EMOTE_HUMAN_WHIP

/datum/keybinding/emote/exercise
linked_emote = /datum/emote/exercise
name = "Упражнения"

/datum/keybinding/emote/exercise/squat
linked_emote = /datum/emote/exercise/squat
name = "Приседания"

/datum/keybinding/emote/exercise/pushup
linked_emote = /datum/emote/exercise/pushup
name = "Отжимания"
16 changes: 16 additions & 0 deletions modular_ss220/emotes/code/emote_verbs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,22 @@
set category = "Эмоции"
emote("slap", intentional = TRUE)

/// Exercise Emotes ///
/mob/living/carbon/human/verb/emote_exercise()
set name = "⚝ Упражнения"
set category = "Эмоции"
emote("exercise", intentional = TRUE)

/mob/living/carbon/human/verb/emote_pushup()
set name = "⚝ Отжимания"
set category = "Эмоции"
emote("pushup", intentional = TRUE)

/mob/living/carbon/human/verb/emote_squat()
set name = "⚝ Приседания"
set category = "Эмоции"
emote("squat", intentional = TRUE)

/// ME Emotes ///
/mob/living/carbon/human/verb/emote_scratch()
set name = "◦ " + EMOTE_HUMAN_SCRATCH + " "
Expand Down
47 changes: 47 additions & 0 deletions modular_ss220/emotes/code/exercise/exercise_animation.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/datum/exercise/proc/exercise_animation(temp_time_mod = 1)
var/target_y = -5
var/delay = 0.6 SECONDS * temp_time_mod
var/time_low = 0.2 SECONDS * temp_time_mod
var/time_hight = 0.8 SECONDS * temp_time_mod
animate(user, pixel_y = target_y, time = time_hight, easing = QUAD_EASING) // Down to the floor
if(!do_after(user, delay, emote.is_need_arms))
animate(user, pixel_y = 0, time = time_low, easing = QUAD_EASING)
return FALSE
animate(user, pixel_y = 0, time = time_hight, easing = QUAD_EASING) // Back up
if(!do_after(user, delay, emote.is_need_arms))
animate(user, pixel_y = 0, time = time_low, easing = QUAD_EASING)
return FALSE
return TRUE

/datum/exercise/proc/clear_exercise_animation()
if(isliving(user))
var/mob/living/L = user
L.clear_forced_look(quiet = TRUE)

/datum/exercise/proc/prepare_for_exercise_animation()
if(isliving(user))
if(emote.is_need_lying)
var/mob/living/L = user
// In BYOND-angles 0 is NORTH, 90 is EAST, 180 is SOUTH and 270 is WEST.
if(L.lying_prev == 90)
L.forced_look = EAST
else
L.forced_look = WEST
return

if(!isobserver(user))
return
var/matrix/matrix = matrix() // All this to make their face actually face the floor... sigh... I hate resting code
switch(user.dir)
if(WEST)
matrix.Turn(270)
if(EAST)
matrix.Turn(90)
else
if(prob(50))
user.dir = EAST
matrix.Turn(90)
else
user.dir = WEST
matrix.Turn(270)
user.transform = matrix
227 changes: 227 additions & 0 deletions modular_ss220/emotes/code/exercise/exercise_datum.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
/datum/exercise
var/name = "ДЕБАГ УПРАЖНЕНИЯ (Пример что может быть)"
var/message = "готовится к упражнению."
var/self_message = "Вы готовитесь к упражнению."
var/blind_message = "Вы слышите шорох."
var/message_exercise = "" // Дополнение для добавления в типе
var/is_bold_message = FALSE // Выделяем наше сообщение
var/split_message = 1 // Отображение сообщений каждые N раз, защита от спама

// "[user] [message_force_stop], [verb_case] [exercises_in_a_row] [verb_times]"]
var/message_force_stop = "прекратил упражняться" // "[user] [message_force_stop]"
var/message_self_force_stop = "Вы прекратили упражняться"
var/verb_case = "сделав упражнение"
var/verb_times = "раз"

var/message_do = "упражняется" // "[user] [message_do]"
var/message_self_do = "Вы упражняетесь"
var/message_end = "Вы обессилены"

// Сообщения когда начинаем задыхаться
var/message_oxy_grade = list(
"", // 0+
" с одышкой", // 20+
" с умеренной одышкой", // 40+
" с тяжелой одышкой", // 60+
" весь покраснев и выпучив глаза", // 80+
", еле держась и прикрыв глаза", // 100+
)
var/message_oxy_every_value = 20

// Ограничители
var/can_non_humans_do = TRUE // Отображение в списке для животных и гостов
var/will_do_more_due_to_oxy_damage = TRUE // Сделает ли больше за счет урона по дыханию

// Значения модификаторов используемых в рассчетах
var/staminaloss_per_exercise = 5 // Начальное значение проходящее через модификаторы
var/difficulty_mod = 1 // Чем больше - тем сложнее, умножаем
var/time_mod = 1 // Чем больше - тем медленнее

// Звуки воспроизводимые при каждом упражнении
var/sounds
var/volume = 50
var/intentional = FALSE

// Ранговая зависимость
var/list/physical_job_exp_types = list(EXP_TYPE_SECURITY, EXP_TYPE_SUPPLY, EXP_TYPE_ENGINEERING)
var/no_physical_job_div = 10 // Делитель опыта НЕ физических проф

// Корректировки
var/const/stamina_border_max = 95 // 100 - стаминакрит сбрасывающий анимацию
var/const/oxy_border_max = 120 // 130 - оксикрит
var/exercise_div = 1 // Чем больше - тем легче, корректировка для всех типов

// Усложнители против абуза химикатов и прочего
var/exercise_difficulty_level = 30 // Каждые N упражнений усложняем
var/exercise_difficulty_level_valueloss = 1 // На сколько усложняем
var/brute_border = 100 // С какого кол-ва упражнений начнет наносить урон

// Внутренне изменяемые параметры
var/datum/emote/exercise/emote
var/mob/user
var/exercises_in_a_row = 0 // Сделано упражнений подряд

/datum/exercise/New(datum/emote/linked_emote, mob/linked_user)
. = ..()
user = linked_user
emote = linked_emote

/datum/exercise/proc/try_execute()
if(!emote.can_do_exercise(user))
return
prepare_for_exercise_animation()
execute()
clear_exercise_animation()

/datum/exercise/proc/execute()
if(isobserver(user)) // Госты тоже хотят упражняться!
exercise_animation()
return

var/mob/living/L = user
var/exercise_value
var/currentloss = L.getStaminaLoss() + L.getOxyLoss()
var/oxy_border = will_do_more_due_to_oxy_damage ? oxy_border_max : 0
var/borderloss = stamina_border_max + oxy_border
while(currentloss < borderloss)
if(!emote.can_do_exercise(user))
return
currentloss = L.getStaminaLoss() + L.getOxyLoss()
exercise_value = calculate_valueloss_per_exercise() / time_mod
if(exercise_value >= stamina_border_max)
exercise_value = stamina_border_max + 5
var/temp_time_mod = L.getOxyLoss() / 100 + time_mod
if(!exercise_animation(temp_time_mod))
exercise_stopped(user)
return
exercise_count(user)

if(sounds)
emote.play_sound_effect(user, intentional, get_sound(), volume)

if((L.getStaminaLoss() + exercise_value) <= stamina_border_max)
L.adjustStaminaLoss(exercise_value)
continue

L.setStaminaLoss(stamina_border_max)
L.adjustOxyLoss(exercise_value)
if(exercises_in_a_row >= brute_border)
L.adjustBruteLoss(min(1, exercise_value))
if(currentloss >= borderloss)
to_chat(user, span_warning("[message_end], [verb_case] [exercises_in_a_row] [verb_times]..."))
return

/datum/exercise/proc/get_sound()
if(length(sounds))
return pick(sounds)
return FALSE

/datum/exercise/proc/calculate_valueloss_per_exercise()
// Humans have 120 stamina
// Default loss per exercise = 5 stamina
var/mob/living/L = user
if(ismachineperson(user) || isskeleton(user))
return 0.1

var/valueloss = staminaloss_per_exercise

if(L.getBruteLoss() >= 20)
valueloss += L.getBruteLoss() / 10
if(L.nutrition <= NUTRITION_LEVEL_STARVING)
valueloss += 2
if(L.health <= ((L.maxHealth / 10) * 9))
valueloss += 2

if(!ishuman(user))
return max(1, valueloss)

var/mob/living/carbon/human/H = user

valueloss += 0.5 * H.age/10
if(H.wear_suit)
valueloss += 0.5
if(H.back)
valueloss += 0.5

var/list/extremities = list(
BODY_ZONE_L_ARM,
BODY_ZONE_R_ARM,
BODY_ZONE_L_LEG,
BODY_ZONE_R_LEG,
)
for(var/zone in extremities)
var/obj/item/organ/limb = H.get_limb_by_name(zone)
if(limb.is_robotic())
valueloss -= 1

var/is_physical_job = FALSE
var/list/exp_types = is_physical_job ? physical_job_exp_types : list(EXP_TYPE_CREW)

var/datum/job/job = SSjobs.GetJob(H.job)
for(var/exp_type in exp_types)
if(exp_type in physical_job_exp_types)
is_physical_job = TRUE
break
var/list/play_records = params2list(H.client.prefs.exp)

// Берем немного суммы часов за экипаж, отдаляя их от персонала занимающейся физической работой
var/exp_sum = text2num(play_records[EXP_TYPE_CREW]) / no_physical_job_div
if(job)
for(var/exp_type in job.exp_map)
if(!(exp_type in exp_types))
exp_sum += text2num(play_records[exp_type])
exp_sum /= 60 // Конвертируем из минут в часы

valueloss += staminaloss_per_exercise - exp_sum / 100

if(valueloss <= 0)
valueloss = 1

valueloss += (exercises_in_a_row + 1) / exercise_difficulty_level * exercise_difficulty_level_valueloss

if(isgrey(user) || istajaran(user))
valueloss *= 2
if(isvulpkanin(user) || iswolpin(user))
valueloss /= 2
if(iskidan(user) || isunathi(user))
valueloss /= 3
if(isdiona(user))
valueloss /= 5

valueloss /= exercise_div
valueloss *= difficulty_mod

return max(0.25, valueloss)

/datum/exercise/proc/exercise_stopped()
user.visible_message(
span_boldnotice("[user] [message_force_stop], [verb_case] [exercises_in_a_row] [verb_times]."),
span_boldnotice("[message_self_force_stop], [verb_case] [exercises_in_a_row] [verb_times]."),
blind_message)

/datum/exercise/proc/exercise_count()
exercises_in_a_row++

if(!ishuman(user)) // антиспам
return
var/split_count = exercises_in_a_row / split_message
if(!(split_count == round(split_count)))
return

var/mob/living/L = user
var/exercise_text = get_exercise_message_addition(L)
var/temp_message = "[user] [message_do][exercise_text]!"
var/temp_self_message = "[message_self_do][exercise_text]!"
user.visible_message(
is_bold_message ? span_boldnotice(temp_message) : span_notice(temp_message),
is_bold_message ? span_boldnotice(temp_self_message) : span_notice(temp_self_message),
blind_message)

/datum/exercise/proc/get_exercise_message_addition()
var/mob/living/L = user
var/message_num = round(L.getOxyLoss() / message_oxy_every_value) + 1
var/grade_length = length(message_oxy_grade)
if(message_num > grade_length)
message_num = grade_length
var/temp_message_exercise = message_exercise != "" ? " [message_exercise]" : ""
return "[temp_message_exercise][message_oxy_grade[message_num]]"
Loading
Loading