void Engagement::print(){ std::cout << "Engagement!" << std::endl; std::cout << "\t" << "A\t" << "B " << std::endl; std::cout << "ini\t" << get_initiative( attacker, victim ) << "\t" << (100 - get_initiative( attacker, victim )) << std::endl; std::cout << "dmg\t" << get_damage( attacker, victim ) << "\t" << get_damage( victim, attacker ) << std::endl; std::cout << "hit\t" << get_hitrate( attacker, victim ) << "\t" << get_hitrate( victim, attacker ) << std::endl; std::cout << "crt\t" << get_critrate( attacker, victim ) << "\t" << get_critrate( victim, attacker ) << std::endl; int asize = attacker_damages.size(); int vsize = victim_damages.size(); if( iniflag == 0 ){ std::cout << "A attacks B for " << attacker_damages[0] << " damage\n"; if( vsize > 0 ){ std::cout << "B attacks A for " << victim_damages[0] << " damage\n"; } } else { std::cout << "B attacks A for " << victim_damages[0] << " damage\n"; if( asize > 0 ){ std::cout << "A attacks B for " << attacker_damages[0] << " damage\n"; } } if( victim->stats.CHP <= 0 ){ std::cout << "B dies." << std::endl; } if( attacker->stats.CHP <= 0 ){ std::cout << "A dies." << std::endl; } std::cout << "A " << attacker->stats.CHP << "/" << attacker->stats.HP << std::endl; std::cout << "B " << victim->stats.CHP << "/" << victim->stats.HP << std::endl; }
void NPC::fight(Character& player, Environment& env){ int random_damage = get_damage() + (rand() % get_damage()); player.hit(random_damage); std::cout << std::endl << name << " hits " << player.get_name() << " for " << random_damage << " damage."; if (random_damage > (random_damage*2)-(random_damage/2)) std::cout << " Critical strike!" << std::endl; else std::cout << std::endl; if (player.get_hit_points() <= 0){ std::cout << player.get_name() << " dies." << std::endl; exit(0); } }
void mon_hit(object *monster) { short damage, hit_chance; const char *mn; float minus; if (fight_monster && (monster != fight_monster)) { fight_monster = NULL; } monster->trow = NO_ROOM; if (cur_level >= (AMULET_LEVEL * 2)) { hit_chance = 100; } else { hit_chance = monster->m_hit_chance; hit_chance -= (((2 * rogue.exp) + (2 * ring_exp)) - r_rings); } if (wizard) { hit_chance /= 2; } if (!fight_monster) { interrupted = 1; } mn = mon_name(monster); if (!rand_percent(hit_chance)) { if (!fight_monster) { sprintf(hit_message + strlen(hit_message), "the %s misses", mn); message(hit_message, 1); hit_message[0] = 0; } return; } if (!fight_monster) { sprintf(hit_message + strlen(hit_message), "the %s hit", mn); message(hit_message, 1); hit_message[0] = 0; } if (!(monster->m_flags & STATIONARY)) { damage = get_damage(monster->m_damage, 1); if (cur_level >= (AMULET_LEVEL * 2)) { minus = (float)((AMULET_LEVEL * 2) - cur_level); } else { minus = (float)get_armor_class(rogue.armor) * 3.00; minus = minus / 100.00 * (float)damage; } damage -= (short)minus; } else { damage = monster->stationary_damage++; } if (wizard) { damage /= 3; } if (damage > 0) { rogue_damage(damage, monster, 0); } if (monster->m_flags & SPECIAL_HIT) { special_hit(monster); } }
bool Paladin::get_attacked(Player& player) { get_damage(player.do_damage()); if(is_dead()) return is_dead(); player.get_damage(do_attack()); return false; }
bool MineDropper::drop_mine(Point drop_at) { if ( num_of_mines > 0 && mine_handler->add_mine(Mine(drop_at, get_damage())) ) { num_of_mines--; return true; } return false; }
int calc_damage(monster_t& attacker, monster_t& defender) { int idmg = attacker.count * get_damage(attacker.min_damage, attacker.max_damage); float mod = 1.0f; if(attacker.attack >= defender.defense) mod += (attacker.attack - defender.defense) * 0.10f; else mod += (attacker.attack - defender.defense) * 0.05f; int tdmg =(int) idmg * mod; return tdmg; }
short Fighter::can_defend(short eAttack) { cHP = cHP - get_damage(eAttack); if(cHP > 0) { return 1; } else { cHP = 0; return 0; } }
void trap_player(short row, short col) { short t; if ((t = trap_at(row, col)) == NO_TRAP) { return; } dungeon[row][col] &= (~HIDDEN); if (rand_percent(rogue.exp + ring_exp)) { message(mesg[228], 1); return; } switch (t) { case TRAP_DOOR: trap_door = 1; new_level_message = trap_strings[(t * 2) + 1]; break; case BEAR_TRAP: message(trap_strings[(t * 2) + 1], 1); bear_trap = get_rand(4, 7); break; case TELE_TRAP: mvaddch_rogue(rogue.row, rogue.col, '^'); tele(); break; case DART_TRAP: message(trap_strings[(t * 2) + 1], 1); rogue.hp_current -= get_damage("1d6", 1); if (rogue.hp_current <= 0) { rogue.hp_current = 0; } if ((!sustain_strength) && rand_percent(40) && (rogue.str_current >= 3)) { rogue.str_current--; } print_stats(STAT_HP | STAT_STRENGTH); if (rogue.hp_current <= 0) { killed_by((object *) 0, POISON_DART); } break; case SLEEPING_GAS_TRAP: message(trap_strings[(t * 2) + 1], 1); take_a_nap(); break; case RUST_TRAP: message(trap_strings[(t * 2) + 1], 1); rust((object *) 0); break; } }
void fight(boolean to_the_death) { short ch, c, d; short row, col; boolean first_miss = 1; short possible_damage; object *monster; while (!is_direction(ch = rgetchar(), &d)) { sound_bell(); if (first_miss) { message("direction?", 0); first_miss = 0; } } check_message(); if (ch == CANCEL) { return; } row = rogue.row; col = rogue.col; get_dir_rc(d, &row, &col, 0); c = mvinch(row, col); if (((c < 'A') || (c > 'Z')) || (!can_move(rogue.row, rogue.col, row, col))) { message("I see no monster there", 0); return; } if (!(fight_monster = object_at(&level_monsters, row, col))) { return; } if (!(fight_monster->m_flags & STATIONARY)) { possible_damage = ((get_damage(fight_monster->m_damage, 0) * 2) / 3); } else { possible_damage = fight_monster->stationary_damage - 1; } while (fight_monster) { one_move_rogue(ch, 0); if (((!to_the_death) && (rogue.hp_current <= possible_damage)) || interrupted || (!(dungeon[row][col] & MONSTER))) { fight_monster = NULL; } else { monster = object_at(&level_monsters, row, col); if (monster != fight_monster) { fight_monster = NULL; } } } }
static int get_w_damage(const object *obj) { char new_damage[12]; int t_hit, damage; int i = 0; if ((!obj) || (obj->what_is != WEAPON)) { return(-1); } t_hit = get_number(obj->damage) + obj->hit_enchant; while (obj->damage[i++] != 'd') ; damage = get_number(obj->damage + i) + obj->d_enchant; sprintf(new_damage, "%dd%d", t_hit, damage); return(get_damage(new_damage, 1)); }
int Engagement::attack( Character* a, Character* b ){ int finaldamage = 0; int dmg = get_damage( a, b ); int critrate = get_critrate( a, b ); int hitrate = get_hitrate( a, b ); //if a crit/hit if( rand()%100 < critrate ){ b->stats.CHP -= 3*dmg; finaldamage = 3*dmg; } else if( rand()%100 < hitrate ){ b->stats.CHP -= dmg; finaldamage = dmg; } else { finaldamage = -1; } return finaldamage; }
void Fighter::draw_self(short n, SDL_Surface *dest_surf, int ex, int ey,short eAttack) { SDL_Rect fighter_src, fighter_dest; SDL_Color color; char damage[20]; if (bAttack) { switch(n) { case 0: case 5: fighter_src.x = 0; fighter_src.y = Index * 85; fighter_src.w = 60; fighter_src.h = 85; fighter_dest.x = X; fighter_dest.y = Y - Height; fighter_dest.w = Width; fighter_dest.h = Height; SDL_BlitSurface(Surf, &fighter_src, dest_surf, &fighter_dest); break; case 1: fighter_src.x = 0; fighter_src.y = Index * 85; fighter_src.w = 60; fighter_src.h = 85; if(Left) fighter_dest.x = ex - Width; else fighter_dest.x = ex + Width; fighter_dest.y = Y - Height; fighter_dest.w = Width; fighter_dest.h = Height; SDL_BlitSurface(Surf, &fighter_src, dest_surf, &fighter_dest); break; case 2: fighter_src.x = 61; fighter_src.y = Index * 85; fighter_src.w = 60; fighter_src.h = 85; if(Left) fighter_dest.x = ex - Width/2; else fighter_dest.x = ex + Width/2; fighter_dest.y = Y - Height; fighter_dest.w = Width; fighter_dest.h = Height; SDL_BlitSurface(Surf, &fighter_src, dest_surf, &fighter_dest); break; case 3: case 4: fighter_src.x = 121; fighter_src.y = Index * 85; fighter_src.w = 60; fighter_src.h = 85; if(Left) fighter_dest.x = ex - Width/2; else fighter_dest.x = ex + Width/2; fighter_dest.y = Y - Height; fighter_dest.w = Width; fighter_dest.h = Height; SDL_BlitSurface(Surf, &fighter_src, dest_surf, &fighter_dest); break; } } else { fighter_src.x = 0; fighter_src.y = Index*85; fighter_src.w = 60; fighter_src.h = 85; fighter_dest.y = Y - Height; fighter_dest.w = Width; fighter_dest.h = Height; sprintf(damage, "-%d", get_damage(eAttack)); switch(n) { case 0: case 1: case 2: case 3: fighter_dest.x = X; fighter_dest.y = Y - Height; fighter_dest.w = Width; fighter_dest.h = Height; SDL_BlitSurface(Surf, &fighter_src, dest_surf, &fighter_dest); break; case 4: if (Left) fighter_dest.x = X - 20; else fighter_dest.x = X + 20; SDL_BlitSurface(Surf, &fighter_src, dest_surf, &fighter_dest); color.r = 255; color.g = 255; color.b = 0; SDL_BlitText(damage, dest_surf, X+Width/2, Y - Height, Font, color); break; case 5: fighter_dest.x = X; SDL_BlitSurface(Surf, &fighter_src, dest_surf, &fighter_dest); color.r = 255; color.g = 255; color.b = 150; SDL_BlitText(damage, dest_surf, X+Width/2, Y - Height -20, Font, color); break; } } }