`
RednaxelaFX
  • 浏览: 3052579 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

Fortune Arterial Tools

阅读更多
using System;
using System.IO;
using System.Text;

namespace fx.meta.bgi.util
{
    public sealed class ExtractText
    {
        public static void Main( string[ ] args ) {
            if ( args.Length < 1 ) {
                Console.WriteLine( "Give a valid script file as the first parameter." );
                return;
            }

            string infilename = args[ 0 ];
            string outfilename = args[ 0 ] + ".txt";

            FileInfo infile = new FileInfo( infilename );
            if ( !infile.Exists ) {
                Console.WriteLine( "Give a valid script file as the first parameter." );
                return;
            }

            long filelen = infile.Length;

            // read all the text and write to output
            Encoding utf16le = new UnicodeEncoding( false, true );
            Encoding jis = Encoding.GetEncoding( 932 );
            using ( BinaryReader reader = new BinaryReader( infile.OpenRead( ), jis ) ) {
                using ( BinaryWriter writer = new BinaryWriter( File.Create( outfilename ), utf16le ) ) {

                    reader.BaseStream.Seek( 0x020, SeekOrigin.Begin );
                    uint opcode = reader.ReadUInt32( );
                    uint codeSize = reader.ReadUInt32( );

                    if ( opcode != 0x07F ) {
                        throw new Exception( "Unsupported script. Expecting 0x7F at 0x20, but found " + opcode.ToString( "X" ) );
                    }
                    if ( codeSize > filelen ) {
                        throw new Exception( "Bad script. Code size greater than file size." );
                    }

                    writer.Write( ( ushort ) 0xFEFF );
                    reader.BaseStream.Seek( ( long ) codeSize, SeekOrigin.Begin );
                    StringBuilder builder = null;
                    while ( reader.BaseStream.Position < reader.BaseStream.Length ) {
                        string position = reader.BaseStream.Position.ToString( "X" );
                        builder = new StringBuilder( );
                        char c = '\0';
                        while ( ( c = reader.ReadChar( ) ) != '\0' ) {
                            if ( c == '\n' ) {
                                builder.Append( @"\n" );
                            } else {
                                builder.Append( c );
                            }
                        }
                        string text = builder.ToString( );
                        string strlen = jis.GetByteCount( text ).ToString( );
                        writer.Write( utf16le.GetBytes( string.Format( "{0}, {1}, {2}{3}", position, strlen, text, Environment.NewLine ) ) );
                    }
                }
            }
        }
    }
}


using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Text;

namespace fx.meta.bgi.util
{
    public sealed class InsertText
    {
        public static void Main( string[ ] args ) {

            if ( args.Length < 1 ) {
                Console.WriteLine( "Give a valid script file as the first parameter." );
                return;
            }

            string scriptName = args[ 0 ];   
            string textName = scriptName + ".txt";
            string newScriptName = scriptName + ".new";

            FileInfo scriptFile = new FileInfo( scriptName );
            if ( !scriptFile.Exists ) {
                Console.WriteLine( "Give a valid script file as the first parameter." );
                return;
            }
            if ( !File.Exists( textName ) ) {
                Console.WriteLine( "Correspoding text file not available." );
                return;
            }

            long filelen = scriptFile.Length;

            // read all the text and write to output   
            Encoding utf16le = new UnicodeEncoding( false, true );
            Encoding jis = Encoding.GetEncoding( 932 );
            Encoding gbk = Encoding.GetEncoding( 936 );
            using ( BinaryReader script = new BinaryReader( scriptFile.OpenRead( ), jis ) ) {
                using ( StreamReader text = new StreamReader( File.OpenRead( textName ), utf16le ) ) {
                    using ( BinaryWriter writer = new BinaryWriter( File.Create( newScriptName ), gbk ) ) {

                        Dictionary<uint, uint> offsetMapping = new Dictionary<uint, uint>( );
                        List<string> newTexts = new List<string>( );
                        int offsetDifference = 0;

                        script.BaseStream.Seek( 0x020, SeekOrigin.Begin );
                        uint opcode = script.ReadUInt32( );
                        uint codeSize = script.ReadUInt32( );

                        if ( opcode != 0x07F ) {
                            throw new Exception( "Unsupported script. Expecting 0x7F at 0x20, but found " + opcode.ToString( "X" ) );
                        }
                        if ( codeSize > filelen ) {
                            throw new Exception( "Bad script. Code size greater than file size." );
                        }

                        uint currentOffset = codeSize;
                        string line = text.ReadLine( );
                        while ( line != null && !line.Equals( string.Empty ) ) {

                            string[ ] elem = line.Split( new string[ ] { ", " }, StringSplitOptions.RemoveEmptyEntries );
                            uint oldOffset = UInt32.Parse( elem[ 0 ], NumberStyles.AllowHexSpecifier );
                            offsetMapping.Add( oldOffset, ( uint ) ( oldOffset + offsetDifference ) );
                            Console.WriteLine( "{0}, {1}, {2}",
                                oldOffset.ToString( "X" ),
                                ( offsetMapping[ oldOffset ] ).ToString( "X" ),
                                offsetDifference.ToString( ) );

                            int oldTextLength = Int32.Parse( elem[ 1 ] );
                            int newTextLength = 0;
                            if ( 2 < elem.Length ) {
                                newTextLength = gbk.GetByteCount( elem[ 2 ] );
                                string s = elem[ 2 ].Replace( @"\n", "\n" );
                                newTexts.Add( s );
                            } else {
                                newTextLength = 0;
                                newTexts.Add( string.Empty );
                            }
                            offsetDifference += ( int ) ( newTextLength - oldTextLength );

                            line = text.ReadLine( );
                        }

                        script.BaseStream.Seek( 0, SeekOrigin.Begin );
                        byte[ ] scriptBuffer = script.ReadBytes( ( int ) codeSize );

                        for ( int dwptr = 0; dwptr < codeSize; dwptr += 4 ) {
                            uint currentDw = scriptBuffer[ dwptr ];
                            if ( currentDw != 0x03 && currentDw != 0x07F )
                                continue;

                            dwptr += 4;
                            currentDw = ToUInt32( scriptBuffer, dwptr );

                            if ( ( currentDw >= codeSize )
                                && ( offsetMapping.ContainsKey( currentDw ) ) ) {
                                uint newOfs = offsetMapping[ currentDw ];
                                WriteUInt32( newOfs, scriptBuffer, dwptr );
                            } else {
                                dwptr -= 4;
                            }
                        }

                        writer.Write( scriptBuffer );

                        foreach ( string s in newTexts ) {
                            writer.Write( gbk.GetBytes( s ) );
                            writer.Write( ( byte ) 0 );
                        }
                    }
                }
            }
        }

        static uint ToUInt32( byte[ ] array, int beginOfs ) {
            return ( uint ) (
                ( array[ beginOfs + 3 ] << 24 ) |
                ( array[ beginOfs + 2 ] << 16 ) |
                ( array[ beginOfs + 1 ] << 8 ) |
                ( array[ beginOfs ] ) );
        }

        static void WriteUInt32( uint data, byte[ ] array, int beginOfs ) {
            array[ beginOfs ] = ( byte ) ( ( data ) & 0x0FF );
            array[ beginOfs + 1 ] = ( byte ) ( ( data >> 8 ) & 0x0FF );
            array[ beginOfs + 2 ] = ( byte ) ( ( data >> 16 ) & 0x0FF );
            array[ beginOfs + 3 ] = ( byte ) ( ( data >> 24 ) & 0x0FF );
        }
    }
}
分享到:
评论

相关推荐

    超媒体API原型框架Fortune.js.zip

    fortune 是一个超媒体 API 原型框架,实现 JSON API 规范。fortune 具有一个模块化的持久层,里面包括了 NeDB (内联), MongoDB, MySQL, Postgres 和 SQLite 的适配器,可以查看 引导手册 了解如何使用。Fortune 实现...

    matlab开发-Fortune

    标题中的"matlab开发-Fortune"指的是使用MATLAB编程环境来实现一个功能,即在命令行界面打印出随机的、有时有趣的“财富”信息。这通常涉及到开发一个程序,该程序可以从预定义的数据库中抽取一些引人深思或者幽默的...

    cowsay+fortune rpm安装包

    在Linux系统中,`cowsay`和`fortune`是两个非常有趣的命令行工具,它们为用户带来了一种独特的方式来进行交互。`cowsay`命令可以将输入的文字包裹在一个牛或其他动物的图形中,而`fortune`则会随机显示一条有趣的...

    Fortune算法、Lloyd算法和梯度下降的Julia实现应用

    本文将深入探讨Fortune算法、Lloyd算法以及梯度下降法,并详细阐述它们在Julia编程语言中的实现应用。Julia是一种高性能的动态语言,设计用于科学计算、数值分析和机器学习,它的快速性和易用性使得它成为实现这些...

    wheel fortune unity

    在Unity引擎中创建一款“Wheel of Fortune”(幸运大转盘)游戏是一项有趣且富有挑战性的任务。这个项目涉及到多个关键的技术点,包括3D模型制作、动画系统、物理模拟以及用户交互。让我们深入探讨如何在Unity中实现...

    fortune-api:从unix fortune命令获取随机或特定的运气

    《财富API:从Unix Fortune命令获取随机或特定的运气》 在信息技术领域,开发者们常常寻找有趣的方式来增强软件的互动性和趣味性。其中,“fortune”命令是Unix和类Unix系统中一个经典的小程序,它会随机展示一条...

    fortune-teller, 还有另一个很棒的spring 云.zip

    fortune-teller, 还有另一个很棒的spring 云 FortuneFortune 是由两个服务组成的一个非常基本的应用程序:财富服务 - 提供随机的中国幸运饼干财富财富 UI 提供了一个使用财富服务的UI它利用来自 spring 云和 Netflix...

    fortune-indexeddb:用于Fortune.js的IndexedDB适配器

    这是Fortune.js的IndexedDB适配器。 包括各种性能和兼容性优化: 在Web Worker中运行,这样数据库操作不会,并使用进行。 延迟加载记录,然后将其保存在内存中。 主键在全球范围内是唯一的,从而解决了一些。 $ ...

    Fortune Wheel.unitypackage

    Unity下的转盘插件,用于游戏里的各种转盘功能,例如抽奖,选择等功能。

    fortune-mod:用于Linux和其他系统的用于显示随机报价的Unix fortune命令的实现

    fortune-mod维护版本和持续开发 该GitHub存储库保留了fortune-mod( 一个版本)的源代码。 fortune是一个命令行实用程序,它显示引号集合中的随机报价。 该集合是从本地读取的,不需要网络访问。 下载中提供了大量...

    Fortune Wheel

    Fortune Wheel

    一个C ++ 程序,实现了使用 OpenGL 计算 Voronoi 图 的 Fortune算法_代码_下载

    一个 C++ 程序,实现了使用 OpenGL 计算 Voronoi 图的 Fortune 算法 在数学中,Voronoi 图是根据到平面特定子集中的点的距离将平面划分为多个区域。这组点(称为种子、站点或生成器)是预先指定的,并且对于每个...

    Fortune500b

    世界500强公司(下)

    Java Fortune-开源

    Java Fortune 是一个基于 BSD 著名的 "Fortune" 游戏的开源实现,它在 Java 语言环境下运行,提供了跨平台的功能。这个程序的主要目的是让用户可以在任何支持 Java 的操作系统上体验到与原版 Fortune 游戏相似的乐趣...

    Windows Fortune应用程序

    《Windows Fortune应用程序详解》 Windows Fortune应用程序是一款基于C++编程语言开发的小巧而有趣的软件,它能在Windows操作系统环境下运行,为用户提供随机的“幸运语句”以增添生活趣味。这款应用充分利用了VC6...

    Fortune Feb ChatGPT Cryptod.pdf

    Fortune Feb ChatGPT Cryptod.pdf

    PyPI 官网下载 | fortune.py-0.1.tar.gz

    《PyPI官网下载 | fortune.py-0.1.tar.gz - Python库详解》 在Python的世界里,PyPI(Python Package Index)是所有Python开发者的重要资源库,它为全球的Python爱好者提供了一个分享、发现和安装第三方软件包的...

    voronoi:用Python实现Fortune算法的实现

    沃罗诺伊 基于de Berg等人的“计算几何:算法和应用”的描述,Fortune算法的Python实现。 该算法处理书中描述的特殊情况。 边界框被通用化以处理凸多边形。手动安装首先,克隆存储库,然后安装软件包。 git clone ...

Global site tag (gtag.js) - Google Analytics