User:在咕咕咕的咕子/世界地图格式:修订间差异

来自Arcaea中文维基
无编辑摘要
无编辑摘要
 
第2行: 第2行:
{{DISPLAYTITLE:世界地图格式}}
{{DISPLAYTITLE:世界地图格式}}
__NOINDEX__
__NOINDEX__
__HIDDENCAT__
*'''本页保持孤立!'''
*'''本页保持孤立!'''


==阅前提示==
==阅前提示==
*此处详细解析的是在服务端处存储的地图中的各语句。
*此处详细解析的是在服务端处存储的地图中的各语句。
*地图使用的是较为严格的json格式,请注意是否有没有漏符号或多出符号
*地图使用的是较为严格的json格式,请注意是否有没有漏符号或多出符号
*地图文件理应当被存放在对应服务器的地图文件夹内
*地图文件理应当被存放在对应服务器的地图文件夹内


==详细解析==
==详细解析==
  此处的是 普通地图:
 普通地图:
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
{
{
    "map_id": "example",
    "map_id": "example",
    //地图ID string 必需字段
    //地图ID str 必需字段
    // 如果需正 使用该 地图 配置,请确保 文件名 和map_id 相同
    // 保输入的map_id与所对应的 地图文件名相同
     
     
    "is_legacy": false,
    "is_legacy": false,
    //是否启用Legacy地图机制 boolean
    //是否启用Legacy地图机制 bool
    //于1.7.0新增
    //于1.7.0新增
   
   "is_repeatable": true,
   //是否启用无限地图机制 bool
     
     
    "is_beyond": false,
    "is_beyond": false,
    //是否启用Beyond地图机制 boolean
    //是否启用Beyond地图机制 bool
    //于3.0.0新增
    //于3.0.0新增
     
     
    "beyond_health": 100,
    "beyond_health": 100,
    //Beyond地图的总百分比 int is_beyond为true时的必需字段
    //Beyond 地图/Breach 地图的总百分比 int
   //与is_beyond语句相连,只有前置语句启用时才能发挥作用
    //于3.0.0新增
    //于3.0.0新增
     
     
    "character_affinity": [
    "character_affinity": [
    ],
    ],
    //Beyond地图的相性契合搭档 list [int] is_beyond为true时的必需字段
    //Beyond地图的相性契合搭档 [int, ...]
   //与is_beyond语句和affinity_multiplier语句相连,只有前置语句启用或填写完数据才能完整使用
   //与affinity_multiplier的应用关系为前后照应(如果此处第一个填写为0,那么affinity_multiplier的第一个浮点数就应用到0上)
   //例:[0, 1] [0]
    //于3.0.0新增
    //于3.0.0新增
     
     
    "affinity_multiplier": [
    "affinity_multiplier": [
    ],
    ],
    //Beyond地图的相性契合加成 list [float] is_beyond为true时的必需字段
    //Beyond地图的相性契合加成 [float, ...]
   //与is_beyond语句和character_affinity语句相连,只有前置语句启用或填写完数据才能完整使用
   //与character_affinity的应用关系是前后照应
   //例:[1.0, 1.5] [1.0]
    //于3.0.0新增
    //于3.0.0新增
  
   //character_affinity与affinity_multiplier的照应关系为:
   //设character_affinity为[0, 1],character_affinity为[1.0, 1.5]
   //那么该地图的相性契合信息为:{0: 1.0, 1: 1.5}
  
   "is_breached": false,
   //是否启用Breach地图机制 bool
   //于5.3.0新增
  
   "disable_over": false,
   //是否禁止Overdrive参与PROG计算 bool
   //于5.3.0新增
  
   "new_law": "",
   //Breach地图的法则 str
   //于5.3.0新增
  
   //法则类型(5.3.0):
   //over100_step50 PROG = OVER + STEP/2
   //frag50 PROG x= FRAG
   //lowlevel PROG x= max(1.0, 2.0 - 0.1 x LEVEL)
   //antiheroism PROG = OVER - ||OVER-FRAG|-|OVER-STEP||
     
     
    "chapter": 0,
    "chapter": 0,
    //地图章节 int 必需字段
    //地图章节 int 必需字段
   //可以填写客户端内无对应章节的数(同等于不显示)
     
     
    // 地图 章节 (4.4.4)
    // 特殊类 章节:
    //0 活动 Event
    //0 活动 Event
   //1 失落的世界 Lost World
   //2 谜域的界外 Outer Reaches
   //3 聚合的塔尖 Spire of Convergence
   //4 沉眠的回声 Dormant Echoes
   //5 无央的决裂 Boundless Divide
   //6 遗忘的构念 Forgotten Construct
   //7 回首的天际 Horizon of Anamnesis
    //1001 Beyond
    //1001 Beyond
  
   //普通章节:以1开始为第一章
   //Breach章节:以2001开始为第一章
     
     
    "available_from": -1,
    "available_from": -1,
    //从X时开始可用 int 必需字段
    //从X时开始可用 int 必需字段
    // 与available_to语句相连,只有前置语句 写完数据才能完整使用
    //填 写10 位/16 位时间戳,-1表示一直可用
   //填写十 位/ 十六 位时间戳,-1表示一直可用
   //游戏内实际显示于Event限时时间内,未到指定可用时间会显示"准备中(Preparing)"
    //于1.5.2新增
    //于1.5.2新增
     
     
    "available_to": -1,
    "available_to": -1,
    // 从X时持续到X 时后关闭 int 必需字段
    // 经过X 时后关闭 int 必需字段
   //与available_from语句相连,只有前置语句填写完数据才能完整使用
    //填写10位/16位时间戳,-1表示一直不关闭
    //填写10位/16位时间戳,-1表示一直不关闭
   //游戏内实际显示于Event限时时间内,到达指定关闭时间会显示"已结束(Ended)"
    //于1.5.2新增
    //于1.5.2新增
   
   "is_repeatable": true,
   //是否启用无限地图机制 boolean 必需字段
    
    
    "require_type": "",
    "require_type": "",
    //解锁时所需物品的类型 string
    //解锁时所需物品的类型 str
   //与require_id语句或require_value语句相连,只有本语句填写到指定数据后,填写对应前置语句后才能完整使用
   //也与requires语句相连,只有前置语句关闭时才能发挥作用
       
       
    //解锁类型 (4.4.4 ):
    //解锁类型 (5.3.0 ):
    //pack 曲包(配合require_id使用)
    //pack 曲包(配合require_id使用)
    //character 角色(616没用过,配合require_id使用)
    //character 角色(616没用过,配合require_id使用)
第90行: 第95行:
    //chart_unlock 解锁谱面(配合require_id使用,格式为[SongID]+[ratingClass])
    //chart_unlock 解锁谱面(配合require_id使用,格式为[SongID]+[ratingClass])
    //chapter_step 章节步数(配合require_value使用)
    //chapter_step 章节步数(配合require_value使用)
   //chapter_maps 完成地图(配合require_value使用,目前只出现在Beyond背景地图中)
     
     
    "require_id": "",
    "require_id": "",
    //解锁时需要开启的对应物品ID string/list [string]
    //解锁时需要开启的对应物品ID str/[str, ...]
    // 与require_type语句相连,只有前置语句填写到指定数据后才能发挥作用
    //[str, ...]形式于3.10.0新增,后续在4.2.0添加普通地图的显示
   //也与requires语句相连,只有前置语句关闭时才能发挥作用
   //list [string]形式于3.10.0新增,后续在4.2.0添加普通地图的显示
     
     
    "require_value": 0,
    "require_value": 0,
    //解锁时需要花费的对应物品的数量 int
    //解锁时需要花费的对应物品的数量 int
    //与require_type语句相连,只有前置语句填写到指定数据后才能发挥作用
    //与require_type语句相连,只有前置语句填写到指定数据后才能发挥作用
    //也与requires语句相连,只有前置语句 关闭 时才能发挥作用
    //也与requires语句相连,只有前置语句 不存在 时才能发挥作用
     
     
    "requires": [
    "requires": [
第106行: 第110行:
}
}
],
],
    //解锁时所需的多个物品 list [{string: string/int}]
    //解锁时所需的多个物品 [{str: 'str | int', ...}, ...]
    //可填 写type/id/value, 分别对应 述三条语句
    //dict中 可填 入type/id/value 三个键 值类型与 述require前缀相同
    // 如果返回的地图数据存在本 语句 ,客户端会 优先 使用,其单独的三条语句不使用
    // 语句 的解锁条件 优先 于require_type/id/value
    //于4.2.0新增
    //于4.2.0新增
    //例:
    // 使用 例:
    //"requires": [
    //"requires": [
//   {
//   {
第120行: 第124行:
     
     
    "require_localunlock_songid": "",
    "require_localunlock_songid": "",
    //需要本地解锁XXX歌曲的任意难度 string
    //需要本地解锁XXX歌曲的任意难度 str
    //填写指定歌曲ID,用来判断本地是否解锁了指定歌曲的任意难度
    //填写指定歌曲ID,用来判断本地是否解锁了指定歌曲的任意难度
    //判断解锁方式:寻找本地"un"文件中[SongID]|[ratingClass]|[UnlockType]所有的解锁条件,如果其中一条"complete"被设为成功值,则解锁
    //判断解锁方式:寻找本地"un"文件中[SongID]|[ratingClass]|[UnlockType]所有的解锁条件,如果其中一条"complete"被设为成功值,则解锁
第126行: 第130行:
     
     
    "require_localunlock_challengeid": "",
    "require_localunlock_challengeid": "",
    //需要本地通过XXX异象 string
    //需要本地通过XXX异象 str
    //填写指定异象ID,用来判断本地是否通过了指定歌曲的异象
    //填写指定异象ID,用来判断本地是否通过了指定歌曲的异象
    //判断解锁方式:寻找本地"un"文件中[AnomalyID]_challenge|0|102解锁条件,如果"complete"被设定为0或不存在,默认不解锁
    //判断解锁方式:寻找本地"un"文件中[AnomalyID]_challenge|0|102解锁条件,如果"complete"被设定为0或不存在,默认不解锁
   //对于616而言,AnomalyID通常会被设定为对应的SongID
    //于1.6.0新增
    //于1.6.0新增
     
     
    "coordinate": "0,0",
    "coordinate": "0,0",
    //地图在对应章节应用的X/Y坐标 string 必需字段
    //地图在对应章节应用的X/Y坐标 str 必需字段
    //前者代表X,后者代表Y
    //前者代表X,后者代表Y
    //X为正数时向右,为负数时向左
    //X为正数时向右,为负数时向左
第140行: 第143行:
    "step_count": 22,
    "step_count": 22,
    //地图总步数 int 必需字段
    //地图总步数 int 必需字段
   //如要正确填写,按照0~X的方式排列每个position,将最后的position中的int+1
     
     
    "custom_bg": "",
    "custom_bg": "",
    //地图所使用的背景 string
    //地图所使用的背景 str
   //与is_beyond语句相连,只有在前置语句关闭时才能发挥作用
    //如果不填写,则默认使用章节背景
    //如果不填写,则默认使用章节背景
    //填写后,游戏会自动查找位于img/world中的[ 对应string].jpg
    //填写后,游戏会自动查找位于img/world中的[value].jpg
    //于1.8.3新增
    //于1.8.3新增
     
     
第153行: 第154行:
    //也会影响Play+的体力消耗
    //也会影响Play+的体力消耗
     
     
    "chain_info": "",
    "chain_info": {},
    //??? dictionary?
    // 用来声明该地图所在的Chain {str: 'str | int', ...}
    // 未知 客户端处理时疑似可处理"id"与"index"
    // 可以填入id与index两个键 值类型分别为str与int
   //id 为所在Chain,index为解锁顺序(从1开始)
     
     
    "curr_position": 0,
    "curr_position": 0,
    "curr_capture": 0,
    "curr_capture": 0,
    "is_locked": false,
    "is_locked": false,
    // 此三个语句无论如何填写都不会影响地图,但需要保留
    // 没用
     
     
    "steps": [
    "steps": [
    //该地图的台阶设置 list 必需字段
    //该地图的台阶设置 [dict, ...] 必需字段
{
{
"position": 0,
"position": 0,
第176行: 第178行:
"capture": 5,
"capture": 5,
"items": [{}]
"items": [{}]
//奖励 list [{string: string/int}]
//奖励 [{str: 'str | int', ...}]
//此处为空,直接删除也可达成同效果
//此处为空,直接删除也可达成同效果
},
},
第187行: 第189行:
"id": "0"
"id": "0"
//角色
//角色
//type-string id-string
//type: str, id: str
//id对应CharacterID
//id对应CharacterID
//于1.5.0新增
}
}
]
]
第201行: 第202行:
"id": "shadesoflight"
"id": "shadesoflight"
//世界解锁类型的歌曲/难度
//世界解锁类型的歌曲/难度
//type-string id-string
//type: str, id: str
//id对应SongID
//id对应SongID
//如需解锁难度,在SongID末尾添加对应ratingClass数字即可
//如需解锁难度,在SongID末尾添加对应ratingClass数字即可
//于1.5.0新增
}
}
]
]
第216行: 第216行:
"id": "auxesia"
"id": "auxesia"
//单曲
//单曲
//type-string id-string
//type: str, id: str
//id对应SongID
//id对应SongID
}
}
第229行: 第229行:
"amount": 616
"amount": 616
//残片
//残片
//type-string amount-int
//type: str, amount: int
//于1.5.0新增(也许)
}
}
]
]
第242行: 第241行:
"amount": 616
"amount": 616
//记忆源点
//记忆源点
//type-string amount-int
//type: str, amount: int
//616没用过,但存在
//616没用过,但存在
}
}
第256行: 第255行:
"amount": 1
"amount": 1
//核心
//核心
//type-string id-string amount-int
//type: str, id: str, amount: int
//id对应CoreID
//id对应CoreID
//于2.0.0新增
       
       
//核心种类 (4.4.4 ):
//核心种类 (5.2.6 ):
//core_generic 以太之滴 Ether Drop
//core_generic 以太之滴 Ether Drop
//core_hollow 中空核心 Hollow Core
//core_hollow 中空核心 Hollow Core
第272行: 第270行:
//core_colorful 缤纷核心 Colorful Core
//core_colorful 缤纷核心 Colorful Core
//core_umbral 暗影核心 Umbral Core
//core_umbral 暗影核心 Umbral Core
//core_sunset 暮色核心 Sunset Core
//core_course_skip_purchase 次元结晶 Warped Shard
//core_course_skip_purchase 次元结晶 Warped Shard
}
}
第284行: 第283行:
"id": "base"
"id": "base"
//曲包
//曲包
//type-string id-string
//type: str, id: str
//id对应PackID
//id对应PackID
//NS端专属,在移动端也存在,但使用移动端显示时会崩溃
//NS端专属,在移动端也存在,但使用移动端显示时会崩溃
第298行: 第297行:
"id": "scenery_chap1"
"id": "scenery_chap1"
//世界解锁相关
//世界解锁相关
//type-string id-string
//type: str, id: str
//目前只能添加背景
//目前只能添加背景
//于3.0.0新增
//于3.0.0新增
第310行: 第309行:
//scenery_chap6 遗忘的构念 Forgotten Construct
//scenery_chap6 遗忘的构念 Forgotten Construct
//scenery_chap7 回首的天际 Horizon of Anamnesis
//scenery_chap7 回首的天际 Horizon of Anamnesis
//scenery_beyond Beyond Beyond
}
}
]
]
第321行: 第321行:
"amount": 1
"amount": 1
//五周年兑换券
//五周年兑换券
//type-string amount-int
//type: str, amount: int
//有点猜的成分,没有测试,但应该正确
//于3.12.2新增
//于3.12.2新增
}
}
第333行: 第332行:
"restrict_type": "song_id"
"restrict_type": "song_id"
//限制游玩指定曲目
//限制游玩指定曲目
//restrict_id-string restrict_type-string
//restrict_id: str, restrict_type: str
//restrict_id对应SongID
//restrict_id对应SongID
},
},
第345行: 第344行:
"restrict_type": "song_id"
"restrict_type": "song_id"
//限制游玩指定的多首曲目
//限制游玩指定的多首曲目
//restrict_ids-list [string] restrict_type-string
//restrict_ids: [str, ...], restrict_type: str
//restrict_ids对应SongID
//restrict_ids对应SongID
},
},
第354行: 第353行:
"restrict_type": "pack_id"
"restrict_type": "pack_id"
//限制游玩指定曲包
//限制游玩指定曲包
//restrict_id-string restrict_type-string
//restrict_id: str, restrict_type: str
//restrict_id对应PackID
//restrict_id对应PackID
},
},
第362行: 第361行:
"restrict_difficulty": 2
"restrict_difficulty": 2
//限制游玩指定难度
//限制游玩指定难度
//restrict_difficulty-int
//restrict_difficulty: int
//restrict_difficulty对应ratingClass
//restrict_difficulty对应ratingClass
//与restrict_id/ids语句和restrict_type语句相连,只有前置语句存在才能发挥作用
//于3.10.0新增
//于3.10.0新增
},
},
第374行: 第372行:
]
]
//随机曲目
//随机曲目
//step_type-list [string]
//step_type: [str, ...]
//曲目列表会显示特殊曲目(ID:random),并且只有ratingClass:0/1/2
//曲目列表会显示特殊曲目(ID:random)
//如果同restrict_difficulty使用,并且该语句的值大于2,锁定难度时默认为2
//于1.7.0新增
},
},
{
{
第387行: 第383行:
"speed_limit_value": 65
"speed_limit_value": 65
//流速限制
//流速限制
//step_type-list [string] speed_limit_value-int
//step_type: [str, ...], speed_limit_value: int
//speed_limit_value为对应流速x10后的数字
//speed_limit_value为对应流速x10后的数字
//于1.7.2新增
},
},
{
{
第399行: 第394行:
"plus_stamina_value": 12
"plus_stamina_value": 12
//体力奖励
//体力奖励
//step_type-list [string] plus_stamina_value-int
//step_type: [str, ...], plus_stamina_value: int
//plus_stamina_value对应增加体力
//plus_stamina_value对应增加体力
},
},
第468行: 第463行:
</syntaxhighlight>
</syntaxhighlight>


此处是Beyond 地图:
Beyond 地图 的台阶排列与普通地图不同
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
{
{
    "map_id": "example",
    "map_id": "example",
   "is_legacy": false,
    "is_beyond": true,
    "is_beyond": true,
    //是否启用Beyond地图机制 boolean
   //是否启用Beyond地图机制 bool
     
     
    "beyond_health": 150,
    "beyond_health": 150,
    //Beyond地图的总百分比 int
   //Beyond地图的总百分比 int
     
     
    "character_affinity": [0, 1],
    "character_affinity": [
    //Beyond地图的相性契合搭档 list [int]
0,
1
],
   //Beyond地图的相性契合搭档 [int, ...]
     
     
    "affinity_multiplier": [1.0, 1.5],
    "affinity_multiplier": [
    //Beyond地图的相性契合加成 list [float]
1.0,
1.5
],
   //Beyond地图的相性契合加成 [float, ...]
     
     
    "chapter": 1001,
    "chapter": 1001,
    //地图章节 int
   //地图章节 int
     
     
    "available_from": -1,
    "available_from": -1,
    "available_to": -1,
    "available_to": -1,
   "is_repeatable": false,
    "require_id": "shadesoflight2",
    "require_id": "shadesoflight2",
    //解锁时需要开启的对应物品ID string/list [string]
   //解锁时需要开启的对应物品ID str/[str, ...]
     
     
    "require_type": "chart_unlock",
    "require_type": "chart_unlock",
    //解锁时所需物品的类型 string/list [string]
   //解锁时所需物品的类型 str
   
 
   "require_value": 0,
    "coordinate": "0,0",
    "coordinate": "0,0",
    "step_count": 5,
    "step_count": 5,
    //地图总步数 int
   //地图总步数 int
   
    
    "custom_bg": "",
    "stamina_cost": 3,
    "stamina_cost": 3,
    //在该地图内游玩一次所需要的体力 int
   //在该地图内游玩一次所需要的体力 int
     
     
    "curr_position": 0,
    "curr_position": 0,
    "curr_capture": 0,
    "curr_capture": 0,
    "is_locked": false,
    "is_locked": false,
    "steps": [{
    "steps": [
   //使用正常地图语句,如要正确配置请从结 开始编辑
{
     "position": 0,
//使用正常地图语句,如要正确配置请从结 尾Step 开始编辑
     //最低点,用于标记开头
"position": 0,
//最低点,用于标记开头
      
      
     "capture": 50
"capture": 50
     //以beyond_health的值为被减数,与所有capture相加后的和相减,结果为0则配置成功
//以beyond_health的值为被减数,与所有capture相加后的和相减,结果为0则配置成功
     //或者确保全部capture的值相加起来等于beyond_health的值
//或者确保全部capture的值相加起来等于beyond_health的值
   }, {
},
     "position": 1,
{
     "capture": 25,
"position": 1,
     "items": [{"type": "fragment", "amount": 616}]
"capture": 25,
     //剩余点的计算原理与二点相同
"items": [
   }, {
{
     "position": 2,
"type": "fragment",
     //标记二点
"amount": 616
}
]
//剩余点的计算原理与二点相同
},
{
"position": 2,
//标记二点
      
      
     "capture": 25,
"capture": 25,
     //以capture的值为减数,与一点得出的百分比相减,得出本点百分比
//以capture的值为减数,与一点得出的百分比相减,得出本点百分比
     //一点从100%开始,相减后得到结果75,则本点从75%开始
//一点从100%开始,相减后得到结果75,则本点从75%开始
      
      
     "items": [{
"items": [
       "type": "core",
{
       "id": "core_generic",
"type": "core",
       "amount": 1
"id": "core_generic",
     }]
"amount": 1
     //奖励只会在本点开始时领取
}
   }, {
]
     "position": 3,
//奖励只会在本点开始时领取
     //标记一点
},
{
"position": 3,
//标记一点


     "capture": 50,
"capture": 50,
     //以capture的值为减数,将其与beyond_health的值相减,得出本点百分比
//以capture的值为减数,将其与beyond_health的值相减,得出本点百分比
     //此地图的beyond_health为150,相减后得到结果100,则本点从100%开始
//此地图的beyond_health为150,相减后得到结果100,则本点从100%开始
      
      
     "restrict_id": "shadesoflight",
"restrict_id": "shadesoflight",
     "restrict_type": "song_id"
"restrict_type": "song_id"
     //限制 条件等 会在到达下一点前一直有效
// 普通/特殊 限制 会在到达下一点前一直有效
  }, {
},
     "position": 4,
{
     //最高点,用于标记奖励
"position": 4,
//最高点,用于标记奖励
      
      
     "capture": 0,
"capture": 0,
     //确保capture为0
//确保capture为0
      
      
      "items": [{
"items": [
        "type": "world_song",
{
        "id": "shadesoflight3"
"type": "world_song",
      }]
"id": "shadesoflight3"
   }]
}
]
}
]
}
</syntaxhighlight>
 
Breached地图的台阶排列与普通地图不同:
<syntaxhighlight lang="json">
{
   "map_id": "example",
   "is_beyond": true,
   //是否启用Beyond地图机制 bool
   
   "beyond_health": 200,
   //Beyond地图/Breach地图的总百分比 int
   
   "character_affinity": [
   ],
   //Beyond地图的相性契合搭档 [int, ...]
   
   "affinity_multiplier": [
   ],
   //Beyond地图的相性契合加成 [float, ...]
  
   "is_breached": true,
   //是否启用Breach地图机制 bool
  
   "disable_over": true,
   //是否禁止Overdrive参与PROG计算 bool
  
   "new_law": "over100_step50",
   //Breach地图的法则 str
   
   "chapter": 2001,
   //地图章节 int 必需字段
   
   "available_from": -1,
   "available_to": -1,
   "require_type": "chart_unlock",
   //解锁时所需物品的类型 str
   
   "require_id": "inkarusi2",
   //解锁时需要开启的对应物品ID str/[str, ...]
   
   "coordinate": "0,0",
   "step_count": 6,
   //地图总步数 int 必需字段
   
   "stamina_cost": 3,
   //在该地图内游玩一次所需要的体力 int
   
   "curr_position": 0,
   "curr_capture": 0,
   "is_locked": false,
   "steps": [
     // 打印出每个点百分比的Python代码示例:
     // current_health = 0
     // steps = [dict, ...]  # 即为地图的steps
     // for step in steps:
     //   current_health += step['capture']
     //   print(f"Pos {step['position']}: {current_health}%")
     {
       "position": 0,
       //标记一点
      
       "capture": 50
       //以此点的百分比为减数,将其与下一点的百分比相减,得出capture的值
       //初始进度固定0%,设下一点的百分比为50%,相减后得50,即为capture的值
      },
     {
       "position": 1
       //标记二点
      
       "capture": 50,
       //以此点的百分比为减数,将其与下一点的百分比相减,得出capture的值
       //由一点的capture可知,一点的百分比与本点的百分比的差为50,则本点的百分比为50%
      
       "items": [
         {
           "type": "core",
           "id": "core_generic",
           "amount": 2
         }
       ]
//奖励只会在本点开始时领取
     },
     {
        "position": 2,
       //标记三点
      
       "capture": 50,
       //以此点的百分比为减数,将其与下一点的百分比相减,得出capture的值
       //由二点的capture可知,二点的百分比与本点的百分比的差为50,则本点的百分比为100%
      
       "items": [
         {
           "type": "fragment",
           "amount": 500
         }
       ],
       "restrict_ids": [
         "memoryfactory",
         "lumia",
         "pragmatism",
         "paradise",
         "flashback",
         "flyburg",
         "partyvinyl",
         "nirvluce",
         "blossoms",
         "romancewars",
         "moonheart",
         "syro",
         "nexttoyou",
         "memoryforest",
         "guardina",
         "inkarusi",
         "mazenine",
         "themessage",
         "sulfur",
         "etherstrike",
         "fractureray",
         "solitarydream"
       ],
       "restrict_type": "song_id",
       "restrict_difficulty": 2
//普通/特殊限制格会在到达下一点前一直有效
     },
     {
       "position": 4,
       "capture": 50,
        "items": [
         {
           "type": "core",
           "id": "core_generic",
           "amount": 2
         }
       ],
       "restrict_ids": [
         "memoryfactory",
         "lumia",
         "pragmatism",
         "paradise",
         "flashback",
         "flyburg",
         "partyvinyl",
         "nirvluce",
         "blossoms",
         "romancewars",
         "moonheart",
         "syro",
         "nexttoyou",
         "memoryforest",
         "guardina",
         "inkarusi",
         "mazenine",
         "themessage",
         "sulfur",
         "etherstrike",
         "fractureray",
         "solitarydream"
       ],
       "restrict_type": "song_id",
       "restrict_difficulty": 2
     },
      {
       "position": 5,
       //终点,用于标记奖励
      
       "capture": 0,
//确保capture为0
      
       "items": [
         {
           "type": "world_song",
           "id": "inkarusi3"
}
]
}
]
}
}
</syntaxhighlight>
</syntaxhighlight>

2024年5月9日 (四) 12:42的最新版本


  • 本页保持孤立!

阅前提示

  • 此处详细解析的是在服务端处存储的地图中的各语句。
  • 地图使用的是较为严格的json格式,请注意是否有没有漏符号或多出符号。
  • 地图文件理应当被存放在对应服务器的地图文件夹内。

详细解析

普通地图:

{
    "map_id": "example",
    //地图ID str 必需字段
    //请确保输入的map_id与所对应的地图文件名相同
      
    "is_legacy": false,
    //是否启用Legacy地图机制 bool
    //于1.7.0新增
      
    "is_repeatable": true,
    //是否启用无限地图机制 bool
      
    "is_beyond": false,
    //是否启用Beyond地图机制 bool
    //于3.0.0新增
      
    "beyond_health": 100,
    //Beyond地图/Breach地图的总百分比 int
    //于3.0.0新增
      
    "character_affinity": [
    ],
    //Beyond地图的相性契合搭档 [int, ...]
    //于3.0.0新增
      
    "affinity_multiplier": [
    ],
    //Beyond地图的相性契合加成 [float, ...]
    //于3.0.0新增
    
    //character_affinity与affinity_multiplier的照应关系为:
    //设character_affinity为[0, 1],character_affinity为[1.0, 1.5]
    //那么该地图的相性契合信息为:{0: 1.0, 1: 1.5}
    
    "is_breached": false,
    //是否启用Breach地图机制 bool
    //于5.3.0新增
    
    "disable_over": false,
    //是否禁止Overdrive参与PROG计算 bool
    //于5.3.0新增
    
    "new_law": "",
    //Breach地图的法则 str
    //于5.3.0新增
    
    //法则类型(5.3.0:
    //over100_step50 PROG = OVER + STEP/2
    //frag50 PROG x= FRAG
    //lowlevel PROG x= max(1.0, 2.0 - 0.1 x LEVEL)
    //antiheroism PROG = OVER - ||OVER-FRAG|-|OVER-STEP||
      
    "chapter": 0,
    //地图章节 int 必需字段
      
    //特殊类章节:
    //0 活动 Event
    //1001 Beyond
    
    //普通章节:以1开始为第一章
    //Breach章节:以2001开始为第一章
      
    "available_from": -1,
    //从X时开始可用 int 必需字段
    //填写10位/16位时间戳,-1表示一直可用
    //于1.5.2新增
      
    "available_to": -1,
    //经过X时后关闭 int 必需字段
    //填写10位/16位时间戳,-1表示一直不关闭
    //于1.5.2新增
    
    "require_type": "",
    //解锁时所需物品的类型 str
          
    //解锁类型(5.3.0):
    //pack 曲包(配合require_id使用)
    //character 角色(616没用过,配合require_id使用)
    //single 单曲(配合require_id使用)
    //fragment 残片(配合require_value使用)
    //chart_unlock 解锁谱面(配合require_id使用,格式为[SongID]+[ratingClass]
    //chapter_step 章节步数(配合require_value使用)
    //chapter_maps 完成地图(配合require_value使用,目前只出现在Beyond背景地图中)
      
    "require_id": "",
    //解锁时需要开启的对应物品ID str/[str, ...]
    //[str, ...]形式于3.10.0新增,后续在4.2.0添加普通地图的显示
      
    "require_value": 0,
    //解锁时需要花费的对应物品的数量 int
    //与require_type语句相连,只有前置语句填写到指定数据后才能发挥作用
    //也与requires语句相连,只有前置语句不存在时才能发挥作用
      
    "requires": [
		{
		}
	],
    //解锁时所需的多个物品 [{str: 'str | int', ...}, ...]
    //dict中可填入type/id/value三个键,值类型与上述require前缀相同
    //该语句的解锁条件优先于require_type/id/value
    //于4.2.0新增
    //使用例:
    //"requires": [
	//	  {
    //	    "type": "pack",
    //  	"id": "base",
    //      "value": 0
    //    }
    //]
      
    "require_localunlock_songid": "",
    //需要本地解锁XXX歌曲的任意难度 str
    //填写指定歌曲ID,用来判断本地是否解锁了指定歌曲的任意难度
    //判断解锁方式:寻找本地"un"文件中[SongID]|[ratingClass]|[UnlockType]所有的解锁条件,如果其中一条"complete"被设为成功值,则解锁
    //于1.5.0新增
      
    "require_localunlock_challengeid": "",
    //需要本地通过XXX异象 str
    //填写指定异象ID,用来判断本地是否通过了指定歌曲的异象
    //判断解锁方式:寻找本地"un"文件中[AnomalyID]_challenge|0|102解锁条件,如果"complete"被设定为0或不存在,默认不解锁
    //于1.6.0新增
      
    "coordinate": "0,0",
    //地图在对应章节应用的X/Y坐标 str 必需字段
    //前者代表X,后者代表Y
    //X为正数时向右,为负数时向左
    //Y为正数时向上,为负数时向下
      
    "step_count": 22,
    //地图总步数 int 必需字段
      
    "custom_bg": "",
    //地图所使用的背景 str
    //如果不填写,则默认使用章节背景
    //填写后,游戏会自动查找位于img/world中的[value].jpg
    //于1.8.3新增
      
    "stamina_cost": 2,
    //在该地图内游玩一次所需要的体力 int
    //也会影响Play+的体力消耗
      
    "chain_info": {},
    //用来声明该地图所在的Chain {str: 'str | int', ...}
    //可以填入id与index两个键,值类型分别为str与int
    //id为所在Chain,index为解锁顺序(从1开始)
      
    "curr_position": 0,
    "curr_capture": 0,
    "is_locked": false,
    //没用
      
    "steps": [
    //该地图的台阶设置 [dict, ...] 必需字段
		{
			"position": 0,
			//台阶的点位 int
			//可随意填写,设定为相同的值都可以正常读取
      
			"capture": 5
			//台阶的步数 int
		},
		{
			"position": 1,
			"capture": 5,
			"items": [{}]
			//奖励 [{str: 'str | int', ...}]
			//此处为空,直接删除也可达成同效果
		},
		{
			"position": 2,
			"capture": 5,
			"items": [
				{		
					"type": "character"
					"id": "0"
					//角色
					//type: str, id: str
					//id对应CharacterID
				}
			]
		},
		{
			"position": 3,
			"capture": 5,
			"items": [
				{
					"type": "world_song",
					"id": "shadesoflight"
					//世界解锁类型的歌曲/难度
					//type: str, id: str
					//id对应SongID
					//如需解锁难度,在SongID末尾添加对应ratingClass数字即可
				}
			]
		},
		{
			"position": 4,
			"capture": 5,
			"items": [
				{
					"type": "single",
					"id": "auxesia"
					//单曲
					//type: str, id: str
					//id对应SongID
				}
			]
		},
		{
			"position": 5,
			"capture": 5,
			"items": [
				{
					"type": "fragment",
					"amount": 616
					//残片
					//type: str, amount: int
				}
			]
		},
		{
			"position": 6,
			"capture": 5,
			"items": [
				{
					"type": "memory",
					"amount": 616
					//记忆源点
					//type: str, amount: int
					//616没用过,但存在
				}
			]
		},
		{
			"position": 7,
			"capture": 5,
			"items": [
				{
					"type": "core",
					"id": "core_generic",
					"amount": 1
					//核心
					//type: str, id: str, amount: int
					//id对应CoreID
          
					//核心种类(5.2.6):
					//core_generic 以太之滴 Ether Drop
					//core_hollow 中空核心 Hollow Core
					//core_desolate 荒芜核心 Desolate Core
					//core_chunithm CHUNITHM 核心 CHUNITHM Core
					//core_crimson 深红核心 Crimson Core
					//core_ambivalent 悖异核心 Ambivalent Core
					//core_scarlet 绯红核心 Scarlet Core
					//core_groove 音炫核心 Groove Core
					//core_binary 双生核心 Binary Core
					//core_colorful 缤纷核心 Colorful Core
					//core_umbral 暗影核心 Umbral Core
					//core_sunset 暮色核心 Sunset Core
					//core_course_skip_purchase 次元结晶 Warped Shard
				}
			]
		},
		{
			"position": 8,
			"capture": 5,
			"items": [
				{
					"type": "pack",
					"id": "base"
					//曲包
					//type: str, id: str
					//id对应PackID
					//NS端专属,在移动端也存在,但使用移动端显示时会崩溃
				}
			]
		},
		{
			"position": 9,
			"capture": 5,
			"items": [
				{
					"type": "world_unlock",
					"id": "scenery_chap1"
					//世界解锁相关
					//type: str, id: str
					//目前只能添加背景
					//于3.0.0新增
		
					//章节背景(4.4.4):
					//scenery_chap1 失落的世界 Lost World
					//scenery_chap2 谜域的界外 Outer Reaches
					//scenery_chap3 聚合的塔尖 Spire of Convergence
					//scenery_chap4 沉眠的回声 Dormant Echoes
					//scenery_chap5 无央的决裂 Boundless Divide
					//scenery_chap6 遗忘的构念 Forgotten Construct
					//scenery_chap7 回首的天际 Horizon of Anamnesis
					//scenery_beyond Beyond Beyond
				}
			]
		},
		{
			"position": 10,
			"capture": 5,
			"items": [
				{
					"type": "anni5tix",
					"amount": 1
					//五周年兑换券
					//type: str, amount: int
					//于3.12.2新增
				}
			]
		},
		{
			"position": 11,
			"capture": 5,
			"restrict_id": "shadesoflight",
			"restrict_type": "song_id"
			//限制游玩指定曲目
			//restrict_id: str, restrict_type: str
			//restrict_id对应SongID
		},
		{
			"position": 12,
			"capture": 5,
			"restrict_ids": [
				"shadesoflight",
				"sayonarahatsukoi"
			],
			"restrict_type": "song_id"
			//限制游玩指定的多首曲目
			//restrict_ids: [str, ...], restrict_type: str
			//restrict_ids对应SongID
		},
		{
			"position": 13,
			"capture": 5,
			"restrict_id": "base",
			"restrict_type": "pack_id"
			//限制游玩指定曲包
			//restrict_id: str, restrict_type: str
			//restrict_id对应PackID
		},
		{
			"position": 14,
			"capture": 5,
			"restrict_difficulty": 2
			//限制游玩指定难度
			//restrict_difficulty: int
			//restrict_difficulty对应ratingClass
			//于3.10.0新增
		},
		{
			"position": 15,
			"capture": 5,
			"step_type": [
				"randomsong"
			]
			//随机曲目
			//step_type: [str, ...]
			//曲目列表会显示特殊曲目(ID:random)
		},
		{
			"position": 16,
			"capture": 5,
			"step_type": [
				"speedlimit"
			],
			"speed_limit_value": 65
			//流速限制
			//step_type: [str, ...], speed_limit_value: int
			//speed_limit_value为对应流速x10后的数字
		},
		{
			"position": 17,
			"capture": 5,
			"step_type": [
				"plusstamina"
			],
			"plus_stamina_value": 12
			//体力奖励
			//step_type: [str, ...], plus_stamina_value: int
			//plus_stamina_value对应增加体力
		},
		{
			"position": 18,
			"capture": 5,
			"items": [
				{
					"type": "fragment",
					"amount": 616
				}, 
				{
					"type": "memory",
					"amount": 616
				}
			]
			//设置多个奖励
			//游戏内实际只显示第一个奖励
		},
		{
			"position": 19,
			"capture": 5,
			"restrict_id": "base",
			"restrict_type": "pack_id",
			"step_type": [
				"randomsong"
			]
			//限制曲包+随机曲目混搭
		},
		{
			"position": 20,
			"capture": 5,
			"restrict_ids": [
				"tempestissimo",
				"testify"
			],
			"restrict_type": "song_id",
			"step_type": [
				"randomsong",
				"plusstamina",
				"speedlimit"
			],
			"restrict_difficulty": 3,
			"plus_stamina_value": 2,
			"speed_limit_value": 25,
			"items": [
				{
					"type": "fragment",
					"amount": 2000
				}
			]
			//限制歌曲+限制难度+随机曲目+体力奖励+流速限制+残片奖励混搭
		},
		{
			"position": 21,
			"capture": 0,
			"items": [
				{
					"type": "core",
					"id": "core_generic",
					"amount": 5
					//最后一格请设置至少一个奖励
				}
			]
		}
	]
}

Beyond地图的台阶排列与普通地图不同:

{
    "map_id": "example",
    "is_beyond": true,
    //是否启用Beyond地图机制 bool
      
    "beyond_health": 150,
    //Beyond地图的总百分比 int
      
    "character_affinity": [
		0,
		1
	],
    //Beyond地图的相性契合搭档 [int, ...]
      
    "affinity_multiplier": [
		1.0,
		1.5
	],
    //Beyond地图的相性契合加成 [float, ...]
      
    "chapter": 1001,
    //地图章节 int
      
    "available_from": -1,
    "available_to": -1,
    "require_id": "shadesoflight2",
    //解锁时需要开启的对应物品ID str/[str, ...]
      
    "require_type": "chart_unlock",
    //解锁时所需物品的类型 str

    "coordinate": "0,0",
    "step_count": 5,
    //地图总步数 int
    
    "stamina_cost": 3,
    //在该地图内游玩一次所需要的体力 int
      
    "curr_position": 0,
    "curr_capture": 0,
    "is_locked": false,
    "steps": [
		{	
		//使用正常地图语句,如要正确配置请从结尾Step开始编辑
			"position": 0,
			//最低点,用于标记开头
        
			"capture": 50
			//以beyond_health的值为被减数,与所有capture相加后的和相减,结果为0则配置成功
			//或者确保全部capture的值相加起来等于beyond_health的值
		},
		{
			"position": 1,
			"capture": 25,
			"items": [
				{
					"type": "fragment",
					"amount": 616
				}
			]
			//剩余点的计算原理与二点相同
		},
		{
			"position": 2,
			//标记二点
        
			"capture": 25,
			//以capture的值为减数,与一点得出的百分比相减,得出本点百分比
			//一点从100%开始,相减后得到结果75,则本点从75%开始
        
			"items": [
				{
					"type": "core",
					"id": "core_generic",
					"amount": 1
				}
			]
			//奖励只会在本点开始时领取
		},
		{
			"position": 3,
			//标记一点

			"capture": 50,
			//以capture的值为减数,将其与beyond_health的值相减,得出本点百分比
			//此地图的beyond_health为150,相减后得到结果100,则本点从100%开始
        
			"restrict_id": "shadesoflight",
			"restrict_type": "song_id"
			//普通/特殊限制格会在到达下一点前一直有效
		},
		{
			"position": 4,
			//最高点,用于标记奖励
        
			"capture": 0,
			//确保capture0
        
			"items": [
				{
					"type": "world_song",
					"id": "shadesoflight3"
				}
			]
		}
	]
}

Breached地图的台阶排列与普通地图不同:

{
    "map_id": "example",
    "is_beyond": true,
    //是否启用Beyond地图机制 bool
      
    "beyond_health": 200,
    //Beyond地图/Breach地图的总百分比 int
      
    "character_affinity": [
    ],
    //Beyond地图的相性契合搭档 [int, ...]
      
    "affinity_multiplier": [
    ],
    //Beyond地图的相性契合加成 [float, ...]
    
    "is_breached": true,
    //是否启用Breach地图机制 bool
    
    "disable_over": true,
    //是否禁止Overdrive参与PROG计算 bool
    
    "new_law": "over100_step50",
    //Breach地图的法则 str
      
    "chapter": 2001,
    //地图章节 int 必需字段
      
    "available_from": -1,
    "available_to": -1,
    "require_type": "chart_unlock",
    //解锁时所需物品的类型 str
      
    "require_id": "inkarusi2",
    //解锁时需要开启的对应物品ID str/[str, ...]
      
    "coordinate": "0,0",
    "step_count": 6,
    //地图总步数 int 必需字段
      
    "stamina_cost": 3,
    //在该地图内游玩一次所需要的体力 int
      
    "curr_position": 0,
    "curr_capture": 0,
    "is_locked": false,
    "steps": [
        // 打印出每个点百分比的Python代码示例:
        // current_health = 0
        // steps = [dict, ...]  # 即为地图的steps
        // for step in steps:
        //     current_health += step['capture']
        //     print(f"Pos {step['position']}: {current_health}%")
        {
            "position": 0,
            //标记一点
            
            "capture": 50
            //以此点的百分比为减数,将其与下一点的百分比相减,得出capture的值
            //初始进度固定0%,设下一点的百分比为50%,相减后得50,即为capture的值
        },
        {
            "position": 1
            //标记二点
            
            "capture": 50,
            //以此点的百分比为减数,将其与下一点的百分比相减,得出capture的值
            //由一点的capture可知,一点的百分比与本点的百分比的差为50,则本点的百分比为50%
            
            "items": [
                {
                    "type": "core",
                    "id": "core_generic",
                    "amount": 2
                }
            ]
			//奖励只会在本点开始时领取
        },
        {
            "position": 2,
            //标记三点
            
            "capture": 50,
            //以此点的百分比为减数,将其与下一点的百分比相减,得出capture的值
            //由二点的capture可知,二点的百分比与本点的百分比的差为50,则本点的百分比为100%
            
            "items": [
                {
                    "type": "fragment",
                    "amount": 500
                }
            ],
            "restrict_ids": [
                "memoryfactory",
                "lumia",
                "pragmatism",
                "paradise",
                "flashback",
                "flyburg",
                "partyvinyl",
                "nirvluce",
                "blossoms",
                "romancewars",
                "moonheart",
                "syro",
                "nexttoyou",
                "memoryforest",
                "guardina",
                "inkarusi",
                "mazenine",
                "themessage",
                "sulfur",
                "etherstrike",
                "fractureray",
                "solitarydream"
            ],
            "restrict_type": "song_id",
            "restrict_difficulty": 2
			//普通/特殊限制格会在到达下一点前一直有效
        },
        {
            "position": 4,
            "capture": 50,
            "items": [
                {
                    "type": "core",
                    "id": "core_generic",
                    "amount": 2
                }
            ],
            "restrict_ids": [
                "memoryfactory",
                "lumia",
                "pragmatism",
                "paradise",
                "flashback",
                "flyburg",
                "partyvinyl",
                "nirvluce",
                "blossoms",
                "romancewars",
                "moonheart",
                "syro",
                "nexttoyou",
                "memoryforest",
                "guardina",
                "inkarusi",
                "mazenine",
                "themessage",
                "sulfur",
                "etherstrike",
                "fractureray",
                "solitarydream"
            ],
            "restrict_type": "song_id",
            "restrict_difficulty": 2
        },
        {
            "position": 5,
            //终点,用于标记奖励
            
            "capture": 0,
			//确保capture0
            
            "items": [
                {
                    "type": "world_song",
                    "id": "inkarusi3"
				}
			]
		}
	]
}