Exemplo n.º 1
0
/**
 * @brief Write an object contained in the binary.
 * @param object Object to decompile
 * @param pex Binary to decompile.
 */
void Decompiler::PscCoder::writeObject(const Pex::Object &object, const Pex::Binary &pex)
{
    auto stream = indent(0);
    stream <<"ScriptName " << object.getName().asString();
    if (! object.getParentClassName().asString().empty())
    {
        stream << " extends " << object.getParentClassName().asString();
    }
    if (object.getConstFlag())
        stream << " Const";

    writeUserFlag(stream, object, pex);
    write(stream);

    writeDocString(0, object);

    if (object.getStructInfos().size()) {
        write("");
        write(";-- Structs -----------------------------------------");
        writeStructs(object, pex);
    }

    if (object.getProperties().size()) {
        write("");
        write(";-- Properties --------------------------------------");
        writeProperties(object, pex);
    }

    if (object.getVariables().size()) {
        write("");
        write(";-- Variables ---------------------------------------");
        writeVariables(object, pex);
    }

    writeStates(object, pex);
}
void ONScripter::saveSaveFile2( bool output_flag )
{
    int i, j;
    
    writeInt( 1, output_flag );
    writeInt( (sentence_font.is_bold?1:0), output_flag );
    writeInt( (sentence_font.is_shadow?1:0), output_flag );

    writeInt( 0, output_flag );
    writeInt( (rmode_flag)?1:0, output_flag );
    writeInt( sentence_font.color[0], output_flag );
    writeInt( sentence_font.color[1], output_flag );
    writeInt( sentence_font.color[2], output_flag );
    writeStr( cursor_info[0].image_name, output_flag );
    writeStr( cursor_info[1].image_name, output_flag );

    writeInt( window_effect.effect, output_flag );
    writeInt( window_effect.duration, output_flag );
    writeStr( window_effect.anim.image_name, output_flag ); // probably
    
    writeInt( sentence_font.top_xy[0], output_flag );
    writeInt( sentence_font.top_xy[1], output_flag );
    writeInt( sentence_font.num_xy[0], output_flag );
    writeInt( sentence_font.num_xy[1], output_flag );
    writeInt( sentence_font.font_size_xy[0], output_flag );
    writeInt( sentence_font.font_size_xy[1], output_flag );
    writeInt( sentence_font.pitch_xy[0], output_flag );
    writeInt( sentence_font.pitch_xy[1], output_flag );
    for ( i=0 ; i<3 ; i++ )
        writeChar( sentence_font.window_color[2-i], output_flag );
    writeChar( ( sentence_font.is_transparent )?0x00:0xff, output_flag ); 
    writeInt( sentence_font.wait_time, output_flag );
    writeInt( sentence_font_info.orig_pos.x, output_flag );
    writeInt( sentence_font_info.orig_pos.y, output_flag );
    writeInt( sentence_font_info.orig_pos.w + sentence_font_info.orig_pos.x - 1, output_flag );
    writeInt( sentence_font_info.orig_pos.h + sentence_font_info.orig_pos.y - 1, output_flag );
    writeStr( sentence_font_info.image_name, output_flag );

    writeInt( (cursor_info[0].abs_flag)?0:1, output_flag );
    writeInt( (cursor_info[1].abs_flag)?0:1, output_flag );
    writeInt( cursor_info[0].orig_pos.x, output_flag );
    writeInt( cursor_info[1].orig_pos.x, output_flag );
    writeInt( cursor_info[0].orig_pos.y, output_flag );
    writeInt( cursor_info[1].orig_pos.y, output_flag );
    
    writeStr( bg_info.file_name, output_flag );
    for ( i=0 ; i<3 ; i++ )
        writeStr( tachi_info[i].image_name, output_flag );

    for ( i=0 ; i<3 ; i++ )
        writeInt( tachi_info[i].orig_pos.x, output_flag );

    for ( i=0 ; i<3 ; i++ )
        writeInt( tachi_info[i].orig_pos.y, output_flag );

    writeInt( 0, output_flag );
    writeInt( 0, output_flag );
    writeInt( 0, output_flag );

    writeInt( -1, output_flag );
    writeInt( -1, output_flag );
    writeInt( -1, output_flag );
    
    for ( i=0 ; i<MAX_SPRITE_NUM ; i++ ){
        AnimationInfo *ai = &sprite_info[i];
        writeStr( ai->image_name,   output_flag );
        writeInt( ai->orig_pos.x,   output_flag );
        writeInt( ai->orig_pos.y,   output_flag );
        writeInt( ai->visible?1:0,  output_flag );
        writeInt( ai->current_cell, output_flag );
        if (ai->trans == 256)
            writeInt( -1, output_flag );
        else
            writeInt( ai->trans, output_flag );
    }

    writeVariables( 0, script_h.global_variable_border, output_flag );

    // nested info
    int num_nest = 0;
    NestInfo *info = root_nest_info.next;
    while( info ){
        if      (info->nest_mode == NestInfo::LABEL) num_nest++;
        else if (info->nest_mode == NestInfo::FOR)   num_nest+=4;
        info = info->next;
    }
    writeInt( num_nest, output_flag );
    info = root_nest_info.next;
    while( info ){
        if  (info->nest_mode == NestInfo::LABEL){
            writeInt( script_h.getOffset( info->next_script ), output_flag );
        }
        else if (info->nest_mode == NestInfo::FOR){
            writeInt( info->var_no, output_flag );
            writeInt( info->to, output_flag );
            writeInt( info->step, output_flag );
            writeInt( -script_h.getOffset( info->next_script ), output_flag );
        }
        info = info->next;
    }
    
    writeInt( (monocro_flag)?1:0, output_flag );
    for ( i=0 ; i<3 ; i++ )
        writeInt( monocro_color[2-i], output_flag );
    writeInt( nega_mode, output_flag );

    // sound
    writeStr( midi_file_name, output_flag ); // MIDI file

    writeStr( wave_file_name, output_flag ); // wave, waveloop

    if ( current_cd_track >= 0 ) // play CD
        writeInt( current_cd_track, output_flag );
    else
        writeInt( -1, output_flag );

    writeInt( (midi_play_loop_flag)?1:0, output_flag ); // play, playonce MIDI
    writeInt( (wave_play_loop_flag)?1:0, output_flag ); // wave, waveloop
    writeInt( (cd_play_loop_flag)?1:0, output_flag ); // play, playonce
    writeInt( (music_play_loop_flag)?1:0, output_flag ); // bgm, mp3, mp3loop
    writeInt( (mp3save_flag)?1:0, output_flag );
    if (mp3save_flag)
        writeStr( music_file_name, output_flag );
    else
        writeStr( NULL, output_flag );
    
    writeInt( (erase_text_window_mode>0)?1:0, output_flag );
    writeInt( 1, output_flag );
    
    for ( i=0 ; i<MAX_PARAM_NUM ; i++ ){
        if ( bar_info[i] ){
            writeInt( bar_info[i]->param,      output_flag );
            writeInt( bar_info[i]->orig_pos.x, output_flag );
            writeInt( bar_info[i]->orig_pos.y, output_flag );
            writeInt( bar_info[i]->max_width,  output_flag );
            writeInt( bar_info[i]->orig_pos.h, output_flag );
            writeInt( bar_info[i]->max_param,  output_flag );
            for ( j=0 ; j<3 ; j++ )
                writeChar( bar_info[i]->color[2-j], output_flag );
            writeChar( 0x00, output_flag );
        }
        else{
            writeInt( 0, output_flag );
            writeInt( -1, output_flag );
            writeInt( 0, output_flag );
            writeInt( 0, output_flag );
            writeInt( 0, output_flag );
            writeInt( 0, output_flag );
            writeInt( 0, output_flag );
        }
    }
    
    for ( i=0 ; i<MAX_PARAM_NUM ; i++ ){
        if ( prnum_info[i] ){
            writeInt( prnum_info[i]->param, output_flag );
            writeInt( prnum_info[i]->orig_pos.x, output_flag );
            writeInt( prnum_info[i]->orig_pos.y, output_flag );
            writeInt( prnum_info[i]->font_size_xy[0], output_flag );
            writeInt( prnum_info[i]->font_size_xy[1], output_flag );
            for ( j=0 ; j<3 ; j++ )
                writeChar( prnum_info[i]->color_list[0][2-j], output_flag );
            writeChar( 0x00, output_flag );
        }
        else{
            writeInt( 0, output_flag );
            writeInt( -1, output_flag );
            writeInt( 0, output_flag );
            writeInt( 0, output_flag );
            writeInt( 0, output_flag );
            writeInt( 0, output_flag );
        }
    }

    writeInt( 1, output_flag ); // unidentified (not 1) data in version 205
    writeInt( 0, output_flag );
    writeInt( 1, output_flag );
    writeStr( btndef_info.image_name, output_flag );

    writeArrayVariable(output_flag);
    
    writeInt( 0, output_flag );
    writeChar( (erase_text_window_mode==2)?1:0, output_flag );
    writeChar( 0, output_flag );
    writeChar( 0, output_flag );
    writeChar( 0, output_flag );
    writeStr( loop_bgm_name[0], output_flag );
    writeStr( loop_bgm_name[1], output_flag );

    writeInt( (rubyon_flag)?1:0, output_flag );
    writeInt( ruby_struct.font_size_xy[0], output_flag );
    writeInt( ruby_struct.font_size_xy[1], output_flag );
    writeStr( ruby_struct.font_name, output_flag );
    
    writeInt( 0, output_flag );
    
    for ( i=0 ; i<MAX_SPRITE2_NUM ; i++ ){
        AnimationInfo *ai = &sprite2_info[i];
        writeStr( ai->image_name,  output_flag );
        writeInt( ai->orig_pos.x,  output_flag );
        writeInt( ai->orig_pos.y,  output_flag );
        writeInt( ai->scale_x,     output_flag );
        writeInt( ai->scale_y,     output_flag );
        writeInt( ai->rot,         output_flag );
        writeInt( ai->visible?1:0, output_flag );
        if (ai->trans == 256)
            writeInt( -1, output_flag );
        else
            writeInt( ai->trans, output_flag );
        writeInt( ai->blending_mode, output_flag );
    }

    writeInt( 0, output_flag );
    writeInt( 0, output_flag );
    writeInt( 1, output_flag ); // added in version 205
    writeInt( 0, output_flag );
    writeInt( 0, output_flag );
    writeInt( 0, output_flag );
    writeInt( 0, output_flag );
    writeChar( 0, output_flag ); // added in version 205

    writeInt(   0, output_flag ); // added in version 206
    writeInt( game_height/3,   output_flag ); // added in version 206
    writeInt( game_height*2/3, output_flag ); // added in version 206
    writeInt( game_height,     output_flag ); // added in version 206
    writeInt( underline_value, output_flag ); // changed in version 207
    
    Page *page = current_page;
    int num_page = 0;
    while( page != start_page ){
        page = page->previous;
        num_page++;
    }

    writeInt( num_page, output_flag );
    for ( i=0 ; i<num_page ; i++ ){
        for ( j=0 ; j<page->text_count ; j++ )
            writeChar( page->text[j], output_flag );
        writeChar( 0, output_flag );
        page = page->next;
    }

    page = start_page;
    writeInt(num_page, output_flag);
    for (i=0 ; i<num_page ; i++){
        if (page->tag)
            for ( j=0 ; j<(int)strlen(page->tag) ; j++ )
                writeChar( page->tag[j], output_flag );
        writeChar( 0, output_flag );
        page = page->next;
    }
    
    writeInt( current_label_info.start_line + current_line, output_flag );
    char *buf = script_h.getAddressByLine( current_label_info.start_line + current_line );
    //printf("save %d:%d\n", current_label_info.start_line, current_line);

    i = 0;
    if (!script_h.isText()){
        while( buf != script_h.getCurrent() ){
            if ( *buf == ':' ) i++;
            buf++;
        }
    }
    writeInt( i, output_flag );
}
bool pEnvironmentVariablesManager::save()
{
	return writeVariables( mVariables );
}