BOOL ActorStateMachine::PlayAttackAction(int skip){ FnActor actor; actor.Object(this->character); //ACTIONid actionID; char attackName[20] = "\0"; if (this->startAttack == TRUE){// first attack this->lastAttackFrame = 0.0f; this->startAttack = FALSE; // reset //sprintf(debug, "%sstart attack\n", debug); if (this->attackKeyQueue[currentAttackIndex] == NORMAL_ATT ){ sprintf(attackName, "N%d", currentAttackIndex + 1); // attackName should be "N1" }else if (this->attackKeyQueue[currentAttackIndex] == HEAVY_ATT){ sprintf(attackName, "H%d", currentAttackIndex + 1); // attackName should be "H1" } string systemName(attackName); this->SetNewAction(systemName); // it performs the new attack // set the flag here and BattleRoom will check it. this->newAttack = TRUE; }else{ // the attack name should be refine from reading the file BOOL ret = actor.Play(0,ONCE, (float)skip, TRUE,TRUE); this->UpdateEffectiveAttack(); if (ret == FALSE){ this->lastAttackFrame = 0.0f; // play the next one this->effectiveAttack = FALSE; currentAttackIndex++; if (currentAttackIndex >= lastAttackIndex){ // finish attacking this->ChangeState(STATEIDLE);// should be change into combatidle; this->attackDisable = FALSE; currentAttackIndex = 0; lastAttackIndex = 0; return FALSE; }else if (this->attackKeyQueue[currentAttackIndex] == NORMAL_ATT){ // get the next one attacking pos sprintf(attackName, "N%d", currentAttackIndex + 1); }else if (this->attackKeyQueue[currentAttackIndex] == HEAVY_ATT){ // get the next one attacking pos sprintf(attackName, "H%d", currentAttackIndex); }else{ sprintf(debug, "%s next Attack fail condition\n", debug); return FALSE; } string systemName(attackName); this->SetNewAction(systemName); // it performs the new attack // set the flag here and BattleRoom will check it and set the flag to FALSE after checking. this->newAttack = TRUE; } } //sprintf(debug, "%s lastAttack%d\n", debug, lastAttackIndex ); return TRUE; }
void OurActor::ourPlayAction() { FnActor actor; actor.Object( aID ); if(::actorChangePose( aID, current_OurAction->actID )) { current_frame = 0; } //it's a loop action? if( current_OurAction->type == Action_type::ACTION_IDLE() || current_OurAction->type == Action_type::ACTION_WALK() ) { bool notOver; notOver = actor.Play(0, ONCE, current_OurAction->play_speed, false, true); if( notOver ) current_frame += current_OurAction->play_speed; else { current_frame = 0; actor.MakeCurrentAction(0, NULL, current_OurAction->actID); } } else { bool notOver; notOver = actor.Play(0, ONCE, current_OurAction->play_speed, FALSE, TRUE); if( !notOver ) { if( current_OurAction->type.value != Action_type::ACTION_DIE() ) current_OurAction = ourIdleAction; } else current_frame += current_OurAction->play_speed; } playActionAudio(); playActionFx(); }
BOOL ActorStateMachine::PlayAction(int skip){ FnActor actor; actor.Object(this->character); if (this->CanBeControl() == TRUE){ actor.Play(0,LOOP, (float)skip, FALSE,TRUE); }else if (this->state == STATEATTACK){ this->PlayAttackAction(skip); }else if (this->state == STATEDAMAGE){ BOOL ret = actor.Play(0,ONCE, (float)skip, TRUE,TRUE); if (ret == FALSE){ //sprintf(debug, "%s damage end\n",debug); this->ChangeState(STATEIDLE); } }else if (this->state == STATEDIE){ BOOL ret = actor.Play(0,ONCE, (float)skip, TRUE,TRUE); if (ret == FALSE){ sprintf(debug, "%s character die\n",debug); this->ChangeState(STATEVANISH); } }else if (this->state == STATEVANISH){ if (this->fxDie != NULL) { BOOL beOK = this->fxDie->Play((float) skip); if (!beOK) { //fxDie->Reset(); // make it from the starting position and play it again // should delete the character delete fxDie; this->fxDie = NULL; FnScene scene; scene.Object(sID); scene.DeleteActor(this->character); } } } return TRUE; }
BOOL ActorStateMachine::SetNewAction(string systemName){ ACTIONid actionID = this->ActionIDMap[systemName]; FnActor actor; actor.Object(this->character); if (actor.MakeCurrentAction(0,NULL,actionID) == FAILED_ID){ sprintf(debug, "%s make current action %s fail\n", debug, systemName.c_str()); return FALSE; }else{ //sprintf(debug, "%s %s make successful\n", debug, systemName.c_str()); } if (actor.Play(0,START, 0.0, FALSE,TRUE) == FALSE){ sprintf(debug, "%s %s play action failed\n", debug, systemName.c_str()); return FALSE; }else{ //sprintf(debug, "%s %s play successful\n", debug, systemName.c_str()); } return TRUE; }