Rindro-Sqr/user/114.66.51.249/4_fighter_1.c

3621 lines
136 KiB
C
Raw Normal View History

2025-11-08 12:21:06 +08:00
//抛沙
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);
}