|
Использование условного оператора IF
Условный оператор IF позволяет выполнить
входящий в оператор код только в случае если некоторые опредёлённые вами
условия истинны. Было бы хорошо, если бы вы были знакомы с азами
программирования. Что бы ни вдаваться в подробности рассмотрим
пример: IF (1 == 2) SAY You strong! ENDIF В первой строке проверяется условие, заданное в скобках после
оператора IF. Кстати скобки не обязательны, но они делают код более
читабельным. В скобках проверяется условие - "равна ли еденица двум?" В
этом скрипте условие всегда будет выдавать - "ложь". И скрипт в операторе
никогда не будет выполнен. Если в скобках написать (1 == 1) будет выдавать
- "истину". И строчка SAY будет выполняться всегда. Вот список операндов,
условного оператора IF, доступный для скрипта сферы:
== |
Является равным |
!= |
Является НЕ равным |
> |
Является больше чем |
< |
Является меньше чем |
>= |
Является больше чем или равным |
<= |
Является меньше чем или
равным |
И так, если мы хотим проверить является ли 1 больше чем или
равен 2, мы напишем так: IF (1 >= 2) SAY You strong! ENDIF
Конечно же, 1 никогда не больше чем или равен 2 - это "ложь", так что это
скрипт ни когда не скажет You strong! А если бы мы написали (1 < 2) то
это была бы "истина" и стока SAY исполнилась. Однако вы никогда не будите
писать операторы IF, что бы они были всегда истинны или ложны. Вот пример
когда оператор IF показывает всю свою нужность: IF
(<SRC.HITPOINTS> > 15) SAY You strong! ENDIF Теперь этот
скрипт выяснит, сколько силы у игрока и проверит, истинно ли что сила
игрока больше 15. Если истинно, то выполнится стока SAY, если ложно
(например, если сила игрока 10) то нет. Теперь давайте напишем, что ни
будь нужное. Пусть наш меч claymore используемый в предыдущих примерах
брался в руки, только если чар обладает определённым количеством скилла
swordsmanship. Пока напоминаю скрипт claymore: [ITEMDEF
i_claymore] ID=013b7 NAME=claymore TYPE=t_weapon_sword WEIGHT=14 SKILL=swordsmanship DAM=15,43 REQSTR=50 TWOHANDS=Y
ON=@CREATE HITPOINTS=115,150 Пусть для экипировки этим мечём, нужен
скилл swordsmanship больше 60. Тогда мы напишем так: ON=@EQUIP IF
(<SRC.SWORDSMANSHIP> < 60.0) SRC.SYSMESSAGE You are not
skilled enough to equip this. RETURN 1 ENDIF Этот скрипт при
экипировки проверит при помощи условного оператора IF меньше ли 60.0 скилл
swordsmanship у чара производящего операцию с этим item. И если "истинно"
- то напишет сообщение о том, что ваш скилл слишком мал для экипировки
этим. И предотвратит экипировку из-за использования строки RETURN 1. Вот
другой пример написания этого же скрипта: ON=@EQUIP IF
(<SRC.SWORDSMANSHIP> > 59.9) RETURN
0 ENDIF SRC.SYSMESSAGE You are not skilled enough to equip
this. RETURN 1 Здесь мы действуем по-другому. Мы выясняем больше ли
скилл чара swordsmanship, чем 59.9? Если это истинно, то мы выходим из
trigger экипировки, благополучно завершая её по средствам строки RETURN 0.
Если это ложь, то IF не выполняется, и мы переходим к стоке, в которой
сообщаем игроку, что они не достаточно квалифицированны, что бы
экипироваться этим, и предотвращаем экипировку по средствам RETURN 1. Вот
ещё один третий вариант написания этого же скрипта: ON=@EQUIP IF
(<SRC.SWORDSMANSHIP> > 59.9) RETURN
0 ELSE SRC.SYSMESSAGE You are not skilled enough to equip
this. RETURN 1 ENDIF Отличие от предыдущего скрипта здесь в том, что
появился оператор ELSE в теле оператора IF. Тело оператора ELSE
выполняется только в том случае, если условный оператор IF дал - "ложь".
Вот четвёртый вариант написание этого же скрипта: ON=@EQUIP IF
(<SRC.SWORDSMANSHIP> > 59.9) RETURN 0 ELSEIF
(<SRC.SWORDSMANSHIP> < 60.0) SRC.SYSMESSAGE You are not
skilled enough to equip this. RETURN 1 ENDIF Инструкция ELSEIF
подобна оператору IF, за исключением того, что она используется толко в
пределах условного оператора IF, и командует межу инструкцией ELSEIF и
ENDIF (или другой ELSEIF или ELSE). Инструкция ELSEIF будет выполнена,
только если условия для данной инструкцией истинны, а условия для
предыдущего ELSEIF или IF ложны. Есть подозрение что чем меньше строк
будет в вашем скрпите, тем меньше памяти использует ваш компьютер. По
этому может быть лучше использовать первый вариант написания скрипта. Вот
что у нас должно получится в конце: [ITEMDEF
i_claymore] ID=013b7 NAME=claymore TYPE=t_weapon_sword WEIGHT=14 SKILL=swordsmanship DAM=15,43 REQSTR=50 TWOHANDS=Y
ON=@CREATE HITPOINTS=115,150 ON=@EQUIP IF (<SRC.SWORDSMANSHIP>
> 60.0) SRC.SYSMESSAGE You are not skilled enough to equip
this. RETURN 1 ENDIF Однако, что делать, если мы захотим требовать
наличия склла swordsmanship больше чем 60 или tactics? Мы могли бы
добавить дополнительные проверки в инструкциях ELSEIF или большим
количеством IF, но самый простой способ сделать это выглядит так: IF
(<SRC.SWORDSMANSHIP> < 60.0) || (<SRC.TACTICS> <
60.0) SRC.SYSMESSAGE You are not skilled enough to equip
this. RETURN 1 ENDIF || - означает ИЛИ. Теперь условие оператора IF
читается так: Если скилл swordsmanship меньше 60.0 или скилл tactics
меньше 60.0. Теперь давайте напишем немного другой скрипт: IF
(<SRC.SWORDSMANSHIP> > 59.9) && (<SRC.TACTICS> >
59.9) RETURN 0 ENDIF SRC.SYSMESSAGE You are not skilled enough to
equip this. RETURN 1 Обратите внимание что на этот раз мы использовали
&& вместо ||. && - это И. Так что в этом скрипте условие
оператора IF читается так: Если скилл swordsmanship меньше 60.0 и скилл
tactics меньше 60.0. Теперь вам надо практиковаться. Потому, что как вы
уже поняли, есть много нюансов, которые могут быть интерпретированы сферой
по-разному. Конечно если вы матёрый программист, то этой информации вам
будет предостаточно ;)
|
|