You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

513 lines
8.7 KiB

--------------------------------------------------------------------------------
-- Kingkong Routine --
--------------------------------------------------------------------------------
function PlayerMapLogin( MapIndex, Handle )
cExecCheck "PlayerMapLogin"
if MapIndex == nil
then
DebugLog( "PlayerMapLogin::MapIndex == nil")
return
end
if Handle == nil
then
DebugLog( "PlayerMapLogin::Handle == nil")
return
end
local Var = InstanceField[ MapIndex ]
if Var == nil
then
DebugLog( "PlayerMapLogin::Var == nil")
return
end
-- 첫 플레이어의 맵 로그인 체크
Var["bPlayerMapLogin"] = true
-- 시간 설정이 아직 되지 않은 경우에는 아무것도 실행하지 않는다.
if Var["KQLimitTime"] == nil
then
return
end
if Var["CurSec"] == nil
then
return
end
-- 현재 시간 기준으로 제한시간을 받아서 요청한다.
local nLimitSec = Var["KQLimitTime"] - Var["CurSec"]
cShowKQTimerWithLife_Obj( Handle, nLimitSec )
end
MemBlock = {}
function BossRoutine( Handle, MapIndex )
cExecCheck "BossRoutine"
if InstanceField[MapIndex] == nil
then
MemBlock[Handle] = nil
cAIScriptSet( Handle )
return ReturnAI["END"]
end
if cIsObjectDead( Handle ) == 1
then
MemBlock[Handle] = nil
cAIScriptSet( Handle )
return ReturnAI["END"]
end
local CurSec = cCurrentSecond()
local Var = MemBlock[Handle]
if Var == nil
then
MemBlock[Handle] = {}
Var = MemBlock[Handle]
Var["Handle"] = Handle
Var["MapIndex"] = MapIndex
-- 리젠 다이얼로그 처리 관련 정보 초기화
Var["RegenDialog"] = {}
Var["RegenDialog"]["Data"] = BossDialog["BossFloorStart"]
Var["RegenDialog"]["Step"] = 1
Var["RegenDialog"]["Wait"] = CurSec
-- 보스 페이즈 처리 관련 정보 초기화
Var["HPChkTime"] = 0
Var["SkillRate"] = {}
Var["Summon"] = {}
Var["Heal"] = {}
Var["SkillRate"]["Step"] = 1
Var["Summon"]["Step"] = 1
Var["Heal"]["Step"] = 1
Var["SkillRate"]["Flag"] = false
Var["Summon"]["Flag"] = false
Var["Heal"]["Flag"] = false
if Var["SkillRate"]["Step"] <= #BossSkillRateNameTable
then
Var["SkillRate"]["CurData"] = BossSkillRate[ BossSkillRateNameTable[ Var["SkillRate"]["Step"] ] ]
end
if Var["Summon"]["Step"] <= #BossSummonNameTable
then
Var["Summon"]["CurData"] = BossSummon[ BossSummonNameTable[ Var["Summon"]["Step"] ] ]
end
if Var["Heal"]["Step"] <= #BossHealNameTable
then
Var["Heal"]["CurData"] = BossHeal[ BossHealNameTable[ Var["Heal"]["Step"] ] ]
end
cMobDetectRange( Var["Handle"], BossDetectRange["Regen"] )
cAIScriptFunc( Var["Handle"], "MobDamaged", "BossDamaged" )
local Curhp, Maxhp = cObjectHP( Var["Handle"] )
BossDamaged( Var["MapIndex"], 0, Maxhp, Curhp, Var["Handle"] )
end
-- 최초 타겟 설정시 DetectRange 늘려줌
if Var["TargetHandle"] == nil
then
Var["TargetHandle"] = cTargetHandle( Var["Handle"] )
if Var["TargetHandle"] ~= nil
then
cMobDetectRange( Var["Handle"], BossDetectRange["View"] )
end
end
-- 한번에 많은 데미지를 입어서 제대로 처리 안될 가능성 때문에 1초마다 hp 체크.
if Var["HPChkTime"] + 1 <= CurSec
then
Var["HPChkTime"] = CurSec
local Curhp, Maxhp = cObjectHP( Var["Handle"] )
BossDamaged( Var["MapIndex"], 0, Maxhp, Curhp, Var["Handle"] )
end
RegenDialogProc( Var )
SkillRateChange( Var )
SummonMob( Var )
Recovery( Var )
return ReturnAI["CPP"]
end
function RegenDialogProc( Var )
cExecCheck "RegenDialogProc"
if Var == nil
then
return
end
if Var["RegenDialog"] == nil
then
return
end
if Var["RegenDialog"]["Step"] > #Var["RegenDialog"]["Data"]
then
Var["RegenDialog"] = nil
return
end
local CurSec = cCurrentSecond()
local CurData = Var["RegenDialog"]["Data"][ Var["RegenDialog"]["Step"] ]
if Var["RegenDialog"]["Wait"] + CurData["Delay"] > CurSec
then
return
end
cMobDialog( Var["MapIndex"], CurData["MobIndex"], BossDialog["ScriptFileName"], CurData["Index"] )
Var["RegenDialog"]["Wait"] = CurSec
Var["RegenDialog"]["Step"] = Var["RegenDialog"]["Step"] + 1
end
function BossDamaged( MapIndex, Attacker, MaxHP, CurHP, Defender )
cExecCheck "BossDamaged"
local Var = MemBlock[Defender]
if Var == nil
then
return
end
local HPRate = (CurHP * 1000) / MaxHP
SkillRateCheck( Var, HPRate )
SummonCheck( Var, HPRate )
HealCheck( Var, HPRate )
end
function SkillRateCheck( Var, HPRate )
cExecCheck "SkillRateCheck"
if Var == nil
then
return
end
if Var["SkillRate"] == nil
then
return
end
if Var["SkillRate"]["Flag"] == true
then
return
end
if HPRate > Var["SkillRate"]["CurData"]["HPRate"]
then
return
end
Var["SkillRate"]["Flag"] = true
end
function SkillRateChange( Var )
cExecCheck "SkillRateChange"
if Var == nil
then
return
end
if Var["SkillRate"] == nil
then
return
end
if Var["SkillRate"]["Flag"] == false
then
return
end
-- 무기 확률 변경
local Values = Var["SkillRate"]["CurData"]["Value"]
cMobWeaponRate( Var["Handle"], Values[1], Values[2], Values[3], Values[4] )
Var["SkillRate"]["Step"] = Var["SkillRate"]["Step"] + 1
if Var["SkillRate"]["Step"] > #BossSkillRateNameTable
then
Var["SkillRate"] = nil
else
Var["SkillRate"]["CurData"] = BossSkillRate[ BossSkillRateNameTable[ Var["SkillRate"]["Step"] ] ]
Var["SkillRate"]["Flag"] = false
end
end
function SummonCheck( Var, HPRate )
cExecCheck "SummonCheck"
if Var == nil
then
return
end
if Var["Summon"] == nil
then
return
end
if Var["Summon"]["Flag"] == true
then
return
end
if HPRate > Var["Summon"]["CurData"]["HPRate"]
then
return
end
Var["Summon"]["Flag"] = true
end
function SummonMob( Var )
cExecCheck "SummonMob"
if Var == nil
then
return
end
if Var["Summon"] == nil
then
return
end
if Var["Summon"]["Flag"] == false
then
return
end
-- 다이얼로그 띄우고 2초 딜레이
if Var["Summon"]["OnTime"] == nil
then
local LastFloorName = FloorNameTable[#FloorNameTable]
local LastBossIndex = RegenInfo["BossMob"][LastFloorName]["Success"]["Index"]
cMobDialog( Var["MapIndex"], LastBossIndex, BossDialog["ScriptFileName"], BossDialog["SummonMob"]["Index"] )
Var["Summon"]["OnTime"] = cCurrentSecond()
end
if Var["Summon"]["OnTime"] + BossSummon["BossSummonDelay"] > cCurrentSecond()
then
return
end
Var["Summon"]["OnTime"] = nil
-- 소환
local Values = Var["Summon"]["CurData"]["Value"]
for i = 1, #Values
do
cMobRegen_Obj( Values[i], Var["Handle"] )
end
Var["Summon"]["Step"] = Var["Summon"]["Step"] + 1
if Var["Summon"]["Step"] > #BossSummonNameTable
then
Var["Summon"] = nil
else
Var["Summon"]["CurData"] = BossSummon[ BossSummonNameTable[ Var["Summon"]["Step"] ] ]
Var["Summon"]["Flag"] = false
end
end
function HealCheck( Var, HPRate )
cExecCheck "HealCheck"
if Var == nil
then
return
end
if Var["Heal"] == nil
then
return
end
if Var["Heal"]["Flag"] == true
then
return
end
if HPRate > Var["Heal"]["CurData"]["HPRate"]
then
return
end
Var["Heal"]["Flag"] = true
end
function Recovery( Var )
cExecCheck "Recovery"
if Var == nil
then
return
end
if Var["Heal"] == nil
then
return
end
if Var["Heal"]["Flag"] == false
then
return
end
local CurSec = cCurrentSecond()
if Var["Heal"]["HealTickCount"] == nil
then
-- 다이얼로그 띄우고 2초 딜레이
if Var["Heal"]["OnTime"] == nil
then
local LastFloorName = FloorNameTable[#FloorNameTable]
local LastBossIndex = RegenInfo["BossMob"][LastFloorName]["Success"]["Index"]
cMobDialog( Var["MapIndex"], LastBossIndex, BossDialog["ScriptFileName"], BossDialog["Heal"]["Index"] )
Var["Heal"]["OnTime"] = CurSec
end
if Var["Heal"]["OnTime"] + BossHeal["BossHealDelay"] > CurSec
then
return
end
-- 아이들 대기
if cWaitIdle( Var["Handle"] ) == nil
then
return
end
-- 상태이상 걸어주고, 애니매이션 걸어줌
cSetAbstate( Var["Handle"], BossHeal["Abstate"]["Index"], BossHeal["Abstate"]["Strength"], BossHeal["Abstate"]["KeepTime"] )
cAnimate( Var["Handle"], "start", BossHeal["AniIndex"] )
Var["Heal"]["HealTickCount"] = BossHeal["Tick"]
Var["Heal"]["OnTime"] = nil
Var["Heal"]["ChkTime"] = CurSec
end
if Var["Heal"]["ChkTime"] + BossHeal["TickTime"] > CurSec
then
return
end
Var["Heal"]["ChkTime"] = CurSec
-- 힐
cHeal( Var["Handle"], Var["Heal"]["CurData"]["Value"] )
Var["Heal"]["HealTickCount"] = Var["Heal"]["HealTickCount"] - 1
if Var["Heal"]["HealTickCount"] <= 0
then
cAnimate( Var["Handle"], "stop" )
Var["Heal"]["Step"] = Var["Heal"]["Step"] + 1
Var["Heal"]["HealTickCount"] = nil
Var["Heal"]["OnTime"] = nil
Var["Heal"]["ChkTime"] = nil
if Var["Heal"]["Step"] > #BossHealNameTable
then
Var["Heal"] = nil
else
Var["Heal"]["CurData"] = BossHeal[ BossHealNameTable[ Var["Heal"]["Step"] ] ]
Var["Heal"]["Flag"] = false
end
end
end