오늘 진행 현황에 대해 기록할 예정이다.
할건 많은데 진행속도가 느려서 큰일이다...
monsterTypes
에 저장해 두었다.emersionChance
가 있는데 이 수치가 출현확률이다.let isNotCreate = true;
const setMonster = {};
while (isNotCreate) {
for (let idx in monsterTypes) {
const monsterEmersionChance = monsterTypes[idx].emersionChance;
const emersionRandomCount = Math.random() * 100;
if (emersionRandomCount <= monsterEmersionChance) {
Object.assign(setMonster, monsterTypes[idx]);
isNotCreate = false;
}
}
}
actionType
속성 값을 넣어주고 그 안에 해당 객체가 할 수 있는 행동들을 모아놨다.각 Player, Monster 클래스의 action()
메서드를 통해 해당 객체의 턴일 때 행동권이 주어진다.## Monster Class ##
async action(player, monster, logs) {
if (this.hp > 0) {
// 쿨타임인 행동을 제외하고 할 수 있는 행동을 정리한다.
const actions = await Battle.checkPossibleAction(monster);
// 몬스터의 특수 공격이 쿨타임인지 확인하고,
// 쿨타임이 아닌 경우 반반확률로 특수 공격을 사용하도록 설정
// 특수 공격이 아닌 경우는 일반 공격을 하도록 설정
let attackIs = {};
if (actions[1] !== undefined) {
const isSpecialAttack = Math.floor(Math.random() * 100);
if (isSpecialAttack > 40) {
attackIs = await Object.assign(attackIs, actions[1]);
this.actionTypes[1].currentCooltime = this.actionTypes[1].cooltime;
}
}
// 일반 공격
else if (actions[1] === undefined) {
attackIs = await Object.assign(attackIs, actions[1]);
await Object.assign(attackIs, actions[0]);
this.actionTypes[1].currentCooltime--;
}
// 공격 시작
const damage = await this.attack(attackIs, player);
attackMessage(monster, player, logs, damage, attackIs.name);
}
}
## Player Class ##
async action(player, monster, logs) {
// 쿨타임인 행동을 제외하고 할 수 있는 행동을 정리한다.
const actions = await Battle.checkPossibleAction(this);
// 행동들을 출력한다.
possibleActionMessage(actions);
// 행동들을 선택한다.
const choice = chooseAction(logs);
// 플레이어의 선택에 따라 다음 행동 처리
// 입력에 대한 행동을 키값으로 관리하는게 좋겠다고 판단
if (actions[choice - 1].type === 'attack') {
// 스킬을 사용한 경우
if (actions[choice - 1] === this.actionTypes[1]) {
// 스킬 쿨타임 적용
this.actionTypes[1].currentCooltime = this.actionTypes[1].cooltime;
}
const damage = await this.attack(actions[choice - 1], monster);
attackMessage(this, monster, logs, damage, actions[choice - 1].name);
} else if (actions[choice - 1].type === 'run') {
this.isRun = this.tryRun();
runMessage(this.isRun, this.name, logs);
}
}
Unit Class에 action()
메서드를 통합해서 관리하면 안되나?
=> 이게 더 깔끔할 것 같아서 시도해봤는데 무한루프현상이 발생해서 일단 멈추었다..
// 선택 가능한 액션을 출력해주는 함수
export function possibleActionMessage(actions) {
let actionMessage = '';
for (let i = 0; i < actions.length; i++) {
actionMessage += `${i + 1}.${actions[i].name} `;
}
console.log(`\n ${actionMessage}`);
}
행동 가능한 actions 객체를 받아 이름을 추가하고, 출력해준다.
턴순서에 따라 각 객체가 행동권을 가지는데 몬스터가 행동 메서드인 action()
을 호출하고 진행되면서 행동이 undefined
로 할당되는 이슈가 있다..
async action(player, monster, logs) {
if (this.hp > 0) {
// 쿨타임인 행동을 제외하고 할 수 있는 행동을 정리한다.
const actions = await Battle.checkPossibleAction(monster);
// 몬스터의 특수 공격이 쿨타임인지 확인하고,
// 쿨타임이 아닌 경우 반반확률로 특수 공격을 사용하도록 설정
// 특수 공격이 아닌 경우는 일반 공격을 하도록 설정
let attackIs = {};
if (actions[1] !== undefined) {
const isSpecialAttack = Math.floor(Math.random() * 100);
if (isSpecialAttack > 40) {
attackIs = await Object.assign(attackIs, actions[1]);
this.actionTypes[1].currentCooltime = this.actionTypes[1].cooltime;
}
}
// 일반 공격
else if (actions[1] === undefined) {
attackIs = await Object.assign(attackIs, actions[1]);
await Object.assign(attackIs, actions[0]);
this.actionTypes[1].currentCooltime--;
}
// 공격 시작
const damage = await this.attack(attackIs, player);
attackMessage(monster, player, logs, damage, attackIs.name);
}
}
}
위 코드에서 attackIs
가 간헐적으로 undefined로 할당이 되고 있다.
attackIs
는 행동이 확정된 this.attackType의 객체가 담겨있고, 그 객체를 attack() 메서드에 매개변수로 보내어서 attackIs
안에 든 Damage를 사용하게 된다.
Object.assign()
을 할때 await
을 주었는데도 작동하지 않는 것 같아서 Promise
를 사용하거나 다른 방식으로 코딩을 해야하는지 고민이다..
attackIs
undefined 할당되는 현상 발생