Многопользовательский мир АЛАДОН



  Reply to this topicStart new topicStart Poll

> Переналожение заклинаний
Фелей
Отправлено: Jan 23 2019, 19:43
Quote Post


Ньюб
*

Группа: Участники
Сообщений: 75
Пользователь №: 2167
Регистрация: 26-February 09



Часто замечал следующее. Остается последняя минута действия защиты храма, а зона какая нибудь суровая. И вот стою я своим дохлым магом, жду когда санка сойдет, чтобы заново ее наколдовать. Может сделать так, чтобы при наложении на себя эффект обновлялся? То есть старый удалялся и заменялся новым. Судя по коду сделать просто. Например для заклинания 'броня' код в rom следующий
CODE

void spell_armor( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
   CHAR_DATA *victim = (CHAR_DATA *) vo;
   AFFECT_DATA af;

   if ( is_affected( victim, sn ) )
   {
       if (victim == ch)
         send_to_char("You are already armored.\n\r",ch);
       else
         act("$N is already armored.",ch,NULL,victim,TO_CHAR);
       return;
   }
   af.where  = TO_AFFECTS;
   af.type      = sn;
   af.level  = level;
   af.duration  = 24;
   af.modifier  = -20;
   af.location  = APPLY_AC;
   af.bitvector = 0;
   affect_to_char( victim, &af );
   send_to_char( "You feel someone protecting you.\n\r", victim );
   if ( ch != victim )
       act("$N is protected by your magic.",ch,NULL,victim,TO_CHAR);
   return;
}

В проверке вместо выдачи сообщения удаляем аффект, получается
CODE

void spell_armor( int sn, int level, CHAR_DATA *ch, void *vo, int target )
{
   CHAR_DATA *victim = (CHAR_DATA *) vo;
   AFFECT_DATA af;

   if ( is_affected( victim, sn ) )
   {
       if (victim == ch)
         affect_strip(victim,sn);
       else
       {
         act("$N is already armored.",ch,NULL,victim,TO_CHAR);
         return;
       }
   }
   af.where  = TO_AFFECTS;
   af.type      = sn;
   af.level  = level;
   af.duration  = 24;
   af.modifier  = -20;
   af.location  = APPLY_AC;
   af.bitvector = 0;
   affect_to_char( victim, &af );
   send_to_char( "You feel someone protecting you.\n\r", victim );
   if ( ch != victim )
       act("$N is protected by your magic.",ch,NULL,victim,TO_CHAR);
   return;
}

Замена активна только при касте на себя, на другого срабатывает по старому (чтоб не абьюзили). Остальные заклинания меняются аналогично.
PMEmail Poster
Top
Морвиел
Отправлено: Jan 25 2019, 11:51
Quote Post


Горизонт событий
*****

Группа: Бессмертные
Сообщений: 1184
Пользователь №: 406
Регистрация: 1-June 04



Идея неплоха и в общем то расширить ее можно и на других, если сравнивать уровень кастующего с уровнем уже наложенного эффекта. Если уровень >= уровня эффекта, то удалять и перенакладывать, иначе выдавать "На Васю действует более мощная версия этого заклинания" или что-то аналогичное.

Правда это верно только для тех заклинаний, где modifier не зависит от % знания заклинания, но таких, вроде бы, подавляющее большинство.

Но в любом случае, правки кода у нас временно на стопе сейчас.


--------------------
Горизонт событий
PM
Top
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Topic Options Reply to this topicStart new topicStart Poll

 



[ Script Execution time: 0.0354 ]   [ 13 queries used ]   [ GZIP включён ]