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>&nbsp;</td>"

            jingYing += "<td>&nbsp;</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;

                            };

                            ……

                   };

            };

       20012002是宝箱的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是掉落idKEY_TREASURE_IDKEY_PROBABILITY都是一个数字数组,前者对应装备和物品的id,后者对应掉落几率。

                   "KEY_TREASURE_ID"= (

                            12281,

                            22281,

                            32281,

                            42281,

                            52281,

                            62281,

                            ……

                   );

                   "KEY_PROBABILITY"= (

                            0,

                            133,

                            266,

                            399,

                            532,

                            665,

                            ……

                   );

不考虑被……省略的内容,1228162281的掉落计算大概如下:

在闭区间[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来获取或指定其对应的掉落物品列表,但这需要界面的配合,以后会完善的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值