示例#1
0
文件: skills.c 项目: Xolgrim/server
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;
}
示例#2
0
文件: arena.c 项目: UweKopf/server
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);
}
示例#3
0
文件: arena.c 项目: UweKopf/server
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);
    }
}
示例#4
0
文件: arena.c 项目: UweKopf/server
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");
  }
}
示例#5
0
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;
}
示例#6
0
文件: randenc.c 项目: hochl/server
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);
}
示例#7
0
文件: names.c 项目: Xolgrim/server
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;
}