ТОМ2 - платформа для парсерных игр

Объявление

Открыт сайт tom2-game.ru.


Последнюю версию платформы можно скачать здесь.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Игра "Жмых"

Сообщений 1 страница 27 из 27

1

Попытка, пока совсем неудачная=), создать игру на ТОМе. Это мои первые потуги, в программировании ни черта не знаю, малость только ХТМЛ. Поможите, чем можете ребята, ибо мозги кипят)

2

День добрый всем. Создал пару локаций, перса. Использовал материал спелеолога, спасибо создателю и материал вики.
У меня несколько вопросов, если кто может, проконсультируйте пожалуйста: НАверное я вас замучаю своими вопросами. Но, куда деваться, хочу научиться, а помочь больше некому=)
1. Лучше в отдельных модулях тмл описывать локи, персов и предметы с действиями, или все вместе проще?
2. Как сделать так, чтобы, если перс зашел в локацию сарай со двора, потом во двор выйти не мог?
3. Как сделать так, чтобы нпс мог, что-то передать персу, какой то предмет?
4. Как можно, можно ли, создать боевое взаимодейтсвие. В общем, выстрелил из ПМ в нпс и он как бы умер.
5. как в каждой локе менять бэкграунд, а то вставляю код с бэкграундом в локу, а учитывается только один фон на все локи. Последний вставленный, если не ошибаюсь.
6. Ребят, я не могу понять как музыку проигрывать, методом тыка пробовал на базе того же спелеолога, но что-то не выходит и какие форматы вообще можно проигрывать в игре.
7. Как быть с действиями, если например создать action с, грубо говоря, выстрелом, то как описать реакцию других нпс. Там же по месту самого действия. К примеру, зомби от выстрела ничего не будет, лишь покачнется, а человека ранит или убьет. Как это описать можно?
Пишу по вселенной сталкера.
Заранее спасибо, тем кто поможет.
ВЕРСИЯ: 0.9.4.12 beta
Да, вот еще пара проблем.
Локации следующие: Изба, Двор, Сарай, Лаз(из сарая)
1. Когда пишу идти во дворе он спрашивает в ИЗБА или САРАЙ, хотя окончания вроде проставлены, правда с предлогами я убрал.
ЛОКАЦИИ что здесь не так, как запретить герою возвращаться в горящую избу, а позже во двор, куда зашли нападавшие.

Свернутый текст
Код:
location изба
{ cls = место
  title = "изба" // краткое описание комнаты
  this.описание = "__обычная деревенская Деревянная изба "
  this.полное_описание = "__Потемневшие и заплесневелые углы, грубого сруба без отделки теперь едва видны в клубах дыма, подсвечиваемые языками пламени. Строение почти полностью охвачено огнем..."
  this.изба = "изб%; ЖрЕчНдСи; Ип; Ип=а; Рп=у; Дп=е; Вп=у;Тп=ой; Пп=е;"
  отметить_на_карте(1,0,0)
  this + pers // игра начинается в избушке в которую помещен ГГ
  pers.персонаж_по_месту = нет //не отображаем ГГ в локации

}
location двор
{ cls = место
title = "двор" // краткое описание комнаты
  this.описание = "__Небольшой деревенский двор с покосившимся от времени плетнем, неподалеку виден сарай"
  this.полное_описание = "__Дверь из избушки ведет прямо во двор"
  this.двор = "двор%; МрЕчНдСи; Ип; Ип=; Рп=; Дп=у; Вп=;Тп=ом; Пп=е;"
  отметить_на_карте(1,1,0)
pers.персонаж_по_месту = нет //не отображаем ГГ в локации

}
location сарай
{ cls = место
title = "сарай" // краткое описание комнаты
  добавить_препятствие(идти_во_двор,"__Во двор выходить теперь небезопасно.")
  this.описание = "__сарай старый и уже прогнивший, но в нем тем не менее можно найти, что-нибудь полезное или спрятаться от преследователей. У дальней стены виднеется провал, ведущий в лаз. На полу лежит раненый ученый."
  this.полное_описание = "__старая покосившаяся дверь привела вас в низенький сарайчик"
  this.сарай = "сара%; МрЕчНдСи; Ип; Ип=й; Рп=й; Дп=ю; Вп=й;Тп=ем; Пп=е;"
  отметить_на_карте(1,1,1)
pers.персонаж_по_месту = нет //не отображаем ГГ в локации

}
location лаз
{ cls = место
title = "лаз" // краткое описание комнаты
  this.описание = "__в полах сарая виднеется лаз, человек может с трудом, но протиснуться сквозь неё наружу. Во дворе слышатся голоса атакующих.Через лаз можно попасть на небольшую поляну возле дома."
  this.полное_описание = "__Из сарая наружу ведет лаз в полах...осторожно пролезая сквозь дыру в полу вы машете раненому ученому на прощание"
  this.лаз = "лаз%; МрЕчНдСи; Ип; Ип=; Рп=; Дп=у; Вп=;Тп=ом; Пп=е;"
      отметить_на_карте(1,1,2)
pers.персонаж_по_месту = нет //не отображаем ГГ в локации

}

Здесь мой пробный НПС "ученый", он ранен и лежит полудохлый в сарае. Как положить ему изначально артефакт слюда, и чтобы потом он давал его герою с определенной фразой? Я прописал артефакту в свойствах объекта

Код:
ученый+This

но ученый говорит мне, что у него нет слюды, когда я его прошу отдать её.=) не дает, зараза) как можно с ним поговорить? если пишешь осм ученого, то не понимает, если пишешь ученый, то описывает его, так и должно быть?

Код:
unique ученый
{ cls = персонаж
  Род = "Мж"
  по_имени = "учен%; СрЕчНдСи; Ип; Зп=ый; Ип=ый; Рп=ого; Дп=ому; Вп=ого; Тп=ым; Пп=ом;" 
  описание = "ученый ранен и истекает кровью"
  полное_описание = "ученый сипит лежа на гнилом полу сарая, за ним тянется кровавый след. Комбинезон посечен осколками от гранаты. В трясущихся руках он держит артефакт слюда^^^"
  персонаж_по_месту = "на полу лежит раненый ученый"
свобода_воли(Obj)
  { switch(act)
    //выполняемые действия
    case(осмотрел) return да
    case(сказал) return да
    //действия, которые отказывается делать
    case(осмотрелся) this > "я ранен, мне не до этого"
    case(инвентарь) this > "у меня есть артефакт..."
    case(взял) this > "руки не слушаются {Obj*Вп}?"
    case() this > "Кха-кха!..Ааааааа..."
    return нет //отказ
  }

  сарай + this
}

И еще в какой последовательности в корневом файле тома подгружать модули?
корневой:

Код:
// Сага о Жмыхе=)
include "std.lib\UnusVerb.tml"//включить файл с сообщениями об ошибках для неиспользуемых глаголов
include "std.lib\Main.tml"  //включить файл с минимально-необходимыми классами и действиями 
include "std.lib\Physics.tml" //включить файл с физическим движком
include "std.lib\Map.tml" //включить файл с картой и перемещениями по компасным направлениям
include "std.lib\Containers.tml" //включить файл с поверхностями
%<body background=photo\st1.jpg leftmargin=50 rightmargin=50 bgcolor=ffdead text=blue>
ГГ.персонаж_по_месту = нет //не отображаем протогониста в локации
narrator.обращение_к[ГГ] = "Вы"
"себя" = "меня" //хак из "спелеолога"
%Нажмите любую клавишу, чтобы начать игру<pause>
//Введение===============================================
%__Запах гари щекотал горло, ты невольно закашлял и открыл глаза. 
%Пространство вокруг застилало плотное облако дыма. 
%Глаза начали слезиться, тело ныло и не хотело слушаться.Ты вспомнил, что находишься в домике возле свалки. Ощупав себя ты обнаружил в напоясной кобуре знакомый пистолет макарова. 
%Сквозь клубы дыма проглядывают языки пламени, пожирающие деревянную постройку, с минуты на минуту здесь все сгорит. В отдалении слышатся незнакомые голоса. 
%Что тебе сделать первым делом?
//объекты================================================
ГГ.по_имени = "Жмых%; МрЕчОдСи; Ип; Зп=; Ип=; Рп=а; Дп=у; Вп=а; Тп=ом; Пп=е"//Главный перс========
изба+ГГ
unique Слюда
{ cls = предмет
ученый+this
cls = предмет
      title = "Слюд%; ЖрЕчСиНд; Ип; Ип=а; РпНу=ы; Дп=е; Вп=у; Тп=ой; Пп=е"
      this.можно_взять = да
      this.можно_дать = да
      this.Слюда = "Слюд%; ЖрЕчСиНд; Ип; Ип=а; РпНу=ы; Дп=е; Вп=у; Тп=ой; Пп=е"   
ChkMoveObj(From,To)
}
unique топор
{ cls = предмет
сарай+this
cls = предмет
      title = "Топор%; МрЕчСиНд; Ип; Ип=; РпНу=; Дп=у; Вп=; Тп=ом; Пп=е"
      this.можно_взять = да
      this.можно_дать = нет
      this.Топор = "Топор%; МрЕчСиНд; Ип; Ип=; РпНу=; Дп=у; Вп=; Тп=ом; Пп=е"   
ChkMoveObj(From,To)
}
include "data\local.tml"//мои локации
include "data\Action.tml"//мои действия
include "data\pers.tml"//персонажи

А, если дать ученому свободу действий, то можно будет гонять его по локам...то во дворе ляжет раненый, кровь истекать, то в избе, то в лазу...В общем разгулялся он у меня тут...если ему, что даешь, так он назад не отдает, кашляет только)))

Отредактировано Комиссар (2011-03-11 15:32:37)

3

Привет! Рад новым авторам! :)

Ну начнём...

Использовал материал спелеолога

Рекомендую взять Dugway 2011, там стандартная библиотека поновее, и версия движка самая последняя.

1. Лучше в отдельных модулях тмл описывать локи, персов и предметы с действиями, или все вместе проще?

Это на усмотрение автора, кто как привык. Мне например удобнее разбивать на модули. В последней игре я сделал 2 модуля - в одном все типовые описания и типовое поведение объектов и персонажей, во втором продвижение по сюжету - обработки ключевых событий, таймер, все концовки и т.п.

2. Как сделать так, чтобы, если перс зашел в локацию сарай со двора, потом во двор выйти не мог?

Самое простое - поставить в сарае одностороннюю стену со стороны двора.

Код:
сарай.добавить_препятствие(на_север,"там глухая бревенчатая стена")

3. Как сделать так, чтобы нпс мог, что-то передать персу, какой то предмет?

Обычно достаточно команды >учёный, дай мне предмет.
Предмет, конечно, должен у него быть.
Проверить предметы у НПС можно командой: >учёный, инвентарь

4. Как можно, можно ли, создать боевое взаимодейтсвие. В общем, выстрелил из ПМ в нпс и он как бы умер.

...

5. как в каждой локе менять бэкграунд, а то вставляю код с бэкграундом в локу, а учитывается только один фон на все локи. Последний вставленный, если не ошибаюсь.

Нужно переопределять метод OnEnter() в каждой локации и в нём менять бэкграунд.

Код:
location Сарай
{ ...
  OnEnter()
  { %<background ....>
    cls.OnEnter() //обработчик класса
  }
  ...
}

6. Ребят, я не могу понять как музыку проигрывать, методом тыка пробовал на базе того же спелеолога, но что-то не выходит и какие форматы вообще можно проигрывать в игре.

...

7. Как быть с действиями, если например создать action с, грубо говоря, выстрелом, то как описать реакцию других нпс. Там же по месту самого действия. К примеру, зомби от выстрела ничего не будет, лишь покачнется, а человека ранит или убьет. Как это описать можно?

...

4

Спасибо, сейчас качнем эту игру) А как все же стену-то поставить?) А то там пусто...эмм..)

5

угу... я еще пишу))) там где ... еще не дописано)))

6

А можно интерфейс менять, ну сделать шире окно и добавить карту с координатами движения и место для аватара героя?)

7

Ой, спасибо, а то сбиваю с мысли наверное) Я в фотошопе мог бы и арт сделать, со скринов нащелкать и отрендерить. Классно было бы если бы как в Косморейнджерах сделать квестовую систему. Там было очень хорошо все продумано. Еще бы мне знать как персонажа убить в случае неудачного продвижения и таймер на некоторые действия ставить, например не успел выйти из домика и сгорел.
Пыс. Я еще не знаю как персу в инвентарь поместить предмет, простым ученый+this?

Отредактировано Комиссар (2011-03-11 18:03:40)

8

Доброго дня. Покопался в системных файлах, оказывается там все описано, все функции и прочее, просто мне применить надо было свой мосск))) Вот, разобрался с сундуками. Такой вопрос возник, есть функция:

Код:
можно_поместить(Предлог,Что)
  { if(Предлог && (Предлог!=пред_в||пред_в!=Предлог))
      return "у {actor*РпНе} не получилось {act.инфинитив} {Что.lex*Вп} {Предлог} {this.lex*Вп}, но может быть выйдет {act.инфинитив} {Что:лич_мест*Что.lex~рчы*Вп} {пред_в} {this.lex*Вп}?"
    if(закрываемое && item[закрыт])
      return "{this.lex} {закрыт*this.lex}"

Вопрос такой, можно ли прописать, что нельзя класть внутрь или достаточно того, что можно туда положить, а остальное автоматом взаимоисключается. То есть если задать: "положить в сундук можно топор" и теперь кроме топора туда ничего нельзя будет положить?
Да, еще вопрос как описать именно что положить можно пример с топором?

Отредактировано Комиссар (2011-03-12 13:00:02)

9

Комиссар написал(а):

Вопрос такой, можно ли прописать, что нельзя класть внутрь

Уфф... я не успеваю =))))

У каждого объекта есть обработчики события перемещения. (в модулях стандартной библиотеки они вовсю используются).
Чтобы запретить какое-либо перемещение используем функцию ChkMoveObj(From,To)

Код:
Топор.ChkMoveObj(From,To)
{ //запрещаем класть топор в сундук 
  if(To==сундук) 
  { %не помещается!
    return нет //перемещение не произойдет
  }
}

и да, можно также использовать функцию можно_поместить(Предлог,Что)

Код:
сундук.можно_поместить(Предлог,Что)
{ //запрещаем класть топор в сундук 
  if(Что==Топор) 
    return "не помещается!"
  else
    return cls.можно_поместить(Предлог,Что)
}

10

2. Как сделать так, чтобы, если перс зашел в локацию сарай со двора, потом во двор выйти не мог?

Самое простое - поставить в сарае одностороннюю стену со стороны двора.

Код:
сарай.добавить_препятствие(на_север,"там глухая бревенчатая стена")

11

Пыс. Я еще не знаю как персу в инвентарь поместить предмет, простым ученый+this?

ученый+this будет работать только в методе самого предмета:

Код:
unique слюда
{ ...
  ученый+this 
  ...
}

В общем случае лучше указать предмет по имени: ученый+слюда

12

О, такой вопрос как описать самого Актора...везде скользит в локах актор, актор, а где его свойства не нашел...

13

Каждая команда типа с условием ИФ и елсе

Код:
сундук.можно_поместить(Предлог,Что)
{ //запрещаем класть топор в сундук 
  if(Что==Топор) 
    return "не помещается!"
  else
    return cls.можно_поместить(Предлог,Что)
}

должна идти в отдельных фигурных скобках?  Влияет ли на нее OnEnter(), то есть не важно после или перед ставить?
А можно ли тут же указать, что слюду можно поместить и только её и больше ничего. Если речь идет о контейнере для артов. Топор и все остальное туда совать бессмысленно.
Я еще малость тут с освещением не разберусь. Хочу сделать лаз темным, чтоб без арта(который должен свет выделять, ему я тоже никак не могу свет прописать, хотя и пытаюсь) или без фонаря было не пройти. Можно мне пример на лазе сделать, код сверху :rolleyes: Еще с картой не разберусь...тут по трехмерной шкале, чтоль? явно не по оси Х/У=)

14

и как запретить остальное, если потом писать к примеру запрет на пистолет, то он не воспринимает описание этого действия, только первого. Если суем топор пишет "Обалдел?!" то второе пишет стандартное "вы не можете поместить гюрзу в короб"
С картой глюки, я уж нарисовал координатную плоскость...а все не могу понять как они должны соприкасаться друг с другом там ведь XYZ, где Z-высота...восток от меня на листе справа, юг внизу...на шаг соприкосновение? И сколько максимум координат можно указать(к примеру можно ли поставить 20,20,20? ну просто ради примера, вдруг на эверест будет забираццА))))

Отредактировано Комиссар (2011-03-13 14:08:43)

15

Я прописал препятствие со двора в дом, НО! тут возникла следующая бадяга:
1. Когда пишешь "на юг", он все правильно делает пишет, что изба в огне и я туда не пойду. Но когда вводишь "иди в дом" он говорит, что прямого хода нет, как тут быть. Нужно, чтобы он в этом случае тоже писал. И еще прописываю препятствие ниже из сарая во двор, то он все равно идет во двор, хотя именно что по координатам это юг, что тут неправильно?

Код:
двор.добавить_препятствие(на_юг, "Изба охвачена огнем, идти внутрь опасно")
сарай.добавить_препятствие(на_юг, "Во дворе слышны голоса нападавших, выходить из сарая во двор теперь небезопасно!")

Можно ли комплектовать по типу:

Код:
двор.добавить_препятствие(на_юг, в_дом, на север(и т.п.), "Изба охвачена огнем, идти внутрь опасно")

?

Отредактировано Комиссар (2011-03-13 17:32:30)

16

Комиссар написал(а):

и как запретить остальное, если потом писать к примеру запрет на пистолет, то он не воспринимает описание этого действия, только первого. Если суем топор пишет "Обалдел?!" то второе пишет стандартное "вы не можете поместить гюрзу в короб"

Код:
сундук.можно_поместить(Предлог,Что)
{ //запрещаем класть топор, пистолет и саблю в сундук 
  switch(Что)
  case(Топор)  return "не помещается!"
  case(Пистолет)  return "лучше держать при себе"
  case(Сабля)  return "неа, весь лут порежет"

  return cls.можно_поместить(Предлог,Что)
}

17

Комиссар написал(а):

О, такой вопрос как описать самого Актора...везде скользит в локах актор, актор, а где его свойства не нашел...

actor - это тот объект, который выполняет действие - ГГ или НПС по ситуации.
Если свойства ГГ и НПС описаны - этого достаточно.

18

Комиссар написал(а):

Еще с картой не разберусь...тут по трехмерной шкале, чтоль? явно не по оси Х/У=)

Ага, X/Y/Z
Координаты - любое целое число без ограничений. Между соприкасающимися локациями есть проход, если специально не ставить препятствие.

19

Комиссар написал(а):

И еще прописываю препятствие ниже из сарая во двор, то он все равно идет во двор, хотя именно что по координатам это юг, что тут неправильно?

Судя по координатам локаций, сарай у тебя расположен над двором, а еще выше над сараем находится лаз.
В этом случае препятствие в сарае нужно ставить вниз а не на_юг.

Вообще, если запрет на перемещение зависит от ситуации, лучше использовать ChkMoveObj()

Код:
ГГ.ChkMoveObj(From,To)
{ //запрещаем ходить в горящий дом
  if(To==дом && дом.горит) 
  { %дом в огне!
    return нет //перемещение не произойдет
  }
  //запрещаем ходить в двор с бандитами
  if(To==двор && двор.item[бандиты]) 
  { %там бандиты!
    return нет //перемещение не произойдет
  }

  return cls.ChkMoveObj(From,To)

}

20

Таак...Спасибо) Кое что вырисовывается...Но, опять, но!) Если запретить ходить туда ГГ, то как он пройдет первый раз через двор, потому как через двор он пойдет в сарай? Запретим мы...и будет сидеть в горящем доме....курочка гриль)))
Да и как тут бандиты как предмет? Можно ли их пострелять-таки? Вооружить героя пистолетом и топором, но при определенной цели он будет говорит и делать по-разному.
К примеру на кровососа с ножом скажет: "Вы не Рэмбо, чтоб монстров на салат ножичком рубать!", а если с гранатомета(просто к примеру)))) то описание "жахнул так, что от кровососа тапок не осталось!"
А разработчик вы ASBer?

Отредактировано Комиссар (2011-03-13 23:15:35)

21

Приветствую, Комиссар! Успеха и упорства в написании игры, описания локаций хороши.
Да, разработчик ТОМа - ASBer.

22

Комиссар написал(а):

Если запретить ходить туда ГГ, то как он пройдет первый раз через двор, потому как через двор он пойдет в сарай? Запретим мы...и будет сидеть в горящем доме....курочка гриль)))

Все условия условны, ставите флаг дом.горит = да - в дом не ходим, дом.горит = нет - ходим сколько хотим.

Комиссар написал(а):

Да и как тут бандиты как предмет? Можно ли их пострелять-таки? Вооружить героя пистолетом и топором, но при определенной цели он будет говорит и делать по-разному.

Да, всё можно. Только нужно описать бандитов, героя, оружие и все необходимые с ними действия.

Комиссар написал(а):

А разработчик вы ASBer?

Да, разработчик я, ASBer :)

23

Понятно, а где флаг описывать и как ставить, я ведь не умею и бандитов описать не смогу так как сказал.

24

Программирование под ТОМ требует знания ООП и навыков программирования на чём то сходным с С++
В противном случае лучше обзавестись соавтором-программистом.

25

Понятно, в общем буду делать печатный вариант.

26

Тему можно закрывать, вопросов больше не будет, продолжение работ тоже.

27

Ok, тема закрыта.
P.S. задумку только не бросай, допиши - тексты хороши :)