From: Laszlo T. <ave...@us...> - 2005-08-28 13:20:29
|
Update of /cvsroot/gemrb/gemrb/gemrb/plugins/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14490/plugins/Core Modified Files: Actor.cpp Interface.cpp Interface.h Log Message: Core:Implemented MaximumAbility, ability dependent bonus tables GUIScript:Implemented GetAbilityBonus bg2: using GetAbilityBonus to display ability dependant values Index: Interface.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Interface.cpp,v retrieving revision 1.346 retrieving revision 1.347 diff -C2 -d -r1.346 -r1.347 *** Interface.cpp 27 Aug 2005 10:03:45 -0000 1.346 --- Interface.cpp 28 Aug 2005 13:20:19 -0000 1.347 *************** *** 65,68 **** --- 65,74 ---- static int strref_table[STRREFCOUNT]; + static int MaximumAbility = 25; + static ieWord *strmod = NULL; + static ieWord *strmodex = NULL; + static ieWord *intmod = NULL; + static ieWord *dexmod = NULL; + Interface::Interface(int iargc, char** iargv) { *************** *** 98,101 **** --- 104,108 ---- slottypes = NULL; slotmatrix = NULL; + ModalWindow = NULL; tooltip_x = 0; *************** *** 393,396 **** --- 400,483 ---- } + void FreeAbilityTables() + { + if (strmod) { + free(strmod); + } + if (strmodex) { + free(strmodex); + } + if (intmod) { + free(intmod); + } + if (dexmod) { + free(dexmod); + } + } + + bool GenerateAbilityTables() + { + FreeAbilityTables(); + + //range is: 0 - maximumability + int tablesize = MaximumAbility+1; + strmod = (ieWord *) malloc (tablesize * 4 * sizeof(ieWord) ); + if (!strmod) + return false; + strmodex = (ieWord *) malloc (101 * 4 * sizeof(ieWord) ); + if (!strmodex) + return false; + intmod = (ieWord *) malloc (tablesize * 3 * sizeof(ieWord) ); + if (!intmod) + return false; + dexmod = (ieWord *) malloc (tablesize * 3 * sizeof(ieWord) ); + if (!dexmod) + return false; + + return true; + } + + bool Interface::ReadAbilityTable(const ieResRef tablename, ieWord *mem, int columns, int rows) + { + TableMgr * tab; + int table=LoadTable( tablename ); + + if (table<0) { + return false; + } + tab = GetTable( table ); + if (!tab) { + DelTable(table); + return false; + } + for (int j=0;j<columns;j++) { + for( int i=0;i<rows;i++) { + mem[rows*j+i] = (ieWord) strtol(tab->QueryField(i,j),NULL,0 ); + } + } + DelTable(table); + return true; + } + + bool Interface::ReadAbilityTables() + { + bool ret = GenerateAbilityTables(); + if (!ret) + return ret; + ret = ReadAbilityTable("strmod", strmod, 4, MaximumAbility + 1); + if (!ret) + return ret; + ret = ReadAbilityTable("strmodex", strmodex, 4, 101); + //3rd ed doesn't have strmodex, but has a maximum of 40 + if (!ret && (MaximumAbility<=25) ) + return ret; + ret = ReadAbilityTable("intmod", intmod, 3, MaximumAbility + 1); + if (!ret) + return ret; + ret = ReadAbilityTable("dexmod", dexmod, 3, MaximumAbility + 1); + + return true; + } + /** this is the main loop */ void Interface::Main() *************** *** 942,946 **** printStatus( "OK", LIGHT_GREEN ); ! printMessage( "Core", "Initializing Inventory Management...", WHITE ); ret = InitItemTypes(); if (ret) { --- 1029,1033 ---- printStatus( "OK", LIGHT_GREEN ); ! printMessage( "Core", "Initializing Inventory Management...\n", WHITE ); ret = InitItemTypes(); if (ret) { *************** *** 951,955 **** } ! printMessage( "Core", "Initializing Spellbook Management...", WHITE ); ret = Spellbook::InitializeSpellbook(); if (ret) { --- 1038,1042 ---- } ! printMessage( "Core", "Initializing Spellbook Management...\n", WHITE ); ret = Spellbook::InitializeSpellbook(); if (ret) { *************** *** 960,964 **** } ! printMessage( "Core", "Initializing string constants...", WHITE ); ret = ReadStrrefs(); if (ret) { --- 1047,1051 ---- } ! printMessage( "Core", "Initializing string constants...\n", WHITE ); ret = ReadStrrefs(); if (ret) { *************** *** 969,973 **** } ! printMessage( "Core", "Initializing random treasure...", WHITE ); ret = ReadRandomItems(); if (ret) { --- 1056,1060 ---- } ! printMessage( "Core", "Initializing random treasure...\n", WHITE ); ret = ReadRandomItems(); if (ret) { *************** *** 977,980 **** --- 1064,1078 ---- printStatus( "ERROR", LIGHT_RED ); } + + + printMessage( "Core", "Initializing ability tables...\n", WHITE ); + ret = ReadAbilityTables(); + if (ret) { + printStatus( "OK", LIGHT_GREEN ); + } + else { + printStatus( "ERROR", LIGHT_RED ); + } + printMessage( "Core", "Core Initialization Complete!\n", WHITE ); ret = GEM_OK; *************** *** 1523,1526 **** --- 1621,1626 ---- } + MaximumAbility = ini->GetKeyAsInt ("resources", "MaximumAbility", 25 ); + SetFeature( ini->GetKeyAsInt( "resources", "IWD2ScriptName", 0 ), GF_IWD2_SCRIPTNAME ); SetFeature( ini->GetKeyAsInt( "resources", "HasSpellList", 0 ), GF_HAS_SPELLLIST ); *************** *** 3821,3822 **** --- 3921,3963 ---- return 0; } + + int Interface::GetMaximumAbility() { return MaximumAbility; } + + int Interface::GetStrengthBonus(int column, int value, int ex) + { + //to hit, damage, open doors, weight allowance + if (column<0 || column>3) + return -9999; + + if (value<0) + value = 0; + else if (value>25) + value = 25; + + if (ex<0) + ex=0; + else if (ex>100) + ex=100; + + return strmod[column*MaximumAbility+value]+strmodex[column*101+ex]; + } + + //only the first 3 columns are supported + int Interface::GetIntelligenceBonus(int column, int value) + { + //learn spell, max spell level, max spell number on level + if (column<0 || column>2) + return -9999; + + return intmod[column*MaximumAbility+value]; + } + + int Interface::GetDexterityBonus(int column, int value) + { + //reaction, missile, ac + if (column<0 || column>2) + return -9999; + + return dexmod[column*MaximumAbility+value]; + } + Index: Interface.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Interface.h,v retrieving revision 1.167 retrieving revision 1.168 diff -C2 -d -r1.167 -r1.168 *** Interface.h 14 Aug 2005 17:52:25 -0000 1.167 --- Interface.h 28 Aug 2005 13:20:19 -0000 1.168 *************** *** 419,422 **** --- 419,426 ---- returns gold value! */ int CanMoveItem(CREItem *item); + int GetMaximumAbility(); + int GetStrengthBonus(int column, int value, int ex); + int GetIntelligenceBonus(int column, int value); + int GetDexterityBonus(int column, int value); /** applies the spell on the target */ *************** *** 444,447 **** --- 448,453 ---- bool ReadRandomItems(); bool ReadItemTable(const ieResRef item, const char *Prefix); + bool ReadAbilityTables(); + bool ReadAbilityTable(const ieResRef name, ieWord *mem, int cols, int rows); /** handles the QuitFlag bits (main loop events) */ void HandleFlags(); Index: Actor.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/Actor.cpp,v retrieving revision 1.123 retrieving revision 1.124 diff -C2 -d -r1.123 -r1.124 *** Actor.cpp 15 Aug 2005 15:55:39 -0000 1.123 --- Actor.cpp 28 Aug 2005 13:20:19 -0000 1.124 *************** *** 67,99 **** static int constitution_fighter[26]; ! static void InitActorTables() ! { ! int i; ! ! int table = core->LoadTable( "clskills" ); ! TableMgr *tm = core->GetTable( table ); ! classcount = tm->GetRowCount(); ! clericspelltables = (char **) calloc(classcount, sizeof(char*)); ! wizardspelltables = (char **) calloc(classcount, sizeof(char*)); ! for(i = 0; i<classcount; i++) { ! char *spelltablename = tm->QueryField( i, 1 ); ! if (spelltablename[0]!='*') { ! clericspelltables[i]=strdup(spelltablename); ! } ! spelltablename = tm->QueryField( i, 2 ); ! if (spelltablename[0]!='*') { ! wizardspelltables[i]=strdup(spelltablename); ! } ! } ! core->DelTable( table ); ! ! table = core->LoadTable( "hpconbon" ); ! tm = core->GetTable( table ); ! for(i=0;i<26;i++) { ! constitution_normal[i] = atoi(tm->QueryField( i, 1) ); ! constitution_fighter[i] = atoi(tm->QueryField( i, 2) ); ! } ! core->DelTable( table ); ! } PCStatsStruct::PCStatsStruct() --- 67,71 ---- static int constitution_fighter[26]; ! static void InitActorTables(); PCStatsStruct::PCStatsStruct() *************** *** 427,430 **** --- 399,440 ---- }; + static void InitActorTables() + { + int i; + + int table = core->LoadTable( "clskills" ); + TableMgr *tm = core->GetTable( table ); + classcount = tm->GetRowCount(); + clericspelltables = (char **) calloc(classcount, sizeof(char*)); + wizardspelltables = (char **) calloc(classcount, sizeof(char*)); + for(i = 0; i<classcount; i++) { + char *spelltablename = tm->QueryField( i, 1 ); + if (spelltablename[0]!='*') { + clericspelltables[i]=strdup(spelltablename); + } + spelltablename = tm->QueryField( i, 2 ); + if (spelltablename[0]!='*') { + wizardspelltables[i]=strdup(spelltablename); + } + } + core->DelTable( table ); + + //these will be moved to core + table = core->LoadTable( "hpconbon" ); + tm = core->GetTable( table ); + for(i=0;i<26;i++) { + constitution_normal[i] = atoi(tm->QueryField( i, 1) ); + constitution_fighter[i] = atoi(tm->QueryField( i, 2) ); + } + core->DelTable( table ); + i = core->GetMaximumAbility(); + maximum_values[IE_STR]=i; + maximum_values[IE_INT]=i; + maximum_values[IE_DEX]=i; + maximum_values[IE_CON]=i; + maximum_values[IE_CHR]=i; + maximum_values[IE_WIS]=i; + } + bool Actor::SetStat(unsigned int StatIndex, ieDword Value) { |