-
Notifications
You must be signed in to change notification settings - Fork 210
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
Система постеров для революции #3021
Conversation
Фича крутая, но постер бы сам поярче сделать. Чтобы заметить проще было. |
Что за очки и зачем они нужны? |
В ишуе сказано:
Скорее всего, позже кто-нибудь придумает какой-то аплинк для хед ревов, в котором можно будет покупать вещи за эти очки. Так как этого нет в ишуе, это не касается данного пулл реквеста, поэтому я и указал в ОПе, что неплохо было бы создать отдельную ветку для реворка революции. |
Выдайте кабинетам глав по 2 поинта мб? Либо бригу, как вариант. |
Честно говоря, не знаю как геймдизайнеры/кодеры/кто-то ещё отреагируют на моё распределение очков, поэтому я и поставил только мостику количество скора больше, чем 1, и то, только для того, чтобы протестить правильную работу кода. |
А зачем вообще хранить все постеры в глобальном списке, да ещё и проверять их каждую минуту? Просто каждый раз при размещении постера points увеличивается, и при снятии или уничтожении (в Destroy()) уменьшается. |
При тесте, случилась интересная вещь. А ещё - не думаю, что сервер сильно напрягается во время проверки постеров. Функцию считаю не лишней. Но, если при даже самом малейшем взрыве вас устроит полное удаление постера либо что-то подобное - могу дописать Ex_act и Destroy методы. |
if("revolution_posters") | ||
return GLOB.revolution_posters; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Нафиг это нужно?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Нужно для отображения в списке глобальных переменных, который находится в вкладке Debug. Делал для тестов, оставил на всякий случай.
/datum/antagonist/revolutionary/proc/equip_poster(mob/living/carbon/human/player) | ||
|
||
var/obj/item/weapon/contraband/poster/revolutionary/P = new(get_turf(player)) | ||
var/list/slots = list ( | ||
"backpack" = slot_in_backpack, | ||
"left pocket" = slot_l_store, | ||
"right pocket" = slot_r_store, | ||
"left hand" = slot_l_hand, | ||
"right hand" = slot_r_hand, | ||
) | ||
for(var/slot in slots) | ||
player.equip_to_slot(P, slot) | ||
if(P.loc == player) | ||
break | ||
var/obj/item/weapon/storage/S = locate() in player.contents | ||
if(istype(S)) | ||
P.forceMove(S) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Не городи велосипеды, используй хелперы из inventory.dm. Например, equip_to_appropriate_slot
и equip_to_storage_or_drop
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Спасибо, сейчас исправлю.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Заменил на equip_to_storage_or_drop, изменения загружены
/datum/game_mode/revolution/process() | ||
if(last_poster_update <= round_duration_in_ticks) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
/datum/game_mode/revolution/process() | |
if(last_poster_update <= round_duration_in_ticks) | |
/datum/game_mode/revolution/process() | |
..() | |
if(last_poster_update <= round_duration_in_ticks) |
@@ -13,6 +13,7 @@ | |||
desc = "The poster comes with its own automatic adhesive mechanism, for easy pinning to any vertical surface." | |||
icon_state = "rolled_poster" | |||
var/serial_number = 0 | |||
var/revolution = FALSE |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Здесь лучше переменную назвать не "революция", а "революционный", т.е. revolutionary
if(istype(B, /area/space)) | ||
to_chat(user, SPAN_WARNING("You can't place this poster in space.")) | ||
return | ||
|
||
if(!(user.z in GLOB.using_map.station_levels)) | ||
to_chat(user, SPAN_WARNING("You can place this poster only on station levels,")) | ||
return |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Почему? Пусть висят где угодно, но считать будем только размещенные в правильных зонах, не? Это как-то нелогично, что кусок бумаги мы повесить не можем где хотим.
for(var/obj/structure/P in GLOB.revolution_posters) | ||
if(istype(B, get_area(P.loc))) | ||
to_chat(user, SPAN_WARNING("A poster has been placed in this area already.")) | ||
return |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Тоже какие-то странные механоограничения вылазят. Пусть обклеивают отсек полностью, чо такого то? Просто когда считаем - надо собирать некий список зон, в который каждая зона может попасть ровно один раз. А потом по этому списку считаем очки.
Так логичнее будет, тебе так не кажется?
@@ -85,16 +112,22 @@ | |||
var/serial_number //Will hold the value of src.loc if nobody initialises it | |||
var/poster_type //So mappers can specify a desired poster | |||
var/ruined = 0 | |||
var/revolutionary = FALSE |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
О, а здесь нормальная переменная :)
if(revolutionary) | ||
GLOB.revolution_posters -= src |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Это лучше запихать в roll_and_drop
@@ -7,6 +7,7 @@ | |||
var/global/global_uid = 0 | |||
var/uid | |||
var/area_flags | |||
var/score = 1 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Лучше переименовать в strategic_importance
. А то слово score
ни о чем не говорит.
points += get_area(P.loc).score | ||
else | ||
GLOB.revolution_posters -= P | ||
last_poster_update = round_duration_in_ticks + 1 MINUTES |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ты здесь складываешь ТИКИ и децисекунды. Нельзя так делать)
Нужно либо все считать в тиках, либо все в децисекундах.
revolution = TRUE | ||
|
||
/obj/item/weapon/contraband/poster/revolutionary/New(turf/loc) | ||
..(loc, serial_number=666) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В poster/New
нет аргумента serial_number
. Кажется он тут вообще не нужен.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Зачем вообще New переопределять здесь? Кажется это лишнее.
/datum/antagonist/revolutionary/equip(mob/living/carbon/human/revolutionary) | ||
if(!..()) | ||
return 0 | ||
|
||
equip_poster(revolutionary) | ||
equip_poster(revolutionary) | ||
|
||
/datum/antagonist/revolutionary/proc/equip_poster(mob/living/carbon/human/player) | ||
var/obj/item/weapon/contraband/poster/revolutionary/P = new(get_turf(player)) | ||
player.equip_to_storage(P) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Давай это пока спилим, ибо сами постеры по себе бесполезные сейчас. Думаю их пока не стоит вводить в игру.
Больше трёх месяцев ожидает автора. |
Собственно, постеры для революции.

Имеют уникальный спрайт на стене(выглядит не очень, но в ишуе всё равно о спрайте не говорилось).
Вообще, лучше бы создать отдельную ветку для реворка революции.
Каждой area присвоены очки(сейчас во всех зонах score равняется 1, кроме мостика, для него - 4), которые начисляются каждую минуту, если в них есть революционные постеры. Это лучше позже поправить, задав разное количество очков для разных зон.
Со старта раунда с гейммодом революция, создаётся глобальный пустой список revolution_posters для хранения ссылок на развешенные революционные постеры. Хед ревам с раундстарта выдаётся по два постера(для теста).
Сами свернутые революционные постеры наследуют /obj/item/weapon/contraband/poster и находятся, как это можно было понять ранее, под путём /obj/item/weapon/contraband/poster/revolutionary.
Свернутый постер нельзя повесить на z-уровнях отличающихся от станционных, а также в космосе и в area'х, в которых уже есть повешенный революционный постер.
После того, как вешается постер, создаётся /obj/structure/sign/poster и добавляется в глобальный список revolution_posters. Если его снять - он удаляет из этого же списка.
Каждую минуту раунда происходит цикл, который проходится по всем постерам в глобальном списке revolution_posters. За каждый постер начисляется сумма очков соответствующая значению в переменной score, которая находится в area постера. Если каким-то образом постер перестаёт существовать или вовсе пропадает из станции - он удаляется из глобального списка.
Если будут какие-то вопросы, пожелания, предложения или проблемы - пишите, исправлю.
Вот пример работы. Первое число - время с начала раунда, второе - время, когда пора проходиться по списку revolution_posters. tick означает, что прошел тик.

close #975