3621 lines
136 KiB
C
3621 lines
136 KiB
C
|
|
//抛沙
|
|
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);
|
|
}
|
|
|
|
|