1. 소개


티츄(한글판)(자동점수화)를 업로드하신 bblch1016(티아)님께서 요청하신 손패를 오름차순으로 정렬하는 오브젝트입니다. 제가 예전에 업로드했던 4인 리치마작 (역, 부수 자동계산)의 마작패를 정렬하는 스크립트를 활용하여 플레이어별 수정 없이 적용되도록 작성하였습니다.
버튼을 생성할 오브젝트에 스크립트를 넣어 사용하시기 바랍니다. 현재 기본값은 검사할 항목을 카드 이름에, 카드 크기는 티츄 기준으로 작성되어 (참새, 2~10, J, Q, K, A, 봉황, 용, 개) 순서입니다. ValTable을 수정하여 다른 보드게임에도 적용하실 수 있습니다.

2. 스크립트 전문


handArrange.lua
0.00MB

--[[
    ## 핸드 정리 오브젝트 ##
    스크립트 작성: RoughMelody (https://roughmelody.tistory.com/51)
    핸드에 있는 물건들의 이름이나 Description을 비교해서 숫자로 바꿔 오름차순으로 정리해줍니다.
    주의: 핸드 구역이 반드시 X축이나 Y축에 수평인 방향이어야 합니다. 사선으로 되어있는 핸드 구역에서의 작동은 보장하지 않습니다.
]]--

--카드의 검사할 항목과 크기를 매칭해주세요
valTable = {
    하트_2 = 2,     하트_3 = 3,       하트_4 = 4,      하트_5 = 5,      하트_6 = 6,      하트_7 = 7,      하트_8 = 8,
    하트_9 = 9,     하트_10 = 10,     하트_J = 11,     하트_Q = 12,     하트_J = 13,     하트_A = 14,

    클로버_2 = 2,   클로버_3 = 3,     클로버_4 = 4,    클로버_5 = 5,    클로버_6 = 6,    클로버_7 = 7,    클로버_8 = 8,
    클로버_9 = 9,   클로버_10 = 10,   클로버_J = 11,   클로버_Q = 12,   클로버_J = 13,   클로버_A = 14,

    스페이드_2 = 2, 스페이드_3 = 3,   스페이드_4 = 4,  스페이드_5 = 5,  스페이드_6 = 6,  스페이드_7 = 7,  스페이드_8 = 8,
    스페이드_9 = 9, 스페이드_10 = 10, 스페이드_J = 11, 스페이드_Q = 12, 스페이드_J = 13, 스페이드_A = 14, 

    다이아_2 = 2,   다이아_3 = 3,     다이아_4 = 4,    다이아_5 = 5,    다이아_6 = 6,    다이아_7 = 7,    다이아_8 = 8,
    다이아_9 = 9,   다이아_10 = 10,   다이아_J = 11,   다이아_Q = 12,   다이아_J = 13,   다이아_A = 14,

    참새 = 1,       봉황 = 15,        용 = 16,         개 = 17,
}

--검사할 항목을 이름에 적었다면 getName()을, Description에 적었다면 getDescription()으로 바꿔주세요.
function getVal(target)
    return valTable[target.getName()]
end


--버튼은 입맛에 맛게 수정하시기 바랍니다.
button_parm = {
    click_function = 'arrangeHand',
    function_owner = self,
    label = '손패 정렬',
    width = 1000,
    height = 400,
    position = {0, 0.5, 0},
    font_size = 200,
}

--이 아래를 수정하시는 경우 올바른 작동을 보장하지 않습니다.

function onload()
    self.createButton(button_parm)
end

function arrangeHand(obj, playero)
    local hands = Player[playero].getHandObjects()
    local comp = 'x'
    local distant = 0.3
    local avgY = 3.57
    local uncomp = 'z'

    --핸드가 두장 미만이면 리턴
    if #hands < 2 then
        return
    end

    --핸드의 x값들이 같으면 위<->아래 정렬, 아니면 좌<->우 정렬
    if math.floor(hands[1].getPosition()['x']*10) == math.floor(hands[2].getPosition()['x']*10) then
        comp = 'z'
        uncomp = 'x'
    end

    --높이 비교해서 양 끝 손패 위치 복사
    local minPos = {}
    for i=1, #hands do
        if i == 1 then
            minPos = hands[i].getPosition()
            maxPos = hands[i].getPosition()
        elseif minPos['y'] > hands[i].getPosition()['y'] then
            minPos = hands[i].getPosition()
        elseif maxPos['y'] < hands[i].getPosition()['y'] then
            maxPos = hands[i].getPosition()
        end
    end

    --(맨 위 - 맨 아래)/(핸드 갯수-1) 해서 손패별 간격 구하기
    distant = math.floor((maxPos[comp] - minPos[comp])/(#hands-1)*100)/100
    --높이 평균치 구하기
    avgY = math.floor(((math.abs(minPos['y']) + math.abs(maxPos['y'])) * 50))/100
    --변하지 않는 좌표 구하기 (위<->아래 정렬이면 x값, 좌<->우 정렬이면 z값)
    uncompVal = math.floor(hands[1].getPosition()[uncomp]*100)/100

    --버블정렬로 순서 세우기
    for i=1, #hands-1 do
        for j=1, #hands-i do
            local val1 = getVal(hands[j])
            local val2 = getVal(hands[j+1])
            if val1 > val2 then
                local temp = hands[j+1]
                hands[j+1] = hands[j]
                hands[j] = temp
            end
        end
    end

    --순서대로 손패 배치
    for i=1, #hands do
        hands[i].setPosition({
            ['y'] = avgY,
            [comp] = minPos[comp] + (distant*(i-1)),
            [uncomp] = uncompVal
        })
    end
end

3. 마무리


스크립트 활용 글은 테이블 탑 시뮬레이터에서 광범위하게 적용될 수 있는 오브젝트를 공유하는 글입니다. 가이드와는 달리 각 코드에 대한 설명은 글에 따로 작성하지 않습니다만, 대략적인 흐름은 주석을 통해 달아두었습니다. 혹시나 궁금하신 점 댓글로 달아주시면 아는 범위에서 최대한 답변드리도록 하겠습니다. 읽어주셔서 감사합니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기