LV. 24
GP 937

【心得】對PitBull4中Lua文字的一點心得

樓主 風凌正 cnhrz
GP24 BP-

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。

  若相簿外連流量已滿,無法瀏覽圖片,可徑至小弟相簿查看:http://www.yupoo.com/photos/guinie/albums/1994413/
  題外話,我先講清楚免得又有莫名其妙的人跑出來砲。我會用yupoo當相簿單純是因為當初在API開發上有一些項目,不要無限上綱到啥愛呆丸有的沒的鬼。

  以前單位框架一直是使用X-Perl,但是4.0剛改版時,總有一些莫名其妙的錯誤,尤其增減益顯示不正常這個大問題,讓我不得不改用PitBull4。

  雖然我一直以來都很欣賞PitBull4的功能,但由於該插件的預設介面實在有點蠢,雖然這個插件幾乎所有細節都可以自己調整,可是一般玩家實在很難有那個閒功夫去搞這些。所以仔細想想,這次X-Perl壞掉也並不是壞事,至少讓我把PitBull4用熟就是一件大好事。


  今天主要分享的是一些關於生命、法力數值的Lua文字編寫,主要是嫌PitBull4內建的文字不夠好,也不符我使用習慣,才會去搞這些東西。



  一開始我覺得最麻煩的地方是,隨著等級提高,首領血量愈來愈多,玩家血量也愈來愈多,因此時常遇到血量超出框架的事情,十分之礙眼。原本是用內建的「簡短模式」(Short函式),也就是說「100000」顯示成「100K」,剛開始看還好,幾分鐘之後愈看愈礙眼,畢竟在我心中長久以來就認定四位一進才是正確的用法,所以我下定決心要讓「100000」顯示成「10萬」。

  於是我參考Short函式自己寫了個數值顯示的函式:

local cur,max = HP(unit),MaxHP(unit)
……
            CorrectNumber1=
CorrectNumber1 or function(value)
                if(value>=10000000000 or value<=-10000000000)then--高於百億則顯示「X億」
                    fmt = "%.0f億"
                    value=value/100000000
                elseif(value>=1000000000 or value<=-1000000000)then--高於十億則顯示「X.X億」
                    fmt = "%.1f億"
                    value=value/100000000
                elseif(value>=100000000 or value<=-100000000)then--高於億則顯示「X.XX億」
                    fmt = "%.2f億"
                    value=value/100000000
                elseif(value>=1000000 or value<=-1000000)then--高於百萬則顯示「X萬」
                    fmt = "%.0f萬"
                    value=value/10000
                elseif(value>=100000 or value<=-100000)then--高於十萬則顯示「X.X萬」
                    fmt = "%.1f萬"
                    value=value/10000
                else
                    fmt = "%d"
                    value = math.floor(value+0.5)
                end
                    return fmt:format(value)
            end
        return "%s/%s(%s%%)",CorrectNumber(cur),CorrectNumber(max),Percent(cur,max)--最終顯示「生命/上限(百分比)」
……


效果:

  接著我又想了,如果游標移上去的時候,能顯示完整數字,好像會比較好。

  於是我在前面加了一行:

……
    if(IsMouseOver())then
        return "%s/%s(%s%%)",cur,max,Percent(cur,max)
    else
……


效果:

  最後,由於PitBull4內建的狀態「離線」是顯示為「Offline」,同樣的,愈看愈礙眼。於是我把「return s」改成「return gsub(s,"Offline","離線")」,蘇胡!

  最終成品是這樣:


local cur,max = HP(unit),MaxHP(unit)
if(max>0)then
    if(IsMouseOver())then
        return "%s/%s(%s%%)",cur,max,Percent(cur,max)
    else
        local s = Status(unit)
        if(s)then
            return gsub(s,"Offline","離線")
        else
            CorrectNumber1=CorrectNumber1 or function(value)
                if(value>=10000000000 or value<=-10000000000)then
                    fmt = "%.0f億"
                    value=value/100000000
                elseif(value>=1000000000 or value<=-1000000000)then
                    fmt = "%.1f億"
                    value=value/100000000
                elseif(value>=100000000 or value<=-100000000)then
                    fmt = "%.2f億"
                    value=value/100000000
                elseif(value>=1000000 or value<=-1000000)then
                    fmt = "%.0f萬"
                    value=value/10000
                elseif(value>=100000 or value<=-100000)then
                    fmt = "%.1f萬"
                    value=value/10000
                else
                    fmt = "%d"
                    value = math.floor(value+0.5)
                end
                    return fmt:format(value)
            end
        return "%s/%s(%s%%)",CorrectNumber1(cur),CorrectNumber1(max),Percent(cur,max)
        end
    end
end



  話說人心總是不足的,生命值處理好,就開始打法力值的主意。這法力值數字方面完全可以拿剛剛寫的生命值函式套用,但玩家的法力值提昇並沒有像生命值提昇的幅度這麼大,所以該函式「十萬」(elseif(value>=100000 or value<=-100000)then)的那部分改成「一萬」(elseif(value>=10000 or value<=-10000)then)。

  另一個問題是,法力以外的東西,怒氣、能量、集中值,好像根本就沒有必要顯示上限跟百分比吧?怒氣還好,像那種110符能、120能量的,加上百分比有時候根本會造成玩家在控制能量上的誤判。所以我們加個小條件,上限在兩百以下的,不顯示上限和百分比:

……
if(max<=200)then
    return "%s",cur
else
……


      當然,由於前面還是有「if(IsMouseOver())」這個條件,所以游標移上去一樣會顯示完整數值跟百分比。
  最後寫好長這樣:


local cur,max = Power(unit),MaxPower(unit)
if(max>0)then
    if(IsMouseOver())then
        return "%s/%s(%s%%)",cur,max,Percent(cur,max)
    else
        CorrectNumber2=CorrectNumber2 or function(value)
            if(value>=10000000000 or value<=-10000000000)then
                fmt = "%.0f億"
                value=value/100000000
            elseif(value>=1000000000 or value<=-1000000000)then
                fmt = "%.1f億"
                value=value/100000000
            elseif(value>=100000000 or value<=-100000000)then
                fmt = "%.2f億"
                value=value/100000000
            elseif(value>=1000000 or value<=-1000000)then
                fmt = "%.0f萬"
                value=value/10000
            elseif(value>=10000 or value<=-10000)then
                fmt = "%.1f萬"
                value=value/10000
            else
                fmt = "%d"
                value = math.floor(value+0.5)
            end
                return fmt:format(value)
        end
        if(max<=200)then
            return "%s",cur
        else
            return "%s/%s(%s%%)",CorrectNumber2(cur),CorrectNumber2(max),Percent(cur,max)
        end
    end
end


效果:
法力一般狀況:
法力游標對象:
能量一般狀況:
能量游標對象:


  發這篇教學不像教學,心得不像心得的東西,主要還是希望大家能一起使用PitBull4、Parrot這類自訂空間很大的插件,多動動腦,打造自己滿意的功能與介面。

  像PitBull4,你看哪裡不爽就改哪裡,尤其自訂Lua文字這個強到有點變態的功能,幾乎已經變成了你不需要學習編寫插件,就能編寫出自己想要的插件!只要你想,甚至可以用PitBull4寫出一個Grid。(無誤)


  最後碎碎唸一下……我實在搞不懂整合包的意義到底在哪裡(小紫例外,小紫做到了整合函式庫,自己也有相當的插件開發功力,如Cartographer_QuestInfo),知道自己該用什麼插件的人,會去用整合包嗎?

  至於不懂的人,你們難道就沒辦法預見自己用了整合包,下場就是一個悲劇嗎?啊你都已經不懂了,還去用別人包了一大堆你完全不曉得它們功能的東西?更別說現在許多整合包都亂塞一些功能重疊並且預設啟用的東西。


24
-
未登入的勇者,要加入討論嗎?
板務人員: