/** ** GM: TERRAFORM <x> <y> <terrain> ** requires: permission-key "gmterf" **/ static void gm_terraform(const void *tnext, struct unit *u, struct order *ord) { const struct plane *p = rplane(u->region); int x = rel_to_abs(p, u->faction, getint(), 0); int y = rel_to_abs(p, u->faction, getint(), 1); const char *c = getstrtoken(); variant token; void **tokens = get_translations(u->faction->locale, UT_TERRAINS); region *r; pnormalize(&x, &y, p); r = findregion(x, y); if (r == NULL || p != rplane(r)) { mistake(u, ord, "region is in another plane."); return; } else { /* checking permissions */ attrib *permissions = a_find(u->faction->attribs, &at_permissions); if (!permissions || !has_permission(permissions, atoi36("gmterf"))) return; } if (findtoken(*tokens, c, &token) != E_TOK_NOMATCH) { const terrain_type *terrain = (const terrain_type *)token.v; terraform_region(r, terrain); } }
magic_t getmagicskill(const struct locale * lang) { void **tokens = get_translations(lang, UT_MAGIC); variant token; const char *s = getstrtoken(); if (tokens && s && s[0]) { if (findtoken(*tokens, s, &token) == E_TOK_SUCCESS) { return (magic_t)token.i; } else { char buffer[8]; buffer[0] = s[0]; buffer[1] = s[1]; buffer[2] = '\0'; if (findtoken(*tokens, buffer, &token) == E_TOK_SUCCESS) { return (magic_t)token.i; } } } return M_NONE; }
skill_t get_skill(const char *s, const struct locale * lang) { skill_t result = NOSKILL; char buffer[64]; if (s) { char * str = transliterate(buffer, sizeof(buffer) - sizeof(int), s); if (str) { int i; const void * match; void **tokens = get_translations(lang, UT_SKILLS); struct critbit_tree *cb = (critbit_tree *)*tokens; if (cb && cb_find_prefix(cb, str, strlen(str), &match, 1, 0)) { cb_get_kv(match, &i, sizeof(int)); result = (skill_t)i; } } else { log_warning("could not transliterate skill: %s", s); } } return result; }
void register_special_direction(struct locale *lang, const char *name) { const char *token = locale_string(lang, name, false); if (token) { void **tokens = get_translations(lang, UT_SPECDIR); variant var; char *str = strdup(name); var.v = str; addtoken((struct tnode **)tokens, token, var); if (lang == locales) { dir_lookup *dl = malloc(sizeof(dir_lookup)); dl->name = str; dl->oldname = token; dl->next = dir_name_lookup; dir_name_lookup = dl; } } else { log_debug("no translation for spec_direction '%s' in locale '%s'\n", name, locale_name(lang)); } }
void init_keyword(const struct locale *lang, keyword_t kwd, const char *str) { void **tokens = get_translations(lang, UT_KEYWORDS); struct critbit_tree **cb = (critbit_tree **)tokens; add_translation(cb, str, (int)kwd); }
void init_skill(const struct locale *lang, skill_t kwd, const char *str) { void **tokens = get_translations(lang, UT_SKILLS); struct critbit_tree **cb = (critbit_tree **)tokens; add_translation(cb, str, (int)kwd); }