-
1 # 企鵝遊研社
-
2 # 十一童裝
AAEBAa0GHgiGAdMBmwPIBfEFlw3aE/msAsmvArW7Aui/AqDBAprCAuPCAsjHApnIAubMAonNAujQAubTAuPpAvHqAtfrAsPsAvLsAo7uAouAA9uJA+uKAwAA # #
這段看起來亂七八糟的字串,卻描述出爐石一整套牌,很神奇是不是?
實際上這段字元是經過一些演算法轉化成這樣的。真正程式設計師編碼時用到的是這樣的程式碼, ["大螺絲","死亡之翼","火車王","巫妖王"……]
這種中括號包起來的叫做陣列,是一種資料型別,陣列內雙括號包起來的叫字串。
當然只是舉個簡單的例子,真實的遊戲資料肯定要比這複雜的多。
暴露給玩家真實的資料結構顯然不利於傳播,少個雙引號,或者雙引號不是半形程式都會不認。再一個暴露遊戲的資料結構也不利於安全性。
-
3 # 明月玉才
我儘可能地簡單解釋一下,但可能還是有些複雜,建議有一定程式設計基礎的人看。
先說一下神秘程式碼的構成,神秘程式碼從前往後包含這麼幾個部分:
1. 預留位元組,目前始終為0。
2. 版本號,目前始終為1。這個版本號不是指爐石版本號,而是神秘程式碼的版本號,意味著以後想在這個神秘程式碼里加一些新的功能,會啟用新的版本號,告訴爐石客戶端應該使用不同的方法去解析這串程式碼。
3. 卡組型別,標準=2,狂野=1。
4. 卡組包含的英雄數量,目前始終為1。所以也許意味著以後可能會出一些雙英雄的模式?
5. 英雄ID。
6. 數量為1的卡牌的數量,舉個例子,宇宙系列的牌組的這個值就是30。
7. 等於上面這個數量的數字,每個數字表示一個卡牌ID。
8. 數量為2的卡牌的數量。
9. 等於上面這個數量的數字,每個數字表示一個卡牌ID。
10. 數量大於2的卡牌的數量。這個部分和下面的部分暫時都為啟用。
11. 等於上面這個數量的數字的二元組,每個二元組表示卡牌ID及其出現的數量。
上面這麼一些資訊就足夠完整地描述一個卡組了,那為什麼我們看到的是一串奇怪的字元呢,下面解釋一下爐石是怎麼根據上面的資訊來生成一串奇怪的程式碼的。
兩個概念需要先了解一下:
1. Base64編碼。這種編碼方式的好處是編碼後的結果只會有0~9、大小寫a-z、以及+/這兩個符號,總共10+26*2+2=64種字元。它的儲存效率並不高,它需要用1個位元組(也就是8位)來表示區區6位的資料。但他的優勢是編碼後的字元都是可見字元,便於人類直接複製和傳播。
2. VarInt。上面說過了,神秘程式碼其實就是由一堆數字構成的,如果暴雪直接使用int32來儲存每一個數字,就太浪費空間了,佔用空間越多,生成的神秘程式碼越長,越不利於傳播。因為目前卡牌數量也就那麼幾千張,理論上用int16可能就夠了。但是一旦確定用int16,萬一爐石傳說順利運營了一百年,卡牌數量超過了int16的範圍,那這套機制就不能用了。於是暴雪使用了VarInt,它的特點是佔用的空間跟數字大小有關,數字越大,佔用空間越多。比如對於127以內的數字,它只需要1個位元組;對於2的14次方以內的數字,它只需要2個位元組;對於2的32次方這個值,它需要5個位元組,沒錯,比int還要多1個位元組。
綜上,神秘程式碼就是按照上面介紹的順序,羅列出一堆數字來表示一個卡組,例如:
0(預留) 1(版本) 2(標準) 1(英雄數量) 274(德魯伊英雄ID) 2(嗯,這個卡組裡有2張牌只出現了1次) 42656(傳播瘟疫的ID) 42759(終極賴皮ID) 14(還有14張卡出現了2次) 742(野蠻咆哮ID) ...(此處省略13張卡) 0(沒有任何一張卡出現3次)
然後將這些數字轉換成VarInt,連續地放到一個位元組陣列中。然後對這個位元組陣列進行Base64編碼,得到一串神秘程式碼。
參考文件: https://hearthsim.info/docs/deckstrings/
卡牌ID可以在這裡查: https://hearthstonejson.com/
回覆列表
這裡企鵝,從南極第一線為你解答
早在兩年以前,爐石傳說上線了全新的卡組程式碼。從那時起,爐石玩家便有了一個極其方便的分享卡組的方法。當然,卡組程式碼方便我們的同時,也有很多人好奇,卡組程式碼是如何生成並且準確識別的。由於其中涉及複雜的計算機知識,所以企鵝會盡量通俗的解釋一下,卡組程式碼蘊含的意義。
程式碼原理首先,你需要理解最關鍵的兩點,爐石傳說的程式碼在計算機程式設計的角度來說,屬於Base64程式碼,這個程式碼有一個最為明顯的特徵,即你複製的程式碼中,以=或者==作為結尾,代表這個程式碼的結束。
另外一點則是作為識別符號的DBF ID,這個你可以理解為,爐石傳說中的獨有表示系統。簡單的解釋來說,就是每一張卡牌都被這個ID按順序進行了標記,早在爐石傳說開發之初就已經有了這個標記方式,只不過在爐石傳說上線卡組程式碼的系統時,這些ID就被官方開源了,才被眾人所知曉。其實如果你有一定的計算機基礎,挖掘爐石傳說的原始檔時,你就可以發現這些程式碼了。正是因為有順序的標記,才讓爐石傳說每一張卡牌都有準確的描述以及配圖,所以你可以看到如果不人為修改的話,爐石傳說是不會有卡牌描述上面的錯亂的。
說完這兩個關鍵點,我們深入程式碼來了解一下具體含義。
程式碼含義透過上文的解釋,我們得知了兩個資訊:程式碼是被獨立出來進行識別的,每一張卡牌都有對應的ID便於區分。
所以,企鵝再從大家可以理解的角度,解讀一下其中部分程式碼的含義。
首先是開頭部分,前四個字母代表了這套卡組所屬的模式,即AAEC為標準卡組,AAEB為狂野卡組。這個是單純從表面可以看出來的。
至於後面的一大串,當然是具體的卡牌了。不過為了簡化以便於處理,這裡的程式碼是經過base64程式碼進行二次轉換過的。換句話說,如果你想看到其中的具體ID的話,你可以下載一個base64程式碼的轉換工具(或者叫解碼工具)把卡組程式碼放進去,這樣你就可以看見具體的程式碼了。
當然,企鵝在上面說了,這是進行二次轉換的程式碼。如果再詳細的想知道卡牌的ID,這裡就涉及一個新的varint程式碼了。這個程式碼並不是屬於加密那種的程式碼,而是對卡組進行更為詳細的區分,舉個例子,相同名稱的卡牌使用了多少張,你選用的職業是誰,這個版本的版本號,以及所屬的模式(上文說的標準或者狂野模式就是用這個程式碼區分的)等等。這些是卡組程式碼必須要有的內容,否則系統會不予識別。
總結所以,企鵝在這裡再次總結一下上文所說的關鍵點。
一個卡組程式碼裡面包含三個要素:base64程式碼,用於獨立以及加密。varint程式碼,用於卡組的識別以及分類。DBF ID,用於標記每一張卡牌。
透過這三個要素,遊戲才能識別這個程式碼屬於哪個職業,哪個模式以及用了多少張什麼卡牌。因此,卡組程式碼中的每一個字元都是不可或缺的,正是工程師的智慧和努力,才能讓每一套卡組有了自己的名字和意義,讓每個玩家都有機會分享自己的成果。