26 #ifndef CAVESTORY_MOD_API_H_ 
   27 #error "Please include CavestoryModAPI.h before including sub-classes." 
   41 #define NULL_DRAW_FUNC(NAME)                                                     
   42 #define USE_DRAW_FUNC(NAME)                                                     void __DRAW__##NAME(int, int, MYCHAR*, SafeClientInterface*); 
   43 #define DECLARE_PLAYER_STATE(NAME, CUSTOM_DRAW)                                 void __ACT__##NAME(BOOL, SafeClientInterface*, MYCHAR*, const MYCHAR_PHYSICS*);\ 
   44                                                                                 unsigned int __ANIMATE__##NAME(BOOL, MYCHAR*, SafeClientInterface*);\ 
   45                                                                                 static int PLAYER_STATE_##NAME;\ 
   50 #define NULL_DRAW_FUNC_IMPLEMENT(NAME)                                          PlayerStates::__ACT__##NAME,\ 
   51                                                                                 PlayerStates::__ANIMATE__##NAME,\ 
   53 #define USE_DRAW_FUNC_IMPLEMENT(NAME)                                           PlayerStates::__ACT__##NAME,\ 
   54                                                                                 PlayerStates::__ANIMATE__##NAME,\ 
   55                                                                                 PlayerStates::__DRAW__##NAME 
   56 #define IMPLEMENT_PLAYER_STATE(NAME, FLAGS, TRANSMIT_FLAGS, CUSTOM_DRAW, OVERRIDE, ANIMATE_TYPE)\ 
   57                                                                                 CSM_RegisterPlayerState(\ 
   58                                                                                     "PLAYER_STATE_" #NAME,\
 
   61                                                                                     CUSTOM_DRAW##_IMPLEMENT(NAME),\
 
   62                                                                                     &PlayerStates::PLAYER_STATE_##NAME,\
 
   64                                                                                     PlayerStateAnimator_OutputType::PSAOT_##ANIMATE_TYPE\
 
   72 #define PROCESS_WATER_SPLASHING()\ 
   73     if (!pMC->ignore_water && !pMC->sprash && (pMC->flag & GMC_flag::gmc_flag_on_water_tile)){\ 
   74         int dir = ((pMC->flag & 0x800) ? 2 : 0);\ 
   75         if ((pMC->flag & 8) == 0 && pMC->ym > 0x200){for (int a = 0; a < 8; a++){int x = pMC->x + (Random(-8, 8) * 0x200);SetNpChar(73, x, pMC->y, pMC->xm + Random(-0x200, 0x200), Random(-0x200, 0x80) - pMC->ym / 2, dir, 0, 0);}PlaySoundObject(56, 1);}\ 
   76         else{if (pMC->xm > 0x200 || pMC->xm < -0x200){for (int a = 0; a < 8; a++){int x = pMC->x + (Random(-8, 8) * 0x200);SetNpChar(73, x, pMC->y, pMC->xm + Random(-0x200, 0x200), Random(-0x200, 0x80), dir, 0, 0);}PlaySoundObject(56, 1);}}\ 
   78     if (!(pMC->flag & 0x100))pMC->sprash = 0; 
   83 #define PROCESS_MOVEMENT_TILES()\ 
   84     if (pMC->flag & GMC_flag::gmc_flag_in_current_left)\ 
   86     if (pMC->flag & GMC_flag::gmc_flag_in_current_up)\ 
   88     if (pMC->flag & GMC_flag::gmc_flag_in_current_right)\ 
   90     if (pMC->flag & GMC_flag::gmc_flag_in_current_down)\ 
   96 #define PROCESS_DAMAGE_TILES()\ 
   97     if (pMC->flag & GMC_flag::gmc_flag_on_damage_tile)\ 
   99         if (!CaveNet::Client::IsConnected() || CaveNet::Server::IsHosting())\ 
  100             pInterface->DamagePlayer(10);\ 
  106 #define LIMIT_VELOCITY(MULT)\ 
  107     if (pMC->ym > (physics->max_move * MULT))\ 
  108         pMC->ym = (physics->max_move * MULT);\ 
  109     if (pMC->ym < -(physics->max_move * MULT))\ 
  110         pMC->ym = -(physics->max_move * MULT);\ 
  111     if (pMC->xm > (physics->max_move * MULT))\ 
  112         pMC->xm = (physics->max_move * MULT);\ 
  113     if (pMC->xm < -(physics->max_move * MULT))\ 
  114         pMC->xm = -(physics->max_move * MULT); 
  119 #define LIMIT_VELOCITY_NORMAL()\ 
  120     if (pMC->ym > physics->max_move)\ 
  121         pMC->ym = physics->max_move;\ 
  122     if (pMC->ym < -physics->max_move)\ 
  123         pMC->ym = -physics->max_move;\ 
  124     if (pMC->xm > physics->max_move)\ 
  125         pMC->xm = physics->max_move;\ 
  126     if (pMC->xm < -physics->max_move)\ 
  127         pMC->xm = -physics->max_move; 
  131 #define IMPLEMENT_PLAYER_STATE_ANIM(NAME)       unsigned int PlayerStates::__ANIMATE__##NAME(BOOL bKey, MYCHAR* pMC, SafeClientInterface* pInterface) 
  132 #define IMPLEMENT_PLAYER_STATE_ACT(NAME)        void PlayerStates::__ACT__##NAME(BOOL bKey, SafeClientInterface* pInterface, MYCHAR* pMC, const MYCHAR_PHYSICS* physics) 
  133 #define IMPLEMENT_PLAYER_STATE_DRAW(NAME)       void PlayerStates::__DRAW__##NAME(int iFrameX, int iFrameY, MYCHAR* pMC, SafeClientInterface* pInterface) 
  134 #define GAMEFLAGS                               (*pInterface->mGameFlags) 
  135 #define KEY                                     (*pInterface->mKey) 
  136 #define KEYTRG                                  (*pInterface->mKeyTrg) 
  137 #define CLIENT                                  pInterface->mClient 
  138 #define ARMS_TABLE                              pInterface->mArms 
  139 #define SELECTED_WEAPON                         (*pInterface->mSelectedArms)