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