#include "scenario_common.h" // Global variable int bStartGame = 0; //int GuardID[10]; int CaptainID[15]; int GeneralID[3]; int BridgeAID[20]; int BridgeBID[15]; int BridgeCID; float BridgeATimer[4]; float BridgeBTimer[3]; float BridgeCTimer; int CrossbowManID[5]; int CrossbowID[5]; float CrossbowTimer[5]; float CrossbowManTimer[5]; float ArrowTimer[6]; int GeneralCount = 0; float ReloadTime = 8; float ReloadTime2 = 3; int bFire = 0; int bGetKey = 0; // Partner Position SpawnPartnerX = 1760; SpawnPartnerY = 5800; SpawnPartnerZ = -1280; // local variable int i, j, ObjectID; float dx, dy, dz; void TRIGGER_CROSSBOW01_OnTouch(int id, int id); // --------- // Game // --------- void OnCache() { LoadScene("se03"); CacheLevelModel("se03key01"); CacheLevelModel("arrow"); CacheLevelCharacter("ce12"); CacheLevelCharacter("ce13"); CacheLevelCharacter("ce14"); } void OnHostGame() { SetGameMaxTime(-1); SetAudioVariable(0,1000); InitScenario(); for (j = 0 ; j < 4 ; j++) { ObjectID = FindSceneItem(NumToStr("bridgea%02d", j+1)); GetSceneItemPos(ObjectID, x, y, z); GetSceneItemRot(ObjectID, dx, dy, dz); for (i = 0 ; i < 5 ; i++) BridgeAID[j*5+i] = SpawnItem(NumToStr(NumToStr("bridgea%02d", i+1)+"_%02d", j), x, y, z, dx, dy, dz); BridgeATimer[j] = -1; } for (j = 0 ; j < 3 ; j++) { ObjectID = FindSceneItem(NumToStr("bridgeb%02d", j+1)); GetSceneItemPos(ObjectID, x, y, z); GetSceneItemRot(ObjectID, dx, dy, dz); for (i = 0 ; i < 5 ; i++) BridgeBID[j*5+i] = SpawnItem(NumToStr(NumToStr("bridgeb%02d", i+1)+"_%02d", j), x, y, z, dx, dy, dz); BridgeBTimer[j] = -1; } BridgeCTimer = -1; ObjectID = FindSceneItem("bridgec01"); GetSceneItemPos(ObjectID, x, y, z); GetSceneItemRot(ObjectID, dx, dy, dz); BridgeCID = SpawnItem("bridgec", x, y, z, dx, dy, dz); // mission SetMissionObjectiveText(0, MOBJ_SE03_1); SetMissionObjectiveText(1, MOBJ_SE03_2); ObjectID = FindSceneItem("guard_00"); GetSceneItemPos(ObjectID, x, y, z); GetSceneItemRot(ObjectID, dx, dy, dz); CaptainID[0] = SpawnChara("captain", x, y, z, dx); SpawnItem("se03rock", 2696.652, 5047.645, -1085.2); CrossbowID[0] = FindItem("crossbow_00"); GetEntityPos(CrossbowID[0], x, y, z); GetEntityDir(CrossbowID[0], dx, dy, dz); CrossbowManID[0] = SpawnChara("guard", x+25*dx, y+25*dy, z); SetEntityDir(CrossbowManID[0], dx, dy, dz); SetAIAttrib(CrossbowManID[0], AI_LOOK_RANGE, 120); SetAIAttrib(CrossbowManID[0], AI_LOOK_ANGLE, 180); SetAIAttrib(CrossbowManID[0], AI_ATTACK_RANGE, 80); CrossbowTimer[0] = 0; CrossbowManTimer[0] = -1; // spawn captain for (i = 12 ; i < 15 ; i++) { ObjectID = FindSceneItem(NumToStr("Guard_%02d", i)); GetSceneItemPos(ObjectID, x, y, z); GetSceneItemRot(ObjectID, dx, dy, dz); CaptainID[i] = SpawnChara("captain", x, y, z, dx); } var_aiLockCountLimit = 2; for (i = 0 ; i < 6 ; i++) { ArrowTimer[i] = ReloadTime - i*0.5; } Print("Cutscene05\n"); BeginCutscene("cutscene05"); bStartGame = 1; } void CUTSCENE05_OnEnd() { PlayMusic("s04_soulstrip_bgm", 1, 1); SetAudioVariable(0,0); CutsceneEndPos3(1793.3, 5772.2, -1308.7, 0, -1, 0, 1776, 5759, -1308.9, 0, -1, 0); } 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); if (charaName == "GENERAL") { for (i = 0 ; i < 3 ; i++) { if (GeneralID[i] == id) { GeneralID[i] = 0; break; } } Destroy(id); KillScore(0, 125); GeneralCount++; if (GeneralCount == 3) { SetMissionObjectiveSwitch(1, 0); SpawnItem("key", 1778, 2320, -1290); } } else if (charaName == "CAPTAIN") { if (GeneralCount < 3) { for (i = 9 ; i < 12 ; i++) { if (CaptainID[i] == id) { CharaReborn(CaptainID[i]); ObjectID = FindSceneItem(NumToStr("Guard_%02d", i)); GetSceneItemPos(ObjectID, x, y, z); TeleportChara(CaptainID[i], x, y, z); break; } } } KillScore(0, 100); } else if (charaName == "GUARD") { Destroy(id); KillScore(0, 75); } // CharaReborn(id); } void OnTimeOver() { Print("TimeOver\n"); GameOver(GAMEOVER_LOSE); } void OnUpdate(float t) { if (bStartGame == 1) { SetAudioVariable(0, 1000); bStartGame = 0; } // reload crossbow for (i = 0 ; i < 5 ; i++) { if (CrossbowTimer[i] > 0) { CrossbowTimer[i] = CrossbowTimer[i] - t; } } for (i = 0 ; i < 4 ; i++) { if (BridgeATimer[i] > 0) { BridgeATimer[i] = BridgeATimer[i] - t; if (BridgeATimer[i] <= 0) { for (j = 0 ; j < 5 ; j++) { Destroy(BridgeAID[i*5+j]); BridgeAID[i*5+j] = 0; } } } } for (i = 0 ; i < 3 ; i++) { if (BridgeBTimer[i] > 0) { BridgeBTimer[i] = BridgeBTimer[i] - t; if (BridgeBTimer[i] <= 0) { for (j = 0 ; j < 5 ; j++) { Destroy(BridgeBID[i*5+j]); BridgeBID[i*5+j] = 0; } } } } if ( (BridgeATimer[0] > 0) && (BridgeATimer[0] < 8) && (BridgeBTimer[0] < 0) ) { // break bridge b0 GetEntityPos(BridgeBID[4], x, y, z); // CreateMainRumble(MOTOR_LEFT,RUMBLE_SINEWAVE,5,0.6,0.1); SpawnSFXOnEntity("SE03_DustQuake2", BridgeBID[4]); // Play3DSound("natu_40_Stone003", x, y, z+650); SetItemMachine(BridgeBID[4], 1); for (i = 0 ; i < 5 ; i++) { SetItemAttrib(BridgeBID[i], ITEM_TIMER, 5); } BridgeBTimer[0] = 10; } if ( (BridgeBTimer[0] > 0) && (BridgeBTimer[0] < 8) && (BridgeATimer[1] < 0) ) { GetEntityPos(BridgeAID[9], x, y, z); // CreateMainRumble(MOTOR_LEFT,RUMBLE_SINEWAVE,5,0.6,0.1); SpawnSFXOnEntity("SE03_DustQuake1", BridgeAID[9]); // Play3DSound("natu_40_Stone003", x, y, z+650); // break bridge a1 SetItemMachine(BridgeAID[9], 1); for (i = 0 ; i < 5 ; i++) { SetItemAttrib(BridgeAID[i+5], ITEM_TIMER, 5); } BridgeATimer[1] = 10; } if ( (BridgeBTimer[1] > 0) && (BridgeBTimer[1] < 8) && (BridgeATimer[2] < 0) ) { // break bridge a2 GetEntityPos(BridgeAID[14], x, y, z); // CreateMainRumble(MOTOR_LEFT,RUMBLE_SINEWAVE,5,0.6,0.1); SpawnSFXOnEntity("SE03_DustQuake1", BridgeAID[14]); // Play3DSound("natu_40_Stone003", x, y, z+650); SetItemMachine(BridgeAID[14], 1); for (i = 0 ; i < 5 ; i++) { SetItemAttrib(BridgeAID[i+10], ITEM_TIMER, 5); } BridgeATimer[2] = 10; } if ( (BridgeATimer[2] > 0) && (BridgeATimer[2] < 6) && (BridgeCTimer < 0) ) { GetEntityPos(BridgeCID, x, y, z); SetItemMachine(BridgeCID, 1); // CreateMainRumble(MOTOR_LEFT,RUMBLE_SINEWAVE,5,0.6,0.1); // Play3DSound("natu_40_Stone003", x, y, z+650); BridgeCTimer = 0; } if (bFire) { for (i = 0 ; i < 6 ; i++) { if (ArrowTimer[i] >= 0) { ArrowTimer[i] = ArrowTimer[i] + t; } } bFire = 0; } for (i = 0 ; i < 5 ; i++) { if (CrossbowManTimer[i] >= 0) { CrossbowManTimer[i] = CrossbowManTimer[i] + t; if (CrossbowManTimer[i] > ReloadTime2) { GetEntityPos(CrossbowManID[i], x, y, z); GetEntityPos(CrossbowID[i], dx, dy, dz); x = x - dx; y = y - dy; z = z - dz; if ( (x*x+y*y+z*z) > 1000) continue; AIPerform(CrossbowManID[i], AI_PERFORM_FACETO, CrossbowID[i]); AIPerform(CrossbowManID[i], AI_PERFORM_INSPECT); if (i == 1) CrossbowManTimer[i] = 0; else CrossbowManTimer[i] = -1; } } } } void OnContinueGame() { // destroy key ObjectID = FindItem("key"); if (ObjectID > 0) Destroy(ObjectID); bGetKey = 0; ShowMissionItem(0, 0); // reborn player CharaReborn(PlayerID); CharaReborn(PartnerID); TeleportChara(PlayerID, 1451, 3743, -1300); TeleportChara(PartnerID, 1770, 3284, -1000); // reborn general for (i = 0 ; i < 3 ; i++) { ObjectID = FindSceneItem(NumToStr("General_%02d", i)); GetSceneItemPos(ObjectID, x, y, z); GetSceneItemRot(ObjectID, dx, dy, dz); if (GeneralID[i] > 0) { CharaReborn(GeneralID[i]); TeleportChara(GeneralID[i], x, y, z, dx); } else GeneralID[i] = SpawnChara("general", x, y, z, dx); } GeneralCount = 0; // reborn captain for (i = 9 ; i < 12 ; i++) { CharaReborn(CaptainID[i]); GetEntityPos(CrossbowID[i-7], x, y, z); GetEntityDir(CrossbowID[i-7], dx, dy, dz); TeleportChara(CaptainID[i], x+25*dx, y+25*dy, z); CrossbowManID[i-7] = CaptainID[i]; ClearAIAllBehavior(CaptainID[i]); AI_Idle(PlayerID, CaptainID[i]); CrossbowManTimer[i-7] = -1; } // activate trigger ObjectID = FindItem("trigger_final"); ActivateEntity(ObjectID, 1); PlayMusic("s04_soulstrip_bgm", 1, 1); SetAudioVariable(0,0); bStartGame = 1; } // --------- // Enemy // --------- void GUARD_InitChara(int id) { // ce12 NPCE12_InitChara(id); SetCharaAttrib(id, CHARA_MAX_HP, 150*HandicapHP); // 生命上限 SetCharaAttrib(id, CHARA_HP, 150*HandicapHP); // 生命 SetCharaAttrib(id, CHARA_TEAM, 2); SetCharaWeapon(id, 0); } 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_IDLE, 100); 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_DIRECT, 50); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_SHIFTMOVE, 50); SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_RANDOM, 50); // SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_COMBO, 50); UpdateAIAttrib(id); } void CAPTAIN_InitChara(int id) { // ce13 NPCE13_InitChara(id); SetCharaAttrib(id, CHARA_MAX_HP, 300*HandicapHP); // 生命上限 SetCharaAttrib(id, CHARA_HP, 300*HandicapHP); // 生命 SetCharaAttrib(id, CHARA_TEAM, 2); SetCharaWeapon(id, 72); } void CAPTAIN_InitAI(int id) { AI_Captain(PlayerID, id); SetAIAttrib(id, AI_THINK_SPEED, 40*ResponseRate); SetAIAttrib(id, AI_DEFENSE_RATE, 10); ClearAIAllBehavior(id); // set AI behavior SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_IDLE, 100); 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_DIRECT, 50); SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_RANDOM, 50); // SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_COMBO, 50); UpdateAIAttrib(id); } // General void GENERAL_InitChara(int id) { NPCE14_InitChara(id); SetCharaAttrib(id, CHARA_TEAM, 2); SetCharaWeapon(id, 32); } void GENERAL_InitAI(int id) { AI_Boss(PlayerID, id); // set AI attribute SetAIAttrib(id, AI_THINK_SPEED, 60*ResponseRate); ClearAIAllBehavior(id); // set AI behavior SetAIBehavior(id, AI_STATE_SEARCH, AI_SEARCH_IDLE, 100); SetAIBehavior(id, AI_STATE_LOCK, AI_LOCK_NEAREST_TARGET, 100); SetAIBehavior(id, AI_STATE_PREATTACK, AI_ATTACKMOVE_DIRECT, 50); SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_RANDOM, 30); SetAIBehavior(id, AI_STATE_ATTACK, AI_ATTACK_COMBO, 70); UpdateAIAttrib(id); } // -------------- // Trigger // -------------- void TRIGGER_DOOR_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (!bGetKey) { ShowHint(HINT_SE03_1); return; } // Play cutscene 10 Print("shortcut2_0\n"); PlayAICutsceneCB("shortcut2_0", "GameComplete"); ActivateEntity(id, 0); } void TRIGGER_ROCK_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; ObjectID = FindItem("se03rock"); SetItemMachine(ObjectID, 1); SpawnSFXOnEntity("SE03_RollRock", ObjectID); var_aiLockCountLimit = 4; // CrossbowManTimer[0] = 0; ActivateEntity(id, 0); } void TRIGGER_CRUSH_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; // delete start captain for (i = 12 ; i < 15 ; i++) { Destroy(CaptainID[i]); CaptainID[i] = 0; } SetCutsceneDelayTime(2); PlayCharaCutscene("shortcut_crush1"); SetCutsceneDelayTime(0); ActivateEntity(id, 0); } void SHORTCUT_CRUSH1_OnEnd() { SetEntityDir(-1, 0, 0); TeleportChara(PlayerID, 2428.4, 4140.9, -1312.2); for (i = 0 ; i < 5 ; i++) { Destroy(BridgeAID[i+15]); BridgeAID[i+15] = -1; Destroy(BridgeBID[i+10]); BridgeBID[i+10] = -1; } // spawn captain for (i = 1 ; i < 9 ; i++) { ObjectID = FindSceneItem(NumToStr("Guard_%02d", i)); GetSceneItemPos(ObjectID, x, y, z); GetSceneItemRot(ObjectID, dx, dy, dz); CaptainID[i] = SpawnChara("captain", x, y, z, dx); } // spawn general for (i = 0 ; i < 3 ; i++) { ObjectID = FindSceneItem(NumToStr("General_%02d", i)); GetSceneItemPos(ObjectID, x, y, z); GetSceneItemRot(ObjectID, dx, dy, dz); GeneralID[i] = SpawnChara("general", x, y, z, dx); } CrossbowID[1] = FindItem("crossbow_01"); GetEntityPos(CrossbowID[1], x, y, z); GetEntityDir(CrossbowID[1], dx, dy, dz); CrossbowManID[1] = SpawnChara("guard", x+25*dx, y+25*dy, z); SetEntityDir(CrossbowManID[1], dx, dy, dz); SetAIAttrib(CrossbowManID[1], AI_LOOK_RANGE, 120); SetAIAttrib(CrossbowManID[1], AI_LOOK_ANGLE, 180); SetAIAttrib(CrossbowManID[1], AI_ATTACK_RANGE, 80); CrossbowTimer[1] = 0; CrossbowManTimer[1] = -1; } void TRIGGER_CRUSH02_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (BridgeBTimer[1] < 0) { GetEntityPos(BridgeBID[9], x, y, z); // CreateMainRumble(MOTOR_LEFT,RUMBLE_SINEWAVE,5,0.6,0.1); SpawnSFXOnEntity("SE03_DustQuake2", BridgeBID[9]); Play3DSound("natu_40_Stone003", x, y, z+650); SetItemMachine(BridgeBID[9], 1); for (i = 0 ; i < 5 ; i++) { SetItemAttrib(BridgeBID[i+5], ITEM_TIMER, 8); } BridgeBTimer[1] = 10; } } void TRIGGER_FINAL_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; for (i = 6 ; i < 9 ; i++) { if (CaptainID[i] > 0) { Destroy(CaptainID[i]); CaptainID[i] = 0; } } if (CrossbowManID[1] > 0) Destroy(CrossbowManID[1]); for (i = 1 ; i < 5 ; i++) { CrossbowManID[i] = 0; CrossbowManTimer[i] = -1; } for (i = 9 ; i < 12 ; i++) { if (CaptainID[i] > 0) { ClearAIAllBehavior(CaptainID[i]); AI_Guard(PlayerID, CaptainID[i]); SetAIAttrib(id, AI_THINK_SPEED, 30*ResponseRate); } } var_aiLockCountLimit = 3; /* // spawn captain in final square for (i = 9 ; i < 12 ; i++) { ObjectID = FindSceneItem(NumToStr("Guard_%02d", i)); GetSceneItemPos(ObjectID, x, y, z); CaptainID[i] = SpawnChara("captain", x, y, z); } */ ActivateEntity(id, 0); } void TRIGGER_CROSSBOW01_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; // delete captain on bridge Destroy(CrossbowManID[0]); CrossbowManID[0] = 0; CrossbowManTimer[0] = -1; for (i = 0 ; i < 6 ; i++) { Destroy(CaptainID[i]); CaptainID[i] = 0; } for (i = 2 ; i < 5 ; i++) { CrossbowID[i] = FindItem(NumToStr("crossbow_%02d", i)); GetEntityPos(CrossbowID[i], x, y, z); GetEntityDir(CrossbowID[i], dx, dy, dz); CaptainID[i+7] = CrossbowManID[i] = SpawnChara("captain", x+25*dx, y+25*dy, z); SetEntityDir(CrossbowManID[i], dx, dy, dz); SetAIAttrib(CrossbowManID[i], AI_LOOK_RANGE, 120); SetAIAttrib(CrossbowManID[i], AI_LOOK_ANGLE, 180); SetAIAttrib(CrossbowManID[i], AI_ATTACK_RANGE, 80); CrossbowTimer[i] = 0; CrossbowManTimer[i] = -1; } CrossbowManTimer[1] = ReloadTime2; var_aiLockCountLimit = 2; SetMissionObjectiveSwitch(0, 0); // continue point bContinue = 1; ActivateEntity(id, 0); } void TRIGGER_CROSSBOW02_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; CrossbowManTimer[0] = -1; if (!IsCharaDead(PartnerID)) { TeleportChara(PartnerID, 1770, 3284, -1000); } ActivateEntity(id, 0); } void FireArrow(float sx, float sy, float sz) { float distance = 8; GetEntityPos(PlayerID, dx, dy, dz); for (i = 0 ; i < 6 ; i++) { if (ArrowTimer[i] > ReloadTime) { SpawnProjectile(98, sx-i*distance, sy, sz, dx, dy, dz+30); ArrowTimer[i] = ArrowTimer[i] - ReloadTime; } } bFire = 1; } void TRIGGER_CROSSBOW03_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; FireArrow(1552, 2165, -964); } void TRIGGER_CROSSBOW04_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; FireArrow(2043, 2085, -964); } void TRIGGER_CROSSBOW05_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; FireArrow(1420, 2150, -830); } void TRIGGER_CROSSBOW06_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; FireArrow(2176, 2145, -825); } void TRIGGER_CROSSBOW07_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; FireArrow(1486, 2165, -964); } void TRIGGER_CROSSBOW08_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; FireArrow(1920, 2240, -910); } void TRIGGER_CROSSBOW09_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (CrossbowManTimer[2] < 0) CrossbowManTimer[2] = 0; } void TRIGGER_CROSSBOW10_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (CrossbowManTimer[3] < 0) CrossbowManTimer[3] = 0; } void TRIGGER_CROSSBOW11_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (CrossbowManTimer[4] < 0) CrossbowManTimer[4] = 0; } void TRIGGER_CROSSBOW12_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (GeneralID[0] <= 0) return; float distance = 8; GetEntityPos(PlayerID, x, y, z); for (i = 0 ; i < 6 ; i++) { if (ArrowTimer[i] > ReloadTime) { // SpawnProjectile(98, 1940-i*distance, 2235, -1260, 1940-i*distance, 2240, -1260.5); SpawnProjectile(98, 1940-i*distance, 2235, -1260, x, y, z+15); SpawnProjectile(98, 1866-i*distance, 2280, -1290, x, y, z+15); ArrowTimer[i] = ArrowTimer[i] - ReloadTime; } } bFire = 1; } void TRIGGER_CROSSBOW13_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (GeneralID[2] <= 0) return; float distance = 8; GetEntityPos(PlayerID, x, y, z); for (i = 0 ; i < 6 ; i++) { if (ArrowTimer[i] > ReloadTime) { SpawnProjectile(98, 1809-i*distance, 2280, -1285, x, y, z+15); SpawnProjectile(98, 1783-i*distance, 2280, -1285, x, y, z+15); ArrowTimer[i] = ArrowTimer[i] - ReloadTime; } } bFire = 1; } void TRIGGER_CROSSBOW14_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (GeneralID[1] <= 0) return; float distance = 8; GetEntityPos(PlayerID, x, y, z); for (i = 0 ; i < 6 ; i++) { if (ArrowTimer[i] > ReloadTime) { // SpawnProjectile(98, 1650-i*distance, 2235, -1260, 1650-i*distance, 2240, -1260.5); SpawnProjectile(98, 1650-i*distance, 2235, -1260, x, y, z+15); SpawnProjectile(98, 1720-i*distance, 2280, -1280, x, y, z+15); ArrowTimer[i] = ArrowTimer[i] - ReloadTime; } } bFire = 1; } void TRIGGER_CROSSBOW15_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; if (CrossbowManTimer[0] < 0) CrossbowManTimer[0] = 0; } 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) { float x, y, z; GetEntityPos(id, x, y, z); // damage CharaHurt(charaId, 1, 80, x, y, z); } void TRIGGERPOISONHURT_InitItem(int id) { SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void TRIGGERPOISONHURT_OnTouch(int id, int charaId) { GetEntityPos(charaId, x, y, z); SpawnSFX("SE03_PoisonSmo1", x, y, z); Play3DSound("elem_fire_03_put_out_by_water", x, y, z); GetEntityPos(id, x, y, z); CharaHurt(charaId, 1, 300, x, y, z); } void TRIGGER_LAVA_OnTouch(int id, int charaId) { GetEntityPos(charaId, x, y, z); CharaHurt(charaId, 5, 30000, x, y, z); } void HINTSE032_InitItem(int id) { SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void HINTSE032_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; ShowHint(HINT_SE03_2); } void HINTSE033_InitItem(int id) { SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void HINTSE033_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; ShowHint(HINT_SE03_3); } // ------------- // CrossBow // ------------- void CROSSBOW_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "crossbow", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void CROSSBOW_00_OnAttack(int id, int charaId, int damage) { if (CrossbowTimer[0] <= 0) { float distance = 7.5; float tx, ty, tz; GetEntityPos(id, x, y, z); GetEntityDir(id, dx, dy, dz); GetEntityPos(PlayerID, tx, ty, tz); float range = (tx - x)*(tx - x) + (ty - y)*(ty - y) + (tz - z)*(tz - z); for (i = -3 ; i < 4 ; i++) { if (i == 0) continue; if (range > 10000) SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+30+i*1, tx-i*distance*dy, ty+i*distance*dx, tz+20); else SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+30+i*1, x-i*(distance+0.2)*dy-73*dx, y+i*(distance+0.2)*dx-73*dy, z+30+i*1); // SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+46+i*1, // tx, ty, tz+20); } CrossbowTimer[0] = ReloadTime2; Play3DSound("impa_28_punch_slash_01", x, y, z); } } void CROSSBOW_01_OnAttack(int id, int charaId, int damage) { if (CrossbowTimer[1] <= 0) { GetEntityPos(id, x, y, z); GetEntityDir(id, dx, dy, dz); float distance = 7.5; for (i = -3 ; i < 4 ; i++) { if (i == 0) continue; SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+35, x-i*(distance+0.3)*dy-73*dx, y+i*(distance+0.2)*dx-73*dy, z+34.5); SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+41, x-i*(distance+0.3)*dy-73*dx+0.3, y+i*(distance+0.2)*dx-73*dy, z+40.6); } CrossbowTimer[1] = ReloadTime2; Play3DSound("impa_28_punch_slash_01", x, y, z); } } void CROSSBOW_02_OnAttack(int id, int charaId, int damage) { if (CrossbowTimer[2] <= 0) { GetEntityPos(id, x, y, z); GetEntityDir(id, dx, dy, dz); float distance = 7.5; for (i = -3 ; i < 4 ; i++) { if (i == 0) continue; SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+35, x-i*(distance+0.1)*dy-73*dx, y+i*(distance+0.2)*dx-73*dy, z+35); SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+41, x-i*(distance+0.1)*dy-73*dx+0.3, y+i*(distance+0.2)*dx-73*dy, z+41); } CrossbowTimer[2] = ReloadTime2; Play3DSound("impa_28_punch_slash_01", x, y, z); } } void CROSSBOW_03_OnAttack(int id, int charaId, int damage) { if (CrossbowTimer[3] <= 0) { GetEntityPos(id, x, y, z); GetEntityDir(id, dx, dy, dz); float distance = 7.5; for (i = -3 ; i < 4 ; i++) { if (i == 0) continue; SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+35, x-i*(distance+0.1)*dy-73*dx, y+i*(distance+0.2)*dx-73*dy, z+35); SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+41, x-i*(distance+0.1)*dy-73*dx+0.3, y+i*(distance+0.2)*dx-73*dy, z+40.5); } CrossbowTimer[3] = ReloadTime2; Play3DSound("impa_28_punch_slash_01", x, y, z); } } void CROSSBOW_04_OnAttack(int id, int charaId, int damage) { if (CrossbowTimer[4] <= 0) { GetEntityPos(id, x, y, z); GetEntityDir(id, dx, dy, dz); float distance = 7.5; for (i = -3 ; i < 4 ; i++) { if (i == 0) continue; SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+35, x-i*(distance+0.1)*dy-73*dx, y+i*(distance+0.2)*dx-73*dy, z+35); SpawnProjectile(98, x-i*distance*dy-68*dx, y+i*distance*dx-68*dy, z+41, x-i*(distance+0.1)*dy-73*dx+0.3, y+i*(distance+0.2)*dx-73*dy, z+41); } CrossbowTimer[4] = ReloadTime2; Play3DSound("impa_28_punch_slash_01", x, y, z); } } void PRJ98_InitPrj(int id) { SetProjectileAttrib(id, PRJ_MODEL, "arrow", 1); SetProjectileAttrib(id, PRJ_SPEED, 600); SetProjectileAttrib(id, PRJ_GRAVITY, -10); SetProjectileAttrib(id, PRJ_LIFE_TIME, 10); SetProjectileAttrib(id, PRJ_DAMAGE, 100); SetProjectileAttrib(id, PRJ_ATTACKDATA, 6); 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_OnHitChara(int id, int charaId, int damage) { if (charaId == PlayerID) return; if (charaId == PartnerID) return; SetCharaAttrib(charaId, CHARA_HP, GetCharaAttrib(charaId, CHARA_HP)+damage); } // -------- // Rock // -------- void SE03ROCK_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "rock", 1); // SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_MACHINE); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_MASS, 0.7); SetItemAttrib(id, ITEM_GRAVITY, -400); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MOVEPOINT, 4, 2696.652, 5047.645, -1085.2, 2300.463, 5047.645, -1222.2, 1952.637, 5047.645, -1308.11, 1912.637, 5047.645, -1208.11); SetItemAttrib(id, ITEM_WAITTIME, 0); SetItemAttrib(id, ITEM_MOVETYPE, 1); SetItemAttrib(id, ITEM_MOVESPEED, 200); SetItemAttrib(id, ITEM_NEXTPOINT, 1); SetItemAttrib(id, ITEM_ROTATEAXIS, 0, 1, 0); SetItemAttrib(id, ITEM_ROTATESPEED, -6.28); } void SE03ROCK_OnReach(int id, int wp) { if (wp == 3) { // SetItemMachine(id, 0); ThrowItem(id, -400, 0, 400); } } void SE03ROCK_OnTouch(int id, int charaId) { GetEntityPos(id, x, y, z); CharaHurt(charaId, 1, 300, x, y, z); } // ------- // key // ------- void KEY_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "se03key01", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_ROTATE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_LIGHT_SFX, "OBJ_Chi_Others"); } void KEY_OnTouch(int id, int charaId) { if (charaId != PlayerID) return; Destroy(id); bGetKey = 1; PlaySound("fant_01_chimes_01"); ShowMissionItem(1, 1); } // ---------- // Gate // ---------- void SE03DOORL_InitItem(int id) { GetEntityPos(id, x, y, z); SetItemAttrib(id, ITEM_MODEL, "se03doorl", 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_MOVEPOINT, 2, x, y, z, x+27, y, z); SetItemAttrib(id, ITEM_MOVETYPE, 0); SetItemAttrib(id, ITEM_MOVESPEED, 30); } void SE03DOORR_InitItem(int id) { GetEntityPos(id, x, y, z); SetItemAttrib(id, ITEM_MODEL, "se03doorr", 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_MOVEPOINT, 2, x, y, z, x-27, y, z); SetItemAttrib(id, ITEM_MOVETYPE, 0); SetItemAttrib(id, ITEM_MOVESPEED, 30); } // ------------ // Bridge // ------------ void BRIDGEA01_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "bridgea01", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MASS, 6); SetItemAttrib(id, ITEM_GRAVITY, -400); } void BRIDGEA01_OnTimer(int id) { ThrowItem(id, 10, 0, 0); SetItemAttrib(id, ITEM_TIMER, 0); } void BRIDGEA02_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "bridgea02", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MASS, 6); SetItemAttrib(id, ITEM_GRAVITY, -360); } void BRIDGEA02_OnTimer(int id) { ThrowItem(id, 10, 15, 0); SetItemAttrib(id, ITEM_TIMER, 0); SpawnSFXOnEntity("SE03_DustFall_0", id); } void BRIDGEA03_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "bridgea03", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MASS, 6); SetItemAttrib(id, ITEM_GRAVITY, -320); } void BRIDGEA03_OnTimer(int id) { ThrowItem(id, 10, 30, 0); SetItemAttrib(id, ITEM_TIMER, 0); SpawnSFXOnEntity("SE03_DustFall_1", id); } void BRIDGEA04_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "bridgea04", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MASS, 6); SetItemAttrib(id, ITEM_GRAVITY, -280); } void BRIDGEA04_OnTimer(int id) { ThrowItem(id, 10, 45, 0); SetItemAttrib(id, ITEM_TIMER, 0); SpawnSFXOnEntity("SE03_DustFall_2", id); } void BRIDGEA05_InitItem(int id) { GetEntityPos(id, x, y, z); SetItemAttrib(id, ITEM_MODEL, "bridgea05", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MASS, 6); SetItemAttrib(id, ITEM_GRAVITY, -240); SetItemAttrib(id, ITEM_MOVEPOINT, 2, x, y, z, x, y, z-3); SetItemAttrib(id, ITEM_MOVESPEED, 100); SetItemAttrib(id, ITEM_WAITTIME, 0); SetItemAttrib(id, ITEM_MOVETYPE, 1); } void BRIDGEA05_OnTimer(int id) { GetEntityPos(id, x, y, z); ThrowItem(id, 5, 15, 10); SetItemAttrib(id, ITEM_TIMER, 0); Play3DSound("NATU_40_Stone005", x, y, z+650); SpawnSFXOnEntity("SE03_DustFall_3", id); } void BRIDGEA05_OnReach(int id, int np) { if (np == 0) { if (GetItemAttrib(id, ITEM_MOVESPEED) < 200) SetItemAttrib(id, ITEM_MOVESPEED, GetItemAttrib(id, ITEM_MOVESPEED)+5); } } void BRIDGEA05_OnTrod(int id, int charaId) { if (charaId == PlayerID) { CreateMainRumble(MOTOR_LEFT,RUMBLE_SINEWAVE,0.5,0.6,0.1); GetEntityPos(charaId, x, y, z); PlaySound("natu_40_Stone003"); } } void BRIDGEA05_00_OnTrod(int id, int charaId) { if (charaId != PlayerID) return; CreateMainRumble(MOTOR_LEFT,RUMBLE_SINEWAVE,1,0.6,0.1); // shake if (BridgeATimer[0] < 0) { SetItemMachine(id, 1); GetEntityPos(id, x, y, z); // CreateMainRumble(MOTOR_LEFT,RUMBLE_SINEWAVE,5,0.6,0.1); // Play3DSound("natu_40_Stone003", x, y, z+650); SpawnSFXOnEntity("SE03_DustQuake1", id); for (i = 0 ; i < 5 ; i++) { SetItemAttrib(BridgeAID[i], ITEM_TIMER, 5); } BridgeATimer[0] = 10; } } void BRIDGEB01_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "bridgeb01", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MASS, 6); SetItemAttrib(id, ITEM_GRAVITY, -400); } void BRIDGEB01_OnTimer(int id) { ThrowItem(id, -20, 0, 0); SetItemAttrib(id, ITEM_TIMER, 0); } void BRIDGEB02_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "bridgeb02", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MASS, 6); SetItemAttrib(id, ITEM_GRAVITY, -360); } void BRIDGEB02_OnTimer(int id) { ThrowItem(id, -20, -15, 0); SetItemAttrib(id, ITEM_TIMER, 0); SpawnSFXOnEntity("SE03_DustFall_0", id); } void BRIDGEB03_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "bridgeb03", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MASS, 6); SetItemAttrib(id, ITEM_GRAVITY, -320); } void BRIDGEB03_OnTimer(int id) { ThrowItem(id, -20, -30, 0); SetItemAttrib(id, ITEM_TIMER, 0); SpawnSFXOnEntity("SE03_DustFall_1", id); } void BRIDGEB04_InitItem(int id) { SetItemAttrib(id, ITEM_MODEL, "bridgeb04", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MASS, 6); SetItemAttrib(id, ITEM_GRAVITY, -280); } void BRIDGEB04_OnTimer(int id) { ThrowItem(id, -20, -45, 0); SetItemAttrib(id, ITEM_TIMER, 0); SpawnSFXOnEntity("SE03_DustFall_2", id); } void BRIDGEB05_InitItem(int id) { GetEntityPos(id, x, y, z); SetItemAttrib(id, ITEM_MODEL, "bridgeb05", 1); SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); SetItemAttrib(id, ITEM_MASS, 6); SetItemAttrib(id, ITEM_GRAVITY, -240); SetItemAttrib(id, ITEM_MOVEPOINT, 2, x, y, z, x, y, z-3); SetItemAttrib(id, ITEM_MOVESPEED, 100); SetItemAttrib(id, ITEM_WAITTIME, 0); SetItemAttrib(id, ITEM_MOVETYPE, 1); } void BRIDGEB05_OnTimer(int id) { GetEntityPos(id, x, y, z); ThrowItem(id, -20, -15, 0); SetItemAttrib(id, ITEM_TIMER, 0); Play3DSound("NATU_40_Stone005", x, y, z+650); SpawnSFXOnEntity("SE03_DustFall_3", id); } void BRIDGEB05_OnReach(int id, int np) { if (np == 0) { if (GetItemAttrib(id, ITEM_MOVESPEED) < 200) SetItemAttrib(id, ITEM_MOVESPEED, GetItemAttrib(id, ITEM_MOVESPEED)+5); } } void BRIDGEB05_OnTrod(int id, int charaId) { if (charaId == PlayerID) CreateMainRumble(MOTOR_LEFT,RUMBLE_SINEWAVE,0.5,0.6,0.1); } /* void BRIDGEB05_01_OnTrod(int id, int charaId) { if (charaId != PlayerID) return; SetItemMachine(id, 1); for (i = 0 ; i < 5 ; i++) { SetItemAttrib(BridgeBID[i+5], ITEM_TIMER, 2); } BridgeBTimer[1] = 10; } */ void BRIDGEC_InitItem(int id) { GetEntityPos(id, x, y, z); SetItemAttrib(id, ITEM_MODEL, "bridgec01", 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_MOVEPOINT, 4, x, y, z, x+50, y, z-25, x+400, y, z-150, x+450, y, z-2750); SetItemAttrib(id, ITEM_MOVESPEED, 0); SetItemAttrib(id, ITEM_ROTATEAXIS, 0, -1, 0); SetItemAttrib(id, ITEM_ROTATESPEED, -0.1); SetItemAttrib(id, ITEM_ROTATEANGLE, -0.1); } /* void BRIDGEC_OnTrod(int id, int charaId) { if (charaId != PlayerID) return; if (BridgeCTimer < 0) { GetEntityPos(id, x, y, z); SetItemMachine(id, 1); Play3DSound("natu_40_Stone003", x, y, z+650); BridgeCTimer = 0; } } */ void BRIDGEC_OnReach(int id, int np) { if (np == -1) { SetItemAttrib(id, ITEM_MOVESPEED, 40); SetItemMachine(id, 1, 1); } else if (np == 1) SetItemAttrib(id, ITEM_MOVESPEED, 80); else if (np == 2) SetItemAttrib(id, ITEM_MOVESPEED, 400); else if (np == 3) Destroy(id); // BreakItem(id, 100); }