3355 lines
137 KiB
C
3355 lines
137 KiB
C
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_ChasersExplosion(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local size = obj.getVar("kksChaser").get_obj_vector_size();
|
||
|
|
if(size < 1){
|
||
|
|
if (obj.isMessage()) sq_AddMessage(3573);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_CHASERSEXPLOSION);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_CHASERSEXPLOSION, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_ChasersExplosion(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_ChasersExplosion(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
obj.sq_ZStop();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
obj.sq_SetCurrentAnimation(221);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.5, 1.5);
|
||
|
|
obj.sq_PlaySound("WZ_PRECENCIA_CHASERPRESS_1");
|
||
|
|
obj.sq_PlaySound("PRECENCIA_CHASERPRESS_1_CAST");
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "ChasersExplosion", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(8);
|
||
|
|
obj.sq_PlaySound("WZ_CHASERP_02");
|
||
|
|
}
|
||
|
|
|
||
|
|
local speed = 1.0;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) speed = 0.3 + speed;
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) speed = 0.5 + speed;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
local size = obj.getVar("kksChaser").get_obj_vector_size();
|
||
|
|
obj.getVar("chasersexp").setInt(10, size);
|
||
|
|
local delaySum = 300;
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 2);
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
obj.setTimeEvent(0, delay / 10, 10, true);
|
||
|
|
obj.setTimeEvent(1, delay, 1, false);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.setTimeEvent(10, delay, 1, false);
|
||
|
|
}
|
||
|
|
sq_SetFrameDelayTime(currentAni, 6, delaySum);
|
||
|
|
obj.getVar("ChasersExplosion_damage").setInt(10, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_ChasersExplosion(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(sq_GetZPos(obj) > 0){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_IntVectPush(100);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_ChasersExplosion(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_ChasersExplosion(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 11:
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_CHASERPRESS_2");
|
||
|
|
obj.sq_PlaySound("PRECENCIA_CHASERPRESS_2_CHASER");
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_CHASERSEXPLOSION, -1, 0, 1.0);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHASERSEXPLOSION);
|
||
|
|
local baseSRate = sq_GetIntData(obj, SKILL_BYKK_CHASERSEXPLOSION, 0);
|
||
|
|
print("baseSRate = "+baseSRate);
|
||
|
|
local addSRate = sq_GetIntData(obj, SKILL_BYKK_CHASERSEXPLOSION, 2) / 10;
|
||
|
|
// if(sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY) > 0 && obj.getWeaponSubType() == 1) baseSRate = baseSRate + sq_GetIntData(obj, SKILL_BYKK_POLEMASTERY, 2) / 10;
|
||
|
|
baseSRate = baseSRate + obj.getVar("chasersexp").getInt(10) * addSRate;
|
||
|
|
|
||
|
|
print("test1 = "+obj.getVar("chasersexp").getInt(10));
|
||
|
|
print("test2 = "+addSRate);
|
||
|
|
print("test3 = "+baseSRate);
|
||
|
|
// if(sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY) > 0 && obj.getWeaponSubType() == 1) baseSRate = baseSRate * (100 + sq_GetIntData(obj, SKILL_BYKK_SPEARMASTERY, 2)) / 100;
|
||
|
|
// totalDamage = totalDamage * obj.getVar("ChasersExplosion_damage").getInt(10) / 100;
|
||
|
|
print("totalDamage = "+totalDamage);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,1,0,obj.getDirection(),SKILL_BYKK_CHASERSEXPLOSION,2,totalDamage,baseSRate,1,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 12:
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHASERSEXPLOSION);
|
||
|
|
local baseSRate = sq_GetLevelData(obj, SKILL_BYKK_CHASERSEXPLOSION, 1, skillLevel);
|
||
|
|
local addSRate = sq_GetLevelData(obj, SKILL_BYKK_CHASERSEXPLOSION, 3, skillLevel) / 10;
|
||
|
|
// if(sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY) > 0 && obj.getWeaponSubType() == 1) baseSRate = baseSRate + sq_GetIntData(obj, SKILL_BYKK_POLEMASTERY, 2) / 10;
|
||
|
|
baseSRate = baseSRate + obj.getVar("chasersexp").getInt(10) * addSRate;
|
||
|
|
createOnlyDrawObjectEX_Battlemage_bykk(obj,"character/mage/effect/animation/battlemage_bykk/chasersexplosion/precencia/chaserexplosionbottom_09.ani",true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj),sq_GetZPos(obj)*0,ENUM_DRAWLAYER_BOTTOM,baseSRate,baseSRate);
|
||
|
|
createOnlyDrawObjectEX_Battlemage_bykk(obj,"character/mage/effect/animation/battlemage_bykk/chasersexplosion/precencia/chaserexplosionfront_07.ani",true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj) + 1,sq_GetZPos(obj)*0,ENUM_DRAWLAYER_NORMAL,baseSRate,baseSRate);
|
||
|
|
sq_SetMyShake(obj, 8, 160);
|
||
|
|
break;
|
||
|
|
case 13: obj.sq_PlaySound("PRECENCIA_CHASERPRESS_3_FINISH"); break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_ChasersExplosion(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0:
|
||
|
|
local vz = sq_GetUniformVelocity(0, 50, timeEventCount, 10);
|
||
|
|
sq_setCurrentAxisPos(obj, 2, vz);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(3, 6);
|
||
|
|
local delay2 = currentAni.getDelaySum(3, 9);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,-70,0,50,obj.getDirection(),SKILL_BYKK_CHASERSEXPLOSION,1,delay,0,0,0,0,0,0,0);
|
||
|
|
obj.setTimeEvent(2, delay2, 1, false);
|
||
|
|
local baseX = sq_GetDistancePos(sq_GetXPos(obj), obj.getDirection(), -75);
|
||
|
|
local baseZ = 88;
|
||
|
|
local size = obj.getVar("kksChaser").get_obj_vector_size();
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local chaserObj = obj.getVar("kksChaser").get_obj_vector(i);
|
||
|
|
if(chaserObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(chaserObj);
|
||
|
|
if(colObj.getState() > 22) colObj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
||
|
|
colObj.removeAllTimeEvent();
|
||
|
|
local angle = 360 / size * i;
|
||
|
|
local x = (sq_Cos(sq_ToRadian(angle.tofloat())) * 60.0).tointeger();
|
||
|
|
local z = (sq_Sin(sq_ToRadian(angle.tofloat())) * 60.0).tointeger();
|
||
|
|
colObj.getVar("moveSet").setInt(10, baseX + x);
|
||
|
|
colObj.getVar("moveSet").setInt(11, baseZ + z);
|
||
|
|
colObj.getVar("moveSet").setInt(12, baseX);
|
||
|
|
colObj.getVar("moveSet").setInt(13, baseZ);
|
||
|
|
colObj.getVar("moveSet").setInt(14, delay);
|
||
|
|
colObj.setTimeEvent(15, delay / 45, 15, true);
|
||
|
|
// local totalDamage = obj.getVar("ChasersExplosion_damage").getInt(10) + colObj.getVar("custom").getInt(10);
|
||
|
|
// obj.getVar("ChasersExplosion_damage").setInt(10, totalDamage);
|
||
|
|
// print(obj.getVar("ChasersExplosion_damage").getInt(10));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_CHASERSEXPLOSION, -1, 0, 1.0);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_CHASERSEXPLOSION);
|
||
|
|
local baseSRate = sq_GetIntData(obj, SKILL_BYKK_CHASERSEXPLOSION, 0);
|
||
|
|
print("baseSRate = "+baseSRate);
|
||
|
|
local addSRate = sq_GetIntData(obj, SKILL_BYKK_CHASERSEXPLOSION, 2) / 10;
|
||
|
|
// if(sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY) > 0 && obj.getWeaponSubType() == 1) baseSRate = baseSRate + sq_GetIntData(obj, SKILL_BYKK_POLEMASTERY, 2) / 10;
|
||
|
|
baseSRate = baseSRate + obj.getVar("chasersexp").getInt(10) * addSRate;
|
||
|
|
// if(sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY) > 0 && obj.getWeaponSubType() == 1) baseSRate = baseSRate * (100 + sq_GetIntData(obj, SKILL_BYKK_SPEARMASTERY, 2)) / 100;
|
||
|
|
// totalDamage = totalDamage * obj.getVar("ChasersExplosion_damage").getInt(10) / 100;
|
||
|
|
|
||
|
|
print("test1 = "+obj.getVar("chasersexp").getInt(10));
|
||
|
|
print("test2 = "+addSRate);
|
||
|
|
print("test3 = "+baseSRate);
|
||
|
|
print("totalDamage = "+totalDamage);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,75,1,0,obj.getDirection(),SKILL_BYKK_CHASERSEXPLOSION,2,totalDamage,baseSRate,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 10:
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(3, 6);
|
||
|
|
local baseX = sq_GetDistancePos(sq_GetXPos(obj), obj.getDirection(), 5);
|
||
|
|
local baseZ = 240;
|
||
|
|
local size = obj.getVar("kksChaser").get_obj_vector_size();
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local chaserObj = obj.getVar("kksChaser").get_obj_vector(i);
|
||
|
|
if(chaserObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(chaserObj);
|
||
|
|
if(colObj.getState() > 22) colObj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
||
|
|
colObj.removeAllTimeEvent();
|
||
|
|
local angle = 360 / size * i;
|
||
|
|
local x = (sq_Cos(sq_ToRadian(angle.tofloat())) * 80.0).tointeger();
|
||
|
|
local z = (sq_Sin(sq_ToRadian(angle.tofloat())) * 80.0).tointeger();
|
||
|
|
colObj.getVar("moveSet").setInt(10, baseX + x);
|
||
|
|
colObj.getVar("moveSet").setInt(11, baseZ + z);
|
||
|
|
colObj.getVar("moveSet").setInt(12, baseX);
|
||
|
|
colObj.getVar("moveSet").setInt(13, baseZ);
|
||
|
|
colObj.getVar("moveSet").setInt(14, delay);
|
||
|
|
colObj.setTimeEvent(15, delay / 45, 15, true);
|
||
|
|
// local totalDamage = obj.getVar("ChasersExplosion_damage").getInt(10) + colObj.getVar("custom").getInt(10);
|
||
|
|
// obj.getVar("ChasersExplosion_damage").setInt(10, totalDamage);
|
||
|
|
// print(obj.getVar("ChasersExplosion_damage").getInt(10));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_ChasersExplosion(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != STATE_BYKK_CHASERSEXPLOSION && new_state != STATE_DIE){
|
||
|
|
local createMax = sq_GetLevelData(obj, SKILL_BYKK_CHASERSEXPLOSION, 16, sq_GetSkillLevel(obj, SKILL_BYKK_CHASERSEXPLOSION));
|
||
|
|
for(local i = 0; i < createMax; i++){
|
||
|
|
createBattlemageChaser(obj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_DoubleSwing(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DOUBLESWING);
|
||
|
|
if (isUse){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_DOUBLESWING, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_DoubleSwing(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_DoubleSwing(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Doubleswing1", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) obj.sq_SetCurrentAnimation(226);
|
||
|
|
else obj.sq_SetCurrentAnimation(65);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Doubleswing2", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) obj.sq_SetCurrentAnimation(227);
|
||
|
|
else obj.sq_SetCurrentAnimation(66);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local speed = 1.0;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1) speed = 0.3 + speed;
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) speed = 0.5 + speed;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
local atkIndex = [35,36];
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_DOUBLESWING);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DOUBLESWING, -1, subState, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, atkIndex[subState]));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
if(attackInfo){
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_DoubleSwing(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_DOUBLESWING, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_DoubleSwing(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_DoubleSwing(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
if(flagIndex == 1){
|
||
|
|
sq_SetMyShake(obj, 5, 100);
|
||
|
|
switch(obj.getSkillSubState()){
|
||
|
|
case 0:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/doubleswing/doubleswing1_02.ani", 0, 1, 0);
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_DOUBLESWING_1");
|
||
|
|
obj.sq_PlaySound("PRECENCIA_DOUBLESWING_1");
|
||
|
|
}
|
||
|
|
else obj.sq_PlaySound("WZ_DOUBLE_SWING_01");
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_DOUBLESWING_2");
|
||
|
|
obj.sq_PlaySound("PRECENCIA_DOUBLESWING_2");
|
||
|
|
}
|
||
|
|
else obj.sq_PlaySound("R_WZ_DOUBLE_SWING_02");
|
||
|
|
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DOUBLESWING, -1, 2, 1.0) + 100;
|
||
|
|
local sizeRate = sq_GetLevelData(obj, SKILL_BYKK_DOUBLESWING, 3, sq_GetSkillLevel(obj, SKILL_BYKK_DOUBLESWING));
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SPEARMASTERY) > 0) sizeRate = sizeRate * (100 + sq_GetIntData(obj, SKILL_BYKK_SPEARMASTERY, 2)) / 100;
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,150,0,0,obj.getDirection(),SKILL_BYKK_DOUBLESWING,1,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_DoubleSwing(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_DoubleSwing(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_DragonSpear(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_DRAGONSPEAR);
|
||
|
|
if (isUse){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
obj.getVar("dragonspearTar").clear_obj_vector();
|
||
|
|
obj.getVar("dragonspearTar_fix").clear_obj_vector();
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_DRAGONDANCE) > 0 && !sq_GetSkill(obj, SKILL_BYKK_DRAGONDANCE).isSealFunction()){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2) obj.sq_IntVectPush(12);
|
||
|
|
else{
|
||
|
|
if(DRAGONSPEAR_STONE > 0 || sq_GetLevelData(obj, SKILL_BYKK_DRAGONSPEAR, 15, sq_GetSkillLevel(obj, SKILL_BYKK_DRAGONSPEAR)) > 0) obj.sq_IntVectPush(2);
|
||
|
|
else obj.sq_IntVectPush(1);
|
||
|
|
}
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_DRAGONSPEAR, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2) obj.sq_IntVectPush(10);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_DRAGONSPEAR, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function checkCommandEnable_DragonSpear(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_DragonSpear(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0://普通形態
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "DragonSpear", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(17);
|
||
|
|
obj.sq_AddStateLayerAnimation(10002,obj.sq_CreateCNRDAnimation("effect/animation/avatar/dragonspear/spearattack1.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/avatar/dragonspear/spearattack2.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(10000,obj.sq_CreateCNRDAnimation("effect/animation/avatar/dragonspear/spearattack3.ani"), 0, 0);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 0, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 15));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
case 1://煌龍亂舞普通形態
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "DragonSpearNew_Body", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(99);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 7, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 58));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
obj.getVar("DragonSpearBool").setBool(0, true);
|
||
|
|
break;
|
||
|
|
case 2://煌龍亂舞護石形態
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "DragonSpearNew_Body_Talisman", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(284);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 7, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 58));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
obj.getVar("DragonSpearBool").setBool(0, true);
|
||
|
|
break;
|
||
|
|
case 10://三覺形態準備
|
||
|
|
obj.sq_SetCurrentAnimation(234);
|
||
|
|
break;
|
||
|
|
case 11://三覺形態釋放
|
||
|
|
obj.sq_SetCurrentAnimation(233);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 0, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 15));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
case 12://三覺形態煌龍亂舞開始
|
||
|
|
obj.sq_SetCurrentAnimation(232);
|
||
|
|
obj.getVar("DragonSpearBool").setBool(0, true);
|
||
|
|
break;
|
||
|
|
case 13://三覺形態煌龍亂舞過程
|
||
|
|
obj.sq_SetCurrentAnimation(231);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 7, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 61));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
case 14://三覺形態煌龍亂舞過程(護石)
|
||
|
|
obj.sq_SetCurrentAnimation(230);
|
||
|
|
break;
|
||
|
|
case 15://三覺形態煌龍亂舞結束
|
||
|
|
obj.sq_SetCurrentAnimation(229);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 7, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 60));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
if(attackInfo){
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
}
|
||
|
|
local speedRate = 1.0 + sq_GetLevelData(obj, SKILL_BYKK_DRAGONSPEAR, 2, sq_GetSkillLevel(obj, SKILL_BYKK_DRAGONSPEAR)).tofloat() / 100;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1) speedRate = 0.3 + speedRate;
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) speedRate = 0.5 + speedRate;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speedRate, speedRate);
|
||
|
|
if(subState == 0 || subState == 11 && sq_GetLevelData(obj, SKILL_BYKK_DRAGONSPEAR, 15, sq_GetSkillLevel(obj, SKILL_BYKK_DRAGONSPEAR)) < 1){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
obj.sq_SetXScrollStart(300, currentAni.getDelaySum(0, 6));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_DragonSpear(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
case 11:
|
||
|
|
case 15:
|
||
|
|
obj.sq_SetXScrollStop(0);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
if(subState == 0){
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatar/dragonspear/speardisappear1.ani", 0, 0, 0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/avatar/dragonspear/speardisappear2.ani", 0, 1, 0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 10:
|
||
|
|
case 12:
|
||
|
|
case 14:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_DRAGONSPEAR, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 13:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(DRAGONSPEAR_STONE > 0 || sq_GetLevelData(obj, SKILL_BYKK_DRAGONSPEAR, 15, sq_GetSkillLevel(obj, SKILL_BYKK_DRAGONSPEAR)) > 0) obj.sq_IntVectPush(subState + 1);
|
||
|
|
else obj.sq_IntVectPush(subState + 2);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_DRAGONSPEAR, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_DragonSpear(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
case 12:
|
||
|
|
case 13:
|
||
|
|
if(obj.getVar("DragonSpearBool").getBool(0)){
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT || sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT){
|
||
|
|
obj.getVar("DragonSpearBool").setBool(0, false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_DragonSpear(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1000:
|
||
|
|
obj.sq_PlaySound("YELLOWD_CHARGE");
|
||
|
|
obj.sq_PlaySound("R_WZ_DRAGONDANCE");
|
||
|
|
break;
|
||
|
|
case 1001://生成龍刀
|
||
|
|
break;
|
||
|
|
case 1002://生成龍珠後攻擊
|
||
|
|
if(obj.getVar("dragonspearTar_fix").get_obj_vector_size() < 1 && obj.getVar("dragonspearTar").get_obj_vector_size() < 1 || sq_GetLevelData(obj, SKILL_BYKK_DRAGONSPEAR, 15, sq_GetSkillLevel(obj, SKILL_BYKK_DRAGONSPEAR)) > 0){
|
||
|
|
obj.setTimeEvent(1, 300, 1, false);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 1, 1.0) + 100;
|
||
|
|
local sizeRate = (obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 3, 1.0) + 100) * 83 / 100;
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local speedRate = 72000 / currentAni.getDelaySum(0, 0);
|
||
|
|
local createMax = sq_GetIntData(obj, SKILL_BYKK_DRAGONSPEAR, 0);
|
||
|
|
local baseAngle = sq_getRandom(0, 90);
|
||
|
|
for(local i = 0; i < createMax; i++){
|
||
|
|
local angle = 360 / createMax * i + baseAngle;
|
||
|
|
local x = (sq_Cos(sq_ToRadian(angle.tofloat())) * 90.0).tointeger();
|
||
|
|
local z = (sq_Sin(sq_ToRadian(angle.tofloat())) * 90.0).tointeger();
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,300+x,0,50+z,obj.getDirection(),SKILL_BYKK_DRAGONSPEAR,2,totalDamage,sizeRate,i,50,speedRate,0,0,0);
|
||
|
|
}
|
||
|
|
local delay = (2300 + createMax * 200) / speedRate * 100;
|
||
|
|
obj.setTimeEvent(0, delay, 1, false);
|
||
|
|
break;
|
||
|
|
case 2001:
|
||
|
|
case 3001:
|
||
|
|
obj.sq_PlaySound("YELLOWD_CHARGE");
|
||
|
|
obj.sq_PlaySound("R_WZ_DRAGONDANCE");
|
||
|
|
break;
|
||
|
|
case 2002:
|
||
|
|
case 3002:
|
||
|
|
obj.sq_PlaySound("DRAGONDANCE_STAB");
|
||
|
|
sq_flashScreen(obj, 0, 30, 30, 7, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 4, 80);
|
||
|
|
break;
|
||
|
|
case 2003:
|
||
|
|
case 2007:
|
||
|
|
case 3003:
|
||
|
|
case 3008:
|
||
|
|
obj.sq_PlaySound("DRAGONDANCE_SWISH");
|
||
|
|
sq_flashScreen(obj, 0, 30, 30, 7, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 4, 100);
|
||
|
|
obj.resetHitObjectList();
|
||
|
|
if(obj.getVar("DragonSpearBool").getBool(0) == false) {sq_SetVelocity(obj, 0, 0.0);break;}
|
||
|
|
local speed = 300.0;
|
||
|
|
if(obj.getDirection() == ENUM_DIRECTION_LEFT) speed = -speed;
|
||
|
|
if(flagIndex == 2003 || flagIndex == 3003) sq_SetVelocity(obj, 0, speed);
|
||
|
|
else sq_SetVelocity(obj, 0, 0.0);
|
||
|
|
break;
|
||
|
|
case 2004:
|
||
|
|
case 2005:
|
||
|
|
case 3004:
|
||
|
|
obj.sq_PlaySound("DRAGONDANCE_SWISH");
|
||
|
|
sq_flashScreen(obj, 0, 30, 30, 7, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 4, 80);
|
||
|
|
obj.resetHitObjectList();
|
||
|
|
if(obj.getVar("DragonSpearBool").getBool(0) == false) {sq_SetVelocity(obj, 0, 0.0);break;}
|
||
|
|
local speed = 300.0;
|
||
|
|
if(obj.getDirection() == ENUM_DIRECTION_LEFT) speed = -speed;
|
||
|
|
if(flagIndex == 2004 || flagIndex == 3004) sq_SetVelocity(obj, 0, speed);
|
||
|
|
else sq_SetVelocity(obj, 0, 0.0);
|
||
|
|
break;
|
||
|
|
case 2006:
|
||
|
|
case 3006:
|
||
|
|
obj.resetHitObjectList();
|
||
|
|
if(obj.getVar("DragonSpearBool").getBool(0) == false) {sq_SetVelocity(obj, 0, 0.0);break;}
|
||
|
|
local speed = 300.0;
|
||
|
|
if(obj.getDirection() == ENUM_DIRECTION_LEFT) speed = -speed;
|
||
|
|
sq_SetVelocity(obj, 0, speed);
|
||
|
|
break;
|
||
|
|
case 2007:
|
||
|
|
case 3007:
|
||
|
|
obj.resetHitObjectList();
|
||
|
|
sq_SetVelocity(obj, 0, 0.0);
|
||
|
|
break;
|
||
|
|
case 2008:
|
||
|
|
case 3009:
|
||
|
|
if(obj.getVar("DragonSpearBool").getBool(0) == false) {sq_SetVelocity(obj, 0, 0.0);break;}
|
||
|
|
local speed = 300.0;
|
||
|
|
if(obj.getDirection() == ENUM_DIRECTION_LEFT) speed = -speed;
|
||
|
|
sq_SetVelocity(obj, 0, speed);
|
||
|
|
break;
|
||
|
|
case 2009:
|
||
|
|
case 3010:
|
||
|
|
obj.sq_PlaySound("DRAGONDANCE_FINISH");
|
||
|
|
sq_flashScreen(obj, 0, 80, 100, 51, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 15, 180);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 8, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 59));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
case 2010:
|
||
|
|
case 3011:
|
||
|
|
sq_SetVelocity(obj, 0, 0.0);
|
||
|
|
break;
|
||
|
|
case 3012:
|
||
|
|
obj.sq_PlaySound("R_WZ_DRAGONDANCE_FIN");
|
||
|
|
obj.sq_PlaySound("DRAGONDANCE_FINISH");
|
||
|
|
obj.sq_PlaySound("BLAST_SWORD_EXP");
|
||
|
|
sq_flashScreen(obj, 10, 100, 10, 51, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 20, 120);
|
||
|
|
//`add finish exp` 149 1 -7
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 8, 1.0) + 100;
|
||
|
|
totalDamage = totalDamage * 18 / 100;
|
||
|
|
local sizeRate = 100;
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,149,1,-7,obj.getDirection(),SKILL_BYKK_DRAGONSPEAR,1,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 1101:
|
||
|
|
obj.sq_PlaySound("YELLOWD_CHARGE");
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_DRAGONSPEAR_1");
|
||
|
|
break;
|
||
|
|
case 1102://生成龍珠後攻擊
|
||
|
|
if(obj.getVar("dragonspearTar_fix").get_obj_vector_size() < 1 && obj.getVar("dragonspearTar").get_obj_vector_size() < 1 || sq_GetLevelData(obj, SKILL_BYKK_DRAGONSPEAR, 15, sq_GetSkillLevel(obj, SKILL_BYKK_DRAGONSPEAR)) > 0){
|
||
|
|
obj.setTimeEvent(1, 300, 1, false);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 1, 1.0) + 100;
|
||
|
|
local sizeRate = (obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 3, 1.0) + 100) * 83 / 100;
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local speedRate = 5100 / currentAni.getDelaySum(0, 0);
|
||
|
|
local createMax = sq_GetIntData(obj, SKILL_BYKK_DRAGONSPEAR, 0);
|
||
|
|
local baseAngle = sq_getRandom(0, 90);
|
||
|
|
for(local i = 0; i < createMax; i++){
|
||
|
|
local angle = 360 / createMax * i + baseAngle;
|
||
|
|
local x = (sq_Cos(sq_ToRadian(angle.tofloat())) * 90.0).tointeger();
|
||
|
|
local z = (sq_Sin(sq_ToRadian(angle.tofloat())) * 90.0).tointeger();
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,300+x,0,100+z,obj.getDirection(),SKILL_BYKK_DRAGONSPEAR,2,totalDamage,sizeRate,i,100,speedRate,0,0,0);
|
||
|
|
}
|
||
|
|
local delay = (2000 + createMax * 200) / speedRate * 100;
|
||
|
|
obj.setTimeEvent(0, delay, 1, false);
|
||
|
|
break;
|
||
|
|
case 1201: obj.sq_PlaySound("YELLOWD_CHARGE"); break;
|
||
|
|
case 1202: obj.sq_PlaySound("R_WZ_PRECENCIA_DRAGONDANCE_1"); break;
|
||
|
|
case 1301:
|
||
|
|
case 1303:
|
||
|
|
case 1305:
|
||
|
|
obj.sq_PlaySound("PRECENCIA_DRAGONDANCE_1");
|
||
|
|
sq_flashScreen(obj, 0, 30, 30, 20, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 3, 80);
|
||
|
|
if(flagIndex > 1301) obj.resetHitObjectList();
|
||
|
|
if(obj.getVar("DragonSpearBool").getBool(0) == false) {sq_SetVelocity(obj, 0, 0.0);break;}
|
||
|
|
local speed = 300.0;
|
||
|
|
if(obj.getDirection() == ENUM_DIRECTION_LEFT) speed = -speed;
|
||
|
|
sq_SetVelocity(obj, 0, speed);
|
||
|
|
break;
|
||
|
|
case 1302: sq_SetVelocity(obj, 0, 0.0); break;
|
||
|
|
case 1304:
|
||
|
|
case 1306:
|
||
|
|
case 1307:
|
||
|
|
if(flagIndex == 1306) obj.sq_PlaySound("PRECENCIA_DRAGONDANCE_2");
|
||
|
|
else if(flagIndex == 1307) obj.resetHitObjectList();
|
||
|
|
if(obj.getVar("DragonSpearBool").getBool(0) == false) {sq_SetVelocity(obj, 0, 0.0);break;}
|
||
|
|
local speed = 300.0;
|
||
|
|
if(obj.getDirection() == ENUM_DIRECTION_LEFT) speed = -speed;
|
||
|
|
sq_SetVelocity(obj, 0, speed);
|
||
|
|
break;
|
||
|
|
case 1308:
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_DRAGONDANCE_2");
|
||
|
|
obj.sq_PlaySound("PRECENCIA_DRAGONDANCE_3");
|
||
|
|
sq_flashScreen(obj, 0, 80, 200, 76, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 20, 150);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 8, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 59));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
if(sq_GetLevelData(obj, SKILL_BYKK_DRAGONSPEAR, 15, sq_GetSkillLevel(obj, SKILL_BYKK_DRAGONSPEAR)) < 1) break;
|
||
|
|
totalDamage = totalDamage * 18 / 100;
|
||
|
|
local sizeRate = 130;
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,220,0,-2,obj.getDirection(),SKILL_BYKK_DRAGONSPEAR,1,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/dragondance_finish_25.ani", 0, 1, -1);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/dragondance_finish_24.ani", 0, 1, -1);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/dragondance_finish_00.ani", 0, 1, -1000);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/dragondance_finish_01.ani", 0, 1, -1000);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/dragondance_finish_05.ani", 0, 1, 0);
|
||
|
|
break;
|
||
|
|
case 1401:
|
||
|
|
obj.sq_PlaySound("PRECENCIA_DRAGONDANCE_1");
|
||
|
|
sq_flashScreen(obj, 0, 30, 30, 20, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 3, 80);
|
||
|
|
if(obj.getSkillSubState() == 14) obj.resetHitObjectList();
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/talisman/talisman_mid_14.ani", 0, -1, 0);
|
||
|
|
if(obj.getVar("DragonSpearBool").getBool(0) == false) {sq_SetVelocity(obj, 0, 0.0);break;}
|
||
|
|
local speed = 300.0;
|
||
|
|
if(obj.getDirection() == ENUM_DIRECTION_LEFT) speed = -speed;
|
||
|
|
sq_SetVelocity(obj, 0, speed);
|
||
|
|
break;
|
||
|
|
case 1402:
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/talisman/talisman_mid_13.ani", 0, -1, 0);
|
||
|
|
break;
|
||
|
|
case 1403:
|
||
|
|
obj.sq_PlaySound("PRECENCIA_DRAGONDANCE_1");
|
||
|
|
obj.resetHitObjectList();
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/talisman/talisman_mid_22.ani", 0, -1, 0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/talisman/talisman_mid_23.ani", 0, -1, 0);
|
||
|
|
sq_flashScreen(obj, 0, 30, 30, 20, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 3, 80);
|
||
|
|
if(obj.getVar("DragonSpearBool").getBool(0) == false) {sq_SetVelocity(obj, 0, 0.0);break;}
|
||
|
|
local speed = 300.0;
|
||
|
|
if(obj.getDirection() == ENUM_DIRECTION_LEFT) speed = -speed;
|
||
|
|
sq_SetVelocity(obj, 0, speed);
|
||
|
|
break;
|
||
|
|
case 1404:
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/talisman/talisman_mid_24.ani", 0, -1, 0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/talisman/talisman_mid_25.ani", 0, -1, 0);
|
||
|
|
break;
|
||
|
|
case 1405:
|
||
|
|
obj.resetHitObjectList();
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/talisman/talisman_mid_24.ani", 0, -1, 0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/talisman/talisman_mid_25.ani", 0, -1, 0);
|
||
|
|
if(obj.getVar("DragonSpearBool").getBool(0) == false) {sq_SetVelocity(obj, 0, 0.0);break;}
|
||
|
|
local speed = 300.0;
|
||
|
|
if(obj.getDirection() == ENUM_DIRECTION_LEFT) speed = -speed;
|
||
|
|
sq_SetVelocity(obj, 0, speed);
|
||
|
|
break;
|
||
|
|
case 4001:
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/dragonspear_06.ani", 0, 1, 0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/dragonspear/precencia/dragonspear_07.ani", 0, 1, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
if(attackInfo){
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_DragonSpear(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0:
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 4, 1.0) + 100;
|
||
|
|
local sizeRate = (obj.sq_GetBonusRateWithPassive(SKILL_BYKK_DRAGONSPEAR, -1, 3, 1.0) + 100) * 83 / 100;
|
||
|
|
local zpos = 50;
|
||
|
|
if(obj.getSkillSubState() == 11) zpos = 100;
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,300,0,zpos,obj.getDirection(),SKILL_BYKK_DRAGONSPEAR,3,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
case 1:
|
||
|
|
if(obj.getSkillSubState() == 0){
|
||
|
|
obj.sq_SetXScrollStop(0);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
currentAni.setCurrentFrameWithChildLayer(15);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_DragonSpear(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != SKILL_BYKK_DRAGONSPEAR){
|
||
|
|
local size = obj.getVar("dragonspearTar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("dragonspearTar").get_obj_vector(i);
|
||
|
|
if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, DRAGONSPEAR_APDPATH);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function onAttack_DragonSpear(obj, damager, boundingBox, isStuck)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
||
|
|
local frameIndex = sq_GetCurrentFrameIndex(obj);
|
||
|
|
if(frameIndex >= 10) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 11:
|
||
|
|
if(sq_IsHoldable(obj,damager) && sq_IsGrabable(obj,damager) && !sq_IsFixture(damager)){
|
||
|
|
if(!obj.getVar("dragonspearTar").is_obj_vector(damager)) obj.getVar("dragonspearTar").push_obj_vector(damager);
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, DRAGONSPEAR_APDPATH, true);
|
||
|
|
sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL , addAppendage);
|
||
|
|
local zpos = 0;
|
||
|
|
if(subState == 11) zpos = 50;
|
||
|
|
local currentAni = obj.getCurrentAnimation();;
|
||
|
|
local delay = currentAni.getDelaySum(frameIndex, 10);
|
||
|
|
sq_MoveToAppendageForce(damager, obj, obj, 300, 0, zpos, delay / 2, true, addAppendage);
|
||
|
|
}
|
||
|
|
else if(sq_IsFixture(damager) || !sq_IsHoldable(obj,damager) || !sq_IsGrabable(obj,damager)){
|
||
|
|
if(!obj.getVar("dragonspearTar_fix").is_obj_vector(damager)) obj.getVar("dragonspearTar_fix").push_obj_vector(damager);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_FusionChaser(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
local size = obj.getVar("kksChaser").get_obj_vector_size();
|
||
|
|
if(size < 2){
|
||
|
|
if (obj.isMessage()) sq_AddMessage(3573);
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_FUSIONCHASER);
|
||
|
|
if (isUse){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_FUSIONCHASER);
|
||
|
|
obj.getVar("fusionchaser").setBool(0, false);
|
||
|
|
obj.getVar("fusionchaser").setBool(10, false);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_FUSIONCHASER, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_FusionChaser(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_FusionChaser(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.getVar("fusioncs").setInt(10, 0);
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(235);
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_FUSIONCHASER_1");
|
||
|
|
obj.sq_PlaySound("PRECENCIA_FUSIONCHASER_CAST");
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Fusionchaser", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(64);
|
||
|
|
obj.sq_PlaySound("WZ_FUSION");
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local sub = 2;
|
||
|
|
for(local i = 0; i < sub; i++){
|
||
|
|
local chaserObj = obj.getVar("kksChaser").get_obj_vector(i);
|
||
|
|
if(!chaserObj){
|
||
|
|
sub = sub + 1;
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
chaserObj.setValid(false);
|
||
|
|
}
|
||
|
|
local speed = 1.0;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1) speed = 0.3 + speed;
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) speed = 0.5 + speed;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
// local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_TIMERBOMB);
|
||
|
|
// local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_TIMERBOMB, -1, 0, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 3));
|
||
|
|
// sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
sq_SetFrameDelayTime(currentAni, 6, 100000);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_FusionChaser(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(obj.getVar("fusioncs").getInt(10) == 0 && sq_GetLevelData(obj, SKILL_BYKK_FUSIONCHASER, 9, sq_GetSkillLevel(obj, SKILL_BYKK_FUSIONCHASER)) > 0){
|
||
|
|
local sub = 2,sizeRate = sq_GetIntData(obj, SKILL_BYKK_FUSIONCHASER, 4) / 2;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) < 2){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut")) sub = 4;
|
||
|
|
else sub = 3;
|
||
|
|
sizeRate = sizeRate * 2;
|
||
|
|
}
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_FUSIONCHASER, -1, 0, 1.0) + 100;
|
||
|
|
sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_BYKK_FUSIONCHASER, 8, sq_GetSkillLevel(obj, SKILL_BYKK_FUSIONCHASER))) / 100;
|
||
|
|
if(obj.getWeaponSubType() == 1 && sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY) > 0) sizeRate = sizeRate * (100 + sq_GetIntData(obj, SKILL_BYKK_POLEMASTERY, 1)) / 100;
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,50,1,75,obj.getDirection(),SKILL_BYKK_FUSIONCHASER,sub,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function onProcCon_FusionChaser(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local frameIndex = sq_GetCurrentFrameIndex(obj);
|
||
|
|
if(frameIndex == 6){
|
||
|
|
if(obj.getVar("fusionchaser").getBool(0) == false){
|
||
|
|
obj.getVar("fusionchaser").setBool(0, true);
|
||
|
|
local sub = 0,xpos = -10, zpos = 120;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut")) sub = 1;
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
sub = 2; xpos = 0; zpos = 160;
|
||
|
|
}
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,xpos,0,zpos,obj.getDirection(),SKILL_BYKK_FUSIONCHASER,1,sub,0,0,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
||
|
|
if(!bDownKey){
|
||
|
|
local stateTime = obj.sq_GetStateTimer();
|
||
|
|
if(stateTime <= 500 || sq_GetLevelData(obj, SKILL_BYKK_FUSIONCHASER, 7, sq_GetSkillLevel(obj, SKILL_BYKK_FUSIONCHASER)) > 0) obj.getVar("fusionchaser").setBool(10, true);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
currentAni.setCurrentFrameWithChildLayer(7);
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_PlaySound("PRECENCIA_FUSIONCHASER_SHOT");
|
||
|
|
obj.sq_PlaySound("WZ_PRECENCIA_FUSIONCHASER_2");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
currentAni.setCurrentFrameWithChildLayer(4);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_FusionChaser(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1:
|
||
|
|
obj.getVar("fusionChaser_move").setInt(10, sq_GetXPos(obj));
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local poleAniFrameNumber = sq_GetAniFrameNumber(currentAni, 0);
|
||
|
|
local delay = currentAni.getDelaySum(9, poleAniFrameNumber);
|
||
|
|
obj.setTimeEvent(0, delay / 30, 30, true);
|
||
|
|
local atkObj = obj.getVar("kksfsChaser").get_obj_vector(0);
|
||
|
|
if(atkObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(atkObj);
|
||
|
|
local zpos = 65;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2) zpos = 80;
|
||
|
|
sq_setCurrentAxisPos(colObj, 2, zpos);
|
||
|
|
colObj.setTimeEvent(0, delay / 30, 30, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_FusionChaser(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0:
|
||
|
|
local baseX = obj.getVar("fusionChaser_move").getInt(10);
|
||
|
|
local v = sq_GetUniformVelocity(0, 200, timeEventCount, 30);
|
||
|
|
local dstX = sq_GetDistancePos(baseX, obj.getDirection(), v);
|
||
|
|
if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_FusionChaser(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local size = obj.getVar("kksfsChaser").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local atkObj = obj.getVar("kksfsChaser").get_obj_vector(i);
|
||
|
|
if(atkObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(atkObj);
|
||
|
|
if(colObj.getState() == 20) colObj.setValid(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAttack_FusionChaser(obj, damager, boundingBox, isStuck)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
||
|
|
obj.getVar("fusioncs").setInt(10, obj.getVar("fusioncs").getInt(10) + 1);
|
||
|
|
if(obj.getVar("fusionchaser").getBool(10)){
|
||
|
|
obj.getVar("fusionchaser").setBool(10, false);
|
||
|
|
local sub = 2,sizeRate = sq_GetIntData(obj, SKILL_BYKK_FUSIONCHASER, 4) / 2;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) < 2){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut")) sub = 4;
|
||
|
|
else sub = 3;
|
||
|
|
sizeRate = sizeRate * 2;
|
||
|
|
}
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_FUSIONCHASER, -1, 0, 1.0) + 100;
|
||
|
|
if(sq_GetLevelData(obj, SKILL_BYKK_FUSIONCHASER, 10, sq_GetSkillLevel(obj, SKILL_BYKK_FUSIONCHASER)) > 0){
|
||
|
|
local sub = 2;
|
||
|
|
for(local i = 0; i < sub; i++){
|
||
|
|
local chaserObj = obj.getVar("kksChaser").get_obj_vector(i);
|
||
|
|
if(!chaserObj){
|
||
|
|
sub = sub + 1;
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
chaserObj.setValid(false);
|
||
|
|
}
|
||
|
|
totalDamage = totalDamage * 2;
|
||
|
|
}
|
||
|
|
sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_BYKK_FUSIONCHASER, 8, sq_GetSkillLevel(obj, SKILL_BYKK_FUSIONCHASER))) / 100;
|
||
|
|
if(obj.getWeaponSubType() == 1 && sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY) > 0) sizeRate = sizeRate * (100 + sq_GetIntData(obj, SKILL_BYKK_POLEMASTERY, 1)) / 100;
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,damager,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,1,sq_GetCenterZPos(boundingBox),obj.getDirection(),SKILL_BYKK_FUSIONCHASER,sub,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
local atkObj = obj.getVar("kksfsChaser").get_obj_vector(0);
|
||
|
|
if(atkObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(atkObj);
|
||
|
|
if(colObj.getState() == 20){
|
||
|
|
obj.getVar("kksfsChaser").remove_obj_vector(colObj);
|
||
|
|
colObj.removeAllTimeEvent();
|
||
|
|
colObj.getVar("tar").clear_obj_vector();
|
||
|
|
colObj.getVar("tar").push_obj_vector(damager);
|
||
|
|
sq_setCurrentAxisPos(colObj, 0, sq_GetXPos(damager));
|
||
|
|
sq_setCurrentAxisPos(colObj, 1, sq_GetYPos(damager) + 1);
|
||
|
|
sq_setCurrentAxisPos(colObj, 2, sq_GetCenterZPos(boundingBox));
|
||
|
|
sq_moveWithParent(damager, colObj);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_FUSIONCHASER, -1, 4, 1.0) + 100;
|
||
|
|
if(sq_GetLevelData(obj, SKILL_BYKK_FUSIONCHASER, 10, sq_GetSkillLevel(obj, SKILL_BYKK_FUSIONCHASER)) > 0){
|
||
|
|
local sub = 2;
|
||
|
|
for(local i = 0; i < sub; i++){
|
||
|
|
local chaserObj = obj.getVar("kksChaser").get_obj_vector(i);
|
||
|
|
if(!chaserObj){
|
||
|
|
sub = sub + 1;
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
chaserObj.setValid(false);
|
||
|
|
}
|
||
|
|
totalDamage = totalDamage * 2;
|
||
|
|
}
|
||
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_FUSIONCHASER, 7);
|
||
|
|
local lifeTime = sq_GetIntData(obj, SKILL_BYKK_FUSIONCHASER, 8);
|
||
|
|
colObj.setTimeEvent(2, hitTime, -1, true);
|
||
|
|
colObj.setTimeEvent(3, lifeTime, 1, false);
|
||
|
|
sq_SetCurrentAttackInfo(colObj, sq_GetCustomAttackInfo(colObj, 24));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(colObj), totalDamage);
|
||
|
|
colObj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkExecutableSkill_Goddnessofwar(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_GODDNESSOFWAR);
|
||
|
|
if (isUse){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GODDNESSOFWAR, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Goddnessofwar(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Goddnessofwar(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(237);
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_GODDNESSOFWAR");
|
||
|
|
obj.sq_PlaySound("PRECENCIA_GODDNESSOFWAR");
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Goddnessofwar_Body", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(273);
|
||
|
|
|
||
|
|
obj.sq_PlaySound("TEANA_CHANGE_CAST");
|
||
|
|
obj.sq_PlaySound("GODDESWAR");
|
||
|
|
obj.sq_PlaySound("R_WZ_GODDNESSOFWAR");
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(218);
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_CHASER_EVOLUTION");
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Wink1", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local Ani = obj.sq_GetThrowChargeAni(3);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
obj.sq_PlaySound("WZ_EVOLUTIONCHASER_START");
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Wink2", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local Ani = obj.sq_GetThrowShootAni(3);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
obj.sq_PlaySound("WZ_EVOLUTIONCHASER_LAUNCH");
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut")){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut");
|
||
|
|
changeBattlemageChaser(obj, 0);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut") || CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) return;
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_CHASEREVOLUTION, false, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut", true);
|
||
|
|
addAppendage.setEnableIsBuff(true);
|
||
|
|
addAppendage.setBuffIconImage(74);
|
||
|
|
addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_CHASEREVOLUTION, sq_GetSkillLevel(obj, SKILL_BYKK_CHASEREVOLUTION));
|
||
|
|
CNSquirrelAppendage.sq_Append(addAppendage, obj, obj, true);
|
||
|
|
changeBattlemageChaser(obj, 1);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Goddnessofwar(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
local apdPath = "character/mage/battlemage_bykk/ap/ap_goddnessofwar.nut";
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath)) CNSquirrelAppendage.sq_RemoveAppendage(obj, apdPath);
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_GODDNESSOFWAR, false, apdPath, true);
|
||
|
|
setDamageRate_BattleMage_bykk(obj);
|
||
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_BYKK_GODDNESSOFWAR);
|
||
|
|
local buffTime = sq_GetLevelData(obj, SKILL_BYKK_GODDNESSOFWAR, 0, skill_level);
|
||
|
|
if(buffTime > 0) addAppendage.sq_SetValidTime(buffTime);
|
||
|
|
addAppendage.setEnableIsBuff(true);
|
||
|
|
addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_GODDNESSOFWAR, skill_level);
|
||
|
|
CNSquirrelAppendage.sq_Append(addAppendage, obj, obj, true);
|
||
|
|
|
||
|
|
local rad = sq_GetLevelData(obj, 7, 1, sq_GetSkillLevel(obj, 7)) / 10;
|
||
|
|
obj.getVar("apGetSetbyKK").setInt(0, rad);
|
||
|
|
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(4);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_GODDNESSOFWAR, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 4:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Goddnessofwar(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Goddnessofwar(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 101:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut")){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut");
|
||
|
|
changeBattlemageChaser(obj, 0);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut") || CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) return;
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_CHASEREVOLUTION, false, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut", true);
|
||
|
|
addAppendage.setEnableIsBuff(true);
|
||
|
|
addAppendage.setBuffIconImage(74);
|
||
|
|
addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_CHASEREVOLUTION, sq_GetSkillLevel(obj, SKILL_BYKK_CHASEREVOLUTION));
|
||
|
|
CNSquirrelAppendage.sq_Append(addAppendage, obj, obj, true);
|
||
|
|
changeBattlemageChaser(obj, 1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Goddnessofwar(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Goddnessofwar(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_HandStrike(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_HANDSTRIKE);
|
||
|
|
if (isUse){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HANDSTRIKE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_HandStrike(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_HandStrike(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_HANDSTRIKE);
|
||
|
|
obj.getVar("handstrike_move").setBool(100, false);
|
||
|
|
obj.getVar("handstrike_bool").setBool(0, true);
|
||
|
|
obj.getVar("handstrike_bool").setBool(1, true);
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(240);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.5, 1.5);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Handstrike", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(4);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_HANDSTRIKE);
|
||
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_HANDSTRIKE, 1, skillLevel);
|
||
|
|
local change = sq_GetLevelData(obj, SKILL_BYKK_HANDSTRIKE, 10, skillLevel);
|
||
|
|
if(change > 0) totalDamage = (obj.sq_GetBonusRateWithPassive(174, -1, 0, 1.0) + 200) * change / 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 3));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
local bForce = sq_GetLevelData(obj, SKILL_BYKK_HANDSTRIKE, 2, skillLevel);
|
||
|
|
sq_SetCurrentAttacknBackForce(attackInfo, bForce);
|
||
|
|
sq_SetCurrentAttacknUpForce(attackInfo, 600);
|
||
|
|
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(239);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.5, 1.5);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_SetCurrentAnimation(238);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_HANDSTRIKE);
|
||
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_HANDSTRIKE, 1, skillLevel);
|
||
|
|
local change = sq_GetLevelData(obj, SKILL_BYKK_HANDSTRIKE, 10, skillLevel);
|
||
|
|
if(change > 0) totalDamage = (obj.sq_GetBonusRateWithPassive(174, -1, 0, 1.0) + 200) * change / 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 1));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
local bForce = sq_GetLevelData(obj, SKILL_BYKK_HANDSTRIKE, 2, skillLevel);
|
||
|
|
sq_SetCurrentAttacknBackForce(attackInfo, bForce);
|
||
|
|
sq_SetCurrentAttacknUpForce(attackInfo, 600);
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.5, 1.5);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(false);
|
||
|
|
local stateTime = obj.sq_GetVectorData(datas, 1);
|
||
|
|
print("stateTime = "+stateTime);
|
||
|
|
local speedRate = stateTime.tofloat() * 1.5;
|
||
|
|
if(speedRate <= 1000) speedRate = 1000.0;
|
||
|
|
else if(speedRate >= 2000) speedRate = 2000.0;
|
||
|
|
speedRate = 410.0 / delay * speedRate;
|
||
|
|
print("speedRate = "+speedRate);
|
||
|
|
if(sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT) sq_SetVelocity(obj, 0, speedRate);
|
||
|
|
else sq_SetVelocity(obj, 0, -speedRate);
|
||
|
|
// obj.getVar("handstrike_move").setInt(10, sq_GetXPos(obj));
|
||
|
|
// obj.setTimeEvent(1, delay / 20, 20, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_HandStrike(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HANDSTRIKE, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HANDSTRIKE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_HandStrike(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2) break;
|
||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
||
|
|
local frameIndex = sq_GetCurrentFrameIndex(obj);
|
||
|
|
local stateTime = obj.sq_GetStateTimer();
|
||
|
|
if(!bDownKey && obj.getVar("handstrike_bool").getBool(1)){
|
||
|
|
obj.getVar("handstrike_bool").setBool(1, false);
|
||
|
|
obj.getVar("handstrike_move").setInt(10, sq_GetXPos(obj));
|
||
|
|
obj.getVar("handstrike_move").setInt(11, 200);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
currentAni.setCurrentFrameWithChildLayer(9);
|
||
|
|
local delay = currentAni.getDelaySum(9, 13);
|
||
|
|
//obj.setTimeEvent(0, delay / 30, 20, true);
|
||
|
|
print("stateTime = "+stateTime);
|
||
|
|
local speedRate = stateTime.tofloat() * 1.5;
|
||
|
|
if(speedRate <= 1000) speedRate = 1000.0;
|
||
|
|
else if(speedRate >= 2000) speedRate = 2000.0;
|
||
|
|
speedRate = 410.0 / delay * speedRate;
|
||
|
|
print("speedRate = "+speedRate);
|
||
|
|
if(sq_GetDirection(obj) == ENUM_DIRECTION_RIGHT) sq_SetVelocity(obj, 0, speedRate);
|
||
|
|
else sq_SetVelocity(obj, 0, -speedRate);
|
||
|
|
obj.sq_PlaySound("WZ_DASH_HIT");
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if(frameIndex == 7){
|
||
|
|
if(stateTime >= sq_GetIntData(obj, SKILL_BYKK_HANDSTRIKE, 2) && obj.getVar("handstrike_bool").getBool(0)){
|
||
|
|
obj.getVar("handstrike_bool").setBool(0, false);
|
||
|
|
obj.getVar("handstrike_move").setBool(100, true);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/magicfullcharge31.ani", 0, 1, 50);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/magicfullcharge32.ani", 0, 1, 50);
|
||
|
|
obj.sq_PlaySound("YELLOWD_CHARGE");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
||
|
|
local stateTime = obj.sq_GetStateTimer();
|
||
|
|
//if(stateTime < 200) break;
|
||
|
|
if(!bDownKey){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_IntVectPush(stateTime);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_HANDSTRIKE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local fullchargeTime = sq_GetIntData(obj, SKILL_BYKK_HANDSTRIKE, 2);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SPEARMASTERY) > 0 && obj.getWeaponSubType() == 0) fullchargeTime = fullchargeTime * (100 - sq_GetIntData(obj, SKILL_BYKK_SPEARMASTERY, 0)) / 100;
|
||
|
|
if(stateTime >= fullchargeTime && obj.getVar("handstrike_bool").getBool(0)){
|
||
|
|
obj.getVar("handstrike_bool").setBool(0, false);
|
||
|
|
obj.getVar("handstrike_move").setBool(100, true);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/magicfullcharge31.ani", 0, 1, 75);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/magicfullcharge32.ani", 0, 1, 75);
|
||
|
|
obj.sq_PlaySound("YELLOWD_CHARGE");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function onKeyFrameFlag_HandStrike(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_HandStrike(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0:
|
||
|
|
local baseX = obj.getVar("handstrike_move").getInt(10);
|
||
|
|
local moveX = obj.getVar("handstrike_move").getInt(11);
|
||
|
|
if(obj.getVar("handstrike_move").getBool(100)) moveX = moveX * 150 / 100;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2) moveX = moveX * 150 / 100;
|
||
|
|
local v = sq_GetUniformVelocity(0, moveX, timeEventCount, 20);
|
||
|
|
local dstX = sq_GetDistancePos(baseX, obj.getDirection(), v);
|
||
|
|
if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX);
|
||
|
|
else{
|
||
|
|
obj.getVar("handstrike_move").setInt(10, sq_GetXPos(obj));
|
||
|
|
obj.getVar("handstrike_move").setInt(11, 0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local baseX = obj.getVar("handstrike_move").getInt(10);
|
||
|
|
local moveX = obj.getVar("handstrike_move").getInt(11);
|
||
|
|
if(obj.getVar("handstrike_move").getBool(100)) moveX = moveX * 150 / 100;
|
||
|
|
local v = sq_GetUniformVelocity(0, moveX, timeEventCount, 20);
|
||
|
|
local dstX = sq_GetDistancePos(baseX, obj.getDirection(), v);
|
||
|
|
if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX);
|
||
|
|
else{
|
||
|
|
obj.getVar("handstrike_move").setInt(10, sq_GetXPos(obj));
|
||
|
|
obj.getVar("handstrike_move").setInt(11, 0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_HandStrike(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function onAttack_HandStrike(obj, damager, boundingBox, isStuck)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(obj.getVar("handstrike_move").getBool(100) == false) return;
|
||
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
||
|
|
if(sq_getGrowType(obj) != 3) return;
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_HANDSTRIKE, -1, 6, 1.0);
|
||
|
|
local group = sq_GetGroup(damager);
|
||
|
|
local uniqueId = sq_GetUniqueId(damager);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,damager,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,0,sq_GetZPos(damager),damager.getDirection(),SKILL_BYKK_HANDSTRIKE,1,totalDamage,group,uniqueId,0,0,0,0,0);
|
||
|
|
|
||
|
|
local createMax = sq_GetIntData(obj, SKILL_BYKK_CHASER, 0);
|
||
|
|
if(obj.getVar("kksChaser").get_obj_vector_size() < createMax) createBattlemageChaser(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_Layofprimitive(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_LAYOFPRIMITIVE);
|
||
|
|
if (isUse){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2) obj.sq_IntVectPush(1);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_LAYOFPRIMITIVE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Layofprimitive(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Layofprimitive(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0://start
|
||
|
|
obj.sq_SetCurrentAnimation(288);
|
||
|
|
// sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/layofprimitive/layofprimitive_start_front_03.ani", 0, 1, 0);
|
||
|
|
// sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/layofprimitive/layofprimitive_start_back_08.ani", 0, -1, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/layofprimitive/layofprimitive_start_front_03.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/layofprimitive/layofprimitive_start_back_08.ani"), 0, 0);
|
||
|
|
obj.sq_PlaySound("PRECENCIA_CHANGE_SHORT");
|
||
|
|
break;
|
||
|
|
case 1://summon
|
||
|
|
obj.sq_SetCurrentAnimation(289);
|
||
|
|
sq_flashScreen(obj, 30, 1100, 180, 204, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
obj.sq_PlaySound("PRECENCIA_LAYOFPRIMITIVE_1_CAST");
|
||
|
|
obj.sq_PlaySound("WZ_PRECENCIA_LAYOFPRIMITIVE_1_1");
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 63));
|
||
|
|
break;
|
||
|
|
case 2://loop
|
||
|
|
obj.sq_SetCurrentAnimation(287);
|
||
|
|
// sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/layofprimitive/layofprimitive_loop_rune_00.ani", 175, 1, 75);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/layofprimitive/layofprimitive_loop_rune_00.ani"), 175, -75);
|
||
|
|
obj.sq_PlaySound("PRECENCIA_LAYOFPRIMITIVE_2_SPEAR");
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_LAYOFPRIMITIVE_1_2");
|
||
|
|
obj.getVar("Layofprimitive_chaser").setInt(10, 0);
|
||
|
|
obj.getVar("Layofprimitive_chaser").setInt(11, 0);
|
||
|
|
local size = obj.getVar("kksChaser").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local chaserObj = obj.getVar("kksChaser").get_obj_vector(i);
|
||
|
|
if(!chaserObj) continue;
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(chaserObj);
|
||
|
|
local totalDamage = colObj.getVar("custom").getInt(10);
|
||
|
|
obj.getVar("Layofprimitive_chaser").setInt(10, obj.getVar("Layofprimitive_chaser").getInt(10) + 1);
|
||
|
|
obj.getVar("Layofprimitive_chaser").setInt(11, obj.getVar("Layofprimitive_chaser").getInt(11) + totalDamage);
|
||
|
|
colObj.setValid(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 3://end
|
||
|
|
obj.sq_SetCurrentAnimation(286);
|
||
|
|
obj.sq_PlaySound("PRECENCIA_LAYOFPRIMITIVE_3_SHOT");
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_LAYOFPRIMITIVE_2_1");
|
||
|
|
// sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/layofprimitive/layofprimitive_end_rune_06.ani", 175, 1, 75);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/layofprimitive/layofprimitive_end_rune_06.ani"), 175, -75);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_LAYOFPRIMITIVE, -1, 0, 1.0) + 100;
|
||
|
|
totalDamage = totalDamage + obj.getVar("Layofprimitive_chaser").getInt(11);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 65));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
case 4://dis
|
||
|
|
obj.sq_SetCurrentAnimation(285);
|
||
|
|
// sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/layofprimitive/layofprimitive_dissolution_front_03.ani", 0, 1, 0);
|
||
|
|
// sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/layofprimitive/layofprimitive_dissolution_back_08.ani", 0, -1, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/layofprimitive/layofprimitive_dissolution_back_08.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/layofprimitive/layofprimitive_dissolution_front_03.ani"), 0, 0);
|
||
|
|
obj.sq_PlaySound("PRECENCIA_CHANGE_END");
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
if(attackInfo){
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local speedRate = 4000 / currentAni.getDelaySum(0, 0);
|
||
|
|
switch(subState){
|
||
|
|
case 1: speedRate = 2900 / currentAni.getDelaySum(0, 0); break;
|
||
|
|
case 2: speedRate = 5500 / currentAni.getDelaySum(0, 0); break;
|
||
|
|
case 3: speedRate = 6000 / currentAni.getDelaySum(0, 0); break;
|
||
|
|
case 4: speedRate = 4300 / currentAni.getDelaySum(0, 0); break;
|
||
|
|
}
|
||
|
|
print("speedRate = "+speedRate);
|
||
|
|
if(speedRate > 200){
|
||
|
|
currentAni.setSpeedRate(200.0);
|
||
|
|
}
|
||
|
|
if(subState == 2){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
obj.sq_SetXScrollStart(300, currentAni.getDelaySum(false));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Layofprimitive(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_LAYOFPRIMITIVE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) != 2){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_LAYOFPRIMITIVE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
case 4:
|
||
|
|
obj.sq_SetXScrollStop(0);
|
||
|
|
local chaserNum = obj.getVar("Layofprimitive_chaser").getInt(10);
|
||
|
|
if(chaserNum > 0){
|
||
|
|
for(local i = 0; i < chaserNum; i++){
|
||
|
|
createBattlemageChaser(obj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Layofprimitive(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Layofprimitive(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1001:
|
||
|
|
sq_flashScreen(obj, 50, 100, 100, 255, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
break;
|
||
|
|
case 1002:
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/layofprimitive/layofprimitive_summon_attack_15.ani", 0, 1, 0);
|
||
|
|
break;
|
||
|
|
case 1003:
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/layofprimitive/layofprimitive_summon_attack_16.ani", 0, 1, 0);
|
||
|
|
break;
|
||
|
|
case 1004:
|
||
|
|
sq_SetMyShake(obj, 3, 100);
|
||
|
|
break;
|
||
|
|
case 1005:
|
||
|
|
sq_flashScreen(obj, 30, 60, 120, 204, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_flashScreen(obj, 30, 90, 30, 127, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 30, 200);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Layofprimitive(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Layofprimitive(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_PokeThrow(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_POKETHROW);
|
||
|
|
if (isUse){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
obj.getVar("dirBool").setBool(0, false);
|
||
|
|
obj.getVar("pokethrowTar").clear_obj_vector();
|
||
|
|
obj.getVar("pokethrowTar_fix").clear_obj_vector();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_POKETHROW, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_PokeThrow(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_PokeThrow(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Pokethrowtry", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(246);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_SetCurrentAnimation(6);
|
||
|
|
}
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_POKETHROW);
|
||
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_POKETHROW, 0, skillLevel);
|
||
|
|
local change = sq_GetLevelData(obj, SKILL_BYKK_POKETHROW, 5, skillLevel);
|
||
|
|
if(change > 0) totalDamage = (obj.sq_GetBonusRateWithPassive(174, -1, 0, 1.0) + 200) * change / 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 8));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
if(attackInfo){
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
}
|
||
|
|
local speed = 2.0;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1) speed = 0.3 + speed;
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) speed = 0.5 + speed;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Pokethrowsmash", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(245);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_SetCurrentAnimation(7);
|
||
|
|
}
|
||
|
|
if(obj.getVar("dirBool").getBool(0) == false) sq_SetCurrentDirection(obj, sq_GetOppositeDirection(sq_GetDirection(obj)));
|
||
|
|
local speed = 2.0;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1) speed = 0.3 + speed;
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) speed = 0.5 + speed;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
local pAni = obj.getCurrentAnimation();
|
||
|
|
local delay = pAni.getDelaySum(false) / 3;
|
||
|
|
obj.setTimeEvent(0, delay, 1, false);
|
||
|
|
obj.setTimeEvent(1, delay * 2, 1, false);
|
||
|
|
local size = obj.getVar("pokethrowTar").get_obj_vector_size();
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("pokethrowTar").get_obj_vector(i);
|
||
|
|
if(targetObj){
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, "character/mage/battlemage_bykk/ap/ap_pokethrow.nut");
|
||
|
|
if(!addAppendage) continue;
|
||
|
|
sq_MoveToAppendageForce(targetObj, obj, obj, 0, 0, 100, delay, true, addAppendage);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Pokethrowsmashfront", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(244);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_SetCurrentAnimation(272);
|
||
|
|
}
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_POKETHROW);
|
||
|
|
local speed = (1000 + sq_GetLevelData(obj, SKILL_BYKK_POKETHROW, 2, skillLevel)) / 1000.0;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1) speed = 0.3 + speed;
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) speed = 0.5 + speed;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
local pAni = obj.getCurrentAnimation();
|
||
|
|
local delay = pAni.getDelaySum(false) / 3 * 2;
|
||
|
|
obj.setTimeEvent(1, delay, 1, false);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_PokeThrow(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("pokethrowTar_fix").get_obj_vector_size() > 0){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_POKETHROW, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
else if(obj.getVar("pokethrowTar").get_obj_vector_size() > 0){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_POKETHROW, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_PokeThrow(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
if(subState == 0){
|
||
|
|
if(obj.getVar("dirBool").getBool(0) == false){
|
||
|
|
if((sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection()== ENUM_DIRECTION_LEFT) || (sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT)) obj.getVar("dirBool").setBool(0, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_PokeThrow(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_PokeThrow(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0:
|
||
|
|
local pAni = obj.getCurrentAnimation();
|
||
|
|
local delay = pAni.getDelaySum(false) / 3;
|
||
|
|
local size = obj.getVar("pokethrowTar").get_obj_vector_size();
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("pokethrowTar").get_obj_vector(i);
|
||
|
|
if(targetObj){
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, "character/mage/battlemage_bykk/ap/ap_pokethrow.nut");
|
||
|
|
if(!addAppendage) continue;
|
||
|
|
sq_MoveToAppendageForce(targetObj, obj, obj, 125, 0, 0, delay, true, addAppendage);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_POKETHROW);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_POKETHROW, -1, 1, 1.0) + 100;
|
||
|
|
local change = sq_GetLevelData(obj, SKILL_BYKK_POKETHROW, 5, skillLevel);
|
||
|
|
if(change > 0) totalDamage = (obj.sq_GetBonusRateWithPassive(174, -1, 0, 1.0) + 200) * change / 100;
|
||
|
|
local sizeRate = sq_GetLevelData(obj, SKILL_BYKK_POKETHROW, 3, skillLevel);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SPEARMASTERY) > 0 && obj.getWeaponSubType() == 0) sizeRate = sizeRate + sq_GetIntData(obj, SKILL_BYKK_SPEARMASTERY, 1);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,125,0,0,obj.getDirection(),SKILL_BYKK_POKETHROW,1,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_POKETHROW);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_POKETHROW, -1, 4, 1.0) + 100;
|
||
|
|
local change = sq_GetLevelData(obj, SKILL_BYKK_POKETHROW, 5, skillLevel);
|
||
|
|
if(change > 0) totalDamage = (obj.sq_GetBonusRateWithPassive(174, -1, 0, 1.0) + 200) * change / 100;
|
||
|
|
local sizeRate = sq_GetLevelData(obj, SKILL_BYKK_POKETHROW, 3, skillLevel);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SPEARMASTERY) > 0 && obj.getWeaponSubType() == 0) sizeRate = sizeRate + sq_GetIntData(obj, SKILL_BYKK_SPEARMASTERY, 1);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,125,0,0,obj.getDirection(),SKILL_BYKK_POKETHROW,1,totalDamage,sizeRate,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_PokeThrow(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != STATE_BYKK_POKETHROW){
|
||
|
|
local size = obj.getVar("pokethrowTar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("pokethrowTar").get_obj_vector(i);
|
||
|
|
if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/mage/battlemage_bykk/ap/ap_pokethrow.nut");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAttack_PokeThrow(obj, damager, boundingBox, isStuck)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
||
|
|
if(sq_IsHoldable(obj,damager) && !sq_IsFixture(damager) && sq_IsGrabable(obj,damager)){
|
||
|
|
if(!CNSquirrelAppendage.sq_IsAppendAppendage(damager, "character/mage/battlemage_bykk/ap/ap_pokethrow.nut")){
|
||
|
|
if(!obj.getVar("pokethrowTar").is_obj_vector(damager)) obj.getVar("pokethrowTar").push_obj_vector(damager);
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, "character/mage/battlemage_bykk/ap/ap_pokethrow.nut", true);
|
||
|
|
sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL, addAppendage);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(!obj.getVar("pokethrowTar_fix").is_obj_vector(damager)) obj.getVar("pokethrowTar_fix").push_obj_vector(damager);
|
||
|
|
}
|
||
|
|
|
||
|
|
if(sq_getGrowType(obj) != 3) break;
|
||
|
|
local createMax = sq_GetIntData(obj, SKILL_BYKK_CHASER, 0);
|
||
|
|
if(obj.getVar("kksChaser").get_obj_vector_size() < createMax) createBattlemageChaser(obj);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_Precencia(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut") || CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_PRECENCIA);
|
||
|
|
if (isUse){
|
||
|
|
local subState = 0;
|
||
|
|
local skill = sq_GetSkill(obj, SKILL_BYKK_PRECENCIA);
|
||
|
|
if(!skill.isSealFunction()) subState = 2;
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_PRECENCIA, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
obj.startSkillCoolTime(SKILL_BYKK_PRECENCIA, sq_GetSkillLevel(obj, SKILL_BYKK_PRECENCIA), -1);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Precencia(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Precencia(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0://二覺化身
|
||
|
|
obj.sq_SetCurrentAnimation(93);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut")){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut");
|
||
|
|
}
|
||
|
|
changeBattlemageChaser(obj, 2);
|
||
|
|
break;
|
||
|
|
case 2://三覺化身
|
||
|
|
obj.sq_SetCurrentAnimation(210);
|
||
|
|
obj.sq_PlaySound("PRECENCIA_CHANGE_SHORT");
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_CHANGE");
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut")){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_chaserevolution.nut");
|
||
|
|
}
|
||
|
|
changeBattlemageChaser(obj, 3);
|
||
|
|
obj.setObjectHeight(10);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatar/precencia/realease/avatar_release_back_08.ani", 0, -1, 0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatar/precencia/realease/avatar_release_front_03.ani", 0, 1, 0);
|
||
|
|
break;
|
||
|
|
case 1://解除化身
|
||
|
|
local sub = obj.sq_GetVectorData(datas, 1);
|
||
|
|
switch(sub){
|
||
|
|
case 0://二覺
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "avatarend_body", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/mage/effect/animation/avatar/avatarend_eff_00.ani", 0, 1, 0);
|
||
|
|
sq_flashScreen(obj,700,100,300,255, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_COVER);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut");
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1://三覺主動解除
|
||
|
|
obj.sq_SetCurrentAnimation(209);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatar/precencia/realease/avatar_finish_return_back_08.ani", 0, 1, 0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatar/precencia/realease/avatar_finish_return_front_03.ani", 0, 1, 0);
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut");
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
changeBattlemageChaser(obj, 0);
|
||
|
|
break;
|
||
|
|
case 10:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
obj.sq_SetCurrentAnimation(206);
|
||
|
|
// for(local i = 0; i < 20000; i++){
|
||
|
|
// obj.stopSound(i);
|
||
|
|
// }
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_ATK_1");
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "battlemageattack1", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_SetCurrentAnimation(9);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
obj.getVar("attackBool").setBool(10, false);
|
||
|
|
obj.getVar("attackBool").setBool(12, false);
|
||
|
|
break;
|
||
|
|
case 11:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
obj.sq_SetCurrentAnimation(207);
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_ATK_2");
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "battlemageattack2", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_SetCurrentAnimation(10);
|
||
|
|
}
|
||
|
|
obj.sq_PlaySound("R_WZ_ATK");
|
||
|
|
}
|
||
|
|
obj.getVar("attackBool").setBool(10, false);
|
||
|
|
obj.getVar("attackBool").setBool(13, false);
|
||
|
|
break;
|
||
|
|
case 12:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
obj.sq_SetCurrentAnimation(208);
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_ATK_3");
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "battlemageattack3", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_SetCurrentAnimation(11);
|
||
|
|
}
|
||
|
|
obj.sq_PlaySound("R_WZ_ATK");
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 20:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
obj.sq_SetCurrentAnimation(218);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "Buff", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local Ani = obj.sq_GetThrowChargeAni(3);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local castTime = currentAni.getDelaySum(false);
|
||
|
|
sq_StartDrawCastGauge(obj, castTime, true);
|
||
|
|
break;
|
||
|
|
case 21:
|
||
|
|
local Ani = obj.sq_GetThrowShootAni(3);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if(subState >= 10 && subState <= 12){
|
||
|
|
local speed = 1.3;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) speed = 2.5;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
local atkIndex = [53,54,55];
|
||
|
|
local totalDamage = sq_GetLevelData(obj, 174, 0, sq_GetSkillLevel(obj, 174)) + 100;
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_ENABLEFINISHATTACK) > 0) totalDamage = totalDamage * (1000 + sq_GetLevelData(obj, SKILL_BYKK_ENABLEFINISHATTACK, 2, sq_GetSkillLevel(obj, SKILL_BYKK_ENABLEFINISHATTACK))) / 1000;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, atkIndex[subState - 10]));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
if(attackInfo){
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function onEndCurrentAni_Precencia(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
//if(!obj.sq_IsMyControlObject()) return;
|
||
|
|
local substate = obj.getSkillSubState();
|
||
|
|
switch(substate){
|
||
|
|
case 0:
|
||
|
|
obj.sq_PlaySound("AVATAR_AURA_LOOP", 2333);
|
||
|
|
local apdPath = "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut";
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_PRECENCIA, false, apdPath, true);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_PRECENCIA);
|
||
|
|
local buffTime = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 0, skillLevel);
|
||
|
|
addAppendage.sq_SetValidTime(buffTime);
|
||
|
|
addAppendage.setEnableIsBuff(true);
|
||
|
|
addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_PRECENCIA, skillLevel);
|
||
|
|
CNSquirrelAppendage.sq_Append(addAppendage, obj, obj, true);
|
||
|
|
local hpMax = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 1, skillLevel);
|
||
|
|
local allDefense = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 2, skillLevel);
|
||
|
|
local attackspeedRate = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 3, skillLevel);
|
||
|
|
local movespeedRate = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 4, skillLevel);
|
||
|
|
local allactTolerance = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 5, skillLevel);
|
||
|
|
local change_appendage = addAppendage.sq_getChangeStatus("precencia");
|
||
|
|
if(!change_appendage) change_appendage = addAppendage.sq_AddChangeStatus("precencia",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000);
|
||
|
|
if(change_appendage){
|
||
|
|
change_appendage.clearParameter();
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_HP_MAX, false, (hpMax).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_DEFENSE, false, (allDefense).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_DEFENSE, false, (allDefense).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_ATTACK_SPEED, false, (attackspeedRate).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_MOVE_SPEED, false, (movespeedRate).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_ACTIVESTATUS_TOLERANCE_ALL, false, (allactTolerance).tofloat());
|
||
|
|
}
|
||
|
|
obj.sq_SetSuperArmorUntilTime(obj, buffTime);
|
||
|
|
if(sq_GetIntData(obj, SKILL_BYKK_PRECENCIA, 15) > 0) addAppendage.getVar("setFail").setBool(0, true);
|
||
|
|
|
||
|
|
local spectrumAppendage = addAppendage.sq_GetOcularSpectrum("ocularSpectrum");//得到殘影
|
||
|
|
if(!spectrumAppendage) spectrumAppendage = addAppendage.sq_AddOcularSpectrum("ocularSpectrum", obj, obj, 100);//設置殘影
|
||
|
|
sq_SetParameterOcularSpectrum(spectrumAppendage, 300, 75, true, sq_RGBA(255, 244, 77, 75), sq_RGBA(255, 244, 77, 0), 2, 2, 2);//設置效果
|
||
|
|
|
||
|
|
local goddAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, "character/mage/battlemage_bykk/ap/ap_goddnessofwar.nut");
|
||
|
|
if(goddAppendage) goddAppendage.getVar().setBool(100, true);
|
||
|
|
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_PlaySound("AVATAR_AURA_LOOP", 2333);
|
||
|
|
local apdPath = "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut";
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_PRECENCIA, false, apdPath, true);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_PRECENCIA);
|
||
|
|
local buffTime = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 0, skillLevel);
|
||
|
|
addAppendage.sq_SetValidTime(buffTime);
|
||
|
|
addAppendage.setEnableIsBuff(true);
|
||
|
|
addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_BYKK_PRECENCIA, skillLevel);
|
||
|
|
CNSquirrelAppendage.sq_Append(addAppendage, obj, obj, true);
|
||
|
|
local hpMax = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 1, skillLevel);
|
||
|
|
local allDefense = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 2, skillLevel);
|
||
|
|
local attackspeedRate = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 3, skillLevel);
|
||
|
|
local movespeedRate = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 4, skillLevel);
|
||
|
|
local allactTolerance = sq_GetLevelData(obj, SKILL_BYKK_PRECENCIA, 5, skillLevel);
|
||
|
|
local change_appendage = addAppendage.sq_getChangeStatus("precencia");
|
||
|
|
if(!change_appendage) change_appendage = addAppendage.sq_AddChangeStatus("precencia",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000);
|
||
|
|
if(change_appendage){
|
||
|
|
change_appendage.clearParameter();
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_HP_MAX, false, (hpMax).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_DEFENSE, false, (allDefense).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_DEFENSE, false, (allDefense).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_ATTACK_SPEED, false, (attackspeedRate).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_MOVE_SPEED, false, (movespeedRate).tofloat());
|
||
|
|
change_appendage.addParameter(CHANGE_STATUS_TYPE_ACTIVESTATUS_TOLERANCE_ALL, false, (allactTolerance).tofloat());
|
||
|
|
}
|
||
|
|
obj.sq_SetSuperArmorUntilTime(obj, buffTime);
|
||
|
|
if(sq_GetIntData(obj, SKILL_BYKK_PRECENCIA, 15) > 0) addAppendage.getVar("setFail").setBool(0, true);
|
||
|
|
|
||
|
|
local spectrumAppendage = addAppendage.sq_GetOcularSpectrum("ocularSpectrum");//得到殘影
|
||
|
|
if(!spectrumAppendage) spectrumAppendage = addAppendage.sq_AddOcularSpectrum("ocularSpectrum", obj, obj, 100);//設置殘影
|
||
|
|
sq_SetParameterOcularSpectrum(spectrumAppendage, 300, 75, true, sq_RGBA(255, 244, 77, 75), sq_RGBA(255, 244, 77, 0), 2, 2, 2);//設置效果
|
||
|
|
|
||
|
|
local goddAppendage = CNSquirrelAppendage.sq_GetAppendage(obj, "character/mage/battlemage_bykk/ap/ap_goddnessofwar.nut");
|
||
|
|
if(goddAppendage) goddAppendage.getVar().setBool(100, true);
|
||
|
|
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut");
|
||
|
|
}
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut");
|
||
|
|
}
|
||
|
|
case 10:
|
||
|
|
case 11:
|
||
|
|
case 12:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
||
|
|
break;
|
||
|
|
case 20:
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut") || CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
local apdPath = "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut";
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_PRECENCIA, false, apdPath, true);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, 2);
|
||
|
|
local buffTime = sq_GetLevelData(obj, 2, 0, 2);
|
||
|
|
addAppendage.sq_SetValidTime(buffTime);
|
||
|
|
addAppendage.setEnableIsBuff(true);
|
||
|
|
addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), 2, skillLevel);
|
||
|
|
CNSquirrelAppendage.sq_Append(addAppendage, obj, obj, true);
|
||
|
|
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(21);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_PRECENCIA, STATE_PRIORITY_USER, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 21:
|
||
|
|
local apdPath = "character/mage/elementalmaster_bykk/ap/ap_magicaltempoup.nut";
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_BYKK_PRECENCIA, false, apdPath, true);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, 2);
|
||
|
|
local buffTime = sq_GetLevelData(obj, 2, 0, 2);
|
||
|
|
addAppendage.sq_SetValidTime(buffTime);
|
||
|
|
addAppendage.setEnableIsBuff(true);
|
||
|
|
addAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), 2, skillLevel);
|
||
|
|
CNSquirrelAppendage.sq_Append(addAppendage, obj, obj, true);
|
||
|
|
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Precencia(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 10:
|
||
|
|
case 11:
|
||
|
|
if(obj.getVar("attackBool").getBool(subState) == false){
|
||
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
||
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)) obj.getVar("attackBool").setBool(subState, true);
|
||
|
|
}
|
||
|
|
if(obj.getVar("attackBool").getBool(subState)){
|
||
|
|
local pAni = obj.getCurrentAnimation();
|
||
|
|
local delaySum = pAni.getDelaySum(false);
|
||
|
|
local currentT = sq_GetCurrentTime(pAni);
|
||
|
|
if(currentT >= delaySum * 90 / 100){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_PRECENCIA, STATE_PRIORITY_USER, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
case 12:
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL) && sq_IsKeyDown(OPTION_HOTKEY_JUMP, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(200);
|
||
|
|
obj.sq_AddSetStatePacket(6, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local speedRate = [0,300,30];
|
||
|
|
if((obj.getVar("attackBool").getBool(12) && subState >= 10) || (obj.getVar("attackBool").getBool(13) && subState >= 11)) break;
|
||
|
|
if((sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT) || (sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT)){
|
||
|
|
if(obj.getVar("attackBool").getBool(12) == false) obj.getVar("attackBool").setBool(12, true);
|
||
|
|
if(obj.getVar("attackBool").getBool(13) == false) obj.getVar("attackBool").setBool(13, true);
|
||
|
|
}
|
||
|
|
else if((sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_RIGHT) || (sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL) && obj.getDirection() == ENUM_DIRECTION_LEFT)) speedRate = [0, 500, 80];
|
||
|
|
if(obj.getDirection() == ENUM_DIRECTION_RIGHT && speedRate[subState - 10] > 0) sq_SetVelocity(obj, 0, speedRate[subState - 10].tofloat());
|
||
|
|
else if(obj.getDirection() == ENUM_DIRECTION_LEFT && speedRate[subState - 10] > 0) sq_SetVelocity(obj, 0, -speedRate[subState - 10].tofloat());
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Precencia(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
sq_flashScreen(obj, 100, 0, 50, 178, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
||
|
|
sq_SetMyShake(obj, 5, 100);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
switch(flagIndex){
|
||
|
|
case 111: obj.sq_PlaySound("PRCENCIA_AVATAR_CAST"); break;
|
||
|
|
case 201: obj.sq_PlaySound("AVATAR_FINISH_CAST"); break;
|
||
|
|
case 202: sq_flashScreen(obj, 0, 80, 80, 255, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break;
|
||
|
|
case 203:
|
||
|
|
obj.sq_PlaySound("WZ_AVATAR_FINISH");
|
||
|
|
obj.sq_PlaySound("AVATAR_FINISH");
|
||
|
|
sq_flashScreen(obj, 80, 0, 166, 255, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_COVER);
|
||
|
|
sq_SetMyShake(obj, 5, 240);
|
||
|
|
break;
|
||
|
|
case 301: sq_flashScreen(obj, 0, 80, 80, 255, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); obj.sq_PlaySound("AVATAR_FINISH_CAST"); break;
|
||
|
|
case 302: sq_flashScreen(obj, 60, 60, 420, 204, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_COVER); sq_SetMyShake(obj, 8, 160); obj.sq_PlaySound("AVATAR_FINISH"); break;
|
||
|
|
case 303: obj.sq_PlaySound("AVATAR_FINISH"); break;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
switch(flagIndex){
|
||
|
|
case 101: sq_flashScreen(obj, 150, 0, 0, 76, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 10: obj.sq_PlaySound("R_PRECENCIA_WEAPONSWING"); break;
|
||
|
|
case 11: obj.sq_PlaySound("PRECENCIA_WEAPONSWING"); break;
|
||
|
|
case 12: obj.sq_PlaySound("PRECENCIA_WEAPONSWING"); break;
|
||
|
|
}
|
||
|
|
return true;//
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Precencia(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0:
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/avatar/precencia/avatar_inishxx1_26.ani", 0, 1, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Precencia(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != SKILL_BYKK_PRECENCIA){
|
||
|
|
sq_EndDrawCastGauge(obj);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAttack_Precencia(obj, damager, boundingBox, isStuck)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(isStuck) return;
|
||
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
||
|
|
if(obj.getSkillSubState() != 12) return;
|
||
|
|
local createMax = sq_GetIntData(obj, SKILL_BYKK_CHASER, 0);
|
||
|
|
if(obj.getVar("kksChaser").get_obj_vector_size() < createMax) createBattlemageChaser(obj);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_Quasarexplosion(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_QUASAREXPLOSION);
|
||
|
|
if (isUse){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_QUASAREXPLOSION, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Quasarexplosion(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Quasarexplosion(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
obj.sq_ZStop();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 0){
|
||
|
|
obj.sq_SetCurrentAnimation(290);
|
||
|
|
obj.sq_PlaySound("WZ_QUASAR_EXPLOSION_READY");
|
||
|
|
}
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) obj.sq_SetCurrentAnimation(292);
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "QuasarExplosionPrecencia_Start_Normal", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
obj.sq_PlaySound("PRECENCIA_QUASAR_1_CAST");
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.sq_SetCurrentAnimation(294);
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
local speedRate = 6000 / delay;
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_QUASAREXPLOSION, -1, 0, 1.0) + 100;
|
||
|
|
if(obj.getWeaponSubType() == 1 && sq_GetSkillLevel(obj, SKILL_BYKK_POLEMASTERY) > 0) totalDamage = totalDamage * (1000 + sq_GetIntData(obj, SKILL_BYKK_POLEMASTERY, 4)) / 1000;
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,0,0,obj.getDirection(),SKILL_BYKK_QUASAREXPLOSION,1,totalDamage,speedRate,0,0,0,0,0,0);
|
||
|
|
obj.sq_PlaySound("WZ_PRECENCIA_QUASAR_1_01");
|
||
|
|
obj.setTimeEvent(0, 500 / speedRate, 1, false);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 0){
|
||
|
|
obj.sq_SetCurrentAnimation(291);
|
||
|
|
}
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(293);
|
||
|
|
}
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "QuasarExplosionPrecencia_Normal_End", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
||
|
|
if(obj.getVar("skillSub").getInt(100) < 2){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(0, 0);
|
||
|
|
local speedRate = 6100 / delay;
|
||
|
|
local aniPath = ["character/mage/effect/animation/battlemage_bykk/quasarexplosion/precencia/quasarexplosion_normal_end_00.ani","character/mage/effect/animation/battlemage_bykk/quasarexplosion/precencia/quasarexplosion_normal_end_01.ani","character/mage/effect/animation/battlemage_bykk/quasarexplosion/precencia/quasarexplosion_normal_end_02.ani","character/mage/effect/animation/battlemage_bykk/quasarexplosion/precencia/quasarexplosion_normal_end_03.ani"];
|
||
|
|
for(local i = 0; i < aniPath.len(); i++){
|
||
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, aniPath[i], 0, 1, 0);
|
||
|
|
local pAni = pooledObj.getCurrentAnimation();
|
||
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Quasarexplosion(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_QUASAREXPLOSION, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Quasarexplosion(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Quasarexplosion(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 101: sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/quasarexplosion/precencia/quasarexplosion_start_normal_02.ani", 0, 1, 0); break;
|
||
|
|
case 102: sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/quasarexplosion/precencia/quasarexplosion_start_normal_03.ani", 0, 1, 0); break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Quasarexplosion(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0:
|
||
|
|
switch(obj.getVar("skillSub").getInt(100)){
|
||
|
|
case 0: obj.sq_PlaySound("WZ_QUASAR_EXPLOSION_FIN"); break;
|
||
|
|
case 2: obj.sq_PlaySound("WZ_PRECENCIA_QUASAR_2_01"); break;
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Quasarexplosion(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_RandomPierceStrike(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_RANDOMPIERCESTRIKE);
|
||
|
|
if (isUse){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_RANDOMPIERCESTRIKE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_RandomPierceStrike(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_RandomPierceStrike(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(249);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "RandomPierceStrikeTry", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_SetCurrentAnimation(12);
|
||
|
|
}
|
||
|
|
obj.sq_PlaySound("WZ_THUNDER_01", 2333);
|
||
|
|
}
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKE);
|
||
|
|
local hitMax = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKE, 6, skillLevel);
|
||
|
|
obj.getVar("rdps").setInt(10, hitMax);
|
||
|
|
obj.getVar("rdps").setInt(11, 0);
|
||
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKE, 0, skillLevel);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 12));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(248);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKE);
|
||
|
|
local hitTime = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKE, 9, skillLevel);
|
||
|
|
obj.setTimeEvent(0, hitTime, -1, false);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "RandomPierceStrikeLoop", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_SetCurrentAnimation(13);
|
||
|
|
}
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/randompiercestrike/hit.ani"), 200, -40);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.removeAllTimeEvent();
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(247);
|
||
|
|
obj.sq_PlaySound("PRECENCIA_PIERCESTRIKE_2_FINISH");
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_PIERCESTRIKE_2");
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "RandomPierceStrikeFinish", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_SetCurrentAnimation(14);
|
||
|
|
}
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/randompiercestrike/swing.ani"), 0, 0);
|
||
|
|
obj.stopSound(2333);
|
||
|
|
obj.sq_PlaySound("WZ_THUNDER_02");
|
||
|
|
obj.setTimeEvent(1, 100, 1, false);
|
||
|
|
}
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKE);
|
||
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKE, 2, skillLevel);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 13));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
if(attackInfo){
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
local speed = 1.35;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1) speed = 0.3 + speed;
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) speed = 0.5 + speed;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_RandomPierceStrike(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_RANDOMPIERCESTRIKE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.resetHitObjectList();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(obj.getVar("rdps").getInt(11) >= obj.getVar("rdps").getInt(10) - 1 || sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKE, 11, sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKE)) > 0) obj.sq_IntVectPush(2);
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.getVar("rdps").setInt(11, obj.getVar("rdps").getInt(11) + 1);
|
||
|
|
}
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_RANDOMPIERCESTRIKE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_RandomPierceStrike(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
// sq_SetKeyxEnable(obj, E_SKILL_COMMAND, true);
|
||
|
|
// sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_SKILL, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_RANDOMPIERCESTRIKE, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_JUMP, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.stopSound(2333);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_RandomPierceStrike(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1001:
|
||
|
|
sq_SetMyShake(obj, 8, 80);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_RandomPierceStrike(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0:
|
||
|
|
if(timeEventCount >= obj.getVar("rdps").getInt(10) - 1){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_RANDOMPIERCESTRIKE, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
else obj.resetHitObjectList();
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/randompiercestrike/dust.ani", 0, 0, 0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_RandomPierceStrike(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_RandomPierceStrikeEx(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_RANDOMPIERCESTRIKEEX);
|
||
|
|
if (isUse){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
if(RANDOMPIERCESTRIKEEX_STONE > 0 || sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 8, sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX)) > 0) obj.getVar("RandomPierceStrikeEx_tar").clear_obj_vector();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2) obj.sq_IntVectPush(10);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RANDOMPIERCESTRIKEEX, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_RandomPierceStrikeEx(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_RandomPierceStrikeEx(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "RandomPierceStrikeTry", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(12);
|
||
|
|
obj.sq_PlaySound("WZ_THUNDER_01", 2333);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX);
|
||
|
|
local hitMax = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 7, skillLevel);
|
||
|
|
obj.getVar("rdpsex").setInt(10, hitMax);
|
||
|
|
obj.getVar("rdpsex").setInt(11, 0);
|
||
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 3, skillLevel);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 29));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "RandomPierceStrikeLoopEx", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(56);
|
||
|
|
obj.setTimeEvent(2, 100, -1, false);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
if(obj.isExistTimeEvent(2)) obj.stopTimeEvent(2);
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "RandomPierceStrikeChargeEx", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(57);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/charge_dodge.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/charge_light_dodge.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
if(obj.isExistTimeEvent(2)) obj.stopTimeEvent(2);
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "RandomPierceStrikeFinishEx", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(58);
|
||
|
|
obj.removeAllTimeEvent();
|
||
|
|
obj.stopSound(2333);
|
||
|
|
obj.sq_PlaySound("WZ_THUNDER_02");
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX);
|
||
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 5, skillLevel);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 30));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/bluelight_dodge1.ani"), 180, -40);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/bluelight_dodge2.ani"), 180, -40);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/end_dodge.ani"), 180, -40);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/glow_dodge.ani"), 180, -40);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/redlight_dodge.ani"), 180, -40);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/shadow_dodge.ani"), 180, -40);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/shadow_normal.ani"), 180, -40);
|
||
|
|
break;
|
||
|
|
case 10:
|
||
|
|
obj.sq_SetCurrentAnimation(251);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX);
|
||
|
|
local hitMax = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 7, skillLevel);
|
||
|
|
obj.getVar("rdpsex").setInt(10, hitMax);
|
||
|
|
obj.getVar("rdpsex").setInt(11, 0);
|
||
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 3, skillLevel);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 29));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
local hitTime = sq_GetIntData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 8);
|
||
|
|
obj.setTimeEvent(1, hitTime, -1, false);
|
||
|
|
break;
|
||
|
|
case 11:
|
||
|
|
obj.sq_SetCurrentAnimation(252);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/precencia/sinrairenloop_10.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 12:
|
||
|
|
obj.sq_SetCurrentAnimation(253);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/precencia/sinrairenloop_10.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 13:
|
||
|
|
obj.sq_SetCurrentAnimation(254);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/randompiercestrikeex/precencia/sinrairenloop_10.ani"), 0, 0);
|
||
|
|
break;
|
||
|
|
case 14:
|
||
|
|
obj.removeAllTimeEvent();
|
||
|
|
obj.sq_SetCurrentAnimation(250);
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX);
|
||
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 5, skillLevel);
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 30));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
if(attackInfo){
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
}
|
||
|
|
|
||
|
|
local speed = 1.35;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1) speed = 0.3 + speed;
|
||
|
|
else if(obj.getVar("skillSub").getInt(100) == 2) speed = 0.5 + speed;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speed, speed);
|
||
|
|
if(subState == 1){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
obj.setTimeEvent(1, currentAni.getDelaySum(false), -1, false);
|
||
|
|
local speedRate = 4000.0 / currentAni.getDelaySum(0, 0);
|
||
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/randompiercestrikeex/pierce_dodge.ani", 200, 1, 40);
|
||
|
|
local pAni = pooledObj.getCurrentAnimation();
|
||
|
|
pAni.setSpeedRate(speedRate);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_RandomPierceStrikeEx(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RANDOMPIERCESTRIKEEX, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
obj.resetHitObjectList();
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(obj.getVar("rdpsex").getInt(11) >= obj.getVar("rdpsex").getInt(10) - 1 || sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 14, sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX)) > 0) obj.sq_IntVectPush(2);
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.getVar("rdpsex").setInt(11, obj.getVar("rdpsex").getInt(11) + 1);
|
||
|
|
}
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RANDOMPIERCESTRIKEEX, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(3);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RANDOMPIERCESTRIKEEX, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 3:
|
||
|
|
case 14:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 10:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(11);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RANDOMPIERCESTRIKEEX, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 11:
|
||
|
|
case 12:
|
||
|
|
case 13:
|
||
|
|
local pushstate = subState + 1;
|
||
|
|
if(subState == 13) pushstate = 11;
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(pushstate);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RANDOMPIERCESTRIKEEX, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_RandomPierceStrikeEx(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 1:
|
||
|
|
case 10:
|
||
|
|
case 11:
|
||
|
|
case 12:
|
||
|
|
case 13:
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_SKILL, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(subState < 10) obj.sq_IntVectPush(2);
|
||
|
|
else obj.sq_IntVectPush(14);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RANDOMPIERCESTRIKEEX, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_JUMP, ENUM_SUBKEY_TYPE_ALL)){
|
||
|
|
obj.stopSound(2333);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_RandomPierceStrikeEx(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1001:
|
||
|
|
print("test");
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/randompiercestrikeex/precencia/randompiercestrikeex_finish_02.ani", 0, 1, 0);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/randompiercestrikeex/precencia/randompiercestrikeex_finish_01.ani", 0, 1, 0);
|
||
|
|
sq_SetMyShake(obj, 20, 150);
|
||
|
|
break;
|
||
|
|
case 1002:
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_PIERCESTRIKE_EX_2");
|
||
|
|
obj.sq_PlaySound("PRECENCIA_PIERCESTRIKE_EX_2_FINISH");
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_RandomPierceStrikeEx(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0:
|
||
|
|
if(timeEventCount >= obj.getVar("rdpsex").getInt(10) - 1){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(2);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RANDOMPIERCESTRIKEEX, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
else obj.resetHitObjectList();
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(timeEventCount >= obj.getVar("rdpsex").getInt(10) - 1){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(14);
|
||
|
|
obj.sq_AddSetStatePacket(STATE_BYKK_RANDOMPIERCESTRIKEEX, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
else obj.resetHitObjectList();
|
||
|
|
break;
|
||
|
|
case 2: obj.sq_PlaySound("R_P_THUNDER_ATK"); break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_RandomPierceStrikeEx(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != STATE_BYKK_RANDOMPIERCESTRIKEEX){
|
||
|
|
|
||
|
|
local size = obj.getVar("RandomPierceStrikeEx_tar").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
local skillLevel = sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX);
|
||
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 5, skillLevel) * 19 / 100;
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local targetObj = obj.getVar("RandomPierceStrikeEx_tar").get_obj_vector(i);
|
||
|
|
if(targetObj){
|
||
|
|
local group = sq_GetGroup(targetObj);
|
||
|
|
local uniqueId = sq_GetUniqueId(targetObj);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,targetObj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,0,0,obj.getDirection(),SKILL_BYKK_RANDOMPIERCESTRIKEEX,1,totalDamage,group,uniqueId,0,0,0,0,0);
|
||
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, "character/mage/battlemage_bykk/ap/ap_randompiercestrikeex.nut");
|
||
|
|
addAppendage.sq_SetValidTime(1000);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAttack_RandomPierceStrikeEx(obj, damager, boundingBox, isStuck)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
||
|
|
if(RANDOMPIERCESTRIKEEX_STONE < 1 && sq_GetLevelData(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX, 8, sq_GetSkillLevel(obj, SKILL_BYKK_RANDOMPIERCESTRIKEEX)) < 1) return;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(damager, "character/mage/battlemage_bykk/ap/ap_randompiercestrikeex.nut")) return;
|
||
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, "character/mage/battlemage_bykk/ap/ap_randompiercestrikeex.nut", true);
|
||
|
|
sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage);
|
||
|
|
if(!obj.getVar("RandomPierceStrikeEx_tar").is_obj_vector(damager)) obj.getVar("RandomPierceStrikeEx_tar").push_obj_vector(damager);
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkExecutableSkill_Returntobm(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut");
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_PRECENCIA, STATE_PRIORITY_USER, true);
|
||
|
|
}
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")){
|
||
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut");
|
||
|
|
// obj.sq_SendCreatePassiveObjectPacket(1008605, 0, 0, 1, 200);
|
||
|
|
obj.setObjectHeight(-1);
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_IntVectPush(1);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_PRECENCIA, STATE_PRIORITY_USER, true);
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_Returntobm(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_Returntobm(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_Returntobm(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_Returntobm(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_Returntobm(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_Returntobm(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_Returntobm(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
function checkExecutableSkill_StrengthHandStrike(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
if(obj.getState() == SKILL_BYKK_PRECENCIA && obj.getSkillSubState() < 10) return false;
|
||
|
|
local isUse = obj.sq_IsUseSkill(SKILL_BYKK_STRENGTHHANDSTRIKE);
|
||
|
|
if (isUse){
|
||
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealon.nut")) obj.getVar("skillSub").setInt(100, 2);
|
||
|
|
else if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/mage/battlemage_bykk/ap/ap_precencia_sealoff.nut")) obj.getVar("skillSub").setInt(100, 1);
|
||
|
|
else obj.getVar("skillSub").setInt(100, 0);
|
||
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_BYKK_STRENGTHHANDSTRIKE);
|
||
|
|
obj.getVar("shsBool").setBool(0, true);
|
||
|
|
if(STRENGTHHANDSTRIKE_STONE > 0 || sq_GetLevelData(obj, SKILL_BYKK_STRENGTHHANDSTRIKE, 12, sq_GetSkillLevel(obj, SKILL_BYKK_STRENGTHHANDSTRIKE)) > 0){
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(21);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_STRENGTHHANDSTRIKE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2) obj.sq_IntVectPush(10);
|
||
|
|
else obj.sq_IntVectPush(0);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_STRENGTHHANDSTRIKE, STATE_PRIORITY_IGNORE_FORCE, true);
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
function checkCommandEnable_StrengthHandStrike(obj)
|
||
|
|
{
|
||
|
|
if (!obj) return false;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onSetState_StrengthHandStrike(obj, state, datas, isResetTimer)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
||
|
|
obj.setSkillSubState(subState);
|
||
|
|
obj.sq_StopMove();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "StrengthHandStrike", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(15);
|
||
|
|
obj.sq_PlaySound("WZ_RAIDP_01", 2332);
|
||
|
|
obj.sq_PlaySound("RAIDP_CHARGE_LOOP", 2333);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,1,0,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,1,0,0,0,0,0,0,0,0);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,-1,0,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,2,0,0,0,0,0,0,0,0);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_STRENGTHHANDSTRIKE, -1, 1, 1.0) + 100;
|
||
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 14));
|
||
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
if(attackInfo){
|
||
|
|
attackInfo.setAttackType(ATTACKTYPE_PHYSICAL);
|
||
|
|
sq_SetAddWeaponDamage(attackInfo, true);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "StrengthHandStrikeReturn", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(16);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(false);
|
||
|
|
obj.setTimeEvent(2, delay / 21, 6, true);
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/strengthhandstrike/end_body_fade.ani", 0, 0, 0);
|
||
|
|
break;
|
||
|
|
case 10:
|
||
|
|
obj.sq_SetCurrentAnimation(261);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,1,0,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,11,0,0,0,0,0,0,0,0);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,-1,0,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,12,0,0,0,0,0,0,0,0);
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_STRENGTHHANDSTRIKE_1", 2332);
|
||
|
|
obj.sq_PlaySound("RAIDP_CHARGE_LOOP", 2333);
|
||
|
|
break;
|
||
|
|
case 11:
|
||
|
|
obj.sq_SetCurrentAnimation(258);
|
||
|
|
break;
|
||
|
|
case 12:
|
||
|
|
obj.sq_SetCurrentAnimation(259);
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(false);
|
||
|
|
obj.setTimeEvent(2, delay / 21, 6, true);
|
||
|
|
break;
|
||
|
|
case 21:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(262);
|
||
|
|
obj.sq_PlaySound("R_WZ_PRECENCIA_STRENGTHHANDSTRIKE_1", 2332);
|
||
|
|
obj.sq_PlaySound("RAIDP_CHARGE_LOOP", 2333);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "StrengthHandStrikeShootCharge", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(277);
|
||
|
|
obj.sq_PlaySound("WZ_RAIDP_01", 2332);
|
||
|
|
obj.sq_PlaySound("RAIDP_CHARGE_LOOP", 2333);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,1,0,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,1,0,0,0,0,0,0,0,0);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,-1,0,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,2,0,0,0,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 22:
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 2){
|
||
|
|
obj.sq_SetCurrentAnimation(260);
|
||
|
|
obj.stopSound(2332);
|
||
|
|
obj.stopSound(2333);
|
||
|
|
obj.sq_PlaySound("WZ_PRECENCIA_STRENGTHHANDSTRIKE_2");
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1){
|
||
|
|
local Ani = getCurrentAnimation_precencia(obj, "StrengthHandStrikeShoot", false, false);
|
||
|
|
obj.setCurrentAnimation(Ani);
|
||
|
|
}
|
||
|
|
else obj.sq_SetCurrentAnimation(276);
|
||
|
|
obj.stopSound(2332);
|
||
|
|
obj.stopSound(2333);
|
||
|
|
obj.sq_PlaySound("WZ_RAIDP_02");
|
||
|
|
local size = obj.getVar("kksshs").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local shsObj = obj.getVar("kksshs").get_obj_vector(i);
|
||
|
|
if(shsObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(shsObj);
|
||
|
|
colObj.setValid(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
if(subState < 10){
|
||
|
|
local speedRate = 1.0;
|
||
|
|
if(obj.getVar("skillSub").getInt(100) == 1) speedRate = 1.3;
|
||
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speedRate, speedRate);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndCurrentAni_StrengthHandStrike(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 10:
|
||
|
|
case 11:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_STRENGTHHANDSTRIKE, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
case 12:
|
||
|
|
case 22:
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onProcCon_StrengthHandStrike(obj)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
local subState = obj.getSkillSubState();
|
||
|
|
switch(subState){
|
||
|
|
case 0:
|
||
|
|
case 10:
|
||
|
|
case 21:
|
||
|
|
local bDownKey = obj.isDownSkillLastKey();
|
||
|
|
if(!bDownKey){
|
||
|
|
if(subState == 0 || subState == 10){
|
||
|
|
local frameIndex = sq_GetCurrentFrameIndex(obj);
|
||
|
|
if((frameIndex == 7 && subState == 0) || (frameIndex == 2 && subState == 10)){
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local setFrame = 8;
|
||
|
|
if(subState == 10) setFrame = 3;
|
||
|
|
currentAni.setCurrentFrameWithChildLayer(setFrame);
|
||
|
|
local size = obj.getVar("kksshs").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local shsObj = obj.getVar("kksshs").get_obj_vector(i);
|
||
|
|
if(shsObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(shsObj);
|
||
|
|
colObj.setValid(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local delay = currentAni.getDelaySum(setFrame, setFrame);
|
||
|
|
obj.getVar("shs_move").setInt(10, sq_GetXPos(obj));
|
||
|
|
obj.getVar("shs_move").setInt(11, 400);
|
||
|
|
obj.setTimeEvent(0, delay, 1, false);
|
||
|
|
obj.stopSound(2332);
|
||
|
|
obj.stopSound(2333);
|
||
|
|
if(subState == 0){
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/strengthhandstrike/attack_short.ani"), 0, 0);
|
||
|
|
obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/battlemage_bykk/strengthhandstrike/attack_long.ani"), 0, 0);
|
||
|
|
obj.sq_PlaySound("WZ_RAIDP_02");
|
||
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/strengthhandstrike/start_body_fade.ani", 0, 0, 0);
|
||
|
|
|
||
|
|
local attackInfo = sq_GetCurrentAttackInfo(obj);
|
||
|
|
local upForce = sq_GetLevelData(obj, SKILL_BYKK_STRENGTHHANDSTRIKE, 2, sq_GetSkillLevel(obj, SKILL_BYKK_STRENGTHHANDSTRIKE));
|
||
|
|
if(obj.getVar("shsBool").getBool(0)) upForce = sq_GetLevelData(obj, SKILL_BYKK_UPPERSWING, 3, sq_GetSkillLevel(obj, SKILL_BYKK_STRENGTHHANDSTRIKE));
|
||
|
|
sq_SetCurrentAttacknUpForce(attackInfo, upForce);
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_PlaySound("WZ_PRECENCIA_STRENGTHHANDSTRIKE_2");
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_STRENGTHHANDSTRIKE, -1, 1, 1.0) + 100;
|
||
|
|
local upForce = sq_GetLevelData(obj, SKILL_BYKK_STRENGTHHANDSTRIKE, 2, sq_GetSkillLevel(obj, SKILL_BYKK_STRENGTHHANDSTRIKE));
|
||
|
|
if(obj.getVar("shsBool").getBool(0)) upForce = sq_GetLevelData(obj, SKILL_BYKK_UPPERSWING, 3, sq_GetSkillLevel(obj, SKILL_BYKK_STRENGTHHANDSTRIKE));
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,170,1,120,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,20,totalDamage,upForce,0,0,0,0,0,0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
obj.sq_IntVectClear();
|
||
|
|
obj.sq_IntVectPush(subState + 1);
|
||
|
|
obj.sq_AddSetStatePacket(SKILL_BYKK_STRENGTHHANDSTRIKE, STATE_PRIORITY_AUTO, true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else{
|
||
|
|
local stateTime = obj.sq_GetStateTimer();
|
||
|
|
local fullchargeTime = sq_GetIntData(obj, SKILL_BYKK_STRENGTHHANDSTRIKE, 2);
|
||
|
|
if(sq_GetSkillLevel(obj, SKILL_BYKK_SPEARMASTERY) > 0 && obj.getWeaponSubType() == 0) fullchargeTime = fullchargeTime * ( 100 - sq_GetIntData(obj, SKILL_BYKK_SPEARMASTERY, 4)) / 100;
|
||
|
|
if(stateTime >= fullchargeTime && obj.getVar("shsBool").getBool(0)){
|
||
|
|
obj.getVar("shsBool").setBool(0, false);
|
||
|
|
obj.sq_PlaySound("RAIDP_FULL");
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,1,0,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,3,0,0,0,0,0,0,0,0);
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,0,-1,0,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,4,0,0,0,0,0,0,0,0);
|
||
|
|
obj.sq_SetSuperArmor(POD_VAR_SUPERARMOR);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyFrameFlag_StrengthHandStrike(obj, flagIndex)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(flagIndex){
|
||
|
|
case 1001:
|
||
|
|
sq_SetShake(obj, 10, 150);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_STRENGTHHANDSTRIKE, -1, 1, 1.0) + 100;
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,56,0,63,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,21,totalDamage,100,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
case 2001:
|
||
|
|
sq_SetShake(obj, 10, 150);
|
||
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_BYKK_STRENGTHHANDSTRIKE, -1, 1, 1.0) + 100;
|
||
|
|
cearteSkillPassive_Battlemage_bykk(obj,obj,PASSIVEOBJECT_BYKK_BATTLEMAGE,170,1,120,obj.getDirection(),SKILL_BYKK_STRENGTHHANDSTRIKE,21,totalDamage,150,0,0,0,0,0,0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTimeEvent_StrengthHandStrike(obj, timeEventIndex, timeEventCount)
|
||
|
|
{
|
||
|
|
if(!obj) return false;
|
||
|
|
switch(timeEventIndex){
|
||
|
|
case 0:
|
||
|
|
local currentAni = obj.getCurrentAnimation();
|
||
|
|
local poleAniFrameNumber = sq_GetAniFrameNumber(currentAni, 0);
|
||
|
|
local startFrame = 9;
|
||
|
|
if(obj.getSkillSubState() == 10) startFrame = 4;
|
||
|
|
local delay = currentAni.getDelaySum(startFrame, poleAniFrameNumber);
|
||
|
|
obj.setTimeEvent(1, delay / 50, 30, true);
|
||
|
|
break;
|
||
|
|
case 1:
|
||
|
|
local v = sq_GetUniformVelocity(0, 400, timeEventCount, 30);
|
||
|
|
local dstX = sq_GetDistancePos(obj.getVar("shs_move").getInt(10), obj.getDirection(), v);
|
||
|
|
sq_setCurrentAxisPos(obj, 0, dstX);
|
||
|
|
// obj.sq_SetXScrollStop(0);
|
||
|
|
if(timeEventCount >= 30){
|
||
|
|
obj.getVar("shs_move").setInt(12, sq_GetXPos(obj));
|
||
|
|
obj.sq_PlaySound("RAIDP_ATK");
|
||
|
|
if(obj.getSkillSubState() == 0) sq_AddDrawOnlyAniFromParent(obj, "character/mage/effect/animation/battlemage_bykk/strengthhandstrike/damage.ani", 50, 0, 10);
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case 2:
|
||
|
|
local v = sq_GetUniformVelocity(obj.getVar("shs_move").getInt(12), obj.getVar("shs_move").getInt(10), timeEventCount, 5);
|
||
|
|
sq_setCurrentAxisPos(obj, 0, v);
|
||
|
|
// obj.sq_SetXScrollStop(0);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onEndState_StrengthHandStrike(obj, new_state)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(new_state != SKILL_BYKK_STRENGTHHANDSTRIKE){
|
||
|
|
local size = obj.getVar("kksshs").get_obj_vector_size();
|
||
|
|
if(size > 0){
|
||
|
|
for(local i = 0; i < size; i++){
|
||
|
|
local shsObj = obj.getVar("kksshs").get_obj_vector(i);
|
||
|
|
if(shsObj){
|
||
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(shsObj);
|
||
|
|
colObj.setValid(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
obj.stopSound(2332);
|
||
|
|
obj.stopSound(2333);
|
||
|
|
obj.sq_RemoveSuperArmor(POD_VAR_SUPERARMOR);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAttack_StrengthHandStrike(obj, damager, boundingBox, isStuck)
|
||
|
|
{
|
||
|
|
if(!obj) return;
|
||
|
|
if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return;
|
||
|
|
sq_SetMyShake(obj, 12, 80);
|
||
|
|
}
|
||
|
|
|