Advertisement
Guest User

Untitled

a guest
Aug 16th, 2014
349
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.46 KB | None | 0 0
  1. #include "stdAFX.h"
  2. #include "CEconomy.h"
  3. #include "IO_STB.h"
  4.  
  5. #ifdef  __SERVER
  6.     #include "ZoneLIST.H"
  7. #else
  8.     short g_nWorldRate=100;
  9.     short g_nWorldProc=100;
  10.  
  11.     short Get_WorldRATE ()                      {   return g_nWorldRate;        }
  12.     short Get_WorldPROD ()                      {   return g_nWorldProc;        }
  13.  
  14.     void  Set_WorldRATE (short nWorldRate)      {   g_nWorldRate=nWorldRate;    }
  15.     void  Set_WorldPROD (short nWorldProd)      {   g_nWorldProc=nWorldProd;    }
  16. #endif
  17.  
  18. //-------------------------------------------------------------------------------------------------
  19. CEconomy::CEconomy ()
  20. {
  21.     Init ();
  22. }
  23. CEconomy::~CEconomy ()
  24. {
  25.     // save ...
  26. }
  27.  
  28. //-------------------------------------------------------------------------------------------------
  29. void CEconomy::Init (void)
  30. {
  31.     // init !!!
  32.     m_btTOWN_RATE  = 100;
  33.  
  34. #if defined( __SERVER )
  35.     m_dwUpdateTIME = 0;
  36.     m_dwCheckTIME = 0;
  37.  
  38.     m_btSave_TOWN_RATE = 0;
  39.     ::ZeroMemory( m_btSave_ItemRATE,    sizeof(BYTE)* MAX_PRICE_TYPE );
  40. #endif
  41.  
  42.     for (short nP=MIN_PRICE_TYPE; nP<MAX_PRICE_TYPE; nP++) {
  43. #if defined( __SERVER )
  44.         m_iTownITEM[ nP ] = m_nTown_CONSUM[ nP ] * 100;
  45. #endif
  46.         m_btItemRATE[ nP ] = 50;
  47.     }
  48.  
  49.     // load from db ...
  50. }
  51.  
  52. //-------------------------------------------------------------------------------------------------
  53. #if defined( __SERVER )
  54. #ifdef  __SERVER
  55. bool CEconomy::Load (FILE *fp)
  56. #else
  57. bool CEconomy::Load ( CFileSystem* pFileSystem )
  58. #endif
  59. {
  60.     int iTownCounter, iPopBase, iDevBase, iValue;
  61.  
  62.     Init ();
  63.  
  64. #ifdef  __SERVER
  65.     fread( &iTownCounter,   sizeof(int),    1,  fp);    //  int : 체크 카운터
  66.     fread( &iPopBase,       sizeof(int),    1,  fp);    //  int : 기준 인구
  67.     fread( &iDevBase,       sizeof(int),    1,  fp);    //  int : 기준 발전량
  68. #else
  69.     pFileSystem->ReadInt32( &iTownCounter );    //  int : 체크 카운터
  70.     pFileSystem->ReadInt32( &iPopBase );    //  int : 기준 인구
  71.     pFileSystem->ReadInt32( &iDevBase );    //  int : 기준 발전량
  72. #endif
  73.  
  74.     if ( iTownCounter <= 1 )                // 갱신 주기가 1분 보다 작으면 24시간으로 강제 설정
  75.         iTownCounter = 60 * 24;
  76.  
  77.     m_iTownCounter = iTownCounter;
  78.     #define ECONMY_1MIN ( 1000*60 )         // 1 min
  79.     m_dwTown_COUNTER = iTownCounter * ECONMY_1MIN;
  80.  
  81.     m_nTown_POP_BASE = iPopBase;
  82.     m_nTown_DEV_BASE = iDevBase;
  83.  
  84.     m_iTownPOP = m_nTown_POP_BASE;
  85.     m_nTownDEV = m_nTown_DEV_BASE;
  86.  
  87.     for (short nP=MIN_PRICE_TYPE; nP<MAX_PRICE_TYPE; nP++)
  88.     {
  89.     #ifdef  __SERVER
  90.         fread( &iValue, sizeof(int),    1,  fp);
  91.     #else
  92.         pFileSystem->ReadInt32( &iValue );
  93.     #endif
  94.         m_nTown_CONSUM[ nP ] = iValue;
  95.     }
  96.  
  97.     return true;
  98. }
  99. #endif
  100.  
  101.  
  102. //-------------------------------------------------------------------------------------------------
  103. #define MIN_TOWN_ITEM   100
  104. #define MAX_TOWN_ITEM   32000
  105.  
  106. #if defined( __SERVER )
  107. bool CEconomy::Proc (DWORD dwCurTIME)
  108. {
  109.     if ( dwCurTIME - m_dwCheckTIME < m_dwTown_COUNTER )
  110.         return false;
  111.     m_dwCheckTIME  = dwCurTIME;
  112.  
  113.     // * 현재 인구수(TOWN_POP)
  114.     m_iTownPOP += (int)( ( m_nTownDEV - m_btTOWN_RATE ) * m_iTownPOP / 3000.f );
  115.    
  116.     // * 마을 발전도
  117.     // m_nTownDEV
  118.  
  119.     short nP;
  120.     // * TOWN_RATE = 각 생필품 종류별 물가들의 평균치.
  121.     for (nP=MIN_PRICE_TYPE; nP<MAX_PRICE_TYPE; nP++) {
  122.         // 소비량    (금속 기준 소비량 * (200 - 마을 발전도) * 마을 인구 ) / 150000
  123.         // 보유량에서 소비량 뺀다.
  124.         m_iTownITEM[ nP ] -= (int)( ( m_nTown_CONSUM[ nP ] * ( m_iTownCounter + 10 - m_nTownDEV*0.1f ) * m_iTownPOP ) / 50000 * ( m_iTownITEM[ nP ] * 0.01 + 50 ) / 100 );
  125.  
  126.         if ( m_iTownITEM[ nP ] < MIN_TOWN_ITEM ) m_iTownITEM[ nP ] = MIN_TOWN_ITEM;
  127.         else
  128.         if ( m_iTownITEM[ nP ] > MAX_TOWN_ITEM ) m_iTownITEM[ nP ] = MAX_TOWN_ITEM;
  129.     }
  130.  
  131.     int iTotRATE=0, iNewVALUE;
  132.     for (nP=MIN_PRICE_TYPE; nP<MAX_PRICE_TYPE; nP++) {
  133.         // ITEM_RATE 증감수치 =  (마을 인구 * 기준 소비량 / 10 - 아이템 보유량) / (현재 생필품 물가수치)
  134.         iNewVALUE = m_btItemRATE[ nP ] + ( m_iTownPOP * m_nTown_CONSUM[ nP ] / 10 - m_iTownITEM[ nP ] ) / 600;
  135.  
  136.         if ( iNewVALUE < 45 )
  137.             m_btItemRATE[ nP ] = 45;
  138.         else
  139.         if ( iNewVALUE > 65 )
  140.             m_btItemRATE[ nP ] = 65;
  141.         else
  142.             m_btItemRATE[ nP ] = iNewVALUE;
  143.  
  144.         iTotRATE += m_btItemRATE[ nP ];
  145.     }
  146.  
  147.     m_btTOWN_RATE = 80;
  148.     //m_btTOWN_RATE = iTotRATE / ( MAX_PRICE_TYPE-MIN_PRICE_TYPE );
  149.     //if ( m_btTOWN_RATE < 80  ) m_btTOWN_RATE = 80;
  150.     //else
  151.     //if ( m_btTOWN_RATE > 140 ) m_btTOWN_RATE = 140;
  152.  
  153.     m_nCur_WorldPROD = ::Get_WorldPROD ();
  154.     m_nCur_WorldRATE = ::Get_WorldRATE ();
  155.  
  156.     if ( 0 == ::memcmp( m_btSave_DATA, m_btCur_DATA, sizeof( m_btSave_DATA ) ) )
  157.         return false;
  158.  
  159.     m_dwUpdateTIME = dwCurTIME;
  160.     ::memcpy( m_btSave_DATA, m_btCur_DATA, sizeof( m_btSave_DATA ) );
  161.  
  162.     return true;
  163. }
  164.  
  165.  
  166. //-------------------------------------------------------------------------------------------------
  167. void CEconomy::BuyITEM (tagITEM &sITEM) // short nItemTYPE, short nItemNO, int iQuantity)
  168. {
  169.     // 생필품은 ITEM_TYPE_USE, ITEM_TYPE_NATURAL !!!
  170.     switch( sITEM.GetTYPE() ) {
  171.         case ITEM_TYPE_USE :
  172.         case ITEM_TYPE_NATURAL :
  173.         {
  174.             short nRateTYPE = ITEM_RATE_TYPE( sITEM.GetTYPE(), sITEM.GetItemNO() );
  175.             int iQuantity = ITEM_BASE_PRICE( sITEM.GetTYPE(), sITEM.GetItemNO() ) * sITEM.GetQuantity() / 100;
  176.  
  177.             m_iTownITEM[ nRateTYPE ] -= iQuantity;
  178.             if ( m_iTownITEM[ nRateTYPE ] < MIN_TOWN_ITEM )
  179.                 m_iTownITEM[ nRateTYPE ] = MIN_TOWN_ITEM ;
  180.         }
  181.     }
  182. }
  183. void CEconomy::SellITEM (tagITEM &sITEM, int iQuantity)
  184. {
  185.     // 생필품은 ITEM_TYPE_USE, ITEM_TYPE_NATURAL !!!
  186.     switch( sITEM.GetTYPE() ) {
  187.         case ITEM_TYPE_USE :
  188.         case ITEM_TYPE_NATURAL :
  189.         {
  190.             short nRateTYPE = ITEM_RATE_TYPE( sITEM.GetTYPE(), sITEM.GetItemNO() );
  191.            
  192.             m_iTownITEM[ nRateTYPE ] += ( ITEM_BASE_PRICE( sITEM.GetTYPE(), sITEM.GetItemNO() ) * iQuantity / 100 );
  193.             if ( m_iTownITEM[ nRateTYPE ] > MAX_TOWN_ITEM )
  194.                 m_iTownITEM[ nRateTYPE ] = MAX_TOWN_ITEM;
  195.         }
  196.     }
  197. }
  198. #endif
  199.  
  200. //-------------------------------------------------------------------------------------------------
  201. void CEconomy::SetTownRATE (int iValue)
  202. {
  203.     m_btTOWN_RATE = iValue;
  204. }
  205. void CEconomy::SetItemRATE(int iPriceType, int iValue)
  206. {
  207.     assert ( iPriceType >= MIN_PRICE_TYPE && iPriceType <  MAX_PRICE_TYPE );
  208.  
  209.     m_btItemRATE[ iPriceType ] = iValue;
  210. }
  211.  
  212. //-------------------------------------------------------------------------------------------------
  213. bool CEconomy::IsEssentialGoods (int iItemTYPE)
  214. {
  215.     // ITEM_TYPE( X,Y )
  216.     if ( ( iItemTYPE >= 421 && iItemTYPE <= 428 ) ||
  217.          ( iItemTYPE >= 311 && iItemTYPE <= 312 ) )
  218.         return true;
  219.  
  220.     return false;
  221. }
  222.  
  223. //-------------------------------------------------------------------------------------------------
  224. int CEconomy::Get_ItemBuyPRICE (short nItemTYPE, short nItemNO, short nBuySkillVALUE)
  225. {
  226.     int iPrice = 0;
  227.     int iItemRate, iPriceRate;
  228.  
  229.     switch( nItemTYPE ) {
  230.         case ITEM_TYPE_FACE_ITEM:  
  231.         case ITEM_TYPE_HELMET   :  
  232.         case ITEM_TYPE_ARMOR    :  
  233.         case ITEM_TYPE_GAUNTLET :  
  234.         case ITEM_TYPE_BOOTS    :  
  235.         case ITEM_TYPE_KNAPSACK :  
  236.         case ITEM_TYPE_WEAPON   :
  237.         case ITEM_TYPE_SUBWPN   :
  238.         case ITEM_TYPE_RIDE_PART:
  239.             // 2004. 1. 2 구입 가격 =
  240.             iPrice = (int)( ITEM_BASE_PRICE( nItemTYPE, nItemNO ) * ( ITEM_QUALITY( nItemTYPE, nItemNO )+50.f ) * ( 1.f - nBuySkillVALUE * 0.01 ) / 100.f + 0.5f );
  241.             break;
  242.  
  243.         case ITEM_TYPE_USE      :
  244.         case ITEM_TYPE_NATURAL  :
  245.             if ( IsEssentialGoods( ITEM_TYPE( nItemTYPE, nItemNO ) ) ) {
  246.                 // 생필품.
  247.                 // 구입 가격 = ITEM_BASE * { 1 + (ITEM_RATE - 50) * ITEM_FLUC / 1000 } * (1 - 구입스킬레벨 * 0.02)
  248.                 iItemRate  = this->Get_ItemRATE( ITEM_RATE_TYPE( nItemTYPE, nItemNO ) );
  249.                 iPriceRate = ITEM_PRICE_RATE( nItemTYPE, nItemNO );
  250.  
  251.                 iPrice = (int) (
  252.                             ITEM_BASE_PRICE( nItemTYPE, nItemNO ) *
  253.                             ( 1.f + ( iItemRate - 50.f ) * iPriceRate / 1000.f ) * ( 1.f - nBuySkillVALUE * 0.01f ) + 0.5f );
  254.                 break;
  255.             }
  256.  
  257.         case ITEM_TYPE_JEWEL    :
  258.         case ITEM_TYPE_GEM      :
  259.         case ITEM_TYPE_QUEST    :
  260.             // 2003. 08. 18 구입 가격 = ITEM_BASE * { 1 + (TOWN_RATE - 50) * ITEM_FLUC / 1000 } * (1 - 구입스킬레벨 * 0.02)
  261.             iPriceRate = ITEM_PRICE_RATE( nItemTYPE, nItemNO );
  262.             iPrice = (int) (
  263.                             ITEM_BASE_PRICE( nItemTYPE, nItemNO ) *
  264.                             ( 1.f + ( this->Get_TownRATE() - 50.f ) * iPriceRate / 1000.f ) * ( 1 - nBuySkillVALUE * 0.01f ) + 0.5f
  265.                             );
  266.             break;
  267.     }
  268.  
  269.     return iPrice;
  270. }
  271.  
  272. //-------------------------------------------------------------------------------------------------
  273. int CEconomy::Get_ItemSellPRICE (tagITEM &sITEM, short nSellSkillVALUE)
  274. {
  275.     int iPrice = 0;
  276.     int iItemRate, iPriceRate;
  277.  
  278.     switch( sITEM.m_cType ) {
  279.         case ITEM_TYPE_FACE_ITEM:  
  280.         case ITEM_TYPE_HELMET   :  
  281.         case ITEM_TYPE_ARMOR    :  
  282.         case ITEM_TYPE_GAUNTLET :  
  283.         case ITEM_TYPE_BOOTS    :  
  284.         case ITEM_TYPE_KNAPSACK :  
  285.         case ITEM_TYPE_WEAPON   :
  286.         case ITEM_TYPE_SUBWPN   :
  287.         case ITEM_TYPE_RIDE_PART:
  288.             // 추가옵션은 보석과 같이
  289.             iPrice = (int) (
  290.                         (float)ITEM_BASE_PRICE( sITEM.GetTYPE(), sITEM.GetItemNO() ) *
  291.                         (float)( 40 + sITEM.GetGrade() ) *
  292.                         (float)( 200 + sITEM.GetDurability() ) *
  293.                         (float)( 200 - Get_WorldRATE() ) *
  294.                         (float)( 1 + nSellSkillVALUE * 0.01f ) / 1000000.f *
  295.                         (float)( (4000+sITEM.GetLife()) / 14000.f ) +
  296.                         (float)( sITEM.IsAppraisal() * GEMITEM_BASE_PRICE( sITEM.GetOption() ) * 0.2f )
  297.                     ) ;
  298.             break;
  299.  
  300.         case ITEM_TYPE_USE      :
  301.         case ITEM_TYPE_NATURAL  :
  302.             if ( IsEssentialGoods( ITEM_TYPE( sITEM.m_cType, sITEM.m_nItemNo ) ) ) {
  303.                 iItemRate  = this->Get_ItemRATE( ITEM_RATE_TYPE( sITEM.m_cType, sITEM.m_nItemNo ) );
  304.                 iPriceRate = ITEM_PRICE_RATE( sITEM.m_cType, sITEM.m_nItemNo );
  305.                 // 생필품.
  306.                 // 판매 가격 = ITEM_BASE * { 1000 + (ITEM_RATE - 50) * ITEM_FLUC } * (1 + 판매스킬레벨 * 0.02) * (200- WORLD_RATE) / 200000
  307.                 iPrice = (int) (
  308.                     ITEM_BASE_PRICE( sITEM.m_cType, sITEM.m_nItemNo) *
  309.                     ( 1000 + ( iItemRate-50 ) * iPriceRate ) *
  310.                     ( 1 + nSellSkillVALUE * 0.01 ) * ( 200 - Get_WorldRATE() ) / 180000.f
  311.                     ) ;
  312.                 break;
  313.             }
  314.  
  315.         case ITEM_TYPE_JEWEL    :
  316.         case ITEM_TYPE_GEM      :
  317.         case ITEM_TYPE_QUEST    :
  318.             // 2003.08.018 그 밖의 아이템.
  319.             // 판매 가격 = ITEM_BASE * { 1000 + (TOWN_RATE - 50) * ITEM_FLUC } * (1 + 판매스킬레벨 * 0.02) * (200- WORLD_RATE) / 200000
  320.             iPriceRate = ITEM_PRICE_RATE( sITEM.m_cType, sITEM.m_nItemNo );
  321.             iPrice = (int) (
  322.                     ITEM_BASE_PRICE( sITEM.m_cType, sITEM.m_nItemNo) *
  323.                     ( 1000 + ( this->Get_TownRATE() - 50 ) * iPriceRate ) *
  324.                     ( 1 + nSellSkillVALUE * 0.01 ) * ( 200 - Get_WorldRATE() ) / 180000.f
  325.                     ) ;
  326.             break;
  327.     }
  328.  
  329.     return iPrice;
  330. }
  331.  
  332. //-------------------------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement