미션 아이템 전용 장착 슬롯을 캐릭터 스켈레탈 메쉬에 추가하고 나니, 미션에서 추가로 작업할 사항은 없는 것 같아 팀원분들의 작업을 도우려 했습니다. 그러던 중 무기 밸런싱을 품앗이 받았습니다.
설정되어 있던 조건
최대 체력 100, 최대 스테미나 100
초당 스테미나 회복량은 15, 소모 후 회복 시작까지는 1.5초 턴이 존재
체력 회복 수단은 존재하지 않음
내가 생각한 기준
1. 모든 데미지와 소모 스테미너의 기준점을 맨손으로 한다
2. 맨손은 데미지가 약한 대신 스테미나 소모가 적어야 한다. - 맨손 데미지가 낮을 수록 플레이 난이도가 오른다.
3. 검 데미지와 소모량은 한손검 < 양손검 이 된다. 둘 다 맨손 보다는 데미지가 높아야 한다
4. 활과 석궁은 소모성이므로 패널티가 적어야 하고 데미지도 강하게 설정한다.
맨손
빠른 대전 및 샌드백 부수기를 위해 5 ~ 7 대로 대상을 쓰러 뜨릴 수 있는 데미지 설정이 필요
그런 만큼 스테미나 소모도 부담 없이 5번 까지는 공격할 수 있게 소모해야한다.
한손검
맨손 보다는 강하지만 4~5번의 공격으로 쓰러 뜨릴 수 있게 설정, 스테미나는 5번 사용하면 바닥나게
양손검
한손검 보다 강하게 2~3번의 공격으로 쓰러뜨리기, 스테미나 소모량을 제일 높게 설정하기
활/석궁
스테미나 소모량 매우 낮게, 단 활의 소모량이 석궁보다 높게
시위를 당김으로써 더 강하게 가능한 활, 장전 식이라 위력의 차이가 거의 없는 석궁
|종류|약 공격|약 공격 스테미나|강 공격|강 공격 스테미나|체력 100기준 처치 타수(약/강)|연속 공격 가능 횟수|
|맨손 |15|10|20|15|7타 / 5타|10회|
|한손검|22|20|27|30|5타 / 4타|5회|
|양손검|35|25|50|40|3타 / 2타|2회|
|활 |20|15|45|40|5타 / 3타|6회|
|석궁 |25|5|27|8|4타 / 4타|20회|
게임 내 1 : 1 결투 시스템이 존재합니다.
결투석에는 결투를 신청한 플레이어와 결투를 수락한 플레이어, 나머지는 관람석으로 이동됩니다. 관람석에는 투척용 무기(의자, 뼈, 항아리) 배치되어 있으며 관람석의 플레이어는 그것을 주워서 던지는 것으로 결투장에 플레이어에게 데미지를 줄 수 있습니다.
크기는 의자 > 뼈 > 항아리 순으로 큽니다.
결투에 큰 방해를 주지 않기 위해 데미지 수치가 맨손보다 낮게 설정했습니다.
또한 투척무기와 원거리 무기는 약공격 데미지와 코스트만 사용하고 있다는 것을 뒤늦게 알게 되어 수치 조정이 필요해 졌습니다.
|종류|데미지|소모 스테미나|
|항아리|3 |5 |
|뼈 |7 |20|
|의자 |12|50|
활과 석궁에도 수정이 필요합니다.
활은 데미지가 강한 대신 스테미나 소모가 높은 무기,
석궁은 데미지는 한손검보다 조금 강한 대신 스테미나 소모는 낮은 무기로 설정을 변경합니다.
|종류|데미지|소모 스테미나|
|활 |45|45|
|석궁 |27|5|
#include <string>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
int getNodeCnt(const vector<vector<int>>& graph, vector<bool> visited, int startNode)
{
int nodeCnt = 0;
queue<int> nextNodes;
nextNodes.push(startNode);
while(!nextNodes.empty())
{
int nowNode = nextNodes.front();
nextNodes.pop();
for(int newNode : graph[nowNode])
{
if(visited[newNode] == true)
{
continue;
}
visited[newNode] = true;
nextNodes.push(newNode);
nodeCnt++;
}
}
return nodeCnt;
}
int solution(int n, vector<vector<int>> wires) {
int answer = 100;
vector<vector<int>> graph(100, vector<int>(0));
for(vector<int>& wireRow : wires)
{
graph[wireRow[0]].push_back(wireRow[1]);
graph[wireRow[1]].push_back(wireRow[0]);
}
for(int i = 0; i < graph.size(); i++)
{
if(graph[i].size() == 2)
{
vector<bool> visitedLeft(graph.size());
visitedLeft[graph[i][0]] = true;
vector<bool> visitedRight(graph.size());
visitedRight[graph[i][1]] = true;
answer = min(answer, abs(getNodeCnt(graph,visitedLeft, i) - getNodeCnt(graph, visitedLeft, graph[i][0])));
answer = min(answer, abs(getNodeCnt(graph,visitedRight, i) - getNodeCnt(graph, visitedRight, graph[i][1])));
}
}
return answer;
}
#include <string>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
int getNodeCnt(const vector<vector<int>>& graph, vector<int>& parents, int startNode, pair<int, int> excludeLine)
{
int nodeCnt = 0;
queue<int> nextNodes;
nextNodes.push(startNode);
while(!nextNodes.empty())
{
int nowNode = nextNodes.front();
nextNodes.pop();
for(int newNode : graph[nowNode])
{
if(nowNode == excludeLine.first && newNode == excludeLine.second)
{
continue;
}
else if(nowNode == excludeLine.second && newNode == excludeLine.first)
{
continue;
}
if(parents[newNode] == startNode)
{
continue;
}
else if(parents[newNode] != -1)
{
return -1;
}
parents[newNode] = startNode;
nextNodes.push(newNode);
nodeCnt++;
}
}
return nodeCnt;
}
int solution(int n, vector<vector<int>> wires) {
int answer = 100;
vector<vector<int>> graph(100, vector<int>(0));
for(vector<int>& wireRow : wires)
{
graph[wireRow[0]].push_back(wireRow[1]);
graph[wireRow[1]].push_back(wireRow[0]);
}
for(int i = 0; i < graph.size(); i++)
{
for(int j = 0; j < graph[i].size(); j++)
{
vector<int> parents(graph.size(), -1);
pair<int, int> excludeLine = make_pair(i, j);
int temp1 = getNodeCnt(graph, parents, i, excludeLine);
int temp2 = getNodeCnt(graph, parents, j, excludeLine);
if(temp1 == - 1 || temp2 == -1)
{
continue;
}
else if(temp1 == 100 && temp2 == 100)
{
continue;
}
answer = min(answer, abs(temp1 - temp2));
}
}
return answer;
}