Суть наработки такова: создаётся N число текстовых баз, каждая текстовая база имеет своё краткое название. Текстовая база представляет собой список разных отрывков текста, причём в каждой базе определённое число отрывков текста.
К примеру так: База1 Название базы: "NF" Текст 1: безжалостный Текст 2: кровожадный Текст 3: бессердечный
База2 Название базы: "NG" Текст 1: ублюдок Текст 2: урод
Названия для баз необходимы для ссылки на них в теге. К примеру строка "Ты [NG] [NF]" при запуске функции должна вернуться в текстовое значение вместо тегов в котором вставлены случайные фрагменты текста из соответствующей текстовой базы. Для примера приведём все текстовые значения, которые может вернуть функция с вышеописанными базам текстовых значений и введённым текстом "Ты [NG] [NF]" 1) Ты безжалостный ублюдок 2) Ты кровожадный ублюдок 3) Ты бессердечный ублюдок 4) Ты безжалостный урод 5) Ты кровожадный урод 6) Ты бессердечный урод
Почему мы не решили воспользоваться просто массивами текстовых значений и не сцеплять между собой строки? На это есть две причины: нам требуются легкоредактируемые текстовые базы, а вторую причину мы опишем ниже.
В текстовых значениях базы может содержаться тег на текст другой базы. Чтобы было понятнее приведём пример: База 1 Название "P" Текст 1: кровожадный [P1] Текст 2: ненормальный [P1] Текст 3: зомбированный [P1] Текст 4: безголовый [P2] Текст 5: отвратительный [P2] Текст 6: голодный [P2] Текст 7: мерзкий [P2]
База 2 Название "P1" Текст 1: разбойник Текст 2: бродяга Текст 3: орк
База 3 Название "P2" Текст 1: вурдалак Текст 2: упырь Текст 3: мертвяк
База 4 Название "G" Текст 1: мою сестру Текст 2: моего брата Текст 3: моего отца Текст 4: меня Текст 5: мою жену
База 5 Название "N" Текст 1: однаждый на [G] напал [P], но мне удалось с ним справиться. Текст 2: до меня дошли слухи что какой-то [P] убивает жителей за городскими стенами
Разработчик данной системы станет соавтором проекта Генерации Случайного Мира -) кто заинтересован тому в ЛС -) А, и да, на форуме бытует мнение что мы сектанты, если не боитесь испачкать свою репутацию и имеет желание участвовать в таком необычном проекте то мы будем только рады -)
Требуются тестеры, обращайтесь.
Сообщение отредактировал Rehan - Вторник, 18 Января 2011, 19:58:11
Rehan, ммм вот я тбе до конца не понял.но если это то что нужно то сделаю
Code
local string NF local string PG local integer i local integer r=GetRandomInt(1,3) /////NF///// if r==1 then set NF=" гавно " endif if r==2 then set NF=" дурак " endif if r==3 then set NF=" чмо " endif /////PG///// if r==1 then set PG=" японское " endif if r==2 then set PG=" китайское " endif if r==3 then set PG=" американсоке " endif call DisplayTextToPlayer(GetLocalPlayer(),0.,0.,"Ты"+NF+PG)
Всё просто, запускаешь функцию GetRNDtext("N") и она возвращает случайный текст, опираясь на информацию в базе под именем N То есть GetRNDtext может вернуть следующие значения: Однаждый на мою сестру напал мерзкий упырь, но мне удалось с ним справиться Однаждый на меня напал безжалостный ублюдок, но мне удалось с ним справиться До меня дошли слухи, что какой-то безголовый мертвяк убивает жителей за городскими стенами И многие другие варриации текста. Информация в базах регкоредактируемая а функция может сослаться на любую базу, так-же как и любой отрывок любого текста любой базы может ссылаться на случайный текст другой базы.
Добавлено (18-01-2011, 20:26) --------------------------------------------- Неправильно написали выше, функция должна принимать текстовое значение в таком виде: GetRNDtext("[N]") или GetRNDtext("В таверне один пьяница подошёл к вам и сказал: [N]") или GetRNDtext("[P] сражается против [P]")
Добавлено (18-01-2011, 20:32) --------------------------------------------- Суть такова: каждая база текстов это хэщ-таблица, в ячейке 0:0 хранится показатель количества тектов базы, а в ячейке 0:1 название базы. В системе должна присутствовать функция создающая базу с определённым названием. В массиве сохраняются ссылки на все созданные базы. Так-же в функции должна быть возможность добавления текстовой вариации в последную созданную базу. При запуске функции изъятия случайного текста сканируется введённый текст и каждый тег [name] заменяется текстом из случайной ячейки базы, если текст ячейки базы тоже содержит теги они тоже заменяются на случайные тексты базы и т. д.
function GetRNDTXT takes string source returns string local integer length = StringLength(source) local string result = "" local boolean shade = false local integer i = 1 local integer j local string s local string base loop set s = SubString(source, i - 1, i) if shade then set result = result + s set shade = false elseif s == "`" then set shade = true elseif s == "[" then set base = "" loop set s = SubString(source, i, i + 1) if shade then set base = base + s set s = "" set shade = false elseif s == "`" then set shade = true else exitwhen s == "]" set base = base + s endif set i = i + 1 exitwhen i == length endloop if i < length then set j = 1 loop if LoadStr(udg_RNDTXT_Hash, 0, j) == base then set result = result + GetRNDTXT(LoadStr(udg_RNDTXT_Hash, j, GetRandomInt(1, LoadInteger(udg_RNDTXT_Hash, j, 0)))) exitwhen true endif set j = j + 1 exitwhen j > udg_RNDTXT_MaxHash endloop if j > udg_RNDTXT_MaxHash then set result = result + "[" + base + "]" endif else set result = result + "[" + base endif set i = i + 1 else set result = result + s endif set i = i + 1 exitwhen i > length endloop return result endfunction
call SaveInteger(udg_RNDTXT_Hash, 7, 1, 2) call SaveStr(udg_RNDTXT_Hash, 7, 1, "Однажды на [G] напал [P], но мне удалось с ним справиться.") call SaveStr(udg_RNDTXT_Hash, 7, 2, "До меня дошли слухи, что какой-то [P] убивает жителей за городскими стенами.") set udg_RNDTXT_MaxHash = 7 endfunction
Готово. При вызове функция GetRNDTXT заменяет известные теги на их значения. При этом, если два тега будут ссылаться друг на друга, или произойдет еще какое-нибудь зацикливание (по вине пользователя), игра вылетит. Если нужно поставить просто квадратную скобку, ее следует "экранировать" апострофом (`). Чтобы написать сам апостроф, его нужно удвоить. Например, такая строка: ``Однажды на `[G] напал [P], но мне удалось с ним справиться.`` может быть транслирована в `Однажды на [G] напал зомбированный орк, но мне удалось с ним справиться.`
Также хочу заметить, что чем длиннее строка, передаваемая в функцию, и чем больше в ней содержится тегов, тем больше будут лаги, так что лучше писать не так: call DisplayTextToPlayer(GetLocalPlayer(), .0, .0, GetRNDTXT("В таверне один пьяница подошёл к вам и сказал: [N]")) , а так: call DisplayTextToPlayer(GetLocalPlayer(), .0, .0, "В таверне один пьяница подошёл к вам и сказал: " + GetRNDTXT("[N]"))
Impregnable, безупречно, всё работает -) обо всё остальном в ЛС
Тему можно закрывать
Добавлено (19-01-2011, 12:32) --------------------------------------------- SirNikolas, нехорошо получилось, нам жаль -( Надеемся что ты не слишком много времени потратил на наработку?