int rc_skillmod(const struct race *rc, const region * r, skill_t sk) { int mods = 0; if (!skill_enabled(sk)) { return 0; } #ifdef FASTER_SKILLMOD unsigned int index = hashstring(rc->_name) % RCMODMAXHASH; struct skillmods **imods = &modhash[index]; while (*imods && (*imods)->race != rc) { imods = &(*imods)->next; } if (*imods == NULL) { *imods = init_skills(rc); } mods = (*imods)->mod[rterrain(r)].value[sk]; #else if (r) { mods = skill_mod(rc, sk, r->terrain); } #endif if (rc == get_race(RC_ELF) && r && r_isforest(r)) { if (sk == SK_PERCEPTION || sk == SK_STEALTH) { ++mods; } else if (sk == SK_TACTICS) { mods += 2; } } return mods; }
static void init_volcano(void) { building *b; region *r = arena_center; assert(arena_center); if (rterrain(r) != T_DESERT) return; /* been done before */ terraform(arena_center, T_VOLCANO_SMOKING); b = new_building(bt_find("caldera"), r, NULL); b->size = 1; b->name = _strdup("Igjarjuk's Schlund"); b->display = _strdup ("Feurige Lava fließt aus dem Krater des großen Vulkans. Alles wird von ihr verschlungen."); add_trigger(&b->attribs, "timer", trigger_caldera(b)); tt_register(&tt_caldera); }
static void guardian_faction(plane * pl, int id) { region *r; faction *f = findfaction(id); if (!f) { f = calloc(1, sizeof(faction)); f->banner = _strdup("Sie dienen dem großen Wyrm"); f->passw = _strdup(itoa36(rng_int())); set_email(&f->email, "*****@*****.**"); f->name = _strdup("Igjarjuks Kundschafter"); f->race = new_race[RC_ILLUSION]; f->age = turn; f->locale = find_locale("de"); f->options = want(O_COMPRESS) | want(O_REPORT) | want(O_COMPUTER) | want(O_ADRESSEN) | want(O_DEBUG); f->no = id; addlist(&factions, f); fhash(f); } if (f->race != new_race[RC_ILLUSION]) { assert(!"guardian id vergeben"); exit(0); } f->lastorders = turn; f->alive = true; for (r = regions; r; r = r->next) if (getplane(r) == pl && rterrain(r) != T_FIREWALL) { unit *u; freset(r, RF_ENCOUNTER); for (u = r->units; u; u = u->next) { if (u->faction == f) break; } if (u) continue; u = createunit(r, f, 1, new_race[RC_GOBLIN]); set_string(&u->name, "Igjarjuks Auge"); set_item(u, I_RING_OF_INVISIBILITY, 1); set_order(&u->thisorder, NULL); fset(u, UFL_ANON_FACTION); set_money(u, 1000); } }
static void tower_init(void) { int i, first = newarena; item_type *it_demonseye = it_find("demonseye"); item_type *it_griphonwing = it_find("griphonwing"); assert(it_griphonwing && it_demonseye); for (i = 0; i != 6; ++i) { region *r = tower_region[i] = findregion(arena_center->x + delta_x[i] * 3, arena_center->y + delta_y[i] * 3); if (r) { start_region[i] = findregion(arena_center->x + delta_x[i] * 2, arena_center->y + delta_y[i] * 2); if (rterrain(r) != T_DESERT) terraform(r, T_DESERT); if (!r->buildings) { building *b = new_building(bt_find("castle"), r, NULL); b->size = 10; if (i != 0) { sprintf(buf, "Turm des %s", LOC(default_locale, mkname("school", magic_school[i]))); } else sprintf(buf, "Turm der Ahnungslosen"); set_string(&b->name, buf); } } } if (first && !arena_center->buildings) { building *b = new_building(bt_find("castle"), arena_center, NULL); attrib *a; item *items; i_add(&items, i_new(it_griphonwing, 1)); i_add(&items, i_new(it_demonseye, 1)); a = a_add(&b->attribs, make_giveitem(b, items)); b->size = 10; set_string(&b->name, "Höhle des Greifen"); } }
static direction_t treeman_neighbour(region * r) { int i; int rr; int c = 0; region * next[MAXDIRECTIONS]; get_neighbours(r, next); /* Nachsehen, wieviele Regionen in Frage kommen */ for (i = 0; i != MAXDIRECTIONS; i++) { if (next[i] && rterrain(next[i]) != T_OCEAN && rterrain(next[i]) != T_GLACIER && rterrain(next[i]) != T_DESERT) { ++c; } } if (c == 0) { return NODIRECTION; } /* Zufällig eine auswählen */ rr = rng_int() % c; /* Durchzählen */ c = -1; for (i = 0; i != MAXDIRECTIONS; i++) { if (next[i] && rterrain(next[i]) != T_OCEAN && rterrain(next[i]) != T_GLACIER && rterrain(next[i]) != T_DESERT) { if (++c == rr) { return (direction_t)i; } } } assert(!"this should never happen"); /* Bis hierhin sollte er niemals kommen. */ return NODIRECTION; }
static void get_allies(region * r, unit * u) { unit *newunit = NULL; const char *name; const char *equip; int number; message *msg; assert(u->number); switch (rterrain(r)) { case T_PLAIN: if (!r_isforest(r)) { if (get_money(u) / u->number < 100 + rng_int() % 200) return; name = "random_plain_men"; equip = "random_plain"; number = rng_int() % 8 + 2; break; } else { if (eff_skill(u, SK_LONGBOW, r) < 3 && eff_skill(u, SK_HERBALISM, r) < 2 && eff_skill(u, SK_MAGIC, r) < 2) { return; } name = "random_forest_men"; equip = "random_forest"; number = rng_int() % 6 + 2; } break; case T_SWAMP: if (eff_skill(u, SK_MELEE, r) <= 1) { return; } name = "random_swamp_men"; equip = "random_swamp"; number = rng_int() % 6 + 2; break; case T_DESERT: if (eff_skill(u, SK_RIDING, r) <= 2) { return; } name = "random_desert_men"; equip = "random_desert"; number = rng_int() % 12 + 2; break; case T_HIGHLAND: if (eff_skill(u, SK_MELEE, r) <= 1) { return; } name = "random_highland_men"; equip = "random_highland"; number = rng_int() % 8 + 2; break; case T_MOUNTAIN: if (eff_skill(u, SK_MELEE, r) <= 1 || eff_skill(u, SK_TRADE, r) <= 2) { return; } name = "random_mountain_men"; equip = "random_mountain"; number = rng_int() % 6 + 2; break; case T_GLACIER: if (eff_skill(u, SK_MELEE, r) <= 1 || eff_skill(u, SK_TRADE, r) <= 1) { return; } name = "random_glacier_men"; equip = "random_glacier"; number = rng_int() % 4 + 2; break; default: return; } newunit = create_unit(r, u->faction, number, u->faction->race, 0, LOC(u->faction->locale, name), u); equip_unit(newunit, get_equipment(equip)); u_setfaction(newunit, u->faction); set_racename(&newunit->attribs, get_racename(u->attribs)); if (u_race(u)->flags & RCF_SHAPESHIFT) { newunit->irace = u->irace; } if (fval(u, UFL_ANON_FACTION)) fset(newunit, UFL_ANON_FACTION); fset(newunit, UFL_ISNEW); msg = msg_message("encounter_allies", "unit name", u, name); r_addmessage(r, u->faction, msg); msg_release(msg); }
static const char *dragon_name(const unit * u) { static char name[NAMESIZE + 1]; // FIXME: static return value int rnd, ter = 0; int anzahl = 1; static int num_postfix; char zText[32]; const char *str; if (num_postfix == 0) { for (num_postfix = 0;; ++num_postfix) { sprintf(zText, "dragon_postfix_%d", num_postfix); str = locale_getstring(default_locale, zText); if (str == NULL) break; } if (num_postfix == 0) num_postfix = -1; } if (num_postfix <= 0) { return NULL; } if (u) { region *r = u->region; anzahl = u->number; switch (rterrain(r)) { case T_PLAIN: ter = 1; break; case T_MOUNTAIN: ter = 2; break; case T_DESERT: ter = 3; break; case T_SWAMP: ter = 4; break; case T_GLACIER: ter = 5; break; } } rnd = num_postfix / 6; rnd = (rng_int() % rnd) + ter * rnd; sprintf(zText, "dragon_postfix_%d", rnd); str = locale_getstring(default_locale, zText); assert(str != NULL); if (anzahl > 1) { const char *no_article = strchr((const char *)str, ' '); assert(no_article); // TODO: localization sprintf(name, "Die %sn von %s", no_article + 1, rname(u->region, default_locale)); } else { char n[32]; strcpy(n, silbe1[rng_int() % SIL1]); strcat(n, silbe2[rng_int() % SIL2]); strcat(n, silbe3[rng_int() % SIL3]); if (rng_int() % 5 > 2) { sprintf(name, "%s, %s", n, str); /* "Name, der Titel" */ } else { strcpy(name, (const char *)str); /* "Der Titel Name" */ name[0] = (char)toupper(name[0]); /* TODO: UNICODE - should use towupper() */ strcat(name, " "); strcat(name, n); } if (u && (rng_int() % 3 == 0)) { strcat(name, " von "); strcat(name, (const char *)rname(u->region, default_locale)); } } return name; }