|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 5456 (0x1550) Types: TextFile Names: »specials.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Adv/Compiler/specials.c«
#include "advgen.h" static wordlist def_go = { 5, { "go", "run", "walk", "move", "enter" } }; static wordlist def_get = { 4, { "get", "take", "pick", "remove" } }; static wordlist def_drop = { 3, { "drop", "release", "leave" } }; static wordlist go_list; static wordlist get_list; static wordlist drop_list; static wordlist *cur_list; static void badzero(s) char *s; { gramerror(1, "warning: invalid zero value for %s ignored", s); } static int tottrs = 0; void add_treasure() { tottrs++; } static char *hellname = CNULL; static int hellroom; void set_hell(s) char *s; { if (hellname != CNULL) { muldef("hell"); } hellname = s; } static char *dirs[6] = { "North", "South", "East", "West", "Up", "Down" }; static bool dirs_set = FALSE; void set_dirs(n, s, e, w, u, d) char *n; char *s; char *e; char *w; char *u; char *d; { if (dirs_set) { muldef("direction names"); } dirs_set = TRUE; dirs[0] = n; dirs[1] = s; dirs[2] = e; dirs[3] = w; dirs[4] = u; dirs[5] = d; } void init_nouns() { static bool initted = FALSE; char *shortname = "?"; int d; if (initted) { return; } initted = TRUE; set_nouns(); for (d=0; d<6; d++) { addsym(dirs[d], 1); shortname[0] = dirs[d][0]; addsym(strsave(shortname), 0); } } void init_verbs() { static bool initted = FALSE; void add_list(); if (initted) { return; } initted = TRUE; set_verbs(); add_list(&go_list, &def_go); add_list(&get_list, &def_get); add_list(&drop_list, &def_drop); } static bool greeting_set = FALSE; void set_greeting(s) char *s; { if (greeting_set) { muldef("greeting message"); } greeting_set = TRUE; greetmsg(s); } static char *lampname = CNULL; static int lamp; void set_lamp(s) char *s; { if (lampname != CNULL) { muldef("lamp name"); } lampname = s; } int wsize = 0; /* Referenced as extern elsewhere */ void set_wsize(n) int n; { if (n == 0) { badzero("wordsize"); return; } else if (n > MAXWSIZE) { gramerror(FALSE, "warning - unreasonable wordsize (> %d)", MAXWSIZE); } if (wsize != 0) { muldef("wordsize"); } wsize = n; } static char *startname = CNULL; static int startroom; void set_start(s) char *s; { if (startname != CNULL) { muldef("start room"); } startname = s; } static char *trsname = CNULL; static int trsroom; void set_treasury(s) char *s; { if (trsname != CNULL) { muldef("treasury room"); } trsname = s; } static int invsize = 0; void set_inventory(n) int n; { if (n == 0) { badzero("inventory size"); return; } else if (n > MAXINVSIZE) { gramerror(FALSE, "warning - unreasonable inventory size (> %d)", MAXINVSIZE); } if (invsize != 0) { muldef("inventory size"); } invsize = n; } static int lamplife = 0; void set_llife(n) int n; { if (n == 0) { badzero("lamp life"); return; } if (lamplife != 0) { muldef("lamplife"); } lamplife = n; } static int lampwarn = 0; void set_lwarn(n) int n; { if (n == 0) { badzero("lamp warning"); return; } if (lampwarn != 0) { muldef("lamp warning"); } lampwarn = n; } void set_go_list() { cur_list = &go_list; } void set_get_list() { cur_list = &get_list; } void set_drop_list() { cur_list = &drop_list; } void addspecialword(s) char *s; { if (cur_list->wl_count == MAXWORDLIST) { gramerror(FALSE, "warning: too many synonyms for %s", cur_list->wl_word[0]); } cur_list->wl_word[cur_list->wl_count++] = s; } static void add_list(list, deflt) wordlist *list; wordlist *deflt; { wordlist *wl = list->wl_count ? list : deflt; int i; addsym(wl->wl_word[0], 1); for (i=1; i<wl->wl_count; i++) { addsym(wl->wl_word[i], 0); } } void checkspecials() { hellroom = val(hellname, S_ROOM, "hell room"); lamp = val(lampname, S_ITEM, "lamp"); startroom= val(startname,S_ROOM, "start room"); trsroom = val(trsname, S_ROOM, "treasury"); if (startname == CNULL) { gramerror(FALSE, "warning - no start room defined"); startroom = firstroom(); } if (trsname == CNULL) { gramerror(FALSE, "warning - no treasure room defined"); trsroom = firstroom(); } if (tottrs == 0) { gramerror(FALSE, "warning - no treasures among items"); } } static int val(name, type, title) char *name; int type; char *title; { symbol *s; if (name == CNULL) { return 0; } s = lookup(name); if (s->s_type != type) { gramerror(FALSE, "%s - %s is undeclared", title, name); add_error(); } return s->s_value; } void printspecials(f) FILE *f; { if (hellname != CNULL) { fprintf(f, "!h%d\n", hellroom); } if (wsize == 0) { wsize = DEFWORDSIZE; } else { fprintf(f, "!w%d\n", wsize); } if (dirs_set) { fprintf(f, "!d%s %s %s %s %s %s\n", dirs[0], dirs[1], dirs[2], dirs[3], dirs[4], dirs[5]); } if (lampname != CNULL) { fprintf(f, "!l%d\n", lamp); } fprintf(f, "%d\n%d\n%d\n%d\n%d\n%d\n", startroom, trsroom, tottrs, invsize == 0 ? DEFINVSIZE : invsize, lamplife == 0 ? DEFLLIFE : lamplife, lampwarn == 0 ? DEFLWARN : lampwarn); }