static enum parser_error parse_r_s(struct parser *p) { struct monster_race *r = parser_priv(p); char *flags; char *s; int pct; int ret = PARSE_ERROR_NONE; if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; flags = string_make(parser_getstr(p, "spells")); s = strtok(flags, " |"); while (s) { if (1 == sscanf(s, "1_IN_%d", &pct)) { if (pct < 1 || pct > 100) { ret = PARSE_ERROR_INVALID_SPELL_FREQ; break; } r->freq_spell = 100 / pct; r->freq_innate = r->freq_spell; } else { if (grab_flag(r->spell_flags, RSF_SIZE, r_info_spell_flags, s)) { ret = PARSE_ERROR_INVALID_FLAG; break; } } s = strtok(NULL, " |"); } /* Add the "base monster" flags to the monster */ if (r->base) rsf_union(r->spell_flags, r->base->spell_flags); mem_free(flags); return ret; }
static enum parser_error parse_rb_s(struct parser *p) { struct monster_base *rb = parser_priv(p); char *flags; char *s; if (!rb) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "spells")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "spells")); s = strtok(flags, " |"); while (s) { if (grab_flag(rb->spell_flags, RSF_SIZE, r_info_spell_flags, s)) { mem_free(flags); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; }
static enum parser_error parse_r_f(struct parser *p) { struct monster_race *r = parser_priv(p); char *flags; char *s; if (!r) return PARSE_ERROR_MISSING_RECORD_HEADER; if (!parser_hasval(p, "flags")) return PARSE_ERROR_NONE; flags = string_make(parser_getstr(p, "flags")); s = strtok(flags, " |"); while (s) { if (grab_flag(r->flags, RF_SIZE, r_info_flags, s)) { mem_free(flags); quit_fmt("bad f2-flag: %s", s); return PARSE_ERROR_INVALID_FLAG; } s = strtok(NULL, " |"); } mem_free(flags); return PARSE_ERROR_NONE; }