//////////////////////////////////////////////////////////////////////////////// // main //virtual eSysStateReturn GaMainGameState::main() { BcReal Tick = SysKernel::pImpl()->getFrameTime(); spawnKill(); // Update entities. /* for( BcU32 Idx = 0; Idx < Entities_.size(); ++Idx ) { GaGameComponent* pEntity = Entities_[ Idx ]; pEntity->update( Tick ); } //*/ // Check for win/lose condition. BcReal MaxFoodHealth = 0.0f; BcReal TotalFoodHealth = 0.0f; for( BcU32 Idx = 0; Idx < Entities_.size(); ++Idx ) { GaFoodComponentRef pFood( Entities_[ Idx ] ); if( pFood != NULL ) { MaxFoodHealth += 1.0f; TotalFoodHealth += pFood->getHealthFraction(); } } // Cache for rendering. FoodHealth_ = TotalFoodHealth / MaxFoodHealth; // If more than half of the food is deaded, we lose. if( FoodHealth_ < 0.5f ) { doLose(); } GaSwarmComponent* pSwarm = getEntity< GaSwarmComponent >( 0 ); // If the swarm is dead, you win. if( pSwarm->isAlive() == BcFalse ) { doWin(); } return sysSR_CONTINUE; }
BOOL doMove(HWND hwnd, BOXSTATE *man, BOXSTATE *next, BOXSTATE *dest, UINT vk) { BOOL bManMove = FALSE; BOOL bBoxMove = FALSE; BOOL bWin = FALSE; RECT rc; switch (*next) { case FLOOR: case DEST: bManMove = TRUE; break; case BOXIN: case BOXOUT: switch (*dest) { case FLOOR: case DEST: bBoxMove = TRUE; bManMove = TRUE; break; } } if (bBoxMove == TRUE) { CheckUndoMenu(hwnd, TRUE); CopyMemory(mapu, map, sizeof(map)); manxu = manx; manyu = many; ShowStepNumber(++nStep); } if (bBoxMove == TRUE) { if (*dest == DEST) *dest = BOXIN; else *dest = BOXOUT; if (*next == BOXIN) *next = DEST; else *next = FLOOR; } if (bManMove == TRUE) { if (*next == DEST) switch (vk) { case VK_UP: if (*man == MANBACK1 || *man == MANBACK1AT) *next = MANBACK2AT; else *next = MANBACK1AT; many--; break; case VK_DOWN: if (*man == MANFRONT1 || *man == MANFRONT1AT) *next = MANFRONT2AT; else *next = MANFRONT1AT; many++; break; case VK_LEFT: if (*man == MANLEFT1 || *man == MANLEFT1AT) *next = MANLEFT2AT; else *next = MANLEFT1AT; manx--; break; case VK_RIGHT: if (*man == MANRIGHT1 || *man == MANRIGHT1AT) *next = MANRIGHT2AT; else *next = MANRIGHT1AT; manx++; break; } else switch (vk) { case VK_UP: if (*man == MANBACK1 || *man == MANBACK1AT) *next = MANBACK2; else *next = MANBACK1; many--; break; case VK_DOWN: if (*man == MANFRONT1 || *man == MANFRONT1AT) *next = MANFRONT2; else *next = MANFRONT1; many++; break; case VK_LEFT: if (*man == MANLEFT1 || *man == MANLEFT1AT) *next = MANLEFT2; else *next = MANLEFT1; manx--; break; case VK_RIGHT: if (*man == MANRIGHT1 || *man == MANRIGHT1AT) *next = MANRIGHT2; else *next = MANRIGHT1; manx++; break; } switch (*man) { case MANFRONT1: case MANBACK1: case MANLEFT1: case MANRIGHT1: case MANFRONT2: case MANBACK2: case MANLEFT2: case MANRIGHT2: *man = FLOOR; break; case MANFRONT1AT: case MANBACK1AT: case MANLEFT1AT: case MANRIGHT1AT: case MANFRONT2AT: case MANBACK2AT: case MANLEFT2AT: case MANRIGHT2AT: *man = DEST; break; } } else switch (*man) { case MANFRONT1: case MANBACK1: case MANLEFT1: case MANRIGHT1: case MANFRONT2: case MANBACK2: case MANLEFT2: case MANRIGHT2: switch (vk) { case VK_UP: *man = MANBACK1; break; case VK_DOWN: *man = MANFRONT1; break; case VK_LEFT: *man = MANLEFT1; break; case VK_RIGHT: *man = MANRIGHT1; break; } break; case MANFRONT1AT: case MANBACK1AT: case MANLEFT1AT: case MANRIGHT1AT: case MANFRONT2AT: case MANBACK2AT: case MANLEFT2AT: case MANRIGHT2AT: switch (vk) { case VK_UP: *man = MANBACK1AT; break; case VK_DOWN: *man = MANFRONT1AT; break; case VK_LEFT: *man = MANLEFT1AT; break; case VK_RIGHT: *man = MANRIGHT1AT; break; } break; } if (bManMove == TRUE) if (bBoxMove == TRUE) { switch (vk) { case VK_UP: case VK_DOWN: SetRect(&rc, manx * BOXCX + sx, (many - 1) * BOXCY + sy, (manx + 1) * BOXCX + sx, (many + 2) * BOXCY + sy); break; case VK_LEFT: case VK_RIGHT: SetRect(&rc, (manx - 1) * BOXCX + sx, many * BOXCY + sy, (manx + 2) * BOXCX + sx, (many + 1) * BOXCY + sy); break; } } else { switch (vk) { case VK_UP: SetRect(&rc, manx * BOXCX + sx, many * BOXCY + sy, (manx + 1) * BOXCX + sx, (many + 2) * BOXCY + sy); break; case VK_DOWN: SetRect(&rc, manx * BOXCX + sx, (many - 1) * BOXCY + sy, (manx + 1) * BOXCX + sx, (many + 1) * BOXCY + sy); break; case VK_LEFT: SetRect(&rc, manx * BOXCX + sx, many * BOXCY + sy, (manx + 2) * BOXCX + sx, (many + 1) * BOXCY + sy); break; case VK_RIGHT: SetRect(&rc, (manx - 1) * BOXCX + sx, many * BOXCY + sy, (manx + 1) * BOXCX + sx, (many + 1) * BOXCY + sy); break; } } else SetRect(&rc, manx * BOXCX + sx, many * BOXCY + sy, (manx + 1) * BOXCX + sx, (many + 1) * BOXCY + sy); InvalidateRect(hwnd, &rc, TRUE); if (bBoxMove == TRUE) bWin = doWin(hwnd); return bWin; }