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 );
}
}
}
分享到:
相关推荐
fortune 是一个超媒体 API 原型框架,实现 JSON API 规范。fortune 具有一个模块化的持久层,里面包括了 NeDB (内联), MongoDB, MySQL, Postgres 和 SQLite 的适配器,可以查看 引导手册 了解如何使用。Fortune 实现...
标题中的"matlab开发-Fortune"指的是使用MATLAB编程环境来实现一个功能,即在命令行界面打印出随机的、有时有趣的“财富”信息。这通常涉及到开发一个程序,该程序可以从预定义的数据库中抽取一些引人深思或者幽默的...
在Linux系统中,`cowsay`和`fortune`是两个非常有趣的命令行工具,它们为用户带来了一种独特的方式来进行交互。`cowsay`命令可以将输入的文字包裹在一个牛或其他动物的图形中,而`fortune`则会随机显示一条有趣的...
本文将深入探讨Fortune算法、Lloyd算法以及梯度下降法,并详细阐述它们在Julia编程语言中的实现应用。Julia是一种高性能的动态语言,设计用于科学计算、数值分析和机器学习,它的快速性和易用性使得它成为实现这些...
在Unity引擎中创建一款“Wheel of Fortune”(幸运大转盘)游戏是一项有趣且富有挑战性的任务。这个项目涉及到多个关键的技术点,包括3D模型制作、动画系统、物理模拟以及用户交互。让我们深入探讨如何在Unity中实现...
《财富API:从Unix Fortune命令获取随机或特定的运气》 在信息技术领域,开发者们常常寻找有趣的方式来增强软件的互动性和趣味性。其中,“fortune”命令是Unix和类Unix系统中一个经典的小程序,它会随机展示一条...
fortune-teller, 还有另一个很棒的spring 云 FortuneFortune 是由两个服务组成的一个非常基本的应用程序:财富服务 - 提供随机的中国幸运饼干财富财富 UI 提供了一个使用财富服务的UI它利用来自 spring 云和 Netflix...
这是Fortune.js的IndexedDB适配器。 包括各种性能和兼容性优化: 在Web Worker中运行,这样数据库操作不会,并使用进行。 延迟加载记录,然后将其保存在内存中。 主键在全球范围内是唯一的,从而解决了一些。 $ ...
Unity下的转盘插件,用于游戏里的各种转盘功能,例如抽奖,选择等功能。
fortune-mod维护版本和持续开发 该GitHub存储库保留了fortune-mod( 一个版本)的源代码。 fortune是一个命令行实用程序,它显示引号集合中的随机报价。 该集合是从本地读取的,不需要网络访问。 下载中提供了大量...
Fortune Wheel
一个 C++ 程序,实现了使用 OpenGL 计算 Voronoi 图的 Fortune 算法 在数学中,Voronoi 图是根据到平面特定子集中的点的距离将平面划分为多个区域。这组点(称为种子、站点或生成器)是预先指定的,并且对于每个...
世界500强公司(下)
Java Fortune 是一个基于 BSD 著名的 "Fortune" 游戏的开源实现,它在 Java 语言环境下运行,提供了跨平台的功能。这个程序的主要目的是让用户可以在任何支持 Java 的操作系统上体验到与原版 Fortune 游戏相似的乐趣...
《Windows Fortune应用程序详解》 Windows Fortune应用程序是一款基于C++编程语言开发的小巧而有趣的软件,它能在Windows操作系统环境下运行,为用户提供随机的“幸运语句”以增添生活趣味。这款应用充分利用了VC6...
Fortune Feb ChatGPT Cryptod.pdf
《PyPI官网下载 | fortune.py-0.1.tar.gz - Python库详解》 在Python的世界里,PyPI(Python Package Index)是所有Python开发者的重要资源库,它为全球的Python爱好者提供了一个分享、发现和安装第三方软件包的...
沃罗诺伊 基于de Berg等人的“计算几何:算法和应用”的描述,Fortune算法的Python实现。 该算法处理书中描述的特殊情况。 边界框被通用化以处理凸多边形。手动安装首先,克隆存储库,然后安装软件包。 git clone ...