//**********************// // Apparatus Maze // //**********************// #include "scenario_common.h" // Global variable int BossID = -1; int bStartGame = 0; int StoneID[8]; int GeneralID[8]; int numStone = 0; float StoneTimer = -1; int bBossDown = 0; int GuardCount = 0; float CurVar = 1000; float EnvVar = 1000; float StoneX, StoneY, StoneZ; // scene has echo bVoiceEcho = 1; // Partner Position SpawnPartnerX = -21; SpawnPartnerY = 466.7; SpawnPartnerZ = -43.9; // Boss Position float BossX = 1700; float BossY = 1600; float BossZ = 400; // local variable int i, ObjectID; float HP; float MaxHP; float Distance; float dx, dy, dz; // temp code float PreHP; float timeCounter = 0; void ThrowRock(); // -------- // Game // -------- void OnCache() { LoadScene("se04s"); CacheLevelCharacter("ce14"); } void OnHostGame() { SetGameMaxTime(-1); SetAudioVariable(0,1000); InitScenario(); MaxHP = GetCharaAttrib(PlayerID, CHARA_MAX_HP); PreHP = GetCharaAttrib(PlayerID, CHARA_HP); // spawn boss BossID = SpawnChara("boss", BossX, BossY, BossZ); AIPerform(BossID, AI_PERFORM_IDLELOOK); SetAIAttrib(BossID, AI_LOOK_RANGE, 1); // Ensure that he doesn't go down until we tell him to // spawn boss rock x = 1700; y = 1600; z = 400; StoneID[0] = SpawnItem("SE04STONE_00", x, y+113, z); StoneID[1] = SpawnItem("SE04STONE_01", x-80, y+80, z); StoneID[2] = SpawnItem("SE04STONE_02", x-113, y, z); StoneID[3] = SpawnItem("SE04STONE_03", x-80, y-80, z); StoneID[4] = SpawnItem("SE04STONE_04", x, y-113, z); StoneID[5] = SpawnItem("SE04STONE_05", x+80, y-80, z); StoneID[6] = SpawnItem("SE04STONE_06", x+113, y, z); StoneID[7] = SpawnItem("SE04STONE_07", x+80, y+80, z); numStone = 0; var_aiLockCountLimit = 4; // mission SetMissionObjectiveText(0, MOBJ_SE04_1); SetMissionObjectiveText(1, MOBJ_SE04_2); SetMissionObjectiveText(2, MOBJ_SE04_3); var_uiGameOverVoice2 = NumToStr("tor_d%d", rand()%4+1); Print("Cutscene 07\n"); BeginCutscene("cutscene07"); bStartGame = 1; } void OnCharaDead(int id, int killer) { Print("Chara ", id, " is killed by ", killer, "\n"); // Player dead if (id == PlayerID) PlayerDead(); if (id == PartnerID) PartnerDead(); string CharaName = GetCharaString(id, CHARA_NAME); // guard captain if ( CharaName == "GENERAL") { KillScore(0, 200); // Destroy(id); } // boss if ( id == BossID) { KillScore(1, 750); SetMissionObjectiveSwitch(2, 0); PlayAICutsceneCB("cutscene08", "GameComplete"); } else { if ( id != PartnerID ) ThrowRock(); } // CharaReborn(id); } void OnTimeOver() { Print("TimeOver\n"); GameOver(GAMEOVER_LOSE); } void OnUpdate(float t) { CommonUpdate(t); if (bStartGame == 1) { SetAudioVariable(0, 1000); bStartGame = 0; } // HP Low if (CurVar == 3000) { timeCounter = timeCounter + t; } HP = GetCharaAttrib(PlayerID, CHARA_HP); if (timeCounter > 10) { EnvVar = 1000; timeCounter = 0; } if (HP < PreHP) { EnvVar = 3000; timeCounter = 0; } if (HP < (MaxHP/5) ) { EnvVar = 4000; } // Set Music if (CurVar != EnvVar) { SetAudioVariable(0, EnvVar); CurVar = EnvVar; } // check boss down GetEntityPos(BossID, x, y, z); if ( (bBossDown == 0) && (z < 300) ) { 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); bBossDown = 1; } //if (StoneTimer >= 0) //{ // StoneTimer = StoneTimer + t; // if (StoneTimer > 10) // { // ThrowRock(); // StoneTimer = 0; // } //} } /* void OnContinueGame() { CharaReborn(PlayerID); CharaReborn(PartnerID); TeleportChara(PartnerID, SpawnPartnerX, SpawnPartnerY, SpawnPartnerZ); TeleportChara(BossID, BossX, BossY, BossZ); CharaReborn(BossID, 0); SetAIAttrib(BossID, AI_LOOK_RANGE, 80); ClearAIBehavior(BossID, AI_STATE_SEARCH); SetAIBehavior(BossID, AI_STATE_SEARCH, AI_SEARCH_IDLE, 100); UpdateAIAttrib(BossID); // open boss door SetItemMachine(DoorID[15], 1, 1); bDoorOpened[15] = 1; // change light status SetSceneObjectSwitch("DLight_15", "PRESENT", 0); // delete stone for (i = 0 ; i < 8 ; i++) { if (StoneID[i] > 0) { Destroy(StoneID[i]); StoneID[i] = -1; } if (GeneralID[i] > 0) { Destroy(GeneralID[i]); GeneralID[i] = -1; } } // Activate Trigger ObjectID = FindItem("Trigger_BossRoom"); ActivateEntity(ObjectID, 1); PlayMusic("s05_apparatus_bgm", 1, 1); SetAudioVariable(0, 0); bStartGame = 1; } */ // ------------ // Rock // ------------ void ThrowRock() { if (numStone > 7) return; GetEntityPos(StoneID[numStone], x, y, z); CURRENT GetEntityPos(PlayerID, dx, dy, dz); ActivateEntity(StoneID[numStone], 0); ShowEntity(StoneID[numStone], 0); // Destroy(StoneID[numStone]); SpawnProjectile(99, x, y, z, dx, dy, dz+25); StoneX = x; StoneY = y; StoneZ = z; GetEntityPos(BossID, x, y, z); Play3DSound("char_23_tor_shout", x, y, z); numStone++; if (numStone > 7) { Print("***BossDown!!! ****"); 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); bBossDown = 1; } } void SE04STONE_InitItem(int id) { SetEntityRot(id, 0, 0, 90); SetItemAttrib(id, ITEM_MODEL, "se04stone01", 1); // SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_MACHINE2); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_WAITTIME, 0); SetItemAttrib(id, ITEM_ROTATEAXIS, 0, 0, 1); SetItemAttrib(id, ITEM_ROTATESPEED, 0.5); SetItemAttrib(id, ITEM_ROTATECENTER, 1700, 1600, 400); // SetItemAttrib(id, ITEM_ROTATEANGLE, 31.4); } void PRJ99_InitPrj(int id) { SetProjectileAttrib(id, PRJ_MODEL, "se04stone02", 1); SetProjectileAttrib(id, PRJ_SPEED, 300); SetProjectileAttrib(id, PRJ_GRAVITY, -10); SetProjectileAttrib(id, PRJ_LIFE_TIME, 10); SetProjectileAttrib(id, PRJ_DAMAGE, 100); SetProjectileAttrib(id, PRJ_SPAWN_POSITION, 0, 1, 0.65); SetProjectileAttrib(id, PRJ_SFX_FLY, "DART_Normal"); SetProjectileAttrib(id, PRJ_SFX_HITCHARA, "DART_HitBody"); SetProjectileAttrib(id, PRJ_SFX_HITCHARADEF, "DART_HitGround"); SetProjectileAttrib(id, PRJ_SFX_HITITEM, "DART_HitGround"); } void PRJ98_InitPrj(int id) { SetProjectileAttrib(id, PRJ_MODEL, "se04stone02", 1); SetProjectileAttrib(id, PRJ_SPEED, 300); SetProjectileAttrib(id, PRJ_GRAVITY, -10); SetProjectileAttrib(id, PRJ_LIFE_TIME, 10); SetProjectileAttrib(id, PRJ_DAMAGE, 100); SetProjectileAttrib(id, PRJ_SPAWN_POSITION, 0, 1, 0.65); SetProjectileAttrib(id, PRJ_SFX_FLY, "DART_Normal"); SetProjectileAttrib(id, PRJ_SFX_HITCHARA, "DART_HitBody"); SetProjectileAttrib(id, PRJ_SFX_HITCHARADEF, "DART_HitGround"); SetProjectileAttrib(id, PRJ_SFX_HITITEM, "DART_HitGround"); } void StoneGuard(int id) { for (i = 0 ; i < numStone ; i++) { if (StoneID[i] > 0) { GetEntityPos(id, x, y, z); if (i % 2) { GeneralID[i] = SpawnChara("guard", x, y, z); SetCharaWeapon(GeneralID[i], 22); } else { GeneralID[i] = SpawnChara("general", x, y, z); SetCharaWeapon(GeneralID[i], 52); } if (IsCharaCollideScene(GeneralID[i])) { dx = StoneX - x; dy = StoneY - y; dz = StoneZ - z; float dis = dx*dx + dy*dy + dz*dz; dis = sqrt(dis); dx = dx / dis; dy = dy / dis; dz = dz / dis; for (float sht = 5 ; sht < dis ; sht = sht + 5) { TeleportChara(GeneralID[i], x + sht*dx, y + sht*dy, z + sht*dz); if (!IsCharaCollideScene(GeneralID[i])) break; } } SetEntityPos(StoneID[i], x, y, z+30); ActivateEntity(StoneID[i], 1); ShowEntity(StoneID[i], 1); BreakItem(StoneID[i], 100); SpawnSFXOnEntity("SE04_RockExplo", StoneID[i]); StoneID[i] = -1; } } } void PRJ99_OnHitChara(int id, int charaId, int damage) { Print("OnHitChara"); StoneGuard(id); } void PRJ99_OnHitItem(int id, int itemId) { Print("OnHitItem"); StoneGuard(id); } void PRJ99_OnHitWall(int id) { Print("OnHitWall"); StoneGuard(id); } // ------------------ // Trigger // ------------------ void CUTSCENE07_OnEnd() { // destroy first stone ObjectID = FindItem("se04stone_00"); if (ObjectID > 0) Destroy(ObjectID); StoneID[0] = -1; numStone = 1; GeneralID[0] = SpawnChara("general", 1387.6, 1615.8, 110, 90); // activate rock StoneTimer = 0; CutsceneEndPos(1418.3, 1694.6, 111.2, 0.3, -0.9, 0, 1418.3, 1694.6, 111.2, 0.3, -0.9, 0, 1390, 1525, 110.3, 0.8, -0.5, 0, 1418.3, 1694.6, 111.2, 0.7, 0.7, 0); PlayMusic("s06_apparatus_boss", 1, 1); } void HINTSE045_InitItem(int id) { SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void HINTSE045_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; ShowHint(HINT_SE04_5); } // --------- // Enemy // --------- void GUARD_InitChara(int id) { // ce13 NPCE13_InitChara(id); SetCharaAttrib(id, CHARA_MAX_HP, 250*HandicapHP); // 生命上限 SetCharaAttrib(id, CHARA_HP, 250*HandicapHP); // 生命 SetCharaAttrib(id, CHARA_TEAM, 2); SetCharaWeapon(id, 22); } void GUARD_InitAI(int id) { AI_Guard(PlayerID, id); SetAIAttrib(id, AI_THINK_SPEED, 30*ResponseRate); ClearAIAllBehavior(id); // set AI behavior SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_PATROL, 100); SetAIBehavior(id, AI_STATE_LOCK, AI_LOCK_NEAREST_TARGET, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_DIRECT, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_JUMP, 50); SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_RANDOM, 100); // SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_COMBO, 50); UpdateAIAttrib(id); } void GENERAL_InitChara(int id) { // ce14 NPCE14_InitChara(id); SetCharaAttrib(id, CHARA_MAX_HP, 500*HandicapHP); // 生命上限 SetCharaAttrib(id, CHARA_HP, 500*HandicapHP); // 生命 SetCharaAttrib(id, CHARA_TEAM, 2); SetCharaWeapon(id, 52); SetCharaDart(id, 1, 20); } void GENERAL_InitAI(int id) { AI_Captain(PlayerID, id); SetAIAttrib(id, AI_THINK_SPEED, 50*ResponseRate); ClearAIAllBehavior(id); // set AI behavior SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_RANDOMRUN, 50); // id, type, num, rate SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_FOLLOW, 50, PlayerID); SetAIBehavior(id, AI_STATE_LOCK, AI_LOCK_NEAREST_TARGET, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_DIRECT, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_JUMP_SIDE, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_MOVE_SIDE, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_SHIFTMOVE, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_NOMOVE, 50); // SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_JUMP, 50); SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_RANDOM, 100); // SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_COMBO, 50); UpdateAIAttrib(id); } // boss void BOSS_InitChara(int id) { // ce09 CE09_InitChara(id); SetCharaAttrib(id, CHARA_MAX_HP, 2000*HandicapHP); SetCharaAttrib(id, CHARA_HP, 2000*HandicapHP); SetCharaAttrib(id, CHARA_TEAM, 2); SetCharaWeapon(id, 60); } void BOSS_InitAI(int id) { AI_Boss(PlayerID, id); SetAIAttrib(id, AI_THINK_SPEED, 100*ResponseRate); SetAIAttrib(id, AI_LOOK_RANGE, 80); ClearAIBehavior(id, AI_STATE_SEARCH); // set AI behavior SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_IDLE, 100); UpdateAIAttrib(id); } void TRIGGER_PLATFORM_OnTouch(int id, int charaId) { if (charaId != BossID) { Print("Enemy Stuck!\n"); GetSceneItemPos(FindSceneItem("DELIVERPOINT"), x, y, z); TeleportChara(charaId, x, y, z); } }