#include "scenario_common.h" // Global variable int BossID = -1; int bGameStart = 0; int SwitchID[4]; int Roller01ID[4], Roller02ID[4], RollerHurtID[4]; int bTurnOff[4]; int SwitchCount = 0; float PowerTimer = 0; int bElectrified = 0; //int RollerPos = 1; float chargeTime = 15; // 充電時間 (兩次間隔) float electrifyTime = 7.5; // 放電時間 float prepareTime = 1.1; // 放電前尖刺發亮時間 int SFXStep = 0; int DartZombieID[4]; // use secondary bUseSecondary = 1; // scene has echo bVoiceEcho = 1; // Partner Position SpawnPartnerX = 0; SpawnPartnerY = -200; SpawnPartnerZ = 50; // Boss Position float BossX = -38.2; float BossY = 0.4; float BossZ = -4; // local variable int i, ObjectID, res; float dx, dy, dz; // ------- // Game // ------- void OnCache() { LoadScene("sw04"); // CacheLevelModel(""); } void OnHostGame() { SetGameMaxTime(-1); InitScenario(); // Spawn Boss BossID = SpawnChara("boss", BossX, BossY, BossZ); for ( i = 0 ; i < 4 ; i++ ) { SwitchID[i] = FindItem(NumToStr("SW04SWITCH_%02d", i)); bTurnOff[i] = 0; SetSceneObjectSwitch(NumToStr("Light%02d", i), "PRESENT", 1); } for ( i = 0 ; i < 4 ; i++ ) { Roller01ID[i] = FindItem(NumToStr("SW04Roller01_%02d", i)); Roller02ID[i] = FindItem(NumToStr("SW04Roller02_%02d", i)); GetEntityPos(Roller02ID[i], x, y, z); GetEntityRot(Roller02ID[i], dx, dy, dz); RollerHurtID[i] = SpawnServerItem(NumToStr("rollerhurt_%02d", i), x, y, z, dx, dy, dz); ActivateEntity(RollerHurtID[i], 0); } /* GetEntityPos(Roller01ID[0], x, y, z); SetItemAttrib(Roller01ID[0], ITEM_MOVEPOINT, 2, x, y, z, x-380, y, z); SetItemAttrib(Roller02ID[0], ITEM_MOVEPOINT, 2, x, y, z, x-380, y, z); SetItemAttrib(RollerHurtID[0], ITEM_MOVEPOINT, 2, x, y, z, x-380, y, z); GetEntityPos(Roller01ID[1], x, y, z); SetItemAttrib(Roller01ID[1], ITEM_MOVEPOINT, 2, x, y, z, x, y-380, z); SetItemAttrib(Roller02ID[1], ITEM_MOVEPOINT, 2, x, y, z, x, y-380, z); SetItemAttrib(RollerHurtID[1], ITEM_MOVEPOINT, 2, x, y, z, x, y-380, z); GetEntityPos(Roller01ID[2], x, y, z); SetItemAttrib(Roller01ID[2], ITEM_MOVEPOINT, 2, x, y, z, x+380, y, z); SetItemAttrib(Roller02ID[2], ITEM_MOVEPOINT, 2, x, y, z, x+380, y, z); SetItemAttrib(RollerHurtID[2], ITEM_MOVEPOINT, 2, x, y, z, x+380, y, z); GetEntityPos(Roller01ID[3], x, y, z); SetItemAttrib(Roller01ID[3], ITEM_MOVEPOINT, 2, x, y, z, x, y+380, z); SetItemAttrib(Roller02ID[3], ITEM_MOVEPOINT, 2, x, y, z, x, y+380, z); SetItemAttrib(RollerHurtID[3], ITEM_MOVEPOINT, 2, x, y, z, x, y+380, z); */ GetEntityPos(Roller01ID[1], x, y, z); SetItemAttrib(Roller01ID[1], ITEM_MOVEPOINT, 4, x, y, z, x-640, y, z, x-60, y, z, x, y, z); SetItemAttrib(Roller02ID[1], ITEM_MOVEPOINT, 4, x, y, z, x-640, y, z, x-60, y, z, x, y, z); SetItemAttrib(RollerHurtID[1], ITEM_MOVEPOINT, 4, x, y, z, x-640, y, z, x-60, y, z, x, y, z); GetEntityPos(Roller01ID[0], x, y, z); SetItemAttrib(Roller01ID[0], ITEM_MOVEPOINT, 4, x, y, z, x, y-640, z, x, y-60, z, x, y, z); SetItemAttrib(Roller02ID[0], ITEM_MOVEPOINT, 4, x, y, z, x, y-640, z, x, y-60, z, x, y, z); SetItemAttrib(RollerHurtID[0], ITEM_MOVEPOINT, 4, x, y, z, x, y-640, z, x, y-60, z, x, y, z); GetEntityPos(Roller01ID[3], x, y, z); SetItemAttrib(Roller01ID[3], ITEM_MOVEPOINT, 4, x, y, z, x+640, y, z, x+60, y, z, x, y, z); SetItemAttrib(Roller02ID[3], ITEM_MOVEPOINT, 4, x, y, z, x+640, y, z, x+60, y, z, x, y, z); SetItemAttrib(RollerHurtID[3], ITEM_MOVEPOINT, 4, x, y, z, x+640, y, z, x+60, y, z, x, y, z); GetEntityPos(Roller01ID[2], x, y, z); SetItemAttrib(Roller01ID[2], ITEM_MOVEPOINT, 4, x, y, z, x, y+640, z, x, y+60, z, x, y, z); SetItemAttrib(Roller02ID[2], ITEM_MOVEPOINT, 4, x, y, z, x, y+640, z, x, y+60, z, x, y, z); SetItemAttrib(RollerHurtID[2], ITEM_MOVEPOINT, 4, x, y, z, x, y+640, z, x, y+60, z, x, y, z); // spawn guard for (i = 0 ; i < 4 ; i++) { ObjectID = FindSceneItem(NumToStr("ZOMBIE_%02d", i)); GetSceneItemPos(ObjectID, x, y, z); SpawnChara("zombie", x, y, z); DartZombieID[i] = ObjectID = FindSceneItem(NumToStr("DARTZOMBIE_%02d", i)); GetSceneItemPos(ObjectID, x, y, z); SpawnChara("dartzombie", x, y, z); } SetSceneObjectSwitch("electric", "GLOW", 0); var_aiLockCountLimit = 4; // mission SetMissionObjectiveText(0, MOBJ_SW04_1); var_uiGameOverVoice2 = NumToStr("derais_d%d", rand()%4+1); Print("cutscene23\n"); BeginCutscene("cutscene23"); bGameStart = 1; } void CUTSCENE23_OnEnd() { PlayMusic("s14_electric_boss"); SetAudioVariable(0, 0); CutsceneEndPos3(216, -14, -27, -0.6, 0.8, 0, 226, 13, -27, -1, -0.2, 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) { SetMissionObjectiveSwitch(0, 0); KillScore(1, 1750); // run cutscene 24 PlayAICutsceneCB("cutscene24", "GameComplete"); } else { KillScore(0, 475); Destroy(id); } // CharaReborn(id); } void OnTimeOver() { Print("TimeOver\n"); GameOver(GAMEOVER_LOSE); } void OnUpdate(float t) { CommonUpdate(t); if (bGameStart == 1) { SetAudioVariable(0, 1000); bGameStart = 0; } if (SwitchCount < 4) { PowerTimer = PowerTimer + t; if (PowerTimer > (electrifyTime+chargeTime) ) { Print("Power off!\n"); // boss demonize if (!IsCharaDemonized(BossID)) { SetCharaAttrib(BossID,CHARA_RAGE,100); AIPerform(BossID, AI_PERFORM_DEMONIZE); } bElectrified = 0; PowerTimer = 0; SFXStep = 0; } else if ( (PowerTimer > chargeTime) && (!bElectrified) ) { Print("Power On!\n"); bElectrified = 1; SetSceneObjectSwitch("electric", "GLOW", 0); // Boss charge // AIPerform(BossID, AI_PERFORM_POSE, 1107, electrifyTime); // Roller activate for (i = 0 ; i < 4 ; i++) { // if (!bTurnOff[i]) // { SetItemMachine(Roller01ID[i], 1); SetItemMachine(Roller02ID[i], 1); SpawnSFXOnEntity("SW04_Roll_Can", Roller02ID[i]); ActivateEntity(RollerHurtID[i], 1); SetItemMachine(RollerHurtID[i], 1); /* SetItemAttrib(Roller01ID[i], ITEM_MOVESPEED, 300); SetItemAttrib(Roller02ID[i], ITEM_MOVESPEED, 300); SetItemAttrib(RollerHurtID[i], ITEM_MOVESPEED, 300); */ // } } } else if ( (PowerTimer > chargeTime - prepareTime) && (!bElectrified) && (SFXStep == 0) ) { SetSceneObjectSwitch("electric", "GLOW", 1); SpawnSFX2("SW04_E_Ball", 150.762, -86.764, 354.125, -121.056, 1.829, -30.017); SpawnSFX2("SW04_E_Body", 97.476, -55.528, 239.682, -121.056, 1.829, -30.017); SpawnSFX2("SW04_E_Needle2", 38.113, -22.899, 116.027, -121.056, 1.829, -30.017); SpawnSFX2("SW04_E_Ball", -151.414, -89.347, 354.125, 121.056, -1.829, -30.017); SpawnSFX2("SW04_E_Body", -99.762, -55.464, 240.063, 121.056, -1.829, -30.017); SpawnSFX2("SW04_E_Needle2", -39.644, -23.018, 116.027, 121.056, -1.829, -30.017); SpawnSFX2("SW04_E_Ball", -0.543, 172.438, 354.125, 0, 0, -30); SpawnSFX2("SW04_E_Body", -0.543, 108.207, 240.849, 0, 0, -30); SpawnSFX2("SW04_E_Needle2", -0.543, 44.243, 116.027, 0, 0, -30); SpawnSFX2("SW04_E_Needle1", -0.778, -0.559, 184.276, 0, 0, 0); SpawnSFX2("SW04_E_Center01", 0, 0, 0, 0, 0, 0); SpawnSFX2("SW04_E_Center01", 0, 0, 0, 90, 0, 0); SpawnSFX2("SW04_E_Center01", 0, 0, 0, 190, 0, 0); SpawnSFX2("SW04_E_Center01", 0, 0, 0, 270, 0, 0); SpawnSFX2("SW04_E_Center02", 0, 0, 0, 0, 0, 0); SpawnSFX2("SW04_E_Center02", 0, 0, 0, 90, 0, 0); SpawnSFX2("SW04_E_Center02", 0, 0, 0, 190, 0, 0); SpawnSFX2("SW04_E_Center02", 0, 0, 0, 270, 0, 0); SpawnSFX2("SW04_E_Upper01", 0, 0, 170, 0, 0, 0); SpawnSFX2("SW04_E_Upper01", 0, 0, 170, 90, 0, 0); SpawnSFX2("SW04_E_Upper01", 0, 0, 170, 190, 0, 0); SpawnSFX2("SW04_E_Upper01", 0, 0, 170, 270, 0, 0); SpawnSFX2("SW04_E_Upper02", 0, 0, 170, 0, 0, 0); SpawnSFX2("SW04_E_Upper02", 0, 0, 170, 90, 0, 0); SpawnSFX2("SW04_E_Upper02", 0, 0, 170, 190, 0, 0); SpawnSFX2("SW04_E_Upper02", 0, 0, 170, 270, 0, 0); SFXStep = 1; } } // refill zombie dart for (i = 0 ; i < 4 ; i++) { res = GetCharaNumDarts(DartZombieID[i]); if (res < 1) SetCharaDart(DartZombieID[i], 1, 30); } } // -------------------- // Electric Collector // -------------------- void SW04SWITCH_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "sw04switch", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_WAITTIME, 0); SetItemAttrib(id, ITEM_ROTATEAXIS, 1, 0, 0); SetItemAttrib(id, ITEM_ROTATESPEED, 1.2); SetItemAttrib(id, ITEM_ROTATEANGLE, 1.6); } void SW04SWITCH_OnAttack(int id, int charaId, int damage) { Print(id, " is attacked by ", charaId, "\n"); if (charaId != PlayerID) return; for (i = 0 ; i < 4 ; i++) { if ( id == SwitchID[i] ) { if (bTurnOff[i]) return; else { bTurnOff[i] = 1; SetSceneObjectSwitch(NumToStr("Light%02d", i), "PRESENT", 0); SwitchCount++; if (SwitchCount == 4) { bElectrified = 0; SetSceneObjectSwitch("electric", "GLOW", 0); CharaSay(BossID, MSG_DERAIS_1); } break; } } } // move bar SetItemMachine(id, 1); } void SW04ROLLER01_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "sw04roller01", 1); // SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_MACHINE); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_WAITTIME, 0); SetItemAttrib(id, ITEM_MOVETYPE, 1); SetItemAttrib(id, ITEM_MOVESPEED, 300); SetItemAttrib(id, ITEM_NEXTPOINT, 1); SetItemAttrib(id, ITEM_ROTATEAXIS, 1, 0, 0); SetItemAttrib(id, ITEM_ROTATESPEED, 12.56); } void SW04ROLLER01_OnReach(int id, int np) { if (np == 1) { SetItemAttrib(id, ITEM_ROTATESPEED, -12.56); } else if (np == 2) { SetItemAttrib(id, ITEM_MOVESPEED, 40); SetItemAttrib(id, ITEM_ROTATESPEED, -2); } else if (np == 3) { SetItemAttrib(id, ITEM_MOVESPEED, 300); SetItemAttrib(id, ITEM_ROTATESPEED, 12.56); SetItemMachine(id, 0); } // SetItemAttrib(id, ITEM_MOVESPEED, 0); } void SW04ROLLER02_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "sw04roller02", 1); // SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_MACHINE); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_WAITTIME, 0); SetItemAttrib(id, ITEM_MOVETYPE, 1); SetItemAttrib(id, ITEM_MOVESPEED, 300); SetItemAttrib(id, ITEM_NEXTPOINT, 1); } void SW04ROLLER02_OnReach(int id, int np) { if (np == 2) { SetItemAttrib(id, ITEM_MOVESPEED, 40); } if (np == 3) { SetItemAttrib(id, ITEM_MOVESPEED, 300); SetItemMachine(id, 0); } // SetItemAttrib(id, ITEM_MOVESPEED, 0); } void ROLLERHURT_InitItem(int id) { // SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_MACHINE); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_SIZE, 240, 40, 40); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_WAITTIME, 0); SetItemAttrib(id, ITEM_MOVETYPE, 1); SetItemAttrib(id, ITEM_MOVESPEED, 300); SetItemAttrib(id, ITEM_NEXTPOINT, 1); } void ROLLERHURT_OnTouch(int id, int charaId) { GetEntityPos(id, x, y, z); // damage if (charaId == BossID) CharaHurt(charaId, 4, 0, x, y, z); else CharaHurt(charaId, 1, 50, x, y, z); } void ROLLERHURT_OnReach(int id, int np) { if (np == 2) { SetItemAttrib(id, ITEM_MOVESPEED, 40); } if (np == 3) { SetItemAttrib(id, ITEM_MOVESPEED, 300); ActivateEntity(id, 0); SetItemMachine(id, 0); } // SetItemAttrib(id, ITEM_MOVESPEED, 0); } void TRIGGER_ELECTRICSHOT_OnTouch(int id, int charaId) { if (!bElectrified) return; if ( (charaId == PlayerID) || (charaId == PartnerID) ) { // hurt CharaHurt(charaId, 9, 80, 0, 0, 0); } else if (charaId != BossID) { CharaHurt(charaId, 9, 0, 0, 0, 0); } /* if (charaId == BossID) { if (!IsCharaDemonized(charaId)) { SetCharaAttrib(BossID,CHARA_RAGE,100); AIPerform(BossID, AI_PERFORM_DEMONIZE); } } */ } void TRIGGERHURT_InitItem(int id) { SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void TRIGGERHURT_OnTouch(int id, int charaId) { if (!bElectrified) return; if ( (charaId == PlayerID) || (charaId == PartnerID) ) { // hurt CharaHurt(charaId, 9, 80, 0, 0, 0); } else if (charaId != BossID) { CharaHurt(charaId, 9, 0, 0, 0, 0); } } // ------ // Hint // ------ void HINT_InitItem(int id) { SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void HINT_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (SwitchCount < 4) ShowHint(HINT_SW04_1); } // -------- // Boss // -------- void BOSS_InitChara(int id) { CW03_InitChara(id); SetCharaAttrib(id, CHARA_MAX_HP, 2000*HandicapHP); SetCharaAttrib(id, CHARA_HP, 2000*HandicapHP); SetCharaAttrib(id, CHARA_TEAM, 2); SetCharaWeapon(id, 51); } void BOSS_InitAI(int id) { AI_Boss(PlayerID, id); SetAIAttrib(id, AI_THINK_SPEED, 100*ResponseRate); SetAIAttrib(id, AI_DEMON_RATE, 0); } // --------- // Enemy // --------- void ZOMBIE_InitChara(int id) { // cw11 NPCW11_InitChara(id); SetCharaAttrib(id, CHARA_MAX_HP, 400*HandicapHP); // 生命上限 SetCharaAttrib(id, CHARA_HP, 400*HandicapHP); // 生命 SetCharaAttrib(id, CHARA_TEAM, 2); SetCharaWeapon(id, 12); } void ZOMBIE_InitAI(int id) { AI_Captain(PlayerID, id); SetAIAttrib(id, AI_THINK_SPEED, 75*ResponseRate); SetAIAttrib(id, AI_PATROL_POINT, 39, 40, 41, 42); // 設巡邏點 ClearAIBehavior(id, AI_STATE_SEARCH); SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_PATROL, 100); // id, type, num, rate UpdateAIAttrib(id); // AIShooter(PlayerID, id); // SetCharaDart(id, 1, 30); } void DARTZOMBIE_InitChara(int id) { // cw11 NPCW11_InitChara(id); SetCharaAttrib(id, CHARA_MAX_HP, 250*HandicapHP); // 生命上限 SetCharaAttrib(id, CHARA_HP, 250*HandicapHP); // 生命 SetCharaAttrib(id, CHARA_TEAM, 2); SetCharaWeapon(id, 22); } void DARTZOMBIE_InitAI(int id) { AI_Shooter(PlayerID, id); SetAIAttrib(id, AI_LOOK_RANGE, 600); SetAIAttrib(id, AI_LOOK_ANGLE, 360); SetAIAttrib(id, AI_ATTACK_RANGE, 600); ClearAIBehavior(id, AI_STATE_SEARCH); SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_IDLE, 100); // id, type, num, rate UpdateAIAttrib(id); SetCharaDart(id, 1, 30); }