void ONScripterLabel::parseTaggedString( AnimationInfo *anim ) { if (anim->image_name == NULL) return; anim->removeTag(); int i; char *buffer = anim->image_name; anim->num_of_cells = 1; anim->trans_mode = trans_mode; if ( buffer[0] == ':' ){ while (*++buffer == ' '); if ( buffer[0] == 'a' ){ anim->trans_mode = AnimationInfo::TRANS_ALPHA; buffer++; } else if ( buffer[0] == 'l' ){ anim->trans_mode = AnimationInfo::TRANS_TOPLEFT; buffer++; } else if ( buffer[0] == 'r' ){ anim->trans_mode = AnimationInfo::TRANS_TOPRIGHT; buffer++; } else if ( buffer[0] == 'c' ){ anim->trans_mode = AnimationInfo::TRANS_COPY; buffer++; } else if ( buffer[0] == 's' ){ anim->trans_mode = AnimationInfo::TRANS_STRING; buffer++; anim->num_of_cells = 0; if ( *buffer == '/' ){ buffer++; script_h.getNext(); script_h.pushCurrent( buffer ); anim->font_size_xy[0] = script_h.readInt(); anim->font_size_xy[1] = script_h.readInt(); anim->font_pitch = script_h.readInt() + anim->font_size_xy[0]; if ( script_h.getEndStatus() & ScriptHandler::END_COMMA ){ script_h.readInt(); // 0 ... normal, 1 ... no anti-aliasing, 2 ... Fukuro } buffer = script_h.getNext(); script_h.popCurrent(); } else{ anim->font_size_xy[0] = sentence_font.font_size_xy[0]; anim->font_size_xy[1] = sentence_font.font_size_xy[1]; anim->font_pitch = sentence_font.pitch_xy[0]; } while(buffer[0] != '#' && buffer[0] != '\0') buffer++; i=0; while( buffer[i] == '#' ){ anim->num_of_cells++; i += 7; } anim->color_list = new uchar3[ anim->num_of_cells ]; for ( i=0 ; i<anim->num_of_cells ; i++ ){ readColor( &anim->color_list[i], buffer ); buffer += 7; } } else if ( buffer[0] == 'm' ){ anim->trans_mode = AnimationInfo::TRANS_MASK; char *start = ++buffer; while(buffer[0] != ';' && buffer[0] != 0x0a && buffer[0] != '\0') buffer++; if (buffer[0] == ';') setStr( &anim->mask_file_name, start, buffer-start ); } else if ( buffer[0] == '#' ){ anim->trans_mode = AnimationInfo::TRANS_DIRECT; readColor( &anim->direct_color, buffer ); buffer += 7; } else if ( buffer[0] == '!' ){ anim->trans_mode = AnimationInfo::TRANS_PALLET; buffer++; anim->pallet_number = getNumberFromBuffer( (const char**)&buffer ); } if (anim->trans_mode != AnimationInfo::TRANS_STRING) while(buffer[0] != '/' && buffer[0] != ';' && buffer[0] != '\0') buffer++; } if ( buffer[0] == '/' ){ buffer++; anim->num_of_cells = getNumberFromBuffer( (const char**)&buffer ); buffer++; if ( anim->num_of_cells == 0 ){ fprintf( stderr, "ONScripterLabel::parseTaggedString The number of cells is 0\n"); return; } anim->duration_list = new int[ anim->num_of_cells ]; if ( *buffer == '<' ){ buffer++; for ( i=0 ; i<anim->num_of_cells ; i++ ){ anim->duration_list[i] = getNumberFromBuffer( (const char**)&buffer ); buffer++; } buffer++; // skip '>' } else{ anim->duration_list[0] = getNumberFromBuffer( (const char**)&buffer ); for ( i=1 ; i<anim->num_of_cells ; i++ ) anim->duration_list[i] = anim->duration_list[0]; buffer++; } anim->loop_mode = *buffer++ - '0'; // 3...no animation if ( anim->loop_mode != 3 ) anim->is_animatable = true; while(buffer[0] != ';' && buffer[0] != '\0') buffer++; } if ( buffer[0] == ';' ) buffer++; if ( anim->trans_mode == AnimationInfo::TRANS_STRING && buffer[0] == '$' ){ script_h.pushCurrent( buffer ); setStr( &anim->file_name, script_h.readStr() ); script_h.popCurrent(); } else{ setStr( &anim->file_name, buffer ); } }
void ONScripter::parseTaggedString( AnimationInfo *anim ) { if (anim->image_name == NULL) return; anim->removeTag(); int i; char *buffer = anim->image_name; anim->num_of_cells = 1; anim->trans_mode = trans_mode; // Scan text to remove spaces in color format // For some reason some custom games have spaces in the color format // for example: '#XXX XXX'. This causes the game to crash. The following // checks and removes the space by copying to another buffer char correctedBuffer[512]; char* ptr = correctedBuffer; while (*buffer != '\0') { *ptr++ = *buffer; if (*buffer == '#') { int i = 0; buffer++; while(*buffer != '\0' && i < 7) { if (*buffer != ' ') { *ptr++ = *buffer; i++; } buffer++; } } else { buffer++; } } *ptr = '\0'; buffer = correctedBuffer; if ( buffer[0] == ':' ){ while (*++buffer == ' '); if ( buffer[0] == 'a' ){ anim->trans_mode = AnimationInfo::TRANS_ALPHA; buffer++; } else if ( buffer[0] == 'l' ){ anim->trans_mode = AnimationInfo::TRANS_TOPLEFT; buffer++; } else if ( buffer[0] == 'r' ){ anim->trans_mode = AnimationInfo::TRANS_TOPRIGHT; buffer++; } else if ( buffer[0] == 'c' ){ anim->trans_mode = AnimationInfo::TRANS_COPY; buffer++; } else if ( buffer[0] == 's' ){ anim->trans_mode = AnimationInfo::TRANS_STRING; buffer++; anim->num_of_cells = 0; if ( *buffer == '/' ){ buffer++; script_h.getNext(); script_h.pushCurrent( buffer ); anim->font_size_xy[0] = script_h.readInt(); anim->font_size_xy[1] = script_h.readInt(); anim->font_pitch[0] = anim->font_size_xy[0]; anim->font_pitch[1] = anim->font_size_xy[0]; // dummy if ( script_h.getEndStatus() & ScriptHandler::END_COMMA ){ anim->font_pitch[0] += script_h.readInt(); if ( script_h.getEndStatus() & ScriptHandler::END_COMMA ){ script_h.readInt(); // 0 ... normal, 1 ... no anti-aliasing, 2 ... Fukuro } } buffer = script_h.getNext(); script_h.popCurrent(); } else{ anim->font_size_xy[0] = sentence_font.font_size_xy[0]; anim->font_size_xy[1] = sentence_font.font_size_xy[1]; anim->font_pitch[0] = sentence_font.pitch_xy[0]; anim->font_pitch[1] = sentence_font.pitch_xy[1]; } while(buffer[0] != '#' && buffer[0] != '\0') buffer++; i=0; while( buffer[i] == '#' ){ anim->num_of_cells++; i += 7; } anim->color_list = new uchar3[ anim->num_of_cells ]; for ( i=0 ; i<anim->num_of_cells ; i++ ){ readColor( &anim->color_list[i], buffer ); buffer += 7; } } else if ( buffer[0] == 'm' ){ anim->trans_mode = AnimationInfo::TRANS_MASK; char *start = ++buffer; while(buffer[0] != ';' && buffer[0] != 0x0a && buffer[0] != '\0') buffer++; if (buffer[0] == ';') setStr( &anim->mask_file_name, start, buffer-start ); } else if ( buffer[0] == '#' ){ anim->trans_mode = AnimationInfo::TRANS_DIRECT; readColor( &anim->direct_color, buffer ); buffer += 7; } else if ( buffer[0] == '!' ){ anim->trans_mode = AnimationInfo::TRANS_PALLETTE; buffer++; anim->pallette_number = getNumberFromBuffer( (const char**)&buffer ); } if (anim->trans_mode != AnimationInfo::TRANS_STRING) while(buffer[0] != '/' && buffer[0] != ';' && buffer[0] != '\0') buffer++; } if ( buffer[0] == '/' && anim->trans_mode != AnimationInfo::TRANS_STRING){ buffer++; anim->num_of_cells = getNumberFromBuffer( (const char**)&buffer ); if ( anim->num_of_cells == 0 ){ logw( stderr, "ONScripter::parseTaggedString The number of cells is 0\n"); return; } anim->duration_list = new int[ anim->num_of_cells ]; if (*buffer == ','){ buffer++; if ( *buffer == '<' ){ buffer++; for ( i=0 ; i<anim->num_of_cells ; i++ ){ anim->duration_list[i] = getNumberFromBuffer( (const char**)&buffer ); buffer++; } } else{ anim->duration_list[0] = getNumberFromBuffer( (const char**)&buffer ); for ( i=1 ; i<anim->num_of_cells ; i++ ) anim->duration_list[i] = anim->duration_list[0]; } anim->remaining_time = anim->duration_list[0]; buffer++; anim->loop_mode = *buffer++ - '0'; // 3...no animation } else{ for ( i=0 ; i<anim->num_of_cells ; i++ ) anim->duration_list[0] = 0; anim->loop_mode = 3; // 3...no animation } if ( anim->loop_mode != 3 ) anim->is_animatable = true; while(buffer[0] != ';' && buffer[0] != '\0') buffer++; } if ( buffer[0] == ';' && anim->trans_mode != AnimationInfo::TRANS_STRING) buffer++; if ( anim->trans_mode == AnimationInfo::TRANS_STRING && buffer[0] == '$' ){ script_h.pushCurrent( buffer ); setStr( &anim->file_name, script_h.readStr() ); script_h.popCurrent(); } else{ setStr( &anim->file_name, buffer ); } }