String split, shuffle

Published
» Способ реализации: vJass
» Тип: Наработка
Наработка позволяет разделить string на массив string'ов, 1 элемент - 1 слово. "Раз, dva, три" > "Раз", ",", "dva", ",", "три"
Также возможно разделить string на набор символов. "text" > "t", "e", "x", "t" | "Текст" > "Т", "е", "к", "с", "т"
Перемешивание всех букв слова. "text" > "xtte" | "Текст" > "eТстк"
Перемешивание всех букв, кроме первого и последнего, в таком случае сохраняется читабельность. "text" > "txet" | "Текст" > "Тксет"
function Split takes string s returns nothing
function SplitLetter takes string s, boolean cyrillic returns nothing
function Shuffle takes string s, boolean cyrillic returns string
function HalfShuffle takes string s, boolean cyrillic returns string
Соответственно.
Так как, jass не позволяет вернуть массив, есть переменные SplitedString, SplitedLetter, которые хранят последние массивы.
» Функции очистки
function ClearSplitedString takes nothing returns nothing
function ClearSplitedLetter takes nothing returns nothing
» Пример использования
	call Split("some text, можно на русском, можно и так и сяк, можно что-то такое даже")
    loop
        exitwhen(i >= 500)
        if SplitedString[i] != "" then
            call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 10, SplitedString[i])
        else
            set i = 500
        endif
        set i = i + 1
    endloop
    call ClearSplitedString()
Поднимается резонный вопрос, зачем?
  • Функциями тасовки можно скрыть текст от игрока или показать сложность текста для понимания. изображение ниже
  • С помощью split можно позволить прописывать команды одним сообщением. (Передача аргументов также возможна) изображение ниже
  • С помощью того-же split можно искать и модифицировать отдельные слова и например, сделать такой rp чат изображение ниже
» Код всех функций
globals
    string array SplitedString[500]
    string array SplitedLetter[50]
endglobals

function ClearSplitedString takes nothing returns nothing
    local integer i = 0
    loop
        exitwhen(i >= 500)
        set SplitedString[i] = ""
        set i = i + 1
    endloop
endfunction

function Split takes string s returns nothing
    local integer i = 0
    local integer j = 0
    local string ts = ""
    local string st
    
    call ClearSplitedString()
    
    set s = s + "   "
    loop
        exitwhen(i >= StringLength(s))
        set st = SubString(s, i, i + 1)
        if st != " " then
            if st != "." and st != "," and st != "!" and st != "?" and st != "'" and st != ":" then // можно еще знаков препинания добавить
                set ts = ts + st
            else
                set SplitedString[j] = ts
                set ts = st
                set j = j + 1
            endif
        else
            set SplitedString[j] = ts
            set ts = ""
            set j = j + 1
        endif
        
        set i = i + 1
    endloop

endfunction

function ClearSplitedLetter takes nothing returns nothing
    local integer i = 0
    loop
        exitwhen(i >= 50)
        set SplitedLetter[i] = ""
        set i = i + 1
    endloop
endfunction

function SplitLetter takes string s, boolean cyrillic returns nothing
    local integer i = 0
    local integer x = 1
    if cyrillic then
        set x = 2
    endif
    call ClearSplitedLetter()
    
    set s = s + " "
    loop
        exitwhen(i >= StringLength(s))
        set SplitedLetter[i] = SubString(s, i, i + x)
        set i = i + 1
    endloop
endfunction

function Shuffle takes string s, boolean cyrillic returns string
    local integer i = 0
    local integer r = 0
    local integer len
    local string ts
    local string array ss
    local integer x = 1
    if cyrillic then
        set x = 2
    endif
    if s != "." and s != "," and s != "!" and s != "?" and s != "'" and s != ":" then
        call SplitLetter(s, cyrillic)
        
        loop
            exitwhen(i >= 50)
            if SplitedLetter[i] != "" then
                set ss[i] = SplitedLetter[i]
                set len = i
            else
                set i = 50
            endif
            set i = i + x
        endloop
        
        set i = 0
        loop
            exitwhen(i >= len-1)
            set r = GetRandomInt(0, len-1)
            
            set ts = ss[r]
            set ss[r] = ss[i]
            set ss[i] = ts
            
            set i = i + 1
        endloop
        
        call ClearSplitedLetter()
        
        set ts = ""
        set i = 0
        loop
            exitwhen(i >= len)
            set ts = ts + ss[i]
            set i = i + 1
        endloop
        return ts
    
    else
        return s
    endif
endfunction

function HalfShuffle takes string s, boolean cyrillic returns string
    local string f
    local string l
    local string c
    local integer x = 1
    if cyrillic then
        set x = 2
    endif
    if s != "." and s != "," and s != "!" and s != "?" and s != "'" and s != ":" then
        set f = SubString(s, 0, x)
        set l = SubString(s, StringLength(s) - x, StringLength(s))
        set c = Shuffle(SubString(s, x, StringLength(s) - x), cyrillic)
        
        return f + c + l
        
    else
        return s
    endif
endfunction


Views: 112

GetLocalPlayer #1 - 3 weeks ago 0
Голосов: +0 / -0
Так как, jass не позволяет вернуть массив, есть переменные SplitedString, SplitedLetter, которые хранят последние массивы.
Jass не может, vJass может. Если vJass уже используется, возвращай vJass массив.
ofeerist #2 - 3 weeks ago 0
Голосов: +0 / -0
GetLocalPlayer:
Так как, jass не позволяет вернуть массив, есть переменные SplitedString, SplitedLetter, которые хранят последние массивы.
Jass не может, vJass может. Если vJass уже используется, возвращай vJass массив.
А как?
Hate #3 - 3 weeks ago 0
Голосов: +0 / -0
ofeerist:
GetLocalPlayer:
Так как, jass не позволяет вернуть массив, есть переменные SplitedString, SplitedLetter, которые хранят последние массивы.
Jass не может, vJass может. Если vJass уже используется, возвращай vJass массив.
А как?
структуры курите
GetLocalPlayer #4 - 3 weeks ago 1
Голосов: +1 / -0
А как?
Здесь подробно.
build #5 - 2 weeks ago 0
Голосов: +0 / -0
Очень странное применение shuffle, конечно) Может соединить с этим и что-то мощное запилить?
ofeerist #6 - 2 weeks ago 0
Голосов: +0 / -0
build:
Очень странное применение shuffle, конечно) Может соединить с этим и что-то мощное запилить?
Единственное, что пришло в голову :D
Могу переписать на vjass и добавить свой функционал, если не лень будет