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;
}
Esempio n. 2
0
	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);
		}
	}
Esempio n. 3
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);
	}
}
Esempio n. 4
0
bool Paladin::get_attacked(Player& player) {
	get_damage(player.do_damage());
	if(is_dead())
		return is_dead();
	player.get_damage(do_attack());
	return false;

}
Esempio n. 5
0
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;
}
Esempio n. 6
0
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;
	}
Esempio n. 7
0
short Fighter::can_defend(short eAttack)
{
    cHP = cHP - get_damage(eAttack);
    if(cHP > 0) {
        return 1;
    }
    else {
        cHP = 0;
        return 0;
    }
}
Esempio n. 8
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;
    }
}
Esempio n. 9
0
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;
			}
		}
	}
}
Esempio n. 10
0
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;
}
Esempio n. 12
0
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;
        }
    }

}