ICharacter* MovieClip::getTopMost(float x, float y, bool polygonTest) { ICharacter* pRet = NULL; DisplayList::reverse_iterator rit = _display_list.rbegin(); while( rit != _display_list.rend() ) { MovieObject &object = rit->second; ICharacter* pCharacter = object._character; if (pCharacter && pCharacter->visible()) { MATRIX m; POINT local, world = {x,y}; m.setInverse( object._transform ); m.transform(local, world); pRet = pCharacter->getTopMost(local.x, local.y, polygonTest); if (pRet) { switch(pRet->type()) { case ICharacter::TYPE_BUTTON: case ICharacter::TYPE_MOVIE: return pRet; default: return this; } } } ++rit; } return NULL; }
ICharacter *World::AddCharacter(IMesh *mesh, s32 idAnimIdle, s32 idAnimWalk, f32 height) { ICharacter *character = new Character(this, physics, mesh, idAnimIdle, idAnimWalk, height); AddTransformable(character); character->drop(); return character; }
ICharacter *MovieClip::createCharacter(const ITag* tag, const PlaceObjectTag* place) { ICharacter *character = NULL; switch ( tag->code() ) { case TAG_DEFINE_SPRITE: character = new MovieClip(_owner, this, ((DefineSpriteTag*)tag)->getMovieFrames(), place); character->update(); _characters.push_back(character); break; case TAG_DEFINE_BUTTON2: character = new Button(*this, *(DefineButton2Tag*)tag); _characters.push_back(character); break; case TAG_DEFINE_EDIT_TEXT: character = new Text(*(DefineEditTextTag*)tag, place); _characters.push_back(character); break; case TAG_IMPORT_ASSETS2: character = ((ImportAssets2Tag*)tag)->getCharacter(); break; default: character = (DefineShapeTag*)tag; break; } return character; }
void Cure::use(ICharacter &target) { std::cout << "* heals " << target.getName() << "’s wounds *" << std::endl; AMateria::use(target); }
void Ice::use(ICharacter& target) { AMateria::use(target); std::cout << "* shoots an ice bolt at " << target.getName() << " *" << std::endl; }
void Ice::effect(ICharacter & target) { speak(std::string("* shoots an ice bolt at ") + target.getName() + " *"); }
void Cure::useMateria(ICharacter& user) { std::cout << "* heals " << user.getName() << "'s wounds *" << std::endl; }
void Cure::effect(ICharacter & target) { speak(std::string("* heals ") + target.getName() + "'s wounds *"); }
//Set Z for everything void World::Update() { //Update everything first for (int i = 0; i < capacity; i++) { ICharacter* player = players[i]; if (player) player->Update(); //set z } //Update map box objects (lol, i dont have any that move) //Update map circle objects (lol, i dont have any) //Check for collisions second for (int i = 0; i < capacity; i++) { ICharacter* player = players[i]; if (player) { Collision coll; Circle& circle = player->circle; //player collision with map boxes Box* pBox = boxList.Begin(); while (pBox != NULL) { if (Physics::CircleToBox(circle, *pBox, &coll)) Physics::ResolveCollision(circle, *pBox, coll); //player's balls (only circles) BallList* pBallList = &player->ballList; IBall* pBall = pBallList->Begin(); while (pBall != NULL) { Circle* pCircle = pBall->circle; if (pCircle != NULL && Physics::CircleToBox(*pCircle, *pBox, &coll)) if (pBall->Hit(COLL::OBJ, NULL) == COLL::BOUNCE) Physics::ResolveCollision(*pCircle, *pBox, coll); pBallList->Next(); pBall = pBallList->At(); } boxList.Next(); pBox = boxList.At(); } //Player collision with map circles Circle* pCircle = circleList.Begin(); while (pCircle != NULL) { if (Physics::CircleToCircle(circle, *pCircle, &coll)) Physics::ResolveCollision(circle, *pCircle, coll); //player's balls BallList* pBallList = &player->ballList; IBall* pBall = pBallList->Begin(); while (pBall != NULL) { Circle* pCircle2 = pBall->circle; Box* pBox = pBall->box; //Note at least one of these hitboxes is null if ((pBox != NULL && Physics::CircleToBox(*pCircle, *pBox, &coll)) || (pCircle2 != NULL && Physics::CircleToCircle(*pCircle, *pCircle2, &coll))) { if (pBall->Hit(COLL::OBJ, NULL) == COLL::BOUNCE) { if (pBox != NULL) Physics::ResolveCollision(*pCircle, *pBox, coll); else if (pCircle2 != NULL) Physics::ResolveCollision(*pCircle, *pCircle2, coll); } } pBallList->Next(); pBall = pBallList->At(); } circleList.Next(); pCircle = circleList.At(); } //player-player collisions for (int n = i + 1; n < capacity; n++) { ICharacter* player2 = players[n]; if (player2) { //player to player collision Circle& circle2 = player2->circle; if (Physics::CircleToCircle(circle, circle2, &coll)) Physics::ResolveCollision(circle, circle2, coll); //player's balls to player collisions BallList* pBallList = &player->ballList; IBall* pBall = pBallList->Begin(); while (pBall != NULL) { Circle* pCircle = pBall->circle; Box* pBox = pBall->box; COLL type; //Note at least one of these hitboxes is null if ((pBox != NULL && Physics::CircleToBox(circle2, *pBox, &coll)) || (pCircle != NULL && Physics::CircleToCircle(circle2, *pCircle, &coll))) { if (pBall->Hit(COLL::HIT, player2) == COLL::BOUNCE) { if (pBox != NULL) Physics::ResolveCollision(circle2, *pBox, coll); else if (pCircle != NULL) Physics::ResolveCollision(circle2, *pCircle, coll); } } //to player's balls collisions BallList* pBallList2 = &player2->ballList; IBall* pBall2 = pBallList2->Begin(); while (pBall2 != NULL) { Circle* pCircle2 = pBall2->circle; Box* pBox2 = pBall2->box; if (pBox != NULL) { if (pBox2 != NULL && Physics::BoxToBox(*pBox, *pBox2)) { pBall->Hit(COLL::BALL, NULL); pBall2->Hit(COLL::BALL, NULL); } else if (pCircle2 != NULL && Physics::CircleToBox(*pCircle2, *pBox, &coll)) if (pBall->Hit(COLL::BALL, NULL) == COLL::BOUNCE && pBall2->Hit(COLL::BALL, NULL) == COLL::BOUNCE) Physics::ResolveCollision(*pCircle2, *pBox, coll); } else if (pCircle != NULL) { if (pBox2 != NULL && Physics::CircleToBox(*pCircle, *pBox2, &coll)) { if (pBall->Hit(COLL::BALL, NULL) == COLL::BOUNCE && pBall2->Hit(COLL::BALL, NULL) == COLL::BOUNCE) Physics::ResolveCollision(*pCircle, *pBox2, coll); } else if (pCircle2 != NULL && Physics::CircleToCircle(*pCircle, *pCircle2, &coll)) if (pBall->Hit(COLL::BALL, NULL) == COLL::BOUNCE && pBall2->Hit(COLL::BALL, NULL) == COLL::BOUNCE) Physics::ResolveCollision(*pCircle, *pCircle2, coll); } if ((pBox != NULL && Physics::CircleToBox(circle2, *pBox, &coll)) || (pCircle != NULL && Physics::CircleToCircle(circle2, *pCircle, &coll))) { type = pBall->Hit(COLL::HIT, player2); if (type == COLL::BOUNCE) { if (pBox != NULL) Physics::ResolveCollision(circle2, *pBox, coll); else if (pCircle != NULL) Physics::ResolveCollision(circle2, *pCircle, coll); } } pBallList2->Next(); pBall2 = pBallList->At(); } pBallList->Next(); pBall = pBallList->At(); } } } } } }