» TeamX (Архив Форума)«


Форум TeamX » Исследования » Воровство и Save/Load (Метод борьбы)

Переход по темам
<< Пред. След. >>
Единственная страница этой темы

 
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
Tehnokrat
Модератор

Откуда: Новосибирск
Регистрация: Окт. 2003

Всего: 489 сообщений

А интересно, что получится если сделать так:

procedure use_skill_on_p_proc
begin
if (action_being_used==SKILL_STEAL) and
   (has_skill(dude_obj, SKILL_STEAL)<has_skill(self_obj, SKILL_STEAL)) then
  script_overrides;
end

Впрочем к Save/Load это никакого отношения не имеет...

(Отредактировал(а) Tehnokrat - 2:50 - 1 Фев., 2005)

-----
Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.

Отправлено: 23:46 - 31 Янв., 2005
Raven
Пользователь

Откуда: Владик
Регистрация: Февр. 2004

Всего: 408 сообщений

Тогда лучше сравнивать скилл с Perception*mod, 0<mod<=30. Но тут проблемма в том, что это просто поставит порого на минимальное значение скилла и полностью лишит возможности шарить по карманам чаров с низким Steal. Хотелось бы, чтобы шанс был всегда. Только чтобы игроки этим не злоупотребляли.

Отправлено: 0:03 - 1 Фев., 2005
Tehnokrat
Модератор

Откуда: Новосибирск
Регистрация: Окт. 2003

Всего: 489 сообщений

>>Хотелось бы, чтобы шанс был всегда.

Для случаев с торговцами и квестовыми предметами в инвентаре, как-раз не хотелось бы...

То, что я предложил, позволяет задавать предел в прошке криттера, не меняя скрипт.

При низком уровне воровства лезть в чужой карман вообще не следует, слишком мал шанс на благополучный исход. А то получится как с хаббологистами на глобальной карте - их хоть сто раз обворовывай, а они всё-равно не обижаются. Save/Load отдыхает.

-----
Прошлое можно узнать, но нельзя изменить. Будущее можно изменить, но нельзя узнать.

Отправлено: 23:31 - 1 Фев., 2005
snkaw
Пользователь

Регистрация: Сент. 2007

Всего: 12 сообщений

Цитата:
Quote: from Tehnokrat on 23:31 - 1 Фев., 2005
>>

...При низком уровне воровства лезть в чужой карман вообще не следует...




... вот и замечательно...  значит можно зделать таким макаром, если скилл "тыринга" низкий, то некоторые предметы не должны быть доступны для "изъятия" (либо вообще не видны)

Отправлено: 9:07 - 17 Окт., 2007
 

Переход по темам
<< Пред. След. >>
Единственная страница этой темы


Powered by Ikonboard 2.1.9 RUS
Modified by RU.Board Team
© 2000 Ikonboard.com