|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
Думаю, не меня одного раздражает то, что чеки на успешность/неуспешность воровства - абсолютно рандомные, и украсть у НПС понравившуюся шмотку можно с любым уровнем скила, нужно только попробовать десяток-другой раз, предварительно сохранившись. К сожалению, скриптово повлиять на сам процесс воровства не представляется возможным. А мириться с такой ситуацией не хочется. Предлагаю следующий выход. Отслеживать момент загрузки игры и в течение, скажем, 30-ти секунд прерывать с помощью script-overrides все попытки воровства (а лучше после пары попыток автоматом переводить НПС в хостайл). Как отследить load game? Очень просто - при load game срабатывает map_enter. Вероятность того, что игрок бросится обворовывать НПС сразу по заходу на карту - мала (да к тому же мы можем учитывать days_since_visited). Код: ------------------------------- variable stop_steal; procedure map_enter_p_proc begin if days_since_visited == 0 then add_timer_event(self_obj,0,-1); end procedure timed_event_p_proc begin if fixed_param==-1 then begin stop_steal:=1; add_timer_event(self_obj,game_ticks(30),-2); else if fixed_param==-2 then stop_steal:=0; end procedure use_skill_on_p_proc begin if action_being_used==SKILL_STEAL and stop_steal then begin script_overrides; display_msg("Don`t use save/load, moron!"); end end ------------------------------- Полностью проблему это, конечно, не решит (да она и в принципе, на мой взгляд, при таком подходе не решима), но крови манчкинам попортит изрядно :-) Пятнадцать попыток - это, минимум 7 мин. 30 сек. А если увеличить до минуты - четверть часа. Для целенаправленных попыток стащить Бозар - маловато :-) Но вот если игрок с 20%-ым steal-ом пытается методично обчищать карманы всех встречных (манчкинское идиотство) - самое оно :-)
|
Отправлено: 11:43 - 25 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
А может просто не давать попыток к воровству. Две идеи : 1)Не проверенная, только пришла в голову. Вначале мы проверяем какое действие выполняется. (Ремонт, Наука или в нашем случае воровство.)А потом в зависимости от умения воровства либо ничего не делаем, либо выводим сообщение. Тоесть тот-же вариант, только не проверка на save\load а именно на уровень умения. ......... lvar1 := op_has_skill(op_dude_obj(), X); if (lvar1 > 40) then ....... 2)А может всё-таки делать как у разработчиков - переносить предмет из разных шкафчиков вне предела видимости. опять-таки переносить, если применено действие, высокий уровень, ну и ещё что-нибудь.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 17:32 - 25 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Ray 1. Можно. Но плохо. Т.е. мы ограничим не успех/неуспех, а саму возможность. А так - мы ничего не ограничиваем, просто чем ниже скилл, тем сложнее пользовать save/load методу :-) [Мечтательно] Эх, если бы можно было бы забацать процедуру воровства ч/з интерфейсный режим... При юзании SKILL_STEAL выводим интерфейсное окошко со списком предметов... Условия на успех/провал сами задаём... Но это, как минимум, все frm-ки предметов в pcx конвертить надо. Эх. 2. Гм. Тогда мы вообще воровство как класс искореним :-) Хочется не запрещения воровства. Хочется, чтобы люди, отыгрывающие вора, качали скилл, а не надеялись на всемогущий save/load.
|
Отправлено: 17:45 - 25 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Да, я пересмотрел свой пост. Нехорошо. Хм..... Тогда так: Поскольку мы в гварах не ограничены, то при создании перса завести гвару, как счетчик.При каждой попытке кражи увеличивать. Ну а если больше 5 то запрещать кражи.(Ну или любое число). А обнулять можно при выходе из локации. (Кстате, а при загрузке срабатывает map_exit? даже если да - можно что-нить придумать.)
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 20:11 - 25 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
to Ray :-) Как происходит save/load кража? Игрок сохраняет игру на отдельный слот при этом сохраняются значения всех ГВАР и ЛВАР. Пытается украсть шмотку. Если неудача - загружает сэйв. И все ГВАРы принимают то значение, которое имели на момент сэйва. Так что - не получится :-) Хотя я тоже с этого думать начал :-)
|
Отправлено: 4:42 - 26 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
Так, продолжаем пробовать дальше. Если я буду повторять уже неудавшиеся идеи ничего страшного ж не случится Вдруг что-то получится. Идея : Как показывает опыт игры - у меня никогда не было случая, чтобы я заходил на карту(город) дважды. Кроме случаев выполнения квестов. Отсюда решение разбивается на два случая : 1) В map_enter записываем .... op_set_global_var(670,op_global_var(670)+1); .... при попытке кражи проверяем эту гвару - если она равна 2 и days_since_visited маленькое число = 0 или 1, то выводим сообщение. Иначе обнуляем гвару и даём добро на кражу. 2)Когда перс переходит на соседнюю карту для совершения квеста - просто в зоне появления ставим spatial скрипт который обнуляет гвару. ------- Идея заклучается в том, что при заходе на локацию гвара увеличивается, а как известно при загрузке map_enter срабатывает. Помоему игрокам не доставит особого счастья сохраняться где-то ещё а потом переходить на нужную карту. Можно так-же обнуление гвары поставить ещё где-нибудь(после выполнения квестов) Я понимаю, что это мягко сказать напряжно для реализации, но как идея
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 13:29 - 26 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
С определением лоад гейма - хорошая идея, не допёр :-) Но одно но. Я пришёл в локацию. Взял квест. Сохранился перед диалогом с НПС. Поговорил неудачно, выбрал не ту ветку по недосмотру. Загрузился, провёл диалог нормально. И всё, воровать я уже ни у кого ничего не могу. То есть игру загружают не только при неудачном воровстве :-) Короче, итоговый вариант такой: Если map_enter был вызван load game-ом И days_since_visited==0 ТО блокируем возможность кражи на 30-ть секунд (или больше). Можно ещё поставить условие на дистанцию (if op_tile_distance_objs(dude_obj,self_obj)<10). А вару обнулять можно в map_exit. Навёрнуто :-) Но я, возможно, такое когда-нибудь реализую :-) (Отредактировал(а) Raven - 23:18 - 27 Янв., 2005)
|
Отправлено: 16:18 - 27 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
А вот тут сообщенице было - его удалили как не относящееся к делу? Только я чёй-то не смог отправить ответ, пришлось по новой набирать >>То есть игру загружают не только при неудачном воровстве Так можно в talk.... запихнуть обнуление гвары. Я думаю особого удовольствия не доставит перед кражей начинть разговор. Эдак на открыть\закрыть разговор уйдёт где-то 15 сек. После 5 попыток легче прокачать скилл. >>Если map_enter был вызван load game-ом Это каким вариантом проверять ? >>(if op_tile_distance_objs(dude_obj,self_obj)<10) Лучше меньше 5, или 4. Ведь может я буду перед разговором стоять ближе. А вот при краже кажды раз подбегать - я б не стал.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 16:46 - 27 Янв., 2005
|
|
Raven
Пользователь
Откуда: Владик Регистрация: Февр. 2004
Всего: 408 сообщений
|
>>Это каким вариантом проверять ? Ты же сам сказал :-) ----------------------------------------- procedure map_enter begin if not map_var(0) then set_map_var(0,1); else display_msg("Called by load game"); end ----------------------------------------- При заходе на локацию, мэп_ентер однозначно сработает и поставит вару. При save/load map_enter снова сработает. Но вара уже будет поставлена в один - при заходе на локацию. И мы сможем однозначно определить, что map_enter вызван загрузкой игры, а не сменой карты. Можно даже над игроком поприкалываться. Например: ----------------------------------------- procedure map_enter begin if not map_var(0) then set_map_var(0,1); else float_msg(dude_obj,"Опять залажал, да? Чтобы ты без сэйвов бы делал?",0); end ----------------------------------------- >>Так можно в talk.... запихнуть обнуление гвары. Я думаю особого удовольствия не доставит перед кражей начинть разговор. А в чём принципиальная разница? Разговор начинать либо 30 сек ждать. В первом случае ещё и к каждому диалогу надо будет обнуление вары в Node999 прописывать. А если я не говорил, а в бой вступил неудачно? И лоад гейм сделал?
|
Отправлено: 17:36 - 27 Янв., 2005
|
|
Ray
Модератор
Откуда: Донецк,Украина Регистрация: Янв. 2004
Всего: 746 сообщений
|
>>Ты же сам сказал Да я, просто чтоб убедиться, что идея принята >> В первом случае ещё и к каждому диалогу надо будет обнуление вары в Node999 прописывать. Ладно, всё, убедил Хоть на 100% проверить не получится. Мы сможем проверить загрузку, но не сможем проверить воровал ли игрок. Если я неправильно поговорил и загрузился, а потом мне надо бозар украсть? Эт придётся 30 сек ждать. Чтоб наверняка - надо обязательно проверять расстояние до критера сразу после загрузки.
----- Не бывает невозможных задач – бывает мало времени.
|
Отправлено: 18:07 - 27 Янв., 2005
|
|
|
|