Форум » » живой игровой мир » Ответить

живой игровой мир

noname: это особое направление для УРК-работ: пусть все NPC живут своей жизнью, а не ждут ГГ. я подготовил пример, где они могут ходить по всем доступным локациям или не ходить (всего 4-ре персонажа, номер персонажа, которым будет управлять игрок задан в переменной 'игрок')

Ответов - 136, стр: 1 2 3 4 5 6 7 All

noname: новый концепт не придумался: хотел уместить обработку ввода игрока в одну маленькую локацию, а потом отослать полученную команду на исполнение как для обычного актёра. НО вышел облом из-за того, что сообщения выводятся по-разному (т.е. они выводятся именно для игрока) как бы вывод убрать в отдельную процедуру? думай голова, шапку куплю... P.S. вот сделал вещи- неписи их могут брать и выкладывать. если сила=N значит непись может нести N вещей, если их больше- не сможет сдвинуться с места. если ловкость=6 значит непись никогда не пропустит ход (ждать- не пропуск хода, а действие. если непись пропускает ход то, в отличие от ожидания, о его действиях в локации на этом ходу никаких комментариев не выводится).если ловкость=1 значит непись ходит с вер-тью 1/6 и пропускает ход с вер-тью 5/6. P.P.S. игрок пока не может ничего делать с вещами. он может ждать идти на север , а так же в других направлениях.

noname: ; ex2alpha.qst ; пример№2 игрок пока не может выполнять действий с вещами ; (неписи могут взять... и выложить... ) ; его команды остались теми же, что и в предыдущем примере ;------------------------------------------------ :инициализация_локация ; начало инициализации invkill perkill ; поля instr поле11вид = на яркой солнечной поляне[св] поле11_се = 12; куда переход, если 0- перехода нет поле11_за = 0 поле11_юг = 0 поле11_во = 21 поле11актёров = 0 поле11вещей = 0 instr поле21вид = у красивого, освежающего водопада[сзв] поле21_се = 22 поле21_за = 11 поле21_юг = 0 поле21_во = 31 поле21актёров = 0 поле21вещей = 0 instr поле31вид = на холме, покрытом множеством цветов[сз] поле31_се = 32 поле31_за = 21 поле31_юг = 0 поле31_во = 0 поле31актёров = 0 поле31вещей = 0 instr поле12вид = в лесу, наполненном весёлым щебетом[сюв] поле12_се = 13 поле12_за = 0 поле12_юг = 11 поле12_во = 22 поле12актёров = 0 поле12вещей = 0 instr поле22вид = в удивительно прозрачном мелком ручейке[сзюв] поле22_се = 23 поле22_за = 12 поле22_юг = 21 поле22_во = 32 поле22актёров = 0 поле22вещей = 0 instr поле32вид = в лесу, устланном ароматными листьями[сзю] поле32_се = 33 поле32_за = 22 поле32_юг = 31 поле32_во = 0 поле32актёров = 0 поле32вещей = 0 instr поле13вид = в уютном домике лесного эльфа[ю] поле13_се = 0 поле13_за = 0 поле13_юг = 12 поле13_во = 0 поле13актёров = 0 поле13вещей = 0 instr поле23вид = под отвесной величественной скалой[ю] поле23_се = 0 поле23_за = 0 поле23_юг = 22 поле23_во = 0 поле23актёров = 0 поле23вещей = 0 instr поле33вид = в богато украшенной гномьей пещере[ю] поле33_се = 0 поле33_за = 0 поле33_юг = 32 поле33_во = 0 поле33актёров = 0 поле33вещей = 0 макс_полей = 33;максимумы по горизонтали и по вертикали ;просматриваем прямоугольник от 11 до 33. он может и не весь быть заполнен локациями ;пришла в голову идея составлять таблицу переходов отдельным редактором, как в Adrift. ; актёры instr актёр1имя = Честный Галантный Рыцарь актёр1место = 12; номер поля актёр1сила = 5 актёр1ловкость = 6 ;актёр1вещь1=2 ; так устроен местный инвентарь актёр1вещей = 0 поле12_актёров = поле12_актёров+1 ; актёр добавлен instr актёр2имя = Умиротворённый Обаятельный Мудрец актёр2место = 21 актёр2сила = 2 актёр2ловкость = 1 актёр2вещей = 0 поле21_актёров = поле21_актёров+1 instr актёр3имя = Нежная Добрая Принцесса актёр3место = 32 актёр3сила = 1 актёр3ловкость = 2 актёр3вещей = 0 поле32_актёров = поле32_актёров+1 instr актёр4имя = Бесшабашный Развязный Дракон актёр4место = 22 актёр4сила = 6 актёр4ловкость = 5 актёр4вещей = 0 поле22_актёров = поле22_актёров+1 instr актёр5имя = Ловкий Лесной Эльф актёр5место = 13 актёр5сила = 3 актёр5ловкость = 4 актёр5вещей = 0 поле13_актёров = поле13_актёров+1 instr актёр6имя = Выносливый Пещерный Гном актёр6место = 33 актёр6сила = 4 актёр6ловкость = 3 актёр6вещей = 0 поле33_актёров = поле33_актёров+1 макс_актёров = 6; обязательно должен быть хотя бы один актёр ; вещи instr вещь1вп = свежее зелёное яблоко вещь1место = 11 ; если в чьём-то инвентаре, то место=0 поле11_вещей = поле11_вещей+1 ; вещь добавлена instr вещь2вп = пожелтевший кленовый лист вещь2место = 11 поле11_вещей = поле11_вещей+1 instr вещь3вп = апетитный белый гриб вещь3место = 11 поле11_вещей = поле11_вещей+1 instr вещь4вп = лёгкое белое перо вещь4место = 31 поле31_вещей = поле31_вещей+1 instr вещь5вп = душистый полевой цветок вещь5место = 31 поле31_вещей = поле31_вещей+1 instr вещь6вп = небольшую искривлённую веточку вещь6место = 31 поле31_вещей = поле31_вещей+1 instr вещь7вп = плоский камешек с отверстием вещь7место = 23 поле23_вещей = поле23_вещей+1 instr вещь8вп = крупную каплю росы вещь8место = 23 поле23_вещей = поле23_вещей+1 instr вещь9вп = древний волшебный свиток вещь9место = 23 поле23_вещей = поле23_вещей+1 макс_вещей = 9 ; игрок выбор = rnd#макс_актёров$ :инициализация_метка_1 goto предварительный_выбор_игрока_локация ; завершение инициализации end ;------------------------------------------------ :предварительный_выбор_игрока_локация выбор = выбор+rnd#макс_актёров-1$ ; выбираем любого персонажа, кроме того же самого if выбор>макс_актёров then выбор=выбор-макс_актёров pln Имя : #%актёр#выбор$имя$ pln Сила = #актёр#выбор$Сила$ pln Ловкость = #актёр#выбор$Ловкость$ btn окончательный_выбор_игрока_локация, играть этим персонажем btn инициализация_метка_1, выбрать другого персонажа btn выбор_персонажа_с_клавиатуры_локация, ввести имя персонажа end ;------------------------------------------------ :окончательный_выбор_игрока_локация игрок = выбор pln #%игрок$ goto главная_локация end ;------------------------------------------------ :выбор_персонажа_с_клавиатуры_локация instr name= input name выбор = 0 счётчик = 0 :выбор_персонажа_с_клавиатуры_метка_1 счётчик = счётчик+1 if name=актёр#счётчик$имя then выбор=счётчик if счётчик<макс_актёров then goto выбор_персонажа_с_клавиатуры_метка_1 ;в следующей строчке "выбор = rnd#макс_актёров$" добавлено, что бы следующий персонаж был выбран из всего списка с равной вероятностью (подумайте сами) if выбор=0 then pln нет такого персонажа в нашем мире & pln & выбор = rnd#макс_актёров$ & goto предварительный_выбор_игрока_локация else goto окончательный_выбор_игрока_локация end ;------------------------------------------------ ;************************************************ :главная_локация instr vvod="начало" ; почему-то без этого оставался "конец" от предыдущей игры proc мотор_локация ; ходят все if (vvod="конец")or(vvod="end") then end goto главная_локация end ;************************************************ ;------------------------------------------------ :мотор_локация ;начало движения чей_ход = 0 :мотор_метка_1 ; выполняем для каждого актёра чей_ход = чей_ход+1 дел = 0 if (rnd6)>(актёр#чей_ход$ловкость) then goto мотор_метка_2; пропуск хода ;идти по направлению if актёр#чей_ход$вещей > актёр#чей_ход$сила then goto мотор_метка_5 if поле#актёр#чей_ход$место$_се <> 0 then дел=дел+1 & дело#дел$="идти на" & арг1#дел$="север" if поле#актёр#чей_ход$место$_за <> 0 then дел=дел+1 & дело#дел$="идти на" & арг1#дел$="запад" if поле#актёр#чей_ход$место$_юг <> 0 then дел=дел+1 & дело#дел$="идти на" & арг1#дел$="юг" if поле#актёр#чей_ход$место$_во <> 0 then дел=дел+1 & дело#дел$="идти на" & арг1#дел$="восток" :мотор_метка_5 ; если актёр перегружен - не может двигаться ; хорошо бы использовать этот список для сверки с вводом игрока, чтоб всё было по-честному: ; что можно игроку, то можно и актёру- полное равенство ;ждать - всегда доступное действие без аргументов (необходимо всегда иметь хотя бы одно доступное действие) дел=дел+1 & дело#дел$="ждать" ;взять вещь счётчик = 0 :мотор_метка_3 ; перебираем вещи на поле счётчик = счётчик + 1 if актёр#чей_ход$место=вещь#счётчик$место then дел=дел+1 & дело#дел$="взять" & арг1#дел$=вещь#счётчик$вп & арг1#дел$n=счётчик if счётчик<макс_вещей then goto мотор_метка_3 ;выложить вещь счётчик = 0 :мотор_метка_4 ; перебираем вещи в инвентаре счётчик=счётчик+1 if актёр#чей_ход$вещей>=счётчик then дел=дел+1 & дело#дел$="выложить" & арг1#дел$=вещь#актёр#чей_ход$вещь#счётчик$$вп & арг1#дел$n=счётчик & goto мотор_метка_4 ;пускаем список на обработку if игрок = чей_ход then proc ввод_игрока_локация else proc ход_актёра_локация :мотор_метка_2 ; если был пропуск хода if чей_ход < макс_актёров then goto мотор_метка_1 ;конец всех действий end ;------------------------------------------------ :отображение_локация pln pln Вы #%поле#актёр#игрок$место$вид$ pln Вы видите: счётчик = 0 :отображение_метка_1 счётчик = счётчик + 1 if вещь#счётчик$место = актёр#игрок$место then pln . #%вещь#счётчик$вп$ if счётчик<макс_вещей then goto отображение_метка_1 pln Здесь находятся: счётчик = 0 :отображение_метка_2 счётчик = счётчик + 1 if актёр#счётчик$место = актёр#игрок$место then pln - #%актёр#счётчик$имя$[#актёр#счётчик$вещей$] if счётчик<макс_актёров then goto отображение_метка_2 end ;------------------------------------------------ :ход_актёра_локация if дел=0 then end ; бывает из-за пропусков хода выбор = rnd#дел$ if дело#выбор$="ждать" then proc ждать_актёр_локация if дело#выбор$="идти на" then proc идти_на_актёр_локация if дело#выбор$="взять" then proc взять_актёр_локация if дело#выбор$="выложить" then proc выложить_актёр_локация end ;------------------------------------------------ :ввод_игрока_локация vvod="пустой ввод" proc отображение_локация ; игрок должен видеть текущую ситуацию pln pln Введите, что сделать: input vvod tokens vvod if token1="ждать" then proc ждать_игрок_локация if token1="идти" then proc идти_на_1_игрок_локация end ;------------------------------------------------ :ждать_актёр_локация if актёр#чей_ход$место = актёр#игрок$место then pln + #%актёр#чей_ход$имя$[#актёр#чей_ход$вещей$] чего-то ждёт end ;------------------------------------------------ :ждать_игрок_локация pln #%актёр#игрок$имя$ чего-то ждёт end ;------------------------------------------------ :идти_на_актёр_локация if актёр#чей_ход$место = актёр#игрок$место then pln + #%актёр#чей_ход$имя$[#актёр#чей_ход$вещей$] ушёл на #%арг1#выбор$$ if арг1#выбор$="север" then актёр#чей_ход$место = поле#актёр#чей_ход$место$_се if арг1#выбор$="запад" then актёр#чей_ход$место = поле#актёр#чей_ход$место$_за if арг1#выбор$="юг" then актёр#чей_ход$место = поле#актёр#чей_ход$место$_юг if арг1#выбор$="восток" then актёр#чей_ход$место = поле#актёр#чей_ход$место$_во if актёр#чей_ход$место = актёр#игрок$место then pln + вошёл #%актёр#чей_ход$имя$[#актёр#чей_ход$вещей$] end ;------------------------------------------------ :идти_на_1_игрок_локация if token2="на" then goto идти_на_2_игрок_локация end ;------------------------------------------------ :идти_на_2_игрок_локация pln #%актёр#игрок$имя$ ушёл на #%token3$ if (token3="север")and(поле#актёр#игрок$место$_се<>0) then актёр#игрок$место = поле#актёр#игрок$место$_се if (token3="запад")and(поле#актёр#игрок$место$_за<>0) then актёр#игрок$место = поле#актёр#игрок$место$_за if (token3="юг")and(поле#актёр#игрок$место$_юг<>0) then актёр#игрок$место = поле#актёр#игрок$место$_юг if (token3="восток")and(поле#актёр#игрок$место$_во<>0)then актёр#игрок$место = поле#актёр#игрок$место$_во pln и оказался #%поле#актёр#игрок$место$вид$ end ;------------------------------------------------ :взять_актёр_локация if актёр#чей_ход$место = актёр#игрок$место then p + #%актёр#чей_ход$имя$[#актёр#чей_ход$вещей$] взял #%арг1#выбор$$ вещь#арг1#выбор$n$место = 0 актёр#чей_ход$вещей = актёр#чей_ход$вещей + 1 актёр#чей_ход$вещь#актёр#чей_ход$вещей$=арг1#выбор$n proc список_актёра_локация end ;------------------------------------------------ :выложить_актёр_локация ; внимание! арг1#выбор$n в данном случае хранит номер вещи в инвентаре актёра if актёр#чей_ход$место = актёр#игрок$место then p + #%актёр#чей_ход$имя$[#актёр#чей_ход$вещей$] выложил #%арг1#выбор$$ ; ложим вещь в локацию: вещь#актёр#чей_ход$вещь#арг1#выбор$n$$место = актёр#чей_ход$место ; убираем вещь из инвентаря: актёр#чей_ход$вещь#арг1#выбор$n$=актёр#чей_ход$вещь#актёр#чей_ход$вещей$ актёр#чей_ход$вещей = актёр#чей_ход$вещей - 1 proc список_актёра_локация end ;------------------------------------------------ :список_актёра_локация if актёр#чей_ход$место <> актёр#игрок$место then goto список_актёра_метка_2 if актёр#чей_ход$вещей = 0 then goto список_актёра_метка_2 p .теперь он несёт: счётчик=0 :список_актёра_метка_1 счётчик=счётчик+1 p #%вещь#актёр#чей_ход$вещь#счётчик$$вп$. if счётчик<актёр#чей_ход$вещей then goto список_актёра_метка_1 pln :список_актёра_метка_2 end

noname: оставлена отладочная информация о выходах из локаций а так же о кол-ве вещей у неписей а так же о том, что же у непися в кармашке (последнее-только когда он изменяет содержимое инвентаря). ВНИМАНИЕ! как бы соблазнительно ни выглядели буковки [сзюв] в списке выходов, необходимо писать команду целиком: идти на восток (к примеру) P.S. долго ловил баги. вроде бы всех выловил. не удержался до окончательной версии- выложил, что есть


noname: жду рекомендаций по оптимизации кода (как же, станет кто-нить в этом коде разбираться) доделки остались элементарные, жаль из-за работы(стажируюсь) времени остаётся мало. иначе я б уже давно всё закончил.

noname: да, кстати, noname - это забывший свой пароль qwerty. мне всё равно, кем быть, пусть останусь noname, но хотелось бы просуммировать(или как там ещё учесть) рейтинги и кол-во постов. в-общем, объединить как-то два в одно. а если когда сделаю полноценный квест- назову его qwerty03

noname: живой игровой мир включает в себя два момента: собственно мир, в котором персонажи равны (с учётом их качеств) персонажу игрока (точнее игрок играет за любого из персонажей) & логика поведения персонажей логично начать с первого пункта, чтоб было где оттачивать второй... задача не так уж и сложна, если разделить её на под-задачи p.s. неписи вполне могут быть умнее игрока, так как "знают", где чего в соседних локациях лежит (где-то крутой непись шмотку выбросил, где-то на рынок подешёвке что-то выкинули, или наоборот- дорого покупают) . сложных алгоритмов я буду избегать как огня: разумного поведения персонажей можно добиться введением отношений (друг к другу) и ещё всяких отношений(к клану, ...) а так же смысловыми ограничениями: ну там, полить огород можно только если он уже засеян, а так же введением страхов и желаний (об этом я уже постил в этой теме) p.p.s. 19-го сделал пример№1 22-го после долгих метаний сделал парсерный пример№1 24-го сделал недоделанную версию примера№2 с учётом того, что я работал над каждым из проектов не более 2-х часов- неплохо сейчас я продолжаю метаться м/ду платформами везде что-нить не так... на qsp аналогичный проект движется с большим скрипом, но я стараюсь. ИМХО настоящий текстоквестописец должен знать более одной платформы.

noname: да и вот ещё что: пару дней назад акурка(скачал пре1 вместо пре6) стала выдавать сообщение, что файл richtxt32.ocx неверно инсталлирован в системе(либо отсутствует). и не запускается. в-общем мрак полный.

Nex: noname я лечил акурку так: сделал батник (.bat файл), в котором написал akurq.exe regsvr32 /u /s richtx32.ocx То есть после каждого вызова акурки "удаляется" из системы richtx32.ocx, а при запуске - устанавливается. Вот такой костыль к этой кривой программе. Сам файл richtx32.ocx нужно скачать (например, по этой ссылке), и положить в папку WINDOWS/System32.

noname: уррра! заработала! я как-то слишком быстро отказался от использования акурки...пре1 только из-за того, что она непоняла одну сомнительную конструкцию с xbtn, которую понимала пре6. может, попробую на акурке... с кейрусом задалбывает ещё одна интересная особенность: требуется очень высокая скорость нажатия клавиш переключения режима. я себе чуть кнопки не раздолбал постараюсь делать версию URQL совместимую и с досуркой и с акуркой, а unikbd.com когда-нибудь обязательно достану (может под фаром будет работать)

noname: что-то Акурка меня не понимает. из описания в хелпе я пока не понял, что её не устраивает в досурковской версии дело было явно не в xbtn какие возможности ловли багов существуют на Акурке(пре1)???

noname: после того, как заменил все 'ё' на 'е' прога кое-как заработала на Акурке_пре1 буду разбираться дальше. вопрос дебагинга остаётся открытым

AlSid: Думаю, что ув. noname заслужил победу сразу в трех номинациях - самое большое количество постов подряд (14!), самый длинный пост и самый бесполезный пост (оба - за пост под названием "; ex2alpha.qst ; при.."). И, кажется, это только начало...

noname: AlSid ну у меня же до этого проекта были тока совсем простые квесты qwerty01 и qwerty02. я осваиваюсь с URQL. лучше бы про дебагинг Акурки постнул чего-нибудь, а то я воюю с интерпретаторами, как с ветряными мельницами. уже в отчании полез rtads авторский комплект качать(почему его нельзя взять отдельно от проигрывателя?) но, чё-то не качается... у меня к томуж комп новый недавно после большого перерыва и флэшгета у меня нет. и вообще много чего полезного нет.

Korwin: Qwerty, кинь почту в личку только пиши вместо собаки "гав" для спам-роботов, отправлю тебе что нужно для tads. Вообще привет :)

GooseMan: Для Noname Посмотрите URQ Arena. там именно набросок ОБЪЕКТНОГО мира. писалось сие под Досурку, посему весьма коряво обойдено отсутствие xBtn. Однако монстры (ака боты), вещи и локации задуманы и реализованы как объекты. Ессно, в данной реализации игра весьма тупа, но в свое время у мну были думки заставить ботов двигацо самостоятельно, и брать, например, вещи, "просматривать" локации, соседние со своей в поисках Персонажа. Поройтесь в кишках, я там подробное описание оставил. А вообще, самостоятельный мир на Урке вполне возможно построить, в частности, описать не только свойства объектов, но и так скэть, их методы: всемогущий #$ творит чудеса. Наброски реализации методов я делал в DoA (лежит в аплоде, перманентно не закончена) - правда, опять же, без алгоритма обработки самостоятельных действий НПС, но сие можно реализовать элементарно, прописываем в метод объекту имя метки, ответственной за некое действие, и обрабатываем эту метку процем в коммоне при каждом ходе...

noname: GooseMan твою Арену смотрел и ковырял и она- одна из прог, которые вдохновили меня начать писать Ж.И.М. стараюсь писать не просто в ООП стиле, но и давать такие имена, чтоб не запутаться, когда прога станет непомерно большой и на куски логические разделять разве из последней выложенной здесь проги не видно? #$ мне ооочень нравится, но ненравится работа интерпретаторов а свой писать- долго, да и наверняка непредвид трудности возникнут а вообще, в конце-концов напишу свой интерпретёр p.s. привинтить интеллект персонажам- не проблема. могу сделать их хоть умнее гамера, причём без гандикапа, чисто чесным мухлежом: они-то знают где что находится, а игрок-нет. пока проблема в интерпретаторах и неудобствах p.p.s. за своё пропадание дико извиняюсь- не виноватый я. меня жизнь так перевернула, что ваааще.

GooseMan: noname пишет: давать такие имена, чтоб не запутаться, когда прога станет непомерно большой и на куски логические разделять Это дааааааа, это верноооооо :-D/ кстати - непомерная большесть - это главная трудность имитации ООП на УРКЛ. Хотя ЖИМЪ на УРКЛ при должном умении будет живее чем на специализированных ООП-платфоромах, которые обладают хоть и развитой, но жесткой системой объектов, связанных вполне определенными связями. А вот в УРКЛ мы до поры до времени используем псевдо-ООП, а потом РРРАЗ, и задвигаем его в дальний ящик, возвращаясь к вольному линейно-командному алгоритмическому стилю. Если бы был нормально реализованный механизм инклюда - тогда запросто можно было бы разбивать игру на отдельные файлы - механизм (движок), карты, монстры, аддоны ))) - что упростило бы навигацию в коде впоследствии

noname: ну а пока можно разделять ;--------------------------------------- комментариями p.s. а ещё, по-моему в досурке нет работы с файлами

Korwin: include

GooseMan: вот если бы работало такое: res.qst ------- :pseudo-function <code> end ------- main.qst -------- include res.qst :label <code> proc pseudo-finction <code> end ----- пока вроде не работает?



полная версия страницы