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(); }
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(); }