吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11615|回复: 16
收起左侧

[其他转载] 制作可以修改.rpgsave存档的网页

  [复制链接]
hlmio 发表于 2020-12-13 21:18
本帖最后由 hlmio 于 2020-12-26 16:02 编辑

前言:这种方法只能修改默认编码方式的存档,如果开发者对存档进行自定义加密,则无法修改。

1. 新建一个文件,后缀改为html
2. 编辑文件,复制文末的代码
3. 双击打开html页面

使用方法:拖拽导入文件,修改属性后,点击蓝色的√以复制存档内容到剪切板。最后把剪切板的内容覆盖粘贴回存档。

效果图1

效果图1

效果图2

效果图2



蓝奏云下载:https://wws.lanzouj.com/iJO8Cjbeeve






存档本身是一个json对象,
默认的加密就是使用 LZString.compressToBase64 方法,编码json字符串。
使用时再用 LZString.decompressFromBase64 方法,解码成json字符串。



代码上传时会被吞掉几段,使用链接下载吧
[HTML] 纯文本查看 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta name="author" content="hlmio 2020-12-13">
    <title>修改rpgsave存档</title>

    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <link rel="stylesheet" >
    <script src="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/index.min.js"></script>
    <script async src="https://cdn.jsdelivr.net/npm/lz-string@1.4.4/libs/lz-string.min.js"></script>
    <script async src="https://cdn.jsdelivr.net/npm/file-saver@2.0.5/dist/FileSaver.min.js"></script>
</head>
<body>
    <div id="app">
        <el-row :gutter="10">
            <el-col :xs="24" :sm="10" style="margin-top: 50px;">
                <div style="display: flex; flex-direction: column; align-items: center;">
                    <!-- (1) 选取文件 -->
                    <div>
                        <el-upload
                            class="upload-demo"
                            drag
                            :auto-upload="1==2"
                            :on-change="upload"
                            :on-preview="clickFile"
                            action="#"
                            >
                            <i class="el-icon-upload"></i>
                            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                        </el-upload>
                    </div>

                    <!-- (2) 加密内容 -->
                    <div style="margin-top: 50px;">
                        <el-input v-model="加密内容" placeholder="未读取文件">
                            <template slot="prepend">原文:</template>
                            <el-button slot="append"  v-on:click="ctrl_c(加密内容)" icon="el-icon-document-copy"></el-button>
                        </el-input>
                    </div>

                    <!-- (3) 加密按钮 -->
                    <div style="margin-top: 15px;">
                        <el-button v-on:click="decodeText_to_encodeText" icon="el-icon-top"></el-button>
                    </div>

                    <!-- (4) 解密内容 -->
                    <div style="margin-top: 15px;">
                        <el-input v-model="解密内容" placeholder="请输入内容">
                            <template slot="prepend">解码:</template>
                            <el-button slot="append" v-on:click="ctrl_c(解密内容)" icon="el-icon-document-copy"></el-button>
                        </el-input>
                    </div>

                </div>
            </el-col>

            <el-col :xs="24" :sm="13" style="margin-top: 40px;">
                <div style="display: flex; flex-direction: column; align-items: center;">
                    <!-- (5) json内容 -->
                    <div style="margin-top: 15px; width: 90%;">
                        <el-input type="textarea" v-model="json内容" placeholder="请输入内容" :rows="18">
                        </el-input>
                    </div>

                    <!-- (6) 转换按钮 -->
                    <div style="margin-top: 15px;">
                        <el-button v-on:click="change_and_encode_and_save(json内容)" icon="el-icon-download"></el-button>
                        <el-button v-on:click="change_and_encode_and_ctrlC(json内容)"  type="primary"  icon="el-icon-check"></el-button>
                        <el-button v-on:click="ctrl_c(json内容)" icon="el-icon-document-copy"></el-button>
                    </div>
                </div>
            </el-col>
        </el-row>
        
        <el-row style="margin-top: 50px;">
            <!--左占位--><el-col :xs="3" :sm="8"> </el-col>
            <el-col :xs="18" :sm="8" style="margin-top: 10px;">
                <el-input v-model.number="金钱" type="number" placeholder="未读取">
                    <template slot="prepend">金钱</template>
                </el-input>
            </el-col>
            <!--右占位--><el-col :xs="3" :sm="8"> </el-col>
        </el-row>

        <el-row style="margin-top: 15px;">
            <template v-for="(角色,index) in 角色列表" v-if="index >= 1">
                <!--左占位--><el-col :xs="3" :sm="1"> </el-col>
                <el-col :xs="18" :sm="6" style="margin-top: 15px;">
                    <div>
                        <el-input v-model="角色['_name']" placeholder="未读取">
                            <template slot="prepend">姓名</template>
                        </el-input>
                        <el-input v-model.number="角色['_level']" type="number" placeholder="未读取" style="margin-top: 10px;">
                            <template slot="prepend">等级</template>
                        </el-input>
                        <el-input v-model.number="角色['_paramPlus']['@a'][0]" type="number" placeholder="未读取">
                            <template slot="prepend">生命</template>
                        </el-input>
                        <el-input v-model.number="角色['_paramPlus']['@a'][1]" type="number" placeholder="未读取">
                            <template slot="prepend">魔力</template>
                        </el-input>
                        <el-input v-model.number="角色['_paramPlus']['@a'][2]" type="number" placeholder="未读取" style="margin-top: 5px;">
                            <template slot="prepend">攻击</template>
                        </el-input>
                        <el-input v-model.number="角色['_paramPlus']['@a'][4]" type="number" placeholder="未读取">
                            <template slot="prepend">魔攻</template>
                        </el-input>
                        <el-input v-model.number="角色['_paramPlus']['@a'][6]" type="number" placeholder="未读取">
                            <template slot="prepend">敏捷</template>
                        </el-input>
                    </div>
                </el-col>
                <!--右占位-->
                <el-col :xs="3" :sm="1" style="margin-top: 10px; visibility: hidden">
                    <el-input placeholder="未读取">
                        <template slot="prepend">占位</template>
                    </el-input>
                </el-col>
            </template>
        </el-row>

        <el-row style="margin-top: 15px;">
            <el-col :xs="24" :sm="24" style="margin-top: 15px;">
                <div style="display: flex; justify-content: center;">
                    <el-button v-on:click="change_and_encode_and_save(json对象)" icon="el-icon-download"></el-button>
                    <el-button v-on:click="change_and_encode_and_ctrlC(json对象)"  type="primary"  icon="el-icon-check"></el-button>
                </div>
            </el-col>
        </el-row>

        <el-row>
            <el-col :xs="20" :sm="6" style="margin-top: 50px;">
            </el-col>
        </el-row>

        <el-backtop></el-backtop>
    </div>


    <script>
        var app = new Vue({
            el: '#app',
            data: {
                文件路径: null,
                加密内容: null,
                解密内容: null,
                json内容: null,
                json对象: {},

                角色列表: []
            },
            computed: {
                金钱: {
                    get: function () {     
                        try {
                            var _ = this.json对象["party"]["_gold"]
                        } catch (error) {
                            console.log(error)
                            _ = "未取到值"
                        }
                        return _
                    },
                    set: function (value){
                        try {
                            this.json对象["party"]["_gold"] = value
                        } catch (error) {
                            console.log(error)
                        }
                    }
                }
            },
            watch: {
                加密内容(新值, 旧值) {
                    this.解密内容 = this.读取解密内容(新值)
                },
                解密内容(新值, 旧值) {
                    this.json内容 = this.读取json内容(新值)
                },
                json内容(新值, 旧值) {
                    this.json对象 = this.to_json_obj(新值)
                    try {
                        this.角色列表 = this.json对象["actors"]["_data"]["@a"]
                    } catch (error) {
                        console.log(error)
                        this.角色列表 = []
                    }
                }
            },
            methods: {
                // (1)
                upload: function (file, fileList) {
                    this.文件路径 = file.name
                    file.文件路径 =  this.文件路径
                    this.读取加密内容(file.raw)
                },
                clickFile: function (file) {
                    this.读取加密内容(file.raw)
                    this.文件路径 = file.文件路径 
                },

                // (2)
                读取加密内容: function (file) {
                    var _this = this
                    var reader = new FileReader()
                    reader.readAsText(file)
                    reader.onload = function(){
                        _this.加密内容 = this.result
                    }
                },
                
                // (3)
                decodeText_to_encodeText: function () {
                    this.加密内容 = this.encode(this.解密内容)
                    this.ctrl_c(this.加密内容)
                },

                // (4)
                读取解密内容: function (加密内容) {
                    return this.decode(加密内容)
                },

                // (5)
                读取json内容: function (解密内容) {
                    return JSON.stringify(JSON.parse(解密内容),null,2)
                },

                // (6)
                change_and_encode_and_save: function (obj) {
                    this.change_and_encode(obj)
                    this.save(this.加密内容, this.文件路径)
                },
                change_and_encode_and_ctrlC: function (obj) {
                    this.change_and_encode(obj)
                    this.ctrl_c(this.加密内容)
                },



                // ------------ 辅助方法 ------------

                change_and_encode: function (obj) {
                    let _ = this.to_json_str(obj)
                    this.加密内容 = this.encode(_)
                },

                ctrl_c: function (text) {
                    this.copyText(text)
                    this.$message('已复制');
                },


                // ------------ 工具方法 ------------

                to_json_obj: function (obj) {
                    return JSON.parse(obj)
                },
                to_json_str: function (obj) {
                    if(typeof(obj) == "string"){
                        return JSON.stringify(JSON.parse(obj))
                    }
                    return JSON.stringify(obj)
                },
                encode: function (text) {
                    return LZString.compressToBase64(text)
                },
                decode: function (text) {
                    return LZString.decompressFromBase64(text)
                },
                save: function (text, 文件名 = "a1.txt") {
                    let pos = 文件名.lastIndexOf("/")
                    文件名 = 文件名.substring(pos+1)
                    var file = new File([text], 文件名, { type: "text/plain;charset=utf-8" })
                    saveAs(file)
                },


                // 复制的方法
                copyText: function(text, callback){ // text: 要复制的内容, callback: 回调
                    var tag = document.createElement('input');
                    tag.setAttribute('id', 'cp_hgz_input');
                    tag.value = text;
                    document.getElementsByTagName('body')[0].appendChild(tag);
                    document.getElementById('cp_hgz_input').select();
                    document.execCommand('copy');
                    document.getElementById('cp_hgz_input').remove();
                    if(callback) {callback(text)}
                }
            }
        })
    </script>
</body>
</html>

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
zq769427 + 1 + 1 谢谢@Thanks!
六色魔方 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| hlmio 发表于 2020-12-18 14:13
ins9510 发表于 2020-12-15 18:58
87版本,页面混乱,但是存档能改,可以考虑做成一个本地的小工具或许更为方便

上传的代码被吞了一些,我加了个下载链接,用链接吧。

网页不能改本地文件,确实小工具更好,下次一定。
 楼主| hlmio 发表于 2020-12-26 16:05
林中隐士 发表于 2020-12-22 22:06
卧槽,大佬牛笔。找半天  你是黎明的曙光

我也是百度找不到,才写这个。
有个叫Save Editor Online的网站可以在线改,功能很全,就是有次数限制。
ins9510 发表于 2020-12-15 18:38
ins9510 发表于 2020-12-15 18:58
87版本,页面混乱,但是存档能改,可以考虑做成一个本地的小工具或许更为方便
林中隐士 发表于 2020-12-22 22:06
卧槽,大佬牛笔。找半天  你是黎明的曙光
林中隐士 发表于 2021-1-2 20:42
hlmio 发表于 2020-12-26 16:05
我也是百度找不到,才写这个。
有个叫Save Editor Online的网站可以在线改,功能很全,就是有次数限制。

https://www.saveeditonline.com/
这个在线能够改
489621 发表于 2021-2-2 10:48
被加密的存档有没有办法弄?
 楼主| hlmio 发表于 2021-2-3 23:53
489621 发表于 2021-2-2 10:48
被加密的存档有没有办法弄?

加密存档的话,估计只能用原始的内存修改器(Cheat Engine)改了
电波侵蚀 发表于 2021-2-21 19:25
感谢,CE搞了半天 没想到这个一遍搞定
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-13 03:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表