3848 lines
141 KiB
C
3848 lines
141 KiB
C
|
|
//BlackMirror
|
|
function checkExecutableSkill_BlackMirror_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_BLACKMIRROR);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_BLACKMIRROR, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
AIMPOINT_ATSWORDMAN = 69;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function onSetState_BlackMirror_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_BLACKMIRRORCAST);
|
|
obj.sq_PlaySound("SW_BLACK_MIRROR");
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
|
|
local DelaySum = sq_GetDelaySum(obj.getCurrentAnimation());
|
|
sq_StartDrawCastGauge(obj, DelaySum, true);
|
|
local timeRate = 104000 / DelaySum;
|
|
|
|
local offsetX = 100;
|
|
offsetX = obj.sq_GetDistancePos(obj.getXPos(), obj.sq_GetDirection(), offsetX);
|
|
local vX = sq_GetIntData(obj, SKILL_DARKEMPLER_BLACKMIRROR, 2) * timeRate / 100;
|
|
local vY = sq_GetIntData(obj, SKILL_DARKEMPLER_BLACKMIRROR, 2) / 2 * timeRate / 100;
|
|
obj.sq_AddAimPointMark(offsetX, obj.getYPos(), vX, vY);
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_BlackMirror_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
local Xpos = obj.sq_GetAimPosX(obj.getXPos(), obj.getYPos(), false) - sq_GetXPos(obj);
|
|
local Ypos = obj.sq_GetAimPosY(obj.getXPos(), obj.getYPos(), false) - sq_GetYPos(obj);
|
|
local offsetX = obj.sq_GetAimPosX(obj.getXPos(), obj.getYPos(), false);
|
|
local offsetY = obj.sq_GetAimPosY(obj.getXPos(), obj.getYPos(), false);
|
|
obj.sq_RemoveAimPointMark();
|
|
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_BLACKMIRROR);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_BLACKMIRROR, 0, skill_level);
|
|
local passive_hp = sq_GetLevelData(obj, SKILL_DARKEMPLER_BLACKMIRROR, 2, skill_level);
|
|
local totalDamage2 = sq_GetLevelData(obj, SKILL_DARKEMPLER_BLACKMIRROR, 3, skill_level);
|
|
local time = sq_GetLevelData(obj, SKILL_DARKEMPLER_BLACKMIRROR, 4, skill_level);
|
|
local count = sq_GetLevelData(obj, SKILL_DARKEMPLER_BLACKMIRROR, 5, skill_level);
|
|
local decreaseRate = sq_GetIntData(obj, SKILL_DARKEMPLER_BLACKMIRROR, 0);
|
|
local speedRate = sq_GetIntData(obj, SKILL_DARKEMPLER_BLACKMIRROR, 79);
|
|
local damageRate = (totalDamage2.tofloat() / totalDamage.tofloat() * 100.0).tointeger();
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,Xpos,Ypos,0,ENUM_DIRECTION_RIGHT,4,SKILL_DARKEMPLER_BLACKMIRROR,1,totalDamage,passive_hp,time,count,decreaseRate,speedRate,damageRate,0,1);
|
|
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEnterFrame_BlackMirror_bykk(obj, frameIndex)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onEndState_BlackMirror_bykk(obj, newState)
|
|
{
|
|
if(!obj) return;
|
|
sq_EndDrawCastGauge(obj);
|
|
obj.sq_RemoveAimPointMark();
|
|
}
|
|
|
|
function onProc_BlackMirror_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onProcCon_BlackMirror_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function getScrollBasisPos_BlackMirror_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local subState = obj.getSkillSubState();
|
|
if (!obj.isMyControlObject()) return false;
|
|
|
|
local posX = obj.getXPos();
|
|
local posY = obj.getYPos();
|
|
|
|
obj.sq_SetCameraScrollPosition(posX, posY, 0);
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//BuckShot
|
|
|
|
function checkExecutableSkill_BuckShot_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_BUCKSHOT);
|
|
local createMin = sq_GetLevelData(obj, SKILL_DARKEMPLER_BUCKSHOT, 0, skill_level);
|
|
local createMax = sq_GetLevelData(obj, SKILL_DARKEMPLER_BUCKSHOT, 1, skill_level);
|
|
local enemyMax = sq_GetIntData(obj, SKILL_DARKEMPLER_BUCKSHOT, 13);
|
|
local soulnum = sq_GetIntData(obj, SKILL_DARKEMPLER_BUCKSHOT, 3);
|
|
if(sq_GetSkillLevel(obj, SKILL_DARKEMPLER_BUCKSHOTEX) > 0) soulnum = soulnum - 1;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_BUCKSHOT, SKILL_DARKEMPLER_BUCKSHOT, 2, 1.0);
|
|
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_DARKEMPLER_EVOLVE);
|
|
local slotCount = loadSlot.getRemainLoadNumber();
|
|
|
|
if(!loadSlot || slotCount < soulnum) return 0;
|
|
|
|
local range = sq_GetIntData(obj, SKILL_DARKEMPLER_BUCKSHOT, 1);
|
|
obj.getVar("targetBoss").clear_obj_vector();
|
|
obj.getVar("targetNamed").clear_obj_vector();
|
|
obj.getVar("targetNormal").clear_obj_vector();
|
|
local objectManager = obj.getObjectManager();
|
|
local objectNumber = objectManager.getCollisionObjectNumber();
|
|
for(local i = 0; i < objectNumber; i++){
|
|
local object = objectManager.getCollisionObject(i);
|
|
if(object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object)){
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(object);
|
|
if(sq_Abs(sq_GetXPos(activeObj) - sq_GetXPos(obj)) <= range && sq_Abs(sq_GetYPos(activeObj) - sq_GetYPos(obj)) <= range / 2 && isFrontObject(obj,activeObj)){
|
|
if(sq_IsBoss(activeObj)) obj.getVar("targetBoss").push_obj_vector(activeObj);
|
|
else if(sq_IsNamed(activeObj)) obj.getVar("targetNamed").push_obj_vector(activeObj);
|
|
else obj.getVar("targetNormal").push_obj_vector(activeObj);
|
|
}
|
|
}
|
|
}
|
|
local boss_number = obj.getVar("targetBoss").get_obj_vector_size();
|
|
local named_number = obj.getVar("targetNamed").get_obj_vector_size();
|
|
local normal_number = obj.getVar("targetNormal").get_obj_vector_size();
|
|
local all_number = boss_number + named_number + normal_number;
|
|
if(all_number < 0) return 0;
|
|
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_BUCKSHOT);
|
|
if (isUse){
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,-80,0,sq_GetZPos(obj)+60,obj.getDirection(),4,SKILL_DARKEMPLER_BUCKSHOT,3,totalDamage,obj.getDirection(),createMin,createMax,enemyMax,soulnum,0,0,0);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_BuckShot_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_DARKEMPLER_EVOLVE);
|
|
if(!loadSlot) return 0;
|
|
local count = loadSlot.getRemainLoadNumber();
|
|
local soulnum = sq_GetIntData(obj, SKILL_DARKEMPLER_BUCKSHOT, 3);
|
|
if(sq_GetSkillLevel(obj, SKILL_DARKEMPLER_BUCKSHOTEX) > 0) soulnum = soulnum - 1;
|
|
if(count < soulnum) return 0;
|
|
return 1;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//congest
|
|
|
|
function checkExecutableSkill_Congest_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_CONGEST);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(102, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_Congest_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_Congest_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_CONGEST_ON_BODY);
|
|
obj.sq_PlaySound("SW_SHADOW_BINDING");
|
|
local castTime = sq_GetCastTime(obj, SKILL_DARKEMPLER_CONGEST, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_CONGEST));
|
|
sq_StartDrawCastGauge(obj, castTime, true);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
local speedRate = delaySum.tofloat() / castTime.tofloat() * 100.0;
|
|
currentAni.setSpeedRate(speedRate);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Congest_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
local apPath = "character/atswordman/4_darktempler/congest/ap_congest.nut";
|
|
local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, apPath, false);
|
|
appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_DARKEMPLER_CONGEST, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_CONGEST));
|
|
appendage.setEnableIsBuff(true);
|
|
CNSquirrelAppendage.sq_Append(appendage, obj, obj, true);
|
|
local bonusRate = sq_GetLevelData(obj,SKILL_DARKEMPLER_CONGEST, 0, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_CONGEST)) / 10;
|
|
obj.getVar("apGetSetbyKK").setInt(0, bonusRate);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(0, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Congest_bykk(obj, new_state)
|
|
{
|
|
if(new_state != 102){
|
|
sq_EndDrawCastGauge(obj);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//DeadlyCape
|
|
|
|
function startSkillCoolTime_atSwordman_bykk(obj, skillIndex, skillLevel, currentCoolTime)
|
|
{
|
|
local state = obj.getState();
|
|
if(state == SKILL_DARKEMPLER_DEADLYCAPE && skillIndex == SKILL_DARKEMPLER_BUCKSHOT){
|
|
local newCoolTime = currentCoolTime * (100 - sq_GetLevelData(obj, SKILL_DARKEMPLER_DEADLYCAPE, 2, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_DEADLYCAPE))) / 100;
|
|
return newCoolTime;
|
|
}
|
|
return currentCoolTime;
|
|
}
|
|
|
|
function checkExecutableSkill_DeadlyCape_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_DEADLYCAPE);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DEADLYCAPE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_DeadlyCape_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_DeadlyCape_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEADLYCAPECAST);
|
|
obj.sq_PlaySound("SW_DEDLY_CAPE");
|
|
obj.sq_SetCurrentAttackInfo(125);
|
|
local bonus = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_DEADLYCAPE, SKILL_DARKEMPLER_DEADLYCAPE, 0, 1.0);
|
|
obj.sq_SetCurrentAttackBonusRate(bonus);
|
|
obj.getVar("deadlycape_target").clear_obj_vector();
|
|
local hitMax = sq_GetIntData(obj, SKILL_DARKEMPLER_DEADLYCAPE, 0) * 5;
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_DEADLYCAPE, 6) > 0) hitMax = hitMax - 9;//护石
|
|
|
|
obj.getVar("DeadlyCapeCount").clear_vector();
|
|
obj.getVar("DeadlyCapeCount").push_vector(0);
|
|
obj.getVar("DeadlyCapeCount").push_vector(hitMax);
|
|
obj.sq_SetXScrollStart(150, 100);
|
|
break;
|
|
case 1://多段1
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEADLYCAPECROSSATTACK1);
|
|
obj.resetHitObjectList();
|
|
obj.getVar("DeadlyCapeCount").set_vector(0,obj.getVar("DeadlyCapeCount").get_vector(0)+1);
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEADLYCAPECROSSATTACK2);
|
|
obj.resetHitObjectList();
|
|
obj.getVar("DeadlyCapeCount").set_vector(0,obj.getVar("DeadlyCapeCount").get_vector(0)+1);
|
|
break;
|
|
case 3:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEADLYCAPECROSSATTACK3);
|
|
obj.resetHitObjectList();
|
|
obj.getVar("DeadlyCapeCount").set_vector(0,obj.getVar("DeadlyCapeCount").get_vector(0)+1);
|
|
break;
|
|
case 4:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEADLYCAPECROSSATTACK4);
|
|
obj.resetHitObjectList();
|
|
obj.getVar("DeadlyCapeCount").set_vector(0,obj.getVar("DeadlyCapeCount").get_vector(0)+1);
|
|
break;
|
|
case 5://多段5
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEADLYCAPECROSSATTACK5);
|
|
obj.resetHitObjectList();
|
|
obj.getVar("DeadlyCapeCount").set_vector(0,obj.getVar("DeadlyCapeCount").get_vector(0)+1);
|
|
break;
|
|
case 6:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEADLYCAPELASTCAST);
|
|
local effectObj = obj.getVar("deadlycape_effect").get_obj_vector(0);
|
|
if(effectObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(effectObj);
|
|
colObj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
break;
|
|
case 7:
|
|
if(obj.isMyControlObject()) sq_SetMyShake(obj,8,500);
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEADLYCAPELASTEXPLOSION);
|
|
break;
|
|
}
|
|
local speedRate = 1.0;
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_DEADLYCAPE, 6) > 0) speedRate = 1.2;
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speedRate, speedRate);
|
|
}
|
|
|
|
function onEndCurrentAni_DeadlyCape_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
if(obj.getVar("deadlycape_target").get_obj_vector_size() < 1){
|
|
local effectObj = obj.getVar("deadlycape_effect").get_obj_vector(0);
|
|
if(effectObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(effectObj);
|
|
colObj.addSetStatePacket(23, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
obj.sq_SetXScrollStop(100);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DEADLYCAPE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
if(obj.getVar("DeadlyCapeCount").get_vector(0) > obj.getVar("DeadlyCapeCount").get_vector(1)){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(6);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DEADLYCAPE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return;
|
|
}
|
|
obj.sq_IntVectClear();
|
|
if(subState == 5) obj.sq_IntVectPush(1);
|
|
else obj.sq_IntVectPush(subState + 1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DEADLYCAPE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 6:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(7);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DEADLYCAPE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 7:
|
|
obj.sq_SetXScrollStop(100);
|
|
local size = obj.getVar("deadlycape_target").get_obj_vector_size();
|
|
for(local i = 0; i < size; i++){
|
|
local targetObj = obj.getVar("deadlycape_target").get_obj_vector(i);
|
|
if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/atswordman/4_darktempler/deadlycape/ap_deadlycape.nut");
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_DeadlyCape_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_JUMP_COMMAND)){
|
|
obj.sq_SetXScrollStop(100);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(6);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DEADLYCAPE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_DeadlyCape_bykk(obj, flagIndex)
|
|
{
|
|
local subState = obj.getSkillSubState();
|
|
switch(flagIndex){
|
|
case 0:
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_DEADLYCAPE, SKILL_DARKEMPLER_DEADLYCAPE, 1, 1.0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,137,0,68,obj.getDirection(),4,SKILL_DARKEMPLER_DEADLYCAPE,2,totalDamage,0,0,0,0,0,0,0,1);
|
|
break;
|
|
case 1:
|
|
sq_SetMyShake(obj,3,50);
|
|
switch(subState){
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/swordman/effect/animation/atdeadlycape/att/loop/att"+subState+"_glow.ani",137,-1,68);
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/swordman/effect/animation/atdeadlycape/att/loop/att_back_black1.ani",137,-1,68);
|
|
break;
|
|
}
|
|
break;
|
|
case 10:
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,137,0,68,obj.getDirection(),4,SKILL_DARKEMPLER_DEADLYCAPE,1,0,0,0,0,0,0,0,0,1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_DeadlyCape_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
|
obj.getVar("deadlycape_target").push_obj_vector(damager);
|
|
if(!sq_IsFixture(damager)){// && sq_IsHoldable(obj,damager) && sq_IsGrabable(obj,damager)
|
|
local apdPath = "character/atswordman/4_darktempler/deadlycape/ap_deadlycape.nut";
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, apdPath, true);
|
|
sq_HoldAndDelayDie(damager, obj, true, true, true, 0, 100, ENUM_DIRECTION_NEUTRAL, AddAppendage);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_DeadlyCape(obj, newState)
|
|
{
|
|
if(!obj) return;
|
|
if(newState != SKILL_DARKEMPLER_DEADLYCAPE){
|
|
obj.sq_SetXScrollStop(0);
|
|
local size = obj.getVar("deadlycape_target").get_obj_vector_size();
|
|
for(local i = 0; i < size; i++){
|
|
local targetObj = obj.getVar("deadlycape_target").get_obj_vector(i);
|
|
if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/atswordman/4_darktempler/deadlycape/ap_deadlycape.nut");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//Destroyer
|
|
|
|
|
|
|
|
|
|
function checkExecutableSkill_Destroyer_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_DESTROYER);
|
|
if(isUse){
|
|
obj.sq_IntVectClear();
|
|
if(obj.getState() == 6) obj.sq_IntVectPush(1);
|
|
else obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DESTROYER, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
|
|
obj.getVar("DestroyerCount").setInt(10,0);
|
|
local countMax = sq_GetIntData(obj, SKILL_DARKEMPLER_DESTROYER, 1);
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_DESTROYER, 12) > 0 || DESTROYER_STONE > 0) countMax = countMax * 2;//护石
|
|
obj.getVar("DestroyerCount").setInt(11,countMax);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_Destroyer_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_Destroyer_bykk(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:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DESTROYERJUMP);
|
|
sq_GetCurrentAnimation(obj).setSpeedRate(300.0);
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DESTROYERSTART);
|
|
obj.setTimeEvent(1,60,-1,false);
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DESTROYERLOOP);
|
|
break;
|
|
case 3:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DESTROYEREXRAYSTART_BODY);
|
|
break;
|
|
case 4:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DESTROYEREXRAYSTART_BODY);
|
|
break;
|
|
case 5:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DESTROYEREXRAYSTART_BODY);
|
|
break;
|
|
}
|
|
if(subState != 0){
|
|
local speedRate = 1.5;
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_DESTROYER, 12) > 0 || DESTROYER_STONE > 0) speedRate = 2.5;
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speedRate, speedRate);
|
|
}
|
|
else{
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
obj.sq_SetXScrollStart(350, delaySum);
|
|
}
|
|
if(subState == 3){
|
|
local totalDamage = (obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_DESTROYER, -1, 1, 1.0).tofloat() * 2.25 + 759).tointeger();
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delay = currentAni.getDelaySum(0,0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,75,0,sq_GetZPos(obj) - 130,obj.getDirection(),4,SKILL_DARKEMPLER_DESTROYER,2,totalDamage,delay,0,0,0,0,0,0,1);
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_Destroyer_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return;
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
local sizeRate = sq_GetIntData(obj, SKILL_DARKEMPLER_DESTROYER, 2).tofloat() / 120.0;
|
|
sq_AddDrawOnlyAniFromParent(obj,"passiveobject/atswordman_bykk/darktempler/animation/atdestroyer/boom/boom_00_07.ani",sq_getRandom(100,(600.0 * sizeRate).tointeger()),sq_getRandom(-50,20),-sq_GetZPos(obj));
|
|
sq_AddDrawOnlyAniFromParent(obj,"passiveobject/atswordman_bykk/darktempler/animation/atdestroyer/boom/boom_00_07.ani",sq_getRandom(100,(600.0 * sizeRate).tointeger()),sq_getRandom(0,50),-sq_GetZPos(obj));
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
function onProcCon_Destroyer_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
local CelXpos = sq_GetAccel(obj.getZPos(), 200, obj.sq_GetStateTimer(), delaySum, false);
|
|
sq_setCurrentAxisPos(obj, 2, CelXpos);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Destroyer_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DESTROYER, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DESTROYER, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 3:
|
|
case 4:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(subState + 1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DESTROYER, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 5:
|
|
obj.sq_SetXScrollStop(200);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(6, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
|
|
local increaseCount = sq_GetIntData(obj, SKILL_DARKEMPLER_DESTROYER, 36);
|
|
darkEmpler_Evolve(obj,increaseCount,0);
|
|
return;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Destroyer_bykk(obj, flagIndex)
|
|
{
|
|
if (!obj) return;
|
|
local count = obj.getVar("DestroyerCount").getInt(10);
|
|
if(count >= obj.getVar("DestroyerCount").getInt(11)){
|
|
obj.removeAllTimeEvent();
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_DESTROYER, 12) > 0 || DESTROYER_STONE > 0){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(3);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DESTROYER, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return;
|
|
}
|
|
obj.sq_SetXScrollStop(200);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(6, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
|
|
local increaseCount = sq_GetIntData(obj, SKILL_DARKEMPLER_DESTROYER, 36);
|
|
darkEmpler_Evolve(obj,increaseCount,0);
|
|
return;
|
|
}
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_DESTROYER, -1, 1, 1.0);
|
|
local sizeRate = sq_GetIntData(obj, SKILL_DARKEMPLER_DESTROYER, 2).tofloat() / 120.0;
|
|
switch(flagIndex){
|
|
case 0:
|
|
case 2:
|
|
case 4:
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_DESTROYER, 12) > 0 || DESTROYER_STONE > 0) totalDamage = totalDamage / 2;
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,0,0,-sq_GetZPos(obj),obj.getDirection(),4,SKILL_DARKEMPLER_DESTROYER,1,totalDamage,(sizeRate*100).tointeger(),0,0,0,0,0,0,1);
|
|
obj.getVar("DestroyerCount").setInt(10, count + 1);
|
|
break;
|
|
case 1:
|
|
case 3:
|
|
case 5:
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_DESTROYER, 12) > 0 || DESTROYER_STONE > 0){
|
|
totalDamage = totalDamage / 2;
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,0,0,-sq_GetZPos(obj),obj.getDirection(),4,SKILL_DARKEMPLER_DESTROYER,1,totalDamage,(sizeRate*100).tointeger(),0,0,0,0,0,0,1);
|
|
obj.getVar("DestroyerCount").setInt(10, count + 1);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//DeusExray
|
|
|
|
|
|
|
|
function checkExecutableSkill_DeusExray_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_DEUSEXRAY);
|
|
if (isUse){
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_DARKEMPLER_DEUSEXRAY);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DEUSEXRAY, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_DeusExray_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_DeusExray_bykk(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_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEUSEXRAY_BODY1);
|
|
obj.sq_PlaySound("SW_EXRAY_01");
|
|
obj.getVar("deuexray_count").setInt(10,0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,180,0,70,obj.getDirection(),4,SKILL_DARKEMPLER_DEUSEXRAY,1,0,0,0,0,0,0,0,0,0);
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_DEUSEXRAY, 4) > 0 || DEUSEXRAY_STONE > 0){
|
|
sq_AddDrawOnlyAniFromParent(obj, "passiveobject/atswordman_bykk/darktempler/animation/atdeusexray/talisman/spirit_talisman_spirit_04a.ani", 180, 0, 70);
|
|
}
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEUSEXRAY_BODY2);//蓄氣動作
|
|
obj.getVar("deusexrayb").setBool(0, true);
|
|
local interval = sq_GetIntData(obj, SKILL_DARKEMPLER_DEUSEXRAY, 0);
|
|
local soulMax = sq_GetIntData(obj, SKILL_DARKEMPLER_DEUSEXRAY, 1);
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_DARKEMPLER_EVOLVE);
|
|
if(!loadSlot) return;
|
|
local soulnum = loadSlot.getRemainLoadNumber();
|
|
if(soulnum < soulMax) soulMax = soulnum;
|
|
obj.setTimeEvent(1,interval,soulMax,false);
|
|
break;
|
|
case 2:
|
|
// if(obj.isMyControlObject()) sq_SetMyShake(obj,8,400);
|
|
obj.removeAllTimeEvent();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DEUSEXRAY_BODY3);//引爆
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_DEUSEXRAY);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_DEUSEXRAY, 0, skill_level);
|
|
local addRate = sq_GetLevelData(obj, SKILL_DARKEMPLER_DEUSEXRAY, 3, skill_level) * 10 / 100;
|
|
local deuexray_count = obj.getVar("deuexray_count").getInt(10);
|
|
if(deuexray_count > 0) totalDamage = totalDamage * (100 + deuexray_count * addRate) / 100;
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,180,0,70,obj.getDirection(),4,SKILL_DARKEMPLER_DEUSEXRAY,2,totalDamage,0,0,0,0,0,0,0,1);
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_DEUSEXRAY, 4) > 0 || DEUSEXRAY_STONE > 0){
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,-50,-30,120,obj.getDirection(),4,SKILL_DARKEMPLER_DEUSEXRAY,3,totalDamage * 3 / 100,0,0,0,0,0,0,0,1);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,-50,30,120,obj.getDirection(),4,SKILL_DARKEMPLER_DEUSEXRAY,3,totalDamage * 3 / 100,0,0,0,0,0,0,0,1);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,-50,-30,20,obj.getDirection(),4,SKILL_DARKEMPLER_DEUSEXRAY,3,totalDamage * 3 / 100,0,0,0,0,0,0,0,1);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,-50,30,20,obj.getDirection(),4,SKILL_DARKEMPLER_DEUSEXRAY,3,totalDamage * 3 / 100,0,0,0,0,0,0,0,1);
|
|
}
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_DeusExray_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState)
|
|
{
|
|
case 0:
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_DEUSEXRAY, 4) > 0 || DEUSEXRAY_STONE > 0){
|
|
local chargeObj = obj.getVar("deusexray").get_obj_vector(0);
|
|
if(chargeObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(chargeObj);
|
|
colObj.addSetStatePacket(23, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DEUSEXRAY, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
local soulMax = sq_GetIntData(obj, SKILL_DARKEMPLER_DEUSEXRAY, 1);
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_DARKEMPLER_EVOLVE);
|
|
if(!loadSlot) break;
|
|
local soulnum = loadSlot.getRemainLoadNumber();
|
|
if(soulnum < soulMax) soulMax = soulnum;
|
|
darkEmpler_Evolve(obj, 0, soulMax);
|
|
obj.getVar("deuexray_count").setInt(10, soulMax);
|
|
break;
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DEUSEXRAY, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 2:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_DeusExray_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
if(subState == 1){
|
|
local bDownKey = obj.isDownSkillLastKey()
|
|
if(!bDownKey){
|
|
local chargeObj = obj.getVar("deusexray").get_obj_vector(0);
|
|
if(chargeObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(chargeObj);
|
|
colObj.addSetStatePacket(23, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DEUSEXRAY, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
}
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_DeusExray_bykk(obj, flagIndex)
|
|
{
|
|
if (!obj) return;
|
|
switch(flagIndex){
|
|
case 1:
|
|
sq_flashScreen(obj,0, 80, 0, 255, sq_RGB(0, 0, 0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_CLOSEBACK);
|
|
sq_flashScreen(obj,0, 0, 160,255, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_COVER);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_DeusExray_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
local count = timeEventCount;
|
|
if(timeEventCount > 10) count = timeEventCount % 10;
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/swordman/effect/animation/atdeusexray/spirit/spirit_"+timeEventCount.tostring()+"b.ani",180,0,70);
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/swordman/effect/animation/atdeusexray/spirit/spirit_"+(timeEventCount+10).tostring()+"b.ani",180,0,70);
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/swordman/effect/animation/atdeusexray/spirit/spirit_"+(timeEventCount+20).tostring()+"b.ani",180,0,70);
|
|
darkEmpler_Evolve(obj,0,1);
|
|
obj.getVar("deuexray_count").setInt(10,obj.getVar("deuexray_count").getInt(10) + 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//Doomsday
|
|
|
|
|
|
function checkExecutableSkill_Doomsday_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_DOOMSDAY);
|
|
if(isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DOOMSDAY, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
|
|
obj.getVar("DoomsdayEnermy").clear_vector();
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_DOOMSDAY);
|
|
if(skill_level >= 3){
|
|
local time = sq_GetLevelData(obj, SKILL_DARKEMPLER_DOOMSDAY, 5, skill_level);
|
|
local hitrate = sq_GetLevelData(obj, SKILL_DARKEMPLER_DOOMSDAY, 4, skill_level)/10;
|
|
local ap = sq_CreateChangeStatus(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE, false, hitrate.tofloat(), 0);
|
|
if(ap){
|
|
ap.getAppendageInfo().setValidTime(time);
|
|
ap.sq_Append(obj, obj);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_Doomsday_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_Doomsday_bykk(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(ANIMATION_DARKEMPLER_DOOMSDAYBODYCASTATTACK);
|
|
obj.sq_PlaySound("SW_DOOMSDAY");
|
|
local bonusRate = 1.0;
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_DOOMSDAY);
|
|
if(skill_level >= 6) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DARKEMPLER_DOOMSDAY, 10, skill_level).tofloat() / 100.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_DOOMSDAY, SKILL_DARKEMPLER_DOOMSDAY, 0, bonusRate);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 119));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
obj.getVar("doomsday_move").setInt(10,sq_GetXPos(obj));
|
|
obj.getVar("doomsday_move").setInt(11,100);
|
|
local appendage = sq_AttractToMe(obj, 1500, 100, 1000);
|
|
obj.getVar("doomsday").setAppendage(0,appendage);//设置ap
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DOOMSDAYBODYATTACK1_BODY);
|
|
local bonusRate = 1.0;
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_DOOMSDAY);
|
|
if(skill_level >= 6) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DARKEMPLER_DOOMSDAY, 10, skill_level).tofloat() / 100.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_DOOMSDAY, SKILL_DARKEMPLER_DOOMSDAY, 1, bonusRate);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 120));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DOOMSDAYBODYATTACK2_BODY);
|
|
break;
|
|
case 3:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DOOMSDAYBODYATTACK3_BODY);
|
|
break;
|
|
case 4:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DOOMSDAYBODYREADYFINISHATTACK);
|
|
break;
|
|
case 5:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DOOMSDAYBODYFINISHFIRST_BODY);
|
|
break;
|
|
case 6:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DOOMSDAYBODYFINISHSECOND_BODY);
|
|
break;
|
|
case 7:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_DOOMSDAYBODYFINISHLAST_BODY);
|
|
local bonusRate = 1.0;
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_DOOMSDAY);
|
|
if(skill_level >= 6) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DARKEMPLER_DOOMSDAY, 10, skill_level).tofloat() / 100.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_DOOMSDAY, SKILL_DARKEMPLER_DOOMSDAY, 9, bonusRate);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 123));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
obj.getVar("doomsday_move").setInt(10,sq_GetXPos(obj));
|
|
obj.getVar("doomsday_move").setInt(11,500);
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_Doomsday_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(subState + 1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_DOOMSDAY, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 7:
|
|
if(sq_GetSkillLevel(obj, SKILL_DARKEMPLER_DOOMSDAY) >= 9){
|
|
local aptime = sq_GetLevelData(obj, SKILL_DARKEMPLER_DOOMSDAY, 8, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_DOOMSDAY));
|
|
local apdPath = "character/atswordman/4_darktempler/doomsday/ap_doomsdaybuff.nut";
|
|
local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, apdPath , false);
|
|
appendage.sq_SetValidTime(aptime);
|
|
appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_DARKEMPLER_DOOMSDAY, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_DOOMSDAY));
|
|
appendage.setEnableIsBuff(true);
|
|
CNSquirrelAppendage.sq_Append(appendage, obj, obj, true);
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_Doomsday_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return;
|
|
switch(timeEventIndex){
|
|
case 1: obj.resetHitObjectList(); break;
|
|
case 10:
|
|
local addRate = 0;
|
|
if(sq_GetSkillLevel(obj, 74)>5) addRate = obj.sq_GetLevelData(74, 10, sq_GetSkillLevel(obj, 74))/100.0;
|
|
sq_SetMyShake(obj,6,500);
|
|
sq_flashScreen(obj, 10, 50, 10, 255, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|
obj.sq_StartWrite();
|
|
obj.sq_WriteDword(74);
|
|
obj.sq_WriteDword(0);
|
|
obj.sq_WriteDword(obj.sq_GetBonusRateWithPassive(74, -1, 0, getATSwordmanBonus(obj,1.0,74)+addRate));
|
|
obj.sq_WriteDword(obj.sq_GetBonusRateWithPassive(74, -1, 9, getATSwordmanBonus(obj,1.0,74)+addRate));
|
|
obj.sq_SendCreatePassiveObjectPacket(24381, 0, 200, 0, 74);
|
|
break;
|
|
case 11:
|
|
local addRate = 0;
|
|
if(sq_GetSkillLevel(obj, 74)>5)
|
|
addRate = obj.sq_GetLevelData(74, 10, sq_GetSkillLevel(obj, 74))/100.0;
|
|
|
|
obj.sq_SetCurrentAttackBonusRate(obj.sq_GetBonusRateWithPassive(74, -1, 3, getATSwordmanBonus(obj,1.0,74)+addRate));
|
|
|
|
for(local i = 0; i < obj.getVar("DoomsdayEnermy").size_vector(); i++)
|
|
{
|
|
local object = sq_GetObjectByObjectId(obj, obj.getVar("DoomsdayEnermy").get_vector(i));
|
|
local z = object.getZPos() + object.getObjectHeight()/2;
|
|
local aniPPath = "character/swordman/effect/animation/atsouldrain/loopboom_01.ani";
|
|
DarktemplerCreateAniPooledObj(object,aniPPath,true,true,object.getXPos(), object.getYPos(),z, 1.0);
|
|
sq_SendHitObjectPacket(obj,object,0,0,z);
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
function onProc_Doomsday_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
local pAni = obj.getCurrentAnimation();
|
|
local currentT = sq_GetCurrentTime(pAni);
|
|
local fireT1 = pAni.getDelaySum(0, 8);
|
|
local fireT2 = pAni.getDelaySum(9, 11);
|
|
if(currentT <= fireT1) return;
|
|
local appendage = obj.getVar("doomsday").getAppendage(0);
|
|
if(appendage) appendage.setValid(false);
|
|
if(currentT > fireT1 + fireT2) return;
|
|
local srcX = obj.getVar("doomsday_move").getInt(10);
|
|
local MoveX = obj.getVar("doomsday_move").getInt(11);
|
|
local v = sq_GetUniformVelocity(0, MoveX, currentT - fireT1, fireT2);
|
|
local dstX = sq_GetDistancePos(srcX, obj.getDirection(), v);
|
|
if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX);
|
|
else{
|
|
obj.getVar("doomsday_move").setInt(10,sq_GetXPos(obj));
|
|
obj.getVar("doomsday_move").setInt(11,0);
|
|
}
|
|
break;
|
|
case 7:
|
|
local pAni = obj.getCurrentAnimation();
|
|
local currentT = sq_GetCurrentTime(pAni);
|
|
local fireT = pAni.getDelaySum(0,5);
|
|
local srcX = obj.getVar("doomsday_move").getInt(10);
|
|
local MoveX = obj.getVar("doomsday_move").getInt(11);
|
|
local v = sq_GetUniformVelocity(0, MoveX, currentT, fireT);
|
|
local dstX = sq_GetDistancePos(srcX, obj.getDirection(), v);
|
|
if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX);
|
|
else{
|
|
obj.getVar("doomsday_move").setInt(10,sq_GetXPos(obj));
|
|
obj.getVar("doomsday_move").setInt(11,0);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_Doomsday_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if (!obj) return false;
|
|
local subState = obj.getSkillSubState();
|
|
if (!obj.isMyControlObject()) return false;
|
|
switch(subState){
|
|
case 0:
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE) && !sq_IsFixture(damager)){
|
|
local apdPath = "character/atswordman/4_darktempler/doomsday/ap_doomsday.nut";
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, SKILL_DARKEMPLER_DOOMSDAY, false, apdPath, true);
|
|
sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL, AddAppendage);
|
|
sq_MoveToAppendageForce(damager, obj, obj, 526, 0, 0, 300, true, AddAppendage);
|
|
AddAppendage.sq_SetValidTime(3000);
|
|
}
|
|
break;
|
|
case 7:
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)) sq_AddDrawOnlyAniFromParent(damager, "character/swordman/effect/animation/atdoomsday/finishhiteffect.ani", 0, 1, sq_GetHeightObject(damager) / 3);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Doomsday_bykk(obj, flagIndex)
|
|
{
|
|
switch(flagIndex){
|
|
case 10:
|
|
sq_flashScreen(obj, 30, 10, 70, 100, sq_RGB(0, 0, 0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|
sq_SetMyShake(obj,2,100);
|
|
local pAni = obj.getCurrentAnimation();
|
|
local delaySum = pAni.getDelaySum(8,13);
|
|
obj.sq_SetXScrollStart(200, delaySum);
|
|
break;
|
|
case 11: sq_SetMyShake(obj,2,100); break;
|
|
case 12:
|
|
//[OFFSET] `forward` 0 0 0
|
|
break;
|
|
case 13:
|
|
sq_flashScreen(obj, 10, 20, 30, 100, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|
sq_SetMyShake(obj,10,100);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,326,-1,73,obj.getDirection(),4,SKILL_DARKEMPLER_DOOMSDAY,2,0,0,0,0,0,0,0,0,1);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,326,-1,0,obj.getDirection(),4,SKILL_DARKEMPLER_DOOMSDAY,3,0,0,0,0,0,0,0,0,1);
|
|
//[OFFSET] `boom` 201 0 73
|
|
break;
|
|
case 14: sq_SetMyShake(obj,1,700); break;
|
|
case 15: sq_SetMyShake(obj,10,100); break;
|
|
case 16:
|
|
//[OFFSET] `backward` 0 0 0
|
|
break;
|
|
case 21:
|
|
obj.sq_SetXScrollStop(100);
|
|
sq_flashScreen(obj, 30, 50, 70, 100, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_CLOSEBACK);
|
|
sq_SetMyShake(obj,5,100);
|
|
//[OFFSET] `attack boom` 21 0 2
|
|
sq_AddDrawOnlyAniFromParent(obj,"passiveobject/atswordman_bykk/darktempler/animation/atdoomsday/domehit01_01.ani",41,-1,73);
|
|
break;
|
|
case 31:
|
|
obj.resetHitObjectList();
|
|
sq_flashScreen(obj, 30, 50, 70, 100, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_CLOSEBACK);
|
|
sq_SetMyShake(obj,5,100);
|
|
sq_AddDrawOnlyAniFromParent(obj,"passiveobject/atswordman_bykk/darktempler/animation/atdoomsday/domehit02_03.ani",41,-1,73);
|
|
//[OFFSET] `attack boom` 0 0 -11
|
|
break;
|
|
case 41:
|
|
obj.resetHitObjectList();
|
|
sq_flashScreen(obj, 30, 50, 70, 100, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_CLOSEBACK);
|
|
sq_SetMyShake(obj,5,100);
|
|
//[OFFSET] `finish attack boom` 1 0 -9
|
|
break;
|
|
case 51:
|
|
sq_flashScreen(obj, 0, 180, 200, 255, sq_RGB(0, 0, 0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|
local bonusRate = 1.0;
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_DOOMSDAY);
|
|
if(skill_level >= 6) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DARKEMPLER_DOOMSDAY, 10, skill_level).tofloat() / 100.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_DOOMSDAY, SKILL_DARKEMPLER_DOOMSDAY, 3, bonusRate);
|
|
local hitMax = sq_GetIntData(obj, SKILL_DARKEMPLER_DOOMSDAY, 20);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,5,1,5,obj.getDirection(),4,SKILL_DARKEMPLER_DOOMSDAY,1,totalDamage,hitMax,0,0,0,0,0,0,1);
|
|
local effectObj = obj.getVar("doomsday_effect").get_obj_vector(0);
|
|
if(effectObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(effectObj);
|
|
colObj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
local effectObj2 = obj.getVar("doomsday_effect_b").get_obj_vector(0);
|
|
if(effectObj2){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(effectObj2);
|
|
colObj.setValid(false);
|
|
}
|
|
//[OFFSET] `finish boom` 5 0 5
|
|
//[OFFSET] `finish attack boom` 2 0 -19
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//Immolation
|
|
|
|
|
|
|
|
function checkExecutableSkill_Immolation_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_IMMOLATION);
|
|
if (isUse){
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_IMMOLATION, 9) > 0 || IMMOLATION_STONE > 0){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(3);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_IMMOLATION, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_DARKEMPLER_IMMOLATION);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_IMMOLATION, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_Immolation_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_Immolation_bykk(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(ANIMATION_DARKEMPLER_IMMOLATIONCAST);
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_IMMOLATION);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_IMMOLATION, 0, skill_level);
|
|
local level = sq_GetLevelData(obj, SKILL_DARKEMPLER_IMMOLATION, 1, skill_level);
|
|
local time = sq_GetIntData(obj, SKILL_DARKEMPLER_IMMOLATION, 1);
|
|
local hitTime = sq_GetIntData(obj, SKILL_DARKEMPLER_IMMOLATION, 3);
|
|
local vespers_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_VESPERS);
|
|
if(vespers_level > 0){
|
|
local decreaseRate = sq_GetLevelData(obj, SKILL_DARKEMPLER_VESPERS, 3, vespers_level);
|
|
hitTime = (hitTime * (100.0 + decreaseRate.tofloat()) / 100.0).tointeger();
|
|
}
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,0,-1,0,obj.getDirection(),4,SKILL_DARKEMPLER_IMMOLATION,2,totalDamage,hitTime,level,time,0,0,0,0,1);
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_IMMOLATIONLOOP);
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_IMMOLATIONEND);
|
|
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);
|
|
obj.setTimeEvent(2, delay, 1, false);
|
|
sq_AddDrawOnlyAniFromParent(obj,"character/swordman/effect/animation/atimmolation/end_magiccircle_01.ani",0,0,0);
|
|
break;
|
|
case 3:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_IMMOLATIONFIXINGCAST);
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_IMMOLATION);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_IMMOLATION, 0, skill_level);
|
|
local totalDamage2 = sq_GetLevelData(obj, SKILL_DARKEMPLER_IMMOLATION, 3, skill_level);
|
|
if(sq_GetIntData(obj, SKILL_DARKEMPLER_IMMOLATION, 9) > 0 || IMMOLATION_STONE > 0){
|
|
totalDamage2 = (totalDamage2.tofloat() * 1.27 * 1.19).tointeger()
|
|
}
|
|
local damageRate = (totalDamage2.tofloat() / totalDamage.tofloat() * 100.0).tointeger();
|
|
local level = sq_GetLevelData(obj, SKILL_DARKEMPLER_IMMOLATION, 1, skill_level);
|
|
local time = sq_GetIntData(obj, SKILL_DARKEMPLER_IMMOLATION, 1);
|
|
local hitTime = sq_GetIntData(obj, SKILL_DARKEMPLER_IMMOLATION, 3);
|
|
local lifeTime = sq_GetIntData(obj, SKILL_DARKEMPLER_IMMOLATION, 6);
|
|
local vespers_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_VESPERS);
|
|
if(vespers_level > 0){
|
|
local decreaseRate = sq_GetLevelData(obj, SKILL_DARKEMPLER_VESPERS, 3, vespers_level);
|
|
hitTime = (hitTime * (100.0 + decreaseRate.tofloat()) / 100.0).tointeger();
|
|
lifeTime = (lifeTime * (100.0 + decreaseRate.tofloat()) / 100.0).tointeger();
|
|
}
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,250,0,0,obj.getDirection(),4,SKILL_DARKEMPLER_IMMOLATION,3,totalDamage,hitTime,level,time,damageRate,lifeTime,0,0,1);
|
|
break;
|
|
}
|
|
local vespers_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_VESPERS);
|
|
if(vespers_level > 0 && subState != 2){
|
|
local decreaseRate = sq_GetLevelData(obj, SKILL_DARKEMPLER_VESPERS, 3, vespers_level);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
sq_ClearAttackBox(currentAni);
|
|
local speedRate = 10000.0 / (100 + decreaseRate).tofloat();
|
|
currentAni.setSpeedRate(speedRate);
|
|
local attackObj = obj.getVar("immolation_magiccircle").get_obj_vector(0);
|
|
if(attackObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
|
local pAni = colObj.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate);
|
|
}
|
|
}
|
|
}
|
|
|
|
function onProcCon_Immolation_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
local stateTime = obj.sq_GetStateTimer();
|
|
local minTime = sq_GetIntData(obj, SKILL_DARKEMPLER_IMMOLATION, 6);
|
|
local MaxTime = sq_GetIntData(obj, SKILL_DARKEMPLER_IMMOLATION, 2);
|
|
local vespers_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_VESPERS);
|
|
if(vespers_level > 0){
|
|
local decreaseRate = sq_GetLevelData(obj, SKILL_DARKEMPLER_VESPERS, 3, vespers_level);
|
|
minTime = (minTime * (100.0 + decreaseRate.tofloat()) / 100.0).tointeger();
|
|
MaxTime = (MaxTime * (100.0 + decreaseRate.tofloat()) / 100.0).tointeger();
|
|
}
|
|
if(stateTime < minTime) return;
|
|
local bDownKey = obj.isDownSkillLastKey();
|
|
if(!bDownKey || stateTime >= MaxTime){
|
|
if(stateTime >= MaxTime) obj.getVar("immolation").setBool(0, true);
|
|
local attackObj = obj.getVar("immolation_magiccircle").get_obj_vector(0);
|
|
if(attackObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
|
colObj.addSetStatePacket(22, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_IMMOLATION, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_Immolation_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj) return;
|
|
local level = obj.sq_GetLevelData(168, 1, sq_GetSkillLevel(obj, 168));
|
|
sq_sendSetActiveStatusPacket(damager, obj, ACTIVESTATUS_SLOW, 100.0, level, false, sq_GetIntData(obj, 168, 1));
|
|
local path = "character/atswordman/4_darktempler/immolation/ap_immolation.nut";
|
|
local forceap = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, path, true);
|
|
if(sq_IsHoldable(obj,damager) && !sq_IsFixture(damager))
|
|
if(forceap){
|
|
sq_MoveToAppendageForce(damager, obj, obj, 0, 0, damager.getZPos(), 3000, true, forceap,true);
|
|
local appendageInfo = forceap.getAppendageInfo();
|
|
appendageInfo.setValidTime(600);
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_Immolation_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return;
|
|
switch(timeEventIndex){
|
|
case 1: obj.resetHitObjectList(); break;
|
|
case 2:
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_IMMOLATION);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_IMMOLATION, 2, skill_level);
|
|
if(obj.getVar("immolation").getBool(0)) totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_IMMOLATION, 3, skill_level);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,0,-1,73,obj.getDirection(),4,SKILL_DARKEMPLER_IMMOLATION,1,totalDamage,0,0,0,0,0,0,0,1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Immolation_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
local attackObj = obj.getVar("immolation_magiccircle").get_obj_vector(0);
|
|
if(attackObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
|
colObj.addSetStatePacket(21, null, STATE_PRIORITY_AUTO, false, "");
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_IMMOLATION, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
obj.getVar("immolation").setBool(0, false);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//Jihad
|
|
|
|
|
|
|
|
function checkExecutableSkill_Jihad_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_JIHAD);
|
|
if (isUse){
|
|
AIMPOINT_ATSWORDMAN = SKILL_DARKEMPLER_JIHAD;
|
|
obj.sq_IsEnterSkillLastKeyUnits(SKILL_DARKEMPLER_JIHAD);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_JIHAD, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_Jihad_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_Jihad_bykk(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(ANIMATION_DARKEMPLER_JIHAD_START_BODY);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
obj.sq_PlaySound("SW_JIHAD");
|
|
obj.getVar("jihad_count").setInt(10,0);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
sq_StartDrawCastGauge(obj, delaySum, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_JIHAD_CASTING_BODY);
|
|
|
|
local offsetX = 100;
|
|
offsetX = obj.sq_GetDistancePos(obj.getXPos(), obj.sq_GetDirection(), offsetX);
|
|
local vX = 500;
|
|
local vY = 250;
|
|
obj.sq_AddAimPointMark(offsetX, obj.getYPos(), vX, vY);
|
|
|
|
local interval = sq_GetIntData(obj, SKILL_DARKEMPLER_JIHAD, 0);
|
|
local soulMax = sq_GetLevelData(obj, SKILL_DARKEMPLER_JIHAD, 2, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_JIHAD));
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_DARKEMPLER_EVOLVE);
|
|
if(!loadSlot) break;
|
|
local soulnum = loadSlot.getRemainLoadNumber();
|
|
if(soulnum < soulMax) soulMax = soulnum;
|
|
obj.setTimeEvent(1,interval,soulMax,false);
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_JIHAD_CASTINGEND_BODY);
|
|
sq_flashScreen(obj, 400, 0, 0, 191, sq_RGB(0, 0, 0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|
local isStone = obj.sq_GetVectorData(datas, 1);
|
|
if(isStone > 0){
|
|
obj.getVar("targetBoss").clear_obj_vector();
|
|
obj.getVar("targetNamed").clear_obj_vector();
|
|
obj.getVar("targetNormal").clear_obj_vector();
|
|
local objectManager = obj.getObjectManager();
|
|
local objectNumber = objectManager.getCollisionObjectNumber();
|
|
for(local i = 0; i < objectNumber; i++){
|
|
local object = objectManager.getCollisionObject(i);
|
|
if(object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object)){
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(object);
|
|
if(sq_IsBoss(activeObj)) obj.getVar("targetBoss").push_obj_vector(activeObj);
|
|
else if(sq_IsNamed(activeObj)) obj.getVar("targetNamed").push_obj_vector(activeObj);
|
|
else obj.getVar("targetNormal").push_obj_vector(activeObj);
|
|
}
|
|
}
|
|
local offset_x = sq_GetDistancePos(sq_GetXPos(obj), obj.getDirection(), 250);
|
|
local offset_y = sq_GetYPos(obj);
|
|
if(obj.getVar("targetBoss").get_obj_vector_size() > 0){
|
|
local targetObj = obj.getVar("targetBoss").get_obj_vector(0);
|
|
if(targetObj){
|
|
offset_x = sq_GetXPos(targetObj) - sq_GetXPos(obj);
|
|
offset_y = sq_GetYPos(targetObj) - sq_GetYPos(obj);
|
|
}
|
|
}
|
|
else if(obj.getVar("targetNamed").get_obj_vector_size() > 0){
|
|
local targetObj = obj.getVar("targetNamed").get_obj_vector(0);
|
|
if(targetObj){
|
|
offset_x = sq_GetXPos(targetObj) - sq_GetXPos(obj);
|
|
offset_y = sq_GetYPos(targetObj) - sq_GetYPos(obj);
|
|
}
|
|
}
|
|
else if(obj.getVar("targetNormal").get_obj_vector_size() > 0){
|
|
local targetObj = obj.getVar("targetNormal").get_obj_vector(0);
|
|
if(targetObj){
|
|
offset_x = sq_GetXPos(targetObj) - sq_GetXPos(obj);
|
|
offset_y = sq_GetYPos(targetObj) - sq_GetYPos(obj);
|
|
}
|
|
}
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_JIHAD, SKILL_DARKEMPLER_JIHAD, 0, 1.0) + 100;
|
|
local totalDamage2 = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_JIHAD, SKILL_DARKEMPLER_JIHAD, 1, 1.0) + 100;
|
|
local addRate = sq_GetLevelData(obj, SKILL_DARKEMPLER_JIHAD, 3, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_JIHAD)) / 10;
|
|
local interval = sq_GetIntData(obj, SKILL_DARKEMPLER_JIHAD, 0);
|
|
local soulMax = sq_GetLevelData(obj, SKILL_DARKEMPLER_JIHAD, 2, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_JIHAD));
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_DARKEMPLER_EVOLVE);
|
|
if(loadSlot){
|
|
local soulnum = loadSlot.getRemainLoadNumber();
|
|
if(soulnum < soulMax) soulMax = soulnum;
|
|
if(soulMax > 0){
|
|
darkEmpler_Evolve(obj,0,soulMax);
|
|
totalDamage = (totalDamage.tofloat() * (100 + soulMax * addRate).tofloat() / 100.0).tointeger();
|
|
totalDamage2 = (totalDamage2.tofloat() * (100 + soulMax * addRate).tofloat() / 100.0).tointeger();
|
|
}
|
|
}
|
|
local damageRate = (totalDamage2.tofloat() / totalDamage.tofloat() * 100.0).tointeger();
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,offset_x,offset_y,0,ENUM_DIRECTION_RIGHT,4,SKILL_DARKEMPLER_JIHAD,1,totalDamage,damageRate,0,0,0,0,0,0,1);
|
|
createOnlyDrawObject_AtSwordMan_bykk(obj,"passiveobject/atswordman_bykk/darktempler/animation/atjihad/jihad_summon_magiccirclea.ani",true,ENUM_DIRECTION_RIGHT,offset_x + sq_GetXPos(obj),offset_y + sq_GetYPos(obj), 0, ENUM_DRAWLAYER_BOTTOM);
|
|
}
|
|
break;
|
|
case 3:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_JIHAD_ATTACKBODY_A);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
function onEndState_Jihad_bykk(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
|
|
if(new_state != SKILL_DARKEMPLER_JIHAD){
|
|
sq_EndDrawCastGauge(obj);
|
|
obj.sq_RemoveAimPointMark();
|
|
}
|
|
}
|
|
|
|
function onProc_Jihad_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local SubState = obj.getSkillSubState();
|
|
switch(SubState){
|
|
case 1:
|
|
local bDownKey = obj.isDownSkillLastKey();
|
|
if(!bDownKey){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_JIHAD, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
|
|
local Xpos = obj.sq_GetAimPosX(sq_GetXPos(obj), sq_GetYPos(obj), false) - sq_GetXPos(obj);
|
|
local Ypos = obj.sq_GetAimPosY(sq_GetXPos(obj), sq_GetYPos(obj), false) - sq_GetYPos(obj);
|
|
obj.sq_RemoveAimPointMark();
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_JIHAD, SKILL_DARKEMPLER_JIHAD, 0, 1.0) + 100;
|
|
local totalDamage2 = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_JIHAD, SKILL_DARKEMPLER_JIHAD, 1, 1.0) + 100;
|
|
local addRate = sq_GetLevelData(obj, SKILL_DARKEMPLER_JIHAD, 3, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_JIHAD)) / 10;
|
|
local jihad_count = obj.getVar("jihad_count").getInt(10);
|
|
if(jihad_count > 0){
|
|
totalDamage = (totalDamage.tofloat() * (100 + jihad_count * addRate).tofloat() / 100.0).tointeger();
|
|
totalDamage2 = (totalDamage2.tofloat() * (100 + jihad_count * addRate).tofloat() / 100.0).tointeger();
|
|
}
|
|
local damageRate = (totalDamage2.tofloat() / totalDamage.tofloat() * 100.0).tointeger();
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,Xpos,Ypos,0,ENUM_DIRECTION_RIGHT,4,SKILL_DARKEMPLER_JIHAD,1,totalDamage,damageRate,0,0,0,0,0,0,1);
|
|
createOnlyDrawObject_AtSwordMan_bykk(obj,"passiveobject/atswordman_bykk/darktempler/animation/atjihad/jihad_summon_magiccirclea.ani",true,ENUM_DIRECTION_RIGHT,Xpos + sq_GetXPos(obj),Ypos + sq_GetYPos(obj), 0, ENUM_DRAWLAYER_BOTTOM);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Jihad_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
case 2:
|
|
if(subState == 0 && (JIHAD_STONE > 0)){//sq_GetIntData(obj, SKILL_DARKEMPLER_JIHAD, 5) > 0 ||
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_JIHAD, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(subState + 1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_JIHAD, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 3:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_Jihad_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
darkEmpler_Evolve(obj,0,1);
|
|
obj.getVar("jihad_count").setInt(10,obj.getVar("jihad_count").getInt(10) + 1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//Lacerthorns
|
|
|
|
function checkExecutableSkill_Lacerthorns_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_LACERTHORNS);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_LACERTHORNS, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_Lacerthorns_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_Lacerthorns_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_ATLACERTHORNSCASTING_BODY);
|
|
obj.getVar("target_Lacerthorns").clear_obj_vector();
|
|
obj.sq_PlaySound("LACERTHORNS_CAST");
|
|
obj.sq_PlaySound("SW_LACERTHORNS_01");
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_ATLACERTHORNSSTARTMOTION_BODY);
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_LACERTHORNS);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_LACERTHORNS, 0, skill_level);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 232));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atlacerthorns/atlacerthornsdash_00.ani", 0, 0, 0);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atlacerthorns/atlacerthornsstartfront_00.ani", 0, 0, 0);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atlacerthorns/atlacerthornsstartback_00.ani", 0, -1, -1);
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_ATLACERTHORNSFINISH_BODY);
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_LACERTHORNS);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_LACERTHORNS, 1, skill_level);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 231));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
obj.setTimeEvent(1, 100, 1, false);
|
|
obj.sq_PlaySound("LACERTHORNS_SUCCESS");
|
|
obj.sq_PlaySound("R_SW_LACERTHORNS_02");
|
|
sq_flashScreen(obj,0,0,30,191, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_COVER);
|
|
if(obj.isMyControlObject()) sq_flashScreen(obj,0,0,30,178, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_CLOSEBACK);
|
|
sq_SetMyShake(obj, 20, 400);
|
|
break;
|
|
case 3:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_ATLACERTHORNSFAIL_BODY);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Lacerthorns_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_LACERTHORNS, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
if(obj.getVar("target_Lacerthorns").get_obj_vector_size() > 0) obj.sq_IntVectPush(2);
|
|
else obj.sq_IntVectPush(3);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_LACERTHORNS, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 2:
|
|
case 3:
|
|
if(subState == 2){
|
|
local soulnum = sq_GetIntData(obj, SKILL_DARKEMPLER_LACERTHORNS, 11);
|
|
darkEmpler_Evolve(obj, soulnum, 0);
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Lacerthorns_bykk(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != SKILL_DARKEMPLER_LACERTHORNS){
|
|
//
|
|
}
|
|
}
|
|
|
|
function onEnterFrame_Lacerthorns(obj, frameIndex)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
switch(frameIndex){
|
|
case 3:
|
|
if(obj.isMyControlObject()) sq_flashScreen(obj,100,1000,0,178, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_COVER);
|
|
break;
|
|
case 4:
|
|
sq_SetMyShake(obj, 15, 120);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_Lacerthorns_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
local size = obj.getVar("target_Lacerthorns").get_obj_vector_size();
|
|
for(local i = 0; i < size; i++){
|
|
local activeObj = obj.getVar("target_Lacerthorns").get_obj_vector(i);
|
|
if(activeObj){
|
|
sq_SendHitObjectPacket(obj,activeObj,0,0,sq_GetObjectHeight(activeObj) / 2);
|
|
CNSquirrelAppendage.sq_RemoveAppendage(activeObj, "character/atswordman/4_darktempler/lacerthorns/ap_lacerthorns.nut");
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,activeObj,PASSIVEOBJECT_BYKK_DARKEMPLER,0,0,sq_GetObjectHeight(activeObj) / 2,obj.getDirection(),4,SKILL_DARKEMPLER_LACERTHORNS,1,0,0,0,0,0,0,0,0,0);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_Lacerthorns_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
|
obj.getVar("target_Lacerthorns").push_obj_vector(damager);
|
|
local apdPath = "character/atswordman/4_darktempler/lacerthorns/ap_lacerthorns.nut";
|
|
local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, apdPath, true);
|
|
sq_HoldAndDelayDie(damager, obj, true, true, true, 0, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage);
|
|
sq_AddDrawOnlyAniFromParent(damager, "character/swordman/effect/animation/atlacerthorns/atlacerthornsshot_00.ani", 0, 0, sq_GetObjectHeight(damager) / 2);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//Madness
|
|
|
|
|
|
function checkExecutableSkill_Madness_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_MADNESS);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_MADNESS, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_Madness_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_DARKEMPLER_EVOLVE);
|
|
if(!loadSlot) return 0;
|
|
local count = loadSlot.getRemainLoadNumber();
|
|
local mincount = obj.sq_GetLevelData(SKILL_DARKEMPLER_MADNESS, 0, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_MADNESS));
|
|
if(sq_GetSkillLevel(obj, SKILL_DARKEMPLER_VESPERS) > 0){
|
|
local decase = obj.sq_GetLevelData(SKILL_DARKEMPLER_VESPERS, 1, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_VESPERS));
|
|
mincount = (mincount*(100.0 - decase.tofloat()) / 100.0).tointeger();
|
|
}
|
|
if(count < mincount) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_Madness_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_MADNESS_BODY);
|
|
obj.sq_PlaySound("SW_MADNESS");
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local DelaySum = currentAni.getDelaySum(false);
|
|
local castSum = currentAni.getDelaySum(0,7);
|
|
local expSum = currentAni.getDelaySum(0,7);
|
|
obj.sq_SetXScroll(300, castSum, DelaySum - castSum - expSum, expSum);
|
|
obj.getVar("madness_target").clear_obj_vector();
|
|
local loadSlot = obj.sq_GetSkillLoad(SKILL_DARKEMPLER_EVOLVE);
|
|
local mincount = obj.sq_GetLevelData(SKILL_DARKEMPLER_MADNESS, 0, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_MADNESS));
|
|
if(sq_GetSkillLevel(obj, SKILL_DARKEMPLER_VESPERS) > 0){
|
|
local decase = obj.sq_GetLevelData(SKILL_DARKEMPLER_VESPERS, 1, sq_GetSkillLevel(obj, SKILL_DARKEMPLER_VESPERS));
|
|
mincount = (mincount*(100.0 - decase.tofloat()) / 100.0).tointeger();
|
|
}
|
|
loadSlot.decreaseLoadCount(mincount);
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_Madness_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Madness_bykk(obj, flagIndex)
|
|
{
|
|
if (!obj) return false;
|
|
switch(flagIndex){
|
|
case 0://生成阵
|
|
sq_flashScreen(obj, 0, 60, 60, 204, sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|
sq_SetMyShake(obj, 5, 120);
|
|
local range = sq_GetIntData(obj, SKILL_DARKEMPLER_MADNESS, 0);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local DelaySum = currentAni.getDelaySum(8,22);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_MADNESS, SKILL_DARKEMPLER_MADNESS, 1, 1.0) + 100;
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,300,0,0,obj.getDirection(),4,SKILL_DARKEMPLER_MADNESS,1,range,DelaySum,totalDamage,0,0,0,0,0,1);
|
|
break;
|
|
case 1://发射激光
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local DelaySum = currentAni.getDelaySum(15,15);
|
|
local speedRate = 6000 / DelaySum;
|
|
|
|
local offsetX = [-30,25,85,120,80,-30,25,85,120,80];
|
|
local offsetZ = [150,145,112,60,30,150,145,112,60,30];
|
|
local disX = [580,560,490,440,375,340,290,330,280,260];
|
|
local disY = [15,-10,30,20,-20,-30,25,10,-15,-25];
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_MADNESS, SKILL_DARKEMPLER_MADNESS, 1, 1.0) + 100;
|
|
local range = sq_GetIntData(obj, SKILL_DARKEMPLER_MADNESS, 0);
|
|
|
|
for(local i = 0; i < 10; i++){
|
|
local disPosX = sq_GetDistancePos(sq_GetXPos(obj),obj.getDirection(),disX[i] - 150);
|
|
local disPosY = sq_GetYPos(obj) + disY[i];
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,offsetX[i],0,offsetZ[i],obj.getDirection(),4,SKILL_DARKEMPLER_MADNESS,2,speedRate,sq_getRandom(1,8),obj.getDirection(),disPosX,disPosY,0,0,0,1);
|
|
}
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,300,0,0,obj.getDirection(),4,SKILL_DARKEMPLER_MADNESS,3,speedRate,totalDamage,range,0,0,0,0,0,1);
|
|
break;
|
|
case 3:
|
|
local attackObj = sq_GetCNRDObjectToCollisionObject(obj.getVar("madness").get_obj_vector(0));
|
|
local size = obj.getVar("madness_target").get_obj_vector_size();
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onEndState_Madness_bykk(obj, new_state)
|
|
{
|
|
if(!obj) return;
|
|
if(new_state != SKILL_DARKEMPLER_MADNESS){
|
|
local attackObj = sq_GetCNRDObjectToCollisionObject(obj.getVar("madness").get_obj_vector(0));
|
|
if(attackObj) attackObj.setValid(false);
|
|
local size = obj.getVar("madness_target").get_obj_vector_size();
|
|
for(local i = 0; i < size; i++){
|
|
local activeObj = obj.getVar("madness_target").get_obj_vector(i);
|
|
if(activeObj) CNSquirrelAppendage.sq_RemoveAppendage(activeObj, "character/atswordman/4_darktempler/madness/ap_madness.nut");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//Punishment
|
|
|
|
function checkExecutableSkill_Punishment_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_PUNISHMENT);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_PUNISHMENT, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_Punishment_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_Punishment_bykk(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(ANIMATION_DARKEMPLER_PUNISHMENT_CASTING_BODY1);
|
|
obj.sq_PlaySound("SW_PUNISHMENT");
|
|
obj.sq_SetXScrollStart(400, 500);
|
|
obj.getVar("punishment_quick").setBool(0,false);
|
|
obj.getVar("punishment_base").setInt(10, sq_GetXPos(obj));
|
|
obj.getVar("punishment_target").clear_obj_vector();
|
|
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 = 6000 / currentAni.getDelaySum(0, 0);
|
|
obj.getVar("punishment_speed").setInt(0, speedRate);
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_PUNISHMENT_ATTACK_MOTION1);
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_PUNISHMENT);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_PUNISHMENT, 0, skill_level);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 115));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,0,0,0,obj.getDirection(),4,SKILL_DARKEMPLER_PUNISHMENT,2,0,0,0,0,0,0,0,0,0);
|
|
obj.setTimeEvent(3,150,1,false);
|
|
break;
|
|
case 2:
|
|
obj.removeAllTimeEvent();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_PUNISHMENT_FINISH_MOTION_BODY1);
|
|
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 = 6000 / currentAni.getDelaySum(0, 0);
|
|
obj.getVar("punishmentSet").setInt(0, speedRate);
|
|
obj.sq_PlaySound("SW_PUNISHMENT_FIN");
|
|
local pooledObj = createOnlyDrawObject_AtSwordMan_bykk(obj, "character/swordman/effect/animation/atpunishment/finish/atpunishment_finish_bottom1.ani",true,obj.getDirection(), sq_GetDistancePos(sq_GetXPos(obj), obj.getDirection(), 350),sq_GetYPos(obj), 100, ENUM_DRAWLAYER_BOTTOM);
|
|
local pAni = pooledObj.getCurrentAnimation();
|
|
pAni.setImageRateFromOriginal(3.0, 1.2);
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(0,5);
|
|
obj.setTimeEvent(1, delaySum, 1, false);
|
|
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_PUNISHMENT);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_PUNISHMENT, 1, skill_level);
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 116));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
obj.setTimeEvent(2, 180000 / speedRate, 1, false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_Punishment_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
if(!obj) return;
|
|
switch(timeEventIndex){
|
|
case 0:
|
|
//sq_flashScreen(obj, 200, 100, 100, 255, sq_RGB(255,255,255), GRAPHICEFFECT_SPACE_DISTORT, ENUM_DRAWLAYER_CONTACT);
|
|
break;
|
|
case 1:
|
|
local speedRate = obj.getVar("punishmentSet").getInt(0);
|
|
local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atpunishment/finish/atpunishment_finish_top_eff2_dodge.ani", 350, 1, 100);
|
|
local pAni = pooledObj.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
break;
|
|
case 2:
|
|
attack_Punishment_bykk(obj);
|
|
sq_SetMyShake(obj, 15, 500);
|
|
break;
|
|
case 3:
|
|
local inputConut = obj.getRapidInputFrequency();
|
|
inputConut = inputConut.tointeger();
|
|
|
|
local inputMax = 5;
|
|
local gapByInputMin = sq_GetIntData(obj,SKILL_DARKEMPLER_PUNISHMENT,4);
|
|
local gapByInputMax = sq_GetIntData(obj,SKILL_DARKEMPLER_PUNISHMENT,5);
|
|
|
|
if(inputConut >= inputMax){
|
|
obj.setTimeEvent(3, gapByInputMin, 1,false);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local speedRate = obj.getVar("punishment_speed").getInt(0) * 2;
|
|
currentAni.setSpeedRate(speedRate.tofloat());
|
|
obj.getVar("punishment_quick").setBool(0,true);
|
|
local passiveObj = obj.getVar("punishment_attack").get_obj_vector(0);
|
|
if(passiveObj){
|
|
local pAni = passiveObj.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
local passiveObj2 = obj.getVar("punishment_attack2").get_obj_vector(0);
|
|
if(passiveObj2){
|
|
local pAni = passiveObj2.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
local passiveObj3 = obj.getVar("punishment_attack3").get_obj_vector(0);
|
|
if(passiveObj3){
|
|
local pAni = passiveObj3.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
}
|
|
else{
|
|
obj.setTimeEvent(3, gapByInputMax, 1,false);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local speedRate = obj.getVar("punishment_speed").getInt(0);
|
|
currentAni.setSpeedRate(speedRate.tofloat());
|
|
local passiveObj = obj.getVar("punishment_attack").get_obj_vector(0);
|
|
if(passiveObj){
|
|
local pAni = passiveObj.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
local passiveObj2 = obj.getVar("punishment_attack2").get_obj_vector(0);
|
|
if(passiveObj2){
|
|
local pAni = passiveObj2.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
local passiveObj3 = obj.getVar("punishment_attack3").get_obj_vector(0);
|
|
if(passiveObj3){
|
|
local pAni = passiveObj3.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProc_Punishment_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)) obj.addRapidInput();
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
function onEndCurrentAni_Punishment_bykk(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_DARKEMPLER_PUNISHMENT, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 2:
|
|
obj.sq_SetXScrollStop(200);
|
|
local flashScreenObj = obj.getVar("flashobj").get_obj_vector(0);
|
|
if(flashScreenObj) flashScreenObj.setValid(false);
|
|
local size = obj.getVar("punishment_target").get_obj_vector_size();
|
|
for(local i = 0; i < size; i++){
|
|
local activeObj = obj.getVar("punishment_target").get_obj_vector(i);
|
|
if(activeObj) CNSquirrelAppendage.sq_RemoveAppendage(activeObj, "character/atswordman/4_darktempler/punishment/ap_punishment.nut");
|
|
}
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Punishment_bykk(obj, flagIndex)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(flagIndex){
|
|
case 0:
|
|
switch(subState){
|
|
case 0:
|
|
local range = sq_GetIntData(obj, SKILL_DARKEMPLER_PUNISHMENT, 0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,350,0,0,obj.getDirection(),4,SKILL_DARKEMPLER_PUNISHMENT,1,range,0,0,0,0,0,0,0,0);
|
|
local flashScreenObj = sq_flashScreen(obj, 800, 99990, 0, 255, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM);
|
|
obj.getVar("flashobj").clear_obj_vector();
|
|
obj.getVar("flashobj").push_obj_vector(flashScreenObj);
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(subState + 1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_PUNISHMENT, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
break;
|
|
case 30:
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atpunishment/attack/atpunishment_attack_eff1.ani", 350, 1, 100);
|
|
attack_Punishment_bykk(obj);
|
|
break;
|
|
case 36:
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atpunishment/attack/atpunishment_attack_slash_eff.ani", 350, 1, 100);
|
|
attack_Punishment_bykk(obj);
|
|
break;
|
|
case 40:
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,350,0,100,obj.getDirection(),4,SKILL_DARKEMPLER_PUNISHMENT,3,0,0,0,0,0,0,0,0,0);
|
|
break;
|
|
case 66:
|
|
// if(obj.getVar("punishment_quick").getBool(0))
|
|
//sendAwakeCutinInfo(obj,35);
|
|
case 41:
|
|
case 48:
|
|
case 57:
|
|
case 76:
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atpunishment/attack/atpunishment_attack_slash_eff.ani", sq_getRandom(150,350), 1, sq_getRandom(0,100));
|
|
attack_Punishment_bykk(obj);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function attack_Punishment_bykk(obj)
|
|
{
|
|
local size = obj.getVar("punishment_target").get_obj_vector_size();
|
|
for(local i = 0; i < size; i++){
|
|
local activeObj = obj.getVar("punishment_target").get_obj_vector(i);
|
|
if(activeObj) sq_SendHitObjectPacket(obj,activeObj,0,0,sq_GetObjectHeight(activeObj) / 2);
|
|
}
|
|
}
|
|
|
|
function onEndState_Punishment_bykk(obj, newState)
|
|
{
|
|
if(!obj) return;
|
|
if(newState != SKILL_DARKEMPLER_PUNISHMENT){
|
|
obj.sq_SetXScrollStop(0);
|
|
local flashScreenObj = obj.getVar("flashobj").get_obj_vector(0);
|
|
if(flashScreenObj) flashScreenObj.setValid(false);
|
|
local size = obj.getVar("punishment_target").get_obj_vector_size();
|
|
for(local i = 0; i < size; i++){
|
|
local activeObj = obj.getVar("punishment_target").get_obj_vector(i);
|
|
if(activeObj) CNSquirrelAppendage.sq_RemoveAppendage(activeObj, "character/atswordman/4_darktempler/punishment/ap_punishment.nut");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//Scaffold
|
|
|
|
function checkExecutableSkill_Scaffold_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_SCAFFOLD);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SCAFFOLD, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_Scaffold_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_Scaffold_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SCAFFOLD);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atscaffold/start_00_cast.ani", 0, -3, 0);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atscaffold/start_01_cast.ani", 0, -2, 0);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atscaffold/start_02_cast.ani", 0, 1, 0);
|
|
sq_AddDrawOnlyAniFromParent(obj, "character/swordman/effect/animation/atscaffold/start_03_cast.ani", 0, -1, 0);
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_Scaffold_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(0, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Scaffold_bykk(obj, flagIndex)
|
|
{
|
|
switch(flagIndex){
|
|
case 0:
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_SCAFFOLD);
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_DARKEMPLER_SCAFFOLD, 0, skill_level);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_SCAFFOLD, 1, skill_level);
|
|
local totalDamage2 = sq_GetLevelData(obj, SKILL_DARKEMPLER_SCAFFOLD, 2, skill_level);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,50,0,90,obj.getDirection(),4,SKILL_DARKEMPLER_SCAFFOLD,1,totalDamage,totalDamage2,lifeTime,0,0,0,0,0,1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//ShadowBinding
|
|
|
|
|
|
function checkExecutableSkill_ShadowBinding_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
|
|
if(obj.getVar("bindingObj").get_obj_vector_size() > 0 && obj.getVar("ShadowBindingBool").getBool(0)){
|
|
local bindingObj = obj.getVar("bindingObj").get_obj_vector(0);
|
|
if(bindingObj){
|
|
obj.getVar("ShadowBindingBool").setBool(0, false);
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(bindingObj);
|
|
colObj.getVar().setBool(100, true);
|
|
colObj.stopTimeEvent(1);
|
|
colObj.setTimeEvent(1,100,1,true);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_SHADOWBINDING);
|
|
if(isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWBINDING, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_ShadowBinding_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
|
|
}
|
|
|
|
function onSetState_ShadowBinding_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_PlaySound("SW_SHADOW_BINDING");
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWBINDING);
|
|
|
|
obj.getVar("ShadowBindingBool").setBool(0, true);
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_SHADOWBINDING);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWBINDING, 0, skill_level);
|
|
local totalDamage2 = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWBINDING, 1, skill_level);
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWBINDING, 2, skill_level);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,0,0,0,obj.getDirection(),4,SKILL_DARKEMPLER_SHADOWBINDING,1,totalDamage,totalDamage2,lifeTime,0,0,0,0,0,1);
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_ShadowBinding_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(0, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_ShadowBinding_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//ShadowHarvest
|
|
|
|
function checkExecutableSkill_ShadowHarvest_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(64);
|
|
if(isUse){
|
|
obj.sq_IntVectClear();
|
|
if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(1);
|
|
else obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWHARVEST, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_ShadowHarvest_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_ShadowHarvest_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWHARVESTSHOOTGROUND);
|
|
break;
|
|
case 1:
|
|
obj.sq_StopMove();
|
|
obj.sq_ZStop();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWHARVESTSHOOT);
|
|
local currentAni = obj.getCurrentAnimation();
|
|
currentAni.setSpeedRate(200.0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_ShadowHarvest_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(0, STATE_PRIORITY_USER, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(6, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_ShadowHarvest_bykk(obj, flagIndex)
|
|
{
|
|
if (!obj) return false;
|
|
switch(flagIndex){
|
|
case 0:
|
|
local isSeal = 0,skill = sq_GetSkill(obj, SKILL_DARKEMPLER_SHADOWHARVEST),skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_SHADOWHARVEST);
|
|
if(!skill.isSealFunction()) isSeal = 1;
|
|
local passive_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_SHADOWHARVEST);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWHARVEST, 0, skill_level);
|
|
local totalDamage2 = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWHARVEST, 6, skill_level);
|
|
local range = 170 + 170 * sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWHARVEST, 1, skill_level) / 2 / 100;
|
|
local lifeTime = sq_GetIntData(obj, SKILL_DARKEMPLER_SHADOWHARVEST, 4);
|
|
local hitTime = sq_GetIntData(obj, SKILL_DARKEMPLER_SHADOWHARVEST, 5);
|
|
switch(obj.getSkillSubState()){
|
|
case 0:
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,30,0,80,obj.getDirection(),4,SKILL_DARKEMPLER_SHADOWHARVEST,1,totalDamage,totalDamage2,range,lifeTime,hitTime,isSeal,passive_level,0,1);
|
|
break;
|
|
case 1:
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,30,0,30,obj.getDirection(),4,SKILL_DARKEMPLER_SHADOWHARVEST,1,totalDamage,totalDamage2,range,lifeTime,hitTime,isSeal,passive_level,0,1);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//ShadowHiding
|
|
|
|
function checkExecutableSkill_ShadowHiding_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_SHADOWHIDING);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWHIDING, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
|
|
obj.getVar("ShadowHiding").clear_vector();
|
|
obj.getVar("ShadowHiding").push_vector(obj.getXPos());
|
|
obj.getVar("ShadowHiding").push_vector(obj.getYPos());
|
|
obj.getVar("ShadowHiding").push_vector(obj.getXPos());
|
|
obj.getVar("ShadowHiding").push_vector(obj.getYPos());
|
|
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_ShadowHiding_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_ShadowHiding_bykk(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(ANIMATION_DARKEMPLER_SHADOWHIDINGCAST);
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWHIDINGMOVE);
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_SHADOWHIDING);
|
|
local time = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWHIDING, 0, skill_level);
|
|
obj.setTimeEvent(0, time, 1, false);
|
|
obj.setTimeEvent(1, 25, -1, false);
|
|
CNSquirrelAppendage.sq_AppendAppendage(obj, obj, SKILL_DARKEMPLER_SHADOWHIDING, false, "character/atswordman/4_darktempler/shadowhiding/ap_shadowhiding.nut", true);
|
|
break;
|
|
case 2:
|
|
obj.removeAllTimeEvent();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWHIDINGEND);
|
|
CNSquirrelAppendage.sq_RemoveAppendage(obj, "character/atswordman/4_darktempler/shadowhiding/ap_shadowhiding.nut");
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_ShadowHiding_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWHIDING, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 2:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(0, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_ShadowHiding_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
obj.setSkillCommandEnable(SKILL_DARKEMPLER_SHADOWHIDING, true);
|
|
if(obj.sq_IsEnterSkill(SKILL_DARKEMPLER_SHADOWHIDING) != -1){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWHIDING, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_ShadowHiding_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
switch(timeEventIndex){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWHIDING, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 1:
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_UP, ENUM_SUBKEY_TYPE_ALL)){
|
|
if(obj.isMovablePos(obj.getXPos(),obj.getYPos() - 5)) sq_setCurrentAxisPos(obj, 1, obj.getYPos() - 5);
|
|
}
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL)){
|
|
if(obj.isMovablePos(obj.getXPos(),obj.getYPos() + 5)) sq_setCurrentAxisPos(obj, 1, obj.getYPos() + 5);
|
|
}
|
|
|
|
if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_LEFT, ENUM_SUBKEY_TYPE_ALL)){
|
|
if(obj.isMovablePos(obj.getXPos() - 10,obj.getYPos())) sq_setCurrentAxisPos(obj, 0, obj.getXPos() - 10);
|
|
}
|
|
else if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_RIGHT, ENUM_SUBKEY_TYPE_ALL)){
|
|
if(obj.isMovablePos(obj.getXPos() + 10,obj.getYPos())) sq_setCurrentAxisPos(obj, 0, obj.getXPos() + 10);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//ShadowLancer
|
|
|
|
function checkExecutableSkill_ShadowLancer_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(63);
|
|
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWLANCER, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_ShadowLancer_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
|
|
}
|
|
|
|
function onSetState_ShadowLancer_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWLANCERREADY);
|
|
obj.sq_PlaySound("SW_SHADOW_LANCER");
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWLANCER);
|
|
|
|
obj.getVar("move").setInt(0, sq_GetXPos(obj));
|
|
obj.getVar("move").setInt(1, 135);
|
|
|
|
local hitMax = sq_GetIntData(obj, SKILL_DARKEMPLER_SHADOWLANCER, 4);
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DARKEMPLER_SHADOWLANCER, SKILL_DARKEMPLER_SHADOWLANCER, 0, 1.0) + 100;
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local DelaySum = currentAni.getDelaySum(false);
|
|
local speedRate = 36000 / DelaySum;
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,0,0,60,obj.getDirection(),4,SKILL_DARKEMPLER_SHADOWLANCER,1,totalDamage,hitMax,speedRate,0,0,0,0,0,1);
|
|
local pooledObj = createOnlyDrawObject_AtSwordMan_bykk(obj,"character/swordman/effect/animation/atshadowlancer/13_dust.ani",true,obj.getDirection(),sq_GetXPos(obj),sq_GetYPos(obj) + 1,sq_GetZPos(obj),ENUM_DRAWLAYER_NORMAL);
|
|
sq_moveWithParent(obj, pooledObj);
|
|
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_ShadowLancer_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState)
|
|
{
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWLANCER, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 1:
|
|
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;
|
|
}
|
|
}
|
|
|
|
function onProc_ShadowLancer_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
local baseX = obj.getVar("move").getInt(0);
|
|
local moveX = obj.getVar("move").getInt(1);
|
|
local stateTime = obj.sq_GetStateTimer();
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local DelaySum = currentAni.getDelaySum(false);
|
|
local CelXpos = sq_GetAccel(0, moveX, stateTime, DelaySum, true);
|
|
local destX = sq_GetDistancePos(baseX, obj.getDirection(), CelXpos);
|
|
if(obj.isMovablePos(destX,obj.getYPos())) sq_setCurrentAxisPos(obj, 0, destX);
|
|
else obj.getVar("move").setInt(1, 0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//ShadowPuppet
|
|
|
|
|
|
function checkExecutableSkill_ShadowPuppet_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_SHADOWPUPPET);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWPUPPET, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_ShadowPuppet_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_ShadowPuppet_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
obj.sq_StopMove();
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWPUPPETCASTING);
|
|
obj.sq_PlaySound("SW_SHADOW_PUPPET");
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWPUPPETCHARGESTART);
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWPUPPETCHARGELOOP);
|
|
break;
|
|
case 3:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SHADOWPUPPETFINISH);
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_SHADOWPUPPET);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWPUPPET, 2, skill_level);
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWPUPPET, 1, skill_level);
|
|
local hitTime = sq_GetIntData(obj, SKILL_DARKEMPLER_SHADOWPUPPET, 1);
|
|
if(sq_GetSkillLevel(obj, SKILL_DARKEMPLER_VESPERS) > 0){
|
|
totalDamage = totalDamage + sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWPUPPET, 0, skill_level);
|
|
hitTime = hitTime / 2;
|
|
}
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,30,0,70,obj.getDirection(),4,SKILL_DARKEMPLER_SHADOWPUPPET,1,totalDamage,lifeTime,hitTime,0,0,0,0,0,1);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_ShadowPuppet_bykk(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_DARKEMPLER_SHADOWPUPPET, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 3:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_ShadowPuppet_bykk(obj, flagIndex)
|
|
{
|
|
local subState = obj.getSkillSubState();
|
|
if(subState == 0 && flagIndex == 0){
|
|
if(sq_GetSkillLevel(obj, SKILL_DARKEMPLER_INCARNATION) > 0){
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_SHADOWPUPPET);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWPUPPET, 2, skill_level);
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWPUPPET, 1, skill_level) / 2;
|
|
local hitTime = sq_GetIntData(obj, SKILL_DARKEMPLER_SHADOWPUPPET, 1) / 2;
|
|
local balance = 20;
|
|
totalDamage = totalDamage * balance / 100;
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,400,0,0,obj.getDirection(),4,SKILL_DARKEMPLER_SHADOWPUPPET,2,totalDamage,lifeTime,hitTime,sq_GetOppositeDirection(obj.getDirection()),1,0,0,0,0);
|
|
obj.setTimeEvent(1,100,1,false);
|
|
}
|
|
else if(sq_GetSkillLevel(obj, SKILL_DARKEMPLER_VESPERS) > 0){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(3);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWPUPPET, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
}
|
|
else{
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_SHADOWPUPPET);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWPUPPET, 2, skill_level);
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_DARKEMPLER_SHADOWPUPPET, 1, skill_level);
|
|
local hitTime = sq_GetIntData(obj, SKILL_DARKEMPLER_SHADOWPUPPET, 0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,400,0,0,obj.getDirection(),4,SKILL_DARKEMPLER_SHADOWPUPPET,2,totalDamage,lifeTime,hitTime,sq_GetOppositeDirection(obj.getDirection()),0,0,0,0,0);
|
|
}
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_ShadowPuppet_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(3);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SHADOWPUPPET, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//SoulDrain
|
|
|
|
function checkExecutableSkill_SoulDrain_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(59);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_SOULDRAIN, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_SoulDrain_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
}
|
|
|
|
function onSetState_SoulDrain_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_SOULDRAIN);
|
|
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_SOULDRAIN);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_SOULDRAIN, 3, skill_level);
|
|
local lifeTime = sq_GetLevelData(obj, SKILL_DARKEMPLER_SOULDRAIN, 0, skill_level);
|
|
local enemyMax = sq_GetLevelData(obj, SKILL_DARKEMPLER_SOULDRAIN, 4, skill_level);
|
|
local hitMax = sq_GetLevelData(obj, SKILL_DARKEMPLER_SOULDRAIN, 2, skill_level);
|
|
local range = sq_GetLevelData(obj, SKILL_DARKEMPLER_SOULDRAIN, 1, skill_level) * 2;
|
|
local hitTime = sq_GetIntData(obj, SKILL_DARKEMPLER_SOULDRAIN, 0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,0,-1,0,obj.getDirection(),4,SKILL_DARKEMPLER_SOULDRAIN,1,totalDamage,lifeTime,enemyMax,hitMax,range,hitTime,0,0,1);
|
|
if(obj.getVar("souldrain").get_obj_vector_size() < 1) obj.getVar("souldrain").clear_obj_vector();
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_SoulDrain_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//StarFall
|
|
|
|
function checkExecutableSkill_StarFall_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DARKEMPLER_STARFALL);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DARKEMPLER_STARFALL, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function checkCommandEnable_StarFall_bykk(obj)
|
|
{
|
|
if (!obj) return 0;
|
|
return 1;
|
|
|
|
}
|
|
|
|
function onSetState_StarFall_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DARKEMPLER_STARFALL);
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_StarFall_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_StarFall_bykk(obj, flagIndex)
|
|
{
|
|
if (!obj) return false;
|
|
switch(flagIndex){
|
|
case 1:
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_STARFALL);
|
|
local create_number = sq_GetLevelData(obj, SKILL_DARKEMPLER_STARFALL, 0, skill_level);
|
|
obj.setTimeEvent(1,50,create_number,true);
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function onTimeEvent_StarFall_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DARKEMPLER_STARFALL);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DARKEMPLER_STARFALL, 1, skill_level);
|
|
local range = sq_GetIntData(obj, SKILL_DARKEMPLER_STARFALL, 0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj,obj,PASSIVEOBJECT_BYKK_DARKEMPLER,100,0,0,obj.getDirection(),4,SKILL_DARKEMPLER_STARFALL,1,totalDamage,range,timeEventCount,0,0,0,0,0,1);
|
|
}
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function checkExecutableSkill_Whipswordbal_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DEMONSLAYER_WHIPSWORDBAL);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_WHIPSWORDBAL, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Whipswordbal_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local state = obj.sq_GetState();
|
|
if(state == 0 || state == 108 || state == 14) return true;
|
|
else return false;
|
|
}
|
|
|
|
function onSetState_Whipswordbal_bykk(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_PlaySound("SW_WHIPSWORDBAL");
|
|
if(sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH) > 0) obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_WHIPSWORDBAL1_DEVIL);
|
|
else obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_WHIPSWORDBAL1);
|
|
obj.sq_AddStateLayerAnimation(1, obj.sq_CreateCNRDAnimation("effect/animation/atwhipswordbal/bal_cast.ani"), 0, 0);
|
|
|
|
local bonusRate = 1.0;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atswordman/2_demonslayer/WillPower/ap_WillPower.nut")) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DEMONSLAYER_WILLPOWER, 5, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_WILLPOWER)).tofloat() / 1000.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_WHIPSWORDBAL, SKILL_DEMONSLAYER_WHIPSWORDBAL, 0, bonusRate) + 100;
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 86));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_WHIPSWORDBAL2);
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_WHIPSWORDBAL3);
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_Whipswordbal_bykk(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_DEMONSLAYER_WHIPSWORDBAL, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 2:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(0, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_Whipswordbal_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj) return false;
|
|
// Calldaimus_onAttack(obj,damager, boundingBox, isStuck);
|
|
}
|
|
|
|
function onEnterFrame_Whipswordbal_bykk(obj, frameIndex)
|
|
{
|
|
if(!obj) return;
|
|
switch(frameIndex){
|
|
case 4:
|
|
local count = sq_GetIntData(obj,SKILL_DEMONSLAYER_WHIPSWORDBAL, 0), isSub2 = 0;
|
|
if(sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_QUEENOFMINE) > 0){
|
|
if(count < 6) count = 6;
|
|
isSub2 = 1;
|
|
}
|
|
local offsetX = sq_GetIntData(obj,SKILL_DEMONSLAYER_WHIPSWORDBAL, 1), offsetY = 0, isSub = 0;
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH);
|
|
if(skill_level > 0){offsetY = 40; isSub = 1;}
|
|
|
|
local bonusRate = 1.0;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atswordman/2_demonslayer/WillPower/ap_WillPower.nut")) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DEMONSLAYER_WILLPOWER, 5, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_WILLPOWER)).tofloat() / 1000.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_WHIPSWORDBAL, SKILL_DEMONSLAYER_WHIPSWORDBAL, 0, bonusRate) + 100;
|
|
for (local i = 0; i < count ; i++){
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj, obj, PASSIVEOBJECT_BYKK_DEMONSLAYER, 135 + offsetX * i, offsetY, 0, obj.getDirection(), 2, SKILL_DEMONSLAYER_WHIPSWORDBAL, 1, totalDamage, isSub, isSub2, 0, 0, 0, 0, 0, 1);
|
|
if(skill_level > 0) cearteSkillPassiveObj_AtSwordMan_bykk(obj, obj, PASSIVEOBJECT_BYKK_DEMONSLAYER, 135 + offsetX * i, -40, 0, obj.getDirection(), 2, SKILL_DEMONSLAYER_WHIPSWORDBAL, 1, totalDamage, 1, isSub2, 0, 0, 0, 0, 0, 1);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Whipswordbal_bykk(obj, newState)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onKeyFrameFlag_Whipswordbal_bykk(obj, flagIndex)
|
|
{
|
|
if (!obj) return;
|
|
}
|
|
|
|
function onProcCon_Whipswordbal_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function checkExecutableSkill_Snakedance_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DEMONSLAYER_SNAKEDANCE);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_SNAKEDANCE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Snakedance_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local state = obj.sq_GetState();
|
|
if(state == 0 || state == 108 || state == 14) return true;
|
|
else return false;
|
|
}
|
|
|
|
function onSetState_Snakedance_bykk(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(ANIMATION_DEMONSLAYER_SNAKEDANCE1);
|
|
obj.sq_PlaySound("SW_SNAKEDANCE_01");
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_SNAKEDANCE2);
|
|
obj.sq_PlaySound("SW_SNAKEDANCE_02");
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_SNAKEDANCE3);
|
|
obj.sq_PlaySound("SW_SNAKEDANCE_03");
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
local bonusRate = 1.0;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atswordman/2_demonslayer/WillPower/ap_WillPower.nut")) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DEMONSLAYER_WILLPOWER, 2, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_WILLPOWER)).tofloat() / 1000.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_SNAKEDANCE, SKILL_DEMONSLAYER_SNAKEDANCE, subState, bonusRate) + 100;
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 112 + subState));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
}
|
|
|
|
function onEndCurrentAni_Snakedance_bykk(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_DEMONSLAYER_SNAKEDANCE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 2:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_Snakedance_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onEnterFrame_Snakedance_bykk(obj, frameIndex)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onEndState_Snakedance_bykk(obj, newState)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function checkExecutableSkill_Clawblade_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DEMONSLAYER_CLAWBLADE);
|
|
if (isUse){
|
|
obj.getVar("Clawblade").clear_obj_vector();
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_CLAWBLADE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Clawblade_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Clawblade_bykk(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(ANIMATION_DEMONSLAYER_CLAWBLADE1);
|
|
obj.sq_PlaySound("SW_CLAWBLADE");
|
|
obj.getVar("clawblade_target").clear_obj_vector();
|
|
|
|
local bonusRate = 1.0;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atswordman/2_demonslayer/WillPower/ap_WillPower.nut")) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DEMONSLAYER_WILLPOWER, 1, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_WILLPOWER)).tofloat() / 1000.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_CLAWBLADE, SKILL_DEMONSLAYER_CLAWBLADE, 0, bonusRate) + 100;
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 90));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
break;
|
|
case 1:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_CLAWBLADE2);
|
|
|
|
local bonusRate = 1.0;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atswordman/2_demonslayer/WillPower/ap_WillPower.nut")) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DEMONSLAYER_WILLPOWER, 1, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_WILLPOWER)).tofloat() / 1000.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_CLAWBLADE, SKILL_DEMONSLAYER_CLAWBLADE, 1, bonusRate) + 100;
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 91));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
break;
|
|
case 2:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_CLAWBLADE3);
|
|
break;
|
|
case 3:
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_CLAWBLADEENDATTACK_BODY);
|
|
|
|
local bonusRate = 1.0;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atswordman/2_demonslayer/WillPower/ap_WillPower.nut")) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DEMONSLAYER_WILLPOWER, 1, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_WILLPOWER)).tofloat() / 1000.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_CLAWBLADE, -1, 0, bonusRate) + obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_CLAWBLADE, -1, 1, bonusRate) + 200;
|
|
local damageRate = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_QUEENOFMINE, -1, 0, 1.0) + 100;
|
|
local totalDamage2 = totalDamage * damageRate / 1000;
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 90));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage2);
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
if(subState == 2){
|
|
local currentAni = obj.getCurrentAnimation();
|
|
currentAni.setSpeedRate(150.0);
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Clawblade_bykk(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_DEMONSLAYER_CLAWBLADE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 2:
|
|
if(sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_QUEENOFMINE) > 0){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(3);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_CLAWBLADE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
case 3:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_Clawblade_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj) return false;
|
|
local subState = obj.getSkillSubState();
|
|
//Calldaimus_onAttack(obj,damager, boundingBox, isStuck);
|
|
switch(subState){
|
|
case 0:
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
local stateTime = obj.sq_GetStateTimer();
|
|
if(damager.isObjectType(OBJECTTYPE_ACTIVE)){
|
|
if(sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH) > 0){
|
|
|
|
local bonusRate = 1.0;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atswordman/2_demonslayer/WillPower/ap_WillPower.nut")) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DEMONSLAYER_WILLPOWER, 1, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_WILLPOWER)).tofloat() / 1000.0;
|
|
local totalDamage = (obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_CLAWBLADE, -1, 0, bonusRate) + 100) * (obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_DEVILSWORDTECH, -1, 5, bonusRate) + 100 ) / 100;
|
|
local id = sq_GetObjectId(damager);
|
|
local hitMax = sq_GetIntData(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH, 3);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj, damager, PASSIVEOBJECT_BYKK_DEMONSLAYER, 0, 0, sq_GetObjectHeight(damager) / 2, obj.getDirection(), 2, SKILL_DEMONSLAYER_CLAWBLADE, 2, totalDamage, id, hitMax, 0, 0, 0, 0, 0, 1);
|
|
}
|
|
if(sq_IsHoldable(obj,damager) && sq_IsGrabable(obj,damager) && !sq_IsFixture(damager)){
|
|
obj.getVar("clawblade_target").push_obj_vector(damager);
|
|
local apdPath = "character/atswordman/2_demonslayer/clawblade/ap_clawblade.nut";
|
|
local addAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, apdPath, true);
|
|
if(addAppendage){
|
|
sq_HoldAndDelayDie(damager, obj, true, true, false, 100, 100, ENUM_DIRECTION_NEUTRAL, addAppendage);
|
|
sq_MoveToAppendageForce(damager, obj, obj, 200, 0, 0, delaySum - stateTime, true, addAppendage);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEnterFrame_Clawblade_bykk(obj, frameIndex)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
switch(frameIndex){
|
|
case 0:
|
|
local size = obj.getVar("clawblade_target").get_obj_vector_size();
|
|
if(size > 0){
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(false);
|
|
local apdPath = "character/atswordman/2_demonslayer/clawblade/ap_clawblade.nut";
|
|
for(local i = 0; i < size; i++){
|
|
local damager = obj.getVar("clawblade_target").get_obj_vector(i);
|
|
if(damager){
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(damager, apdPath);
|
|
sq_MoveToAppendageForce(damager, obj, obj, 150, 0, 100, delaySum, true, addAppendage);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
case 5:
|
|
case 7:
|
|
obj.resetHitObjectList();
|
|
break;
|
|
}
|
|
case 2:
|
|
switch(frameIndex){
|
|
case 0:
|
|
local size = obj.getVar("clawblade_target").get_obj_vector_size();
|
|
if(size > 0){
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delaySum = currentAni.getDelaySum(0,2);
|
|
local apdPath = "character/atswordman/2_demonslayer/clawblade/ap_clawblade.nut";
|
|
for(local i = 0; i < size; i++){
|
|
local damager = obj.getVar("clawblade_target").get_obj_vector(i);
|
|
if(damager){
|
|
local addAppendage = CNSquirrelAppendage.sq_GetAppendage(damager, apdPath);
|
|
sq_MoveToAppendageForce(damager, obj, obj, 180, 0, 0, delaySum, true, addAppendage);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 3:
|
|
local apdPath = "character/atswordman/2_demonslayer/clawblade/ap_clawblade.nut";
|
|
local size = obj.getVar("clawblade_target").get_obj_vector_size();
|
|
if(size > 0){
|
|
for(local i = 0; i < size; i++){
|
|
local damager = obj.getVar("clawblade_target").get_obj_vector(i);
|
|
if(damager){
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_CLAWBLADE, -1, 1, 1.0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj, damager, PASSIVEOBJECT_BYKK_DEMONSLAYER, 0, 0, 0, obj.getDirection(), 2, SKILL_DEMONSLAYER_CLAWBLADE, 1, totalDamage, 0, 0, 0, 0, 0, 0, 0, 1);
|
|
CNSquirrelAppendage.sq_RemoveAppendage(damager, apdPath);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function onEndState_Clawblade_bykk(obj, newState)
|
|
{
|
|
if(!obj) return;
|
|
if(newState != SKILL_DEMONSLAYER_CLAWBLADE){
|
|
local size = obj.getVar("clawblade_target").get_obj_vector_size();
|
|
if(size > 0){
|
|
for(local i = 0; i < size; i++){
|
|
local targetObj = obj.getVar("clawblade_target").get_obj_vector(i);
|
|
if(targetObj) CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/atswordman/2_demonslayer/clawblade/ap_clawblade.nut");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function checkExecutableSkill_Pikesword_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DEMONSLAYER_PIKESWORD);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_PIKESWORD, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Pikesword_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local state = obj.sq_GetState();
|
|
if(state == 0 || state == 108 || state == 14) return true;
|
|
else return false;
|
|
}
|
|
|
|
function onSetState_Pikesword_bykk(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(sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH) > 0) obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_PIKESWORD_START_BODY);
|
|
else obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_PIKESWORD);
|
|
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_PIKESWORD, -1, 0, 1.0) + 100;
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 89));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
break;
|
|
case 1:
|
|
if(sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH) > 0) obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_PIKESWORD_END_BODY);
|
|
else obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_PIKESWORDDRAG);
|
|
|
|
local bonusRate = 1.0;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atswordman/2_demonslayer/WillPower/ap_WillPower.nut")) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DEMONSLAYER_WILLPOWER, 3, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_WILLPOWER)).tofloat() / 1000.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_PIKESWORD, -1, 1, bonusRate) + 100;
|
|
local attackIndex = 87;
|
|
if(sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH) > 0) attackIndex = 88;
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, attackIndex));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_Pikesword_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_PIKESWORD, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 1:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_Pikesword_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onEnterFrame_Pikesword_bykk(obj, frameIndex)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onEndState_Pikesword_bykk(obj, newState)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function checkExecutableSkill_Wildwhip_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DEMONSLAYER_WILDWHIP);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_WILDWHIP, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Wildwhip_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local state = obj.sq_GetState();
|
|
if(state == 0 || state == 108 || state == 14) return true;
|
|
else return false;
|
|
}
|
|
|
|
function onSetState_Wildwhip_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
// BodyCalldaimus(obj, "wildwhip1");
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_WILDWHIP1);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
break;
|
|
case 1:
|
|
// BodyCalldaimus(obj, "wildwhip2");
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_WILDWHIP2);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
obj.sq_PlaySound("WILDWHIP_SPIRAL_LOOP", 2021);
|
|
obj.setTimeEvent(1, 100, 1, false);
|
|
|
|
local bonusRate = 1.0;
|
|
if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/atswordman/2_demonslayer/WillPower/ap_WillPower.nut")) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_DEMONSLAYER_WILLPOWER, 4, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_WILLPOWER)).tofloat() / 1000.0;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_WILDWHIP, -1, 1, bonusRate) + 100;
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 89));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
|
|
if(sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH) > 0){
|
|
totalDamage = totalDamage * sq_GetLevelData(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH, 3, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH)) / 100;
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delay = currentAni.getDelaySum(0, 0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj, obj, PASSIVEOBJECT_BYKK_DEMONSLAYER, 0, 0, 0, obj.getDirection(), 2, SKILL_DEMONSLAYER_WILDWHIP, 1, totalDamage, delay, 0, 0, 0, 0, 0, 0, 1);
|
|
}
|
|
break;
|
|
case 2:
|
|
obj.stopSound(2021);
|
|
obj.removeAllTimeEvent();
|
|
obj.sq_PlaySound("WILDWHIP_SPIRAL_FINISH");
|
|
// BodyCalldaimus(obj, "wildwhip3");
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_WILDWHIP3);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Wildwhip_bykk(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_DEMONSLAYER_WILDWHIP, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 2:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_Wildwhip_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
local inputConut = obj.getRapidInputFrequency();
|
|
inputConut = inputConut.tointeger();
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local speedRate = 100;
|
|
|
|
local inputMax = 2;
|
|
if(inputConut >= inputMax){
|
|
speedRate = sq_GetIntData(obj, SKILL_DEMONSLAYER_WILDWHIP, 0);
|
|
obj.getVar("wildwhip").setBool(0, true);
|
|
}
|
|
else obj.getVar("wildwhip").setBool(0, false);
|
|
currentAni.setSpeedRate(speedRate.tofloat());
|
|
local attackObj = obj.getVar("wildwhip_obj").get_obj_vector(0);
|
|
if(attackObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
|
local pAni = colObj.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
}
|
|
|
|
obj.setTimeEvent(1, 100, 1, false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_Wildwhip_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onEnterFrame_Wildwhip_bykk(obj, frameIndex)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
if(frameIndex % 3 == 0){
|
|
if(obj.isMyControlObject()) obj.sq_SetShake(obj, 2, 85);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Wildwhip_bykk(obj, newState)
|
|
{
|
|
if(!obj) return;
|
|
if(newState != 153){
|
|
obj.stopSound(2021);
|
|
local attackObj = obj.getVar("wildwhip_obj").get_obj_vector(0);
|
|
if(attackObj) attackObj.setValid(false);
|
|
}
|
|
}
|
|
|
|
function onProcCon_Wildwhip_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)) obj.addRapidInput();
|
|
|
|
sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_JUMP_COMMAND)){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Wildwhip_bykk(obj, flagIndex)
|
|
{
|
|
if (!obj) return;
|
|
switch(flagIndex){
|
|
case 1: obj.resetHitObjectList(); break;
|
|
case 2:
|
|
if(obj.getVar("wildwhip").getBool(0)) obj.resetHitObjectList();
|
|
break;
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
function checkExecutableSkill_Blooddance_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DEMONSLAYER_BLOODDANCE);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_BLOODDANCE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Blooddance_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local state = obj.sq_GetState();
|
|
if(state == 0 || state == 108 || state == 14) return true;
|
|
else return false;
|
|
}
|
|
|
|
function onSetState_Blooddance_bykk(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_PlaySound("SW_BLOODDANCE_01");
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_BLOODDANCESTART);
|
|
obj.getVar("blooddance_count").setInt(10, 1);
|
|
break;
|
|
case 1:
|
|
obj.sq_PlaySound("BLOODDANCE_LOOP", 2022);
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_BLOODDANCELOOP);
|
|
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_BLOODDANCE, -1, 0, 1.0) + 100;
|
|
if(sq_GetIntData(obj, SKILL_DEMONSLAYER_BLOODDANCE, 5) > 0 || BLOODDANCE_STONE > 0) totalDamage = totalDamage * 56 / 100;
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 94));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
obj.setTimeEvent(1, 100, 1, false);
|
|
|
|
break;
|
|
case 2:
|
|
obj.stopSound(2022);
|
|
obj.removeAllTimeEvent();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_BLOODDANCEFINISH);
|
|
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_BLOODDANCE, -1, 5, 1.0) + 100;
|
|
if(sq_GetIntData(obj, SKILL_DEMONSLAYER_BLOODDANCE, 5) > 0 || BLOODDANCE_STONE > 0) totalDamage = totalDamage * 225 / 100;
|
|
sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, 96));
|
|
sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage);
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
if(sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH) > 0){
|
|
if(subState == 1){
|
|
local totalDamage = (obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_BLOODDANCE, -1, 0, 1.0) + 100) * sq_GetLevelData(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH, 4, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH)) / 100;
|
|
if(sq_GetIntData(obj, SKILL_DEMONSLAYER_BLOODDANCE, 5) > 0 || BLOODDANCE_STONE > 0) totalDamage = totalDamage * 56 / 100;
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local delay = currentAni.getDelaySum(0, 0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj, obj, PASSIVEOBJECT_BYKK_DEMONSLAYER, 0, 0, 0, obj.getDirection(), 2, SKILL_DEMONSLAYER_BLOODDANCE, 1, totalDamage, delay, 0, 0, 0, 0, 0, 0, 1);
|
|
}
|
|
else if(subState == 2){
|
|
local attackObj = obj.getVar("blooddance_obj").get_obj_vector(0);
|
|
if(attackObj) attackObj.setValid(false);
|
|
local totalDamage = (obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_BLOODDANCE, -1, 5, 1.0) + 100) * sq_GetLevelData(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH, 4, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_DEVILSWORDTECH)) / 100;
|
|
if(sq_GetIntData(obj, SKILL_DEMONSLAYER_BLOODDANCE, 5) > 0 || BLOODDANCE_STONE > 0) totalDamage = totalDamage * 225 / 100;
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj, obj, PASSIVEOBJECT_BYKK_DEMONSLAYER, 0, 0, 0, obj.getDirection(), 2, SKILL_DEMONSLAYER_BLOODDANCE, 2, totalDamage, 0, 0, 0, 0, 0, 0, 0, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_Blooddance_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(1);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_BLOODDANCE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
case 2:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onTimeEvent_Blooddance_bykk(obj, timeEventIndex, timeEventCount)
|
|
{
|
|
switch(timeEventIndex){
|
|
case 1:
|
|
local inputConut = obj.getRapidInputFrequency();
|
|
inputConut = inputConut.tointeger();
|
|
local currentAni = obj.getCurrentAnimation();
|
|
local speedRate = 100;
|
|
local hitMax = sq_GetIntData(obj, SKILL_DEMONSLAYER_BLOODDANCE, 1);
|
|
|
|
local inputMax = 2;
|
|
if(inputConut >= inputMax){
|
|
hitMax = sq_GetIntData(obj, SKILL_DEMONSLAYER_BLOODDANCE, 2);
|
|
speedRate = 180;
|
|
}
|
|
if(sq_GetIntData(obj, SKILL_DEMONSLAYER_BLOODDANCE, 5) > 0 || BLOODDANCE_STONE > 0) hitMax = hitMax * 2;
|
|
|
|
if(obj.getVar("blooddance_count").getInt(10) + 1 > hitMax){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_BLOODDANCE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
else{
|
|
obj.getVar("blooddance_count").setInt(10, obj.getVar("blooddance_count").getInt(10) + 1)
|
|
}
|
|
|
|
currentAni.setSpeedRate(speedRate.tofloat());
|
|
local attackObj = obj.getVar("blooddance_obj").get_obj_vector(0);
|
|
if(attackObj){
|
|
local colObj = sq_GetCNRDObjectToCollisionObject(attackObj);
|
|
local pAni = colObj.getCurrentAnimation();
|
|
pAni.setSpeedRate(speedRate.tofloat());
|
|
colObj.resetHitObjectList();
|
|
}
|
|
|
|
obj.resetHitObjectList();
|
|
obj.setTimeEvent(1, 100, 1, false);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_Blooddance_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj) return ;
|
|
}
|
|
|
|
function onEnterFrame_Blooddance_bykk(obj, frameIndex)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onEndState_Blooddance_bykk(obj, newState)
|
|
{
|
|
if(!obj) return;
|
|
if(newState != SKILL_DEMONSLAYER_BLOODDANCE){
|
|
obj.stopSound(2022);
|
|
local attackObj = obj.getVar("blooddance_obj").get_obj_vector(0);
|
|
if(attackObj) attackObj.setValid(false);
|
|
}
|
|
}
|
|
|
|
function onProc_Blooddance_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 1:
|
|
sq_SetKeyxEnable(obj, E_ATTACK_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_ATTACK_COMMAND)) obj.addRapidInput();
|
|
|
|
sq_SetKeyxEnable(obj, E_JUMP_COMMAND, true);
|
|
if(sq_IsEnterCommand(obj, E_JUMP_COMMAND)){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(2);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_BLOODDANCE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onKeyFrameFlag_Blooddance_bykk(obj, flagIndex)
|
|
{
|
|
if (!obj) return;
|
|
switch(flagIndex){
|
|
case 1:
|
|
if(obj.getSkillSubState() == 2){
|
|
obj.sq_PlaySound("BLOODDANCE_02");
|
|
obj.sq_PlaySound("SW_BLOODDANCE_02");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onProcCon_Blooddance_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
function checkExecutableSkill_BloodSeal_bykk(obj)
|
|
{
|
|
if(!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DEMONSLAYER_BLOODSEAL);
|
|
if(isUse){
|
|
obj.sq_AddSetStatePacket(84, STATE_PRIORITY_USER, false);
|
|
return true;
|
|
}
|
|
return false;
|
|
|
|
}
|
|
|
|
function checkCommandEnable_BloodSeal_bykk(obj)
|
|
{
|
|
if(!obj) return false;
|
|
local hp = obj.getHp();
|
|
local hpMin = sq_GetLevelData(obj, SKILL_DEMONSLAYER_BLOODSEAL, 4, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_BLOODSEAL));
|
|
if(hp < hpMin) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_BloodSeal_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
obj.sq_StopMove();
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_BLOODSEAL);
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
local hp = obj.getHp();
|
|
local hpMin = sq_GetLevelData(obj, SKILL_DEMONSLAYER_BLOODSEAL, 4, sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_BLOODSEAL));
|
|
obj.sq_SendSetHpPacket(hp - hpMin, true, obj);
|
|
}
|
|
|
|
function onKeyFrameFlag_BloodSeal_bykk(obj, flagIndex)
|
|
{
|
|
if(!obj) return;
|
|
if(flagIndex == 1){
|
|
local skill_level = sq_GetSkillLevel(obj, SKILL_DEMONSLAYER_BLOODSEAL);
|
|
local totalDamage = sq_GetLevelData(obj, SKILL_DEMONSLAYER_BLOODSEAL, 0, skill_level);//迦羅亞多段物理攻擊力
|
|
local totalDamage2 = obj.sq_GetPowerWithPassive(SKILL_DEMONSLAYER_BLOODSEAL, SKILL_DEMONSLAYER_BLOODSEAL, 2, -1, 1.0);//印痕多段物理攻擊力
|
|
local totalDamage3 = sq_GetLevelData(obj, SKILL_DEMONSLAYER_BLOODSEAL, 3, skill_level);//爆炸物理攻擊力
|
|
local sizeRate = sq_GetIntData(obj, SKILL_DEMONSLAYER_BLOODSEAL, 7) * 10;//印痕大小比率
|
|
local damageRate = (totalDamage2.tofloat() / totalDamage.tofloat() * 100.0).tointeger();//印痕多段物理攻擊力百分比
|
|
local damageRate2 = (totalDamage3.tofloat() / totalDamage.tofloat() * 100.0).tointeger();//爆炸物理攻擊力百分比
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj, obj, PASSIVEOBJECT_BYKK_DEMONSLAYER, 50, 0, 75, obj.getDirection(), 2, SKILL_DEMONSLAYER_BLOODSEAL, 1, totalDamage, sizeRate, damageRate, damageRate2, 0, 0, 0, 0, 1);
|
|
}
|
|
}
|
|
|
|
function onEndCurrentAni_BloodSeal_bykk(obj)
|
|
{
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_USER, false);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
function checkExecutableSkill_Groupdance_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
local isUse = obj.sq_IsUseSkill(SKILL_DEMONSLAYER_GROUPDANCE);
|
|
if (isUse){
|
|
obj.sq_IntVectClear();
|
|
obj.sq_IntVectPush(0);
|
|
obj.sq_AddSetStatePacket(SKILL_DEMONSLAYER_GROUPDANCE, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function checkCommandEnable_Groupdance_bykk(obj)
|
|
{
|
|
if (!obj) return false;
|
|
return true;
|
|
}
|
|
|
|
function onSetState_Groupdance_bykk(obj, state, datas, isResetTimer)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.sq_GetVectorData(datas, 0);
|
|
obj.setSkillSubState(subState);
|
|
obj.sq_StopMove();
|
|
switch(subState){
|
|
case 0:
|
|
// BodyCalldaimus(obj, "groupdance");
|
|
obj.sq_SetCurrentAnimation(ANIMATION_DEMONSLAYER_GROUPDANCE);
|
|
obj.sq_PlaySound("DANCE_APPEAR");
|
|
obj.sq_PlaySound("SW_DANCE");
|
|
break;
|
|
}
|
|
obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0);
|
|
}
|
|
|
|
function onEndCurrentAni_Groupdance_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
obj.sq_IntVectClear();
|
|
obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_IGNORE_FORCE, true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onAttack_Groupdance_bykk(obj, damager, boundingBox, isStuck)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onEnterFrame_Groupdance_bykk(obj, frameIndex)
|
|
{
|
|
if(!obj) return;
|
|
local subState = obj.getSkillSubState();
|
|
switch(subState){
|
|
case 0:
|
|
switch(frameIndex){
|
|
case 0:
|
|
obj.getVar("groupdance_boss").clear_obj_vector();
|
|
obj.getVar("groupdance_named").clear_obj_vector();
|
|
obj.getVar("groupdance_normal").clear_obj_vector();
|
|
obj.getVar("groupdance_target").clear_obj_vector();
|
|
local objectManager = obj.getObjectManager();
|
|
local objectNumber = objectManager.getCollisionObjectNumber();
|
|
local range = sq_GetIntData(obj, SKILL_DEMONSLAYER_GROUPDANCE, 0);
|
|
for (local i = 0; i < objectNumber; i++){
|
|
local object = objectManager.getCollisionObject(i);
|
|
if(object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && sq_Abs(sq_GetXPos(obj) - sq_GetXPos(object)) < range && sq_Abs(sq_GetYPos(obj) - sq_GetYPos(object)) < range / 2){
|
|
local activeObj = sq_GetCNRDObjectToActiveObject(object);
|
|
if(sq_IsBoss(activeObj)) obj.getVar("groupdance_boss").push_obj_vector(activeObj);
|
|
else if(sq_IsNamed(activeObj)) obj.getVar("groupdance_named").push_obj_vector(activeObj);
|
|
else obj.getVar("groupdance_normal").push_obj_vector(activeObj);
|
|
}
|
|
}
|
|
if(obj.getVar("groupdance_boss").get_obj_vector_size() > 0){
|
|
for(local i = 0; i < obj.getVar("groupdance_boss").get_obj_vector_size(); i++){
|
|
local targetObj = obj.getVar("groupdance_boss").get_obj_vector(i);
|
|
if(targetObj) obj.getVar("groupdance_target").push_obj_vector(targetObj);
|
|
}
|
|
}
|
|
if(obj.getVar("groupdance_named").get_obj_vector_size() > 0){
|
|
for(local i = 0; i < obj.getVar("groupdance_named").get_obj_vector_size(); i++){
|
|
local targetObj = obj.getVar("groupdance_named").get_obj_vector(i);
|
|
if(targetObj) obj.getVar("groupdance_target").push_obj_vector(targetObj);
|
|
}
|
|
}
|
|
if(obj.getVar("groupdance_normal").get_obj_vector_size() > 0){
|
|
for(local i = 0; i < obj.getVar("groupdance_normal").get_obj_vector_size(); i++){
|
|
local targetObj = obj.getVar("groupdance_normal").get_obj_vector(i);
|
|
if(targetObj) obj.getVar("groupdance_target").push_obj_vector(targetObj);
|
|
}
|
|
}
|
|
break;
|
|
case 6:
|
|
local target_number = obj.getVar("groupdance_target").get_obj_vector_size();
|
|
local create_number = sq_GetIntData(obj, SKILL_DEMONSLAYER_GROUPDANCE, 1);
|
|
local targetMax = 5;
|
|
obj.getVar("groupdance_sub").setInt(10, 0);
|
|
if(sq_GetIntData(obj, SKILL_DEMONSLAYER_GROUPDANCE, 14) > 10 || GROUPDANCE_STONE > 0){targetMax = 10; create_number = create_number + 10;}
|
|
local baseangle = sq_getRandom(0,60);
|
|
if(target_number > 0){
|
|
for(local ui = 0; ui < target_number; ui++){
|
|
local targetObj = obj.getVar("groupdance_target").get_obj_vector(ui);
|
|
if(targetObj){
|
|
local id = sq_GetObjectId(targetObj);
|
|
for(local i = 0; i < targetMax; i++){
|
|
if(obj.getVar("groupdance_sub").getInt(10) >= create_number) return;
|
|
obj.getVar("groupdance_sub").setInt(10, obj.getVar("groupdance_sub").getInt(10) + 1);
|
|
local angle = 360 / targetMax * i + baseangle;
|
|
local x = (sq_Cos(sq_ToRadian(angle.tofloat())) * 150.0).tointeger();
|
|
local y = (sq_Sin(sq_ToRadian(angle.tofloat())) * 50.0).tointeger();
|
|
local sub = i % 5;//2;//
|
|
if(sq_GetIntData(obj, SKILL_DEMONSLAYER_GROUPDANCE, 14) > 10 || GROUPDANCE_STONE > 0) sub = i % 5;
|
|
local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_GROUPDANCE, -1, 0, 1.0) + 100;//破
|
|
switch(sub){
|
|
case 1: totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_GROUPDANCE, -1, 1, 1.0) + 100; break;//舞
|
|
case 2: totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_GROUPDANCE, -1, 2, 1.0) + 100; break;//刺
|
|
case 3: totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_GROUPDANCE, -1, 3, 1.0) + 100; break;//滅
|
|
case 4: totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_DEMONSLAYER_GROUPDANCE, -1, 4, 1.0) + 100; break;//血飲狂舞
|
|
}
|
|
// print("sub = "+sub+" , totalDamage = "+totalDamage);
|
|
sq_AddDrawOnlyAniFromParent(obj, "passiveobject/atswordman_bykk/demonslayer/animation/atgroupdance/appear_dance_fog.ani", x, y, 0);
|
|
cearteSkillPassiveObj_AtSwordMan_bykk(obj, obj, PASSIVEOBJECT_BYKK_DEMONSLAYER, x, y, 0, obj.getDirection(), 2, SKILL_DEMONSLAYER_GROUPDANCE, 1, totalDamage, sub, id, 0, 0, 0, 0, 0, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
function onEndState_Groupdance_bykk(obj, newState)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onProc_Groupdance_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function onKeyFrameFlag_Groupdance_bykk(obj, flagIndex)
|
|
{
|
|
if (!obj) return;
|
|
}
|
|
|
|
function onProcCon_Groupdance_bykk(obj)
|
|
{
|
|
if(!obj) return;
|
|
}
|
|
|
|
function setGroupdance_AtSwordman_bykk(obj, drawObj, targetObj)
|
|
{
|
|
if(!obj) return;
|
|
|
|
local X = drawObj.getXPos();
|
|
local Y = drawObj.getYPos();
|
|
|
|
local posX = obj.getVar("move").getInt(12);
|
|
local posY = targetObj.getYPos();
|
|
|
|
local offsetX = sq_Abs(X - posX);
|
|
local offsetY = Y - posY;
|
|
local atan = sq_Atan2(offsetX.tofloat(), offsetY.tofloat()) + 1.57;
|
|
if((X < posX && obj.getDirection() == ENUM_DIRECTION_LEFT) || (X > posX && obj.getDirection() == ENUM_DIRECTION_RIGHT)){
|
|
if(Y < posY) atan = atan + 2.355;
|
|
else atan = atan - 1.57;
|
|
}
|
|
local pAni = drawObj.getCurrentAnimation();
|
|
sq_SetfRotateAngle(pAni, -atan);
|
|
}
|
|
|