/* ------------------ movement control ------------------ - */ void Movement(BYTE code, BOOL4 value) { FnCharacter actor; actor.ID(actorID); bool up = FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus('W'), down = FyCheckHotKeyStatus(FY_DOWN) || FyCheckHotKeyStatus('S'), left = FyCheckHotKeyStatus(FY_LEFT) || FyCheckHotKeyStatus('A'), right = FyCheckHotKeyStatus(FY_RIGHT) || FyCheckHotKeyStatus('D'), act = (frame - frameattack + 1000) % 1000 >= attacktime; if (code == 'J'&&value == TRUE) { if ((frame - frameattack + 1000) % 1000> attacktime) { actor.SetCurrentAction(NULL, 0, attackID, 5.0f); actor.Play(ONCE, 0.0f, FALSE, TRUE); frameattack = frame; FnCharacter npc1, npc2; npc1.ID(npc1ID); npc2.ID(npc2ID); float apos[3], npos[3], vector[2], fDir[3], rDir[3]; actor.GetDirection(fDir, NULL); actor.GetPosition(apos); npc1.GetPosition(npos); vector[0] = npos[0] - apos[0]; vector[1] = npos[1] - apos[1]; rDir[0] = fDir[1]; rDir[1] = -fDir[0]; if ((HP1>0) && (dot2(vector, fDir) / norm2(fDir)>0.0f) && (dot2(vector, fDir) / norm2(fDir) < 150.0f) && (abs(dot2(vector, rDir)) / norm2(rDir) < 20.0f)) { framedamage1 = frame + 10; HP1--; } npc2.GetPosition(npos); vector[0] = npos[0] - apos[0]; vector[1] = npos[1] - apos[1]; rDir[0] = fDir[1]; rDir[1] = -fDir[0]; if ((HP2>0) && (dot2(vector, fDir) / norm2(fDir)>0.0f) && (dot2(vector, fDir) / norm2(fDir) < 150.0f) && (abs(dot2(vector, rDir)) / norm2(rDir) < 20.0f)) { framedamage2 = frame + 10; HP2--; } } } else if (((up || down) && !(up&&down)) || ((left || right) && !(left&&right))) { curPoseID = runID; if (act) actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } else { curPoseID = idleID; if (act) actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } }
void RenderIt(int skip){ float pos[3], fDir[3], uDir[3]; FnViewport vp; if(!stateMenu) {mouseInput.update();} //render the whole scene vp.ID(viewportID); if (!stateGhost) vp.Render3D(cameraID, TRUE, TRUE); if(stateMenu) vp.RenderSprites(sID2menu, FALSE, TRUE); // no clear the background but clear the z buffer else vp.RenderSprites(sID2, FALSE, TRUE); // no clear the background but clear the z buffer //show frame rate static char string[128]; if(frame == 0){ FyTimerReset(0); } if((frame/10)*10 == frame){ float curTime; curTime = FyTimerCheckTime(0); sprintf_s(string, "Fps: %6.2f", frame/curTime); } frame += skip; if(frame >= 1000){ frame = 0; } FnText text, charactorInfo,char_HP,info; text.ID(textID); charactorInfo.ID(textCharID); char_HP.ID(textHP_vID); info.ID(textInfo_vID); text.Begin(viewportID); charactorInfo.Begin(viewportID); text.Write(string, 20, 20, 255, 0, 0); //get camera's data camera.getCameraPos(pos); camera.getCameraDir(fDir, uDir); float fCameraAngle = camera.getCameraAngle(); char posS[256], fDirS[256], uDirS[256]; sprintf_s(posS, "pos: %8.3f %8.3f %8.3f", pos[0], pos[1], pos[2]); sprintf_s(fDirS, "facing: %8.3f %8.3f %8.3f", fDir[0], fDir[1], fDir[2]); sprintf_s(uDirS, "up: %8.3f %8.3f %8.3f", uDir[0], uDir[1], uDir[2]); char sCameraAngle[256], sMousePosX[256], sMousePosY[256]; sprintf_s(sCameraAngle, "camera angle: %8.3f", fCameraAngle); sprintf_s(sMousePosX, "mouse X %d ", mouseInput.mousePosX); sprintf_s(sMousePosY, "mouse Y %d ", mouseInput.mousePosY); text.Write(sCameraAngle, 20, 35, 255, 255, 0); text.Write(sMousePosX, 20, 50, 255, 255, 0); text.Write(sMousePosY, 20, 65, 255, 255, 0); text.Write(posS, 20, 80, 255, 255, 0); text.Write(fDirS, 20, 95, 255, 255, 0); text.Write(uDirS, 20, 110, 255, 255, 0); FnCharacter actor; actor.ID(actorID); //get actor's data actor.GetPosition(pos); actor.GetDirection(fDir, uDir); sprintf_s(posS, "pos: %8.3f %8.3f %8.3f", pos[0], pos[1], pos[2]); sprintf_s(fDirS, "facing: %8.3f %8.3f %8.3f", fDir[0], fDir[1], fDir[2]); sprintf_s(uDirS, "up: %8.3f %8.3f %8.3f", uDir[0], uDir[1], uDir[2]); text.Write(posS, 20, 125, 255, 255, 0); text.Write(fDirS, 20, 140, 255, 255, 0); text.Write(uDirS, 20, 155, 255, 255, 0); text.End(); sprintf_s(posS, "HEALTH"); charactorInfo.Write(posS, 50, 700, 255, 255, 100); sprintf_s(posS, "ROUND"); charactorInfo.Write(posS, 400, 700, 255, 255, 100); sprintf_s(posS, "TIME"); charactorInfo.Write(posS, 515, 700, 255, 255, 100); charactorInfo.End(); sprintf_s(posS, "%d", chrMgtSystem.getCharacterblood(actorID)); char_HP.Write(posS, 110, 672, 255, 255, 255); sprintf_s(posS, "%d", game_timer.getCurrentRound()); info.Write(posS, 460, 694 ,255, 255, 255); sprintf_s(posS, "%d", game_timer.getTimeLeft()); info.Write(posS, 560, 694, 255, 255, 255); info.End(); FySwapBuffers(); }
/*------------------ movement control -------------------*/ void Movement(BYTE code, BOOL4 value) { ////////////////////////////////////////// // Homework #01 part 2 ////////////////////////////////////////// // note : only hotkey input can trigger this function FnCharacter actor; FnCharacter badguy; //Tang: FX vector<char*> FX_FileName; //Tang float actorPos[3], actorfDir[3], actoruDir[3]; float badguyPos[3], badguyfDir[3], badguyuDir[3]; actor.ID(actorID); actor.GetPosition(actorPos); actor.GetDirection(actorfDir, actoruDir); // 2. use a global idle_count variable to memorize the action status. // (to prevent the "slide" actor bug) if (value) { idle_count++; if (FyCheckHotKeyStatus(FY_Q) && dirCount % SMOOTHINESS == 0) { actorPos[0] += actorfDir[0] * HATKOFFSET; actorPos[1] += actorfDir[1] * HATKOFFSET; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < HATKRANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage1", HATKDAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } //Tang: FX FX_FileName.clear(); FX_FileName.push_back("LyubuDamege"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(BossID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < HATKRANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", HATKDAMAGE); //Tang: FX FX_FileName.clear(); FX_FileName.push_back("LyubuDamege"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } } if (FyCheckHotKeyStatus(FY_W) && dirCount % SMOOTHINESS == 0) { actorPos[0] += actorfDir[0] * NATK1OFFSET; actorPos[1] += actorfDir[1] * NATK1OFFSET; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK1RANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage2", NATK1DAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } //Tang: FX FX_FileName.clear(); FX_FileName.push_back("MonGotHit"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(BossID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK1RANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", NATK1DAMAGE); //Tang: FX FX_FileName.clear(); FX_FileName.push_back("MonGotHit2G02"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } } if (FyCheckHotKeyStatus(FY_E) && dirCount % SMOOTHINESS == 0) { actorPos[0] += actorfDir[0] * NATK2OFFSET; actorPos[1] += actorfDir[1] * NATK2OFFSET; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK2RANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage2", NATK2DAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } //Tang: FX FX_FileName.clear(); FX_FileName.push_back("Lyubu_atk01 -X"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK2RANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", NATK2DAMAGE); //Tang: FX FX_FileName.clear(); FX_FileName.push_back("Lyubu_atk01 -X"); GenFX(sID, gFXID, dummyID, badguyPos, FX_FileName); //Tang } } } if ((FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus(FY_S)) && dirCount % SMOOTHINESS == 0) { dirCount = 0 - dirState; dirState = 0; } if (FyCheckHotKeyStatus(FY_RIGHT) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS / 4 - dirState; dirState = SMOOTHINESS / 4; } if (FyCheckHotKeyStatus(FY_LEFT) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS * 3 / 4 - dirState; dirState = SMOOTHINESS * 3 / 4; } if (FyCheckHotKeyStatus(FY_DOWN) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS / 2 - dirState; dirState = SMOOTHINESS / 2; } } else { idle_count--; } // 3. the actor is idle when idle_count is equal to zero. if (idle_count > 0) { if (FyCheckHotKeyStatus(FY_Q) && dirCount % SMOOTHINESS == 0) { curPoseID = NormalAttack1ID; //Tang: FX FX_FileName.clear(); FX_FileName.push_back("AttacKBasic"); FX_FileName.push_back("Lyubu_skill01"); FX_FileName.push_back("LyubuDamege"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } else if (FyCheckHotKeyStatus(FY_W) && dirCount % SMOOTHINESS == 0) { curPoseID = NormalAttack2ID; //Tang: FX FX_FileName.clear(); FX_FileName.push_back("AttacKBasic"); FX_FileName.push_back("Lyubu_skill02"); FX_FileName.push_back("Lyubu_atk01"); FX_FileName.push_back("MonGotHit_1"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } else if (FyCheckHotKeyStatus(FY_E) && dirCount % SMOOTHINESS == 0) { curPoseID = HeavyAttack1ID; //Tang: FX FX_FileName.clear(); FX_FileName.push_back("AttacKBasic"); FX_FileName.push_back("Lyubu_skill03"); FX_FileName.push_back("MonGotHit2G04"); //FX_FileName.push_back("Lyubu_atk01 - X"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } else { curPoseID = runID; //Tang: FX FX_FileName.clear(); FX_FileName.push_back("RunFX"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } else if (curPoseID == runID) { curPoseID = idleID; actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } }
/*---------------------- perform the rendering C.Wang 0720, 2006 -----------------------*/ void RenderIt(int skip) { FnViewport vp; // render the whole scene vp.ID(vID); vp.Render3D(cID, TRUE, TRUE); // render the sprites vp.RenderSprites(sID2, FALSE, TRUE); // no clear the background but clear the z buffer FySwapBuffers(); // get camera's data FnCamera camera; camera.ID(cID); FnObject terrain; terrain.ID(tID); float pos[3], fDir[3], uDir[3]; //-----------------HW2 added-----------------------// float actorPos[3], actorfDir[3], actoruDir[3]; FnCharacter actor; actor.ID(actorID); actor.GetPosition(actorPos); actor.GetDirection(actorfDir, actoruDir); camera.GetPosition(pos); camera.GetDirection(fDir, uDir); // Initialze probing ray direction float dir[3], charDir[3]; dir[0] = -fDir[0] / CAMERAPROBE; dir[1] = -fDir[1] / CAMERAPROBE; dir[2] = -1; charDir[0] = actorfDir[0] / ACTORPROBE; charDir[1] = actorfDir[1] / ACTORPROBE; charDir[2] = -1; if ((FyCheckHotKeyStatus(FY_A) || FyCheckHotKeyStatus(FY_D)) && dirCount % SMOOTHINESS == 0) { int tempHeight = pos[2]; pos[2] = actorPos[2]; int theDistance = FyDistance(pos, actorPos); pos[0] = actorPos[0] - theDistance * actorfDir[0]; pos[1] = actorPos[1] - theDistance * actorfDir[1]; pos[2] = tempHeight; fDir[0] = actorfDir[0]; fDir[1] = actorfDir[1]; uDir[0] = fDir[0] / abs(fDir[0] * fDir[1]); uDir[1] = fDir[1] / abs(fDir[0] * fDir[1]); uDir[2] = -abs(uDir[0] * fDir[0] + uDir[1] * fDir[1]) / fDir[2]; } if ((FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus(FY_S)) && dirCount % SMOOTHINESS == 0) { if (pos[2] > actorPos[2] + HEIGHTOFFSET) { pos[2] = actorPos[2]; pos[2] = actorPos[2] + HEIGHTBOUND + HEIGHTOFFSET - FyDistance(pos, actorPos); fDir[0] = actorPos[0] - pos[0]; fDir[1] = actorPos[1] - pos[1]; fDir[2] = -pos[2]; uDir[0] = fDir[0] / abs(fDir[0] * fDir[1]); uDir[1] = fDir[1] / abs(fDir[0] * fDir[1]); uDir[2] = -abs(uDir[0] * fDir[0] + uDir[1] * fDir[1]) / fDir[2]; } else // Reset the up direction { pos[2] = actorPos[2] + HEIGHTOFFSET; fDir[0] = actorfDir[0]; fDir[1] = actorfDir[1]; fDir[2] = 0; uDir[0] = 0; uDir[1] = 0; uDir[2] = 1; } if (FyDistance(pos, actorPos) > LONGDIST) { pos[0] = actorPos[0] - LONGDIST * actorfDir[0]; pos[1] = actorPos[1] - LONGDIST * actorfDir[1]; pos[2] = actorPos[2] + HEIGHTOFFSET; fDir[0] = actorfDir[0]; fDir[1] = actorfDir[1]; fDir[2] = -0.0f; uDir[0] = actoruDir[0]; uDir[1] = actoruDir[1]; uDir[2] = actoruDir[2]; } } if (FyCheckHotKeyStatus(FY_RIGHT) && dirCount % SMOOTHINESS == 0) { actorPos[2] += HEIGHTOFFSET; if (terrain.HitTest(actorPos, charDir) <= 0) { camera.MoveRight(-CAMERASPEED, FALSE, FALSE, 0, FALSE); camera.GetPosition(pos); } fDir[0] = actorPos[0] - pos[0]; fDir[1] = actorPos[1] - pos[1]; fDir[2] = 0.0f; } if (FyCheckHotKeyStatus(FY_LEFT) && dirCount % SMOOTHINESS == 0) { actorPos[2] += HEIGHTOFFSET; if (terrain.HitTest(actorPos, charDir) <= 0) { camera.MoveRight(CAMERASPEED, FALSE, FALSE, 0, FALSE); camera.GetPosition(pos); } fDir[0] = actorPos[0] - pos[0]; fDir[1] = actorPos[1] - pos[1]; fDir[2] = 0.0f; } if (FyCheckHotKeyStatus(FY_DOWN) && dirCount % SMOOTHINESS == 0) { if (FyDistance(pos, actorPos) < SHORTDIST) { if (terrain.HitTest(pos, dir) > 0) { pos[0] = actorPos[0] + SHORTDIST * actorfDir[0]; pos[1] = actorPos[1] + SHORTDIST * actorfDir[1]; pos[2] = actorPos[2] + HEIGHTOFFSET; fDir[0] = -actorfDir[0]; fDir[1] = -actorfDir[1]; fDir[2] = 0.0f; uDir[0] = actoruDir[0]; uDir[1] = actoruDir[1]; uDir[2] = actoruDir[2]; } else { // go back and hit Obstacle : camera look down at the actor pos[2] = actorPos[2]; pos[2] = actorPos[2] + HEIGHTBOUND + HEIGHTOFFSET - FyDistance(pos, actorPos); fDir[0] = actorPos[0] - pos[0]; fDir[1] = actorPos[1] - pos[1]; fDir[2] = -pos[2]; uDir[0] = fDir[0] / abs(fDir[0] * fDir[1]); uDir[1] = fDir[1] / abs(fDir[0] * fDir[1]); uDir[2] = -abs(uDir[0] * fDir[0] + uDir[1] * fDir[1]) / fDir[2]; } } } //-----------------HW2 end-------------------------// if (dirCount % SMOOTHINESS == 0) { camera.SetPosition(pos); camera.SetDirection(fDir, uDir); } // show frame rate static char string[128]; if (frame == 0) { FyTimerReset(0); } if (frame / 10 * 10 == frame) { float curTime; curTime = FyTimerCheckTime(0); sprintf(string, "Fps: %6.2f", frame / curTime); } frame += skip; if (frame >= 1000) { frame = 0; } FnText text; text.ID(textID); text.Begin(vID); text.Write(string, 20, 20, 255, 0, 0); char posS[256], fDirS[256], uDirS[256], debug[256]; sprintf(posS, "pos: %8.3f %8.3f %8.3f", pos[0], pos[1], pos[2]); sprintf(fDirS, "facing: %8.3f %8.3f %8.3f", fDir[0], fDir[1], fDir[2]); sprintf(uDirS, "up: %8.3f %8.3f %8.3f", uDir[0], uDir[1], uDir[2]); sprintf(debug, "debug: %d %d %d", LyubuID.level, LyubuID.exp_cur, LyubuID.blood_remain); text.Write(posS, 20, 35, 255, 255, 0); text.Write(fDirS, 20, 50, 255, 255, 0); text.Write(uDirS, 20, 65, 255, 255, 0); text.Write(debug, 20, 90, 255, 255, 0); text.End(); // swap buffer FySwapBuffers(); }
/*------------------------------------------------------------- 30fps timer callback in fixed frame rate for major game loop --------------------------------------------------------------*/ void GameAI(int skip) { // play character pose FnCharacter actor; FnCharacter cur_actor; FnObject terrain; terrain.ID(tID); FnScene scene; scene.ID(sID); LyubuID.actorID = actorID; //Tang: FX float actorPos[3]; vector<char*> FX_FileName; //Tang actor.ID(actorID); //Tang: FX actor.GetPosition(actorPos); //Tang if (curPoseID == runID || curPoseID == idleID) actor.Play(LOOP, (float)skip, FALSE, TRUE); else if (actor.Play(ONCE, (float)skip, FALSE, TRUE) == 0) actor.SetCurrentAction(NULL, 0, idleID, 10.0f); for (int i = 0; i < NUM_OF_BADGUYS; i++) { cur_actor.ID(badguyID[i].actorID); if (badguyID[i].blood_remain > 0) { bool checkMove = MoveToTargetLocation(badguyID[i], LyubuID, badguyID, terrain); if (cur_actor.Play(ONCE, (float)skip, FALSE, TRUE) == 0) { if (checkMove) { ACTIONid CombatIdleID = cur_actor.GetBodyAction(NULL, "Run"); cur_actor.SetCurrentAction(NULL, 0, CombatIdleID); } else { ACTIONid CombatIdleID = cur_actor.GetBodyAction(NULL, "NormalAttack2"); cur_actor.SetCurrentAction(NULL, 0, CombatIdleID); //Tang: FX FX_FileName.clear(); FX_FileName.push_back("HitForRobber"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } } } } for (int i = 0; i < NUM_OF_BOSS; i++) { cur_actor.ID(BossID[i].actorID); ACTIONid cur_action = cur_actor.GetCurrentAction(NULL, 0); ACTIONid DieID = cur_actor.GetBodyAction(NULL, "Die"); if (cur_action == DieID) cur_actor.Play(ONCE, (float)skip, FALSE, TRUE); else if (BossID[i].blood_remain > 0) { bool checkMove = MoveToTargetLocation(BossID[i], LyubuID, BossID, terrain); if (cur_actor.Play(ONCE, (float)skip, FALSE, TRUE) == 0) { if (checkMove) { ACTIONid CombatIdleID = cur_actor.GetBodyAction(NULL, "Run"); cur_actor.SetCurrentAction(NULL, 0, CombatIdleID); } else { ACTIONid CombatIdleID = cur_actor.GetBodyAction(NULL, "HeavyAttack"); cur_actor.SetCurrentAction(NULL, 0, CombatIdleID); //Tang: FX FX_FileName.clear(); FX_FileName.push_back("HitForRobber"); GenFX(sID, gFXID, dummyID, actorPos, FX_FileName); //Tang } } } } // Camera's position and direction as a standard for character's location setting FnCamera camera; camera.ID(cID); float cameraPos[3], camerafDir[3], camerauDir[3]; camera.GetPosition(cameraPos); // not used camera.GetDirection(camerafDir, camerauDir); float camVertical = camerafDir[2]; camerafDir[2] = 0; // Guaranteed up direction be 1 camerauDir[0] = 0; camerauDir[1] = 0; camerauDir[2] = 1; float dir[3], origin[3], actorfDir[3], actoruDir[3];// origin is the actor's position actor.GetPosition(origin); actor.GetDirection(actorfDir, actoruDir); //Generator location genSpot[0][0] = 2905.724; genSpot[0][1] = -2856.196; genSpot[1][0] = 729.288; genSpot[1][1] = -2472.88; // Bad guys generator for (int i = 0; i < NUM_OF_GENERATOR; i++) { if (!InArea(origin, genSpot[i], generator[i].range)) { generator[i].in = 0; generator[i].double_in = 0; } if (generator[i].in && InArea(origin, genSpot[i], generator[i].range)) { generator[i].double_in = 1; } if (InArea(origin, genSpot[i], generator[i].range)) { generator[i].in = 1; } if (generator[i].in == 1 && generator[i].double_in == 0) generator[i].produce(origin, actoruDir, scene, i, NUM_OF_GENERATOR); } origin[2] = origin[2] + HEIGHTOFFSET; // need an offset to probe the hit dir[0] = actorfDir[0] / ACTORPROBE; dir[1] = actorfDir[1] / ACTORPROBE; dir[2] = -1.0f; ////////////////////////////////////////// // Homework #01 part 1 ////////////////////////////////////////// if (dirCount % SMOOTHINESS != 0) { if ((dirCount + SMOOTHINESS) % SMOOTHINESS < SMOOTHINESS / 2 + 1) { dirCount--; actor.TurnRight(360 / SMOOTHINESS); } else { dirCount++; actor.TurnRight(360 - 360 / SMOOTHINESS); } } if ((FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus(FY_S)) && dirCount % SMOOTHINESS == 0) { actor.SetDirection(camerafDir, camerauDir); if (terrain.HitTest(origin, dir) > 0) actor.MoveForward(RUNSPEED, FALSE, FALSE, 0, FALSE); } if (FyCheckHotKeyStatus(FY_D) && dirCount % SMOOTHINESS == 0) actor.TurnRight(TURNSPEED); if (FyCheckHotKeyStatus(FY_A) && dirCount % SMOOTHINESS == 0) actor.TurnRight(360 - TURNSPEED); else if (FyCheckHotKeyStatus(FY_RIGHT) && dirCount % SMOOTHINESS == 0) { actorfDir[0] = camerafDir[1]; actorfDir[1] = -camerafDir[0]; actor.SetDirection(actorfDir, actoruDir); if (terrain.HitTest(origin, dir) > 0) { //actor.MoveRight(CALLIBRATION, FALSE, FALSE, 0, FALSE); actor.MoveForward(RUNSPEED / 2, FALSE, FALSE, 0, FALSE); } } else if (FyCheckHotKeyStatus(FY_LEFT) && dirCount % SMOOTHINESS == 0) { actorfDir[0] = -camerafDir[1]; actorfDir[1] = camerafDir[0]; actor.SetDirection(actorfDir, actoruDir); if (terrain.HitTest(origin, dir) > 0) { //actor.MoveRight(CALLIBRATION, FALSE, FALSE, 0, FALSE); actor.MoveForward(RUNSPEED / 2, FALSE, FALSE, 0, FALSE); } } else if (FyCheckHotKeyStatus(FY_DOWN) && dirCount % SMOOTHINESS == 0) { actor.SetDirection(camerafDir, camerauDir); actor.TurnRight(180.0f); if (terrain.HitTest(origin, dir) > 0 && camVertical > MAXCAMANGLE) actor.MoveForward(RUNSPEED, FALSE, FALSE, 0, FALSE); } //Tang: FX if (gFXID != FAILED_ID) { FnGameFXSystem gxS(gFXID); BOOL4 beOK = gxS.Play((float)skip, ONCE); if (!beOK) { FnScene scene(sID); scene.DeleteGameFXSystem(gFXID); gFXID = FAILED_ID; } } //Tang }
/*------------------ movement control -------------------*/ void Movement(BYTE code, BOOL4 value) { ////////////////////////////////////////// // Homework #01 part 2 ////////////////////////////////////////// // note : only hotkey input can trigger this function FnCharacter actor; FnCharacter badguy; float actorPos[3], actorfDir[3], actoruDir[3]; float badguyPos[3], badguyfDir[3], badguyuDir[3]; actor.ID(actorID); actor.GetPosition(actorPos); actor.GetDirection(actorfDir, actoruDir); // 2. use a global idle_count variable to memorize the action status. // (to prevent the "slide" actor bug) if (value) { idle_count++; if (FyCheckHotKeyStatus(FY_Q) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { actorPos[0] += actorfDir[0] * HATKOFFSET; actorPos[1] += actorfDir[1] * HATKOFFSET; LyubuID.mana_remain = LyubuID.mana_remain - HATKDAMAGE; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < HATKRANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage1", HATKDAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(BossID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < HATKRANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", HATKDAMAGE); } } } if (FyCheckHotKeyStatus(FY_W) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { actorPos[0] += actorfDir[0] * NATK1OFFSET; actorPos[1] += actorfDir[1] * NATK1OFFSET; LyubuID.mana_remain = LyubuID.mana_remain - NATK1DAMAGE; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK1RANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage2", NATK1DAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(BossID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK1RANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", NATK1DAMAGE); } } } if (FyCheckHotKeyStatus(FY_E) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { actorPos[0] += actorfDir[0] * NATK2OFFSET; actorPos[1] += actorfDir[1] * NATK2OFFSET; LyubuID.mana_remain = LyubuID.mana_remain - NATK2DAMAGE; for (int i = 0; i < NUM_OF_BADGUYS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK2RANGE && badguyID[i].blood_remain > 0) { if (!ActAction(badguyID[i], "Damage2", NATK2DAMAGE)) { LyubuID.exp_cur += 50; if (LyubuID.exp_cur >= LyubuID.exp_total){ LyubuID.level++; LyubuID.exp_cur -= LyubuID.exp_total; } } } } for (int i = 0; i < NUM_OF_BOSS; i++) { badguy.ID(badguyID[i].actorID); badguy.GetPosition(badguyPos); if (FyDistance(badguyPos, actorPos) < NATK2RANGE && BossID[i].blood_remain > 0) { ActAction(BossID[i], "Donzo", NATK2DAMAGE); } } } if ((FyCheckHotKeyStatus(FY_UP) || FyCheckHotKeyStatus(FY_S)) && dirCount % SMOOTHINESS == 0) { dirCount = 0 - dirState; dirState = 0; } if (FyCheckHotKeyStatus(FY_RIGHT) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS / 4 - dirState; dirState = SMOOTHINESS / 4; } if (FyCheckHotKeyStatus(FY_LEFT) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS * 3 / 4 - dirState; dirState = SMOOTHINESS * 3 / 4; } if (FyCheckHotKeyStatus(FY_DOWN) && dirCount % SMOOTHINESS == 0) { dirCount = SMOOTHINESS / 2 - dirState; dirState = SMOOTHINESS / 2; } } else { idle_count--; } // 3. the actor is idle when idle_count is equal to zero. if (idle_count > 0) { if (FyCheckHotKeyStatus(FY_Q) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { curPoseID = NormalAttack1ID; } else if (FyCheckHotKeyStatus(FY_W) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { curPoseID = NormalAttack2ID; } else if (FyCheckHotKeyStatus(FY_E) && dirCount % SMOOTHINESS == 0 && LyubuID.mana_remain > 0) { curPoseID = HeavyAttack1ID; } else if (!FyCheckHotKeyStatus(FY_T) && !FyCheckHotKeyStatus(FY_M) && !FyCheckHotKeyStatus(FY_Q) && !FyCheckHotKeyStatus(FY_W) && !FyCheckHotKeyStatus(FY_E) ) { curPoseID = runID; } else { curPoseID = idleID; } actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } else if (curPoseID == runID) { curPoseID = idleID; actor.SetCurrentAction(NULL, 0, curPoseID, 5.0f); } if (FyCheckHotKeyStatus(FY_T) && picture_count <= 8) { char str_buf[16]; itoa(picture_count, str_buf, 10); string pic_num(str_buf); string picture = "startTalk_" + pic_num + ".png"; char* chr = strdup(picture.c_str()); showPicture(sp, chr, 780, 180, 10, 10); //showPicture parameter : FnSprite ,imageName, size, position free(chr); picture_count++; } else if (FyCheckHotKeyStatus(FY_T) && picture_count == 9){ showPicture(sp, "mission_transparent.png", 580, 580 , 110, 15); picture_count++; } else if (FyCheckHotKeyStatus(FY_T) && picture_count > 9) { showPicture(sp, "", 0, 0, 0, 0); } if (FyCheckHotKeyStatus(FY_M) && missionWindowStatus == FALSE && picture_count > 9) { showPicture(sp, "mission_transparent.png", 580, 580, 110, 15); missionWindowStatus = TRUE; } else if(FyCheckHotKeyStatus(FY_M) && missionWindowStatus == TRUE && picture_count > 9) { showPicture(sp, "", 0, 0, 0, 0); missionWindowStatus = FALSE; } }