Использование условного оператора 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 ( > 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 ( < 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 ( > 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 ( > 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 ( > 59.9)
RETURN 0
ELSEIF ( < 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 ( > 60.0)
SRC.SYSMESSAGE You are not skilled enough to equip this.
RETURN 1
ENDIF
Однако, что делать, если мы захотим требовать наличия склла swordsmanship больше чем 60 или tactics? Мы могли бы добавить дополнительные проверки в инструкциях ELSEIF или большим количеством IF, но самый простой способ сделать это выглядит так:
IF ( < 60.0) || ( < 60.0)
SRC.SYSMESSAGE You are not skilled enough to equip this.
RETURN 1
ENDIF
|| - означает ИЛИ. Теперь условие оператора IF читается так: Если скилл swordsmanship меньше 60.0 или скилл tactics меньше 60.0. Теперь давайте напишем немного другой скрипт:
IF ( > 59.9) && ( > 59.9)
RETURN 0
ENDIF
SRC.SYSMESSAGE You are not skilled enough to equip this.
RETURN 1
Обратите внимание что на этот раз мы использовали && вместо ||. && - это И. Так что в этом скрипте условие оператора IF читается так: Если скилл swordsmanship меньше 60.0 и скилл tactics меньше 60.0.
Теперь вам надо практиковаться. Потому, что как вы уже поняли, есть много нюансов, которые могут быть интерпретированы сферой по-разному. Конечно если вы матёрый программист, то этой информации вам будет предостаточно ;)