스타봇

스타크래프트 봇 동아리, 내전용 봇 개발 (#8)

오잎 클로버 2021. 7. 16. 12:00
728x90

저그의 또다른 카이팅 유닛이자 테란전 필수 유닛 '뮤탈리스크'

체력도 무난하고 이름바 쓰리쿠션이라고 자주 불리는 일종의 스플래시 대미지가 존재한다.

한 번에 세 번 공격 하나, 첫 번째 공격만 컨트롤이 가능하고 나머지 공격들은 컨트롤할 수 없다.

공격 방식이 독특하기에 이를 글로 설명하자니 어렵기에 직접 찾아 이해하시길 바랍니다.

 

비교적 짧은 코드로 나쁘지 않는 성과를 내어 좋았다.

물론 여러 프로들이 사용하는 뮤탈 뭉치기, 뮤탈 컨트롤은 따로 구현할 수 있다면 구현하도록하겠다.

 

Position getKiteVector(Unit unit, Unit target) {
	Position fleeVec = new Position(target.getPosition().getX() - unit.getPosition().getX(),
		target.getPosition().getY() - unit.getPosition().getY());

	double fleeAngle = Math.atan2(fleeVec.getY(), fleeVec.getX());
	fleeVec = new Position((int)(64*Math.cos(fleeAngle)), (int)(64*Math.sin(fleeAngle)));
	return fleeVec;
}

뮤탈리스크는 체력이 준수한 편이기는 하나, 공중 공격을 하는 유닛들을 상대로 약하고, 사거리도 짧아 한 번이라도 쳤다면 뒤쪽으로 잠깐 빠져 다시 공격하는 방식으로 플레이를 해야한다.

뮤탈리스크의 기동성을 최대한으로 이끌어 카이팅을 사용해야한다.

private void mutaControl(Unit unit, Unit target) {

	if (unit == null || target == null)
		return;

	final int cooldown = unit.getType().groundWeapon().damageCooldown();
	final int latency = MyBotModule.Broodwar.getLatency();
	final double speed = unit.getType().topSpeed();
	final double range = unit.getType().groundWeapon().maxRange();
	final double distanceToTarget = unit.getDistance(target);
	final double distanceToFiringRange = Math.max(distanceToTarget - range, 0.0);
	final double timeToEnterFiringRange = distanceToFiringRange / speed;
	final int framesToAttack = (int)(timeToEnterFiringRange) + 2 * latency;

	final int currentCooldown = unit.isStartingAttack() ? cooldown : unit.getGroundWeaponCooldown();

	Position fleeVector = getKiteVector(target, unit);
	Position moveToPosition = new Position(unit.getPosition().getX() + fleeVector.getX(),
		unit.getPosition().getY() + fleeVector.getY());
	if (currentCooldown <= framesToAttack)
		unit.attack(target);
	else {
		if (moveToPosition.isValid())
			unit.rightClick(moveToPosition);
	}
}

가장 정석적인 뮤탈 컨트롤을 만들기 위해 사거리, 속도, 게임 지연시간, 공격 쿨타임, 공격까지의 딜레이, 위치 등등을

참고하여 컨트롤을 하도록 하였다.

 

시연 영상으로 끝으로 마무리하겠다.

영상 녹화 후, 속도가 느린 것 같아 강제적으로 속도를 1.5배로 하여 사운드가 기본 사운드가 아닌 배속 사운드입니다.