Exemplo n.º 1
0
static void monster_attacks(unit * monster)
{
    region *r = monster->region;
    unit *u;

    for (u = r->units; u; u = u->next) {
        if (u->faction != monster->faction && cansee(monster->faction, r, u, 0) && !in_safe_building(u, monster)) {
            order *ord = monster_attack(monster, u);
            if (ord) {
                addlist(&monster->orders, ord);
            }
        }
    }
}
Exemplo n.º 2
0
int	func_hero_attack(t_hero **hero, t_enemy **enemy)
{
  if (give_me_a_rand(100) < 10)
    func_hero_attack_crit(hero, enemy);
  else
    {
      my_putstr("Hero ");
      my_putstr((*hero)->name);
      my_putstr(" use attack\n");
      my_putstr((*enemy)->name);
      my_putstr(" lose 7 PV\n\n");
      (*enemy)->pv -= 7;
      monster_attack(hero, enemy);
    }
  return (0);
}
Exemplo n.º 3
0
int	func_hero_slash(t_hero **hero, t_enemy **enemy)
{
  if (give_me_a_rand(100) < 10)
    func_hero_slash_crit(hero, enemy);
  else
    {
      my_putstr("Hero ");
      my_putstr((*hero)->name);
      my_putstr(" use slash\n");
      my_putstr((*enemy)->name);
      my_putstr(" lose 10 PV\n");
      my_putstr("Hero lose 2 PV\n\n");
      (*enemy)->pv -= 10;
      (*hero)->pv -= 2;
      monster_attack(hero, enemy);
    }
  return (0);
}
Exemplo n.º 4
0
static order *get_money_for_dragon(region * r, unit * udragon, int wanted)
{
    int n;
    bool attacks = attack_chance > 0.0;

    /* falls genug geld in der region ist, treiben wir steuern ein. */
    if (rmoney(r) >= wanted) {
        /* 5% chance, dass der drache aus einer laune raus attackiert */
        if (!attacks || chance(1.0 - u_race(udragon)->aggression)) {
            /* Drachen haben in E3 und E4 keine Einnahmen. Neuer Befehl Pluendern erstmal nur fuer Monster?*/
            return create_order(K_LOOT, default_locale, NULL);
        }
    }

    /* falls der drache launisch ist, oder das regionssilber knapp, greift er alle an
     * und holt sich Silber von Einheiten, vorausgesetzt er bewacht bereits */
    n = 0;
    if (attacks && is_guard(udragon, GUARD_TAX)) {
        unit *u;
        for (u = r->units; u; u = u->next) {
            if (u->faction != udragon->faction && cansee(udragon->faction, r, u, 0) && !in_safe_building(u, udragon)) {
                int m = get_money(u);
                if (m != 0) {
                    order *ord = monster_attack(udragon, u);
                    if (ord) {
                        addlist(&udragon->orders, ord);
                        n += m;
                    }
                }
            }
        }
    }

    /* falls die einnahmen erreicht werden, bleibt das monster noch eine */
    /* runde hier. */
    if (n + rmoney(r) >= wanted) {
        return create_order(K_LOOT, default_locale, NULL);
    }

    /* wenn wir NULL zurueckliefern, macht der drache was anderes, z.b. weggehen */
    return NULL;
}
Exemplo n.º 5
0
int	func_hero_thunder(t_hero **hero, t_enemy **enemy)
{
  if ((*hero)->pm >= 5)
    {
      if (give_me_a_rand(100) < 10)
	func_hero_thunder_crit(hero, enemy);
      else
	{
	  my_putstr("Hero ");
	  my_putstr((*hero)->name);
	  my_putstr(" use thunder\n");
	  my_putstr((*enemy)->name);
	  my_putstr(" lose 15 PV\n");
	  my_putstr("Hero lose 5 PM\n\n");
	  (*enemy)->pv -= 15;
	  (*hero)->pm -= 5;
	  monster_attack(hero, enemy);
	}
    }
  else
    my_putstr("Hero laxa can't use thunder MP too low\n");
  return (0);
}
Exemplo n.º 6
0
int	func_hero_fire(t_hero **hero, t_enemy **enemy)
{
  if ((*hero)->pm >= 3)
    {
      if (give_me_a_rand(100) < 10)
	func_hero_fire_crit(hero, enemy);
      else
	{
	  my_putstr("Hero ");
	  my_putstr((*hero)->name);
	  my_putstr(" use fire\n");
	  my_putstr((*enemy)->name);
	  my_putstr(" lose 10 PV\n");
	  my_putstr("Hero lose 3 PM\n\n");
	  (*enemy)->pv -= 10;
	  (*hero)->pm -= 3;
	  monster_attack(hero, enemy);
	}
    }
  else
    my_putstr("Hero laxa can't use fire MP too low\n");
  return (0);
}
Exemplo n.º 7
0
void plan_monsters(faction * f)
{
    region *r;
    
    assert(f);
    attack_chance = get_param_flt(global.parameters, "rules.monsters.attack_chance", 0.4);
    f->lastorders = turn;

    for (r = regions; r; r = r->next) {
        unit *u;
        bool attacking = false;

        for (u = r->units; u; u = u->next) {
            attrib *ta;
            order *long_order = NULL;

            /* Ab hier nur noch Befehle für NPC-Einheiten. */
            if (!is_monsters(u->faction))
                continue;

            /* Befehle müssen jede Runde neu gegeben werden: */
            free_orders(&u->orders);
            if (skill_enabled(SK_PERCEPTION)) {
                /* Monster bekommen jede Runde ein paar Tage Wahrnehmung dazu */
                /* TODO: this only works for playerrace */
                produceexp(u, SK_PERCEPTION, u->number);
            }

            if (!attacking) {
                if (chance(attack_chance)) attacking = true;
            }
            if (u->status > ST_BEHIND) {
                setstatus(u, ST_FIGHT);
                /* all monsters fight */
            }
            if (attacking && (!r->land || is_guard(u, GUARD_TAX))) {
                monster_attacks(u);
            }
            /* units with a plan to kill get ATTACK orders: */
            ta = a_find(u->attribs, &at_hate);
            if (ta && !monster_is_waiting(u)) {
                unit *tu = (unit *)ta->data.v;
                if (tu && tu->region == r) {
                    order * ord = monster_attack(u, tu);
                    if (ord) {
                        addlist(&u->orders, ord);
                    }
                }
                else if (tu) {
                    tu = findunitg(ta->data.i, NULL);
                    if (tu != NULL) {
                        long_order = make_movement_order(u, tu->region, 2, allowed_walk);
                    }
                }
                else
                    a_remove(&u->attribs, ta);
            }

            /* All monsters guard the region: */
            if (!monster_is_waiting(u) && r->land) {
                addlist(&u->orders, create_order(K_GUARD, u->faction->locale, NULL));
            }

            /* Einheiten mit Bewegungsplan kriegen ein NACH: */
            if (long_order == NULL) {
                attrib *ta = a_find(u->attribs, &at_targetregion);
                if (ta) {
                    if (u->region == (region *)ta->data.v) {
                        a_remove(&u->attribs, ta);
                    }
                }
                else if (u_race(u)->flags & RCF_MOVERANDOM) {
                    if (rng_int() % 100 < MOVECHANCE || check_overpopulated(u)) {
                        long_order = monster_move(r, u);
                    }
                }
            }

            if (long_order == NULL && unit_can_study(u)) {
                /* Einheiten, die Waffenlosen Kampf lernen könnten, lernen es um
                 * zu bewachen: */
                if (u_race(u)->bonus[SK_WEAPONLESS] != -99) {
                    if (effskill(u, SK_WEAPONLESS, 0) < 1) {
                        long_order =
                            create_order(K_STUDY, f->locale, "'%s'",
                            skillname(SK_WEAPONLESS, f->locale));
                    }
                }
            }

            if (long_order == NULL) {
                /* Ab hier noch nicht generalisierte Spezialbehandlungen. */

                if (!u->orders) {
                    handle_event(u->attribs, "ai_move", u);
                }

                switch (old_race(u_race(u))) {
                case RC_SEASERPENT:
                    long_order = create_order(K_PIRACY, f->locale, NULL);
                    break;
#ifdef TODO_ALP
                case RC_ALP:
                    long_order = monster_seeks_target(r, u);
                    break;
#endif
                case RC_FIREDRAGON:
                case RC_DRAGON:
                case RC_WYRM:
                    long_order = plan_dragon(u);
                    break;
                default:
                    if (u_race(u)->flags & RCF_LEARN) {
                        long_order = monster_learn(u);
                    }
                    break;
                }
            }
            if (long_order) {
                addlist(&u->orders, long_order);
            }
        }
    }
    pathfinder_cleanup();
}