В примере из демонстрационной игры (http://rtads.org/man/TADSSMPL.HTM), следующая штука выходит:
Чтобы взять череп с пьедестала, нужно предварительно положить на него камень, тогда не сработает ловушка... но, если забрать только что положенный камень, ловушка так же не сработает:), ведь, по логике самого метода, при отсутствии на пьедестале объекта, вышеназванного бага, не должно быть... Сам метод:
doTake(actor) = { if (self.location <> pedestal or smallRock.location = pedestal) { pass doTake; } else { "Едва ты успеваешь поднять череп, как из стен вылетает целая туча отравленных стрел! Ты пытаешься увернуться от них, но их слишком много!"; die(); } }
Отредактировано Kephra (09.04.2011 19:52)
Неактивен
Kephra написал:
В примере из демонстрационной игры (http://rtads.org/man/TADSSMPL.HTM), следующая штука выходит:
Чтобы взять череп с пьедестала, нужно предварительно положить на него камень, тогда не сработает ловушка... но, если забрать только что положенный камень, ловушка так же не сработает:), ведь, по логике самого метода, при отсутствии на пьедестале объекта, вышеназванного бага, не должно быть... Сам метод:Код:
doTake(actor) = { if (self.location <> pedestal or smallRock.location = pedestal) { pass doTake; } else { "Едва ты успеваешь поднять череп, как из стен вылетает целая туча отравленных стрел! Ты пытаешься увернуться от них, но их слишком много!"; die(); } }
Kephra, еще раз призываю выслать мне код на мыло. Я честным образом скачал ту самую демо-игру из раздела игр сайта RTADS: http://rtads.org/man/GOLDSKLR.zip - оно пашет именно так, как надо, т. е. если положить камень на пьедестал, а потом убрать и взять золотой череп, ловушка срабатывает.
И, раз уж я опять вернулся к этой теме, хочу обратить внимание еще вот на что. В RTADS имеется замечательный генератор падежных форм (файл generator.t в архиве с библиотеками), который позволяет в разы сократить рутинную работу по набиванию лексических свойств для объектов в игре. К сожалению, роль генератора пока не отражена должным образом в документации, но работа с ним достаточно подробно описана в комментариях в самом файле. И, конечно, если возникнут трудности с пониманием, Вам с удовольствием помогут;).
Отредактировано uux (10.04.2011 19:26)
Неактивен
Kephra написал:
...
Ну, мыло я оставлял на форуме RTADS, но по ЛС тоже вс получил;).
Да, то, что Вы описываете - так оно действительно и должно работать;). Я так подозреваю, что преувеличенный примитивизЬм примера - часть оригинальной задумки. Чтобы ловушка срабатывала и при снятии камня с пьедестала, надо доработать метод doTake камня... задание для самостоятельной работы;), помощь в которой, если она понадобится, Вам конечно же окажут;).
Неактивен
Kephra написал:
uux написал:
надо доработать метод doTake камня... задание для самостоятельной работы;), помощь в которой, если она понадобится, Вам конечно же окажут;).
Я об этом подумал сразу же как увидел "баг", но, если в комнате лежит еще несколько камней, и других объектов, в сумме может набраться до 10/20 объектов в игре немного большей игры-примера, не прописывать же в самом деле для каждого, один и тот же метод? Куда логичнее прописать метод для пьедестала, и тогда можно оставлять на нём любой объект и ловушка не сработает, но и в этом случае имеется "баг", если заменить череп спичечным коробком, пёрышком, или дохлой блошкой и тогда, ловушка так же не сработает... Или в ТАДС можно задать объекту, свойство веса?
Да, свойство веса задать можно. (Собственно, оно уже определено в стандартной библиотеке - называется weight). Кроме того, можно определить метод один раз для одного объекта, а потом делать остальные его наследниками.
Kephra написал:
upd
Я кажется понял, можно для пьедестала прописать метод, в котором перечислить по своему усмотрению, те объекты, которыми можно заменить череп... но как это сделать? Ладно, я попытаюсь сам дойти.
Немножко не так. Потому что если игрок вводит команду, в которой пьедестал не задействован (типа "взять камень"), то по умолчанию никаких методов пьедестала вызываться не будет (т. е. потребуется модифицировать метод doTake, вставив туда этот вызов принудительно).
Я бы действовал так: определил бы свойство для пьедестала, соответствующее общему весу находящихся на нем объектов (пусть называется WeightOnMe), а также свойство, соответствующее минимальному весу оставшихся предметов, при котором ловушка еще не срабатывает (MinWeight); при укладке предмета на пьедестал прибавлял бы его вес к свойству WeightOnMe, а при снятии с пьедестала - проверял, не становится ли вес меньше минимально допустимого, и в этом случае запускал бы ловушку. Пример (недоделанный) - под спойлером.
спойлер…
Неактивен
Kephra написал:
Однако в мануале-то «actor» используют в качестве аргумента «doTake», зачем это делать, — не понятно, но поясняется следующее: «Определение атрибута doTake использует в качестве аргумента персонаж (actor), который пытается взять объект.» и «Система вызывает doTake каждый раз, когда игрок пытается взять объект.» Эти оба пояснения в документации следуют друг за другом. Каждое, говорит совершенно о разных вещах, но воспринимается как — об одном. Думается, будто надо использовать исключительно тот аргумент с которым будет взаимодействовать объект (в нашел случае золотой череп с актером). Иначе, ничего не будет работать. Но это не так, поэтому пояснение: «Определение атрибута doTake использует в качестве аргумента персонаж (actor), который пытается взять объект.» — даёт ложное представление, причем не объясняется зачем это делать.
doTake - это не функция, а метод, причем вызываемый автоматически. В TADS для глаголов определяется набор методов-обработчиков, название которых определяется свойствами doAction и/или ioAction объекта-глагола (подробнее см. здесь: http://www.rtads.org/man/TADSEX.HTM, глава "Создание собственных глаголов"). doAction определяет название методов-обработчиков для команд в формате "глагол-существительное". Когда игрок вводит такую команду (в нашем случае, допустим, "взять череп"), интерпретатор проверяет наличие в объекте, соответствующем существительному, пары методов, которые соответствуют глаголу взять: - verDoTake (так называемый метод-верификатор) и doTake (метод-действие). (Во вводной части документации описание верификатора опущено в целях упрощения восприятия). Эти методы вызываются системой автоматически, и в качестве аргумента им передается объект-актер, выполняющий действие. Это нужно потому, что TADS позволяет игроку давать команды другим персонажам в игре, и сообщения при этом в общем случае должны быть разными. Проверка переданного методу актера позволит, например, для команды "Взять мяч" выдать сообщение "Ты взял мяч", а для "Бобик, возьми мяч" - "Бобик подхватил мяч зубами". Надеюсь, не запутал.
Неактивен