ハロー ブログ

日々のつぶやき @c2c2c2c221

ロビ日記 RM4のjump address  swift試行

.RM4の「jump address」を「block name」に置き換えるスクリプトをswiftで作りました。

 例)swift main.swift "座る3.RM4">"座る3.RM4.txt"

"座る3.RM4":

...

<medit><medit> <block name="立ち状態?" type="1" xpos="30" ypos="60" bluearrow="16" redarrow="26"/> <varcalc size="1" data="0" adr="0x0f82"> <vconst data="65536"/> <vaddress size="2" adr="0x0f00"/> <flagconst data="1"/>
</varcalc></medit>

...

<jump adr="0x00000120"/>

... 

"座る3.RM4.txt":

...

<jump adr="0x00000120:立ち状態?"/>

... 

main.swift:

func main() {

    var byte_num:Array<Int> = Array(repeating:0,count:10000)

    var jump_adr:Array<Int> = Array(repeating:0,count:1000)

    var i = 0;

    var j=0;

    //let filePath = scan()

    if CommandLine.arguments.count == 2 {

        let filePath: String = CommandLine.arguments[1]

        guard let file = try? String(contentsOfFile: filePath, encoding: String.Encoding.shiftJIS) else { exit(0) }

        var first: Bool = true

        //jump adr の取得

        file.enumerateLines { (line, stop) in

            if first {

                first = false

            } else {

                byte_num[i]=line.lengthOfBytes(using: String.Encoding.shiftJIS)+2

                i=i+1

                //Swift.print(byte_num[i-1])

                if line.range(of:"jump adr") != nil {

                    //Swift.print("jump adr")

                    let item = line.components(separatedBy: "\"")

                    let itema = item[1].components(separatedBy: "x")

                    //Swift.print(itema[1])

                    jump_adr[j] = Int(itema[1],radix: 16)!

                    //Swift.print(jump_adr[j])

                    j=j+1

                }

                //let item = line.components(separatedBy: ",")

                //data.append(Dummy(Int(item[0])!, Float(item[1])!, c: item[2]))

            }

        }

        // label の取得

        let jump_adr_index_max=j

        var jump_adr_label:Array<String> =  Array(repeating:"",count:1000)

        var theByteNum=0

        var theJump_adr=0

        var jump_adr_label_f = 0

        for i in 0..<jump_adr_index_max {

            theJump_adr=jump_adr[i]

            theByteNum = 0

            var medit_line_f = 0

            j = 0

            jump_adr_label_f = 0

            jump_adr_label[i] = ""

            file.enumerateLines { (line, stop) in

                if first {

                    first = false

                } else {

                    theByteNum = theByteNum + byte_num[j]

                    j=j+1

                    //Swift.print(theByteNum ,":", theJump_adr)

                    if ( jump_adr_label_f == 0 ) {

                        if ( medit_line_f == 0) {

                            if ( theJump_adr < theByteNum ) {

                                 medit_line_f = 1

                                 //Swift.print("medit_line_f=1")

                            }

                        } else {

                            if line.range(of:"block name") != nil {  //置き換えが出来ないのは、block nameラベルが無いもの。例)最後のwait

                                let item = line.components(separatedBy: "\"")

                                let itema = item[1]

                                jump_adr_label[i] = itema

                                //Swift.print(jump_adr_label[i])

                                jump_adr_label_f=1

                            }

                        }

                    }

                }

            }

            if ( jump_adr_label_f == 0 ) {

                //Swift.print("Not found jump adr label", theJump_adr)

            }

        }

        // label に置き換え

        var hexstr = ""

        file.enumerateLines { (line, stop) in

            if first {

                first = false

            } else {

                if line.range(of:"jump adr") != nil {

                    //Swift.print("a:"+line)

                    jump_adr_label_f = 0

                    for i in 0..<jump_adr_index_max {

                        hexstr = "0x" + String(format: "%08x" , jump_adr[i] )

                        //Swift.print("a:"+hexstr)

                        if ( jump_adr_label_f == 0 ) {

                            if let range = line.range(of: hexstr ) {

                                //Swift.print("b:"+jump_adr_label[i])

                                if ( jump_adr_label[i] != "") {

                                    let linea = line.replacingCharacters( in: range, with: (hexstr + ":" + jump_adr_label[i]) )

                                    Swift.print(linea)

                                    jump_adr_label_f = 1

                                }

                            }

                        }

                    }

                } else  {

                    Swift.print(line)

                }

            }

        }

    }

}

 

main()