查看: 4129|回复: 5

[原创发布] 原生脚本拆分工具_拆分后仍可正常运行

[复制链接]
梦石
0
星屑
50
在线时间
56 小时
注册时间
2016-3-23
回帖
13
发表于 2016-4-2 08:48:47 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 大钊 于 2016-4-2 13:43 编辑

之前看到图书馆里有脚本拆分的。。。但苦于没法运行。。。所以自己动手丰衣足食。。。
写了个工具来拆分脚本。。

使用方法,将 RMMVScriptSpliter.exe 扔到项目根目录,然后运行。
QQ截图20160402082718.png

运行完成之后js目录会变成这样:
QQ截图20160402082951.png

index.html文件会变成这样:
index.html[pre lang="xml" file="index.html"]<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
        <meta name="viewport" content="user-scalable=no">
        <link rel="icon" href="icon/icon.png" type="image/png">
        <link rel="apple-touch-icon" href="icon/icon.png">
        <link rel="stylesheet" type="text/css" href="fonts/gamefont.css">
        <title>LostExplorer</title>
    </head>
    <body style="background-color: black"><!--Processed-->
                <script type="text/javascript" src="js\libs\fpsmeter.js"></script>
                <script type="text/javascript" src="js\libs\lz-string.js"></script>
                <script type="text/javascript" src="js\libs\pixi.js"></script>
                <script type="text/javascript" src="js\rpg_core\JsExtensions.js"></script>
                <script type="text/javascript" src="js\rpg_core\Utils.js"></script>
                <script type="text/javascript" src="js\rpg_core\Point.js"></script>
                <script type="text/javascript" src="js\rpg_core\Rectangle.js"></script>
                <script type="text/javascript" src="js\rpg_core\Bitmap.js"></script>
                <script type="text/javascript" src="js\rpg_core\Graphics.js"></script>
                <script type="text/javascript" src="js\rpg_core\Input.js"></script>
                <script type="text/javascript" src="js\rpg_core\TouchInput.js"></script>
                <script type="text/javascript" src="js\rpg_core\Sprite.js"></script>
                <script type="text/javascript" src="js\rpg_core\Tilemap.js"></script>
                <script type="text/javascript" src="js\rpg_core\TilingSprite.js"></script>
                <script type="text/javascript" src="js\rpg_core\ScreenSprite.js"></script>
                <script type="text/javascript" src="js\rpg_core\Window.js"></script>
                <script type="text/javascript" src="js\rpg_core\WindowLayer.js"></script>
                <script type="text/javascript" src="js\rpg_core\Weather.js"></script>
                <script type="text/javascript" src="js\rpg_core\ToneFilter.js"></script>
                <script type="text/javascript" src="js\rpg_core\ToneSprite.js"></script>
                <script type="text/javascript" src="js\rpg_core\Stage.js"></script>
                <script type="text/javascript" src="js\rpg_core\WebAudio.js"></script>
                <script type="text/javascript" src="js\rpg_core\Html5Audio.js"></script>
                <script type="text/javascript" src="js\rpg_core\JsonEx.js"></script>
                <script type="text/javascript" src="js\rpg_managers\DataManager.js"></script>
                <script type="text/javascript" src="js\rpg_managers\ConfigManager.js"></script>
                <script type="text/javascript" src="js\rpg_managers\StorageManager.js"></script>
                <script type="text/javascript" src="js\rpg_managers\ImageManager.js"></script>
                <script type="text/javascript" src="js\rpg_managers\AudioManager.js"></script>
                <script type="text/javascript" src="js\rpg_managers\SoundManager.js"></script>
                <script type="text/javascript" src="js\rpg_managers\TextManager.js"></script>
                <script type="text/javascript" src="js\rpg_managers\SceneManager.js"></script>
                <script type="text/javascript" src="js\rpg_managers\BattleManager.js"></script>
                <script type="text/javascript" src="js\rpg_managers\PluginManager.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Temp.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_System.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Timer.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Message.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Switches.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Variables.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_SelfSwitches.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Screen.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Picture.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Item.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Action.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_ActionResult.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_BattlerBase.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Battler.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Actor.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Enemy.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Actors.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Unit.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Party.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Troop.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Map.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_CommonEvent.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_CharacterBase.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Character.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Player.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Follower.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Followers.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Vehicle.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Event.js"></script>
                <script type="text/javascript" src="js\rpg_objects\Game_Interpreter.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Base.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Boot.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Title.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Map.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_MenuBase.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Menu.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_ItemBase.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Item.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Skill.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Equip.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Status.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Options.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_File.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Save.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Load.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_GameEnd.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Shop.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Name.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Debug.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Battle.js"></script>
                <script type="text/javascript" src="js\rpg_scenes\Scene_Gameover.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Base.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Button.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Character.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Battler.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Actor.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Enemy.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Animation.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Damage.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_StateIcon.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_StateOverlay.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Weapon.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Balloon.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Picture.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Timer.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Sprite_Destination.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Spriteset_Base.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Spriteset_Map.js"></script>
                <script type="text/javascript" src="js\rpg_sprites\Spriteset_Battle.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_Base.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_Selectable.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_Command.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_HorzCommand.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_Help.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_Gold.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_MenuCommand.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_MenuStatus.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_MenuActor.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_ItemCategory.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_ItemList.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_SkillType.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_SkillStatus.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_SkillList.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_EquipStatus.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_EquipCommand.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_EquipSlot.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_EquipItem.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_Status.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_Options.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_SavefileList.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_ShopCommand.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_ShopBuy.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_ShopSell.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_ShopNumber.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_ShopStatus.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_NameEdit.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_NameInput.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_ChoiceList.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_NumberInput.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_EventItem.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_Message.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_ScrollText.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_MapName.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_BattleLog.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_PartyCommand.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_ActorCommand.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_BattleStatus.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_BattleActor.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_BattleEnemy.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_BattleSkill.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_BattleItem.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_TitleCommand.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_GameEnd.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_DebugRange.js"></script>
                <script type="text/javascript" src="js\rpg_windows\Window_DebugEdit.js"></script>
                <script type="text/javascript" src="js\plugins.js"></script>
                <script type="text/javascript" src="js\main.js"></script>
    </body>
</html>
[/pre]


如果不满意的话可以再次运行程序,然后按R还原,不过需要说明的是,这里的还原只是把备份还原了,并不是重新拼接,所以如果在拆分后改动了原生脚本里面的东西还原后是不会保留的。
当然一般也不提倡直接修改原生脚本,有bug可以用插件修。
QQ截图20160402083321.png

然后运行结果:
QQ截图20160402083928.png

源代码:
Program.cs[pre lang="csharp" file="Program.cs"]using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace RMMVScriptSpliter {
    class Program {
        static Regex FileHeaderPattern = new Regex(@"\s*//\s*={10,}\s*//\s*(?<name>.*?)\s*//\s*={10,}\s*", RegexOptions.Compiled);
        static Regex SectionPattern = new Regex(@"//\s*-{10,}\s*(//\s*(?<name>.*?)|/\*[^/]*?@class\s*(?<name>\w+)[^/]*\*/)[\r\n][\s\S]*?(?:(?=//\s*-{10,})|$\s*)", RegexOptions.Compiled);
        static Regex IndexBodyPattern = new Regex(@"(?<=<body[^>]*>)[\s\S]*?(?=\s+</body>)", RegexOptions.Compiled);

        static string JsDir = "js";
        static string JsDirBackup = "js.bak";
        static string JsExt = ".js";
        static string JsBackupExt = ".js.bak";
        static string IndexFile = "index.html";
        static string IndexBackup = "index.html.bak";

        static string[] LibDirs = { "libs" };
        static string[] FilesToKeep = { "plugins", "main", };
        static string[] FilesToProcess = { "rpg_core", "rpg_managers", "rpg_objects", "rpg_scenes", "rpg_sprites", "rpg_windows" };

        static int start;
        static List<string> files = new List<string>();

        static string I(string s) {
            return Path.Combine(JsDirBackup, s + JsBackupExt);
        }
        static string O(string s) {
            return Path.Combine(JsDir, s + JsExt);
        }

        static void Main(string[] args) {
            try {
                if (!File.Exists(IndexFile) || !Directory.Exists(JsDir)) {
                    Console.WriteLine("请将该程序放置到项目目录下");
                    Console.WriteLine("按任意键退出...");
                    Console.ReadKey();
                    return;
                }
                if (Directory.Exists(JsDirBackup) || File.Exists(IndexBackup)) {
                    Console.WriteLine("该目录已经经过处理,不用再次处理。");
                    Console.WriteLine("按R还原,其他任意键退出...");
                    if (Console.ReadKey().Key == ConsoleKey.R) Rollback();
                    return;
                }
                Backup();
                foreach (var e in LibDirs) files.AddRange(Directory.GetFiles(Path.Combine(JsDir, e)));
                foreach (var e in FilesToProcess) files.AddRange(SplitFile(e));
                foreach (var e in FilesToKeep) Keep(e);
                GenerateIndexFile();
                Console.WriteLine("处理完成,按任意键退出...");
                Console.ReadKey();
                Console.WriteLine();
            } catch (Exception e) {
                Console.WriteLine("处理时出错。有问题请联系作者并附上错误内容,错误内容:");
                Console.WriteLine(e.Message);
                Console.WriteLine("按任意键退出...");
                Console.ReadKey();
                Console.WriteLine();
            }
        }

        static void Keep(string file) {
            var m = O(file);
            File.Copy(I(file), m);
            files.Add(m);
        }

        static void assert(string file, Match m) {
            if (m.Index != start) throw new Exception("something has been lost when processing file '" + file + "' before match: \n" + m.Value.Substring(0, 100));
            start += m.Length;
        }

        static IEnumerable<String> SplitFile(string filename) {
            var text = File.ReadAllText(I(filename));
            start = 0;
            var m = FileHeaderPattern.Match(text);
            var header = m.Value;
            assert(filename, m);

            var ms = SectionPattern.Matches(text);
            LinkedList<String> files = new LinkedList<string>();
            foreach (Match e in ms) {
                var name = e.Groups["name"].Value;
                var content = e.Value;
                if (!Directory.Exists(Path.Combine(JsDir, filename))) Directory.CreateDirectory(Path.Combine(JsDir, filename));
                var outName = O(Path.Combine(filename, name));
                files.AddLast(outName);
                File.WriteAllText(outName, content);
                assert(filename, e);
            }
            if (start != text.Length) throw new Exception("something has been lost at the end of file: " + filename);
            return files;
        }

        static void GenerateIndexFile() {
            string s = File.ReadAllText(IndexBackup);
            s = IndexBodyPattern.Replace(s, g => "<!--Processed-->\r\n" + String.Join("\r\n", files.Select(f => String.Format("\t\t<script type=\"text/javascript\" src=\"{0}\"></script>", f))));
            File.WriteAllText(IndexFile, s);

        }

        static void Backup() {
            Console.WriteLine("创建备份...");
            Directory.CreateDirectory(JsDirBackup);
            var ss = Directory.GetFiles(JsDir, "*" + JsExt);
            if (ss != null) foreach (var s in ss) File.Move(s, s.Replace(JsDir, JsDirBackup));
            File.Copy(IndexFile, IndexBackup);
        }

        static void Rollback() {
            Console.WriteLine();
            Console.WriteLine("开始还原");
            var ss = Directory.GetFiles(JsDir, "*" + JsExt);
            if (ss != null) foreach (var s in ss) File.Delete(s);
            foreach (var e in FilesToProcess) {
                var d = Path.Combine(JsDir, e);
                if (Directory.Exists(d)) Directory.Delete(d, true);
            }
            ss = Directory.GetFiles(JsDirBackup, "*" + JsBackupExt);
            if (ss != null) foreach (var s in ss) File.Move(s, s.Replace(JsDirBackup, JsDir));
            Directory.Delete(JsDirBackup, true);
            if (File.Exists(IndexBackup)) {
                if (File.Exists(IndexFile)) File.Delete(IndexFile);
                File.Move(IndexBackup, IndexFile);
            }
            Console.WriteLine("还原完成,按任意键退出...");
            Console.ReadKey();
        }
    }
}
[/pre]


东西在这,用之前建议先手动备份下,毕竟昨晚才做出来的,测试不一定充分,要把各位项目玩坏了罪过就大了。
RMMVScriptSpliter.zip (4.57 KB, 下载次数: 73)

另外。我之前写的那个消息插件
https://rpg.blue/forum.php?mod=v ... d=390820&page=1
听到说最好支持fuki对话框,今天已经搞出来了,那边已经更新。
梦石
0
星屑
487
在线时间
908 小时
注册时间
2009-10-12
回帖
1702
发表于 2016-4-2 10:05:41 | 显示全部楼层
不错不错
不爽为何 mv 所有js类堆在一起,工程结构呢阿喂

顺便,lz 你说支持的 fuki 是哪个来着。。。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
56 小时
注册时间
2016-3-23
回帖
13
 楼主| 发表于 2016-4-2 10:25:50 | 显示全部楼层
日月星辰 发表于 2016-4-2 10:05
不错不错
不爽为何 mv 所有js类堆在一起,工程结构呢阿喂

就是这个
我的这个插件打算支持它,其实本来就不冲突,主要是很多重复功能要做整合
回复

使用道具 举报

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
回帖
1464
发表于 2016-4-2 16:59:27 | 显示全部楼层
太赞了!!!!
回复

使用道具 举报

梦石
0
星屑
79
在线时间
112 小时
注册时间
2010-6-16
回帖
70
发表于 2017-8-24 16:16:12 | 显示全部楼层
创建备份...
处理时出错。有问题请联系作者并附上错误内容,错误内容:
something has been lost when processing file 'rpg_scenes' before match:
//-----------------------------------------------------------------------------
// Scene_Boot
//
回复

使用道具 举报

梦石
0
星屑
44
在线时间
7 小时
注册时间
2021-3-6
回帖
29
发表于 2021-5-1 22:33:04 | 显示全部楼层
6666666666666
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部