本文主要是介绍00002 贪婪洞窟.003.6:怪物、宝箱和掉落,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
00002 贪婪洞窟.003.6:怪物、宝箱和掉落
怪物的定义在monstersAttribute_X.plist中,各个字段都很容易理解。唯一要说明的是那些攻防属性,它们都是拥有2个元素的数组。元素0用于普通怪,元素1用于精英怪。
整理怪物为HTML表格的Swift代码如下:
let version = "贪婪洞窟(v1.5.0)"
let monstersAttribute_1:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/monstersAttribute_1.plist")
let monstersAttribute_2:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/monstersAttribute_2.plist")
let monstersAttribute_3:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/monstersAttribute_3.plist")
let names:NSDictionary? =NSDictionary(contentsOfFile:"/Users/x/\(version) /LocalString_zh.plist")
func stringValue(value:String?)->String
{
if value==nil
{
return ""
}
else
{
return value!
}
}
func getName(id:String)->String
{
return stringValue(names!.valueForKeyPath("\(id)") as? String)
}
let properties = ["level","hp","defence","atk_min","atk_max","exp","coin",
"atk_fire","atk_water","atk_wood","atk_light","atk_dark",
"def_fire","def_water","def_wood","def_light","def_dark"]
func generatePropertiesHeader()->String
{
var header = ""
for i inproperties
{
header += "<td>\(i)(普通)</td>"
}
for i inproperties
{
header += "<td>\(i)(精英)</td>"
}
return header
}
var result = "<tableborder='1'>"
result += "<tr><td>id</td><td>名称</td><td>弱点</td><td>攻速</td><td>描述</td>\(generatePropertiesHeader())</tr>"
func generateProperties(monstersAttribute: NSDictionary, key:String)->String
{
var puTong = ""
var jingYing = ""
for i inproperties
{
let v = monstersAttribute.valueForKeyPath("\(key).\(i)")
if v == nil
{
puTong += "<td> </td>"
jingYing += "<td> </td>"
}
else
{
let values = v as! [String]
puTong += "<td>\(values[0])</td>"
jingYing += "<td>\(values[1])</td>"
}
}
return puTong + jingYing
}
func generateListItem(monstersAttribute: NSDictionary, key:String)->String
{
let name = getName(monstersAttribute.valueForKeyPath("\(key).name") as! String)
let weakpoint = monstersAttribute.valueForKeyPath("\(key).weakpoint") as! String
let speed = monstersAttribute.valueForKeyPath("\(key).speed") as! String
let des = getName(monstersAttribute.valueForKeyPath("\(key).des1") as! String)
return "<tr><td>\(key)</td><td>\(name)</td><td>\(weakpoint)</td><td>\(speed)</td><td>\(des)</td>\(generateProperties(monstersAttribute, key: key))</tr>"
}
func generateList(monstersAttribute: NSDictionary)->String
{
let allKeys = monstersAttribute.allKeys.sort({ (t1, t2) -> Bool in
return NSInteger.init(t1 as! String)! < NSInteger.init(t2 as! String)! ? true:false
})
var list = ""
for key in allKeys
{
list +=generateListItem(monstersAttribute, key: key as! String)
}
return list + "<tr><td colspan='\(5+properties.count*2)'><hr/><hr /><hr /></td></tr>"
}
result +=generateList(monstersAttribute_1!)
result +=generateList(monstersAttribute_2!)
result +=generateList(monstersAttribute_3!)
result += "</table>"
print(result)
在monstersAttribute_X.plist中,没有掉落配置,这难免让人觉得奇怪。
其实用到掉落的地方有不少,怪物有、宝箱有、罐子也有,只要是按几率给予玩家物品的地方,都可以用到掉落。开发者将掉落集合到了一个文件中,按照地牢层进行配置,这个文件就是treasureAttribute_X.plist。
对于每一层,有4种类别的掉落,分别是怪物、墙壁、钱袋子和宝箱:
11 = {
"KEY_MONSTERS" = { …… };
"KEY_WALL" = { …… };
"KEY_COIN_BAG" = { …… };
"KEY_BOXES" = { …… };
};
钱袋子必然掉落金币,也只掉落金币,而不是各种几率下的物品。因此,它的配置比较简单:
"KEY_COIN_BAG"= {
"KEY_COIN_MIN"= 6;
"KEY_COIN_MAX"= 10;
};
只是掉落金币的最大最小范围罢了。
墙壁是什么东西一时没想出来:
"KEY_WALL"= {
"KEY_PROBABILITY_PLIST_ID"= 81002;
};
81002对应的具体掉落物品为(掉落信息在下面会具体讲):
弱效生命药剂:100 |
弱效魔法药剂:100 |
铁镐:100 |
灵视卷轴:100 |
小牙齿:100 |
恶魔粑粑:100 |
蝙蝠翅膀:100 |
灰烬:100 |
石块:100 |
破口袋:100 |
宝箱和怪物都有很多种。它们的掉落配置是按照种类来的。
"KEY_BOXES"= {
2001= {
"KEY_PROBABILITY_PLIST_ID"= 13002;
"KEY_IMG_ID"= 1;
};
2002= {
"KEY_PROBABILITY_PLIST_ID"= 14002;
"KEY_IMG_ID"= 2;
};
……
};
};
2001、2002是宝箱的id,具体对应什么宝箱可参考前面的文章。
KEY_PROBABILITY_PLIST_ID指定的便是掉落id,该id必须在prizePoolAttribute.plist中存在。
KEY_IMG_ID的作用未知。
怪物的掉落配置和宝箱类似,只不过它有两个掉率选项。
"KEY_MONSTERS"= {
1005= {
"KEY_PROBABILITY_PLIST_ID"= (
41005,
71003,
);
};
1006= {
"KEY_PROBABILITY_PLIST_ID"= (
41006,
71003,
);
};
……
};
机灵点的大概已经想到怪物为啥有两个掉率选项了。不错,正和怪物的属性一样,一个用于是普通怪,一个用于精英怪。
下面需要说说prizePoolAttribute.plist。
它的格式并不复杂:
310011= {
"KEY_TREASURE_ID"= ( …… );
"KEY_PROBABILITY"= (…… );
};
310011是掉落id,KEY_TREASURE_ID和KEY_PROBABILITY都是一个数字数组,前者对应装备和物品的id,后者对应掉落几率。
"KEY_TREASURE_ID"= (
12281,
22281,
32281,
42281,
52281,
62281,
……
);
"KEY_PROBABILITY"= (
0,
133,
266,
399,
532,
665,
……
);
不考虑被……省略的内容,12281-62281的掉落计算大概如下:
在闭区间[0, 665]中生成一个随机数,如果落在:
l [0,133):掉落12281
l [133,266):掉落22281
l ……
l [665,665]:掉落62281
好吧,最后一个看起来很不协调,也许后面的665应当加上一个值。不过这怎么弄都是猜测,我就不说了。
下面给出根据掉落id返回掉落物品列表的Swift代码:
let version = "贪婪洞窟(v1.5.0)"
let prizePoolAttribute:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/prizePoolAttribute.plist")
let equipmentAttribute:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/equipmentAttribute.plist")
let itemsAttribute:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version)/itemsAttribute.plist")
let names:NSDictionary? = NSDictionary(contentsOfFile:"/Users/x/\(version) /LocalString_zh.plist")
func stringValue(value:String?)->String
{
if value==nil
{
return ""
}
else
{
return value!
}
}
func getName(id:String)->String
{
return stringValue(names!.valueForKeyPath("\(id)") as? String)
}
func getDropEIName(id:String)->String
{
let v = equipmentAttribute!.valueForKeyPath("\(id).name")
if v != nil
{
var rare:String = ""
switch (equipmentAttribute!.valueForKeyPath("\(id).rare") as! NSString).integerValue
{
case 1:rare = "白色"
case 2:rare = "蓝色"
case 3:rare = "金色"
case 4:rare = "暗金"
default://rare = "套装"
rare = getName(equipmentAttribute!.valueForKeyPath("\(id).suit_des") as! String)
}
return getName(v as! String)+"(\(rare))"
}
let v2 = itemsAttribute!.valueForKeyPath("\(id).name")
if v2 != nil
{
return getName(v2 as! String)
}
return ""
}
func getDrops(id:String)->String
{
let v = prizePoolAttribute!.valueForKeyPath("\(id).KEY_TREASURE_ID")
if v == nil
{
return ""
}
var probabilities:[Int] = []
for i in prizePoolAttribute!.valueForKeyPath("\(id).KEY_PROBABILITY") as! [String]
{
probabilities.append(Int.init(i, radix: 10)!)
}
var drops = ""
let items = v as! [String]
for i in 0...items.count-1
{
var probability = ""
if i == items.count-1
{
probability = String(probabilities[i] - probabilities[i-1])
}
else
{
probability = String(probabilities[i+1] - probabilities[i])
}
drops += getDropEIName(items[i]) + ":\(probability)\n"
}
return drops
}
上面的那个81002对应的掉落物品列表就是用这段代码生成的:
弱效生命药剂:100 |
弱效魔法药剂:100 |
铁镐:100 |
灵视卷轴:100 |
小牙齿:100 |
恶魔粑粑:100 |
蝙蝠翅膀:100 |
灰烬:100 |
石块:100 |
破口袋:100 |
装备和物品名称后面的数字并非prizePoolAttribute.plist中的原始数值,而是按照个人的理解进行了一定的计算。计算方法:
第n个物品的掉落数值=第n+1个物品的原始掉落数值-第n个物品的原始掉落数值
如果是最后一个物品,其掉落数值和前面一个(倒数第二个)相同。
代码本身有点瑕疵,也不够完善,应当能够根据怪物、宝箱的id来获取或指定其对应的掉落物品列表,但这需要界面的配合,以后会完善的。
这篇关于00002 贪婪洞窟.003.6:怪物、宝箱和掉落的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!