欢迎光临散文网 会员登陆 & 注册

赛尔号互通版对战面板能显示属性技能详情吗?

2021-11-28 12:27 作者:摸鱼的橙汁  | 我要投稿



赛尔号互通版对战面板能显示属性技能详情吗?


各位平时在进行精灵对战的时候,不知是否感觉互通版少了些东西呢?

【图1】网页版(Flash)

总感觉互通版的对战信息(战报)面板空荡荡的,好像少了一段文字。

【图2】互通版(H5)

对了,是不是互通版少了一段关于属性技能的描述呢?就像下面这张图一样。

【图3】修改版本(H5)

在互通版打BOSS的时候,BOSS突然释放一个属性技能,战报面板却无法显示技能详细信息,此时很容易翻车,毕竟玩家不可能每时每刻把每一条技能的效果背的滚瓜烂熟,当场查询也不一定来得及。

两个人进行巅峰自由战对决,一个人使用网页版,另一个人使用互通版,假如两个人的设备性能、网络状态、能力素质相当,那么一定是使用网页版的人占优势。

抛开互通版蹩脚的操作手感不谈,互通版缺少技能信息详情的显示功能就是一个很大的劣势。

假如互通版也能在对战信息面板显示属性技能的详细信息,对于对战双方来说,也会比较公平一些。(比如像下面这张图一样。)

与此同时,大家玩互通版也会轻松很多。

作为一个比较懒的人,不想记这么多技能的效果,为了方便以后在互通版对战时查看属性技能详情信息,于是开始了探索。

首先,要知道,赛尔号的技能信息是如何保存的。

赛尔号的技能信息一般是存储在一个xml文件之中,精灵的技能叫做Move,技能的效果叫做SideEffect。

Move的SideEffect属性用于存放技能的效果ID,SideEffectArg属性用于传递技能的效果的参数值。

以技能“光荣之梦”为例,其中有一个子效果为“下2回合自身所有技能先制+2”:对应的SideEffect序号为843,效果“下m回合自身所有技能先制+n”;对应的参数为“2 2”,整合以后就是“下2回合自身所有技能先制+2”。

作为属性技能,“光荣之梦”还有一个独特的属性,叫做info,这个属性用于在对战信息中显示技能的详细效果。“光荣之梦”的info为“全属性都提升了,对手不为混沌系时强化效果翻倍,每回合吸取对手能力提升状态;恢复自身体力并造成等量固定伤害;出手变得更快了”。

这个info属性,就是本文探索的重点。

提示:本文所有的代码块都是可以左右滑动的,滑动后可以查看完整的代码。)

<MovesTbl>    
	<Moves>
		<Move ID="25679" Name="光荣之梦" Category="4" Type="8" MaxPP="5" Accuracy="100" MustHit="1"
              SideEffect="1238 677 1239 843"
              SideEffectArg="1 3 2 2 2 2" Url="pro_3" AtkType="3"
              info="全属性都提升了,对手不为混沌系时强化效果翻倍,每回合吸取对手能力提升状态;恢复自身体力并造成等量固定伤害;出手变得更快了"/>
	</Moves>
	<SideEffects>	
		<SideEffect ID="1000677" des="n回合内每回合吸收对手的能力强化状态"/>
		<SideEffect ID="1001238" des="全属性+n,对手不为混沌系时强化效果翻倍"/>
		<SideEffect ID="1001239" des="恢复自身最大体力的1/n,自身体力低于1/m时造成等量固定伤害"/>
		<SideEffect ID="1000843" des="下m回合自身所有技能先制+n"/>
	</SideEffects>
</MovesTbl>

然后,要搞懂,网页版的对战信息面板为什么会显示属性技能的详细信息。

通过探索精灵对战的相关文件,终于找到了相关的代码。

控制属性技能详细信息输出的代码就在下面这个片段中。

在这其中,函数SkillXMLInfo.getInfo(skillID)就是用来获得属性技能提示信息的。

_loc15_ = SkillXMLInfo.getInfo(param1.skillID);
if (_loc15_ != "") {
	if (SkillXMLInfo.getGpFtSkillType(param1.skillID) == 2) {
		if (_loc3_) {
			_loc6_ = "FF00FF";
			_loc7_ += "<font color=\'#" + _loc6_ + "\'>【" + _loc5_ + "】";
		} else {
			_loc6_ = "ffffff";
			_loc7_ += "<font color=\'#" + _loc6_ + "\'>【" + _loc4_ + "】";
		}
	} else if (_loc3_) {
		_loc6_ = "ffffff";
		_loc7_ += "<font color=\'#" + _loc6_ + "\'>【" + _loc4_ + "】";
	} else {
		_loc6_ = "FF00FF";
		_loc7_ += "<font color=\'#" + _loc6_ + "\'>【" + _loc5_ + "】";
	}
	_loc7_ += _loc15_;
}

最后,要弄清,互通版对战中为什么不会显示属性技能相关的详细信息。

在相关的战斗文件之中,也可以找到相应的代码函数。

控制属性技能详细信息输出的代码就在下面这个片段中。

在这其中,函数SkillXMLInfo.getInfo(skillID)就是用来获得属性技能提示信息的。

if (0 != t.skillID) {
	var r = SkillXMLInfo.getName(t.skillID),
	s = SkillXMLInfo.getInfo(t.skillID);
	o = e ? this.getMyPetColorStr(i) : this.getEnemyPetColorStr(n);
	var a = PetFightController.attackInfoList;
	t.skillID == a[0].skillID && 22050 == t.skillID && 0 != a[1].skillID ? (r = SkillXMLInfo.getName(a[1].skillID), o += this.getSkillStr(r, !0)) : t.skillID == a[1].skillID && 22050 == t.skillID && 0 != a[0].skillID ? (r = SkillXMLInfo.getName(a[0].skillID), o += this.getSkillStr(r, !0)) : o += this.getSkillStr(r, !1),
	t.isCrit && (o += this.getCritCritColorStr()),
	"" != s && (o += 2 == SkillXMLInfo.getGpFtSkillType(t.skillID) ? e ? this.getEnemyPetColorStr(n) : this.getMyPetColorStr(i) : e ? this.getMyPetColorStr(i) : this.getEnemyPetColorStr(n), o += s)
}

明明已经有了相应的函数,为什么互通版在对战中依然无法显示属性技能的详细信息呢?

于是,通过调试面板,单独测试了函数SkillXMLInfo.getInfo(skillID)

可以看到,SkillXMLInfo.getInfo(skillID)无法正常输出属性技能的详细信息,实际输出的内容为空字符。

然而,使用SkillXMLInfo.getSkillObj(skillID).info则可以正常输出信息,这说明技能数据文件加载是正常的。

原来是getInfo这个函数本身出现了问题,导致互通版对战信息面板无法显示属性技能的详细信息。(getInfo返回的是空字符,这个现象有可能是BUG,也有可能是游戏官方为了避免互通版面板文字过多而故意设计成这样的。)

那么,现在有没有方法使互通版像网页版一样在对战面板显示属性技能的详细信息呢?当然是有的啦!~ 

只需要将battle.js里面的部分代码进行改动就可以达到想要的效果。

使用VsCode的插件Eslint将JavaScript代码进行格式化。

找到子函数showSkillText()

t.showSkillText = function(t) {
		var e = MainManager.actorInfo.userID == t.userID,
		i = FighterModelFactory.playerMode.info.petName,
		n = FighterModelFactory.enemyMode.info.petName,
		o = "";
		if (0 != t.skillID) {
			var r = SkillXMLInfo.getName(t.skillID),
			s = SkillXMLInfo.getInfo(t.skillID);
			o = e ? this.getMyPetColorStr(i) : this.getEnemyPetColorStr(n);
			var a = PetFightController.attackInfoList;
			t.skillID == a[0].skillID && 22050 == t.skillID && 0 != a[1].skillID ? (r = SkillXMLInfo.getName(a[1].skillID), o += this.getSkillStr(r, !0)) : t.skillID == a[1].skillID && 22050 == t.skillID && 0 != a[0].skillID ? (r = SkillXMLInfo.getName(a[0].skillID), o += this.getSkillStr(r, !0)) : o += this.getSkillStr(r, !1),
			t.isCrit && (o += this.getCritCritColorStr()),
			"" != s && (o += 2 == SkillXMLInfo.getGpFtSkillType(t.skillID) ? e ? this.getEnemyPetColorStr(n) : this.getMyPetColorStr(i) : e ? this.getMyPetColorStr(i) : this.getEnemyPetColorStr(n), o += s)
		}
		var h = FighterModelFactory.getFighterMode(t.userID);
		h.propView.removeAllEffect();
		var l = 0,
		c = !1,
		_ = "";
		PetStatusEffectController.removeAllEffect(t.userID);
		for (var u = 0,
		p = t.status; u < p.length; u++) {
			var f = p[u];
			if (0 != f) {
				_ += PetStatusEffectConfig.getName(0, l),
				c = !0;
				var d = new egret.ByteArray;
				d.writeUnsignedInt(0),
				d.writeUnsignedInt(l),
				d.writeUnsignedInt(f),
				d.position = 0;
				var g = new PetStatusEffectInfo(d);
				PetStatusEffectController.addEffect(t.userID, g),
				PlayerPetEffectView.showBuffMovie(t, g)
			}
			l++
		}
		for (var y = 0,
		m = t.sideEffects; y < m.length; y++) {
			var v = m[y];
			PetStatusEffectController.addEffect(t.userID, v)
		}
		t.sideEffects.length > 0 && PlayerPetEffectView.showBuffMovie(t, t.sideEffects[0]),
		this.battleMsg.addText(o)
	},

在这个函数之中,找到if (0 != t.skillID) 对应的代码块,在里面进行修改就可以了。

原版代码是这样的:

//原本版本
if (0 != t.skillID) {
	var r = SkillXMLInfo.getName(t.skillID),
	s = SkillXMLInfo.getInfo(t.skillID);
	o = e ? this.getMyPetColorStr(i) : this.getEnemyPetColorStr(n);
	var a = PetFightController.attackInfoList;
	t.skillID == a[0].skillID && 22050 == t.skillID && 0 != a[1].skillID ? (r = SkillXMLInfo.getName(a[1].skillID), o += this.getSkillStr(r, !0)) : t.skillID == a[1].skillID && 22050 == t.skillID && 0 != a[0].skillID ? (r = SkillXMLInfo.getName(a[0].skillID), o += this.getSkillStr(r, !0)) : o += this.getSkillStr(r, !1),
	t.isCrit && (o += this.getCritCritColorStr()),
	"" != s && (o += 2 == SkillXMLInfo.getGpFtSkillType(t.skillID) ? e ? this.getEnemyPetColorStr(n) : this.getMyPetColorStr(i) : e ? this.getMyPetColorStr(i) : this.getEnemyPetColorStr(n), o += s)
}

想办法将SkillXMLInfo.getInfo(skillID)替换成SkillXMLInfo.getSkillObj(skillID).info,当然,不能直接替换,因为JavaScript具有异步性,直接替换是行不通的,无法正常返回文本。

//改后版本
if (0 != t.skillID) {
  var r = SkillXMLInfo.getName(t.skillID),
      s = SkillXMLInfo.getInfo(t.skillID);
  var mySkillInfo = "";
  mySkillInfo = SkillXMLInfo.getSkillObj(t.skillID).info;
  o = e ? this.getMyPetColorStr(i) : this.getEnemyPetColorStr(n);
  var a = PetFightController.attackInfoList;
  t.skillID == a[0].skillID && 22050 == t.skillID && 0 != a[1].skillID ? (r = SkillXMLInfo.getName(a[1].skillID), mySkillInfo = SkillXMLInfo.getSkillObj(t.skillID).info, o += this.getSkillStr(r, !0, mySkillInfo)) : t.skillID == a[1].skillID && 22050 == t.skillID && 0 != a[0].skillID ? (r = SkillXMLInfo.getName(a[0].skillID), o += this.getSkillStr(r, !0, mySkillInfo)) : o += this.getSkillStr(r, !1, mySkillInfo),
    t.isCrit && (o += this.getCritCritColorStr()),
    "" != s && (o += 2 == SkillXMLInfo.getGpFtSkillType(t.skillID) ? e ? this.getEnemyPetColorStr(n) : this.getMyPetColorStr(i) : e ? this.getMyPetColorStr(i) : this.getEnemyPetColorStr(n), o += s)
		}

重新定义一个叫做mySkillInfo的变量,将SkillXMLInfo.getSkillObj(skillID).info赋给这个变量,然后利用getSkillStr()作为回调函数实现功能。

图中画红框的就是改动的部分。

再找到getSkillStr函数,原版代码是这样的:

//原本版本
t.getSkillStr = function(t, e) {
  return void 0 === e && (e = !1),
    e ? '<font color="#ffffff">使用了</font><font color="#fff256">[无限复制]</font><font color="#ffffff">释放了对手的技能</font><font color="#fff256">[' + t + "]</font>": '<font color="#ffffff">释放了</font><font color="#fff256">[' + t + "]</font>"
},

给这个函数添加一个参数,用于回调,避免异步性带来的尴尬。

改后的版本是这样的:

//改后版本
t.getSkillStr = function(t, e, s) {
  if (s==undefined)
    s='';
  return void 0 === e && (e = !1),
    e ? '<font color="#ffffff">使用了</font><font color="#fff256">[无限复制]</font><font color="#ffffff">释放了对手的技能</font><font color="#fff256">[' + t + "]</font>": '<font color="#ffffff">释放了</font><font color="#fff256">[' + t + ']</font><font color="#ffffff">'+s+'</font>'
	},

由于只有属性技能有info属性,因此,要判断一下这个Skill.info是不是未定义,如果未定义就返回空文本,否则才返回Skill.info对应的文本。

图中画红框的就是改动的部分。

下图展示的是代码改动前后的对比效果。

加工完成之后,将battle.js重新载入互通版游戏,就可以实现与网页版一样的效果了。

静态图展示

这样的对战信息框才是熟悉的感觉嘛~

动态图展示

当然,互通版目前正在不断完善之中,目前没有属性技能的详情信息显示功能,游戏官方或许会有更深层次的考虑与打算。

从2020年7月17日进行内部首测,到2020年10月23日进行玩家公测,再到如今预约人数即将突破百万,互通版也在从稚嫩一点点地走向成熟。

每一次的更新,互通版都会有一定程度的优化。虽然未来还有很长的一段路要走,但是正是因为有大家的陪伴,所以从来不会感觉到孤单。

但愿有一天,游戏官方能够为赛尔号互通版的对战信息面板添加属性技能独特的详情信息功能,这样大家玩互通版也不会这么累了,毕竟要熟记技能效果真的是很累的。

那么,不知道各位小伙伴认为赛尔号互通版是否应该像网页版一样,为对战信息面板添加属性技能独特的详情信息功能呢? 不如在评论区留下你们的看法吧~



赛尔号互通版对战面板能显示属性技能详情吗?的评论 (共 条)

分享到微博请遵守国家法律