![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|||||||||||||||
Level 8 ![]() ![]() ![]() Класс: Псионик Характер: Chaotic Good Раса: Человек NWN: Скриптинг [Sn] ![]() |
Тема создана главнм образом для новичков, но и более опытным товарищая почитать тоже не помешает. Итак. Минимум флейма. Максимум инфы. Начну я (кто бы сомневался :-) ) 1. LevelUpHenchman(). С помощью этой функции можно... повысить уровень ПС (применив ее к ПС, конечно) без распределения этим самым ПС всех плюшек. Действие фишки можно наблюдать в первой главе ХотУ. Когда в начальном диалоге (при заходе чаром малых уровней) выозникает выбор: повысить уровень самому или автомастически. Этот самый автоматический вариант и реализован с помощью LevelUpHenchman. 2. Тонкость конструкции if (condition) { . . . }.
вернет TRUE. Никогда не задумывались почему? Дело в том, что при "заявлении" условие автоматически приравнивается(==) к TRUE. TRUE в свою очередь численно равно 1 (FALSE = 0, в этом в можете убедиться, открыв nwscript.nss). Поэтому наше форма и возвращает 1. Посему
можно с легкостью заменить на
Не использовать в данном виде! См. пост _kaa_ и мой ответ. 3. Известно почти всем, но все же.
то же, что и
Аналогично и с float, string, effect и другими типами данных. 4. Упрощенная модель if {} else {} Допустим,
то же, что
т.е. все, что до '?' - условие, все, что после вопроса до двоеточия - присвоение в случае истинности утвержения в скобках, после двоеточия - в случае ложности. Продолжение следует. Если у вас есть то, чем можно поделиться и что заслуживает всеобщего внимания , прошу. |
||||||||||||||
![]() |
![]()
Сообщение
#2
|
|
Пингвиноид ![]() Класс: Обыватель Характер: True Neutral Раса: Человек ![]() |
По просьбе DBColl'a выкладываю свои умозаключения. Надеюсь, темой не обшибся...
К вопросу о букве "я" в тулсете Итак, есть проблема - при вводе буквы "я" в скриптах компилятор потом напрочь отказывается работать. Логически подумаем. Для начала несколько вводных: 1) Маленькая буква "я" имеет ASCII-код 255 (знающие уже догадались, остальным разжевываю) 2) Старые реализации сишной stdlib содержат функцию char fgetc(FILE *stream); 3) Есть глобальная переменная errno сишной библиотеки stdlib Проследим за компилятором. Считывая функцией fgetc очередной символ, он ожидает следующий символ или EOF при конце файла или ошибке. EOF принимает значение -1. Теперь возьмем букву "я", которая при выставленных всех битах имеет значение при signed char равным именно -1 (unsigned char(255) = signed char(-1)). То есть, получая из потока букву "я" компилятор считает, что достигнут конец файла или произошла какая-то ошибка. И ничтоже сумнявшися вываливается с сообщением об ошибке. При этом глобальная переменная errno остается равной 0 (нет ошибок, нет EOF). При написании компилятора разработчики проверяют только результат fgetc, не проверяя при этом errno. Отсюда и спотыкания компилятора. В новом тулсете и компиляторе такой проблемы уже не будет, потому что в современных реализациях stdlib fgetc возвращает уже тип int, а это четыре байта, а не один. Поэтому буква "я" будет распознаваться нормально. С причиной реакции компилятора на букву "я" разобрались. Как исправить? Дизасемблировать компилятор, вставить проверку errno, поменять заголовок исполняемого PE-файла. Заголовок нужно будет поменять, потому что проверка на errno займет, как минимум, дополнительно пару десятков байт. Поэтому в PE-заголовке нужно будет поменять размер сегмента кода. К сожалению я не знаю формат PE-заголовка (хоть он и берет начало от pure COFF формата, с которого начинался и линуксовый ELF-формат). Также я не знаю, как из ассемблера вызвать виндовый stdlib (достучаться к переменной errno в частности). Подытожим, что нужно для решения проблемы: 1) Дизассемблер (решаемо - ищется в Интернете) 2) Спецификация исполняемого PE-файла (решаемо - ищется в Интернете) 3) Вызов stdlib функций из ассемблера (с трудом, но решаемо - в Интернете или методом проб и ошибок) 4) Желание (не решаемо - мне по жизни лень. Профессия обязывает) Осталось найти на 4-й пункт пионера и проблема буквы "я" будет решена. P.S. Мечтательно так: вот был бы тулсет OpenSource... |
![]() ![]() |
Текстовая версия | Сейчас: 26th April 2025 - 10:21 |