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
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
|
|
|