int PartnerID = -1; int PlayerID = -1; int bUseSecondary = 0; float HandicapHP = 1.0; float ResponseRate = 1.0; string PlayerModel, PartnerModel; float SpawnPartnerX, SpawnPartnerY, SpawnPartnerZ; int playerSex = 0; // 0: unknown 1: male 2: female int bPartnerDanger = 0; // 0 : full, 1 : normal, 2 : danger int bPlayerDanger = 0; int bContinue = 0; // score int SCORE_KILL_ENEMY = 0; int SCORE_KILL_ENEMYBOSS = 1; int SCORE_COMBO = 2; int SCORE_AI_ALIVE = 3; int SCORE_PHOENIX_STONE = 4; int SCORE_TIME = 5; int topTime = 0; // test int bVoiceEcho = 0; // local variable float x, y, z; int IsMale() { if (playerSex > 0) return (playerSex==1); if (PlayerModel == "CE03") playerSex = 2; else if (PlayerModel == "CE04") playerSex = 2; else if (PlayerModel == "CE07") playerSex = 2; else if (PlayerModel == "CE08") playerSex = 2; else if (PlayerModel == "CW05") playerSex = 2; else if (PlayerModel == "CW06") playerSex = 2; else if (PlayerModel == "CW07") playerSex = 2; else if (PlayerModel == "CW08") playerSex = 2; else playerSex = 1; return (playerSex==1); } void InitScenario() { Print("Game1 Init\n"); // create player CreatePlayer(); /* if (bUseSecondary) { if (var_uiCharaSelection == "CE01") PlayerModel = "CE02"; else if (var_uiCharaSelection == "CE03") PlayerModel = "CE04"; else PlayerModel = var_uiCharaSelection; if (var_uiPartnerSelection == "CE01") PartnerModel = "CE02"; else if (var_uiPartnerSelection == "CE03") PartnerModel = "CE04"; else PartnerModel = var_uiPartnerSelection; } else*/ if (var_uiMissionSelection == "SW03B") { PlayerModel = var_uiPartnerSelection; PartnerModel = var_uiCharaSelection; } else { PlayerModel = var_uiCharaSelection; PartnerModel = var_uiPartnerSelection; } SelectChara(PlayerModel, var_uiWeaponSelection, 1); // Get Character ID's PlayerID = GetPlayerChara(); if (IsMale()) { if (var_uiWeaponSelection != 30) SetCharaWeapon(PlayerID, var_uiWeaponSelection, 30); } else { if (var_uiWeaponSelection != 20) SetCharaWeapon(PlayerID, var_uiWeaponSelection, 20); } PartnerID = SpawnChara(PartnerModel, SpawnPartnerX, SpawnPartnerY, SpawnPartnerZ); SetCharaAttrib(PartnerID, CHARA_TEAM, 1); // partner attack ClearAIAllBehavior(PartnerID); SetAICommand(PlayerID, PartnerID, 2); AI_Partner_Attack(PlayerID, PartnerID); SetPartnerChara(PartnerID); SpawnSceneItems(); if (var_uiHardLevelSelection) { HandicapHP = 2; ResponseRate = 1.5; } if (IsMale()) { SetCharaWeapon(PartnerID, 20); if (bVoiceEcho) var_uiGameOverVoice1 = "mia_ed1"; else var_uiGameOverVoice1 = "mia_d1"; } else { SetCharaWeapon(PartnerID, 30); if (bVoiceEcho) var_uiGameOverVoice1 = "kai_ed1"; else var_uiGameOverVoice1 = "kai_d1"; } var_uiGameOverVoice2 = ""; } void PlayAICutscene(string sceneName) { // check partner dead or alive if (IsCharaDead(PartnerID)) { // check player if (IsMale()) { // run partner dead cutscene A Print(sceneName + "_2A\n"); BeginCutscene(sceneName + "_2A", sceneName); } else //if (PlayerModel == "CE03" || PlayerModel == "CE04") { // run partner dead cutscene B Print(sceneName + "_2B\n"); BeginCutscene(sceneName + "_2B", sceneName); } } else { // run partner alive cutscene Print(sceneName + "_1\n"); BeginCutscene(sceneName + "_1", sceneName); } } void PlayAICutsceneCB(string sceneName, string callbackName) { // check partner dead or alive if (IsCharaDead(PartnerID)) { // check player if (IsMale()) { // run partner dead cutscene A Print(sceneName + "_2A\n"); BeginCutscene(sceneName + "_2A", callbackName); } else //if (PlayerModel == "CE03" || PlayerModel == "CE04") { // run partner dead cutscene B Print(sceneName + "_2B\n"); BeginCutscene(sceneName + "_2B", callbackName); } } else { // run partner alive cutscene Print(sceneName + "_1\n"); BeginCutscene(sceneName + "_1", callbackName); } } void PlayCharaCutscene(string sceneName) { // check player if (IsMale()) { // run cutscene A Print(sceneName + "A\n"); BeginCutscene(sceneName + "A", sceneName); } else //if (PlayerModel == "CE03" || PlayerModel == "CE04") { // run cutscene B Print(sceneName + "B\n"); BeginCutscene(sceneName + "B", sceneName); } } void PlayCharaCutsceneCB(string sceneName, string callbackName) { // check player if (IsMale()) { // run cutscene A Print(sceneName + "A\n"); BeginCutscene(sceneName + "A", callbackName); } else //if (PlayerModel == "CE03" || PlayerModel == "CE04") { // run cutscene B Print(sceneName + "B\n"); BeginCutscene(sceneName + "B", callbackName); } } // Send Partner to Player side void SetPartnerWithPlayer() { if (IsCharaDead(PartnerID)) return; GetEntityPos(PlayerID, x, y, z); SetEntityPos(PartnerID, x-20, y, z); AIPerform(PartnerID, AI_PERFORM_NONE); } void CutsceneEndPos(float kx1, float ky1, float kz1, float kdx1, float kdy1, float kdz1, float mx1, float my1, float mz1, float mdx1, float mdy1, float mdz1, float kx2, float ky2, float kz2, float kdx2, float kdy2, float kdz2, float mx2, float my2, float mz2, float mdx2, float mdy2, float mdz2) { if (IsCharaDead(PartnerID)) { if (IsMale()) { SetEntityDir(PlayerID, kdx1, kdy1, kdz1); TeleportChara(PlayerID, kx1, ky1, kz1); } else { SetEntityDir(PlayerID, mdx1, mdy1, mdz1); TeleportChara(PlayerID, mx1, my1, mz1); } } else { if (IsMale()) { SetEntityDir(PlayerID, kdx2, kdy2, kdz2); TeleportChara(PlayerID, kx2, ky2, kz2); SetEntityDir(PartnerID, mdx2, mdy2, mdz2); TeleportChara(PartnerID, mx2, my2, mz2); } else { SetEntityDir(PartnerID, kdx2, kdy2, kdz2); TeleportChara(PartnerID, kx2, ky2, kz2); SetEntityDir(PlayerID, mdx2, mdy2, mdz2); TeleportChara(PlayerID, mx2, my2, mz2); } } } void CutsceneEndPos2(float kx, float ky, float kz, float kdx, float kdy, float kdz, float mx, float my, float mz, float mdx, float mdy, float mdz) { if (IsMale()) { SetEntityDir(PlayerID, kdx, kdy, kdz); TeleportChara(PlayerID, kx, ky, kz); } else { SetEntityDir(PlayerID, mdx, mdy, mdz); TeleportChara(PlayerID, mx, my, mz); } } void CutsceneEndPos3(float kx, float ky, float kz, float kdx, float kdy, float kdz, float mx, float my, float mz, float mdx, float mdy, float mdz) { if (IsMale()) { SetEntityDir(PlayerID, kdx, kdy, kdz); TeleportChara(PlayerID, kx, ky, kz); SetEntityDir(PartnerID, mdx, mdy, mdz); TeleportChara(PartnerID, mx, my, mz); } else { SetEntityDir(PartnerID, kdx, kdy, kdz); TeleportChara(PartnerID, kx, ky, kz); SetEntityDir(PlayerID, mdx, mdy, mdz); TeleportChara(PlayerID, mx, my, mz); } } // --------------- // Dead Region // --------------- void TRIGGERDEADREGION_InitItem(int id) { SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void TRIGGERDEADREGION_OnTouch(int id, int charaId) { if (IsItem(charaId)) { return; } CharaHurt(charaId, 5, 30000); UseCharaDeadPoint(charaId); } void TRIGGERFIREHURT_InitItem(int id) { SetItemAttrib(id, ITEM_PHYSICS, ITEM_PHYSICS_NONE); SetItemAttrib(id, ITEM_LIFTABLE, 0); SetItemAttrib(id, ITEM_PICKABLE, 0); } void TRIGGERFIREHURT_OnTouch(int id, int charaId) { float x, y, z; GetEntityPos(id, x, y, z); // damage CharaHurt(charaId, 2, 80, x, y, z); } // calculate kill score (type: 0 -> normal, 1 -> boss) void KillScore(int type, int score) { if (type == 0) { SetCharaScore(PlayerID, SCORE_KILL_ENEMY, GetCharaScore(PlayerID, SCORE_KILL_ENEMY)+1); SetCharaTotalScore(PlayerID, SCORE_KILL_ENEMY, GetCharaTotalScore(PlayerID, SCORE_KILL_ENEMY)+score); } else if (type == 1) { SetCharaScore(PlayerID, SCORE_KILL_ENEMYBOSS, GetCharaScore(PlayerID, SCORE_KILL_ENEMYBOSS)+1); SetCharaTotalScore(PlayerID, SCORE_KILL_ENEMYBOSS, GetCharaTotalScore(PlayerID, SCORE_KILL_ENEMYBOSS)+score); } } // player dead void PlayerDead() { if (bContinue) { // reset kill score SetCharaScore(PlayerID, SCORE_KILL_ENEMY, 0); SetCharaTotalScore(PlayerID, SCORE_KILL_ENEMY, 0); SetCharaScore(PlayerID, SCORE_KILL_ENEMYBOSS, 0); SetCharaTotalScore(PlayerID, SCORE_KILL_ENEMYBOSS, 0); GameOver(GAMEOVER_CONTINUE); } else GameOver(GAMEOVER_LOSE); } // partner dead void PartnerDead() { var_uiGameOverVoice1 = ""; if (IsMale()) { if (bVoiceEcho) { if (rand()%2) CharaSay(PartnerID, MSG_MIA_SD1, "mia_esd1"); else CharaSay(PartnerID, MSG_MIA_SD2, "mia_esd2"); } else { if (rand()%2) CharaSay(PartnerID, MSG_MIA_SD1, "mia_sd1"); else CharaSay(PartnerID, MSG_MIA_SD2, "mia_sd2"); } } else { if (bVoiceEcho) { if (rand()%2) CharaSay(PartnerID, MSG_KAI_SD1, "kai_esd1"); else CharaSay(PartnerID, MSG_KAI_SD2, "kai_esd2"); } else { if (rand()%2) CharaSay(PartnerID, MSG_KAI_SD1, "kai_sd1"); else CharaSay(PartnerID, MSG_KAI_SD2, "kai_sd2"); } } } void CalculateScore() { // game play time int sec = GetGameTime(); SetTotalGameTime(GetTotalGameTime()+sec); SetCharaScore(PlayerID, SCORE_TIME, sec); if (sec <= topTime) SetCharaTotalScore(PlayerID, SCORE_TIME, 1200); else { sec = (sec - topTime) / 60; // decrease per min (60s) sec = 1180 - 20*sec; if (sec <= 0) SetCharaTotalScore(PlayerID, SCORE_TIME, 0); else SetCharaTotalScore(PlayerID, SCORE_TIME, sec); } // phoenix stone int ps = GetCharaNumPhoenixStones(PlayerID); SetTotalStones(GetTotalStones()+ps); SetCharaScore(PlayerID, SCORE_PHOENIX_STONE, ps); SetCharaTotalScore(PlayerID, SCORE_PHOENIX_STONE, ps*100); // highest combo ps = GetCharaMaxHitCombos(PlayerID); SetCharaScore(PlayerID, SCORE_COMBO, ps); SetCharaTotalScore(PlayerID, SCORE_COMBO, ps*100); // player alive if (PartnerID == 0 || IsCharaDead(PartnerID)) { SetCharaScore(PlayerID, SCORE_AI_ALIVE, 0); SetCharaTotalScore(PlayerID, SCORE_AI_ALIVE, 0); } else { SetCharaScore(PlayerID, SCORE_AI_ALIVE, 1); SetCharaTotalScore(PlayerID, SCORE_AI_ALIVE, 1000); } } // common update function void CommonUpdate(float t) { int HP, maxHP; maxHP = GetCharaAttrib(PartnerID, CHARA_MAX_HP); HP = GetCharaAttrib(PartnerID, CHARA_HP); if ( (bPartnerDanger > 0) && (HP >= maxHP) ) { CharaSay(PartnerID, MSG_PARTNER_FULL); bPartnerDanger = 0; } else if ( (bPartnerDanger == 2) && (HP > maxHP/2) ) { CharaSay(PartnerID, MSG_PARTNER_SAFE); bPartnerDanger = 1; } else if ( (bPartnerDanger < 2) && (HP < maxHP/3) ) { CharaSay(PartnerID, MSG_PARTNER_DANGER); bPartnerDanger = 2; } maxHP = GetCharaAttrib(PlayerID, CHARA_MAX_HP); HP = GetCharaAttrib(PlayerID, CHARA_HP); if ( (bPlayerDanger == 1) && (HP > maxHP/3) ) { bPlayerDanger = 0; } else if ( (bPlayerDanger == 0) && (HP < maxHP/3) ) { if (!IsCharaDead(PartnerID) && IsEntityActive(PartnerID)) { CharaSay(PartnerID, MSG_PLAYER_DANGER); } bPlayerDanger = 1; } } // game completion callback void GAMECOMPLETE_OnEnd() { CalculateScore(); Print("Game End"); GameOver(GAMEOVER_WIN); }