zoukankan      html  css  js  c++  java
  • 合成大西瓜_魔改or外挂

    运行环境

    • electron v8.1.1
    • electron-packager v14.2.1

    目标

    • 魔改《合成大西瓜》

    最近《合成大西瓜》特别火,我去看了源码之后发现了是用cocos开发的,之前也有一点经验,所以想要魔改一下。其实就是开外挂,分三个方面,一个是控制出来的水果类型、一个是合成到大西瓜的时候又变成山竹,一个就是直接修改分数。

    如何在Cocos编译出来的产物寻找关键信息

    我是在这个网址玩的小游戏:合成大西瓜,project.js是游戏过程控制的关键文件,加载场景、生成新水果、判断水果位置、计算分数等逻辑都在这个文件里。

    寻找的技巧就是先假设、再搜索、再调试、最后就可以得到对应的代码。

    1、控制出来的水果类型

    假设我们是一个开发者,我们会在什么时候去创建新水果呢?大概是在上一个水果掉落的时候,而上一个水果是在我们结束触摸的时候掉落的,那我们就可以去搜索代码里onTouchEnd之类的代码,然后打上断点,就会发现这段代码就是生成水果的关键代码。

    t.prototype.onTouchEnd = function(e) {
                        var t = this;
                        i.default.playerTouch && null != a.default.Instance.targetFruit && 1 == this.touchNum && (this.touchNum = 0, a.default.Instance.targetFruit.getComponent(cc.PhysicsCircleCollider).radius = a.default.Instance.targetFruit.height / 2, a.default.Instance.targetFruit.getComponent(cc.PhysicsCircleCollider).apply(), a.default.Instance.targetFruit.getComponent(cc.RigidBody).type = cc.RigidBodyType.Dynamic, a.default.Instance.targetFruit.getComponent(cc.RigidBody).linearVelocity = cc.v2(0, -800), a.default.Instance.targetFruit = null, this.scheduleOnce(function() {
                            i.default.GameUpdateCtrl && (0 == t.createFruitCount ? (a.default.Instance.createOneFruit(0), t.createFruitCount++) : 1 == t.createFruitCount ? (a.default.Instance.createOneFruit(0), t.createFruitCount++) : 2 == t.createFruitCount ? (a.default.Instance.createOneFruit(1), t.createFruitCount++) : 3 == t.createFruitCount ? (a.default.Instance.createOneFruit(2), t.createFruitCount++) : 4 == t.createFruitCount ? (a.default.Instance.createOneFruit(2), t.createFruitCount++) : 5 == t.createFruitCount ? (a.default.Instance.createOneFruit(3), t.createFruitCount++) : t.createFruitCount > 5 && (a.default.Instance.createOneFruit(s.default.RandomInteger(0, 5)), t.createFruitCount++))
                        }, .5))
                    }
    

    其实这个代码逻辑也非常清晰,很容易就看出创建水果的逻辑就是第一个、第二个、第三个是山竹,第四个是桃子,第五个、第六个是橘子,第七个是柠檬。这里多一个山竹是因为在start的生命周期里就创建了一个。

    只要把上面的代码改成:

    i.default.GameUpdateCtrl && (a.default.Instance.createOneFruit(0))
    

    就只有山竹了。

    改成这样:

    i.default.GameUpdateCtrl && (a.default.Instance.createOneFruit(9))
    

    就可以立马合成大西瓜了。

    2、合成到大西瓜的时候又变成山竹

    之所以有这个想法是因为感觉西瓜和西瓜不能合并,那不管技术多好,都只可以合成四个瓜,所以就想要让大西瓜变成山竹。

    检测碰撞应该是游戏开始后一直运行的代码,本来去搜update这个生命周期的代码,结果也没有找到。考虑到水果合成伴随着分数增加,所以搜索了score相关的并打上断点。终于找到了相关代码。

    c == r && c < 9 && r < 9 ? (this.pengzhuangCount += 1, 0 == t.node.getComponent("fruitData").getNumber() && (a.default.score += this.fruitNumber + 1, u.default.Instance.SetScoreTween(a.default.score), n.node.getComponent(cc.PhysicsCircleCollider).radius = 0, n.node.getComponent(cc.PhysicsCircleCollider).apply(), this.node.getComponent(cc.PhysicsCircleCollider).radius = 0, this.node.getComponent(cc.PhysicsCircleCollider).apply(), cc.tween(t.node).to(.1, {
                                position: n.node.position
                            }).call(function() {
                                i.default.Instance.createFruitSui(o.fruitNumber, n.node.position);
                                i.default.Instance.createFruitL(o.fruitNumber, n.node.position, n.node.width);
      												 	i.default.Instance.createLevelUpFruit(o.fruitNumber + 1, n.node.position);
                                n.node.active = !1;
                                t.node.active = !1;
                                n.node.destroy();
                                t.node.destroy();
                            }).start())) : c == r && 9 == c && 9 == r && (this.pengzhuangCount += 1, 0 == t.node.getComponent("fruitData").getNumber() && (a.default.score += this.fruitNumber + 10, u.default.Instance.SetScoreTween(a.default.score), n.node.getComponent(cc.PhysicsCircleCollider).radius = 0, n.node.getComponent(cc.PhysicsCircleCollider).apply(), this.node.getComponent(cc.PhysicsCircleCollider).radius = 0, this.node.getComponent(cc.PhysicsCircleCollider).apply(), a.default.playerTouch = !1, cc.tween(t.node).to(.1, {
                                position: n.node.position
                            }).call(function() {
                                //debug
                                i.default.Instance.createFruitSui(o.fruitNumber, n.node.position), i.default.Instance.createFruitL(o.fruitNumber, n.node.position, n.node.width), i.default.Instance.createLevelUpFruit(o.fruitNumber+1, n.node.position);
                                var e = cc.find("Canvas/upEffectParent").getChildByName("daxigua");
                                e.active = !0, e.opacity = 0, cc.tween(e).to(.5, {
                                    opacity: 150
                                }).start();
                                var c = new cc.Node;
                                c.addComponent(cc.Sprite).spriteFrame = l.default.Instance.fruit[10], c.parent = cc.find("Canvas/upEffectParent"), c.position = cc.v2(0, -500), c.scale = 0;
                                var r = new cc.Node;
                                r.addComponent(cc.Sprite).spriteFrame = l.default.Instance.caidia[6], r.scale = 3, r.parent = c, r.position = cc.v2(0), cc.tween(r).by(5, {
                                    angle: 360
                                }).repeatForever().start();
                                var s = new cc.Node;
                                s.addComponent(cc.Sprite).spriteFrame = l.default.Instance.fruit[10], s.parent = c, s.position = cc.v2(0), d.default.Instance.Play(4, !1, 1), i.default.Instance.ribbonEffect(cc.v2(0, 0)), c.runAction(cc.sequence(cc.spawn(cc.jumpBy(1, 0, 0, 300, 1), cc.scaleTo(1, 1)), cc.delayTime(1), cc.spawn(cc.moveTo(1, cc.v2(0, 500)), cc.scaleTo(1, 0)), cc.callFunc(function() {
                                    a.default.score += 100, u.default.Instance.SetScoreTween(a.default.score), e.active = !1, a.default.playerTouch = !0, c.destroy()
                                }))), n.node.active = !1, t.node.active = !1, n.node.destroy(), t.node.destroy()
                            }).start()))
    

    c == r && c < 9 && r < 9是合成大西瓜之前,c == r && c = 9 && r = 9是合成大西瓜之后。

    这里把c == r && c = 9 && r = 9条件下

    i.default.Instance.createLevelUpFruit(o.fruitNumber+1, n.node.position);

    改成

    i.default.Instance.createLevelUpFruit(0, n.node.position);

    就可以让大西瓜又变成小山竹。

    3、直接修改分数

    作弊的最高境界当然就是直接改分数了,因为在找水果合成的代码时已经找到增加

    分数的代码了。

    c == r && c < 9 && r < 9条件下

    a.default.score += this.fruitNumber + 1

    c == r && c = 9 && r = 9条件下

    a.default.score += this.fruitNumber + 10

    直接动手改就好了,不过改很高的分数也是超过99%。所以第一名到底开了什么无敌挂。

    魔改《合成大西瓜》

    我用electron做了mac版离线的,就是大西瓜会变山竹的新玩法,项目放在gitee上(仅供技术交流)。

    由于时间关系,没有去做逆向,直接用了编译好的代码改。这个游戏去做逆向后应该是一个不错的小游戏教程。

    试探性地留下名字
  • 相关阅读:
    oracle无法使用sysdba的解决办法
    打开计算机管理的命令
    python 多进程详解(Multiprocessing模块)
    zabbix使用Percona数据库tokudb引擎
    python自定义异常类
    xml(打补丁)设置timestamp类型指定的默认值以及varchar2类型的默认值
    This inspection suggests to replace null check with Object/Stream static method
    后端Itext生成pdf到传到前端,支票打印A4纸
    easyexcel导入获取表头并且表头为不固定列
    9. 云停车(芊熠相机)
  • 原文地址:https://www.cnblogs.com/xuanyu-10-18/p/14340204.html
Copyright © 2011-2022 走看看