//抛沙 function checkExecutableSkill_ThrowSand(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_THROWSAND); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_THROWSAND, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_ThrowSand(obj) { if (!obj) return false; return true; } function onSetState_ThrowSand(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: local Ani = obj.sq_GetThrowChargeAni(0); obj.setCurrentAnimation(Ani); local currentAni = obj.getCurrentAnimation(); currentAni.setSpeedRate(400.0); break; case 1: local Ani = obj.sq_GetThrowShootAni(0); obj.setCurrentAnimation(Ani); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.3, 1.3); obj.sq_PlaySound("VERRICKTM_SAND"); local currentAni = obj.getCurrentAnimation(); obj.setTimeEvent(1, currentAni.getDelaySum(0, 1), 1, false); obj.setTimeEvent(3, currentAni.getDelaySum(0, 2), 1, false); break; } } function onEndCurrentAni_ThrowSand(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_FWBYKK_THROWSAND, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_ThrowSand(obj) { if(!obj) return; } function onKeyFrameFlag_ThrowSand(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_ThrowSand(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_THROWSAND, -1, 2, 1.0); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)){ totalDamage = totalDamage * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 1, sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW))) / 100; } local sizeRate = sq_GetIntData(obj, SKILL_FWBYKK_THROWSAND, 2); local offset = 0; if(sq_GetDirection(obj) == ENUM_DIRECTION_LEFT) offset = -40; sq_CreateParticle("passiveobject/1_fighter_bykk/particle/throwsandparticle1.ptl", obj, offset, 0, 50, true, 30, 0, 1); // sq_CreateParticle("passiveobject/character/fighter/particle/throwsandparticle2.ptl", obj, 50, 0, 50, true, 100, 0, 1); local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "passiveobject/character/fighter/animation/throwsand2_"+sq_getRandom(1,2).tostring()+".ani", 100, 0, 60); sq_SetCustomRotate(pooledObj, sq_ToRadian(sq_getRandom(100, 200).tofloat())); local pAni = pooledObj.getCurrentAnimation(); pAni.setSpeedRate(200.0); if(sizeRate > 100){ local currentAni = obj.getCurrentAnimation(); obj.setTimeEvent(2, currentAni.getDelaySum(2, 2), 1, false); } local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_THROWSAND); local proc = sq_GetLevelData(obj, SKILL_FWBYKK_THROWSAND, 0, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_THROWSAND, 3, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; local decreaseRate = sq_GetLevelData(obj, SKILL_FWBYKK_THROWSAND, 4, skillLevel); local decreaseRate2 = sq_GetLevelData(obj, SKILL_FWBYKK_THROWSAND, 5, skillLevel); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,0,50,sq_GetDirection(obj),3,SKILL_FWBYKK_THROWSAND,1,totalDamage,sizeRate,proc,time,level,decreaseRate,decreaseRate2,0); break; case 2: local offset = 0; if(sq_GetDirection(obj) == ENUM_DIRECTION_LEFT) offset = -40; sq_CreateParticle("passiveobject/1_fighter_bykk/particle/throwsandparticle1.ptl", obj, offset + 40, 0, 50, true, 30, 0, 1); break; case 3: if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW) && obj.getVar("ThrowSandBool").getBool(0) == false){//DOUBLETHROW obj.getVar("ThrowSandBool").setBool(0, true); obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_FWBYKK_THROWSAND, STATE_PRIORITY_AUTO, true); } break; } } function onEndState_ThrowSand(obj, new_state) { if(!obj) return; if(new_state != STATE_FWBYKK_THROWSAND){ obj.getVar("ThrowSandBool").setBool(0, false); } } //擒月炎 function checkExecutableSkill_GrabExplosion(obj) { if (!obj) return false; // return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_GRABEXPLOSION); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_GRABEXPLOSION, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_GrabExplosion(obj) { if (!obj) return false; return true; } function onSetState_GrabExplosion(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(ANI_FWBYKK_GRABEXPLOSION); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 0, 1.0); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_GRABEXPLOSION)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); obj.getVar("GrabExplosionBool").setBool(0, true); obj.getVar("GrabExplosionTar").clear_obj_vector(); obj.getVar("GrabExplosionTarFix").clear_obj_vector(); obj.sq_PlaySound("FT_GRIP"); break; } } function onEndCurrentAni_GrabExplosion(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_GrabExplosion(obj) { if(!obj) return; } function onProc_GrabExplosion(obj) { if(!obj) return; if(sq_GetCurrentFrameIndex(obj) == 8){ if(obj.getVar("GrabExplosionBool").getBool(0) == false){ obj.setSkillCommandEnable(SKILL_FWBYKK_GRABEXPLOSION, true); local b_useskill = obj.sq_IsEnterSkill(SKILL_FWBYKK_GRABEXPLOSION); if(b_useskill != -1){ if(obj.isExistTimeEvent(1)) obj.stopTimeEvent(1); obj.setTimeEvent(1, 50, 1, true); } } else{ if(!obj.isExistTimeEvent(2)){ local currentAni = obj.getCurrentAnimation(); local speedRate = 15000 / currentAni.getDelaySum(0, 0); local delay = 10000 / speedRate; obj.setTimeEvent(2, delay, 1, false); } } } } function onKeyFrameFlag_GrabExplosion(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 1000: local size = obj.getVar("GrabExplosionTar").get_obj_vector_size(); local apdPath = "character/fighter/3streetfighter_bykk/ap_grabexplosion_hold.nut"; if(size > 0){ local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(9, 11); for(local i = 0; i < size; i++){ local targetObj = obj.getVar("GrabExplosionTar").get_obj_vector(i); if(targetObj && targetObj.getState() != STATE_DIE && !sq_IsFixture(targetObj)){ local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, apdPath); if(addAppendage){ sq_MoveToAppendageForce(targetObj, obj, obj, 200, 0, 55, delay, true, addAppendage); } } } } break; case 1001: local currentAni = obj.getCurrentAnimation(); local speedRate = 15000 / currentAni.getDelaySum(0, 0); local delay = 30000 / speedRate; obj.setTimeEvent(3, delay, 1, false); break; } return true; } function onTimeEvent_GrabExplosion(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/grabexplosion1.ani"), 0, 0); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/grabexplosion2.ani"), 0, 0); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/grabexplosion3.ani"), 0, 0); if(obj.getVar("GrabExplosionTarFix").get_obj_vector_size() > 0) break; local currentAni = obj.getCurrentAnimation(); currentAni.setCurrentFrameWithChildLayer(9); local delay = currentAni.getDelaySum(9, 11) obj.getVar("GrabExplosionSet").setInt(0, sq_GetXPos(obj)); obj.setTimeEvent(4, 10, delay / 10, true); break; case 2: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; case 3: obj.sq_PlaySound("FT_BAST"); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 1, 1.0); local sizeRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 2, 1.0) + 100; local addRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 3, 1.0) + 100; local activeStatusCount = obj.getVar("GrabExplosionSet").getInt(1); if(activeStatusCount > 0) totalDamage = totalDamage * (100 + addRate * activeStatusCount) / 100; local proc = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 4, 1.0) + 100; local time = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 6, 1.0) + 100; local level = sq_GetSkillLevel(obj, 174) + 5; createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,50,0,75,sq_GetDirection(obj),3,SKILL_FWBYKK_GRABEXPLOSION,1,totalDamage,sizeRate,proc,time,level,0,0,0); local size = obj.getVar("GrabExplosionTar").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local targetObj = obj.getVar("GrabExplosionTar").get_obj_vector(i); if(targetObj){ CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/fighter/3streetfighter_bykk/ap_grabexplosion_hold.nut"); } } } local currentAni = obj.getCurrentAnimation(); local speedRate = 15000 / currentAni.getDelaySum(0, 0); local delay = 50000 / speedRate; obj.setTimeEvent(2, delay, 1, false); break; case 4: local v = sq_GetUniformVelocity(0, 150, timeEventCount, 10); local dstX = sq_GetDistancePos(obj.getVar("GrabExplosionSet").getInt(0), obj.getDirection(), v); if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX); break; } } function onEndState_GrabExplosion(obj, new_state) { if(!obj) return; } function onAttack_GrabExplosion(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(!obj.getVar("GrabExplosionTar").is_obj_vector(damager)) obj.getVar("GrabExplosionTar").push_obj_vector(damager); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSPIRIT); if(obj.getVar("GrabExplosionBool").getBool(0)){ obj.getVar("GrabExplosionBool").setBool(0, false); if(!obj.getVar("GrabExplosionTarFix").is_obj_vector(damager) && sq_IsFixture(damager)) obj.getVar("GrabExplosionTarFix").push_obj_vector(damager); local activeObj = sq_GetCNRDObjectToActiveObject(damager); local activeStatusCount = 0; for(local i = 0; i < 17; i++){ if(sq_IsValidActiveStatus(activeObj, i)) activeStatusCount = activeStatusCount + 1; if(activeStatusCount >= 3) break; } obj.getVar("GrabExplosionSet").setInt(1, activeStatusCount); // print("activeStatusCount = "+activeStatusCount); if(skillLevel > 0){ local currentAni = obj.getCurrentAnimation(); local speedRate = 15000 / currentAni.getDelaySum(0, 0); local delay = 10000 / speedRate; local holdTime = sq_GetLevelData(obj, SKILL_FWBYKK_POISONSPIRIT, 0, skillLevel); local group = sq_GetGroup(damager); local uniqueId = sq_GetUniqueId(damager); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 1, 1.0); local sizeRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 2, 1.0) + 100; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)){ sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 3, sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW))) / 100; } local addRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 3, 1.0) + 100; if(activeStatusCount > 0) totalDamage = totalDamage * (100 + addRate * activeStatusCount) / 100; local proc = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 4, 1.0) + 100; local time = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 6, 1.0) + 100; local level = sq_GetSkillLevel(obj, 174) + 5; createSkillPassive_Fighter_bykk(obj,damager,PASSIVEOBJNUM_FWBYKK,0,0,sq_GetCenterZPos(boundingBox),sq_GetDirection(obj),3,SKILL_FWBYKK_GRABEXPLOSION,2,totalDamage,sizeRate,holdTime,group,uniqueId,proc,time,level); obj.setTimeEvent(2, delay, 1, false); } else{ local apdPath = "character/fighter/3streetfighter_bykk/ap_grabexplosion_hold.nut"; if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath)){ local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, apdPath, true); sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL, AddAppendage); if(!sq_IsFixture(damager)){ sq_MoveToAppendageForce(damager, obj, obj, 75, 0, 0, 100, true, AddAppendage); } } obj.setTimeEvent(1, 1500, 1, false); } if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSION, -1, 11, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } } function proc_appendage_grabexplosion_hold(appendage) { if(!appendage) return; local sourceObj = appendage.getSource(); if(!sourceObj) { appendage.setValid(false); return; } } //涂毒 function checkExecutableSkill_EnchantPoison(obj) { if (!obj) return false; print("test"); local isUse = obj.sq_IsUseSkill(0); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(0, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_EnchantPoison(obj) { if (!obj) return false; return true; } function onSetState_EnchantPoison(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(120); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); } function onEndCurrentAni_EnchantPoison(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_EnchantPoison(obj) { if(!obj) return; } function onKeyFrameFlag_EnchantPoison(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_EnchantPoison(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_EnchantPoison(obj, new_state) { if(!obj) return; } //毒影针 function checkExecutableSkill_HiddenSting(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_HIDDENSTING); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_HIDDENSTING, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_HiddenSting(obj) { if (!obj) return false; return true; } function onSetState_HiddenSting(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: local passive_90Level = sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSPIRIT); if(passive_90Level > 0) obj.sq_SetCurrentAnimation(ANI_FWBYKK_HIDDENSTING_POISONSPIRIT_BODY); else{ obj.sq_SetCurrentAnimation(ANI_FWBYKK_HIDDENSTING); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/hiddenstingpin.ani"), 0, 0); local aniPath = "character/fighter/effect/animation/hiddenstingdrop.ani"; sq_AddDrawOnlyAniFromParent(obj, aniPath, 0, 0, 0); } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_HIDDENSTING, -1, 0, 1.0); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_HIDDENSTING); local stunTime = sq_GetLevelData(obj, SKILL_FWBYKK_HIDDENSTING, 1, skillLevel); if(passive_90Level > 0){ local currentAni = obj.getCurrentAnimation(); sq_ClearAttackBox(currentAni); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_HIDDENSTING,1,totalDamage,stunTime,0,0,0,0,0,0); } else{ sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_HIDDENSTING)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local attackInfo = sq_GetCurrentAttackInfo(obj); sq_SetAttackInfoForceHitStunTime(attackInfo, stunTime); } obj.sq_PlaySound("FT_HIDDEN_STING"); break; } } function onEndCurrentAni_HiddenSting(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_HiddenSting(obj) { if(!obj) return; } function onKeyFrameFlag_HiddenSting(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_HiddenSting(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_HiddenSting(obj, new_state) { if(!obj) return; } function onAttack_HiddenSting(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_HIDDENSTING); local prob = sq_GetLevelData(obj, SKILL_FWBYKK_HIDDENSTING, 2, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_HIDDENSTING, 3, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; sq_sendSetActiveStatusPacket(damager, obj, ACTIVESTATUS_BLEEDING, prob.tofloat(), level, false, time); sq_sendSetActiveStatusPacket(damager, obj, ACTIVESTATUS_SLOW, prob.tofloat(), level, false, time); if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_HIDDENSTING, -1, 13, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } //砖袭 function checkExecutableSkill_BlockBuster(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_BLOCKBUSTER); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_BLOCKBUSTER, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_BlockBuster(obj) { if (!obj) return false; return true; } function onSetState_BlockBuster(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(ANI_FWBYKK_BLOCKBUSTER); obj.sq_AddStateLayerAnimation(3,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/blockbusterblock1.ani"), 0, 0); obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/blockbusterblock2.ani"), 0, 0); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/blockbusterglow.ani"), 0, 0); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_BLOCKBUSTER, -1, 0, 1.0); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_BLOCKBUSTER); local proc = sq_GetLevelData(obj, SKILL_FWBYKK_BLOCKBUSTER, 1, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_BLOCKBUSTER, 3, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_BLOCKBUSTER)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local attackInfo = sq_GetCurrentAttackInfo(obj); sq_SetChangeStatusIntoAttackInfo(attackInfo, 0, ACTIVESTATUS_STUN, proc, level, time); obj.sq_PlaySound("FT_CRASH_MINE"); obj.getVar("BlockBusterBool").setBool(0, true); break; } } function onEndCurrentAni_BlockBuster(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: // if(true && obj.getVar("BlockBusterBool").getBool(1)){ // obj.getVar("BlockBusterBool").setBool(1, false); // obj.sq_IntVectClear(); // obj.sq_IntVectPush(0); // obj.sq_AddSetStatePacket(STATE_FWBYKK_BLOCKBUSTER, STATE_PRIORITY_IGNORE_FORCE, true); // return; // } obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_BlockBuster(obj) { if(!obj) return; } function onKeyFrameFlag_BlockBuster(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_BlockBuster(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_BlockBuster(obj, new_state) { if(!obj) return; // if(new_state != STATE_FWBYKK_BLOCKBUSTER){ // obj.getVar("BlockBusterBool").setBool(1, true); // } } function onAttack_BlockBuster(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSPIRIT); if(obj.getVar("BlockBusterBool").getBool(0)){ obj.getVar("BlockBusterBool").setBool(0, false); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_BLOCKBUSTER, -1, 0, 1.0); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_BLOCKBUSTER); local proc = sq_GetLevelData(obj, SKILL_FWBYKK_BLOCKBUSTER, 1, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_BLOCKBUSTER, 3, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; local sizeRate = sq_GetIntData(obj, SKILL_FWBYKK_BLOCKBUSTER, 2); createSkillPassive_Fighter_bykk(obj,damager,PASSIVEOBJNUM_FWBYKK,0,0,sq_GetCenterZPos(boundingBox),sq_GetDirection(obj),3,SKILL_FWBYKK_BLOCKBUSTER,1,totalDamage,proc,time,level,sizeRate,0,0,0); } if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_BLOCKBUSTER, -1, 8, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } //伏虎霸王拳 function checkExecutableSkill_Mount(obj) { if (!obj) return false; // return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_MOUNT); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_MOUNT, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Mount(obj) { if (!obj) return false; return true; } function onSetState_Mount(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(ANI_FWBYKK_MOUNTTRY); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/mounttry.ani"), 0, 0); obj.getVar("MontCount").setInt(0, 0); obj.getVar("MountBool").setBool(0, true); obj.getVar("MountBool").setBool(1, false); obj.getVar("MountTar").clear_obj_vector(); obj.getVar("MountTarFix").clear_obj_vector(); obj.sq_PlaySound("FT_MOUNTAIN"); break; case 1: if(sq_GetSkillLevel(obj, SKILL_FWBYKK_CRAZYMOUNT) > 0){ obj.sq_SetCurrentAnimation(ANI_FWBYKK_CRAZYMOUNTSTART); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/crazymountstart.ani"), 0, 0); obj.sq_PlaySound("R_FT_MOUNTAIN_ATK"); } else obj.sq_SetCurrentAnimation(ANI_FWBYKK_MOUNT); break; case 2: if(sq_GetSkillLevel(obj, SKILL_FWBYKK_CRAZYMOUNT) > 0){ obj.sq_SetCurrentAnimation(ANI_FWBYKK_CRAZYMOUNTLEFT); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/crazymountlleft.ani"), 0, 0); } else obj.sq_SetCurrentAnimation(ANI_FWBYKK_MOUNTLEFT); obj.sq_PlaySound("R_FT_MOUNTAIN_ATK"); break; case 3: if(sq_GetSkillLevel(obj, SKILL_FWBYKK_CRAZYMOUNT) > 0){ obj.sq_SetCurrentAnimation(ANI_FWBYKK_CRAZYMOUNTRIGHT); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/crazymountright.ani"), 0, 0); } else obj.sq_SetCurrentAnimation(ANI_FWBYKK_MOUNTRIGHT); obj.sq_PlaySound("R_FT_MOUNTAIN_ATK"); break; case 4: if(sq_GetSkillLevel(obj, SKILL_FWBYKK_CRAZYMOUNT) > 0){ obj.sq_SetCurrentAnimation(ANI_FWBYKK_CRAZYMOUNTEND); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/crazymountend.ani"), 0, 0); } else{ obj.sq_SetCurrentAnimation(ANI_FWBYKK_MOUNTEND); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/mountend.ani"), 0, 0); } obj.sq_PlaySound("R_FT_MOUNTAIN_ATK"); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_MOUNT, -1, 0, 1.0); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_MOUNT)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); } function onEndCurrentAni_Mount(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: if((obj.getVar("MountTarFix").get_obj_vector_size() > 0 || (obj.getVar("MountTarFix").get_obj_vector_size() == 0 && obj.getVar("MountTar").get_obj_vector_size() == 0)) && sq_GetSkillLevel(obj, SKILL_FWBYKK_CRAZYMOUNT) > 0){ obj.getVar("MountBool").setBool(1, true); obj.sq_IntVectClear(); obj.sq_IntVectPush(4); obj.sq_AddSetStatePacket(STATE_FWBYKK_MOUNT, STATE_PRIORITY_AUTO, true); break; } else if(obj.getVar("MountTar").get_obj_vector_size() > 0){ obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_FWBYKK_MOUNT, STATE_PRIORITY_AUTO, true); break; } else{ obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); } break; case 1: obj.sq_IntVectClear(); obj.sq_IntVectPush(2); obj.sq_AddSetStatePacket(STATE_FWBYKK_MOUNT, STATE_PRIORITY_AUTO, true); break; case 2: case 3: local hitMax = sq_GetIntData(obj, SKILL_FWBYKK_MOUNT, 0); if(sq_GetSkillLevel(obj, SKILL_FWBYKK_CRAZYMOUNT) > 0) hitMax = sq_GetIntData(obj, SKILL_FWBYKK_CRAZYMOUNT, 0) - 1; if(obj.getVar("MontCount").getInt(0) < hitMax){ obj.getVar("MontCount").setInt(0, obj.getVar("MontCount").getInt(0) + 1); obj.sq_IntVectClear(); obj.sq_IntVectPush(subState>2?2:3); obj.sq_AddSetStatePacket(STATE_FWBYKK_MOUNT, STATE_PRIORITY_AUTO, true); } else{ obj.sq_IntVectClear(); obj.sq_IntVectPush(4); obj.sq_AddSetStatePacket(STATE_FWBYKK_MOUNT, STATE_PRIORITY_AUTO, true); } break; case 4: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Mount(obj) { if(!obj) return; } function onKeyFrameFlag_Mount_bykk(obj, flagIndex) { if(!obj) return; switch(flagIndex){ case 101: local subState = obj.getSkillSubState(); local passiveskillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_CRAZYMOUNT); switch(subState){ case 1: case 2: case 3: local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_MOUNT, -1, 0, 1.0); local sizeRate = 100; if(passiveskillLevel > 0){ totalDamage = totalDamage * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_CRAZYMOUNT, 0, passiveskillLevel)) / 100; sizeRate = sizeRate + obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_CRAZYMOUNT, -1, 5, 1.0) + 100; local addRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_CRAZYMOUNT, -1, 3, 1.0) + 100; local sizeAddRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_CRAZYMOUNT, -1, 4, 1.0) + 100; local activeStatusCount = obj.getVar("MountSet").getInt(0); if(activeStatusCount > 0){ totalDamage = totalDamage * (100 + addRate * activeStatusCount) / 100; sizeRate = sizeRate * (100 + sizeAddRate * activeStatusCount) / 100; } createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,65,subState==2?-5:5,0,sq_GetDirection(obj),3,SKILL_FWBYKK_MOUNT,2,totalDamage,sizeRate,subState,0,0,0,0,0); break; } createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,65,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_MOUNT,1,totalDamage,sizeRate,subState,0,0,0,0,0); break; case 4: local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_MOUNT, -1, 1, 1.0); local sizeRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_MOUNT, -1, 2, 1.0) + 100; if(passiveskillLevel > 0){ totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_CRAZYMOUNT, -1, 2, 1.0); sizeRate = sizeRate + obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_CRAZYMOUNT, -1, 5, 1.0) + 100; local addRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_CRAZYMOUNT, -1, 3, 1.0) + 100; local sizeAddRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_CRAZYMOUNT, -1, 4, 1.0) + 100; local activeStatusCount = obj.getVar("MountSet").getInt(0); if(activeStatusCount > 0){ totalDamage = totalDamage * (100 + addRate * activeStatusCount) / 100; sizeRate = sizeRate * (100 + sizeAddRate * activeStatusCount) / 100; } } if(obj.getVar("MountBool").getBool(1)){ local changeRate = sq_GetIntData(obj, SKILL_FWBYKK_CRAZYMOUNT, 4); if(changeRate > 100) totalDamage = totalDamage * changeRate / 100; } createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,65,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_MOUNT,3,totalDamage,sizeRate,subState,0,0,0,0,0); break; } break; } return; } function onTimeEvent_Mount(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local size = obj.getVar("MountTar").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local targetObj = obj.getVar("MountTar").get_obj_vector(i); if(targetObj && targetObj.getState() != STATE_DIE){ if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/fighter/3streetfighter_bykk/ap_mount_hold.nut")){ local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(targetObj, obj, -1, false, "character/fighter/3streetfighter_bykk/ap_mount_hold.nut", true); sq_HoldAndDelayDie(targetObj, obj, true, true, true, 200, 200, ENUM_DIRECTION_DOWN, AddAppendage); } } } } break; } } function onEndState_Mount(obj, new_state) { if(!obj) return; } function onAttack_Mount(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(sq_IsFixture(damager)) obj.getVar("MountTarFix").push_obj_vector(damager); else if(!obj.getVar("MountTar").is_obj_vector(damager)) obj.getVar("MountTar").push_obj_vector(damager); if(obj.getVar("MountBool").getBool(0)){ obj.getVar("MountBool").setBool(0, false); local activeObj = sq_GetCNRDObjectToActiveObject(damager); local activeStatusCount = 0; for(local i = 0; i < 17; i++){ if(sq_IsValidActiveStatus(activeObj, i)) activeStatusCount = activeStatusCount + 1; if(activeStatusCount >= 3) break; } obj.getVar("MountSet").setInt(0, activeStatusCount); // print("activeStatusCount = "+activeStatusCount); } if(!sq_IsFixture(damager) && sq_IsHoldable(obj,damager) && sq_IsGrabable(obj,damager)){ local activeObj = sq_GetCNRDObjectToActiveObject(damager); if(sq_GetDirection(activeObj) == sq_GetDirection(obj)) sq_SetCurrentDirection(activeObj, sq_GetOppositeDirection(sq_GetDirection(obj))); obj.setTimeEvent(1, 50, 1, false); } if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_MOUNT, -1, 4, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } function proc_appendage_mount_hold(appendage) { if(!appendage) return; local sourceObj = appendage.getSource(); if(sourceObj && sourceObj.getState() != STATE_FWBYKK_MOUNT) { appendage.setValid(false); return; } } //天罗地网 function checkExecutableSkill_ThrowWeb(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_THROWWEB); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_THROWWEB, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_ThrowWeb(obj) { if (!obj) return false; return true; } function onSetState_ThrowWeb(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(ANI_FWBYKK_THROWWEB_READY); obj.getVar("ThrowWebBool").setBool(0, false); obj.getVar("ThrowWebTar").clear_obj_vector(); obj.sq_PlaySound("FT_NET"); break; case 1: obj.sq_SetCurrentAnimation(ANI_FWBYKK_THROWWEB_SPREAD); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_MOUNT, -1, 2, 1.0); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_MOUNT)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 2: obj.sq_SetCurrentAnimation(ANI_FWBYKK_THROWWEB_THROW); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_MOUNT, -1, 2, 1.0); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_THROWWEB); local prob = sq_GetLevelData(obj, SKILL_FWBYKK_THROWWEB, 0, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_THROWWEB, 4, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; local holdTime = sq_GetLevelData(obj, SKILL_FWBYKK_THROWWEB, 9, skillLevel); local sizeRate = sq_GetIntData(obj, SKILL_FWBYKK_THROWWEB, 2); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)){ local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW); holdTime = holdTime * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 5, skillLevel)) / 100; } createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,100-sizeRate,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_THROWWEB,1,totalDamage,prob,time,level,holdTime,sizeRate,0,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_ThrowWeb(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); if(obj.getVar("ThrowWebBool").getBool(0)) obj.sq_IntVectPush(2); else obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_FWBYKK_THROWWEB, STATE_PRIORITY_AUTO, true); break; case 1: case 2: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_ThrowWeb(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: if(sq_IsKeyDown(OPTION_HOTKEY_MOVE_DOWN, ENUM_SUBKEY_TYPE_ALL)){ obj.getVar("ThrowWebBool").setBool(0, true); } break; } } function onKeyFrameFlag_ThrowWeb(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 2: local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(3, 7); local size = obj.getVar("ThrowWebTar").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local targetObj = obj.getVar("ThrowWebTar").get_obj_vector(i); if(targetObj && targetObj.getState() != STATE_DIE && !sq_IsFixture(targetObj)){ local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, "character/fighter/3streetfighter_bykk/ap_web_hold.nut"); sq_MoveToAppendageForce(targetObj, obj, obj, 100, 0, sq_GetZPos(targetObj), delay, true, addAppendage); } } } obj.sq_PlaySound("FT_NET_PULL"); break; } return true; } function onTimeEvent_ThrowWeb(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_ThrowWeb(obj, new_state) { if(!obj) return; } function onAttack_ThrowWeb(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(!obj.getVar("ThrowWebTar").is_obj_vector(damager)) obj.getVar("ThrowWebTar").push_obj_vector(damager); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_THROWWEB); local prob = sq_GetLevelData(obj, SKILL_FWBYKK_THROWWEB, 0, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_THROWWEB, 4, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; local holdTime = sq_GetLevelData(obj, SKILL_FWBYKK_THROWWEB, 9, skillLevel); sq_sendSetActiveStatusPacket(damager, obj, ACTIVESTATUS_HOLD, prob.tofloat(), level.tointeger(), false, time.tointeger()); if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, "character/fighter/3streetfighter_bykk/ap_web_hold.nut")){ local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, "character/fighter/3streetfighter_bykk/ap_web_hold.nut", true); sq_HoldAndDelayDie(damager, obj, true, true, false, 200, 200, ENUM_DIRECTION_NEUTRAL, AddAppendage); AddAppendage.sq_SetValidTime(holdTime); } if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_THROWWEB, -1, 10, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } //裂地飞沙 function checkExecutableSkill_GroundKick(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_GROUNDKICK); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_GROUNDKICK, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_GroundKick(obj) { if (!obj) return false; return true; } function onSetState_GroundKick(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(ANI_FWBYKK_GROUNDKICKCHARGE); break; case 1: obj.sq_SetCurrentAnimation(ANI_FWBYKK_GROUNDKICKKICK); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GROUNDKICK, -1, 0, 1.0); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_GROUNDKICK)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_GROUNDKICK); local prob = sq_GetLevelData(obj, SKILL_FWBYKK_GROUNDKICK, 1, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_GROUNDKICK, 2, skillLevel); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); } function onEndCurrentAni_GroundKick(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: local currentAni = obj.getCurrentAnimation(); local speedRate = 14700 / currentAni.getDelaySum(0, 0); local delay = 50000 / speedRate; obj.setTimeEvent(1, delay, 1, false); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_GroundKick(obj) { if(!obj) return; } function onKeyFrameFlag_GroundKick(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 1: sq_SetMyShake(obj, 5, 80); sq_CreateParticle("character/fighter/particle/groundkicksand1particle.ptl", obj, 0, 0, 0, true, 30, 0, 1); sq_CreateParticle("character/fighter/particle/groundkicksand1particle2.ptl", obj, 0, 0, 0, true, 30, 0, 1); sq_CreateParticle("character/fighter/particle/groundkickstoneparticle.ptl", obj, 0, 0, 0, true, 30, 0, 1); break; } return true; } function onTimeEvent_GroundKick(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_FWBYKK_GROUNDKICK, STATE_PRIORITY_AUTO, true); break; } } function onEndState_GroundKick(obj, new_state) { if(!obj) return; } function onAttack_GroundKick(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(sq_IsFixture(damager)){ local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GROUNDKICK, -1, 0, 1.0); local bonusRate = sq_GetIntData(obj, SKILL_FWBYKK_GROUNDKICK, 3); totalDamage = totalDamage * bonusRate / 1000; local group = sq_GetGroup(damager); local uniqueId = sq_GetUniqueId(damager); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_GROUNDKICK,1,totalDamage,group,uniqueId,0,0,0,0,0); } local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_GROUNDKICK); local prob = sq_GetLevelData(obj, SKILL_FWBYKK_GROUNDKICK, 1, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_GROUNDKICK, 3, skillLevel); local prob2 = sq_GetLevelData(obj, SKILL_FWBYKK_GROUNDKICK, 4, skillLevel); local time2 = sq_GetLevelData(obj, SKILL_FWBYKK_GROUNDKICK, 6, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; sq_sendSetActiveStatusPacket(damager, obj, ACTIVESTATUS_BLIND, prob.tofloat() * 0.1, level.tointeger(), false, time.tointeger()); sq_sendSetActiveStatusPacket(damager, obj, ACTIVESTATUS_STUN, prob2.tofloat() * 0.1, level.tointeger(), false, time2.tointeger()); if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GROUNDKICK, -1, 8, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } //挑衅 function checkExecutableSkill_Provocation(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_PROVOCATION); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_PROVOCATION, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_Provocation(obj) { if (!obj) return false; return true; } function onSetState_Provocation(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: local Ani = obj.sq_GetThrowChargeAni(2); obj.setCurrentAnimation(Ani); obj.sq_PlaySound("R_FT_PROVOCATION"); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_PROVOCATION); local castTime = sq_GetCastTime(obj, SKILL_FWBYKK_PROVOCATION, skillLevel); local animation = sq_GetCurrentAnimation(obj); local startTime = animation.getDelaySum(false); local speedRate = startTime.tofloat() / castTime.tofloat(); sq_StartDrawCastGauge(obj, castTime, true); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED,SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, speedRate, speedRate); obj.setTimeEvent(1, castTime, 1, false); break; case 1: local Ani = obj.sq_GetThrowShootAni(2); obj.setCurrentAnimation(Ani); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_CAST_SPEED, SPEED_TYPE_CAST_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local currentAni = obj.getCurrentAnimation(); obj.setTimeEvent(2, currentAni.getDelaySum(false), 1, false); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_PROVOCATION); local range = sq_GetLevelData(obj, SKILL_FWBYKK_PROVOCATION, 1, skillLevel) / 2; local allt = sq_GetLevelData(obj, SKILL_FWBYKK_PROVOCATION, 8, skillLevel); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_POISONSNAKE_BUFF)){ allt = allt * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_POISONSNAKE, 13, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSNAKE))) / 100; } local damageIncreaseRate = sq_GetLevelData(obj, SKILL_FWBYKK_PROVOCATION, 10, skillLevel); local buffTime = sq_GetLevelData(obj, SKILL_FWBYKK_PROVOCATION, 0, skillLevel); local stunRate = sq_GetLevelData(obj, SKILL_FWBYKK_PROVOCATION, 2, skillLevel); local aniPath = ["character/fighter/effect/animation/provocation1.ani", "character/fighter/effect/animation/provocation2.ani", "character/fighter/effect/animation/provocation3.ani"]; local sizeRate = range * 100 / 275, direction = sq_GetDirection(obj), x = sq_GetXPos(obj), y = sq_GetYPos(obj); for(local i = 0; i < aniPath.len(); i++){ createOnlyDrawObjectEX_Fighter_bykk(obj,aniPath[i],true,direction,x,y,0,ENUM_DRAWLAYER_NORMAL,sizeRate,sizeRate); } local objectManager = obj.getObjectManager();//得到對象管理器 for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){ local object = objectManager.getCollisionObject(i);//得到控制類對象 if (object && 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); local AddAppendage = CNSquirrelAppendage.sq_GetAppendage(activeObj, APDPATH_PROVOCATION_DEBUFF); if(!AddAppendage){ AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(activeObj, obj, -1, true, APDPATH_PROVOCATION_DEBUFF, true); AddAppendage.sq_SetValidTime(buffTime); } AddAppendage.getVar("custom").setInt(0, damageIncreaseRate); AddAppendage.getVar("custom").setInt(1, buffTime - 3000); AddAppendage.setBuffIconImage(23); local change_appendage = AddAppendage.sq_getChangeStatus("provocationDeBuff"); if(!change_appendage) change_appendage = AddAppendage.sq_AddChangeStatus("provocationDeBuff",activeObj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_ACTIVESTATUS_TOLERANCE_ALL, true, (allt * -0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_STUCK, false, (stunRate * 0.1).tofloat()); } } } break; } } function onEndCurrentAni_Provocation(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_FWBYKK_PROVOCATION, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_Provocation(obj) { if(!obj) return; } function onKeyFrameFlag_Provocation(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_Provocation(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_FWBYKK_PROVOCATION, STATE_PRIORITY_AUTO, true); break; case 2: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onEndState_Provocation(obj, new_state) { if(!obj) return; if(new_state != STATE_FWBYKK_PROVOCATION){ sq_EndDrawCastGauge(obj); } } //毒雷引爆 function checkExecutableSkill_VenomMine(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_VENOMMINE); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_VENOMMINE, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_VenomMine(obj) { if (!obj) return false; return true; } function onSetState_VenomMine(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(ANI_FWBYKK_VENOMMINE_BODY); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); obj.sq_PlaySound("FT_THROW_MINE"); obj.sq_PlaySound("VM_MINE_SWIRL"); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(0, 2); obj.setTimeEvent(1, delay, 1, false); break; } } function onEndCurrentAni_VenomMine(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_VenomMine(obj) { if(!obj) return; } function onKeyFrameFlag_VenomMine(obj, flagIndex) { if(!obj) return false; return true; } function onTimeEvent_VenomMine(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_VENOMMINE, -1, 0, 1.0); local hitMax = sq_GetIntData(obj, SKILL_FWBYKK_VENOMMINE, 14); local sizeRate = sq_GetIntData(obj, SKILL_FWBYKK_VENOMMINE, 8); local increaseRate = 0; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)){ local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW); sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 10, skillLevel)) / 100; increaseRate = sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 9, skillLevel); } for(local i = 0; i < 6; i++){ local angle = 360 / 6 * i + 120; local x = (sq_Cos(sq_ToRadian(angle.tofloat())) * 2.0).tointeger(); local y = (sq_Sin(sq_ToRadian(angle.tofloat())) * 2.0).tointeger(); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,x,y,30,sq_GetDirection(obj),3,SKILL_FWBYKK_VENOMMINE,1,angle,i,increaseRate,0,0,0,0,0); } createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_VENOMMINE,2,totalDamage,hitMax,sizeRate,0,0,0,0,0); break; } } function onEndState_VenomMine(obj, new_state) { if(!obj) return; } //街头风暴 function checkExecutableSkill_JunkSpin(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_JUNKSPIN); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_JUNKSPIN, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_JunkSpin(obj) { if (!obj) return false; return true; } function onSetState_JunkSpin(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(ANI_FWBYKK_JUNKSPIN); // obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/junkspin/front-dodge.ani"), 0, 0); // obj.sq_AddStateLayerAnimation(2,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/junkspin/front-normal.ani"), 0, 0); obj.sq_AddStateLayerAnimation(-2,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/junkspin/back-dodge.ani"), 0, 0); obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/junkspin/back-normal.ani"), 0, 0); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/junkspin/ground-effect.ani"), 0, 0); 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 = 10000 / currentAni.getDelaySum(0, 0); obj.getVar("JunkSpinSet").setInt(0, speedRate); obj.getVar("JunkSpinSet").setInt(1, 0); obj.startRapidInput(); obj.sq_PlaySound("FT_JUNK_SPIN"); obj.sq_PlaySound("JS_TYPHOON_LOOP", 1212); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_JUNKSPIN,1,speedRate,0,0,0,0,0,0,0); break; } } function onEndCurrentAni_JunkSpin(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProc_JunkSpin(obj) { if(!obj) return; 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)){ if(!obj.isExistTimeEvent(1)) obj.setTimeEvent(1, 1000, 1, true); } } function onKeyFrameFlag_JunkSpin(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 101: case 102: local speedRate = obj.getVar("JunkSpinSet").getInt(0); local currentAni = obj.getCurrentAnimation(); if(obj.getRapidInputFrequency() > 0){currentAni.setSpeedRate(speedRate.tofloat() * 3.0);speedRate = speedRate * 3;} else currentAni.setSpeedRate(speedRate.tofloat()); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_JUNKSPIN); local hitMax = sq_GetLevelData(obj, SKILL_FWBYKK_JUNKSPIN, 0, skillLevel); local createMax = sq_GetIntData(obj, SKILL_FWBYKK_JUNKSPIN, 10); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)) createMax = createMax * 2; local count = obj.getVar("JunkSpinSet").getInt(1); local sizeRate = sq_GetIntData(obj, SKILL_FWBYKK_JUNKSPIN, 9); local prob = sq_GetLevelData(obj, SKILL_FWBYKK_JUNKSPIN, 5, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_JUNKSPIN, 4, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; if(count < hitMax){ if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)) obj.getVar("JunkSpinSet").setInt(1, count + createMax / 2); else obj.getVar("JunkSpinSet").setInt(1, count + createMax); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_JUNKSPIN, -1, 1, 1.0); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)){ totalDamage = totalDamage * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 2, sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW))) / 100; } for(local i = 0; i < createMax; i++){ local direction = sq_GetDirection(obj); if(flagIndex == 102) direction = sq_GetOppositeDirection(direction); if(i % 2 == 1) direction = sq_GetOppositeDirection(direction); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,0,0,direction,3,SKILL_FWBYKK_JUNKSPIN,4,totalDamage,sizeRate,speedRate,0,0,0,0,0); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,1,sizeRate,direction,3,SKILL_FWBYKK_JUNKSPIN,2,sizeRate,0,0,0,0,0,0,0); // createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,-10,1,sizeRate,sq_GetOppositeDirection(direction),3,SKILL_FWBYKK_JUNKSPIN,2,sizeRate,0,0,0,0,0,0,0); } } else{ obj.setTimeEvent(1, 1000, 1, true); } break; } return true; } function onTimeEvent_JunkSpin(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_JUNKSPIN); local sizeRate = sq_GetIntData(obj, SKILL_FWBYKK_JUNKSPIN, 9); local prob = sq_GetLevelData(obj, SKILL_FWBYKK_JUNKSPIN, 5, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_JUNKSPIN, 4, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_JUNKSPIN, -1, 2, 1.0); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,-1,40,sq_GetDirection(obj),3,SKILL_FWBYKK_JUNKSPIN,3,totalDamage,sizeRate,prob,time,level,0,0,0); obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onEndState_JunkSpin(obj, new_state) { if(!obj) return; if(new_state != STATE_FWBYKK_JUNKSPIN){ obj.stopSound(1212); } } //死亡毒雾 function checkExecutableSkill_PoisonMist(obj) { if (!obj) return false; if(obj.getVar("PoisonMistBool").getBool(0)){ obj.getVar("PoisonMistBool").setBool(0, false); obj.sq_IntVectClear(); obj.sq_IntVectPush(2); obj.sq_AddSetStatePacket(STATE_FWBYKK_POISONMIST, STATE_PRIORITY_IGNORE_FORCE, true); return false; } local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_POISONMIST); if (isUse){ obj.sq_IntVectClear(); if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(1); else obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_POISONMIST, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_PoisonMist(obj) { if (!obj) return false; return true; } function onSetState_PoisonMist(obj, state, datas, isResetTimer) { if(!obj) return; local subState = obj.sq_GetVectorData(datas, 0); obj.setSkillSubState(subState); obj.sq_StopMove(); switch(subState){ case 0: local ani = obj.sq_GetJumpAni(); obj.setCurrentAnimation(ani); 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(); obj.setTimeEvent(1, currentAni.getDelaySum(0, 5) / 50, 50, true); break; case 1: obj.sq_ZStop(); obj.sq_SetCurrentAnimation(ANI_FWBYKK_POISONMIST); obj.sq_AddStateLayerAnimation(10001,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/poisonmist/start.ani"), 0, 0); obj.sq_PlaySound("FT_POISON_MIST"); obj.getVar("PoisonMistBool").setBool(0, false); break; case 2: obj.sq_SetCurrentAnimation(ANI_FWBYKK_POISONMISTEXPLOSION); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); } function onEndCurrentAni_PoisonMist(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_IntVectPush(0); obj.sq_IntVectPush(sq_GetZPos(obj)); obj.sq_AddSetStatePacket(STATE_JUMP, STATE_PRIORITY_AUTO, true); break; case 2: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_PoisonMist(obj) { if(!obj) return; } function onKeyFrameFlag_PoisonMist(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 101: obj.getVar("PoisonMistObj").clear_obj_vector(); for(local i = 0; i < 10; i++){ local angle = 360 / 10 * i + 0; local x = (sq_Cos(sq_ToRadian(angle.tofloat())) * 10.0).tointeger(); local y = (sq_Sin(sq_ToRadian(angle.tofloat())) * 5.0).tointeger(); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,x,y,0,sq_GetDirection(obj),3,SKILL_FWBYKK_POISONMIST,1,angle,i,sq_GetXPos(obj),sq_GetYPos(obj),0,0,0,0); } break; case 102: local flashScreenObj = obj.getVar("PoisonMistFlash").get_obj_vector(0); local pflashScreen = sq_GetCNRDObjectToFlashScreen(flashScreenObj); if(pflashScreen) pflashScreen.fadeOut(); sq_flashScreen(obj, 0, 0, 200, 66, sq_RGB(190,83,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); local size = obj.getVar("PoisonMistObj").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local atkObj = obj.getVar("PoisonMistObj").get_obj_vector(i); local colObj = sq_GetCNRDObjectToCollisionObject(atkObj); if(colObj){ colObj.setTimeEvent(1, 1000, 1, true); } } } local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMIST, -1, 2, 1.0); local hitMax = sq_GetIntData(obj, SKILL_FWBYKK_POISONMIST, 1); local range = (obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMIST, -1, 5, 1.0) + 100) / 2; createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_POISONMIST,4,totalDamage,hitMax,range,0,0,0,0,0); break; } return true; } function onTimeEvent_PoisonMist(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local v = sq_GetAccel(0, 150, timeEventCount, 50, true); sq_setCurrentAxisPos(obj, 2, v); if(timeEventCount >= 50){ obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_FWBYKK_POISONMIST, STATE_PRIORITY_AUTO, true); } break; } } function onEndState_PoisonMist(obj, new_state) { if(!obj) return; } function proc_appendage_poisonmist_buff(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj && parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } local sourceObj = appendage.getSource(); if(!sourceObj){ appendage.setValid(false); return; } local ttt = appendage.getVar("cooltime").get_timer_vector(0); local currentT = appendage.getTimer().Get(); local activeObj = sq_GetCNRDObjectToActiveObject(parentObj); if(ttt && ttt.isOnEvent(currentT)){ local xPos = appendage.getVar("custom").getInt(0); local yPos = appendage.getVar("custom").getInt(1); local range = appendage.getVar("custom").getInt(2); if(sq_Abs(sq_GetXPos(activeObj) - xPos) > range || sq_Abs(sq_GetYPos(activeObj) - yPos) > range / 2){ appendage.setValid(false); return; } } } function onStart_appendage_poisonmist_buff(appendage) { local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONMIST); local allAttack = sq_GetLevelData(obj, SKILL_FWBYKK_POISONMIST, 8, skillLevel); local speed = sq_GetLevelData(obj, SKILL_FWBYKK_POISONMIST, 9, skillLevel); appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_FWBYKK_POISONMIST, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONMIST)); local change_appendage = appendage.sq_getChangeStatus("poisonmistBuff"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("poisonmistBuff",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, false, (allAttack).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_ATTACK, false, (allAttack).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_ATTACK_SPEED, false, (speed * 1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_MOVE_SPEED, false, (speed * 1).tofloat()); } appendage.getVar("cooltime").clear_timer_vector(); appendage.getVar("cooltime").push_timer_vector(); local ttt = appendage.getVar("cooltime").get_timer_vector(0); ttt.setParameter(1000, -1); ttt.resetInstant(0); sq_SendCreatePassiveObjectPacket(obj, 776104, 0, 0, 0, 0, obj.getDirection()); } function onEnd_appendage_poisonmist_buff(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj && parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); } function proc_appendage_poisonmist_debuff(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj && parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } } function onStart_appendage_poisonmist_debuff(appendage) { local parentObj = appendage.getParent(); local sourceObj = appendage.getSource(); local obj = sq_GetCNRDObjectToSQRCharacter(sourceObj); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONMIST); local allt = sq_GetLevelData(obj, SKILL_FWBYKK_POISONMIST, 6, skillLevel); local allDefense = sq_GetLevelData(obj, SKILL_FWBYKK_POISONMIST, 7, skillLevel); local change_appendage = appendage.sq_getChangeStatus("poisonmistDeBuff"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("poisonmistDeBuff",parentObj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_ACTIVESTATUS_TOLERANCE_ALL, true, (allt * -0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_DEFENSE, false, (allDefense * -1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_DEFENSE, false, (allDefense * -1).tofloat()); } } //猛毒擒月炎 function checkExecutableSkill_GrabExplosionEx(obj) { if (!obj) return false; // return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_GRABEXPLOSIONEX); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_GRABEXPLOSIONEX, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_GrabExplosionEx(obj) { if (!obj) return false; return true; } function onSetState_GrabExplosionEx(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(ANI_FWBYKK_GRABEXPLOSIONEX); obj.sq_AddStateLayerAnimation(-1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/grabexplosionex/blacksmoke.ani"), 0, 0); obj.sq_AddStateLayerAnimation(-2,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/grabexplosionex/blacksmokenormal.ani"), 0, 0); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/grabexplosionex/grabexplosion1.ani"), 0, 0); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/grabexplosionex/grabexplosion2.ani"), 0, 0); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/grabexplosionex/grabexplosion3.ani"), 0, 0); obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSIONEX, -1, 0, 1.0); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_GRABEXPLOSION)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); obj.getVar("GrabExplosionExBool").setBool(0, true); obj.getVar("GrabExplosionExBool").setBool(1, true); obj.getVar("GrabExplosionExTar").clear_obj_vector(); obj.getVar("GrabExplosionExTarFix").clear_obj_vector(); obj.sq_PlaySound("FT_GRIP"); break; } } function onEndCurrentAni_GrabExplosionEx(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_GrabExplosionEx(obj) { if(!obj) return; } function onProc_GrabExplosionEx(obj) { if(!obj) return; local frameIndex = sq_GetCurrentFrameIndex(obj); if(frameIndex == 8){ if(obj.getVar("GrabExplosionExTar").get_obj_vector_size() < 1){ if(!obj.isExistTimeEvent(2)) obj.setTimeEvent(2, 100, 1, false); return; } } if(frameIndex > 8 && frameIndex < 13){ if(obj.getVar("GrabExplosionExBool").getBool(0) == false){ obj.setSkillCommandEnable(SKILL_FWBYKK_GRABEXPLOSIONEX, true); local b_useskill = obj.sq_IsEnterSkill(SKILL_FWBYKK_GRABEXPLOSIONEX); if(b_useskill != -1){ local currentAni = obj.getCurrentAnimation(); currentAni.setCurrentFrameWithChildLayer(13); } } } } function onKeyFrameFlag_GrabExplosionEx(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 1000: local size = obj.getVar("GrabExplosionExTar").get_obj_vector_size(); local apdPath = "character/fighter/3streetfighter_bykk/ap_grabexplosion_hold.nut"; if(size > 0){ local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(9, 11); for(local i = 0; i < size; i++){ local targetObj = obj.getVar("GrabExplosionExTar").get_obj_vector(i); if(targetObj && targetObj.getState() != STATE_DIE && !sq_IsFixture(targetObj)){ local addAppendage = CNSquirrelAppendage.sq_GetAppendage(targetObj, apdPath); if(addAppendage){ sq_MoveToAppendageForce(targetObj, obj, obj, 150, 0, 55, delay, true, addAppendage); } } } } break; case 1001: obj.sq_PlaySound("FT_BAST"); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSIONEX, -1, 1, 1.0); local sizeRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSIONEX, -1, 2, 1.0) + 200; local addRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSIONEX, -1, 3, 1.0) + 100; local activeStatusCount = obj.getVar("GrabExplosionExSet").getInt(1); if(activeStatusCount > 0) totalDamage = totalDamage * (100 + addRate * activeStatusCount) / 100; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)){ local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW); sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 7, skillLevel)) / 100; } local proc = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSIONEX, -1, 12, 1.0) + 100; local time = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSIONEX, -1, 14, 1.0) + 100; local level = sq_GetSkillLevel(obj, 174) + 5; createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,65,0,90,sq_GetDirection(obj),3,SKILL_FWBYKK_GRABEXPLOSIONEX,1,totalDamage,sizeRate,proc,time,level,0,0,0); local size = obj.getVar("GrabExplosionExTar").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local targetObj = obj.getVar("GrabExplosionExTar").get_obj_vector(i); if(targetObj){ CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/fighter/3streetfighter_bykk/ap_grabexplosion_hold.nut"); } } } local appendage = obj.getVar("GrabExplosionExApd").getAppendage(0); if(appendage) appendage.setValid(false); break; } return true; } function onTimeEvent_GrabExplosionEx(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local currentAni = obj.getCurrentAnimation(); currentAni.setCurrentFrameWithChildLayer(9); obj.sq_AddStateLayerAnimation(1,obj.sq_CreateCNRDAnimation("effect/animation/3_streetfighter_bykk/grabexplosionex/tractnormal.ani"), 65, -90); local range = 400; local appendage = sq_AttractToMe(obj, range, 65, 200); obj.getVar("GrabExplosionExApd").setAppendage(0, appendage); if(obj.getVar("GrabExplosionExTarFix").get_obj_vector_size() > 0) break; local delay = currentAni.getDelaySum(9, 10); obj.getVar("GrabExplosionExSet").setInt(0, sq_GetXPos(obj)); obj.setTimeEvent(4, 10, delay / 10, true); break; case 2: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; case 3: break; case 4: local v = sq_GetUniformVelocity(0, 150, timeEventCount, 10); local dstX = sq_GetDistancePos(obj.getVar("GrabExplosionExSet").getInt(0), obj.getDirection(), v); if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX); break; } } function onEndState_GrabExplosionEx(obj, new_state) { if(!obj) return; if(new_state != STATE_FWBYKK_GRABEXPLOSIONEX){ local appendage = obj.getVar("GrabExplosionExApd").getAppendage(0); if(appendage) appendage.setValid(false); local size = obj.getVar("GrabExplosionExTar").get_obj_vector_size(); if(size > 0){ for(local i = 0; i < size; i++){ local targetObj = obj.getVar("GrabExplosionExTar").get_obj_vector(i); if(targetObj){ CNSquirrelAppendage.sq_RemoveAppendage(targetObj, "character/fighter/3streetfighter_bykk/ap_grabexplosion_hold.nut"); } } } } } function onAttack_GrabExplosionEx(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(!obj.getVar("GrabExplosionExTar").is_obj_vector(damager)) obj.getVar("GrabExplosionExTar").push_obj_vector(damager); if(obj.getVar("GrabExplosionExBool").getBool(0)){ obj.getVar("GrabExplosionExBool").setBool(0, false); obj.getVar("GrabExplosionExBool").setBool(1, false); if(!obj.getVar("GrabExplosionExTarFix").is_obj_vector(damager) && sq_IsFixture(damager)) obj.getVar("GrabExplosionExTarFix").push_obj_vector(damager); local activeObj = sq_GetCNRDObjectToActiveObject(damager); local activeStatusCount = 0; for(local i = 0; i < 17; i++){ if(sq_IsValidActiveStatus(activeObj, i)) activeStatusCount = activeStatusCount + 1; if(activeStatusCount >= 3) break; } obj.getVar("GrabExplosionSet").setInt(1, activeStatusCount); // print("activeStatusCount = "+activeStatusCount); local apdPath = "character/fighter/3streetfighter_bykk/ap_grabexplosion_hold.nut"; if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, apdPath)){ local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, false, apdPath, true); sq_HoldAndDelayDie(damager, obj, true, true, true, 200, 200, ENUM_DIRECTION_NEUTRAL, AddAppendage); if(!sq_IsFixture(damager)){ sq_MoveToAppendageForce(damager, obj, obj, 75, 0, 0, 100, true, AddAppendage); } } obj.setTimeEvent(1, 80, 1, false); } if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_GRABEXPLOSIONEX, -1, 20, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } //破碎砖裂 function checkExecutableSkill_BlockBusterEx(obj) { if (!obj) return false; // return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_BLOCKBUSTEREX); if (isUse){ obj.sq_IntVectClear(); if(obj.getState() == 6 || obj.getState() == 7) obj.sq_IntVectPush(1); else obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_BLOCKBUSTEREX, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_BlockBusterEx(obj) { if (!obj) return false; return true; } function onSetState_BlockBusterEx(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(ANI_FWBYKK_BLOCKBUSTEREXTRY); obj.getVar("BlockBusterExJumpBool").setBool(0, false); obj.sq_PlaySound("BIGPUNCH_12SWING"); obj.sq_PlaySound("BIGPUNCH_4SWING_READY"); return; break; case 1: obj.sq_SetCurrentAnimation(ANI_FWBYKK_BLOCKBUSTEREXAIRREADY_BODY); obj.getVar("BlockBusterExJumpBool").setBool(0, true); break; case 2: obj.sq_SetCurrentAnimation(ANI_FWBYKK_BLOCKBUSTEREXJUMP); 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(); obj.getVar("BlockBusterExSet").setInt(0, sq_GetXPos(obj)); if(obj.getVar("BlockBusterExJumpBool").getBool(0)){ currentAni.setCurrentFrameWithChildLayer(2); } else{ local delay = currentAni.getDelaySum(0, 1); obj.setTimeEvent(1, delay / 5, 5, true); obj.sq_ZStop(); } obj.sq_PlaySound("FT_CRASH_MINE"); break; case 3: obj.sq_SetCurrentAnimation(ANI_FWBYKK_BLOCKBUSTEREXFINISH); return; break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); } function onEndCurrentAni_BlockBusterEx(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(2); obj.sq_AddSetStatePacket(STATE_FWBYKK_BLOCKBUSTEREX, STATE_PRIORITY_AUTO, true); break; case 1: case 2: obj.sq_IntVectClear(); obj.sq_IntVectPush(subState + 1); obj.sq_AddSetStatePacket(STATE_FWBYKK_BLOCKBUSTEREX, STATE_PRIORITY_AUTO, true); break; case 3: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_BlockBusterEx(obj) { if(!obj) return; } function onProc_BlockBusterEx(obj) { if(!obj) return; } function onKeyFrameFlag_BlockBusterEx(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 101: local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(3, 4); obj.setTimeEvent(2, delay / 5, 5, true); break; case 102: sq_SetMyShake(obj, 10, 240); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_BLOCKBUSTEREX, -1, 0, 1.0); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,125,0,-sq_GetZPos(obj),sq_GetDirection(obj),3,SKILL_FWBYKK_BLOCKBUSTEREX,1,totalDamage,0,0,0,0,0,0,0); break; case 103: // sq_AddDrawOnlyAniFromParent(obj, "passiveobject/1_fighter_bykk/3_streetfighter/animation/blockbusterexblock/block2.ani", 125, 0, 0); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_BLOCKBUSTEREX, -1, 2, 1.0); local totalDamage_exp = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_BLOCKBUSTEREX, -1, 4, 1.0); local totalDamage_lastexp = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_BLOCKBUSTEREX, -1, 10, 1.0); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_BLOCKBUSTEREX); local stunTime = sq_GetLevelData(obj, SKILL_FWBYKK_BLOCKBUSTEREX, 9, skillLevel); local sizeRate = sq_GetLevelData(obj, SKILL_FWBYKK_BLOCKBUSTEREX, 6, skillLevel); local sizeRateLastExp = sq_GetLevelData(obj, SKILL_FWBYKK_BLOCKBUSTEREX, 12, skillLevel); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)){ local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW); sizeRate = sizeRate * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 8, skillLevel)) / 100; sizeRateLastExp = sizeRateLastExp * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 8, skillLevel)) / 100; } createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,125,0,80,sq_GetDirection(obj),3,SKILL_FWBYKK_BLOCKBUSTEREX,2,totalDamage,totalDamage_exp,totalDamage_lastexp,stunTime,sizeRate,sizeRateLastExp,0,0); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,125,0,80,sq_GetDirection(obj),3,SKILL_FWBYKK_BLOCKBUSTEREX,3,totalDamage,totalDamage_exp,stunTime,sizeRate,0,0,0,0); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,125,0,80,sq_GetDirection(obj),3,SKILL_FWBYKK_BLOCKBUSTEREX,4,totalDamage,totalDamage_exp,stunTime,sizeRate,0,0,0,0); local offset = 125; if(sq_GetDirection(obj) == ENUM_DIRECTION_LEFT) offset = -125; sq_CreateParticle("passiveobject/1_fighter_bykk/particle/blockbusterexexp.ptl", obj, offset, 0, 60, true, 30, 0, 1); break; } return true; } function onTimeEvent_BlockBusterEx(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local v = sq_GetUniformVelocity(0, 150, timeEventCount, 5); sq_setCurrentAxisPos(obj, 2, v); break; case 2: local vx = sq_GetUniformVelocity(0, 75, timeEventCount, 5); local vz = sq_GetUniformVelocity(150, 0, timeEventCount, 5); local dstX = sq_GetDistancePos(obj.getVar("BlockBusterExSet").getInt(0), sq_GetDirection(obj), vx); sq_setCurrentAxisPos(obj, 0, dstX); sq_setCurrentAxisPos(obj, 2, vz); break; } } function onEndState_BlockBusterEx(obj, new_state) { if(!obj) return; if(new_state != STATE_FWBYKK_BLOCKBUSTEREX){ sq_SimpleMoveToNearMovablePos(obj,300); } } //连环毒爆弹 function checkExecutableSkill_PoisonExplosion(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_POISONEXPLOSION); if (isUse){ obj.sq_IntVectClear(); if(sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONEXPLOSIONCUSTOM) > 0) obj.sq_IntVectPush(2); else obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_POISONEXPLOSION, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_PoisonExplosion(obj) { if (!obj) return false; return true; } function onSetState_PoisonExplosion(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(ANI_FWBYKK_POISONEXPLOSION_START_BODY); obj.getVar("PoisonExplosionBool").setBool(0, false); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_POISONEXPLOSIONCUSTOMKICK)); // sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local attackInfo = sq_GetCurrentAttackInfo(obj); sq_SetAddWeaponDamage(attackInfo, false); obj.getVar("poisonExplosionTar").clear_obj_vector(); break; case 1: obj.sq_SetCurrentAnimation(ANI_FWBYKK_POISONEXPLOSION_KICK_BODY); 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(); obj.getVar("PoisonExplosionSet").setInt(0, sq_GetXPos(obj)); obj.setTimeEvent(1, currentAni.getDelaySum(0, 3) / 10, 10, true); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONEXPLOSION, -1, 0, 1.0); local sizeRate = sq_GetIntData(obj, SKILL_FWBYKK_POISONEXPLOSION, 8); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_POISONEXPLOSION,1,totalDamage,sizeRate,0,0,0,0,0,0); sq_SetMyShake(obj, 15, 120); return; break; case 2: obj.sq_SetCurrentAnimation(ANI_FWBYKK_POISONEXPLOSIONCUSTOM_START_BODY); sq_SetMyShake(obj, 5, 50); obj.getVar("PoisonExplosionBool").setBool(0, false); local addRate = sq_GetLevelData(obj, SKILL_FWBYKK_POISONEXPLOSIONCUSTOM, 0, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONEXPLOSIONCUSTOM)); local bonusRate = 1.0 + addRate.tofloat() / 100.0; local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONEXPLOSION, -1, 0, bonusRate); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_POISONEXPLOSIONCUSTOMKICK)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 3: obj.sq_SetCurrentAnimation(ANI_FWBYKK_POISONEXPLOSIONCUSTOM_KICK_BODY); 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(); obj.getVar("PoisonExplosionSet").setInt(0, sq_GetXPos(obj)); obj.setTimeEvent(1, currentAni.getDelaySum(0, 3) / 10, 10, true); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); } function onEndCurrentAni_PoisonExplosion(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: case 2: if(obj.getVar("PoisonExplosionBool").getBool(0)){ obj.sq_IntVectClear(); obj.sq_IntVectPush(subState + 1); obj.sq_AddSetStatePacket(STATE_FWBYKK_POISONEXPLOSION, STATE_PRIORITY_AUTO, true); return; } case 1: case 3: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_PoisonExplosion(obj) { if(!obj) return; } function onKeyFrameFlag_PoisonExplosion(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 105://EnableCancel break; case 106://DisableCancel break; } return true; } function onTimeEvent_PoisonExplosion(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local vx = sq_GetUniformVelocity(0, -120, timeEventCount, 10); local vz = sq_GetUniformVelocity(0, 50, timeEventCount, 10); local dstX = sq_GetDistancePos(obj.getVar("PoisonExplosionSet").getInt(0), sq_GetDirection(obj), vx); if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX); sq_setCurrentAxisPos(obj, 2, vz); if(timeEventCount == 10){ local currentAni = obj.getCurrentAnimation(); obj.setTimeEvent(2, currentAni.getDelaySum(4, 6) / 10, 10, true); } break; case 2: local vx = sq_GetUniformVelocity(-120, -155, timeEventCount, 10); local vz = sq_GetUniformVelocity(50, 0, timeEventCount, 10); local dstX = sq_GetDistancePos(obj.getVar("PoisonExplosionSet").getInt(0), sq_GetDirection(obj), vx); if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX); sq_setCurrentAxisPos(obj, 2, vz); break; } } function onEndState_PoisonExplosion(obj, new_state) { if(!obj) return; if(new_state != STATE_FWBYKK_POISONEXPLOSION){ sq_SimpleMoveToNearMovablePos(obj,300); } } function onAttack_PoisonExplosion(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; local subState = obj.getSkillSubState(); if(obj.getVar("PoisonExplosionBool").getBool(0) == false){ obj.getVar("PoisonExplosionBool").setBool(0, true); obj.getVar("poisonExplosionTar").push_obj_vector(damager); local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(damager, obj, -1, true, "appendage/character/ap_common_hold.nut", true); sq_HoldAndDelayDie(damager, obj, true, true, false, 200, 200, ENUM_DIRECTION_NEUTRAL , AddAppendage); AddAppendage.sq_SetValidTime(300); local bonusRate = 1.0; if(subState > 1) bonusRate = bonusRate + sq_GetLevelData(obj, SKILL_FWBYKK_POISONEXPLOSIONCUSTOM, 1, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONEXPLOSIONCUSTOM)).tofloat() / 100.0; local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONEXPLOSION, -1, 1, bonusRate); local sizeRate = sq_GetIntData(obj, SKILL_FWBYKK_POISONEXPLOSION, 8); local group = sq_GetGroup(damager); local uniqueId = sq_GetUniqueId(damager); local sub = 0; if(subState > 1) sub = 1; createSkillPassive_Fighter_bykk(obj,damager,PASSIVEOBJNUM_FWBYKK,0,0,sq_GetObjectHeight(damager) / 2,sq_GetDirection(obj),3,SKILL_FWBYKK_POISONEXPLOSION,2,totalDamage,sizeRate,group,uniqueId,sub,0,0,0); } if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONEXPLOSION, -1, 15, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } //毒龙轰天雷 function checkExecutableSkill_DragonMine(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_DRAGONMINE); if (isUse){ obj.sq_IntVectClear(); if(sq_GetIntData(obj, SKILL_FWBYKK_DRAGONMINE, 11) > 0){ if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(21); else obj.sq_IntVectPush(10); } else{ if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(20); else obj.sq_IntVectPush(0); } obj.sq_AddSetStatePacket(STATE_FWBYKK_DRAGONMINE, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_DragonMine(obj) { if (!obj) return false; return true; } function onSetState_DragonMine(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(ANI_FWBYKK_DRAGONMINESTART); obj.sq_PlaySound("DRAGONMINE_01"); obj.sq_PlaySound("FT_DRAGONMINE_01"); break; case 1: obj.sq_SetCurrentAnimation(ANI_FWBYKK_DRAGONMINEJUMPSPIN); obj.sq_PlaySound("FT_DRAGONMINE_02_1"); obj.sq_PlaySound("DRAGONMINE_02"); break; case 2: obj.sq_SetCurrentAnimation(ANI_FWBYKK_DRAGONMINEDROP); break; case 3: obj.sq_SetCurrentAnimation(ANI_FWBYKK_DRAGONMINEIMPACT); break; case 10: obj.sq_SetCurrentAnimation(ANI_FWBYKK_DRAGONMINEBOXATTACKSTART); obj.sq_PlaySound("DRAGONMINE_01_TALISMAN"); obj.sq_PlaySound("FT_DRAGONMINE_02_1"); break; case 11: obj.sq_SetCurrentAnimation(ANI_FWBYKK_DRAGONMINEBOXATTACKJUMPSPIN); break; case 12: obj.sq_SetCurrentAnimation(ANI_FWBYKK_DRAGONMINEBOXATTACKDROP); break; case 13: obj.sq_SetCurrentAnimation(ANI_FWBYKK_DRAGONMINEBOOM); break; case 20: case 21: obj.sq_SetCurrentAnimation(ANI_FWBYKK_DRAGONMINEBOXATTACKSTART_JUMP); if(subState == 21){ obj.sq_PlaySound("DRAGONMINE_01_TALISMAN"); obj.sq_PlaySound("FT_DRAGONMINE_02_1"); } break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); switch(subState){ case 0: case 10: local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(false); obj.getVar("DragonMineSet").setInt(0, sq_GetXPos(obj)); obj.setTimeEvent(1, delay / 32, 32, true); if(subState == 0) obj.setTimeEvent(2, delay / 32, 32, true); else obj.setTimeEvent(5, delay / 32, 32, true); break; case 2: case 12: obj.removeAllTimeEvent(); local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(false); obj.getVar("DragonMineSet").setInt(1, sq_GetZPos(obj)); obj.setTimeEvent(3, delay / 16, 16, true); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_DRAGONMINE, -1, 0, 1.0); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_DRAGONMINEDROP)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 20: case 21: local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(false); obj.getVar("DragonMineSet").setInt(0, sq_GetXPos(obj)); obj.setTimeEvent(4, delay / 40, 40, true); if(subState == 21){ obj.getVar("DragonMineSet").setInt(1, sq_GetZPos(obj)); obj.setTimeEvent(6, delay / 40, 40, true); } case 1: case 11: local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(false); local flashScreenObj = obj.getVar("DragonMineFlash").get_obj_vector(0); local pflashScreen = sq_GetCNRDObjectToFlashScreen(flashScreenObj); if(pflashScreen) pflashScreen.fadeOut(); local flashScreenObj = sq_flashScreen(obj,delay,99990,0,150, sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); obj.getVar("DragonMineFlash").clear_obj_vector();//清除 obj.getVar("DragonMineFlash").push_obj_vector(flashScreenObj);//加入 break; } } function onEndCurrentAni_DragonMine(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: case 1: case 2: case 10: case 11: case 12: obj.sq_IntVectClear(); obj.sq_IntVectPush(subState + 1); obj.sq_AddSetStatePacket(STATE_FWBYKK_DRAGONMINE, STATE_PRIORITY_AUTO, true); break; case 3: case 13: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; case 20: obj.sq_IntVectClear(); obj.sq_IntVectPush(1); obj.sq_AddSetStatePacket(STATE_FWBYKK_DRAGONMINE, STATE_PRIORITY_AUTO, true); break; case 21: obj.sq_IntVectClear(); obj.sq_IntVectPush(12); obj.sq_AddSetStatePacket(STATE_FWBYKK_DRAGONMINE, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_DragonMine(obj) { if(!obj) return; } function onKeyFrameFlag_DragonMine(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 201://`CreateBombBox` 22 0 37 if(obj.getSkillSubState() == 20) break; local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(1, 4); local offsetX = sq_GetDistancePos(obj.getVar("DragonMineSet").getInt(0), sq_GetDirection(obj), 195); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,50,-1,sq_GetZPos(obj),sq_GetDirection(obj),3,SKILL_FWBYKK_DRAGONMINE,3,delay,offsetX,0,0,0,0,0,0); break; case 202: obj.sq_PlaySound("FT_DRAGONMINE_02_2"); obj.sq_PlaySound("DRAGONMINE_05"); break; case 1:// local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_DRAGONMINE, -1, 0, 1.0) + obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_DRAGONMINE, -1, 1, 6.0); totalDamage = totalDamage * 116 / 100; local sizeRate = sq_GetIntData(obj, SKILL_FWBYKK_DRAGONMINE, 4); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_DRAGONMINE); local lifeTime = sq_GetLevelData(obj, SKILL_FWBYKK_DRAGONMINE, 3, skillLevel); local hitTime = sq_GetIntData(obj, SKILL_FWBYKK_DRAGONMINE, 9); local damage = sq_GetLevelData(obj, SKILL_FWBYKK_DRAGONMINE, 4, skillLevel) - 100; local moveSpeed = sq_GetLevelData(obj, SKILL_FWBYKK_DRAGONMINE, 6, skillLevel); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_DRAGONMINE,4,totalDamage,sizeRate,lifeTime,hitTime,damage,moveSpeed,0,0); break; case 101: local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_DRAGONMINE, -1, 1, 1.0); local sizeRate = sq_GetIntData(obj, SKILL_FWBYKK_DRAGONMINE, 4); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_DRAGONMINE); local lifeTime = sq_GetLevelData(obj, SKILL_FWBYKK_DRAGONMINE, 3, skillLevel); local hitTime = sq_GetIntData(obj, SKILL_FWBYKK_DRAGONMINE, 9); local damage = sq_GetLevelData(obj, SKILL_FWBYKK_DRAGONMINE, 4, skillLevel) - 100; local moveSpeed = sq_GetLevelData(obj, SKILL_FWBYKK_DRAGONMINE, 6, skillLevel); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,SKILL_FWBYKK_DRAGONMINE,1,totalDamage,sizeRate,lifeTime,hitTime,damage,moveSpeed,0,0); break; } return true; } function onTimeEvent_DragonMine(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local vx = sq_GetAccel(0, 150, timeEventCount, 32, true); local dstX = sq_GetDistancePos(obj.getVar("DragonMineSet").getInt(0), sq_GetDirection(obj), vx); if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX); else obj.stopTimeEvent(1); break; case 2: local vz = sq_GetAccel(0, 150, timeEventCount, 32, true); sq_setCurrentAxisPos(obj, 2, vz); break; case 3: local vz = sq_GetAccel(obj.getVar("DragonMineSet").getInt(1), 0, timeEventCount, 15, true); sq_setCurrentAxisPos(obj, 2, vz); if(timeEventCount >= 16){ local subState = obj.getSkillSubState(); if(subState < 10){ sq_SetMyShake(obj, 20, 220); local aniPath = "character/fighter/effect/animation/3_streetfighter_bykk/dragonmine/impact_dragonmine_bottom.ani"; local pooledObj = sq_AddDrawOnlyAniFromParent(obj, aniPath, 0, 0, 0); sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM); sq_CreateParticle("character/fighter/particle/dragonminenormal.ptl", obj, 0, 0, 0, true, 30, 0, 1); } else{ local boxObj = obj.getVar("DragonMineBox").get_obj_vector(0); if(boxObj){ local colObj = sq_GetCNRDObjectToCollisionObject(boxObj); colObj.removeAllTimeEvent(); colObj.addSetStatePacket(23, null, STATE_PRIORITY_AUTO, false, ""); sq_SetMyShake(obj, 20, 220); local aniPath = "character/fighter/effect/animation/3_streetfighter_bykk/dragonmine/boom_dragonmine_bottom.ani"; local pooledObj = sq_AddDrawOnlyAniFromParent(obj, aniPath, 0, 0, 0); sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM); sq_CreateParticle("character/fighter/particle/dragonmineboom.ptl", obj, 0, 0, 0, true, 30, 0, 1); } } } break; case 4: local vx = sq_GetAccel(0, 200, timeEventCount, 40, true); local dstX = sq_GetDistancePos(obj.getVar("DragonMineSet").getInt(0), sq_GetDirection(obj), vx); if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX); else obj.stopTimeEvent(4); break; case 5: local vz = sq_GetAccel(0, 450, timeEventCount, 32, true); sq_setCurrentAxisPos(obj, 2, vz); break; case 6: local vz = sq_GetAccel(obj.getVar("DragonMineSet").getInt(1), 450, timeEventCount, 40, true); sq_setCurrentAxisPos(obj, 2, vz); break; } } function onEndState_DragonMine(obj, new_state) { if(!obj) return; } function onAttack_DragonMine(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_DRAGONMINE, -1, 11, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } //万毒噬心诀 function checkExecutableSkill_PoisonSnake(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_POISONSNAKE); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_POISONSNAKE, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_PoisonSnake(obj) { if (!obj) return false; return true; } function onSetState_PoisonSnake(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(ANI_FWBYKK_POISONSNAKESTART_BODY); obj.getVar("PoisonSnakeSet").setInt(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_PoisonSnake(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_PoisonSnake(obj) { if(!obj) return; } function onKeyFrameFlag_PoisonSnake(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 1: local phase = obj.getVar("PoisonSnakeSet").getInt(0); switch(phase){ case 1: sq_SetMyShake(obj, 5, 200); obj.getVar("PoisonSnakeSet").setInt(0, phase + 1); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_POISONSNAKE_BUFF)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_POISONSNAKE_BUFF); local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_POISONSNAKE_BUFF, true); AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_FWBYKK_POISONSNAKE, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSNAKE)); CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true); AddAppendage.sq_DeleteEffectFront(); AddAppendage.sq_AddEffectFront("character/fighter/effect/animation/3_streetfighter_bykk/poisonsnake/poisonbody_loop.ani"); setSkillBonusRate_3StreetFighter_bykk(obj); break; case 2: local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONSNAKE, -1, 1, 1.0); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_POISONSNAKECASTINGATTACK2)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; } break; case 2: obj.sq_PlaySound("FT_POISONSNAKE"); obj.sq_PlaySound("POISONSNAKE_CAST"); break; } return true; } function onTimeEvent_PoisonSnake(obj, timeEventIndex, timeEventCount) { if(!obj) return false; } function onEndState_PoisonSnake(obj, new_state) { if(!obj) return; } function onStart_appendage_poisonsnake_buff(appendage) {} function proc_appendage_poisonsnake_buff(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj || parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local sqrState = obj.getState(); if(sqrState == 0 || sqrState == 14) return; if(!sq_GetSkill(obj, SKILL_FWBYKK_PROVOCATION).isInCoolTime()){ obj.setSkillCommandEnable(SKILL_FWBYKK_PROVOCATION,true); local b_useskill = obj.sq_IsEnterSkill(SKILL_FWBYKK_PROVOCATION); if(b_useskill != -1){ local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_PROVOCATION); obj.startSkillCoolTime(SKILL_FWBYKK_PROVOCATION, skillLevel, -1); local range = sq_GetLevelData(obj, SKILL_FWBYKK_PROVOCATION, 1, skillLevel) / 2; local allt = sq_GetLevelData(obj, SKILL_FWBYKK_PROVOCATION, 8, skillLevel); if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_POISONSNAKE_BUFF)){ allt = allt * (100 + sq_GetLevelData(obj, SKILL_FWBYKK_POISONSNAKE, 13, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSNAKE))) / 100; } local damageIncreaseRate = sq_GetLevelData(obj, SKILL_FWBYKK_PROVOCATION, 10, skillLevel); local buffTime = sq_GetLevelData(obj, SKILL_FWBYKK_PROVOCATION, 0, skillLevel); local stunRate = sq_GetLevelData(obj, SKILL_FWBYKK_PROVOCATION, 2, skillLevel); local aniPath = ["character/fighter/effect/animation/provocation1.ani", "character/fighter/effect/animation/provocation2.ani", "character/fighter/effect/animation/provocation3.ani"]; local sizeRate = range * 100 / 275, direction = sq_GetDirection(obj), x = sq_GetXPos(obj), y = sq_GetYPos(obj); for(local i = 0; i < aniPath.len(); i++){ createOnlyDrawObjectEX_Fighter_bykk(obj,aniPath[i],true,direction,x,y,0,ENUM_DRAWLAYER_NORMAL,sizeRate,sizeRate); } local objectManager = obj.getObjectManager();//得到對象管理器 for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){ local object = objectManager.getCollisionObject(i);//得到控制類對象 if (object && 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); local AddAppendage = CNSquirrelAppendage.sq_GetAppendage(activeObj, APDPATH_PROVOCATION_DEBUFF); if(!AddAppendage){ AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(activeObj, obj, -1, true, APDPATH_PROVOCATION_DEBUFF, true); AddAppendage.sq_SetValidTime(buffTime); } AddAppendage.getVar("custom").setInt(0, damageIncreaseRate); AddAppendage.getVar("custom").setInt(1, buffTime - 3000); AddAppendage.setBuffIconImage(23); local change_appendage = AddAppendage.sq_getChangeStatus("provocationDeBuff"); if(!change_appendage) change_appendage = AddAppendage.sq_AddChangeStatus("provocationDeBuff",activeObj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_ACTIVESTATUS_TOLERANCE_ALL, true, (allt * -0.1).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_STUCK, false, (stunRate * 0.1).tofloat()); } } } } } } //禁技 : 万毒蛇窟 function checkExecutableSkill_SnakeCave(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_SNAKECAVE); if (isUse){ obj.sq_IntVectClear(); if(sq_GetZPos(obj) > 0) obj.sq_IntVectPush(10); else obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_SNAKECAVE, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_SnakeCave(obj) { if (!obj) return false; if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_POISONSNAKE_BUFF)) return false; return true; } function onSetState_SnakeCave(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(ANI_FWBYKK_SNAKECAVEREADY1_BODY); break; case 1: obj.sq_SetCurrentAnimation(ANI_FWBYKK_SNAKECAVEREADY2_BODY); break; case 2: case 12: obj.sq_SetCurrentAnimation(ANI_FWBYKK_SNAKECAVEEXPLOSION_BODY); break; case 10: obj.sq_SetCurrentAnimation(ANI_FWBYKK_SNAKECAVEREADYAIR2_BODY); break; case 11: obj.sq_SetCurrentAnimation(ANI_FWBYKK_SNAKECAVEREADYAIR3_BODY); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 1.0, 1.0); switch(subState){ case 1: case 11: local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(false); obj.getVar("SnakeCaveSet").setInt(0, sq_GetXPos(obj)); obj.setTimeEvent(1, delay / 16, 16, true); if(subState == 11){ obj.getVar("SnakeCaveSet").setInt(1, sq_GetZPos(obj)); obj.setTimeEvent(3, delay / 16, 16, true); } break; } } function onEndCurrentAni_SnakeCave(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: case 10: case 1: case 11: obj.sq_IntVectClear(); obj.sq_IntVectPush(subState + 1); obj.sq_AddSetStatePacket(STATE_FWBYKK_SNAKECAVE, STATE_PRIORITY_AUTO, true); break; case 2: case 12: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_SnakeCave(obj) { if(!obj) return; } function onKeyFrameFlag_SnakeCave(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 101: obj.sq_PlaySound("SNAKECAVE_READY"); obj.sq_PlaySound("FT_POSION_EXPLOSION"); if(obj.getSkillSubState() > 10) break; local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/fighter/effect/animation/3_streetfighter_bykk/poisonsnake/snakecaveready3_01.ani", 0, 0, 0); sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM); break; case 1: local currentAni = obj.getCurrentAnimation(); local speedRate = 8000 / currentAni.getDelaySum(0, 0); local delay = 20000 / speedRate; sq_flashScreen(obj,0,0,delay,127, sq_RGB(255, 255, 255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); sq_SetMyShake(obj, 5, 400); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONSNAKE, -1, 24, 1.0); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_SNAKECAVE)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local hitMax = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONSNAKE, -1, 26, 1.0) + 100; obj.setTimeEvent(2, currentAni.getDelaySum(2, 9) / hitMax, hitMax - 1, false); sq_AddDrawOnlyAniFromParent(obj, "character/fighter/effect/animation/3_streetfighter_bykk/poisonsnake/snakecaveexplosionup_00.ani", 0, 1, 0); break; case 3: local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/fighter/effect/animation/3_streetfighter_bykk/poisonsnake/snakecavecrack_01.ani", 0, 0, 0); sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM); break; case 4: sq_AddDrawOnlyAniFromParent(obj, "character/fighter/effect/animation/3_streetfighter_bykk/poisonsnake/snakecaveexplosiondown_00.ani", 0, -1, 0); break; case 9: break; } return true; } function onTimeEvent_SnakeCave(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local v = sq_GetAccel(0, 85, timeEventCount, 16, true); local dstX = sq_GetDistancePos(obj.getVar("SnakeCaveSet").getInt(0), sq_GetDirection(obj), v); if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX); else obj.stopTimeEvent(1); break; case 2: obj.resetHitObjectList(); break; case 3: local v = sq_GetAccel(obj.getVar("SnakeCaveSet").getInt(1), 0, timeEventCount, 16, true); sq_setCurrentAxisPos(obj, 2, v); break; } } function onEndState_SnakeCave(obj, new_state) { if(!obj) return; } function onAttack_SnakeCave(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONSNAKE, -1, 25, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } //钻心毒爆 function checkExecutableSkill_PainsKiller(obj) { if (!obj) return false; local isUse = obj.sq_IsUseSkill(SKILL_FWBYKK_PAINSKILLER); if (isUse){ obj.sq_IntVectClear(); obj.sq_IntVectPush(0); obj.sq_AddSetStatePacket(STATE_FWBYKK_PAINSKILLER, STATE_PRIORITY_IGNORE_FORCE, true); return true; } return false; } function checkCommandEnable_PainsKiller(obj) { if (!obj) return false; return true; } function onSetState_PainsKiller(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(ANI_FWBYKK_PAINKILLERREADY_BODY); obj.sq_PlaySound("R_FT_PAINKILLER_READY"); obj.sq_PlaySound("PAINKILLER_READY"); obj.getVar("PainsKillerBool").setBool(0, false); sq_AddDrawOnlyAniFromParent(obj, "character/fighter/effect/animation/3_streetfighter_bykk/painkiller/ready/painkillerreadyfront_00.ani", 0, 1, 0); local pooledObj = sq_AddDrawOnlyAniFromParent(obj, "character/fighter/effect/animation/3_streetfighter_bykk/painkiller/ready/painkillerreadyground_00.ani", 0, 1, 0); sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM); break; case 1: obj.sq_SetCurrentAnimation(ANI_FWBYKK_PAINKILLERSTART_BODY); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_PAINKILLERCOLLISIONCHECK)); sq_AddDrawOnlyAniFromParent(obj, "character/fighter/effect/animation/3_streetfighter_bykk/painkiller/start/painkillerstartfront_02.ani", 0, 1, 0); break; case 2: case 3: if(subState == 2) obj.sq_SetCurrentAnimation(ANI_FWBYKK_PAINKILLERATTACKA_BODY); else obj.sq_SetCurrentAnimation(ANI_FWBYKK_PAINKILLERATTACKB_BODY); obj.sq_PlaySound("FT_PAINKILLER_FIN"); obj.sq_PlaySound("PAINKILLER_LANDING"); break; } obj.sq_SetStaticSpeedInfo(SPEED_TYPE_ATTACK_SPEED, SPEED_TYPE_ATTACK_SPEED, SPEED_VALUE_DEFAULT, SPEED_VALUE_DEFAULT, 0.75, 0.75); switch(subState){ case 0: local currentAni = obj.getCurrentAnimation(); local speedRate = 4000 / currentAni.getDelaySum(0, 0); local delay1 = 20000 / speedRate; local delay2 = 60000 / speedRate; sq_flashScreen(obj,delay1,delay2,delay1,178,sq_RGB(0,0,0), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); break; case 1: local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(false); obj.getVar("PainsKillerSet").setInt(0, sq_GetXPos(obj)); obj.setTimeEvent(1, delay / 32, 32, true); obj.setTimeEvent(2, delay / 32, 32, true); break; case 2: case 3: obj.removeAllTimeEvent(); local currentAni = obj.getCurrentAnimation(); local speedRate = 4000 / currentAni.getDelaySum(0, 0); local delay1 = 5000 / speedRate; local delay2 = 10000 / speedRate; local delay3 = 20000 / speedRate; sq_flashScreen(obj,delay1,delay2,delay1,204,sq_RGB(255,255,255), GRAPHICEFFECT_NONE, ENUM_DRAWLAYER_BOTTOM); sq_SetMyShake(obj, 8, delay3); local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_PAINSKILLER, -1, 2, 1.0); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_PAINSKILLER); local hitMax = sq_GetLevelData(obj, SKILL_FWBYKK_PAINSKILLER, 3, skillLevel); local prob = sq_GetLevelData(obj, SKILL_FWBYKK_PAINSKILLER, 6, skillLevel) * 10; local time = sq_GetLevelData(obj, SKILL_FWBYKK_PAINSKILLER, 7, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; //CreateMineExplosion //down if(subState == 3){ createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,-1,0,sq_GetDirection(obj),3,SKILL_FWBYKK_PAINSKILLER,1,totalDamage,hitMax,speedRate,prob,time,level,0,0); }else{ local delay = currentAni.getDelaySum(0, 0); obj.setTimeEvent(3, delay / 4, 4, true); // local hitTime = sq_GetIntData(obj, SKILL_FWBYKK_DRAGONMINE, 9); // local damage = sq_GetLevelData(obj, SKILL_FWBYKK_DRAGONMINE, 4, skillLevel) - 100; // local moveSpeed = sq_GetLevelData(obj, SKILL_FWBYKK_DRAGONMINE, 6, skillLevel); createSkillPassive_Fighter_bykk(obj,obj,PASSIVEOBJNUM_FWBYKK,0,-1,0,sq_GetDirection(obj),3,SKILL_FWBYKK_PAINSKILLER,2,totalDamage,hitMax,speedRate,prob,time,level,0,0); } break; } } function onEndCurrentAni_PainsKiller(obj) { if(!obj) return; local subState = obj.getSkillSubState(); switch(subState){ case 0: obj.sq_IntVectClear(); obj.sq_IntVectPush(subState + 1); obj.sq_AddSetStatePacket(STATE_FWBYKK_PAINSKILLER, STATE_PRIORITY_AUTO, true); break; case 1: obj.sq_IntVectClear(); if(obj.getVar("PainsKillerBool").getBool(0)) obj.sq_IntVectPush(3); else obj.sq_IntVectPush(2); obj.sq_AddSetStatePacket(STATE_FWBYKK_PAINSKILLER, STATE_PRIORITY_AUTO, true); break; case 2: case 3: obj.sq_IntVectClear(); obj.sq_AddSetStatePacket(STATE_STAND, STATE_PRIORITY_AUTO, true); break; } } function onProcCon_PainsKiller(obj) { if(!obj) return; } function onKeyFrameFlag_PainsKiller(obj, flagIndex) { if(!obj) return false; switch(flagIndex){ case 101: case 102: local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_PAINSKILLER, -1, 1, 1.0); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_PAINKILLERA)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); local aniPath = "character/fighter/effect/animation/3_streetfighter_bykk/painkiller/attack/painkillerattackground_00.ani"; local pooledObj = sq_AddDrawOnlyAniFromParent(obj, aniPath, 0, 0, -sq_GetZPos(obj)); sq_ChangeDrawLayer(pooledObj, ENUM_DRAWLAYER_BOTTOM); break; case 103: local totalDamage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_PAINSKILLER, -1, 0, 1.0); sq_SetCurrentAttackInfo(obj, sq_GetCustomAttackInfo(obj, ATK_FWBYKK_PAINKILLERA)); sq_SetCurrentAttackBonusRate(sq_GetCurrentAttackInfo(obj), totalDamage); break; case 104: local currentAni = obj.getCurrentAnimation(); local delay = currentAni.getDelaySum(1, 2); obj.setTimeEvent(3, delay / 4, 4, true); break; } return true; } function onTimeEvent_PainsKiller(obj, timeEventIndex, timeEventCount) { if(!obj) return false; switch(timeEventIndex){ case 1: local v = sq_GetAccel(0, 120, timeEventCount, 32, true); local dstX = sq_GetDistancePos(obj.getVar("PainsKillerSet").getInt(0), sq_GetDirection(obj), v); if(obj.isMovablePos(dstX, sq_GetYPos(obj))) sq_setCurrentAxisPos(obj, 0, dstX); else obj.stopTimeEvent(1); break; case 2: local v = sq_GetAccel(0, 120, timeEventCount, 32, true); sq_setCurrentAxisPos(obj, 2, v); break; case 3: local v = sq_GetAccel(120, 0, timeEventCount, 4, false); sq_setCurrentAxisPos(obj, 2, v); break; } } function onEndState_PainsKiller(obj, new_state) { if(!obj) return; } function onAttack_PainsKiller(obj, damager, boundingBox, isStuck) { if(isStuck) return; if(!damager.isObjectType(OBJECTTYPE_ACTIVE)) return; local subState = obj.getSkillSubState(); // print("subState = "+subState); switch(subState){ case 1: if(obj.getVar("PainsKillerBool").getBool(0) == false) obj.getVar("PainsKillerBool").setBool(0, true); break; case 2: if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_PAINSKILLER, -1, 15, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } break; case 3: local frameIndex = sq_GetCurrentFrameIndex(obj); if(frameIndex < 3){ local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_PAINSKILLER); local prob = 1000; local time = sq_GetLevelData(obj, SKILL_FWBYKK_PAINSKILLER, 13, skillLevel); local level = sq_GetSkillLevel(obj, 174) + 5; sq_sendSetActiveStatusPacket(damager, obj, ACTIVESTATUS_BLEEDING, prob.tofloat(), level, false, time); if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_PAINSKILLER, -1, 14, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } } else{ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local attackIndex = obj.getAttackIndex(); local bonusRate = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_ENCHANTPOISON, -1, 10, 1.0) + 100; local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_PAINSKILLER, -1, 15, bonusRate.tofloat() / 1000.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); } } break; } } function setStreetFighterBuff_bykk(obj, index) { switch(index){ case SKILL_FWBYKK_ENCHANTPOISON: if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_ENCHANTPOISON)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_ENCHANTPOISON); local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_ENCHANTPOISON, true); local buffTime = sq_GetLevelData(obj, SKILL_FWBYKK_ENCHANTPOISON, 0, sq_GetSkillLevel(obj, SKILL_FWBYKK_ENCHANTPOISON)); if(buffTime != 0) AddAppendage.sq_SetValidTime(buffTime); break; case SKILL_FWBYKK_DOUBLETHROW: if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_DOUBLETHROW); local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_DOUBLETHROW, true); local buffTime = sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 0, sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW)); if(buffTime != 0) AddAppendage.sq_SetValidTime(buffTime); AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_FWBYKK_DOUBLETHROW, sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW)); CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true); break; } } function proc_appendage_doublethrow(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj || parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } } function proc_appendage_enchantpoison(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj || parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } } function onStart_appendage_enchantpoison(appendage) { local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_ENCHANTPOISON); local prob = sq_GetLevelData(obj, SKILL_FWBYKK_ENCHANTPOISON, 6, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_ENCHANTPOISON, 8, skillLevel); local damage = sq_GetLevelData(obj, SKILL_FWBYKK_ENCHANTPOISON, 9, skillLevel); appendage.getVar("custom").setInt(0, prob); appendage.getVar("custom").setInt(1, time); appendage.getVar("custom").setInt(2, damage); } function onEnd_appendage_enchantpoison(appendage) {} function onAttackParent_appendage_enchantpoison(appendage, realAttacker, damager, boundingBox, isStuck) { if(!appendage) return; if(isStuck || !damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(sq_getRandom(1, 1000) < 1000 - appendage.getVar("custom").getInt(0)) return; local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); if(!obj || obj.getState() == STATE_DIE) return;// || obj.getState() != 8 // if(realAttacker.isObjectType(OBJECTTYPE_PASSIVE)){ // local colObj = sq_GetCNRDObjectToCollisionObject(realAttacker); // local skillIndex = colObj.getVar("skillIndex").getInt(0); // if(skillIndex == 255) return; // } if(damager.getVar("SFPoison").get_obj_vector_size() < 1){ local group = sq_GetGroup(damager); local uniqueId = sq_GetUniqueId(damager); local time = appendage.getVar("custom").getInt(1); local damage = appendage.getVar("custom").getInt(2); createSkillPassive_Fighter_bykk(obj,damager,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,255,1,group,uniqueId,time,damage,0,0,0,0); } // else{ // local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); // if(poisonObj){ // local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); // local time = appendage.getVar("custom").getInt(1); // local damage = appendage.getVar("custom").getInt(2); // local count = time / 500; // colObj.getVar("time").setInt(0, time); // colObj.getVar("custom").setInt(2, count); // local baseDamage = colObj.getVar("damage").getInt(0); // colObj.getVar("damage").setInt(0, baseDamage + damage); // if(!colObj.isExistTimeEvent(1)) colObj.setTimeEvent(1, 500, count, true); // } // } } function proc_appendage_provocation_debuff(appendage) { if(!appendage) return; local parentObj = appendage.getParent(); if(!parentObj || parentObj.getState() == STATE_DIE){ appendage.setValid(false); return; } if(appendage.getVar().getBool(0) == false && appendage.getTimer().Get() >= appendage.getVar("custom").getInt(1)){ appendage.getVar().setBool(0, true); local pooledObj = sq_AddDrawOnlyAniFromParent(parentObj, "character/fighter/effect/animation/provocationed.ani", 0, -1, sq_GetHeightObject(parentObj) + 50); sq_moveWithParent(parentObj, pooledObj); } } function getImmuneTypeDamageRate_appendage_provocation_debuff(appendage, damageRate, attacker) { if(!appendage) return damageRate; local sourceObj = appendage.getSource(); if(isSameObject(sourceObj, attacker)){ local newDamageRate = damageRate + appendage.getVar("custom").getInt(0) / 10; // print("newDamageRate = "+newDamageRate); return newDamageRate; } else return damageRate; } function onStart_appendage_clawmastery(appendage) { local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local weaponSubType = obj.getWeaponSubType(); if(weaponSubType == -1) return; print("weaponSubType = "+weaponSubType); if(weaponSubType == 2){ local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_CLAWMASTERY); local physicalEquAttack = sq_GetLevelData(obj, SKILL_FWBYKK_CLAWMASTERY, 9, skillLevel); local magicalEquAttack = sq_GetLevelData(obj, SKILL_FWBYKK_CLAWMASTERY, 10, skillLevel); local stunRate = sq_GetLevelData(obj, SKILL_FWBYKK_CLAWMASTERY, 8, skillLevel); local prob = sq_GetLevelData(obj, SKILL_FWBYKK_CLAWMASTERY, 7, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_CLAWMASTERY, 11, skillLevel); local damage = sq_GetLevelData(obj, SKILL_FWBYKK_CLAWMASTERY, 12, skillLevel); local level = sq_GetLevelData(obj, SKILL_FWBYKK_CLAWMASTERY, 13, skillLevel); appendage.getVar("custom").setInt(0, prob); appendage.getVar("custom").setInt(1, time); appendage.getVar("custom").setInt(2, damage); appendage.getVar("custom").setInt(3, level); appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_FWBYKK_POISONMASTERY, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONMASTERY)); local change_appendage = appendage.sq_getChangeStatus("poisonstunBuff"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("poisonstunBuff",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_PHYSICAL_ATTACK, true, physicalEquAttack.tofloat() * 0.1); change_appendage.addParameter(CHANGE_STATUS_TYPE_EQUIPMENT_MAGICAL_ATTACK , true, magicalEquAttack.tofloat() * 0.1); change_appendage.addParameter(CHANGE_STATUS_TYPE_STUCK , false, stunRate.tofloat() * -0.1); } } } function onAttackParent_appendage_clawmastery(appendage, realAttacker, damager, boundingBox, isStuck) { if(!appendage) return; if(isStuck || !damager.isObjectType(OBJECTTYPE_ACTIVE)) return; } function onStart_appendage_poisonmastery(appendage) { local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONMASTERY); local speed = sq_GetLevelData(obj, SKILL_FWBYKK_POISONMASTERY, 7, skillLevel); local hitProb = sq_GetLevelData(obj, SKILL_FWBYKK_POISONMASTERY, 0, skillLevel); local attackProb = sq_GetLevelData(obj, SKILL_FWBYKK_POISONMASTERY, 6, skillLevel); local time = sq_GetLevelData(obj, SKILL_FWBYKK_POISONMASTERY, 3, skillLevel); local damage = sq_GetLevelData(obj, SKILL_FWBYKK_POISONMASTERY, 4, skillLevel); appendage.getVar("custom").setInt(0, hitProb); appendage.getVar("custom").setInt(1, attackProb); appendage.getVar("custom").setInt(2, time); appendage.getVar("custom").setInt(3, damage); appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_FWBYKK_POISONMASTERY, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONMASTERY)); local change_appendage = appendage.sq_getChangeStatus("poisonstunBuff"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("poisonstunBuff",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_ATTACK_SPEED, false, (speed).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_MOVE_SPEED , false, (speed).tofloat()); } } function onDamageParent_appendage_poisonmastery(appendage ,attacker, boundingBox, isStuck) { if(!appendage) return; if(isStuck || !attacker.isObjectType(OBJECTTYPE_ACTIVE)) return; local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local prob = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMASTERY, -1, 0, 1.0) + 100; if(sq_getRandom(1, 1000) < 1000 - prob) return; if(attacker.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = attacker.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMASTERY, -1, 4, 1.0) + 100; local time = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMASTERY, -1, 3, 1.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); colObj.getVar("time").setInt(0, time); colObj.getVar("custom").setInt(2, time / 500); } } } function onAttackParent_appendage_poisonmastery(appendage, realAttacker, damager, boundingBox, isStuck) { if(!appendage) return; if(isStuck || !damager.isObjectType(OBJECTTYPE_ACTIVE)) return; if(realAttacker.isObjectType(OBJECTTYPE_PASSIVE)){ local colObj = sq_GetCNRDObjectToCollisionObject(realAttacker); local skillIndex = colObj.getVar("skillIndex").getInt(0); if(skillIndex == 255) return; } local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local prob = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMASTERY, -1, 6, 1.0) + 100; if(sq_getRandom(1, 1000) < 1000 - prob) return; if(damager.getVar("SFPoison").get_obj_vector_size() > 0){ local poisonObj = damager.getVar("SFPoison").get_obj_vector(0); if(poisonObj){ local colObj = sq_GetCNRDObjectToCollisionObject(poisonObj); local damage = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMASTERY, -1, 4, 1.0) + 100; local time = obj.sq_GetBonusRateWithPassive(SKILL_FWBYKK_POISONMASTERY, -1, 3, 1.0) + 100; print("damageAddSet = "+damage); local baseDamage = colObj.getVar("damage").getInt(0); colObj.getVar("damage").setInt(0, baseDamage + damage); colObj.getVar("time").setInt(0, time); colObj.getVar("custom").setInt(2, time / 500); } } } function onStart_appendage_poisonspirit(appendage) { if(!appendage) return; } function onStart_appendage_poisonstun(appendage) { local parentObj = appendage.getParent(); local obj = sq_GetCNRDObjectToSQRCharacter(parentObj); local skillLevel = sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSTUN); local allCriticalRate = sq_GetLevelData(obj, SKILL_FWBYKK_POISONSTUN, 1, skillLevel); appendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_FWBYKK_POISONSTUN, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSTUN)); local change_appendage = appendage.sq_getChangeStatus("poisonstunBuff"); if(!change_appendage) change_appendage = appendage.sq_AddChangeStatus("poisonstunBuff",obj, obj, 0, CHANGE_STATUS_TYPE_PHYSICAL_ATTACK, true, 1000); if(change_appendage){ change_appendage.clearParameter(); change_appendage.addParameter(CHANGE_STATUS_TYPE_PHYSICAL_CRITICAL_HIT_RATE, false, (allCriticalRate).tofloat()); change_appendage.addParameter(CHANGE_STATUS_TYPE_MAGICAL_CRITICAL_HIT_RATE , false, (allCriticalRate).tofloat()); } } function ProcPassiveSkill_Fighter_3bykk(obj, skill_index, skill_level) { switch (skill_index){ case 33: // if (skill_level > 0){ // local apPath = "character/fighter/stunonuseskill/ap_stunonuseskill.nut"; // local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skill_index, false, apPath, true); // } break; case SKILL_FWBYKK_POISONMASTERY: if (skill_level > 0){ local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skill_index, false, APDPATH_POISONMASTERY, true); } break; case SKILL_FWBYKK_CLAWMASTERY: if (skill_level > 0){ local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skill_index, false, APDPATH_CLAWMASTERY, true); } break; case SKILL_FWBYKK_POISONSTUN: if (skill_level > 0){ local appendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, skill_index, false, APDPATH_POISONSTUN, true); } break; } } function onStartDungeon_Fighter_3bykk(obj) { if(sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSPIRIT) > 0){ if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)) CNSquirrelAppendage.sq_RemoveAppendage(obj, APDPATH_DOUBLETHROW); local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_DOUBLETHROW, true); local buffTime = sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 0, sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW)); if(buffTime != 0) AddAppendage.sq_SetValidTime(buffTime); AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_FWBYKK_DOUBLETHROW, sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW)); CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true); } setSkillBonusRate_3StreetFighter_bykk(obj); } function onStartMap_Fighter_3bykk(obj) { if(!obj || obj.getState() == STATE_DIE) return; local objectManager = obj.getObjectManager();//得到對象管理器 for (local i = 0; i < objectManager.getCollisionObjectNumber(); i++){ local object = objectManager.getCollisionObject(i);//得到控制類對象 if (object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object)){ local activeObj = sq_GetCNRDObjectToActiveObject(object); if(activeObj.getVar("SFPoison").get_obj_vector_size() < 1){ local group = sq_GetGroup(activeObj); local uniqueId = sq_GetUniqueId(activeObj); createSkillPassive_Fighter_bykk(obj,activeObj,PASSIVEOBJNUM_FWBYKK,0,0,0,sq_GetDirection(obj),3,255,1,group,uniqueId,0,0,0,0,0,0); } } } } function reset_Fighter_3bykk(obj) { if(sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSPIRIT) > 0){ if(!CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_DOUBLETHROW)){ local AddAppendage = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, APDPATH_DOUBLETHROW, true); local buffTime = sq_GetLevelData(obj, SKILL_FWBYKK_DOUBLETHROW, 0, sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW)); if(buffTime != 0) AddAppendage.sq_SetValidTime(buffTime); AddAppendage.setAppendCauseSkill(BUFF_CAUSE_SKILL, sq_getJob(obj), SKILL_FWBYKK_DOUBLETHROW, sq_GetSkillLevel(obj, SKILL_FWBYKK_DOUBLETHROW)); CNSquirrelAppendage.sq_Append(AddAppendage, obj, obj, true); } } setSkillBonusRate_3StreetFighter_bykk(obj) } function setSkillBonusRate_3StreetFighter_bykk(obj) { local bonusRate = 1000; if(CNSquirrelAppendage.sq_IsAppendAppendage(obj, APDPATH_POISONSNAKE_BUFF)) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_FWBYKK_POISONSNAKE, 15, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSNAKE))) / 1000; print("bonusRate0 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONMASTERY) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_FWBYKK_POISONMASTERY, 5, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONMASTERY))) / 1000; print("bonusRate1 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSPIRIT) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_FWBYKK_POISONSPIRIT, 1, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSPIRIT))) / 1000; print("bonusRate2 = "+bonusRate); if(sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSTUN) > 0) bonusRate = bonusRate * (1000 + sq_GetLevelData(obj, SKILL_FWBYKK_POISONSTUN, 3, sq_GetSkillLevel(obj, SKILL_FWBYKK_POISONSTUN))) / 1000; print("bonusRate3 = "+bonusRate); obj.getVar("setSkillBonusRate").setInt(0, bonusRate.tointeger()); //sq_SetSkillAttackBonus(obj, bonusRate); }