static int parse_sounds(char* raw, song_t* parsed_songs) { uint8_t current_song = 0; char *start_song = raw; while (*raw != 0) { if (*raw == ';') { *raw = 0; parse_sound(start_song, &parsed_songs[current_song]); start_song = raw+1; current_song++; } raw++; } return current_song; }
void parse_ssm(const char *filename) { char weapon_name[NAME_LENGTH]; try { read_file_text(filename, CF_TYPE_TABLES); reset_parse(); // parse the table while(required_string_either("#end", "$SSM:")) { required_string("$SSM:"); ssm_info s; int string_index; // name stuff_string(s.name, F_NAME, NAME_LENGTH); if (*s.name == 0) { sprintf(s.name, "SSM " SIZE_T_ARG, Ssm_info.size()); mprintf(("Found an SSM entry without a name. Assigning \"%s\".\n", s.name)); } // stuff data required_string("+Weapon:"); stuff_string(weapon_name, F_NAME, NAME_LENGTH); string_index = optional_string_either("+Count:", "+Min Count:"); if (string_index == 0) { stuff_int(&s.count); s.max_count = -1; } else if (string_index == 1) { stuff_int(&s.count); required_string("+Max Count:"); stuff_int(&s.max_count); } else { s.count = 1; s.max_count = -1; } required_string("+WarpRadius:"); stuff_float(&s.warp_radius); if (optional_string("+WarpTime:")) { stuff_float(&s.warp_time); // According to fireballs.cpp, "Warp lifetime must be at least 4 seconds!" if ( (s.warp_time) < 4.0f) { // So let's warn them before they try to use it, shall we? Warning(LOCATION, "Expected a '+WarpTime:' value equal or greater than 4.0, found '%f' in weapon '%s'.\n Setting to 4.0, please check and set to a number 4.0 or greater!\n", s.warp_time, weapon_name); // And then make the Assert obsolete -- Zacam s.warp_time = 4.0f; } } else { s.warp_time = 4.0f; } string_index = required_string_either("+Radius:", "+Min Radius:"); if (string_index == 0) { required_string("+Radius:"); stuff_float(&s.radius); s.max_radius = -1.0f; } else { required_string("+Min Radius:"); stuff_float(&s.radius); required_string("+Max Radius:"); stuff_float(&s.max_radius); } string_index = optional_string_either("+Offset:", "+Min Offset:"); if (string_index == 0) { stuff_float(&s.offset); s.max_offset = -1.0f; } else if (string_index == 1) { stuff_float(&s.offset); required_string("+Max Offset:"); stuff_float(&s.max_offset); } else { s.offset = 0.0f; s.max_offset = -1.0f; } if (optional_string("+Shape:")) { switch(required_string_one_of(3, "Point", "Circle", "Sphere")) { case 0: required_string("Point"); s.shape = SSM_SHAPE_POINT; break; case 1: required_string("Circle"); case -1: // If we're ignoring parse errors and can't identify the shape, go with a circle. s.shape = SSM_SHAPE_CIRCLE; break; case 2: required_string("Sphere"); s.shape = SSM_SHAPE_SPHERE; break; default: Assertion(false, "Impossible return value from required_string_one_of(); get a coder!\n"); } } else { s.shape = SSM_SHAPE_CIRCLE; } if (optional_string("+HUD Message:")) stuff_boolean(&s.send_message); else s.send_message = true; if (optional_string("+Custom Message:")) { stuff_string(s.message, F_NAME, NAME_LENGTH); s.use_custom_message = true; } s.sound_index = -1; parse_sound("+Alarm Sound:", &s.sound_index, s.name); // see if we have a valid weapon s.weapon_info_index = weapon_info_lookup(weapon_name); if(s.weapon_info_index >= 0) { // valid int existing = ssm_info_lookup(s.name); if (existing >= 0) { // Redefined the existing entry instead of adding a duplicate. Ssm_info[existing] = s; } else { Ssm_info.push_back(s); } } } } catch (const parse::ParseException& e) { mprintf(("TABLES: Unable to parse '%s'! Error message = %s.\n", filename, e.what())); return; } }