int ScriptHandler::openScript(char *path)
{
    if (readScript(path) < 0) return -1;
    readConfiguration();
    variable_data = new VariableData[variable_range];
    return labelScript();
}
int ScriptHandler::readScript(DirPaths *path, const char* prefer_name)
{
    archive_path = path;

    FILE* fp = NULL;
    int n=0, encrypt_mode = 0;
    encoding_t enc = UTF8;

    pstring fname = "";
    while ((fp == NULL) && (n<archive_path->get_num_paths())) {
        script_path = archive_path->get_path(n++);

        if (prefer_name) {
            fname = prefer_name;
        
            // If we don't have a path, add current archive_path.
            if (fname.find(DELIMITER) < 0)
                fname = script_path + fname;
            else {
                n = archive_path->get_num_paths(); //to only check once
                script_path = fname.midstr(0, fname.find(DELIMITER));
                printf("got preferred script_path '%s'\n", (const char*)script_path);
            }
        
            if ((fp = fopen(fname, "rb")) != NULL) {
                pstring lname = fname;
                lname.tolower();
                if (lname.ends_with(".txt")) {
                    enc = CP932;
                }
                else if (lname.ends_with("/nscript.dat")) {
                    enc = CP932;
                    encrypt_mode = 1;
                }
                else if (lname.ends_with("/pscript.dat")) {
                    encrypt_mode = 1;
                }
                else if (lname.ends_with("/nscr_sec.dat")) {
                    enc = CP932;
                    encrypt_mode = 2;
                }
                else if (lname.ends_with(".___")) {
                    enc = CP932;
                    encrypt_mode = 3;
                }
            }
            else {
                fprintf(stderr, "Can't find script named `%s'\n", prefer_name);
                return -1;
            }
        }
        else {
            for (ScriptFilename::iterator ft = script_filenames.begin();
                 ft != script_filenames.end(); ++ft) {
                if ((fp = fileopen(script_path, ft->filename, "rb")) != NULL) {
                    encrypt_mode = ft->encryption;
                    enc = ft->_encoding;
                    break;
                }
            }
        }
    }
    
    if (fp == NULL) {
        PonscripterMessage(Error, "Missing Game Data",
            "No game script found. This application must be run "
            "from a directory containing NScripter, ONScripter, "
            "or Ponscripter game data.");
        return -1;
    }

    if (enc == UTF8) {
        file_encoding = new UTF8Encoding;
        utf_encoding = file_encoding;
        is_ponscripter = true;
    }
    else {
        file_encoding = new CP932Encoding;
        utf_encoding = new UTF8Encoding;
        is_ponscripter = false;
    }
    
    fseek(fp, 0, SEEK_END);
    int estimated_buffer_length = ftell(fp) + 1;

    if (encrypt_mode == 0 && !fname) {
        fclose(fp);
        for (int i = 1; i < 100; i++) {
	    pstring filename;
	    filename.format("%d.%s", i, enc == UTF8 ? "utf" : "txt");
            if ((fp = fileopen(script_path, filename, "rb")) == NULL) {
		filename.format("%02d.%s", i, enc == UTF8 ? "utf" : "txt");
                fp = fileopen(script_path, filename, "rb");
            }

            if (fp) {
                fseek(fp, 0, SEEK_END);
                estimated_buffer_length += ftell(fp) + 1;
                fclose(fp);
            }
        }
    }

    if (raw_script_buffer) delete[] raw_script_buffer;

    char* p_script_buffer = new char[estimated_buffer_length];

    current_script = raw_script_buffer = p_script_buffer;
    tmp_script_buf = new char[TMP_SCRIPT_BUF_LEN];

    if (encrypt_mode > 0 || fname) {
        fseek(fp, 0, SEEK_SET);
        readScriptSub(fp, &p_script_buffer, encrypt_mode);
        fclose(fp);
    }
    else {
        for (int i = 0; i < 100; i++) {
	    pstring filename;
	    filename.format("%d.%s", i, enc == UTF8 ? "utf" : "txt");
            if ((fp = fileopen(script_path, filename, "rb")) == NULL) {
		filename.format("%02d.%s", i, enc == UTF8 ? "utf" : "txt");
                fp = fileopen(script_path, filename, "rb");
            }

            if (fp) {
                readScriptSub(fp, &p_script_buffer, 0, (enc == UTF8));
                fclose(fp);
            }
        }
    }

    delete[] tmp_script_buf;

    script_buffer = raw_script_buffer;

    // Search for gameid file (this overrides any builtin
    // ;gameid directive, or serves its purpose if none is available)
    if (game_identifier.length() == 0) { //Mion: only if gameid not already set
        fp = fileopen(script_path, pstring("game.id"), "rb"); //Mion: search only the script path
        if (fp) {
            size_t line_size = 0;
            char c;
            do {
                c = fgetc(fp);
                ++line_size;
            } while (c != '\r' && c != '\n' && c != EOF);
            fseek(fp, 0, SEEK_SET);
            char *game_id = new char[line_size];
            if (fgets(game_id, line_size, fp) == NULL)
                fputs("Warning: couldn't read game ID from game.id\n", stderr);
            else
                game_identifier = game_id;
            fclose(fp);
            delete[] game_id;
        }
    }

    script_buffer_length = p_script_buffer - script_buffer;

    /* ---------------------------------------- */
    /* screen size and value check */
    const char* buf = script_buffer+1;
    while (script_buffer[0] == ';') {
        if (!strncmp(buf, "mode", 4)) {
            buf += 4;
            if (!strncmp(buf, "800", 3))
                screen_size = SCREEN_SIZE_800x600;
            else if (!strncmp(buf, "400", 3))
                screen_size = SCREEN_SIZE_400x300;
            else if (!strncmp(buf, "320", 3))
                screen_size = SCREEN_SIZE_320x240;
            else
                screen_size = SCREEN_SIZE_640x480;

            buf += 3;
        }
        else if (!strncmp(buf, "value", 5)) {
            buf += 5;
            global_variable_border = 0;
            while (*buf >= '0' && *buf <= '9')
                global_variable_border = global_variable_border * 10
		                       + *buf++ - '0';
        }
        else if (!strncmp(buf, "-*-", 3)) {
            buf++;
            while (*buf != '\n' &&
                   !(*buf == '-' && buf[1] == '*' && buf[2] == '-'))
                buf++;
            if (*buf != '\n') buf += 3;
        }
        else {
            break;
        }

        if (*buf != ',') {
            while (*buf++ != '\n') ;
            break;
        }

        ++buf;
        while (isawspace(*buf)) ++buf;
    }

    // game ID check
    if ((*buf++ == ';') && (game_identifier.length() == 0))  {
        while (isawspace(*buf)) ++buf;
        if (!strncmp(buf, "gameid ", 7)) {
            buf += 7;
            int i = 0;
            while (buf[i++] >= ' ') ;
            game_identifier = pstring(buf, i - 1);
            buf += i;
        }
    }

    return labelScript();
}
Esempio n. 3
0
int ScriptHandler::readScript( char *path )
{
    archive_path = new char[ strlen(path) + 1 ];
    strcpy( archive_path, path );

    FILE *fp = NULL;
    char filename[10];
    int i, encrypt_mode = 0;
    if ((fp = fopen("0.txt", "rb")) != NULL){
        encrypt_mode = 0;
    }
    else if ((fp = fopen("00.txt", "rb")) != NULL){
        encrypt_mode = 0;
    }
    else if ((fp = fopen("nscr_sec.dat", "rb")) != NULL){
        encrypt_mode = 2;
    }
    else if ((fp = fopen("nscript.___", "rb")) != NULL){
        encrypt_mode = 3;
    }
    else if ((fp = fopen("nscript.dat", "rb")) != NULL){
        encrypt_mode = 1;
    }

    if (fp == NULL){
        fprintf( stderr, "can't open any of 0.txt, 00.txt, nscript.dat and nscript.___\n" );
        return -1;
    }
    
    fseek( fp, 0, SEEK_END );
    int estimated_buffer_length = ftell( fp ) + 1;

    if (encrypt_mode == 0){
        fclose(fp);
        for (i=1 ; i<100 ; i++){
            sprintf(filename, "%d.txt", i);
            if ((fp = fopen(filename, "rb")) == NULL){
                sprintf(filename, "%02d.txt", i);
                fp = fopen(filename, "rb");
            }
            if (fp){
                fseek( fp, 0, SEEK_END );
                estimated_buffer_length += ftell(fp)+1;
                fclose(fp);
            }
        }
    }

    if ( script_buffer ) delete[] script_buffer;
    script_buffer = new char[ estimated_buffer_length ];

    char *p_script_buffer;
    current_script = p_script_buffer = script_buffer;
    
    tmp_script_buf = new char[TMP_SCRIPT_BUF_LEN];
    if (encrypt_mode > 0){
        fseek( fp, 0, SEEK_SET );
        readScriptSub( fp, &p_script_buffer, encrypt_mode );
        fclose( fp );
    }
    else{
        for (i=0 ; i<100 ; i++){
            sprintf(filename, "%d.txt", i);
            if ((fp = fopen(filename, "rb")) == NULL){
                sprintf(filename, "%02d.txt", i);
                fp = fopen(filename, "rb");
            }
            if (fp){
                readScriptSub( fp, &p_script_buffer, 0 );
                fclose(fp);
            }
        }
    }
    delete[] tmp_script_buf;

    script_buffer_length = p_script_buffer - script_buffer;
    
    /* ---------------------------------------- */
    /* screen size and value check */
    char *buf = script_buffer+1;
    while( script_buffer[0] == ';' ){
        if ( !strncmp( buf, "mode", 4 ) ){
            buf += 4;
            if      ( !strncmp( buf, "800", 3 ) )
                screen_size = SCREEN_SIZE_800x600;
            else if ( !strncmp( buf, "400", 3 ) )
                screen_size = SCREEN_SIZE_400x300;
            else if ( !strncmp( buf, "320", 3 ) )
                screen_size = SCREEN_SIZE_320x240;
            else
                screen_size = SCREEN_SIZE_640x480;
            buf += 3;
        }
        else if ( !strncmp( buf, "value", 5 ) ){
            buf += 5;
            SKIP_SPACE(buf);
            global_variable_border = 0;
            while ( *buf >= '0' && *buf <= '9' )
                global_variable_border = global_variable_border * 10 + *buf++ - '0';
        }
        else{
            break;
        }
        if ( *buf != ',' ) break;
        buf++;
    }

    return labelScript();
}