- struct STATS
- {
- unsigned long long MaxMP;
- unsigned int MagicAttack;
- unsigned int Attack_Power;
Highest char I have on official is lvl 83 so i have no data on on chars higher than that.
I was able to base damage up to lvl 130 all lvls past 130 use the formula for lvl 130.
Fixed typo in chartype.h
I ported MagicAttack from osprose base R2 over to the dev rev 2.
Plus I had to in order to split attack into the two types.
These must be added first before the battle.cpp code will work.
The battle code is at the bottom.
All changes are in color.
Lines 1 & 2 are so you know where the code was added under.
The lines above and below the color are so you know where to put it.
chartype.h
character.h
- // stats
- virtual unsigned int GetAttackPower( );
- virtual unsigned int GetMagicDefense( );
- virtual unsigned int GetMagicAttack( );
- virtual unsigned int GetCritical( );
charstats.cpp
- // virtual [return magic defense]
- unsigned int CCharacter::GetMagicDefense( )
- {
- return 0;
- }
- // virtual [return magic attack]
- unsigned int CCharacter::GetMagicAttack( )
- {
- return 0;
- }
- // virtual [return critical]
- unsigned int CCharacter::GetCritical( )
WorldMonster.h
- // Stats
- unsigned int GetAttackPower();
- unsigned int GetMagicDefense();
- unsigned int GetMagicAttack();
- unsigned int GetCritical();
MonsterStats.cpp
- return mdef;
- }
- // return magic attack
- unsigned int CMonster::GetMagicAttack( )
- {
- return thisnpc->magicattack;
- }
- // return max hp
- // unsigned int CMonster::GetMaxHP( )
- unsigned long long CMonster::GetMaxHP( )
- if (all||Stats->Magic_Defense==0)
- {
- Stats->Magic_Defense = GetMagicDefense();
- }
- if (all||Stats->MagicAttack==0)
- {
- Stats->MagicAttack = GetMagicAttack();
- }
- if (all||Stats->Critical==0)
player.h
- // Player Stats
- unsigned int GetAttackPower( );
- unsigned int GetCartSpeed( );
- unsigned int GetMagicAttack( );
- //unsigned int GetMaxHP( );
playerstats.cpp
- return Critical;
- }
- // Return Magic Attack based on the weapon currently equipped
- unsigned int CPlayer::GetMagicAttack( )
- {
- if(GServer->EquipList[WEAPON].Index[items[7].itemnum]->magicattack == 1)
- return 1;
- else
- return 0;
- }
- // Return Magic Defense with and without PAT //A_MRESIST(21) / MAGIC_RESISTENCE_2(98) ok
- unsigned int CPlayer::GetMagicDefense( )
- // calculate Player Stats
- void CPlayer::SetStats( )
- {
- //end
- Stats->MagicAttack = GetMagicAttack( );
- Stats->Attack_Power = GetAttackPower( );
datatypes.h
- // Equip information
- struct CEquip
- {
- UINT magicresistence;
- UINT magicattack;
- UINT attackdistance;
- struct CNPCData {
- UINT id;
- UINT magicdefense;
- UINT magicattack;
- UINT dodge;
startup.cpp
- //LMA: npc_data, STB version.
- bool CWorldServer::LoadNPCData( )
- {
- //LMA: Mass Exporter.
- if (Config.massexport==1)
- newnpc->atkspeed = STB_NPC.rows[i][14];
- newnpc->magicattack = STB_NPC.rows[i][15];
- newnpc->AI = STB_NPC.rows[i][16];
- //All files from itemtype 1 to 10 are loaded here, it's a test for weapons I guess.
- if (STB_ITEM[j].fieldcount>35)
- {
- newequip->attackpower = STB_ITEM[j].rows[i][35];
- newequip->attackspeed = STB_ITEM[j].rows[i][36];
- newequip->magicattack = STB_ITEM[j].rows[i][37]; //new. Staffs and wands are designated as magic weapons.
- if(newequip->magicattack > 1)newequip->magicattack = 0; //all the blue named spears have weird numbers here. Maybe why NA had a massive damage glitch with them.
- }
- else
- {
- newequip->attackpower = 0;
- newequip->attackspeed = 0;
- newequip->magicattack = 0;
- }
- //job1 to job3
- for(int k=0;k<3;k++)
Damage formula needs testing.
Thanks to PurpleYouko for sharing the code with me.
Changed a few things from PurpleYouko's version.
battle.cpp
- // do normal attack
- void CCharacter::NormalAttack( CCharacter* Enemy )
- {
- //LMA: Sometimes it's fired several times, no need to kill several times ;)
- bool is_already_dead=Enemy->IsDead();
- Position->destiny = Position->current;
- //LMA: Log
- if(IsPlayer())
- Log(MSG_INFO,"Forcing destiny to current (%.2f,%.2f), (%.2f,%.2f)",Position->current.x,Position->current.y,Position->destiny .x,Position->destiny .y);
- reduceItemsLifeSpan( false );
- Enemy->OnBeAttacked( this );
- int attack = 0;
- int LvlDiff = 0;
- int LvlBonus = (Stats->Level / 10) - 1;
- Log(MSG_INFO,"Lvl Bonus %i,%i",LvlBonus,Stats->Level);
- if(LvlBonus < 0) {LvlBonus = 0;}
- else if(LvlBonus > 13) {LvlBonus = 13;}
- int Lvldiff = (Stats->Level - LvlBonus) - (LvlBonus + Enemy->Stats->Level) + 15;
- Log(MSG_INFO,"Lvl diff %i,%i,%i,%i",Lvldiff,Stats->Level,LvlBonus,Enemy->Stats->Level);
- if(Lvldiff > 15)
- {
- Lvldiff = 15;
- Log(MSG_INFO,"Lvl diff max %i",Lvldiff);
- }
- else if(Lvldiff < 2)
- {
- Lvldiff = 2;
- Log(MSG_INFO,"Lvl diff min %i",Lvldiff);
- }
- if(Stats->MagicAttack == 1)
- {
- attack = Stats->Attack_Power - (Enemy->Stats->Magic_Defense / Lvldiff);
- Log(MSG_INFO,"MagicAtt %i,%i,%i,%i",attack,Stats->Attack_Power,Enemy->Stats->Magic_Defense,Lvldiff);
- }
- else
- {
- attack = Stats->Attack_Power - (Enemy->Stats->Defense / Lvldiff);
- Log(MSG_INFO,"NormalAtt %i,%i,%i,%i",attack,Stats->Attack_Power,Enemy->Stats->Defense,Lvldiff);
- }
- if(attack<0) attack = 5;
- LvlDiff = (Stats->Level - Enemy->Stats->Level) / 4;
- if(LvlDiff<7) LvlDiff = 4;
- attack += GServer->RandNumber( 0, LvlDiff );
- long int hitpower = (long int)floor (attack);
- if(IsPlayer( )) //temp fix to find balance btw monster and player
- hitpower = (long int)floor(attack * (GServer->Config.PlayerDmg/100.00));
- if(IsMonster( )) //temp fix to find balance btw monster and player
- hitpower = (long int)floor(attack * (GServer->Config.MonsterDmg/100.00));