コード例 #1
0
		void environment::spawn_player(point2 location)
		{
			// player props
			auto weapon = std::make_shared<body_component::item_type>();
			weapon->add({ rl::effect::weapon_damage, 0x00, 50 });
			weapon->add({ rl::effect::equipment, static_cast<unsigned int>(rl::equipment_slot::hand_main) });
			weapon->set_name("Copper Sword");
			weapon->set_tag("copper_sword");

			// make player
			auto task = m_factory->produce();
			auto img = task->add_appearance('@', { 1, 1, 1 });
			auto pawn = task->add_location(location);
			auto body = task->add_body(100, 100);
			auto character = task->add_character();

			// setup
			body->set_name("You");
			body->set_tag("player");
			body->join_faction(1);
			body->add(weapon);
			body->equip(weapon);

			character->add_skill("sk_bash");
			character->add_skill("sk_panacea");
			character->add_skill("sk_teleport");
			character->add_skill("sk_fireball");
			character->add_skill("sk_indigo");

			m_terrain.add(task->assemble(persistency::permanent));

			impersonate(pawn);
		}
コード例 #2
0
ファイル: demon_base.c プロジェクト: simonthoresen/viking
static void
create() 
{
    ::create();
    set_race("demon");
    set_no_corpse(1);
    setmin("flies in");
    setmout("flies");
    add_property("unarmed_damage_type", "claw");
    add_property("flying");
    add_property("evil");
    add_skill("resist_cold", 100);
    add_skill("prot_magic", 50);
    add_skill("two_weapon", 100);
    add_hook("__die", store_fp("count_death"));
    add_hook("__init", store_fp("attack_good"));
    add_hook("__hit_player", store_fp("modify_damage"));
    add_hook("__bnotify_attack", store_fp("scare_mortals"));
}
コード例 #3
0
ファイル: unit.c プロジェクト: UweKopf/server
void set_level(unit * u, skill_t sk, int value)
{
  skill *sv = u->skills;

  if (!skill_enabled[sk])
    return;

  if (value == 0) {
    remove_skill(u, sk);
    return;
  }
  while (sv != u->skills + u->skill_size) {
    if (sv->id == sk) {
      sk_set(sv, value);
      return;
    }
    ++sv;
  }
  sk_set(add_skill(u, sk), value);
}
コード例 #4
0
ファイル: gargoyle.c プロジェクト: simonthoresen/viking
static void
init_dangerlevel(int val) 
{
    set_long("It is a grotesque winged statue that has come alive. Its skin " +
             "looks impenetrable.");
    add_skill("resist_slash", 100);
    add_skill("prot_bite", 100);
    add_skill("prot_claw", 100);
    add_skill("prot_cold", 100);
    add_skill("prot_electricity", 100);
    add_skill("prot_fire", 100);
    add_skill("prot_pierce", 100);
    add_property("unarmed_damage_type", "claw");
    add_property("flying");
    add_tmp_prop("ac", val / 8);
    add_hook("__hit_player", store_fp("break_weapon"));
    EMP_D_ARMOUR->add_armour(75 + random(val), "shield");
    EMP_D_WEAPON->add_weapon(50 + random(50));
}
コード例 #5
0
ファイル: unit.c プロジェクト: UweKopf/server
bool learn_skill(unit * u, skill_t sk, double chance)
{
  skill *sv = u->skills;
  if (chance < 1.0 && rng_int() % 10000 >= chance * 10000)
    return false;
  while (sv != u->skills + u->skill_size) {
    assert(sv->weeks > 0);
    if (sv->id == sk) {
      if (sv->weeks <= 1) {
        sk_set(sv, sv->level + 1);
      } else {
        sv->weeks--;
      }
      return true;
    }
    ++sv;
  }
  sv = add_skill(u, sk);
  sk_set(sv, 1);
  return true;
}
コード例 #6
0
ファイル: unit.c プロジェクト: UweKopf/server
void transfermen(unit * u, unit * u2, int n)
{
  const attrib *a;
  int hp = u->hp;
  region *r = u->region;

  if (n == 0)
    return;
  assert(n > 0);
  /* "hat attackiert"-status wird übergeben */

  if (u2) {
    skill *sv, *sn;
    skill_t sk;
    ship *sh;

    assert(u2->number + n > 0);

    for (sk = 0; sk != MAXSKILLS; ++sk) {
      int weeks, level = 0;

      sv = get_skill(u, sk);
      sn = get_skill(u2, sk);

      if (sv == NULL && sn == NULL)
        continue;
      if (sn == NULL && u2->number == 0) {
        /* new unit, easy to solve */
        level = sv->level;
        weeks = sv->weeks;
      } else {
        double dlevel = 0.0;

        if (sv && sv->level) {
          dlevel += (sv->level + 1 - sv->weeks / (sv->level + 1.0)) * n;
          level += sv->level * n;
        }
        if (sn && sn->level) {
          dlevel +=
            (sn->level + 1 - sn->weeks / (sn->level + 1.0)) * u2->number;
          level += sn->level * u2->number;
        }

        dlevel = dlevel / (n + u2->number);
        level = level / (n + u2->number);
        if (level <= dlevel) {
          /* apply the remaining fraction to the number of weeks to go.
           * subtract the according number of weeks, getting closer to the
           * next level */
          level = (int)dlevel;
          weeks = (level + 1) - (int)((dlevel - level) * (level + 1));
        } else {
          /* make it harder to reach the next level. 
           * weeks+level is the max difficulty, 1 - the fraction between
           * level and dlevel applied to the number of weeks between this
           * and the previous level is the added difficutly */
          level = (int)dlevel + 1;
          weeks = 1 + 2 * level - (int)((1 + dlevel - level) * level);
        }
      }
      if (level) {
        if (sn == NULL)
          sn = add_skill(u2, sk);
        sn->level = (unsigned char)level;
        sn->weeks = (unsigned char)weeks;
        assert(sn->weeks > 0 && sn->weeks <= sn->level * 2 + 1);
        assert(u2->number != 0 || (sn->level == sv->level
            && sn->weeks == sv->weeks));
      } else if (sn) {
        remove_skill(u2, sk);
        sn = NULL;
      }
    }
    a = a_find(u->attribs, &at_effect);
    while (a && a->type == &at_effect) {
      effect_data *olde = (effect_data *) a->data.v;
      if (olde->value)
        change_effect(u2, olde->type, olde->value);
      a = a->next;
    }
    sh = leftship(u);
    if (sh != NULL)
      set_leftship(u2, sh);
    u2->flags |=
      u->flags & (UFL_LONGACTION | UFL_NOTMOVING | UFL_HUNGER | UFL_MOVED |
      UFL_ENTER);
    if (u->attribs) {
      transfer_curse(u, u2, n);
    }
  }
  scale_number(u, u->number - n);
  if (u2) {
    set_number(u2, u2->number + n);
    hp -= u->hp;
    u2->hp += hp;
    /* TODO: Das ist schnarchlahm! und gehört nicht hierhin */
    a = a_find(u2->attribs, &at_effect);
    while (a && a->type == &at_effect) {
      attrib *an = a->next;
      effect_data *olde = (effect_data *) a->data.v;
      int e = get_effect(u, olde->type);
      if (e != 0)
        change_effect(u2, olde->type, -e);
      a = an;
    }
  } else if (r->land) {
    if ((u_race(u)->ec_flags & ECF_REC_ETHEREAL) == 0) {
      const race *rc = u_race(u);
      if (rc->ec_flags & ECF_REC_HORSES) {      /* Zentauren an die Pferde */
        int h = rhorses(r) + n;
        rsethorses(r, h);
      } else {
        int p = rpeasants(r);
        p += (int)(n * rc->recruit_multi);
        rsetpeasants(r, p);
      }
    }
  }
}