Automated skill analysis

 
Post new topic   Reply to topic    The Spirit Engine Forum Index // The Spirit Engine
View previous topic :: View next topic  
Author Message
Boksha-tse



Joined: 16 Jun 2007
Posts: 3

PostPosted: Sun Jun 17, 2007 2:32 pm    Post subject: Automated skill analysis Reply with quote
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
View user's profile Send private message
Mark Pay
Site Admin


Joined: 09 Aug 2006
Posts: 624
Location: Margate, UK

PostPosted: Tue Jun 19, 2007 8:39 pm    Post subject: Reply with quote
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
View user's profile Send private message Send e-mail ICQ Number
Boksha-tse



Joined: 16 Jun 2007
Posts: 3

PostPosted: Tue Jun 19, 2007 11:26 pm    Post subject: Reply with quote
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
View user's profile Send private message
cruz-tse
Human


Joined: 28 Feb 2007
Posts: 44
Location: The Arcane Library - Ancient History Branch

PostPosted: Thu Jun 28, 2007 5:39 am    Post subject: Reply with quote
Question time!

1: how did you do this?

2: why did you do this?

3: how long did it take?
Back to top
View user's profile Send private message Send e-mail
Post new topic   Reply to topic    The Spirit Engine Forum Index // The Spirit Engine All times are GMT
Page 1 of 1

 
Jump to:  
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

alexisBlue v1.2 // Theme Created By: Andrew Charron // Icons in Part By: Travis Carden
Powered by phpBB © 2001, 2002 phpBB Group