#include "scenario_common.h" // Global variable int trainingSelect = 0; int subStep = 0; int MasterID; int bSuccess = 0; int bLocked = 0; float timer = 0; // Local variable int res; int BoxID = 0; int UItem1ID = 0; int UItem2ID = 0; int UItem3ID = 0; int WeaponID = 0; int i; // training function void BeginTrainingMove(); void BeginTrainingBattle(); void BeginTrainingAdvBattle(); void BeginTrainingUniItem(); void BeginTrainingSpecial(); void TrainingComplete() { ShowEntity(PlayerID, 0); ActivateEntity(PlayerID, 0); ShowEntity(MasterID, 0); ActivateEntity(MasterID, 0); trainingSelect = 0; subStep = 0; bSuccess = 0; // clear mission objective for (i = 0 ; i < 5 ; i++) { SetMissionObjectiveText(i, -1); } ActivateUI(UI2_TRAINING_OVER1); } // --------- // Game // --------- void OnCache() { LoadScene("se01"); // CacheLevelModel(""); SetAudioEnvironment(ENVIRONMENT_FOREST); SetSceneObjectSwitch("bridgeq", "PRESENT", 0); SetSceneObjectSwitch("cBox_bridge", "PRESENT", 0); } void OnHostGame() { SetGameMaxTime(-1); InitScenario(); if (IsMale()) SetCharaWeapon(PlayerID, 30); else SetCharaWeapon(PlayerID, 20); ShowEntity(PartnerID, 0); ActivateEntity(PartnerID, 0); MasterID = SpawnChara("master"); ShowEntity(PlayerID, 0); ActivateEntity(PlayerID, 0); ShowEntity(MasterID, 0); ActivateEntity(MasterID, 0); PlayMusic("s01_training_bgm", 1, 1); var_uiTrainingSelection = ""; trainingSelect = 0; subStep = 0; bSuccess = 0; ActivateUI(UI2_TRAINING_MENU); } void OnTimeOver() { } void BoxExplode(float force); void OnUpdate(float t) { if (trainingSelect == 0) { if (var_uiTrainingSelection == "TR01") { BeginTrainingMove(); ActivateUI(0); } else if (var_uiTrainingSelection == "TR02") { BeginTrainingBattle(); ActivateUI(0); } else if (var_uiTrainingSelection == "TR03") { BeginTrainingAdvBattle(); ActivateUI(0); } else if (var_uiTrainingSelection == "TR04") { BeginTrainingUniItem(); ActivateUI(0); } else if (var_uiTrainingSelection == "TR05") { BeginTrainingSpecial(); ActivateUI(0); } var_uiTrainingSelection = ""; } else if (trainingSelect == 1) { if (subStep == 1) { ShowHint(HINT_TRAINING_1); } else if (subStep == 2) { if (!bSuccess) { res = GetCharaBodyPose(PlayerID); if ( (res == 8) || (res == 9) || (res == 10) || (res == 11) ) bSuccess = 1; } ShowHint(HINT_TRAINING_2); } else if (subStep == 3) { if (!bSuccess) { res = GetCharaBodyPose(PlayerID); if ( (res == 92) || (res == 94) || (res == 95) || (res == 96) || (res == 97) ) bSuccess = 1; } ShowHint(HINT_TRAINING_3); } else if (subStep == 4) { if (!bSuccess && GetCharaBodyPose(PlayerID) == 12) { bSuccess = 1; } ShowHint(HINT_TRAINING_4); } } else if (trainingSelect == 2) { if (bSuccess) { timer = timer - t; if (timer <= 0) { bSuccess = 0; PlayCharaCutsceneCB(NumToStr("shortcutT_%d", 9+subStep), NumToStr("shortcutT_%d", 9+subStep)); } } else if (subStep == 1) { // check success or not if (bLocked) { if (GetCharaLockTarget(PlayerID) == 0) { bSuccess = 1; bLocked = 0; timer = 1; } } else if (GetCharaLockTarget(PlayerID) == MasterID) { bLocked = 1; } ShowHint(HINT_TRAINING_5); } else if (subStep == 2) { ShowHint(HINT_TRAINING_6); } else if (subStep == 3) { if (IsMale()) ShowHint(HINT_TRAINING_7a); else ShowHint(HINT_TRAINING_7b); // recover chi res = GetCharaAttrib(PlayerID, CHARA_RAGE); if (res <= 10) PlayCharaCutsceneCB("shortcutT_11", "shortcutT_11"); } else if (subStep == 4) { ShowHint(HINT_TRAINING_8); res = GetCharaNumDarts(PlayerID); if (res <= 0) PlayCharaCutsceneCB("shortcutT_12", "shortcutT_12"); // SetCharaDart(PlayerID, 2, 30); } else if (subStep == 5) { ShowHint(HINT_TRAINING_9); } } else if (trainingSelect == 3) { if (bSuccess) { timer = timer - t; if (timer <= 0) { bSuccess = 0; PlayCharaCutsceneCB(NumToStr("shortcutT_%d", 15+subStep), NumToStr("shortcutT_%d", 15+subStep)); } } else if (subStep == 1) { if (IsMale()) { // check success or not res = GetCharaBodyPose(PlayerID); if (bLocked && (res == 556) ) { bSuccess = 1; timer = 1; bLocked = 0; } else if (res == 551) { bLocked = 1; } else { ShowHint(HINT_TRAINING_10a); bLocked = 0; } } else { // check success or not res = GetCharaBodyPose(PlayerID); if (bLocked && (res == 480) ) { bSuccess = 1; timer = 1; bLocked = 0; } else if (res == 479) { bLocked = 1; } else { ShowHint(HINT_TRAINING_10b); bLocked = 0; } } } else if (subStep == 2) { ShowHint(HINT_TRAINING_11); // check success or not if (GetCharaBodyPose(PlayerID) == 106) { bSuccess = 1; timer = 2; } else { res = GetCharaAttrib(PlayerID, CHARA_RAGE); if (res < 60) PlayCharaCutsceneCB("shortcutT_16", "shortcutT_16"); } } else if (subStep == 3) { // check success or not res = GetCharaBodyPose(PlayerID); // if ( (res == 561) || (res == 562) || (res == 476) || (res == 494) ) if ( (res == 563) || (res == 566) || (res == 570) || (res == 496) || (res == 500) || (res == 503) ) { bSuccess = 1; timer = 2; } else { if (IsMale()) ShowHint(HINT_TRAINING_12a); else ShowHint(HINT_TRAINING_12b); // recharge chi res = GetCharaAttrib(PlayerID, CHARA_RAGE); if (res < 100) PlayCharaCutsceneCB("shortcutT_17", "shortcutT_17"); } } else if (subStep == 4) { // check sucess or not if (GetCharaLockTarget(PlayerID) == MasterID) { res = GetCharaBodyPose(PlayerID); if ( (res == 135) || (res == 137) || (res == 139) || (res == 1110) || (res == 1112) || (res == 1114) || (res == 133) || (res == 134) ) { bSuccess = 1; timer = 2; } } GetEntityPos(BoxID, x, y, z); if ( fabs(x) > 300 ) { BoxExplode(150); } else if ( fabs(y) > 300 ) { BoxExplode(150); } else if ( fabs(z) > 300 ) { BoxExplode(150); } ShowHint(HINT_TRAINING_13); } } else if (trainingSelect == 4) { // check success or not res = GetCharaAttrib(MasterID, CHARA_HP); if ( res >= 1200 ) { Print("Mission Unique Item Succeed!\n"); PlayCharaCutsceneCB("shortcutT_21", "shortcutT_21"); } else { ShowHint(HINT_TRAINING_14); // charge chi res = GetCharaAttrib(PlayerID, CHARA_RAGE); if (res < 50) BeginTrainingUniItem(); // SetCharaAttrib(PlayerID, CHARA_RAGE, 90); } } else if (trainingSelect == 5) { if (bSuccess) { timer = timer - t; if (timer <= 0) { bSuccess = 0; if (subStep == 1) PlayCharaCutsceneCB("shortcutT_23", "shortcutT_23"); else if (subStep == 2) PlayCharaCutsceneCB("shortcutT_26", "shortcutT_26"); } } else if (subStep == 1) { // check pickup weapon or not if (WeaponID && GetCharaWeapon(PlayerID, 2)) WeaponID = 0; // check success or not res = GetCharaBodyPose(PlayerID); if ( (res == 240) || (res == 241) ) { bSuccess = 1; timer = 2; } ShowHint(HINT_TRAINING_15); } else if (subStep == 2) { // check success or not res = GetCharaItem(PlayerID, 2); if ( (res > 0) && (res == UItem3ID) ) { bSuccess = 1; timer = 2; } ShowHint(HINT_TRAINING_16); } } } void OnCharaDead(int id, int killer) { Print("Chara ", id, " is killed by ", killer, "\n"); // Player or master dead if ( (id == PlayerID) || (id == MasterID) ) { SetCharaStatusEffect(MasterID, STATUS_EFFECT_RAGE_DECREASE, 0, -1); SetCharaStatusEffect(MasterID, STATUS_EFFECT_STAMINA_DECREASE, 0, -1); SetCharaAttrib(MasterID, CHARA_RAGE, 100); SetCutsceneDelayTime(0); if (trainingSelect == 1) { if (subStep == 1) PlayCharaCutsceneCB("cutscene31", "cutscene31"); else if (subStep == 2) PlayCharaCutsceneCB("shortcutT_2", "shortcutT_2"); else if (subStep == 3) PlayCharaCutsceneCB("shortcutT_3", "shortcutT_3"); else if (subStep == 4) PlayCharaCutsceneCB("shortcutT_4", "shortcutT_4"); } else if (trainingSelect == 2) { PlayCharaCutsceneCB(NumToStr("shortcutT_%d", 8+subStep), NumToStr("shortcutT_%d", 8+subStep)); } else if (trainingSelect == 3) { PlayCharaCutsceneCB(NumToStr("shortcutT_%d", 14+subStep), NumToStr("shortcutT_%d", 14+subStep)); } else if (trainingSelect == 4) { BeginTrainingUniItem(); } else if (trainingSelect == 5) { PlayCharaCutsceneCB(NumToStr("shortcutT_%d", 21+subStep), NumToStr("shortcutT_%d", 21+subStep)); } SetCutsceneDelayTime(2); } } void OnAttackChara(int killer, int victim, int damage) { if (trainingSelect == 2) { if (bSuccess) { } else if (subStep == 2) { if (victim == MasterID) { bSuccess = 1; timer = 1; } } else if (subStep == 3) { // check success or not res = GetCharaBodyPose(PlayerID); if ( (res == 553) || (res == 555) || (res == 485) || (res == 487) ) { bSuccess = 1; timer = 2; } } else if (subStep == 5) { // check success or not if ( (victim == PlayerID) && (damage == 0) ) { bSuccess = 1; timer = 2; ChangeBehavior(MasterID, AI_SEARCH_IDLE); SetAIAttrib(MasterID, AI_ATTACK_RATE, 0); AIPerform(MasterID, AI_PERFORM_NONE); } } } } // ------------ // Trigger // ------------ void TRIGGER_BACKGATE_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if ( (trainingSelect == 1) && (subStep == 1) ) PlayCharaCutsceneCB("shortcutT_2", "shortcutT_2"); // ActivateEntity(id, 0); } void TRIGGER_CLIFFSIDE_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if ( (trainingSelect == 1) && (subStep == 2) ) { if (bSuccess) { PlayCharaCutsceneCB("shortcutT_3", "shortcutT_3"); bSuccess = 0; } else PlayCharaCutsceneCB("shortcutT_2", "shortcutT_2"); } // ActivateEntity(id, 0); } void TRIGGER_RAVINE_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if ( (trainingSelect == 1) && (subStep == 3) ) { if (bSuccess) { PlayCharaCutsceneCB("shortcutT_4", "shortcutT_4"); bSuccess = 0; } else PlayCharaCutsceneCB("shortcutT_3", "shortcutT_3"); } // ActivateEntity(id, 0); } void TRIGGER_CLIFFSIDE2_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if ( (trainingSelect == 1) && (subStep == 4) ) { if (bSuccess) { PlayCharaCutsceneCB("shortcutT_6", "shortcutT_6"); bSuccess = 0; } else PlayCharaCutsceneCB("shortcutT_4", "shortcutT_4"); } } void HINTSE0119_InitItem(int id) { SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void HINTSE0119_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; ShowHint(HINT_TRAINING_19); } void HINTSE0120_InitItem(int id) { SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void HINTSE0120_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; ShowHint(HINT_TRAINING_20); } // ------- // item // ------- void BoxExplode(float force) { BreakItem(BoxID, force); SpawnSFXOnEntity("OBJ_Box01", BoxID); if (bSuccess) BoxID = 0; else BoxID = SpawnItem("woodbox", 0, 100, 30); } void WOODBOX_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "box01"); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NORMAL); SetItemAttrib(id, ITEM_MASS, 2.5); SetItemAttrib(id, ITEM_BOUNCE, 0.15); SetItemAttrib(id, ITEM_GRAVITY, -500); SetItemAttrib(id, ITEM_FRICTION, 0.7); SetItemAttrib(id, ITEM_FADESPEED, 80); SetItemAttrib(id, ITEM_LIFTABLE, 1); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_DAMAGE, 10); } void WOODBOX_OnHitChara(int id, int charaId) { /* if (charaId == MasterID) { if ( (!bSuccess) && trainingSelect == 3 && subStep == 4 ) { // check success or not bSuccess = 1; timer = 1; } BreakItem(BoxID, 200); SpawnSFXOnEntity("OBJ_Box01", BoxID); BoxID = 0; } */ BoxExplode(150); } void WOODBOX_OnHitWall(int id) { BoxExplode(150); } void WOODBOX_OnAttack(int id, int charaId, int damage) { if (damage <= 1) return; int force = damage * 2; if (force > 400) force = 400; BoxExplode(force); } void CAVEDOOR_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "door_5", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } // ------------------- // cutscene callback // ------------------- void CUTSCENE31_OnEnd() { if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -830.00, 1500.00, 310.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); ShowEntity(PlayerID, 1); ActivateEntity(PlayerID, 1); ShowEntity(MasterID, 1); ActivateEntity(MasterID, 1); PlayMusic("s01_training_bgm", 1, 1); bSuccess = 0; } void SHORTCUTT_2_OnEnd() { subStep = 2; SetMissionObjectiveSwitch(0, 0); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -1050.00, 2000.00, 470.00); TeleportChara(PlayerID, -742.5, 1385.00, 310.00, 180); bSuccess = 0; } void SHORTCUTT_3_OnEnd() { subStep = 3; SetMissionObjectiveSwitch(1, 0); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -1420.00, 2360.00, 500.00); TeleportChara(PlayerID, -1030.00, 1950.00, 470.00, 180); bSuccess = 0; } void SHORTCUTT_4_OnEnd() { subStep = 4; SetMissionObjectiveSwitch(2, 0); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -1308.00, 4107.00, 755.00); TeleportChara(PlayerID, -1365.00, 2378.00, 480.00, 180); bSuccess = 0; } void SHORTCUTT_6_OnEnd() { if (IsMale()) SetCharaWeapon(PlayerID, 30); else SetCharaWeapon(PlayerID, 20); SetCharaWeapon(MasterID, 31); SetMissionObjectiveSwitch(3, 0); TrainingComplete(); } void SHORTCUTT_9_OnEnd() { subStep = 1; if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); CharaLockTarget(PlayerID, 0); ShowEntity(PlayerID, 1); ActivateEntity(PlayerID, 1); ShowEntity(MasterID, 1); ActivateEntity(MasterID, 1); PlayMusic("s01_training_bgm", 1, 1); bSuccess = 0; } void SHORTCUTT_10_OnEnd() { subStep = 2; SetMissionObjectiveSwitch(0, 0); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); bSuccess = 0; } void SHORTCUTT_11_OnEnd() { subStep = 3; SetMissionObjectiveSwitch(1, 0); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); CharaDemonize(PlayerID, 0); SetCharaAttrib(PlayerID, CHARA_RAGE, 90); bSuccess = 0; } void SHORTCUTT_12_OnEnd() { subStep = 4; SetMissionObjectiveSwitch(2, 0); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); SetCharaDart(PlayerID, 1, 30); SetAIAttrib(MasterID, AI_DEFENSE_RATE, 0); SetCharaAttrib(PlayerID, CHARA_RAGE, 0); bSuccess = 0; } void SHORTCUTT_13_OnEnd() { subStep = 5; SetCharaDart(PlayerID, 0, 0); SetMissionObjectiveSwitch(3, 0); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); // master attack ClearAIBehavior(MasterID, AI_STATE_ATTACK); SetAIBehavior(MasterID, AI_STATE_ATTACK, AI_ATTACK_RANDOM, 100); SetAIAttrib(MasterID, AI_NOMOVE_RANGE, 80); UpdateAIAttrib(MasterID); SetAIAttrib(MasterID, AI_ATTACK_RATE, 100); bSuccess = 0; } void SHORTCUTT_14_OnEnd() { SetAIAttrib(MasterID, AI_NOMOVE_RANGE, 150); SetMissionObjectiveSwitch(4, 0); TrainingComplete(); } void SHORTCUTT_15_OnEnd() { subStep = 1; if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); ShowEntity(PlayerID, 1); ActivateEntity(PlayerID, 1); ShowEntity(MasterID, 1); ActivateEntity(MasterID, 1); PlayMusic("s01_training_bgm", 1, 1); bSuccess = 0; } void SHORTCUTT_16_OnEnd() { subStep = 2; SetMissionObjectiveSwitch(0, 0); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); CharaDemonize(PlayerID, 0); SetCharaAttrib(PlayerID, CHARA_RAGE, 90); bSuccess = 0; } void SHORTCUTT_17_OnEnd() { subStep = 3; SetMissionObjectiveSwitch(1, 0); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); CharaDemonize(PlayerID, 0); SetCharaAttrib(PlayerID, CHARA_RAGE, 100); bSuccess = 0; } void SHORTCUTT_18_OnEnd() { subStep = 4; if (BoxID > 0) Destroy(BoxID); BoxID = SpawnItem("woodbox", 0, 100, 30); SetMissionObjectiveSwitch(2, 0); SetCharaAttrib(PlayerID, CHARA_STAMINA, 100); SetCharaAttrib(PlayerID, CHARA_RAGE, 0); SetCharaStatusEffect(PlayerID, STATUS_EFFECT_STAMINA_INCREASE, 1, -1); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); bSuccess = 0; } void SHORTCUTT_19_OnEnd() { // clear box if (BoxID > 0) Destroy(BoxID); BoxID = 0; SetMissionObjectiveSwitch(3, 0); TrainingComplete(); } void SHORTCUTT_20_OnEnd() { subStep = 1; if (UItem1ID) { Destroy(UItem1ID); UItem1ID = 0; } UItem1ID = SpawnItem("uitem07", 0, 0, 30); CharaPickupItem(MasterID, UItem1ID); if (UItem2ID) { Destroy(UItem2ID); UItem2ID = 0; } UItem2ID = SpawnItem("uitem07", 0, 100, 30); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); ShowEntity(PlayerID, 1); ActivateEntity(PlayerID, 1); ShowEntity(MasterID, 1); ActivateEntity(MasterID, 1); CharaDemonize(PlayerID, 0); SetCharaAttrib(PlayerID, CHARA_RAGE, 90); SetCharaAttrib(PlayerID, CHARA_STAMINA, 0); SetCharaStatusEffect(PlayerID, STATUS_EFFECT_STAMINA_INCREASE, 0, -1); SetCharaAttrib(MasterID, CHARA_HP, 1000); SetCharaAttrib(MasterID, CHARA_TEAM, 1); ForgetThink(MasterID); PlayMusic("s01_training_bgm", 1, 1); bSuccess = 0; } void SHORTCUTT_21_OnEnd() { // clear uitem if (UItem1ID) Destroy(UItem1ID); if (UItem2ID) Destroy(UItem2ID); UItem1ID = UItem2ID = 0; SetCharaAttrib(PlayerID, CHARA_RAGE, 0); SetCharaStatusEffect(PlayerID, STATUS_EFFECT_STAMINA_INCREASE, 0, 0); SetMissionObjectiveSwitch(0, 0); TrainingComplete(); } void SHORTCUTT_22_OnEnd() { subStep = 1; if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); ShowEntity(PlayerID, 1); ActivateEntity(PlayerID, 1); ShowEntity(MasterID, 1); ActivateEntity(MasterID, 1); if (WeaponID > 0) { Destroy(WeaponID); WeaponID = 0; } // give player two weapon if (IsMale()) { SetCharaWeapon(PlayerID, 30); WeaponID = SpawnItem("Weapon20", 0, 50, 0); } else { SetCharaWeapon(PlayerID, 20); WeaponID = SpawnItem("Weapon30", 0, 50, 0); } PlayMusic("s01_training_bgm", 1, 1); bSuccess = 0; } void SHORTCUTT_23_OnEnd() { subStep = 2; SetMissionObjectiveSwitch(0, 0); if (IsCharaDead(MasterID)) CharaReborn(MasterID); if (IsCharaDead(PlayerID)) CharaReborn(PlayerID); TeleportChara(MasterID, -0.7, 316.00, 10.00); TeleportChara(PlayerID, 0.00, -3.00, 10.00, 180); if (WeaponID > 0) { Destroy(WeaponID); WeaponID = 0; } if (IsMale()) SetCharaWeapon(PlayerID, 30); else SetCharaWeapon(PlayerID, 20); if (UItem1ID) { Destroy(UItem1ID); UItem1ID = 0; } UItem1ID = SpawnItem("uitem04", 0, 0, 30); CharaPickupItem(MasterID, UItem1ID); if (UItem2ID) { Destroy(UItem2ID); UItem2ID = 0; } UItem2ID = SpawnItem("uitem07", 0, 0, 30); CharaPickupItem(PlayerID, UItem2ID); if (UItem3ID) { Destroy(UItem3ID); UItem3ID = 0; } UItem3ID = SpawnItem("uitem04", 0, 100, 30); bSuccess = 0; } void SHORTCUTT_26_OnEnd() { // clear uitem if (UItem1ID) Destroy(UItem1ID); if (UItem2ID) Destroy(UItem2ID); if (UItem3ID) Destroy(UItem3ID); UItem1ID = UItem2ID = UItem3ID = 0; SetMissionObjectiveSwitch(1, 0); TrainingComplete(); } // -------- // NPC // -------- void MASTER_InitChara(int id) { CE11_InitChara(id); SetCharaAttrib(id, CHARA_MAX_HP, 2000); SetCharaAttrib(id, CHARA_HP, 2000); SetCharaAttrib(id, CHARA_TEAM, 1); SetCharaAttrib(id, CHARA_DEFEND_RATE, 10000); SetCharaStatusEffect(id, STATUS_EFFECT_RAGE_DECREASE, 0, -1); SetCharaStatusEffect(id, STATUS_EFFECT_STAMINA_DECREASE, 0, -1); // SetCharaGiant(id); SetCharaAttrib(id, CHARA_RAGE, 100); SetCharaAttrib(id, CHARA_STAMINA, 100); SetCharaWeapon(id, 31, 31); } void MASTER_InitAI(int id) { // set AI attribute SetAIAttrib(id, AI_LOOK_RANGE, 1000); SetAIAttrib(id, AI_LOOK_ANGLE, 360); SetAIAttrib(id, AI_ATTACK_RATE, 0); SetAIAttrib(id, AI_NOMOVE_RANGE, 150); SetAIAttrib(id, AI_ATTACK_RANGE, 1000); SetAIAttrib(id, AI_DEFENSE_RATE, 0); SetAIAttrib(id, AI_CHIFLARE_RATE, 100); SetAIAttrib(id, AI_ROLLING_RATE, 80); SetAIAttrib(id, AI_ATTACK_STRING, "X", "^X"); // set AI behavior SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_IDLE, 100, PlayerID); SetAIBehavior(id, AI_STATE_LOCK, AI_LOCK_NEAREST_TARGET, 50); SetAIBehavior(id, AI_STATE_LOCK, AI_LOCK_ONE_TARGET, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_NOMOVE, 50); SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_RANDOM, 100); // SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_COMBO, 50); UpdateAIAttrib(id); } // -------------- // Training // -------------- void BeginTrainingMove() { var_uiTrainingStage = trainingSelect = 1; subStep = 1; SetCharaAttrib(PlayerID, CHARA_STAMINA, 100); SetCharaStatusEffect(PlayerID, STATUS_EFFECT_STAMINA_INCREASE, 1, -1); SetCharaWeapon(PlayerID, 0); SetCharaWeapon(MasterID, 0); // mission objective SetMissionObjectiveText(0, MOBJ_TRAINING_1); SetMissionObjectiveText(1, MOBJ_TRAINING_2); SetMissionObjectiveText(2, MOBJ_TRAINING_3); SetMissionObjectiveText(3, MOBJ_TRAINING_4); SetCutsceneDelayTime(0); PlayCharaCutsceneCB("cutscene_train31", "cutscene31"); SetCutsceneDelayTime(2); } void BeginTrainingBattle() { var_uiTrainingStage = trainingSelect = 2; subStep = 1; SetCharaAttrib(MasterID, CHARA_TEAM, 2); SetAIAttrib(MasterID, AI_ATTACK_RATE, 0); SetAIAttrib(MasterID, AI_DEFENSE_RATE, 100); ClearAIBehavior(MasterID, AI_STATE_ATTACK); SetAIBehavior(MasterID, AI_STATE_ATTACK, AI_ATTACK_DEFENSE, 100); UpdateAIAttrib(MasterID); // mission objective SetMissionObjectiveText(0, MOBJ_TRAINING_5); SetMissionObjectiveText(1, MOBJ_TRAINING_6); SetMissionObjectiveText(2, MOBJ_TRAINING_7); SetMissionObjectiveText(3, MOBJ_TRAINING_8); SetMissionObjectiveText(4, MOBJ_TRAINING_9); SetCutsceneDelayTime(0); PlayCharaCutsceneCB("shortcutT_9", "shortcutT_9"); SetCutsceneDelayTime(2); } void BeginTrainingAdvBattle() { var_uiTrainingStage = trainingSelect = 3; subStep = 1; SetCharaAttrib(MasterID, CHARA_TEAM, 2); SetAIAttrib(MasterID, AI_ATTACK_RATE, 0); SetAIAttrib(MasterID, AI_DEFENSE_RATE, 100); ClearAIBehavior(MasterID, AI_STATE_ATTACK); SetAIBehavior(MasterID, AI_STATE_ATTACK, AI_ATTACK_DEFENSE, 100); UpdateAIAttrib(MasterID); SetMissionObjectiveText(0, MOBJ_TRAINING_10); SetMissionObjectiveText(1, MOBJ_TRAINING_11); SetMissionObjectiveText(2, MOBJ_TRAINING_12); SetMissionObjectiveText(3, MOBJ_TRAINING_13); SetCutsceneDelayTime(0); PlayCharaCutsceneCB("shortcutT_15", "shortcutT_15"); SetCutsceneDelayTime(2); } void BeginTrainingUniItem() { var_uiTrainingStage = trainingSelect = 4; SetMissionObjectiveText(0, MOBJ_TRAINING_14); SetCutsceneDelayTime(0); PlayCharaCutsceneCB("shortcutT_20", "shortcutT_20"); SetCutsceneDelayTime(2); } void BeginTrainingSpecial() { var_uiTrainingStage = trainingSelect = 5; subStep = 1; SetCharaAttrib(MasterID, CHARA_TEAM, 2); SetAIAttrib(MasterID, AI_ATTACK_RATE, 0); SetAIAttrib(MasterID, AI_DEFENSE_RATE, 100); ClearAIBehavior(MasterID, AI_STATE_ATTACK); SetAIBehavior(MasterID, AI_STATE_ATTACK, AI_ATTACK_DEFENSE, 100); UpdateAIAttrib(MasterID); SetMissionObjectiveText(0, MOBJ_TRAINING_15); SetMissionObjectiveText(1, MOBJ_TRAINING_16); SetCutsceneDelayTime(0); PlayCharaCutsceneCB("shortcutT_22", "shortcutT_22"); SetCutsceneDelayTime(2); } // -------------- // Projectile // -------------- // 一般暗器 void PRJ10_InitPrj(int id) { SetProjectileAttrib(id, PRJ_MODEL, "dart01"); SetProjectileAttrib(id, PRJ_SPEED, 300); SetProjectileAttrib(id, PRJ_GRAVITY, -50); SetProjectileAttrib(id, PRJ_LIFE_TIME, 2); SetProjectileAttrib(id, PRJ_DAMAGE, 20); 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"); } // 一般暗器1級氣合 void PRJ11_InitPrj(int id) { SetProjectileAttrib(id, PRJ_MODEL, "dart01"); SetProjectileAttrib(id, PRJ_SPEED, 450); SetProjectileAttrib(id, PRJ_GRAVITY, -50); SetProjectileAttrib(id, PRJ_LIFE_TIME, 2.5); SetProjectileAttrib(id, PRJ_DAMAGE, 35); 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"); } // 一般暗器2級氣合 void PRJ12_InitPrj(int id) { SetProjectileAttrib(id, PRJ_MODEL, "dart01"); SetProjectileAttrib(id, PRJ_SPEED, 750); SetProjectileAttrib(id, PRJ_GRAVITY, -50); SetProjectileAttrib(id, PRJ_LIFE_TIME, 3); SetProjectileAttrib(id, PRJ_DAMAGE, 50); 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 PRJ10_OnHitChara(int id, int chara, int damage) { if (subStep != 4) return; if (bSuccess) return; Print(id, " hit ", chara, "\n"); if (chara == MasterID) { bSuccess = 1; timer = 1; } } void PRJ11_OnHitChara(int id, int chara, int damage) { if (subStep != 4) return; if (bSuccess) return; Print(id, " hit ", chara, "\n"); if (chara == MasterID) { bSuccess = 1; timer = 1; } } void PRJ12_OnHitChara(int id, int chara, int damage) { if (subStep != 4) return; if (bSuccess) return; Print(id, " hit ", chara, "\n"); if (chara == MasterID) { bSuccess = 1; timer = 1; } }