Browse Source

修订三维计算方式

tags/v8.0
枫谷剑仙 6 years ago
parent
commit
3e2e243add
6 changed files with 236 additions and 113 deletions
  1. +138
    -91
      monsters-info/extractByNode.js
  2. +1
    -1
      monsters-info/mon_en.json
  3. +1
    -1
      monsters-info/mon_ja.json
  4. +1
    -1
      monsters-info/mon_ko.json
  5. +86
    -16
      monsters-info/official-API/test-mon.html
  6. +9
    -3
      universal_function.js

+ 138
- 91
monsters-info/extractByNode.js View File

@@ -14,61 +14,97 @@ var officialAPI = [ //来源于官方API
}
];
//分析卡片的函数,Code From pad-rikuu
function parseCard(data) {
const card = {
attrs: [],
types: []
};
let i = 0;
function readCurve() {
return {
min: data[i++],
max: data[i++],
scale: data[i++],
};
}
card.id = data[i++]; //ID
card.name = data[i++]; //名字
card.attrs.push(data[i++]); //属性1
card.attrs.push(data[i++]); //属性2
card.isUltEvo = data[i++] !== 0; //是否究极进化
card.types.push(data[i++]); //类型1
card.types.push(data[i++]); //类型2
card.rarity = data[i++]; //星级
card.cost = data[i++]; //cost
card.unk01 = data[i++]; //未知01
card.maxLevel = data[i++]; //最大等级
card.feedExp = data[i++]; //1级喂食经验,需要除以4
card.isEmpty = data[i++] === 1; //空卡片?
card.sellPrice = data[i++]; //1级卖钱,需要除以10
card.hp = readCurve(); //HP增长
card.atk = readCurve(); //攻击增长
card.rcv = readCurve(); //回复增长
card.exp = { min: 0, max: data[i++], scale: data[i++] }; //经验增长
card.activeSkillId = data[i++]; //主动技
card.leaderSkillId = data[i++]; //队长技
card.enemy = { //作为怪物的数值
countdown: data[i++],
hp: readCurve(),
atk: readCurve(),
def: readCurve(),
maxLevel: data[i++],
coin: data[i++],
exp: data[i++]
};
card.evoBaseId = data[i++]; //进化基础ID
card.evoMaterials = [data[i++], data[i++], data[i++], data[i++], data[i++]]; //进化素材
card.unevoMaterials = [data[i++], data[i++], data[i++], data[i++], data[i++]]; //退化素材
card.unk02 = data[i++]; //未知02
card.unk03 = data[i++]; //未知03
card.unk04 = data[i++]; //未知04
card.unk05 = data[i++]; //未知05
card.unk06 = data[i++]; //未知06
card.unk07 = data[i++]; //未知07
const numSkills = data[i++]; //几种敌人技能
card.enemy.skills = Array.from(new Array(numSkills)).map(() => ({
id: data[i++],
ai: data[i++],
rnd: data[i++]
}));
const numAwakening = data[i++]; //觉醒个数
card.awakenings = Array.from(new Array(numAwakening)).map(() => data[i++]);
const sAwakeningStr = data[i++];
card.superAwakenings = (sAwakeningStr.length>0?sAwakeningStr.split(','):[]).map(Number); //超觉醒
card.evoRootId = data[i++]; //进化链根ID
card.seriesId = data[i++]; //系列ID
card.types.push(data[i++]); //类型3
card.sellMP = data[i++]; //卖多少MP
card.latentAwakeningId = data[i++]; //潜在觉醒ID
card.collabId = data[i++]; //合作ID
const flags = data[i++]; //一个旗子?
card.unk08 = flags; //未知08
card.canAssist = (flags & 1) !== 0; //是否能当二技
card.altName = data[i++]; //替换名字
card.limitBreakIncr = data[i++]; //110级增长
card.unk08 = data[i++]; //未知08
card.unk09 = data[i++]; //未知09
card.specialAttribute = data[i++]; //特别属性,比如黄龙
if (i !== data.length)
console.log(`residue data for #${card.id}: ${i} ${data.length}`);
return card;
}
officialAPI.forEach(function(lang){
console.log("正在读取官方 " + lang.code + " 信息");
let json = fs.readFileSync("official-API/" + lang.code +".json", 'utf-8'); //使用同步读取
let card = lang.cardOriginal = JSON.parse(json).card;//将字符串转换为json对象
let monArray = lang.monArray = []; //储存输出内容
let monCard = lang.cards = []; //储存格式化后的输出内容
for (let mi=0; mi<card.length && card[mi][0] == mi; mi++)//id不等于索引时,都是些怪物了
{
let m = card[mi];
//名字对象
let nameObj = {};
nameObj[lang.code] = m[1];
//因为觉醒数量的不一样,所以需要制定序号
let awokenCountIdx = 58+m[57]*3; //awoken Count Index,觉醒数量的序号
let superAwokenIdx = awokenCountIdx+1+m[awokenCountIdx]; //super awoken Index,超觉醒的序号
//类型
let type = [m[5]];
if (m[6]!=-1) //第二个type
type.push(m[6]);
if (m[superAwokenIdx+3]!=-1) //第三个type
type.push(m[superAwokenIdx+3]);
let awokens = m.slice(awokenCountIdx+1,awokenCountIdx+1+m[awokenCountIdx]); //具体觉醒编号的数组
let mon = {
id: m[0],
name: nameObj,
ppt: [m[2],m[3]], //属性property
type: type,
rare: m[7], //稀有度
awoken: awokens, //觉醒
maxLv: m[10],
assist: (m[superAwokenIdx+7]>2 && [303,305,307,600,602].indexOf(m[0])<0)?1:0, //但是5种小企鹅是特殊情况
ability: [ //三维
[m[14],m[15]], //HP
[m[17],m[18]], //ATK
[m[20],m[21]], //RCV
],
}
if (m[superAwokenIdx+9]>0) //如果可以110级
{
mon.a110 = m[superAwokenIdx+9];
let superAwoken = //超觉醒
m[superAwokenIdx].length>0
? (m[superAwokenIdx].split(",").map(function(sa){return parseInt(sa);}))
: null;
if (superAwoken)
{
mon.sAwoken = superAwoken;
}
}
monArray.push(mon);
let m = parseCard(card[mi]);
monCard.push(m);
}
//加入自定义的语言
@@ -77,47 +113,29 @@ officialAPI.forEach(function(lang){
let json = fs.readFileSync("custom/" + lcode +".json", 'utf-8'); //使用同步读取
let ccard = JSON.parse(json);//将字符串转换为json对象
ccard.forEach(function(cm,idx){ //每个文件内的名字循环
let m = monArray[cm.id];
let m = monCard[cm.id];
if (m)
m.name[lcode] = cm.name;
{
if (!m.otlName) //如果没有其他语言名称属性,则添加一个对象属性
m.otlName = {};
m.otlName[lcode] = cm.name;
}
});
});
})
/*
//比较两只怪物是否是同一只(在不同语言服务器),原始数据模式
function sameCard(m1,m2)
{
//因为觉醒数量的不一样,所以需要制定序号
//let awokenCountIdx1 = 58+m1[57]*3; //觉醒数量的序号
//let superAwokenIdx1 = awokenCountIdx1+1+m1[awokenCountIdx1]; //超觉醒的序号
//let awokenCountIdx2 = 58+m2[57]*3; //觉醒数量的序号
//let superAwokenIdx2 = awokenCountIdx2+1+m2[awokenCountIdx2]; //超觉醒的序号
if (m1[0]==4949)console.log(m1[7],m2[7],m1[7] != m2[7])
if (m1 == undefined || m2 == undefined) return false; //是否存在
if (m1[2] != m2[2]) return false; //主属性
if (m1[3] != m2[3]) return false; //副属性
if (m1[5] != m2[5]) return false; //type1
if (m1[6] != m2[6]) return false; //type2
//if (m1[superAwokenIdx+3] != m2[superAwokenIdx+3]) return false; //type3
if (m1[7] != m2[7]) return false; //稀有度
if (m1[10] != m2[10]) return false; //最大等级
return true;
}
*/
//比较两只怪物是否是同一只(在不同语言服务器)
function sameCard(m1,m2)
{
if (m1 == undefined || m2 == undefined) return false; //是否存在
if (m1.ppt[0] != m2.ppt[0]) return false; //主属性
if (m1.ppt[1] != m2.ppt[1]) return false; //副属性
if (m1.type.length != m2.type.length) return false; //副属性
if (m1.type.some(function(t1,ti){
return m2.type[ti] == undefined || m2.type[ti] != t1;
if (m1.attrs[0] != m2.attrs[0]) return false; //主属性
if (m1.attrs[1] != m2.attrs[1]) return false; //副属性
if (m1.types.length != m2.types.length) return false; //类型长度
if (m1.types.some(function(t1,ti){
return m2.types[ti] == undefined || m2.types[ti] != t1;
})) return false; //全部类型
if (m1.rare != m2.rare) return false; //稀有度
if (m1.maxLv != m2.maxLv) return false; //最大等级
if (m1.maxLevel != m2.maxLevel) return false; //最大等级
if (m1.collabId != m2.collabId) return false; //合作ID
return true;
}
//加入其他语言
@@ -125,28 +143,32 @@ for (let li = 0;li < officialAPI.length; li++)
{
let otherLangs = officialAPI.concat(); //复制一份原始数组,储存其他语言
let lang = otherLangs.splice(li,1)[0]; //删掉并取得当前的语言
let monArray = lang.monArray; //储存输出内容
let monCard = lang.cards //储存输出内容
for (let mi=0; mi<monArray.length; mi++)
for (let mi=0; mi<monCard.length; mi++)
{
let m = monArray[mi];
let name = m.name[lang.code];
let m = monCard[mi];
let name = m.name;
//名字对象
otherLangs.forEach(function(olang){
let _m = olang.monArray[mi]; //获得这种语言的当前这个怪物数据
otherLangs.forEach(function(otLang){
let _m = otLang.cards[mi]; //获得这种语言的当前这个怪物数据
if (_m && sameCard(m,_m)) //如果有这个怪物,且与原语言怪物是同一只
{
let oname = _m.name[olang.code];
let otName = _m.name;
if (!/^\*+/.test(name) && //名字不是星号开头
!/^\*+/.test(oname) && //名字不是星号开头
!/^\*+/.test(otName) && //名字不是星号开头
!/^\?+/.test(name) && //名字不是问号开头
!/^\?+/.test(oname) && //名字不是问号开头
!/^\?+/.test(otName) && //名字不是问号开头
!/^초월\s*\?+/.test(name) && //名字不是韩文的问号开头
!/^초월\s*\?+/.test(oname) //名字不是韩文的问号开头
!/^초월\s*\?+/.test(otName) //名字不是韩文的问号开头
)
{
m.name = Object.assign(m.name, _m.name); //增加储存当前语言的全部
if (!m.otlName) //如果没有其他语言名称属性,则添加一个对象属性
m.otlName = {};
m.otlName[otLang.code] = otName;
if (_m.otlName)
m.otlName = Object.assign(m.otlName, _m.otlName); //增加储存当前语言的全部其他语言
}
}
})
@@ -156,7 +178,32 @@ for (let li = 0;li < officialAPI.length; li++)
//最后批量保存
officialAPI.forEach(function(lang){
let str = JSON.stringify(lang.monArray);
let lcode = lang.code;
let outCards = lang.cards.map(function(m){
let sm = {
id : m.id,
name : {lcode : m.name},
ppt : m.attrs,
type : m.types,
rare : m.rarity,
awoken : m.awakenings,
maxLv : m.maxLevel,
assist : m.canAssist?1:0,
ability : [
m.hp,
m.atk,
m.rcv
],
a110 : m.limitBreakIncr,
}
sm.name = Object.assign(sm.name, m.otlName);
if (m.superAwakenings.length>0)
sm.sAwoken = m.superAwakenings;
if (m.limitBreakIncr>0)
sm.a110 = m.limitBreakIncr;
return sm;
})
let str = JSON.stringify(outCards);
fs.writeFile('./mon_'+lang.code+'.json',str,function(err){
if(err){
console.error(err);


+ 1
- 1
monsters-info/mon_en.json
File diff suppressed because it is too large
View File


+ 1
- 1
monsters-info/mon_ja.json
File diff suppressed because it is too large
View File


+ 1
- 1
monsters-info/mon_ko.json
File diff suppressed because it is too large
View File


+ 86
- 16
monsters-info/official-API/test-mon.html View File

@@ -4,7 +4,7 @@
<meta charset="utf-8">
<title>怪物代码测试</title>
<script type="text/javascript">
var card;
var cards;
var mid;
var GM_xmlhttpRequest = function(GM_param) {
var xhr = new XMLHttpRequest(); //创建XMLHttpRequest对象
@@ -25,14 +25,96 @@ var GM_xmlhttpRequest = function(GM_param) {
}
xhr.send(GM_param.data ? GM_param.data : null);
}
function parseCard(data) {
const card = {
attrs: [],
types: []
};
let i = 0;
function readCurve() {
return {
min: data[i++],
max: data[i++],
scale: data[i++],
};
}
card.id = data[i++]; //ID
card.name = data[i++]; //名字
card.attrs.push(data[i++]); //属性1
card.attrs.push(data[i++]); //属性2
card.isUltEvo = data[i++] !== 0; //是否究极进化
card.types.push(data[i++]); //类型1
card.types.push(data[i++]); //类型2
card.rarity = data[i++]; //星级
card.cost = data[i++]; //cost
card.unk01 = data[i++]; //未知01
card.maxLevel = data[i++]; //最大等级
card.feedExp = data[i++]; //1级喂食经验,需要除以4
card.isEmpty = data[i++] === 1; //空卡片?
card.sellPrice = data[i++]; //1级卖钱,需要除以10
card.hp = readCurve(); //HP增长
card.atk = readCurve(); //攻击增长
card.rcv = readCurve(); //回复增长
card.exp = { min: 0, max: data[i++], scale: data[i++] }; //经验增长
card.activeSkillId = data[i++]; //主动技
card.leaderSkillId = data[i++]; //队长技
card.enemy = { //作为怪物的数值
countdown: data[i++],
hp: readCurve(),
atk: readCurve(),
def: readCurve(),
maxLevel: data[i++],
coin: data[i++],
exp: data[i++]
};
card.evoBaseId = data[i++]; //进化基础ID
card.evoMaterials = [data[i++], data[i++], data[i++], data[i++], data[i++]]; //进化素材
card.unevoMaterials = [data[i++], data[i++], data[i++], data[i++], data[i++]]; //退化素材
card.unk02 = data[i++]; //未知02
card.unk03 = data[i++]; //未知03
card.unk04 = data[i++]; //未知04
card.unk05 = data[i++]; //未知05
card.unk06 = data[i++]; //未知06
card.unk07 = data[i++]; //未知07
const numSkills = data[i++]; //几种敌人技能
card.enemy.skills = Array.from(new Array(numSkills)).map(() => ({
id: data[i++],
ai: data[i++],
rnd: data[i++]
}));
const numAwakening = data[i++]; //觉醒个数
card.awakenings = Array.from(new Array(numAwakening)).map(() => data[i++]);
const sAwakeningStr = data[i++];
card.superAwakenings = (sAwakeningStr.length>0?sAwakeningStr.split(','):[]).map(Number); //超觉醒
card.evoRootId = data[i++]; //进化链根ID
card.seriesId = data[i++]; //系列ID
card.types.push(data[i++]); //类型3
card.sellMP = data[i++]; //卖多少MP
card.latentAwakeningId = data[i++]; //潜在觉醒ID
card.collabId = data[i++]; //合作ID
const flags = data[i++]; //一个旗子?
card.unk08 = flags; //未知08
card.canAssist = (flags & 1) !== 0; //是否能当二技
card.altName = data[i++]; //替换名字
card.limitBreakIncr = data[i++]; //110级增长
card.unk08 = data[i++]; //未知08
card.unk09 = data[i++]; //未知09
card.specialAttribute = data[i++]; //特别属性,比如黄龙
if (i !== data.length)
console.log(`residue data for #${card.id}: ${i} ${data.length}`);
return card;
}
function g(id)
{
var m = card[id];
let m = cards[id];
var pn = ["火","水","木","光","暗"];
var p = [pn[m[2]]||"无", pn[m[3]]||"无"];
var tn = ["0进化","1平衡","2体力","3回复","4龙","5神","6攻击","7恶魔","8机械","9","10","11","12觉醒","13","14强化","15卖钱"];
let mobj = parseCard(m);
console.log(mobj); //输出人家大佬的格式
//因为觉醒数量的不一样,所以需要制定序号
var awokenCIdx = 58+m[57]*3; //awoken Count Index,觉醒数量的序号
var superAwokenIdx = awokenCIdx+1+m[awokenCIdx]; //super awoken Index,超觉醒的序号
@@ -88,19 +170,7 @@ GM_xmlhttpRequest({
method: "GET",
url:"ja.json",
onload: function(response) {
card = JSON.parse(response.response).card;
/*
var ts = card.filter(function(m){
return [9,10,11,13].indexOf(m[5])>=0;
})
console.log(ts);
*/
/*
console.log(card.sort(function(a,b){
return b[b.length-3] - a[a.length-3];
}));
g(0);
*/
cards = JSON.parse(response.response).card;
},
onerror: function(response) {
console.error("怪物数据获取错误",response);


+ 9
- 3
universal_function.js View File

@@ -4,6 +4,7 @@ var type_allowable_latent = {
"12":[], //12觉醒
"14":[], //14强化
"15":[], //15卖钱
"9":[],//特殊保护
"1":[17,18,19,20,21,22,23,24], //1平衡
"2":[20,24],//2体力
"3":[18,22],//3回复
@@ -135,7 +136,11 @@ function returnMonsterNameArr(m,lsList)
}
return monNameArr;
}
//Code From pad-rikuu
function valueAt(level, maxLevel, curve) {
const f = maxLevel === 1 ? 1 : (level - 1) / (maxLevel - 1);
return curve.min + (curve.max - curve.min) * Math.pow(f, curve.scale);
}
//计算怪物的能力
function calculateAbility(monid,level,plus,awoken,latent,weaponId,weaponAwoken)
{
@@ -159,10 +164,11 @@ function calculateAbility(monid,level,plus,awoken,latent,weaponId,weaponAwoken)
[{index:3,scale:0.1},{index:12,scale:0.2},{index:27,scale:0.3}]
];
var abilitys = m.ability.map(function(ab,idx){
var n_base = Math.round((ab[1]-ab[0])*(level-1)/98+ab[0]); //99级以内的增加
var n_base = Math.round(valueAt(level,m.maxLv,ab));
//var n_base = Math.round((ab[1]-ab[0])*(level-1)/98+ab[0]); //99级以内的增加
if (level>99) //110级的增加
{ //100到110级有11级,将m.a110的成长比率平均分配到这11级内
n_base = Math.round(ab[1] + ab[1]*(m.a110/100)*(level-99)/11);
n_base = Math.round(ab.max + ab.max*(m.a110/100)*(level-99)/11);
}
var n_plus = plus[idx]*plusAdd[idx]; //加值增加量
var awokenList = m.awoken.slice(0,awoken); //储存生效的觉醒


Loading…
Cancel
Save