#include "scenario_common.h" #include "common_se06.cs" // Global variable int BossID = -1; int bGameStart = 0; int EnemyID[5]; // Used for respawning and attribute setting int CFReady[5]; // Indicates where a status has risen and guard is ready to burst out int GhostFireID[8]; int iCurEHP = 100; int iCurMAXEHP = 600; int iBossAIState = 0; // 0 = inactive, 1 = active int bVisible = 0; int GuardNum = 0; // Number of active guards int bFirstReborn = 1; // Used to trigger the cutscene on 1st reborn int iSpawnIndex = 0; // Allows a different guard to spawn on each spawning int iMaxEnemiesAtOnce = 2; // scene has echo bVoiceEcho = 1; // Partner Position SpawnPartnerX = -98.09; SpawnPartnerY = 430; SpawnPartnerZ = 50; // Boss Position float BossX = 0; float BossY = -345; float BossZ = 210; // local variable int ObjectID; float dx, dy, dz; // ------------------ // global funcion // ------------------ int IsEnemyID(int id) { for(i = 0 ; i < 5 ; i++) { if(EnemyID[i]==id) return 1; } return 0; } void UpdateBossAI() { if (iBossAIState) return; // check player distance float range = Distance(BossID, PlayerID); if(range <= 50) { Print("BossID Chi Explode!\n"); SetCharaAttrib(BossID,CHARA_RAGE,100); AIPerform(BossID, AI_PERFORM_NONE); AIPerform(BossID, AI_PERFORM_ATTACK, "A+X"); } // check boss down or not GetEntityPos(BossID, x, y, z); if ( (iBossAIState == 0) && (z < 160) ) { Print("Boss Down!!\n"); // change boss behavior ClearAIBehavior(BossID, AI_STATE_SEARCH); SetAIBehavior(BossID, AI_STATE_SEARCH, AI_SEARCH_RANDOMRUN, 50); // id, type, num, rate SetAIBehavior(BossID, AI_STATE_SEARCH, AI_SEARCH_FOLLOW, 50, PlayerID, PartnerID); UpdateAIAttrib(BossID); SetAIAttrib(BossID, AI_LOOK_RANGE, 400); iBossAIState = 1; } } // ---------- // Game // ---------- void OnCache() { LoadScene("se06"); CacheLevelModel("Guard02"); } void OnHostGame() { SetGameMaxTime(-1); InitScenario(); // initial Parameters SetAudioVariable(0,1000); SetSceneObjectSwitch("cauldron", "PRESENT", 1); SetSceneObjectSwitch("o_xue", "PRESENT", 1); SetSceneObjectSwitch("cauldron", "GLOW", 0); SetSceneObjectSwitch("o_xue", "GLOW", 0); // Spawn Boss BossID = SpawnChara("boss", BossX, BossY, BossZ); ChangeBehavior(BossID, AI_SEARCH_IDLE); // Store IDs for all guards (inc. ones not being spawned now for (i = 0 ; i < 5 ; i++) { ClayFigureID[i] = FindSceneItem(NumToStr("GUARD02_%02d", i)); EnemyID[i] = -1; CFReady[i] = -1; } // Initially Spawn 'iMaxEnemiesAtOnce' Guards for (i = 0 ; i < iMaxEnemiesAtOnce ; i++) { GetSceneItemPos(ClayFigureID[i], x, y, z); EnemyID[i] = SpawnChara("guard", x, y, z); SetCharaAttrib(EnemyID[i], CHARA_MAX_HP, iCurEHP*HandicapHP); SetCharaAttrib(EnemyID[i], CHARA_HP, iCurEHP*HandicapHP); CFID[i] = -1; GuardNum++; iSpawnIndex++; //SetAIAttrib(id, AI_THINK_SPEED, 100); // 100 is the fastest } // TEMP --- to be taken out when cutscene to raise status is put back in. for (i = iMaxEnemiesAtOnce ; i < 5 ; i++) { GetSceneItemPos(ClayFigureID[i], x, y, z); GetSceneItemRot(ClayFigureID[i], dx, dy, dz); CFID[i] = SpawnItem("clayfigure", x, y, z, dx, dy, dz); } // Áô§Î SetCharaStatusEffect(BossID, STATUS_EFFECT_HIDDEN, 0, -1); bVisible = 0; // mission SetMissionObjectiveText(0, MOBJ_SE06_1); SetMissionObjectiveText(1, MOBJ_SE06_2); SetMissionObjectiveText(2, MOBJ_SE06_3); var_uiGameOverVoice2 = NumToStr("zara_d%d", rand()%3+1); var_aiLockCountLimit = 2; Print("cutscene11\n"); BeginCutscene("cutscene11"); bGameStart = 1; //TEMP -- to shut the partner up. //SetCharaAttrib(PartnerID, CHARA_HP, 1); } void CUTSCENE11_OnEnd() { PlayMusic("s08_yama_boss", 1, 1); SetAudioVariable(0, 0); CutsceneEndPos3(-117.3, -45.9, 11.6, 0.8, -0.6, 0, 63.7, -37.5, 11.6, -0.2, -0.9, 0); } void OnCharaDead(int id, int killer) { Print("Chara ", id, " is killed by ", killer, "\n"); if (id == PlayerID) GameOver(GAMEOVER_LOSE); else if (id == PartnerID) PartnerDead(); else if (id == BossID) { Print("Boss is Dead\n"); KillScore(1, 1000); SetMissionObjectiveSwitch(2, 0); PlayAICutsceneCB("cutscene12", "GameComplete"); } else if(IsEnemyID(id)) { Print("Enemy" ,id," Dead\n"); KillScore(0, 300); if (iBossAIState == 1) { Print("BossID Attack v^X+Y"); SetCharaAttrib(BossID,CHARA_RAGE,100); AIPerform(BossID, AI_PERFORM_ATTACK, "v^X+Y"); } GuardNum--; } // CharaReborn(id); } void OnTimeOver() { Print("TimeOver\n"); GameOver(GAMEOVER_LOSE); } void OnUpdate(float t) { CommonUpdate(t); if (bGameStart == 1) { SetAudioVariable(0, 1000); bGameStart = 0; } UpdateBossAI(); } // ------------ // Cauldron // ------------ void SE06CAULDRON_OnAttack(int id, int charaId, int damage) { if ( (charaId == PlayerID) || (charaId == PartnerID) ) { Print( "CAULDRON be att by",charaId,"\n"); if(CauldronHP > 0) { CauldronHP = CauldronHP - damage; Print( "CAULDRON HP:",CauldronHP,"\n"); if(CauldronHP <= 0){ SetMissionObjectiveSwitch(0, 0); // disable hint ObjectID = FindItem("HINTSE061_00"); ActivateEntity(ObjectID, 0); BreakCauldron(); Print("shortcut_jump"); SetCutsceneDelayTime(1.5); if (bVisible) BeginCutscene("shortcut_jump0", "shortcut_jump"); else BeginCutscene("shortcut_jump1", "shortcut_jump"); SetCutsceneDelayTime(0); } else PlaySound("impa_25_knock_on_wood"); } } } void SHORTCUT_JUMP_OnEnd() { // ²{§Î SetCharaStatusEffect(BossID, STATUS_EFFECT_HIDDEN, 0, 0); bVisible = 1; // change boss behavior ClearAIBehavior(BossID, AI_STATE_SEARCH); SetAIBehavior(BossID, AI_STATE_SEARCH, AI_SEARCH_RANDOMRUN, 50); // id, type, num, rate SetAIBehavior(BossID, AI_STATE_SEARCH, AI_SEARCH_FOLLOW, 50, PlayerID, PartnerID); UpdateAIAttrib(BossID); SetAIAttrib(BossID, AI_LOOK_RANGE, 400); // set boss down TeleportChara(BossID, -1.08, -171.90, 11.61); SetEntityDir(BossID, 0, 1, 0); iBossAIState = 1; } // ------------- // ClayFigure // ------------- void CLAYFIGURE_OnReach(int id, int np) { for (i = 0 ; i < 5 ; i++) { if (CFID[i] == id) break; } if (i >= 5) return; SetSceneObjectSwitch("cauldron", "GLOW", 0); SetSceneObjectSwitch("o_xue", "GLOW", 0); Print("OnReach : ", id); CFReady[i] = 1; } // ------------ // Trigger // ------------ void TRIGGER_ENEMYREBORN_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (CauldronHP <= 0) { ActivateEntity(id, 0); return; } if ((GuardNum == 0) && (iSpawnIndex >= 5) && (CauldronHP > 0)) { iSpawnIndex = 0; for (i = 0 ; i < 5 ; i++) { GetSceneItemPos(ClayFigureID[i], x, y, z); GetSceneItemRot(ClayFigureID[i], dx, dy, dz); CFID[i] = SpawnItem("clayfigure", x, y, z, dx, dy, dz); } SetSceneObjectSwitch("cauldron", "GLOW", 1); SetSceneObjectSwitch("o_xue", "GLOW", 1); if (bFirstReborn) { Print("shortcut3_1\n"); PlayAICutscene("shortcut3_1"); bFirstReborn = 0; } } // If all 5 guards haven't spawned then spawn some more if ( (GuardNum < iMaxEnemiesAtOnce) && (iSpawnIndex < 5) ) { for (i = iSpawnIndex ; i < 5 ; i++) { if ( GuardNum >= iMaxEnemiesAtOnce ) break; if ( CFReady[i] != -1 ) { Print("GuardNum = ",GuardNum, " ","iSpawnIndex = ",iSpawnIndex, "\n"); Print("Spawning ",i, "\n"); GetSceneItemPos(ClayFigureID[i], x, y, z); BreakItem(CFID[i], 300); if (EnemyID[i] == -1) { EnemyID[i] = SpawnChara("guard", x, y, z); } else { //First time spawn, so set everything up CharaReborn(EnemyID[i], 0); if(iCurEHP