forked from github/server
parsing von LEHRE vereinfacht, parser_end() Befehl prüft ob letzte Einheit geparsed.
This commit is contained in:
parent
ed99053282
commit
48b597e972
3 changed files with 24 additions and 36 deletions
|
@ -243,7 +243,6 @@ teach(unit * u, struct order * ord)
|
||||||
region * r = u->region;
|
region * r = u->region;
|
||||||
int teaching, i, j, count, academy=0;
|
int teaching, i, j, count, academy=0;
|
||||||
unit *u2;
|
unit *u2;
|
||||||
const char *s;
|
|
||||||
skill_t sk = NOSKILL;
|
skill_t sk = NOSKILL;
|
||||||
|
|
||||||
if ((u->race->flags & RCF_NOTEACH) || fval(u, UFL_WERE)) {
|
if ((u->race->flags & RCF_NOTEACH) || fval(u, UFL_WERE)) {
|
||||||
|
@ -340,69 +339,50 @@ teach(unit * u, struct order * ord)
|
||||||
skip_token();
|
skip_token();
|
||||||
|
|
||||||
strcpy(zOrder, locale_string(u->faction->locale, keywords[K_TEACH]));
|
strcpy(zOrder, locale_string(u->faction->locale, keywords[K_TEACH]));
|
||||||
for (;;) {
|
|
||||||
|
|
||||||
u2 = getunit(r, u->faction);
|
while (!parser_end()) {
|
||||||
|
unit * u2 = getunit(r, u->faction);
|
||||||
|
++count;
|
||||||
|
|
||||||
/* Falls keine Unit gefunden, abbrechen - außer es gibt überhaupt keine
|
/* Falls die Unit nicht gefunden wird, Fehler melden */
|
||||||
* Unit, dann gibt es zusätzlich noch einen Fehler */
|
|
||||||
|
|
||||||
if (!u2) {
|
if (!u2) {
|
||||||
|
const char * token;
|
||||||
/* Finde den string, der den Fehler verursacht hat */
|
/* Finde den string, der den Fehler verursacht hat */
|
||||||
parser_pushstate();
|
parser_pushstate();
|
||||||
init_tokens(ord);
|
init_tokens(ord);
|
||||||
skip_token();
|
skip_token();
|
||||||
for (j = count; j; j--) {
|
|
||||||
|
for (j=0; j!=count-1; ++j) {
|
||||||
/* skip over the first 'count' units */
|
/* skip over the first 'count' units */
|
||||||
getunit(r, u->faction);
|
getunit(r, u->faction);
|
||||||
}
|
}
|
||||||
|
|
||||||
s = getstrtoken();
|
token = getstrtoken();
|
||||||
|
|
||||||
if (!s[0]) {
|
|
||||||
/* Falls es keinen String gibt, ist einfach nur die Liste der Einheiten
|
|
||||||
* zu ende. dann raus hier */
|
|
||||||
parser_popstate();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Beginne die Fehlermeldung */
|
/* Beginne die Fehlermeldung */
|
||||||
|
|
||||||
strcpy(buf, "Die Einheit '");
|
strcpy(buf, "Die Einheit '");
|
||||||
|
|
||||||
if (findparam(s, u->faction->locale) == P_TEMP) {
|
if (findparam(token, u->faction->locale) == P_TEMP) {
|
||||||
/* Für: "Die Einheit 'TEMP ZET' wurde nicht gefunden" oder "Die Einheit
|
/* Für: "Die Einheit 'TEMP ZET' wurde nicht gefunden" oder "Die Einheit
|
||||||
* 'TEMP' wurde nicht gefunden" */
|
* 'TEMP' wurde nicht gefunden" */
|
||||||
|
scat(token);
|
||||||
scat(s);
|
token = getstrtoken();
|
||||||
s = getstrtoken();
|
if (*token) scat(" ");
|
||||||
if (s[0])
|
|
||||||
scat(" ");
|
|
||||||
|
|
||||||
/* count++; -- unnötig/alt? Um nachher weiter einlesen zu koennen */
|
|
||||||
|
|
||||||
}
|
}
|
||||||
scat(s);
|
scat(token);
|
||||||
scat("' wurde nicht gefunden");
|
scat("' wurde nicht gefunden");
|
||||||
mistake(u, ord, buf, MSG_EVENT);
|
mistake(u, ord, buf, MSG_EVENT);
|
||||||
|
|
||||||
count++;
|
|
||||||
parser_popstate();
|
parser_popstate();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
/* Defaultorder zusammenbauen. TEMP-Einheiten werden automatisch in
|
|
||||||
|
/* Neuen Befehl zusammenbauen. TEMP-Einheiten werden automatisch in
|
||||||
* ihre neuen Nummern übersetzt. */
|
* ihre neuen Nummern übersetzt. */
|
||||||
strcat(zOrder, " ");
|
strcat(zOrder, " ");
|
||||||
strcat(zOrder, unitid(u2));
|
strcat(zOrder, unitid(u2));
|
||||||
|
|
||||||
/* Wir müssen nun hochzählen, wieviele Einheiten wir schon abgearbeitet
|
|
||||||
* haben, damit mit getstrtoken() die richtige Einheit geholt werden kann.
|
|
||||||
* Falls u2 ein Alias hat, ist sie neu, und es wurde ein TEMP verwendet, um
|
|
||||||
* sie zu beschreiben. */
|
|
||||||
|
|
||||||
count++;
|
|
||||||
|
|
||||||
if (get_keyword(u2->thisorder) != K_STUDY) {
|
if (get_keyword(u2->thisorder) != K_STUDY) {
|
||||||
add_message(&u->faction->msgs,
|
add_message(&u->faction->msgs,
|
||||||
msg_feedback(u, ord, "teach_nolearn", "student", u2));
|
msg_feedback(u, ord, "teach_nolearn", "student", u2));
|
||||||
|
|
|
@ -1303,6 +1303,13 @@ parser_popstate(void)
|
||||||
state = new_state;
|
state = new_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean
|
||||||
|
parser_end(void)
|
||||||
|
{
|
||||||
|
while (isspace(*state->current_token)) ++state->current_token;
|
||||||
|
return *state->current_token == NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
skip_token(void)
|
skip_token(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -947,6 +947,7 @@ extern void skip_token(void);
|
||||||
extern const char * parse_token(const char ** str);
|
extern const char * parse_token(const char ** str);
|
||||||
extern void parser_pushstate(void);
|
extern void parser_pushstate(void);
|
||||||
extern void parser_popstate(void);
|
extern void parser_popstate(void);
|
||||||
|
extern boolean parser_end(void);
|
||||||
|
|
||||||
extern skill_t findskill(const char *s, const struct locale * lang);
|
extern skill_t findskill(const char *s, const struct locale * lang);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue