View previous topic :: View next topic |
Boksha-tse
Joined: 16 Jun 2007 Posts: 3
|
Posted: Sun Jun 17, 2007 2:32 pm Post subject: Automated skill analysis |
|
|
|
I took some time and pieced together a program to do skill analysis with some more factors included, in particular the effect of blessing and running out of mana. Not all skills are included but they could be added quite easily in most cases. Note that there are bound to be some errors in here because the game doesn't always seem to use the values listed in The Spiritual Compendium. In particular the cooldown time of chain magic in the game seems to be different even for Eisfford and Pippa and the blessing formula seems off by one (I included that in this program)
Here's the source code for those interested, it should compile on every C++ compiler under any OS. All output is in damage/second, the levels and rifle strengths can be changed by changing the constants at the beginning of the program, as well as the filename of the text output.
Code: | #include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
#include <limits>
const char g_outputfilename[] = "stats.txt";
const int g_riflestr1 = 6;
const int g_riflestr2 = 15;
const int g_level1 = 20;
const int g_level2 = 50;
enum char1enum
{
c1clara,
c1peter,
c1clemetas,
} g_char1;
enum char2enum
{
c2pippa,
c2edward,
c2zepher,
} g_char2;
enum char3enum
{
c3eisfford,
c3samuel,
c3matthieu,
} g_char3;
enum priestenum
{
pclemetas,
pzepher,
pmatthieu,
pnone,
} g_priest;
int g_lvl1bless = 0;
int g_lvl1bless_noskill = 0;
int g_lvl2bless = 0;
int g_lvl2bless_noskill = 0;
bool g_padding = true;
const float blessskillfactor[3] = {0.8f, 1.2f, 1.0f};
int posinstring( char c, const std::string &s )
{
for (int i = 0; i < s.length(); i++)
if (s[i] == c)
return i;
return -1;
}
int switchinput( const std::string &options )
{
char value;
while (!(std::cin >> value) || posinstring(value, options) == -1)
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Not a possible value." << std::endl;
}
return posinstring(value, options);
}
void printfloat( std::ofstream &ofsm, float f, bool padding )
{
std::ostringstream out;
std::string outstr;
int outint;
outint = (int)(f*1000.0f);
out << outint/1000 << ".";
if ((outint % 1000) / 10 + (outint % 10 >= 5) < 10)
out << '0';
out << (outint % 1000) / 10 + (outint % 10 >= 5);
if (padding)
for (int i = 0; i < 7 - out.str().length(); i++)
outstr += " ";
outstr += out.str();
ofsm << outstr;
}
void printskill( std::ofstream &ofsm, int constpart, float sdep, float pdep, float gdep, float recharge, int manause, int multiplier, bool selfbless = false )
{
float f;
int skp1 = std::min(30, g_level1 - 1);
int skp2 = std::min(30, g_level2 - 1);
ofsm << "\t";
// low level, all skill points spent on this move
f = (float)((constpart + skp1*sdep + g_level1*pdep + g_riflestr1*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (g_priest != pnone)
{
// low level, all skill points spent on this move, blessed by a priest who invested no skill in blessing
f = (float)((constpart + skp1*sdep + (g_level1+g_lvl1bless_noskill)*pdep + g_riflestr1*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (!selfbless)
{
// low level, all skill points spent on this move, blessed by a priest who invested all skill in blessing
f = (float)((constpart + skp1*sdep + (g_level1+g_lvl1bless)*pdep + g_riflestr1*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
}
ofsm << "\t";
}
// low level, no skill points spent on this move
f = (float)((constpart + g_level1*pdep + g_riflestr1*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (g_priest != pnone)
{
// low level, no skill points spent on this move, blessed by a priest who invested no skill in blessing
f = (float)((constpart + (g_level1+g_lvl1bless_noskill)*pdep + g_riflestr1*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
ofsm << "\t";
// low level, no skill points spent on this move, blessed by a priest who invested all skill in blessing
f = (float)((constpart + (g_level1+g_lvl1bless)*pdep + g_riflestr1*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
ofsm << "\t";
}
// high level, all skill points spent on this move
f = (float)((constpart + skp2*sdep + g_level2*pdep + g_riflestr2*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (g_priest != pnone)
{
// high level, all skill points spent on this move, blessed by a priest who invested no skill in blessing
f = (float)((constpart + skp2*sdep + (g_level2+g_lvl2bless_noskill)*pdep + g_riflestr2*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (!selfbless)
{
// high level, all skill points spent on this move, blessed by a priest who invested all skill in blessing
f = (float)((constpart + skp2*sdep + (g_level2+g_lvl2bless)*pdep + g_riflestr2*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
}
ofsm << "\t";
}
// high level, no skill points spent on this move
f = (float)((constpart + g_level2*pdep + g_riflestr2*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (g_priest != pnone)
{
// high level, no skill points spent on this move, blessed by a priest who invested no skill in blessing
f = (float)((constpart + (g_level2+g_lvl2bless_noskill)*pdep + g_riflestr2*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
ofsm << "\t";
// high level, no skill points spent on this move, blessed by a priest who invested all skill in blessing
f = (float)((constpart + (g_level2+g_lvl2bless)*pdep + g_riflestr2*gdep)*multiplier)/recharge;
printfloat( ofsm, f, g_padding );
}
ofsm << std::endl << "No mana\t";
// the following assumes the character is out of mana and needs to recharge for every move
// low level, all skill points spent on this move
f = (float)((constpart + skp1*sdep + g_level1*pdep + g_riflestr1*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (g_priest != pnone)
{
// low level, all skill points spent on this move, blessed by a priest who invested no skill in blessing
f = (float)((constpart + skp1*sdep + (g_level1+g_lvl1bless_noskill)*pdep + g_riflestr1*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (!selfbless)
{
// low level, all skill points spent on this move, blessed by a priest who invested all skill in blessing
f = (float)((constpart + skp1*sdep + (g_level1+g_lvl1bless)*pdep + g_riflestr1*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
}
ofsm << "\t";
}
// low level, no skill points spent on this move
f = (float)((constpart + g_level1*pdep + g_riflestr1*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (g_priest != pnone)
{
// low level, no skill points spent on this move, blessed by a priest who invested no skill in blessing
f = (float)((constpart + (g_level1+g_lvl1bless_noskill)*pdep + g_riflestr1*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
ofsm << "\t";
// low level, no skill points spent on this move, blessed by a priest who invested all skill in blessing
f = (float)((constpart + (g_level1+g_lvl1bless)*pdep + g_riflestr1*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
ofsm << "\t";
}
// high level, all skill points spent on this move
f = (float)((constpart + skp2*sdep + g_level2*pdep + g_riflestr2*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (g_priest != pnone)
{
// high level, all skill points spent on this move, blessed by a priest who invested no skill in blessing
f = (float)((constpart + skp2*sdep + (g_level2+g_lvl2bless_noskill)*pdep + g_riflestr2*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (!selfbless)
{
// high level, all skill points spent on this move, blessed by a priest who invested all skill in blessing
f = (float)((constpart + skp2*sdep + (g_level2+g_lvl2bless)*pdep + g_riflestr2*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
}
ofsm << "\t";
}
// high level, no skill points spent on this move
f = (float)((constpart + g_level2*pdep + g_riflestr2*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
ofsm << "\t";
if (g_priest != pnone)
{
// high level, no skill points spent on this move, blessed by a priest who invested no skill in blessing
f = (float)((constpart + (g_level2+g_lvl2bless_noskill)*pdep + g_riflestr2*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
ofsm << "\t";
// high level, no skill points spent on this move, blessed by a priest who invested all skill in blessing
f = (float)((constpart + (g_level2+g_lvl2bless)*pdep + g_riflestr2*gdep)*multiplier)/(recharge + 5.5*manause);
printfloat( ofsm, f, g_padding );
ofsm << std::endl;
}
}
void printriflemanskill( std::ofstream &ofsm, int character )
{
ofsm << "Rif att";
printskill( ofsm, 0, 2.0f, 0.5f, 2.0f, 4.0f, 0, 1 );
switch(character)
{
case 0:
ofsm << std::endl << "Spdfire";
printskill( ofsm, 0, 2.0f, 0.5f, 2.0f, 5.8f, 1, 3 );
ofsm << std::endl << "Sharpsh";
printskill( ofsm, 0, 7.0f, 2.0f, 8.0f,10.8f, 1, 1 );
ofsm << std::endl << "Magbllt";
printskill( ofsm, 7, 6.0f, 1.0f, 3.0f, 5.6f, 1, 1 );
ofsm << std::endl << "Pshot1x";
printskill( ofsm,-2, 2.5f, 1.0f, 3.0f, 4.9f, 1, 1 );
ofsm << std::endl << "Pshot3x";
printskill( ofsm,-2, 2.5f, 1.0f, 3.0f, 4.9f, 1, 3 );
ofsm << std::endl << "Dmite1x";
printskill( ofsm, 2, 2.5f, 1.0f, .0f, 6.3f, 2, 1 );
ofsm << std::endl << "Dmite4x";
printskill( ofsm, 2, 2.5f, 1.0f, .0f, 6.3f, 2, 4 );
break;
case 1:
ofsm << std::endl << "Spdfire";
printskill( ofsm, 0, 2.0f, 0.5f, 2.0f, 7.3f, 1, 3 );
ofsm << std::endl << "Sharpsh";
printskill( ofsm, 0, 6.0f, 2.0f, 7.0f,10.8f, 1, 1 );
ofsm << std::endl << "Magbllt";
printskill( ofsm, 6, 4.0f, 1.0f, 3.0f, 5.6f, 1, 1 );
ofsm << std::endl << "Pshotx1";
printskill( ofsm, 0, 2.9f, 1.0f, 3.0f, 4.9f, 1, 1 );
ofsm << std::endl << "Pshotx3";
printskill( ofsm, 0, 2.9f, 1.0f, 3.0f, 4.9f, 1, 3 );
ofsm << std::endl << "Dmite1x";
printskill( ofsm, 3, 2.9f, 1.0f, .0f, 6.3f, 2, 1 );
ofsm << std::endl << "Dmite4x";
printskill( ofsm, 3, 2.9f, 1.0f, .0f, 6.3f, 2, 4 );
break;
case 2:
ofsm << std::endl << "Spdfire";
printskill( ofsm, 0, 2.0f, 0.5f, 2.0f, 5.8f, 1, 3 );
ofsm << std::endl << "Sharpsh";
printskill( ofsm, 0, 5.0f, 2.0f, 6.0f,10.8f, 1, 1 );
ofsm << std::endl << "Magbllt";
printskill( ofsm, 6, 5.0f, 1.0f, 3.0f, 5.6f, 1, 1 );
ofsm << std::endl << "Pshotx1";
printskill( ofsm,-2, 2.5f, 1.0f, 3.0f, 4.9f, 1, 1 );
ofsm << std::endl << "Pshotx3";
printskill( ofsm,-2, 2.5f, 1.0f, 3.0f, 4.9f, 1, 3 );
ofsm << std::endl << "Dmite1x";
printskill( ofsm, 3, 2.1f, 1.0f, .0f, 6.3f, 2, 1 );
ofsm << std::endl << "Dmite4x";
printskill( ofsm, 3, 2.1f, 1.0f, .0f, 6.3f, 2, 4 );
break;
}
}
void printmageskill( std::ofstream &ofsm, int character )
{
switch(character)
{
case 0:
ofsm << "Chain M";
printskill( ofsm,-1, 1.5f, 1.0f, .0f, 5.4f, 1, 3 );
ofsm << std::endl << "RockR1x";
printskill( ofsm, 3, 3.8f, 1.25f, .0f, 5.2f, 1, 1 );
ofsm << std::endl << "RockR3x";
printskill( ofsm, 3, 3.8f, 1.25f, .0f, 5.2f, 1, 3 );
ofsm << std::endl << "CelestL";
printskill( ofsm, 8, 4.0f, 2.0f, .0f, 5.7f, 1, 1 );
ofsm << std::endl << "Rainbow";
printskill( ofsm, 6, 5.0f, 1.0f, .0f, 5.3f, 1, 1 );
ofsm << std::endl << "Rainb3x";
printskill( ofsm, 6, 5.0f, 4.33f, .0f, 5.3f, 1, 1 );
ofsm << std::endl << "K Smash";
printskill( ofsm,13, 9.0f, 3.0f, .0f, 7.0f, 2, 1 );
ofsm << std::endl << "L Drain";
printskill( ofsm, 2, 1.5f, 0.5f, .0f, 6.4f, 2, 7 );
break;
case 1:
ofsm << "Chain M";
printskill( ofsm,-1, 1.5f, 1.0f, .0f, 5.3f, 1, 3 );
ofsm << std::endl << "RockR1x";
printskill( ofsm, 2, 3.2f, 1.25f, .0f, 5.2f, 1, 1 );
ofsm << std::endl << "RockR3x";
printskill( ofsm, 2, 3.2f, 1.25f, .0f, 5.2f, 1, 3 );
ofsm << std::endl << "CelestL";
printskill( ofsm,10, 5.0f, 2.0f, .0f, 5.7f, 1, 1 );
ofsm << std::endl << "Rainbow";
printskill( ofsm,10, 7.0f, 1.0f, .0f, 5.3f, 1, 1 );
ofsm << std::endl << "Rainb3x";
printskill( ofsm,10, 7.0f, 4.33f, .0f, 5.3f, 1, 1 );
ofsm << std::endl << "K Smash";
printskill( ofsm,13, 9.0f, 2.0f, .0f, 7.0f, 2, 1 );
ofsm << std::endl << "L Drain";
printskill( ofsm, 1, 1.0f, 0.33f, .0f, 6.4f, 2, 7 );
break;
case 2:
ofsm << "Chain M";
printskill( ofsm,-1, 1.5f, 1.0f, .0f, 5.3f, 1, 3 );
ofsm << std::endl << "RockR1x";
printskill( ofsm, 1, 2.8f, 1.25f, .0f, 5.2f, 1, 1 );
ofsm << std::endl << "RockR3x";
printskill( ofsm, 1, 2.8f, 1.25f, .0f, 5.2f, 1, 3 );
ofsm << std::endl << "CelestL";
printskill( ofsm,12, 6.0f, 2.0f, .0f, 5.7f, 1, 1 );
ofsm << std::endl << "Rainbow";
printskill( ofsm, 8, 6.0f, 1.0f, .0f, 5.3f, 1, 1 );
ofsm << std::endl << "Rainb3x";
printskill( ofsm, 8, 6.0f, 4.33f, .0f, 5.3f, 1, 1 );
ofsm << std::endl << "K Smash";
printskill( ofsm,17,11.0f, 3.0f, .0f, 7.0f, 2, 1 );
ofsm << std::endl << "L Drain";
printskill( ofsm, 1, 1.2f, 0.5f, .0f, 6.4f, 2, 7 );
break;
}
}
void printpriestskill( std::ofstream &ofsm, int character )
{
switch(character)
{
case 0:
ofsm << "P Heal";
printskill( ofsm, 1, .38f, .125f, .0f, 6.2f, 1, 1, character == g_priest );
ofsm << std::endl << "Holy Bt";
printskill( ofsm, 2, 2.5f, 1.0f, .0f, 4.5f, 1, 2, character == g_priest );
ofsm << std::endl << "Silv Bt";
printskill( ofsm, 0, 5.0f, 1.5f, 4.0f, 5.8f, 1, 1, character == g_priest );
ofsm << std::endl << "HotG";
printskill( ofsm, 8,10.0f, 4.0f, .0f, 6.5f, 2, 1, character == g_priest );
break;
case 1:
ofsm << "P Heal";
printskill( ofsm, 1, .44f, 0.17f, .0f, 6.2f, 1, 1, character == g_priest );
ofsm << std::endl << "Holy Bt";
printskill( ofsm, 2, 1.6f, 1.0f, .0f, 4.5f, 1, 2, character == g_priest );
ofsm << std::endl << "Silv Bt";
printskill( ofsm, 0, 4.0f, 1.5f, 4.0f, 5.8f, 1, 1, character == g_priest );
ofsm << std::endl << "HotG";
printskill( ofsm, 8,10.0f, 4.0f, .0f, 8.4f, 2, 1, character == g_priest );
break;
case 2:
ofsm << "P Heal";
printskill( ofsm, 1, .42f, .143f, .0f, 6.2f, 1, 1, character == g_priest );
ofsm << std::endl << "Holy Bt";
printskill( ofsm, 2, 2.0f, 1.0f, .0f, 4.5f, 1, 2, character == g_priest );
ofsm << std::endl << "Silv Bt";
printskill( ofsm, 0, 3.5f, 1.5f, 4.0f, 5.8f, 1, 1, character == g_priest );
ofsm << std::endl << "HotG";
printskill( ofsm,12,12.0f, 4.0f, .0f, 6.5f, 2, 1, character == g_priest );
break;
}
}
int main(int argc, char *argv[])
{
int input;
std::cout << "Character 1: C(l)ara, (P)eter, (C)lemetas, (Q)uit" << std::endl;
input = switchinput("lpcqLPCQ1234") % 4;
if (input == 3)
return 0;
g_char1 = char1enum(input);
std::cout << "Character 2: (P)ippa, (E)dward, (Z)epher, (Q)uit" << std::endl;
input = switchinput("pezqPEZQ1234") % 4;
if (input == 3)
return 0;
g_char2 = char2enum(input);
std::cout << "Character 3: (E)isfford, (S)amuel, (M)atthieu, (Q)uit" << std::endl;
input = switchinput("esmqESMQ1234") % 4;
if (input == 3)
return 0;
g_char3 = char3enum(input);
std::string priestselect;
std::string priestselectmessage = "Blessing priest: ";
if (g_char1 == c1clemetas)
{
priestselect += "cC";
priestselectmessage += "(C)lemetas, ";
}
if (g_char2 == c2zepher)
{
priestselect += "zZ";
priestselectmessage += "(Z)epher, ";
}
if (g_char3 == c3matthieu)
{
priestselect += "mM";
priestselectmessage += "(M)atthieu, ";
}
int selection = 0;
if (priestselect.length() != 0)
{
priestselect += "nN";
priestselectmessage += "(N)obody, ";
priestselect += "qQ";
priestselectmessage += "(Q)uit";
std::cout << priestselectmessage << std::endl;
selection = switchinput( priestselect );
switch (priestselect[selection])
{
case 'c':
case 'C':
g_priest = pclemetas;
break;
case 'z':
case 'Z':
g_priest = pzepher;
break;
case 'm':
case 'M':
g_priest = pmatthieu;
break;
case 'n':
case 'N':
g_priest = pnone;
break;
case 'q':
case 'Q':
return 0;
}
}
else
g_priest = pnone;
std::cout << "Calculating and writing file... " << std::endl;
std::ofstream statfile ( g_outputfilename );
statfile << "Stats for party of ";
switch (g_char1)
{
case c1clara: statfile << "Clara,"; break;
case c1peter: statfile << "Peter,"; break;
case c1clemetas: statfile << "Clemetas,"; break;
}
switch (g_char2)
{
case c2pippa: statfile << " Pippa "; break;
case c2edward: statfile << " Edward "; break;
case c2zepher: statfile << " Zepher "; break;
}
statfile << "and ";
switch (g_char3)
{
case c3eisfford: statfile << "Eisfford"; break;
case c3samuel: statfile << "Samuel"; break;
case c3matthieu: statfile << "Matthieu"; break;
}
if (g_priest != pnone)
{
statfile << std::endl << "Blessing done by ";
switch (g_priest)
{
case pclemetas: statfile << "Clemetas"; break;
case pzepher: statfile << "Zepher"; break;
case pmatthieu: statfile << "Matthieu"; break;
}
g_lvl1bless = (int)(0.4f*20) + (int)(blessskillfactor[g_priest]*19);
g_lvl1bless_noskill = (int)(0.4f*20);
g_lvl2bless = (int)(0.4f*50) + (int)(blessskillfactor[g_priest]*30);
g_lvl2bless_noskill = (int)(0.4f*50);
}
statfile << std::endl << std::endl;
if (g_priest != pnone)
{
statfile << "\t Lvl" << g_level1 << "\tnsbless\t bless\tLvl" << g_level1 << "ns\tnsbless\t bless\t Lvl" << g_level2 << "\tnsbless\t bless\tLvl" << g_level2 << "ns\tnsbless\t bless";
}
else
{
statfile << "\t Lvl" << g_level1 << "\tNoSkill\t Lvl" << g_level2 << "\tNoSkill";
}
statfile << std::endl << std::endl;
switch(g_char1)
{
case c1peter:
statfile << "Peter:" << std::endl;
printriflemanskill( statfile, 0 );
break;
case c1clara:
statfile << "Clara:" << std::endl;
printmageskill( statfile, 0 );
break;
case c1clemetas:
statfile << "Clemetas:" << std::endl;
printpriestskill( statfile, 0 );
break;
}
statfile << std::endl << std::endl;
switch(g_char2)
{
case c2edward:
statfile << "Edward:" << std::endl;
printriflemanskill( statfile, 1 );
break;
case c2pippa:
statfile << "Pippa:" << std::endl;
printmageskill( statfile, 1 );
break;
case c2zepher:
statfile << "Zepher:" << std::endl;
printpriestskill( statfile, 1 );
break;
}
statfile << std::endl << std::endl;
switch(g_char3)
{
case c3samuel:
statfile << "Samuel:" << std::endl;
printriflemanskill( statfile, 2 );
break;
case c3eisfford:
statfile << "Eisfford:" << std::endl;
printmageskill( statfile, 2 );
break;
case c3matthieu:
statfile << "Matthieu:" << std::endl;
printpriestskill( statfile, 2 );
break;
}
statfile.close();
return 0;
} |
|
|
Back to top |
|
|
Mark Pay Site Admin

Joined: 09 Aug 2006 Posts: 624 Location: Margate, UK
|
Posted: Tue Jun 19, 2007 8:39 pm Post subject: |
|
|
|
Hi Boksha!
Thanks for posting this, it's very interesting. You must have put a lot of work into it. What does 'ns' stand for in the column headings?
I find game mechanic analysis fascinating stuff. I've been doing some for TSE-2, mainly with spreadsheets, to try and balance skills and skill progression. Often this doesn't work out quite how you hope when you play with the final result in game. |
|
Back to top |
|
|
Boksha-tse
Joined: 16 Jun 2007 Posts: 3
|
Posted: Tue Jun 19, 2007 11:26 pm Post subject: |
|
|
|
nsbless means blessed by a priest who invested no skill points in blessing (ns stands for No Skill). Something like Lvl20ns means having a party level of 20 but having no skill points invested in that skill. I wanted to know how useful moves would be when you don't invest skill points in it; you can see for example that Rainbow is much weaker when you don't invest skill points in it than Chain Magic, so when you're fighting NX enemies with a mage that has all skill points on Kinetic Smash, Chain Magic is the better backup spell. When choosing between skills that deal a different type of damage it might also be a good idea to choose the skill that relies most on investing skill points so your backup move suffers less.
I included the nsbless column to see if it's worth using bless anyway even if you didn't invest skill points in it. (for example when your only priest isn't really good at blessing, like Clemetas) |
|
Back to top |
|
|
cruz-tse Human
Joined: 28 Feb 2007 Posts: 44 Location: The Arcane Library - Ancient History Branch
|
Posted: Thu Jun 28, 2007 5:39 am Post subject: |
|
|
|
Question time!
1: how did you do this?
2: why did you do this?
3: how long did it take? |
|
Back to top |
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|