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); }
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")); }
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); }
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)); }
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; }
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); } } } }