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.
2341 lines
51 KiB
2341 lines
51 KiB
require( "common" )
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
--[[ ]]--
|
|
--[[ 퍼즐게임 데이터 ]]--
|
|
--[[ ]]--
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
|
|
PG_INVALID_VALUE = -1
|
|
PG_SUFFLE_COUNT = 500 -- 퍼즐 조각 섞는 횟수
|
|
PG_REWARD_RANGE = 1200 -- 보상 상태이상 걸어줄 범위
|
|
PG_NO_CLICK_TIME = 30 -- 게임 진행중 클릭 안하고 이 시간동안 대기시 게임 종료
|
|
PG_WATING_TIME = 15 -- 게임 대기 시간
|
|
PG_PIECE_VANISH_TIME = 0.2
|
|
|
|
-- 게임 모드
|
|
PG_PUZZLE_MODE =
|
|
{
|
|
PGM_SLIME = 1,
|
|
PGM_HONEYING = 2,
|
|
PGM_ALL_PLAY = 3,
|
|
}
|
|
|
|
-- 퍼즐 크기
|
|
-- ( 퍼즐 크기가 바뀐다면 PG_PIECE_INFO의 내용 수정이 필요함 )
|
|
PG_PUZZLE_SIZE =
|
|
{
|
|
-- 슬라임 퍼즐
|
|
{ PS_WIDTH = 4, PS_HEIGHT = 4 },
|
|
-- 하닝 퍼즐
|
|
{ PS_WIDTH = 4, PS_HEIGHT = 4 },
|
|
}
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------------------
|
|
--**************************************************************************************--
|
|
-- --
|
|
-- 캐릭터 타이틀 보상( 국가마다 캐릭터 타이틀 아이디가 다르기 때문에 주의해야 함 ) --
|
|
-- --
|
|
--**************************************************************************************--
|
|
------------------------------------------------------------------------------------------
|
|
|
|
PG_GAME_DATA =
|
|
{
|
|
-- Slime
|
|
{
|
|
PGD_COST = 1000, -- 게임 시작시 필요한 금액
|
|
PGD_PLAYTIME = 150,
|
|
PGD_REWARD_ABSTATE = -- 보상 상태이상
|
|
{
|
|
{ PRA_INDEX = "StaPzlReward_S", PRA_KEEPTIME = 60*60*1000 },
|
|
},
|
|
PGD_REWARD_CHARTITLE = { PRC_ID = 114, PRC_VALUE = 1 },
|
|
},
|
|
-- Honeying
|
|
{
|
|
PGD_COST = 1000,
|
|
PGD_PLAYTIME = 150,
|
|
PGD_REWARD_ABSTATE =
|
|
{
|
|
{ PRA_INDEX = "StaPzlReward_H", PRA_KEEPTIME = 60*60*1000 },
|
|
},
|
|
PGD_REWARD_CHARTITLE = { PRC_ID = 115, PRC_VALUE = 1 },
|
|
},
|
|
-- All
|
|
{
|
|
PGD_COST = 1000,
|
|
PGD_PLAYTIME = 300,
|
|
PGD_REWARD_ABSTATE =
|
|
{
|
|
{ PRA_INDEX = "StaPzlReward_SH1", PRA_KEEPTIME = 60*60*1000 },
|
|
{ PRA_INDEX = "StaPzlReward_SH2", PRA_KEEPTIME = 60*60*1000 },
|
|
},
|
|
PGD_REWARD_CHARTITLE = { PRC_ID = 116, PRC_VALUE = 1 },
|
|
},
|
|
}
|
|
|
|
PG_BASE_BOARD_DATA =
|
|
{
|
|
{ BB_INDEX = "PzlBoard_4x4", BB_REGEN_POS = { RP_X = 11430, RP_Y = 13608, RP_DIR = 90 } },
|
|
{ BB_INDEX = "PzlBoard_4x4", BB_REGEN_POS = { RP_X = 11430, RP_Y = 13269, RP_DIR = 90 } },
|
|
}
|
|
|
|
PG_COMPLETION_PUZZLE_DATA =
|
|
{
|
|
{ CP_INDEX = "PzlSlimeFull", CP_REGEN_POS = { RP_X = 11430, RP_Y = 13608, RP_DIR = 270 } },
|
|
{ CP_INDEX = "PzlHoneyFull", CP_REGEN_POS = { RP_X = 11430, RP_Y = 13269, RP_DIR = 270 } },
|
|
}
|
|
|
|
-- 퍼즐 조각 정보
|
|
PG_PIECE_INFO =
|
|
{
|
|
-- 4 X 4 슬라임 퍼즐
|
|
{
|
|
{ PI_INDEX = "PzlSlime1_1", PI_REGEN_POS = { PI_X = 11355, PI_Y = 13533, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime1_2", PI_REGEN_POS = { PI_X = 11355, PI_Y = 13583, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime1_3", PI_REGEN_POS = { PI_X = 11355, PI_Y = 13633, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime1_4", PI_REGEN_POS = { PI_X = 11355, PI_Y = 13683, PI_DIR = 270 } },
|
|
|
|
{ PI_INDEX = "PzlSlime2_1", PI_REGEN_POS = { PI_X = 11405, PI_Y = 13533, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime2_2", PI_REGEN_POS = { PI_X = 11405, PI_Y = 13583, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime2_3", PI_REGEN_POS = { PI_X = 11405, PI_Y = 13633, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime2_4", PI_REGEN_POS = { PI_X = 11405, PI_Y = 13683, PI_DIR = 270 } },
|
|
|
|
{ PI_INDEX = "PzlSlime3_1", PI_REGEN_POS = { PI_X = 11455, PI_Y = 13533, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime3_2", PI_REGEN_POS = { PI_X = 11455, PI_Y = 13583, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime3_3", PI_REGEN_POS = { PI_X = 11455, PI_Y = 13633, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime3_4", PI_REGEN_POS = { PI_X = 11455, PI_Y = 13683, PI_DIR = 270 } },
|
|
|
|
{ PI_INDEX = "PzlSlime4_1", PI_REGEN_POS = { PI_X = 11505, PI_Y = 13533, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime4_2", PI_REGEN_POS = { PI_X = 11505, PI_Y = 13583, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlSlime4_3", PI_REGEN_POS = { PI_X = 11505, PI_Y = 13633, PI_DIR = 270 } },
|
|
{ PI_INDEX = nil, PI_REGEN_POS = { PI_X = 11505, PI_Y = 13683, PI_DIR = 270 } },
|
|
},
|
|
|
|
-- 4 X 4 허닝 퍼즐
|
|
{
|
|
{ PI_INDEX = "PzlHoney1_1", PI_REGEN_POS = { PI_X = 11355, PI_Y = 13194, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney1_2", PI_REGEN_POS = { PI_X = 11355, PI_Y = 13244, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney1_3", PI_REGEN_POS = { PI_X = 11355, PI_Y = 13294, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney1_4", PI_REGEN_POS = { PI_X = 11355, PI_Y = 13344, PI_DIR = 270 } },
|
|
|
|
{ PI_INDEX = "PzlHoney2_1", PI_REGEN_POS = { PI_X = 11405, PI_Y = 13194, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney2_2", PI_REGEN_POS = { PI_X = 11405, PI_Y = 13244, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney2_3", PI_REGEN_POS = { PI_X = 11405, PI_Y = 13294, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney2_4", PI_REGEN_POS = { PI_X = 11405, PI_Y = 13344, PI_DIR = 270 } },
|
|
|
|
{ PI_INDEX = "PzlHoney3_1", PI_REGEN_POS = { PI_X = 11455, PI_Y = 13194, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney3_2", PI_REGEN_POS = { PI_X = 11455, PI_Y = 13244, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney3_3", PI_REGEN_POS = { PI_X = 11455, PI_Y = 13294, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney3_4", PI_REGEN_POS = { PI_X = 11455, PI_Y = 13344, PI_DIR = 270 } },
|
|
|
|
{ PI_INDEX = "PzlHoney4_1", PI_REGEN_POS = { PI_X = 11505, PI_Y = 13194, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney4_2", PI_REGEN_POS = { PI_X = 11505, PI_Y = 13244, PI_DIR = 270 } },
|
|
{ PI_INDEX = "PzlHoney4_3", PI_REGEN_POS = { PI_X = 11505, PI_Y = 13294, PI_DIR = 270 } },
|
|
{ PI_INDEX = nil, PI_REGEN_POS = { PI_X = 11505, PI_Y = 13344, PI_DIR = 270 } },
|
|
},
|
|
}
|
|
|
|
PG_TOPVIEW_DATA =
|
|
{
|
|
PTD_CENTER_POS = { PCP_X = 11430, PCP_Y = 13439 },
|
|
PTD_RANGE = 530,
|
|
PTD_DEGREE = 270,
|
|
}
|
|
|
|
-- 상황에 맞는 다이얼로그 정보
|
|
PG_CIRCUMSTANCE_DIALOG =
|
|
{
|
|
MONEY_LACK = { EFFECTMSG = nil, FACECUT = "Xiaoming", FILENAME = "Event", INDEX = "Xiaoming_05" },
|
|
GAME_ALREADY_PLAY = { EFFECTMSG = nil, FACECUT = nil, FILENAME = "Event", INDEX = "SystemMsg_01" },
|
|
GAME_WATING = { EFFECTMSG = nil, FACECUT = nil, FILENAME = "Event", INDEX = "SystemMsg_02" },
|
|
GAMEOVER_NO_CLICK = { EFFECTMSG = nil, FACECUT = nil, FILENAME = "Event", INDEX = "SystemMsg_03" },
|
|
}
|
|
|
|
PG_ANNOUNCE_DATA =
|
|
{
|
|
PLAY_TIME = "Pzl_Success_CostTime"
|
|
}
|
|
|
|
-- 게임 진행시 필요한 상태이상
|
|
PG_ABSTATE_DATA =
|
|
{
|
|
PAD_USER_STUN = { INDEX = "StaAdlFStun", KEEPTIME = 9999999 },
|
|
PAD_FOMING_EFFECT = { INDEX = "StaPzlOccupy", KEEPTIME = 9999999 },
|
|
PAD_GAME_SELECT = { INDEX = "StaPzlHide", KEEPTIME = 1000 },
|
|
}
|
|
|
|
-- 도어 블럭 정보
|
|
PG_DOOR_BLOCK =
|
|
{
|
|
PDB_DOOR_INDEX = "GuildGate00",
|
|
PDB_BLOCK_INDEX = "Xiaoming",
|
|
PDB_REGEN_POSITION = { X = 0, Y = 0, DIR = 0}
|
|
}
|
|
|
|
PG_MOVABLE_CELL =
|
|
{
|
|
PMC_UP = 1,
|
|
PMC_DOWN = 2,
|
|
PMC_LEFT = 3,
|
|
PMC_RIGHT = 4,
|
|
}
|
|
|
|
PG_GAME_STATE =
|
|
{
|
|
PGS_WAIT = 1,
|
|
PGS_COUNT = 2,
|
|
PGS_PROGRESS = 3,
|
|
PGS_COMPLETE = 4,
|
|
PGS_FAIL = 5,
|
|
}
|
|
|
|
PG_PUZZLE_STATE =
|
|
{
|
|
PPS_WAIT = 1,
|
|
PPS_PROGRESS = 2,
|
|
PPS_COMPLETE = 3,
|
|
}
|
|
|
|
---------------------------------------------------------------------------------------------------------------------------------------
|
|
--***********************************************************************************************************************************--
|
|
-- --
|
|
-- 게임 진행정보는 파일 맨 밑에 있음 --
|
|
-- --
|
|
--***********************************************************************************************************************************--
|
|
---------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
--[[ ]]--
|
|
--[[ 테이블 구조 ]]--
|
|
--[[ ]]--
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
|
|
--[[
|
|
PuzzleMemory =
|
|
{
|
|
PM_CurrentTime = 현재 시간
|
|
PM_EventMap = "맵인덱스"
|
|
PM_NPCHandle = 메인NPC 핸들
|
|
|
|
|
|
PM_State = PG_GAME_STATE["PGS_WAIT"]
|
|
PM_StepInfo = {
|
|
SI_Step = 스텝의 세부단계
|
|
SI_NextStepTime = 다음 스텝 시간
|
|
},
|
|
|
|
PM_GameInfo = {
|
|
GI_GameMode = 모드,
|
|
GI_CharHandle = 존 핸들
|
|
GI_CharNumber = 캐릭터 넘버,
|
|
GI_StartTime = 게임 시작 시간,
|
|
GI_GameEndTime = 게임 종료 시간,
|
|
GI_NoClickTime = 게임 클릭 안할 시 게임종료 되는 시간,
|
|
},
|
|
|
|
PG_PrevGamePlayer = {
|
|
PP_CharNumber = 캐릭터 넘버
|
|
PP_WaitingTime = 다음 플레이 가능한 시간
|
|
}
|
|
|
|
[게임타입] = tPuzzleBoard( 아래 테이블 ),
|
|
PM_PieceArray[PI_Handle] = CI_PieceInfo....
|
|
}
|
|
|
|
tPuzzleBoard =
|
|
{
|
|
PB_State = 대기, 진행, 완료,
|
|
PB_EmptyCellID = CI_ID,
|
|
|
|
PB_MovableCell = {
|
|
PMC_UP = CI_ID,
|
|
PMC_DOWN = CI_ID,
|
|
PMC_LEFT = CI_ID,
|
|
PMC_RIGHT = CI_ID,
|
|
},
|
|
|
|
-- 무슨게임인지 모르기 때문에 크기를 저장함
|
|
PB_BoardSize = {
|
|
MaxCell = ,
|
|
MaxWidth = ,
|
|
MaxHeight =
|
|
},
|
|
|
|
PB_CellArray = {
|
|
CellInfo = {
|
|
CI_ID
|
|
CI_PieceInfo =
|
|
{
|
|
PI_ID,
|
|
PI_Handle,
|
|
PI_GameType,
|
|
}
|
|
}
|
|
.......
|
|
}
|
|
PB_BaseBoard = {
|
|
BB_Handle = BaseBoard 핸들
|
|
}
|
|
PB_CellList[PI_Handle] = CellInfo
|
|
}
|
|
--]]
|
|
|
|
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
--[[ ]]--
|
|
--[[ 퍼즐게임 함수 ]]--
|
|
--[[ ]]--
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
|
|
|
|
-- 이벤트 정보를 저장할 메모리
|
|
g_PuzzleMemory = { }
|
|
g_EventNPCHandle = { }
|
|
g_DieInfo = { }
|
|
|
|
|
|
function Xiaoming( Handle, MapIndex )
|
|
cExecCheck( "Xiaoming" )
|
|
|
|
if cIsObjectDead( Handle )
|
|
then
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
PuzzleMemory[Handle] = nil
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
|
|
local PuzzleMemory
|
|
|
|
|
|
PuzzleMemory = g_PuzzleMemory[Handle]
|
|
if PuzzleMemory == nil
|
|
then
|
|
|
|
cAIScriptFunc( Handle, "NPCClick", "PG_MAIN_NPC_CLICK" )
|
|
cAIScriptFunc( Handle, "NPCMenu", "PG_NPCMENU_ACK" )
|
|
|
|
g_PuzzleMemory[Handle] = { }
|
|
PuzzleMemory = g_PuzzleMemory[Handle]
|
|
|
|
PuzzleMemory["PM_NPCHandle"] = Handle
|
|
PuzzleMemory["PM_DoorBlockHandle"] = PG_INVALID_VALUE
|
|
PuzzleMemory["PM_CurrentTime"] = cCurrentSecond()
|
|
PuzzleMemory["PM_EventMap"] = MapIndex
|
|
PuzzleMemory["PM_State"] = PG_GAME_STATE["PGS_WAIT"]
|
|
|
|
PuzzleMemory["PM_StepInfo"] = { }
|
|
PuzzleMemory["PM_GameInfo"] = { }
|
|
PuzzleMemory["PG_PrevGamePlayer"] = { }
|
|
PuzzleMemory["PM_PieceArray"] = { }
|
|
|
|
PuzzleMemory["PM_StepInfo"]["SI_Step"] = 1
|
|
PuzzleMemory["PM_StepInfo"]["SI_NextStepTime"] = PuzzleMemory["PM_CurrentTime"]
|
|
|
|
PuzzleMemory["PM_GameInfo"]["GI_GameMode"] = PG_INVALID_VALUE
|
|
PuzzleMemory["PM_GameInfo"]["GI_CharNumber"] = PG_INVALID_VALUE
|
|
PuzzleMemory["PM_GameInfo"]["GI_CharHandle"] = PG_INVALID_VALUE
|
|
PuzzleMemory["PM_GameInfo"]["GI_StartTime"] = PG_INVALID_VALUE
|
|
PuzzleMemory["PM_GameInfo"]["GI_GameEndTime"] = PG_INVALID_VALUE
|
|
PuzzleMemory["PM_GameInfo"]["GI_NoClickTime"] = PG_INVALID_VALUE
|
|
|
|
PuzzleMemory["PG_PrevGamePlayer"]["PP_CharNumber"] = PG_INVALID_VALUE
|
|
PuzzleMemory["PG_PrevGamePlayer"]["PP_WaitingTime"] = PG_INVALID_VALUE
|
|
|
|
PG_EVENT_OPEN( PuzzleMemory )
|
|
|
|
end
|
|
|
|
PuzzleMemory["PM_CurrentTime"] = cCurrentSecond()
|
|
|
|
PG_GAME_ROUTINE( PuzzleMemory )
|
|
|
|
end
|
|
|
|
|
|
function PG_EVENT_OPEN( PuzzleMemory )
|
|
cExecCheck( "PG_EVENT_OPEN" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
--[[
|
|
PuzzleMemory["PM_DoorBlockHandle"] = cDoorBuild( PuzzleMemory["PM_EventMap"], PG_DOOR_BLOCK["PDB_DOOR_INDEX"],
|
|
PG_DOOR_BLOCK["PDB_REGEN_POSITION"]["X"], PG_DOOR_BLOCK["PDB_REGEN_POSITION"]["Y"], PG_DOOR_BLOCK["PDB_REGEN_POSITION"]["DIR"], 1000 )
|
|
|
|
if PuzzleMemory["PM_DoorBlockHandle"] ~= nil
|
|
then
|
|
cDoorAction( PuzzleMemory["PM_DoorBlockHandle"], PG_DOOR_BLOCK["PDB_BLOCK_INDEX"], "close" )
|
|
end
|
|
--]]
|
|
|
|
for i = 1, #PG_BASE_BOARD_DATA do
|
|
|
|
local PuzzleBoard = { }
|
|
local BaseBoard = { }
|
|
|
|
|
|
PuzzleBoard["PB_MovableCell"] = { }
|
|
PuzzleBoard["PB_BoardSize"] = { }
|
|
PuzzleBoard["PB_BaseBoard"] = { }
|
|
PuzzleBoard["PB_CellArray"] = { }
|
|
PuzzleBoard["PB_CellList"] = { }
|
|
|
|
PuzzleBoard["PB_MovableCell"][PG_MOVABLE_CELL["PMC_UP"]] = PG_INVALID_VALUE
|
|
PuzzleBoard["PB_MovableCell"][PG_MOVABLE_CELL["PMC_DOWN"]] = PG_INVALID_VALUE
|
|
PuzzleBoard["PB_MovableCell"][PG_MOVABLE_CELL["PMC_LEFT"]] = PG_INVALID_VALUE
|
|
PuzzleBoard["PB_MovableCell"][PG_MOVABLE_CELL["PMC_RIGHT"]] = PG_INVALID_VALUE
|
|
|
|
PuzzleBoard["PB_BoardSize"]["MaxWidth"] = PG_PUZZLE_SIZE[i]["PS_WIDTH"]
|
|
PuzzleBoard["PB_BoardSize"]["MaxHeight"] = PG_PUZZLE_SIZE[i]["PS_HEIGHT"]
|
|
PuzzleBoard["PB_BoardSize"]["MaxCell"] = PG_PUZZLE_SIZE[i]["PS_WIDTH"] * PG_PUZZLE_SIZE[i]["PS_HEIGHT"]
|
|
|
|
PuzzleBoard["PB_State"] = PG_PUZZLE_STATE["PPS_WAIT"]
|
|
PuzzleBoard["PB_EmptyCellID"] = PuzzleBoard["PB_BoardSize"]["MaxCell"]
|
|
|
|
PG_GET_MOVABLE_CELL( PuzzleBoard )
|
|
|
|
|
|
-- 퍼즐판 생성
|
|
local BaseBoardLoc
|
|
|
|
|
|
BaseBoardLoc = PG_BASE_BOARD_DATA[i]["BB_REGEN_POS"]
|
|
PuzzleBoard["PB_BaseBoard"]["BB_Handle"] = cMobRegen_XY( PuzzleMemory["PM_EventMap"], PG_BASE_BOARD_DATA[i]["BB_INDEX"],
|
|
BaseBoardLoc["RP_X"], BaseBoardLoc["RP_Y"], BaseBoardLoc["RP_DIR"] )
|
|
|
|
if PuzzleBoard["PB_BaseBoard"]["BB_Handle"] ~= nil
|
|
then
|
|
cAIScriptSet ( PuzzleBoard["PB_BaseBoard"]["BB_Handle"], PuzzleMemory["PM_NPCHandle"] )
|
|
cAIScriptFunc ( PuzzleBoard["PB_BaseBoard"]["BB_Handle"], "Entrance", "PG_PIECE_ROUTINE" )
|
|
|
|
PuzzleMemory["PM_PieceArray"][PuzzleBoard["PB_BaseBoard"]["BB_Handle"]] = PuzzleBoard["PB_BaseBoard"]
|
|
g_PuzzleMemory[PuzzleBoard["PB_BaseBoard"]["BB_Handle"]] = PuzzleMemory
|
|
end
|
|
|
|
|
|
-- 완료 퍼즐 생성
|
|
local ComplPuzzleLoc
|
|
local PieceInfo = { }
|
|
local CellInfo = { }
|
|
|
|
|
|
ComplPuzzleLoc = PG_COMPLETION_PUZZLE_DATA[i]["CP_REGEN_POS"]
|
|
PieceInfo["PI_Handle"] = cMobRegen_XY( PuzzleMemory["PM_EventMap"], PG_COMPLETION_PUZZLE_DATA[i]["CP_INDEX"],
|
|
ComplPuzzleLoc["RP_X"], ComplPuzzleLoc["RP_Y"], ComplPuzzleLoc["RP_DIR"] )
|
|
if PieceInfo["PI_Handle"] ~= nil
|
|
then
|
|
cAIScriptSet ( PieceInfo["PI_Handle"], PuzzleMemory["PM_NPCHandle"] )
|
|
cAIScriptFunc ( PieceInfo["PI_Handle"], "Entrance", "PG_PIECE_ROUTINE" )
|
|
|
|
|
|
g_PuzzleMemory[PieceInfo["PI_Handle"]] = PuzzleMemory
|
|
|
|
PieceInfo["PI_ID"] = 1
|
|
PieceInfo["PI_GameType"] = i
|
|
|
|
CellInfo["CI_ID"] = 1
|
|
CellInfo["CI_PieceInfo"] = PieceInfo
|
|
|
|
PuzzleBoard["PB_CellArray"][1] = CellInfo
|
|
PuzzleBoard["PB_CellList"][PieceInfo["PI_Handle"]] = CellInfo
|
|
|
|
PuzzleMemory["PM_PieceArray"][PieceInfo["PI_Handle"]] = PieceInfo
|
|
end
|
|
|
|
PuzzleMemory[i] = PuzzleBoard
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
--[[ ]]--
|
|
--[[ 메인 루틴 / 몬스터 루틴 ]]--
|
|
--[[ ]]--
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
function PG_GAME_ROUTINE( PuzzleMemory )
|
|
cExecCheck( "PG_GAME_ROUTINE" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
local PuzzleState
|
|
local GameInfo
|
|
local StepInfo
|
|
local PuzzleStep
|
|
local ProgressData
|
|
local ProgressStepData
|
|
|
|
|
|
PuzzleState = PuzzleMemory["PM_State"]
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
StepInfo = PuzzleMemory["PM_StepInfo"]
|
|
if StepInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleStep = StepInfo["SI_Step"]
|
|
if PuzzleMemory["PM_CurrentTime"] < StepInfo["SI_NextStepTime"]
|
|
then
|
|
return
|
|
end
|
|
|
|
ProgressData = PG_PROGRESS_DATA[PuzzleState]
|
|
ProgressStepData = ProgressData["PPD_STEP_INFO"][PuzzleStep]
|
|
|
|
|
|
if ProgressStepData["PPD_EFFECTMSG"] ~= nil
|
|
then
|
|
cEffectMsg( GameInfo["GI_CharHandle"], ProgressStepData["PPD_EFFECTMSG"] )
|
|
end
|
|
|
|
if ProgressStepData["PPD_MOBCHAT"] ~= nil
|
|
then
|
|
cMobChat( PuzzleMemory["PM_NPCHandle"], ProgressStepData["PPD_MOBCHAT"]["FILENAME"], ProgressStepData["PPD_MOBCHAT"]["INDEX"] )
|
|
end
|
|
|
|
if ProgressStepData["PPD_FACECUT"] ~= nil
|
|
then
|
|
cMobDialog_Obj( GameInfo["GI_CharHandle"], ProgressStepData["PPD_FACECUT"]["FACECUT"], ProgressStepData["PPD_FACECUT"]["FILENAME"], ProgressStepData["PPD_FACECUT"]["INDEX"] )
|
|
end
|
|
|
|
ProgressStepData["PPD_FUNC"]( PuzzleMemory )
|
|
|
|
StepInfo["SI_Step"] = StepInfo["SI_Step"] + 1
|
|
if StepInfo["SI_Step"] > ProgressData["PPD_STEP_COUNT"]
|
|
then
|
|
StepInfo["SI_Step"] = 1
|
|
|
|
if ProgressData["PPD_STEP_ISLOOP"] == false
|
|
then
|
|
PuzzleMemory["PM_State"] = PuzzleMemory["PM_State"] + 1
|
|
if PuzzleMemory["PM_State"] > PG_GAME_STATE["PGS_COMPLETE"]
|
|
then
|
|
PuzzleMemory["PM_State"] = PG_GAME_STATE["PGS_WAIT"]
|
|
StepInfo["SI_Step"] = 1
|
|
end
|
|
|
|
ProgressData = PG_PROGRESS_DATA[PuzzleState]
|
|
ProgressStepData = ProgressData["PPD_STEP_INFO"][PuzzleStep]
|
|
end
|
|
end
|
|
StepInfo["SI_NextStepTime"] = PuzzleMemory["PM_CurrentTime"] + ProgressStepData["PPD_DELAY"]
|
|
|
|
end
|
|
|
|
|
|
function PG_DUMMY_FUNCTION( PuzzleMemory )
|
|
cExecCheck( "PG_DUMMY_FUNCTION" )
|
|
|
|
end
|
|
|
|
|
|
function PG_PIECE_ROUTINE( Handle, MapIndex )
|
|
cExecCheck( "PG_PIECE_ROUTINE" )
|
|
|
|
local PuzzleMemory
|
|
local PieceArray
|
|
|
|
PuzzleMemory = g_PuzzleMemory[Handle]
|
|
if PuzzleMemory == nil
|
|
then
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
if cIsObjectDead( Handle )
|
|
then
|
|
|
|
if g_DieInfo[Handle] < PuzzleMemory["PM_CurrentTime"]
|
|
then
|
|
cAIScriptSet ( Handle )
|
|
cNPCVanish ( Handle )
|
|
|
|
g_PuzzleMemory[Handle] = nil
|
|
g_DieInfo[Handle] = nil
|
|
end
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
PieceArray = PuzzleMemory["PM_PieceArray"]
|
|
if PieceArray == nil
|
|
then
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
g_PuzzleMemory[Handle] = nil
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
if PieceArray[Handle] == nil
|
|
then
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
g_PuzzleMemory[Handle] = nil
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
if cIsObjectDead( PuzzleMemory["PM_NPCHandle"] )
|
|
then
|
|
cAIScriptSet( Handle )
|
|
cNPCVanish( Handle )
|
|
|
|
g_PuzzleMemory[Handle] = nil
|
|
|
|
return ReturnAI["END"]
|
|
end
|
|
|
|
return ReturnAI["END"]
|
|
|
|
end
|
|
|
|
|
|
function PG_COUNT_DELETE_BOARD( PuzzleMemory )
|
|
cExecCheck( "PG_COUNT_DELETE_BOARD" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleMemory["PM_State"] ~= PG_GAME_STATE["PGS_COUNT"]
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
PuzzleState = PuzzleMemory["PM_State"]
|
|
if PuzzleState ~= PG_GAME_STATE["PGS_COUNT"]
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local StepInfo
|
|
local PuzzleStep
|
|
local GameInfo
|
|
|
|
|
|
StepInfo = PuzzleMemory["PM_StepInfo"]
|
|
if StepInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleStep = StepInfo["SI_Step"]
|
|
if PuzzleStep == PG_INVALID_VALUE
|
|
then
|
|
return
|
|
end
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
if GameInfo["GI_GameMode"] == PG_PUZZLE_MODE["PGM_ALL_PLAY"]
|
|
then
|
|
|
|
for i = 1, #PG_BASE_BOARD_DATA do
|
|
|
|
local PuzzleBoard
|
|
local BaseBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[i]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PG_DELETE_PUZZLEBOARD ( i, PuzzleMemory )
|
|
PG_CREATE_BASE_CELL ( i, PuzzleMemory )
|
|
PG_SUFFLE_PIECES ( PuzzleBoard )
|
|
PG_GET_MOVABLE_CELL ( PuzzleBoard )
|
|
|
|
BaseBoard = PuzzleBoard["PB_BaseBoard"]
|
|
if BaseBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
cSetAbstate( BaseBoard["BB_Handle"], PG_ABSTATE_DATA["PAD_GAME_SELECT"]["INDEX"], 1, PG_ABSTATE_DATA["PAD_GAME_SELECT"]["KEEPTIME"] )
|
|
|
|
end
|
|
|
|
else
|
|
|
|
local PuzzleBoard
|
|
local BaseBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[GameInfo["GI_GameMode"]]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PG_DELETE_PUZZLEBOARD ( GameInfo["GI_GameMode"], PuzzleMemory )
|
|
PG_CREATE_BASE_CELL ( GameInfo["GI_GameMode"], PuzzleMemory )
|
|
PG_SUFFLE_PIECES ( PuzzleBoard )
|
|
PG_GET_MOVABLE_CELL ( PuzzleBoard )
|
|
|
|
BaseBoard = PuzzleBoard["PB_BaseBoard"]
|
|
if BaseBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
cSetAbstate( BaseBoard["BB_Handle"], PG_ABSTATE_DATA["PAD_GAME_SELECT"]["INDEX"], 1, PG_ABSTATE_DATA["PAD_GAME_SELECT"]["KEEPTIME"] )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
function PG_COUNT_EFFECT_BOARD( PuzzleMemory )
|
|
cExecCheck( "PG_COUNT_EFFECT_BOARD" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleMemory["PM_State"] ~= PG_GAME_STATE["PGS_COUNT"]
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
PuzzleState = PuzzleMemory["PM_State"]
|
|
if PuzzleState ~= PG_GAME_STATE["PGS_COUNT"]
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local StepInfo
|
|
local PuzzleStep
|
|
local GameInfo
|
|
|
|
|
|
StepInfo = PuzzleMemory["PM_StepInfo"]
|
|
if StepInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleStep = StepInfo["SI_Step"]
|
|
if PuzzleStep == PG_INVALID_VALUE
|
|
then
|
|
return
|
|
end
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if GameInfo["GI_GameMode"] == PG_PUZZLE_MODE["PGM_ALL_PLAY"]
|
|
then
|
|
|
|
for i = 1, #PG_BASE_BOARD_DATA do
|
|
|
|
local PuzzleBoard
|
|
local BaseBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[i]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
BaseBoard = PuzzleBoard["PB_BaseBoard"]
|
|
if BaseBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
cSetAbstate( BaseBoard["BB_Handle"], PG_ABSTATE_DATA["PAD_GAME_SELECT"]["INDEX"], 1, PG_ABSTATE_DATA["PAD_GAME_SELECT"]["KEEPTIME"] )
|
|
|
|
end
|
|
|
|
else
|
|
|
|
local PuzzleBoard
|
|
local BaseBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[GameInfo["GI_GameMode"]]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
BaseBoard = PuzzleBoard["PB_BaseBoard"]
|
|
if BaseBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
cSetAbstate( BaseBoard["BB_Handle"], PG_ABSTATE_DATA["PAD_GAME_SELECT"]["INDEX"], 1, PG_ABSTATE_DATA["PAD_GAME_SELECT"]["KEEPTIME"] )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
function PG_COUNT_REGEN_PIECES( PuzzleMemory )
|
|
cExecCheck( "PG_COUNT_REGEN_PIECES" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleMemory["PM_State"] ~= PG_GAME_STATE["PGS_COUNT"]
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
PuzzleState = PuzzleMemory["PM_State"]
|
|
if PuzzleState ~= PG_GAME_STATE["PGS_COUNT"]
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local StepInfo
|
|
local PuzzleStep
|
|
local GameInfo
|
|
|
|
|
|
StepInfo = PuzzleMemory["PM_StepInfo"]
|
|
if StepInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleStep = StepInfo["SI_Step"]
|
|
if PuzzleStep == PG_INVALID_VALUE
|
|
then
|
|
return
|
|
end
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if GameInfo["GI_GameMode"] == PG_PUZZLE_MODE["PGM_ALL_PLAY"]
|
|
then
|
|
|
|
for i = 1, #PG_BASE_BOARD_DATA do
|
|
|
|
local PuzzleBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[i]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PG_REGEN_PIECES( i, PuzzleMemory )
|
|
|
|
end
|
|
|
|
else
|
|
|
|
local PuzzleBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[GameInfo["GI_GameMode"]]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PG_REGEN_PIECES( GameInfo["GI_GameMode"], PuzzleMemory )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
function PG_COUNT_GAME_START( PuzzleMemory )
|
|
cExecCheck( "PG_COUNT_GAME_START" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleMemory["PM_State"] ~= PG_GAME_STATE["PGS_COUNT"]
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleState = PuzzleMemory["PM_State"]
|
|
if PuzzleState ~= PG_GAME_STATE["PGS_COUNT"]
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local StepInfo
|
|
local PuzzleStep
|
|
local GameInfo
|
|
|
|
|
|
StepInfo = PuzzleMemory["PM_StepInfo"]
|
|
if StepInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleStep = StepInfo["SI_Step"]
|
|
if PuzzleStep == PG_INVALID_VALUE
|
|
then
|
|
return
|
|
end
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
local GameData
|
|
|
|
|
|
GameData = PG_GAME_DATA[GameInfo["GI_GameMode"]]
|
|
if GameData == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
GameInfo["GI_GameEndTime"] = PuzzleMemory["PM_CurrentTime"] + PG_GAME_DATA[GameInfo["GI_GameMode"]]["PGD_PLAYTIME"]
|
|
|
|
if GameInfo["GI_GameMode"] == PG_PUZZLE_MODE["PGM_ALL_PLAY"]
|
|
then
|
|
|
|
for i = 1, #PG_BASE_BOARD_DATA do
|
|
|
|
local PuzzleBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[i]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleBoard["PB_State"] = PG_PUZZLE_STATE["PPS_PROGRESS"]
|
|
|
|
end
|
|
|
|
else
|
|
|
|
local PuzzleBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[GameInfo["GI_GameMode"]]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleBoard["PB_State"] = PG_PUZZLE_STATE["PPS_PROGRESS"]
|
|
|
|
end
|
|
|
|
GameInfo["GI_StartTime"] = PuzzleMemory["PM_CurrentTime"]
|
|
GameInfo["GI_NoClickTime"] = PuzzleMemory["PM_CurrentTime"] + PG_NO_CLICK_TIME
|
|
cEffectTimer( GameInfo["GI_CharHandle"], 0, PG_GAME_DATA[GameInfo["GI_GameMode"]]["PGD_PLAYTIME"] )
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
function PG_PROGRESS_ISCOMPLETE( PuzzleMemory )
|
|
cExecCheck( "PG_PROGRESS_ISCOMPLETE" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleMemory["PM_State"] ~= PG_GAME_STATE["PGS_PROGRESS"]
|
|
then
|
|
return
|
|
end
|
|
|
|
local GameInfo
|
|
local StepInfo
|
|
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
StepInfo = PuzzleMemory["PM_StepInfo"]
|
|
if StepInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if GameInfo["GI_NoClickTime"] < PuzzleMemory["PM_CurrentTime"]
|
|
then
|
|
cSystemMessage_Obj( GameInfo["GI_CharHandle"], PG_CIRCUMSTANCE_DIALOG["GAMEOVER_NO_CLICK"]["FILENAME"], PG_CIRCUMSTANCE_DIALOG["GAMEOVER_NO_CLICK"]["INDEX"] )
|
|
PuzzleMemory["PM_State"] = PG_GAME_STATE["PGS_FAIL"]
|
|
return
|
|
|
|
end
|
|
|
|
if GameInfo["GI_GameEndTime"] < PuzzleMemory["PM_CurrentTime"]
|
|
then
|
|
|
|
PuzzleMemory["PM_State"] = PG_GAME_STATE["PGS_FAIL"]
|
|
return
|
|
|
|
end
|
|
|
|
|
|
if GameInfo["GI_GameMode"] == PG_PUZZLE_MODE["PGM_ALL_PLAY"]
|
|
then
|
|
|
|
for i = 1, #PG_BASE_BOARD_DATA do
|
|
|
|
local PuzzleBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[i]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleBoard["PB_State"] ~= PG_PUZZLE_STATE["PPS_COMPLETE"]
|
|
then
|
|
return
|
|
end
|
|
|
|
end
|
|
|
|
else
|
|
|
|
local PuzzleBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[GameInfo["GI_GameMode"]]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleBoard["PB_State"] ~= PG_PUZZLE_STATE["PPS_COMPLETE"]
|
|
then
|
|
return
|
|
end
|
|
|
|
end
|
|
|
|
PuzzleMemory["PM_State"] = PG_GAME_STATE["PGS_COMPLETE"]
|
|
StepInfo["SI_Step"] = 1
|
|
|
|
end
|
|
|
|
|
|
function PG_COMPLETE_INIT_GAME( PuzzleMemory )
|
|
cExecCheck( "PG_COMPLETE_INIT_GAME" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
local GameInfo
|
|
local StepInfo
|
|
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
StepInfo = PuzzleMemory["PM_StepInfo"]
|
|
if StepInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleMemory["PG_PrevGamePlayer"] == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleMemory["PG_PrevGamePlayer"]["PP_CharNumber"] = GameInfo["GI_CharNumber"]
|
|
PuzzleMemory["PG_PrevGamePlayer"]["PP_WaitingTime"] = PuzzleMemory["PM_CurrentTime"] + PG_WATING_TIME
|
|
|
|
|
|
if GameInfo["GI_GameMode"] == PG_PUZZLE_MODE["PGM_ALL_PLAY"]
|
|
then
|
|
|
|
for i = 1, #PG_BASE_BOARD_DATA do
|
|
|
|
local PuzzleBoard
|
|
local BaseBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[i]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
BaseBoard = PuzzleBoard["PB_BaseBoard"]
|
|
if BaseBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PG_DELETE_PUZZLEBOARD ( i, PuzzleMemory )
|
|
PG_REGEN_COMPLETION ( i, PuzzleMemory )
|
|
|
|
end
|
|
|
|
else
|
|
|
|
local PuzzleBoard
|
|
local BaseBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[GameInfo["GI_GameMode"]]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
BaseBoard = PuzzleBoard["PB_BaseBoard"]
|
|
if BaseBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PG_DELETE_PUZZLEBOARD ( GameInfo["GI_GameMode"], PuzzleMemory )
|
|
PG_REGEN_COMPLETION ( GameInfo["GI_GameMode"], PuzzleMemory )
|
|
|
|
end
|
|
|
|
|
|
cTopView( GameInfo["GI_CharHandle"], 0, 0, 0, 0, 0 )
|
|
cHideOtherPlayer( GameInfo["GI_CharHandle"], 0 )
|
|
|
|
cResetAbstate( GameInfo["GI_CharHandle"], PG_ABSTATE_DATA["PAD_USER_STUN"]["INDEX"] )
|
|
cResetAbstate( PuzzleMemory["PM_NPCHandle"], PG_ABSTATE_DATA["PAD_FOMING_EFFECT"]["INDEX"] )
|
|
cEffectTimer( GameInfo["GI_CharHandle"], 1, 0 )
|
|
|
|
PuzzleMemory["PM_State"] = PG_GAME_STATE["PGS_WAIT"]
|
|
|
|
StepInfo["SI_Step"] = 1
|
|
StepInfo["SI_NextStepTime"] = PuzzleMemory["PM_CurrentTime"]
|
|
|
|
GameInfo["GI_GameMode"] = PG_INVALID_VALUE
|
|
GameInfo["GI_CharHandle"] = PG_INVALID_VALUE
|
|
GameInfo["GI_CharNumber"] = PG_INVALID_VALUE
|
|
GameInfo["GI_GameEndTime"] = PG_INVALID_VALUE
|
|
|
|
end
|
|
|
|
|
|
function PG_COMPLETE_SUCCESS_GAME( PuzzleMemory )
|
|
cExecCheck( "PG_COMPLETE_SUCCESS_GAME" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
local GameInfo
|
|
local StepInfo
|
|
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
StepInfo = PuzzleMemory["PM_StepInfo"]
|
|
if StepInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local RewardAbstateData
|
|
local RewardCharTitleData
|
|
local DialogData
|
|
local PlayTime
|
|
|
|
|
|
RewardAbstateData = PG_GAME_DATA[GameInfo["GI_GameMode"]]["PGD_REWARD_ABSTATE"]
|
|
RewardCharTitleData = PG_GAME_DATA[GameInfo["GI_GameMode"]]["PGD_REWARD_CHARTITLE"]
|
|
PlayTime = PuzzleMemory["PM_CurrentTime"] - GameInfo["GI_StartTime"]
|
|
|
|
PlayTime = math.floor( PlayTime )
|
|
cScriptMessage_Obj( GameInfo["GI_CharHandle"], PG_ANNOUNCE_DATA["PLAY_TIME"], PlayTime )
|
|
|
|
for i = 1, #RewardAbstateData do
|
|
cSetAbstate_Range( PuzzleMemory["PM_NPCHandle"], PG_REWARD_RANGE, ObjectType["Player"], RewardAbstateData[i]["PRA_INDEX"], 1, RewardAbstateData[i]["PRA_KEEPTIME"] )
|
|
end
|
|
|
|
cCharTitleAddValue( GameInfo["GI_CharHandle"], RewardCharTitleData["PRC_ID"], RewardCharTitleData["PRC_VALUE"] )
|
|
|
|
end
|
|
|
|
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
--[[ ]]--
|
|
--[[ 리젠 / 삭제 함수 ]]--
|
|
--[[ ]]--
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
function PG_REGEN_COMPLETION( nGameType, PuzzleMemory )
|
|
cExecCheck( "PG_REGEN_COMPLETION" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local PuzzleBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[nGameType]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleMemory["PM_PieceArray"] == nil
|
|
then
|
|
PuzzleMemory["PM_PieceArray"] = { }
|
|
end
|
|
|
|
|
|
PuzzleBoard["PB_CellArray"] = { }
|
|
PuzzleBoard["PB_CellList"] = { }
|
|
|
|
|
|
-- 완료 퍼즐 생성
|
|
local ComplPuzzleLoc
|
|
local PieceInfo = { }
|
|
local CellInfo = { }
|
|
|
|
|
|
ComplPuzzleLoc = PG_COMPLETION_PUZZLE_DATA[nGameType]["CP_REGEN_POS"]
|
|
PieceInfo["PI_Handle"] = cMobRegen_XY( PuzzleMemory["PM_EventMap"], PG_COMPLETION_PUZZLE_DATA[nGameType]["CP_INDEX"],
|
|
ComplPuzzleLoc["RP_X"], ComplPuzzleLoc["RP_Y"], ComplPuzzleLoc["RP_DIR"] )
|
|
if PieceInfo["PI_Handle"] ~= nil
|
|
then
|
|
cAIScriptSet ( PieceInfo["PI_Handle"], PuzzleMemory["PM_NPCHandle"] )
|
|
cAIScriptFunc ( PieceInfo["PI_Handle"], "Entrance", "PG_PIECE_ROUTINE" )
|
|
|
|
|
|
g_PuzzleMemory[PieceInfo["PI_Handle"]] = PuzzleMemory
|
|
|
|
PieceInfo["PI_ID"] = 1
|
|
PieceInfo["PI_GameType"] = nGameType
|
|
|
|
CellInfo["CI_ID"] = 1
|
|
CellInfo["CI_PieceInfo"] = PieceInfo
|
|
|
|
PuzzleBoard["PB_CellArray"][1] = CellInfo
|
|
PuzzleBoard["PB_CellList"][PieceInfo["PI_Handle"]] = CellInfo
|
|
|
|
PuzzleMemory["PM_PieceArray"][PieceInfo["PI_Handle"]] = PieceInfo
|
|
end
|
|
|
|
PuzzleMemory[nGameType] = PuzzleBoard
|
|
|
|
end
|
|
|
|
|
|
function PG_CREATE_BASE_CELL( nGameType, PuzzleMemory )
|
|
cExecCheck( "PG_CREATE_BASE_CELL" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local PuzzleBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[nGameType]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleBoard["PB_EmptyCellID"] = PuzzleBoard["PB_BoardSize"]["MaxCell"]
|
|
PG_GET_MOVABLE_CELL( PuzzleBoard )
|
|
|
|
if PuzzleMemory["PM_PieceArray"] == nil
|
|
then
|
|
PuzzleMemory["PM_PieceArray"] = { }
|
|
end
|
|
|
|
PuzzleBoard["PB_CellArray"] = { }
|
|
PuzzleBoard["PB_CellList"] = { }
|
|
|
|
local PuzzleSize
|
|
local MaxCell
|
|
local PiecesData
|
|
|
|
|
|
PuzzleSize = PuzzleBoard["PB_BoardSize"]
|
|
if PuzzleSize == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
MaxCell = PuzzleSize["MaxCell"]
|
|
PiecesData = PG_PIECE_INFO[nGameType]
|
|
|
|
for i = 1, MaxCell do
|
|
|
|
local PieceLoc
|
|
local PieceIndex
|
|
local PieceInfo = { }
|
|
local CellInfo = { }
|
|
|
|
|
|
-- 빈셀도 Piece정보를 만들어 준다.
|
|
if i == MaxCell
|
|
then
|
|
PieceInfo["PI_Handle"] = PG_INVALID_VALUE
|
|
|
|
PieceInfo["PI_ID"] = i
|
|
PieceInfo["PI_GameType"] = nGameType
|
|
|
|
CellInfo["CI_ID"] = i
|
|
CellInfo["CI_PieceInfo"] = PieceInfo
|
|
|
|
PuzzleBoard["PB_CellArray"][i] = CellInfo
|
|
|
|
end
|
|
|
|
|
|
PieceInfo["PI_Handle"] = PG_INVALID_VALUE
|
|
PieceInfo["PI_ID"] = i
|
|
PieceInfo["PI_GameType"] = nGameType
|
|
|
|
CellInfo["CI_ID"] = i
|
|
CellInfo["CI_PieceInfo"] = PieceInfo
|
|
|
|
PuzzleMemory[nGameType]["PB_CellArray"][i] = CellInfo
|
|
|
|
end
|
|
|
|
PuzzleMemory[nGameType] = PuzzleBoard
|
|
|
|
end
|
|
|
|
|
|
function PG_REGEN_PIECES( nGameType, PuzzleMemory )
|
|
cExecCheck( "PG_REGEN_PIECES" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local PuzzleBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[nGameType]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleBoard["PB_CellList"] = { }
|
|
|
|
local PuzzleSize
|
|
local MaxCell
|
|
local PiecesData
|
|
local CellArray
|
|
|
|
|
|
PuzzleSize = PuzzleBoard["PB_BoardSize"]
|
|
if PuzzleSize == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
MaxCell = PuzzleSize["MaxCell"]
|
|
PiecesData = PG_PIECE_INFO[nGameType]
|
|
|
|
CellArray = PuzzleBoard["PB_CellArray"]
|
|
if CellArray == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
for i = 1, MaxCell do
|
|
|
|
local CellInfo
|
|
local PieceInfo
|
|
local PieceID
|
|
local PieceLoc
|
|
local PieceIndex
|
|
|
|
|
|
CellInfo = CellArray[i]
|
|
if CellInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PieceInfo = CellInfo["CI_PieceInfo"]
|
|
if PieceInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PieceID = PieceInfo["PI_ID"]
|
|
|
|
if PiecesData[PieceID]["PI_INDEX"] ~= nil
|
|
then
|
|
PieceLoc = PiecesData[i]["PI_REGEN_POS"]
|
|
PieceInfo["PI_Handle"] = cMobRegen_XY( PuzzleMemory["PM_EventMap"], PiecesData[PieceID]["PI_INDEX"],
|
|
PieceLoc["PI_X"], PieceLoc["PI_Y"], PieceLoc["PI_DIR"] )
|
|
if PieceInfo["PI_Handle"] ~= nil
|
|
then
|
|
cAIScriptSet ( PieceInfo["PI_Handle"], PuzzleMemory["PM_NPCHandle"] )
|
|
cAIScriptFunc ( PieceInfo["PI_Handle"], "Entrance", "PG_PIECE_ROUTINE" )
|
|
cAIScriptFunc ( PieceInfo["PI_Handle"], "NPCClick", "PG_CLICK_PIECE" )
|
|
|
|
g_PuzzleMemory[PieceInfo["PI_Handle"]] = PuzzleMemory
|
|
|
|
PuzzleBoard["PB_CellList"][PieceInfo["PI_Handle"]] = CellInfo
|
|
PuzzleMemory["PM_PieceArray"][PieceInfo["PI_Handle"]] = PieceInfo
|
|
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
function PG_DELETE_PUZZLEBOARD( nGameType, PuzzleMemory )
|
|
cExecCheck( "PG_DELETE_PUZZLEBOARD" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local PieceArray
|
|
local PuzzleBoard
|
|
local CellArray
|
|
local CellList
|
|
|
|
|
|
PieceArray = PuzzleMemory["PM_PieceArray"]
|
|
if PieceArray == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PuzzleBoard = PuzzleMemory[nGameType]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
CellArray = PuzzleBoard["PB_CellArray"]
|
|
if CellArray == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
CellList = PuzzleBoard["PB_CellList"]
|
|
if CellList == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
-- 퍼즐조각 정보 전체 삭제
|
|
for i = 1, #CellArray do
|
|
|
|
local CellInfo
|
|
local PieceInfo
|
|
local PieceHandle
|
|
|
|
|
|
CellInfo = CellArray[i]
|
|
if CellInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PieceInfo = CellInfo["CI_PieceInfo"]
|
|
if PieceInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
PieceHandle = PieceInfo["PI_Handle"]
|
|
|
|
PuzzleMemory["PM_PieceArray"][PieceHandle] = nil
|
|
PuzzleMemory[nGameType]["PB_CellArray"][i]["CI_PieceInfo"] = nil
|
|
PuzzleMemory[nGameType]["PB_CellArray"][i] = nil
|
|
PuzzleMemory[nGameType]["PB_CellList"][PieceHandle] = nil
|
|
|
|
g_PuzzleMemory[PieceHandle] = nil
|
|
|
|
end
|
|
|
|
CellList = nil
|
|
CellArray = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
--[[ ]]--
|
|
--[[ 퍼즐 관련 함수 ]]--
|
|
--[[ ]]--
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
|
|
function PG_SUFFLE_PIECES( tPuzzleBoard )
|
|
cExecCheck( "PG_SUFFLE_PIECES" )
|
|
|
|
if tPuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local CellArray
|
|
local BoardSize
|
|
local MaxPieceNumber
|
|
local PrevEmptyCellID
|
|
|
|
|
|
CellArray = tPuzzleBoard["PB_CellArray"]
|
|
if CellArray == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
BoardSize = tPuzzleBoard["PB_BoardSize"]
|
|
MaxPieceNumber = BoardSize["MaxCell"] - 1
|
|
|
|
PrevEmptyCellID = MaxPieceNumber
|
|
|
|
for i = 1, PG_SUFFLE_COUNT do
|
|
|
|
local MovableCell
|
|
local RandomID
|
|
local SwapCellID
|
|
local EmptyCellID
|
|
local TempPieceInfo
|
|
|
|
|
|
MovableCell = tPuzzleBoard["PB_MovableCell"]
|
|
if MovableCell == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
-- 움직일 수 있는 셀 중 한 곳을 랜덤으로 고른다.
|
|
RandomID = cRandomInt( 1, 4 )
|
|
SwapCellID = MovableCell[RandomID]
|
|
|
|
|
|
EmptyCellID = tPuzzleBoard["PB_EmptyCellID"]
|
|
|
|
|
|
if ( SwapCellID ~= PG_INVALID_VALUE ) and ( PrevEmptyCellID ~= SwapCellID )
|
|
then
|
|
TempPieceInfo = CellArray[SwapCellID]["CI_PieceInfo"]
|
|
CellArray[SwapCellID]["CI_PieceInfo"] = CellArray[EmptyCellID]["CI_PieceInfo"]
|
|
CellArray[EmptyCellID]["CI_PieceInfo"] = TempPieceInfo
|
|
|
|
tPuzzleBoard["PB_EmptyCellID"] = SwapCellID
|
|
PG_GET_MOVABLE_CELL( tPuzzleBoard )
|
|
|
|
PrevEmptyCellID = EmptyCellID
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
function PG_GET_MOVABLE_CELL( tPuzzleBoard )
|
|
cExecCheck( "PG_GET_MOVABLE_CELL" )
|
|
|
|
if tPuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local MovableCell
|
|
local EmptyCell
|
|
local MaxWidthSize
|
|
local MaxHeightSize
|
|
local MaxBorderSize
|
|
|
|
|
|
MovableCell = tPuzzleBoard["PB_MovableCell"]
|
|
if MovableCell == nil
|
|
then
|
|
return
|
|
end
|
|
EmptyCell = tPuzzleBoard["PB_EmptyCellID"]
|
|
MaxWidthSize = tPuzzleBoard["PB_BoardSize"]["MaxWidth"]
|
|
MaxHeightSize = tPuzzleBoard["PB_BoardSize"]["MaxHeight"]
|
|
MaxBorderSize = tPuzzleBoard["PB_BoardSize"]["MaxCell"]
|
|
|
|
|
|
if EmptyCell - MaxWidthSize < 1 then
|
|
MovableCell[PG_MOVABLE_CELL["PMC_UP"]] = PG_INVALID_VALUE
|
|
else
|
|
MovableCell[PG_MOVABLE_CELL["PMC_UP"]] = EmptyCell - MaxWidthSize
|
|
end
|
|
|
|
if EmptyCell + MaxWidthSize > MaxBorderSize then
|
|
MovableCell[PG_MOVABLE_CELL["PMC_DOWN"]] = PG_INVALID_VALUE
|
|
else
|
|
MovableCell[PG_MOVABLE_CELL["PMC_DOWN"]] = EmptyCell + MaxWidthSize
|
|
end
|
|
|
|
if EmptyCell % MaxWidthSize == 1 then
|
|
MovableCell[PG_MOVABLE_CELL["PMC_LEFT"]] = PG_INVALID_VALUE
|
|
else
|
|
MovableCell[PG_MOVABLE_CELL["PMC_LEFT"]] = EmptyCell - 1
|
|
end
|
|
|
|
if EmptyCell % MaxWidthSize == 0 then
|
|
|
|
MovableCell[PG_MOVABLE_CELL["PMC_RIGHT"]] = PG_INVALID_VALUE
|
|
else
|
|
MovableCell[PG_MOVABLE_CELL["PMC_RIGHT"]] = EmptyCell + 1
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
function PG_IS_COMPLETE_PUZZLE( tPuzzleBoard )
|
|
cExecCheck( "PG_IS_COMPLETE_PUZZLE" )
|
|
|
|
if tPuzzleBoard == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
|
|
local CellArray
|
|
local BorderSize
|
|
local CheckBoardSize
|
|
|
|
|
|
CellArray = tPuzzleBoard["PB_CellArray"]
|
|
if CellArray == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
BorderSize = tPuzzleBoard["PB_BoardSize"]
|
|
if BorderSize == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
CheckBoardSize = BorderSize["MaxCell"]-1
|
|
|
|
for i = 1, CheckBoardSize do
|
|
|
|
local CellInfo
|
|
local PieceInfo
|
|
|
|
|
|
CellInfo = CellArray[i]
|
|
if CellInfo == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
PieceInfo = CellInfo["CI_PieceInfo"]
|
|
if PieceInfo == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
if PieceInfo["PI_ID"] ~= i
|
|
then
|
|
return false
|
|
end
|
|
|
|
end
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
|
function PG_PIECE_MOVE( PuzzleMemory, NPCGameType, NPCHandle )
|
|
cExecCheck( "PG_PIECE_MOVE" )
|
|
|
|
if PuzzleMemory == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
local tPuzzleBoard
|
|
|
|
|
|
tPuzzleBoard = PuzzleMemory[NPCGameType]
|
|
if tPuzzleBoard == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
|
|
local PieceArray
|
|
local CellList
|
|
local CellArray
|
|
local SelectedCell
|
|
local MovableCell
|
|
local GameInfo
|
|
|
|
|
|
PieceArray = PuzzleMemory["PM_PieceArray"]
|
|
if PieceArray == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
CellList = tPuzzleBoard["PB_CellList"]
|
|
if CellList == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
|
|
CellArray = tPuzzleBoard["PB_CellArray"]
|
|
if CellArray == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
|
|
SelectedCell = CellList[NPCHandle]
|
|
if SelectedCell == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
|
|
MovableCell = tPuzzleBoard["PB_MovableCell"]
|
|
if MovableCell == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
for i = 1, #MovableCell do
|
|
|
|
if MovableCell[i] == SelectedCell["CI_ID"]
|
|
then
|
|
|
|
local SelcetedPieceHandle
|
|
local SelectedPieceID
|
|
local EmptyCellID
|
|
local EmptyCell
|
|
local TempPieceInfo
|
|
|
|
|
|
EmptyCellID = tPuzzleBoard["PB_EmptyCellID"]
|
|
EmptyCell = CellArray[EmptyCellID]
|
|
if EmptyCell == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
-- 1. 빈셀을 선택된 셀으로 변경해준다.
|
|
tPuzzleBoard["PB_EmptyCellID"] = SelectedCell["CI_ID"]
|
|
|
|
-- 2. 선택된 Piece를 삭제해준다.
|
|
SelcetedPieceHandle = SelectedCell["CI_PieceInfo"]["PI_Handle"]
|
|
SelectedPieceID = SelectedCell["CI_PieceInfo"]["PI_ID"]
|
|
|
|
|
|
CellList[SelcetedPieceHandle] = nil
|
|
PieceArray["SelcetedPieceHandle"] = nil
|
|
|
|
if g_DieInfo == nil
|
|
then
|
|
g_DieInfo = { }
|
|
end
|
|
|
|
g_DieInfo[SelcetedPieceHandle] = PuzzleMemory["PM_CurrentTime"] + PG_PIECE_VANISH_TIME
|
|
|
|
cKillObject( SelcetedPieceHandle, PG_INVALID_VALUE, GameInfo["GI_CharNumber"] )
|
|
|
|
-- 3. PieceInfo Swap
|
|
TempPieceInfo = EmptyCell["CI_PieceInfo"]
|
|
EmptyCell["CI_PieceInfo"] = SelectedCell["CI_PieceInfo"]
|
|
SelectedCell["CI_PieceInfo"] = TempPieceInfo
|
|
|
|
-- 4. 새로운 퍼즐조각을 빈셀에 생성해준다.
|
|
local PieceData
|
|
local PieceIndex
|
|
local PieceLoc
|
|
local PieceInfo
|
|
|
|
|
|
PieceData = PG_PIECE_INFO[NPCGameType]
|
|
|
|
PieceIndex = PieceData[SelectedPieceID]["PI_INDEX"]
|
|
|
|
PieceLoc = PieceData[EmptyCellID]["PI_REGEN_POS"]
|
|
|
|
PieceInfo = EmptyCell["CI_PieceInfo"]
|
|
if PieceInfo == nil
|
|
then
|
|
return false
|
|
end
|
|
|
|
PieceInfo["PI_Handle"] = cMobRegen_XY( PuzzleMemory["PM_EventMap"], PieceIndex,
|
|
PieceLoc["PI_X"], PieceLoc["PI_Y"], PieceLoc["PI_DIR"] )
|
|
if PieceInfo["PI_Handle"] ~= nil
|
|
then
|
|
cAIScriptSet ( PieceInfo["PI_Handle"], PuzzleMemory["PM_NPCHandle"] )
|
|
cAIScriptFunc ( PieceInfo["PI_Handle"], "Entrance", "PG_PIECE_ROUTINE" )
|
|
cAIScriptFunc ( PieceInfo["PI_Handle"], "NPCClick", "PG_CLICK_PIECE" )
|
|
|
|
g_PuzzleMemory[PieceInfo["PI_Handle"]] = PuzzleMemory
|
|
|
|
CellList[PieceInfo["PI_Handle"]] = EmptyCell
|
|
PieceArray[PieceInfo["PI_Handle"]] = PieceInfo
|
|
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
end
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
--[[ ]]--
|
|
--[[ NPC 클릭함수 ]]--
|
|
--[[ ]]--
|
|
--[[------------------------------------------------------------------------------------------------]]--
|
|
|
|
|
|
--------------------------------------------------------------------------
|
|
-- 메인 NPC 클릭 --
|
|
--------------------------------------------------------------------------
|
|
function PG_MAIN_NPC_CLICK( NPCHandle, PlyHandle, PlyRegNum )
|
|
cExecCheck( "PG_MAIN_NPC_CLICK" )
|
|
|
|
local PuzzleMemory
|
|
local GameState
|
|
|
|
|
|
PuzzleMemory = g_PuzzleMemory[NPCHandle]
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleMemory["PG_PrevGamePlayer"] == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if ( PuzzleMemory["PG_PrevGamePlayer"]["PP_CharNumber"] == PlyRegNum ) and
|
|
( PuzzleMemory["PG_PrevGamePlayer"]["PP_WaitingTime"] > PuzzleMemory["PM_CurrentTime"] )
|
|
then
|
|
|
|
cSystemMessage_Obj( PlyHandle, PG_CIRCUMSTANCE_DIALOG["GAME_WATING"]["FILENAME"], PG_CIRCUMSTANCE_DIALOG["GAME_WATING"]["INDEX"] )
|
|
return
|
|
end
|
|
|
|
GameState = PuzzleMemory["PM_State"]
|
|
if GameState == PG_GAME_STATE["PGS_WAIT"]
|
|
then
|
|
cNPCMenuOpen( NPCHandle, PlyHandle )
|
|
else
|
|
cSystemMessage_Obj( PlyHandle, PG_CIRCUMSTANCE_DIALOG["GAME_ALREADY_PLAY"]["FILENAME"], PG_CIRCUMSTANCE_DIALOG["GAME_ALREADY_PLAY"]["INDEX"] )
|
|
end
|
|
|
|
return
|
|
end
|
|
|
|
|
|
function PG_NPCMENU_ACK( NPCHandle, PlyHandle, PlyRegNum, Value )
|
|
cExecCheck( "PG_NPCMENU_ACK" )
|
|
|
|
local PuzzleMemory
|
|
local GameState
|
|
|
|
|
|
PuzzleMemory = g_PuzzleMemory[NPCHandle]
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
GameState = PuzzleMemory["PM_State"]
|
|
if GameState ~= PG_GAME_STATE["PGS_WAIT"]
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
local GameData
|
|
|
|
|
|
GameData = PG_GAME_DATA[Value]
|
|
if GameData == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
-- 1. 돈을 차감시킨다.
|
|
if cUseMoney( PlyHandle, GameData["PGD_COST"] ) == nil then
|
|
|
|
local DialogData
|
|
|
|
|
|
DialogData = PG_CIRCUMSTANCE_DIALOG["MONEY_LACK"]
|
|
cMobDialog_Obj( PlyHandle, DialogData["FACECUT"], DialogData["FILENAME"], DialogData["INDEX"] )
|
|
|
|
else
|
|
|
|
local StepInfo
|
|
local GameInfo
|
|
local BaseBoard
|
|
|
|
|
|
PuzzleMemory["PM_State"] = PG_GAME_STATE["PGS_COUNT"]
|
|
StepInfo = PuzzleMemory["PM_StepInfo"]
|
|
if StepInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
|
|
PuzzleMemory["PM_State"] = PG_GAME_STATE["PGS_COUNT"]
|
|
StepInfo["SI_Step"] = 1
|
|
StepInfo["SI_NextStepTime"] = PuzzleMemory["PM_CurrentTime"]
|
|
|
|
GameInfo["GI_GameMode"] = Value
|
|
GameInfo["GI_CharNumber"] = PlyRegNum
|
|
GameInfo["GI_CharHandle"] = PlyHandle
|
|
|
|
|
|
if Value == PG_PUZZLE_MODE["PGM_ALL_PLAY"]
|
|
then
|
|
|
|
for i = 1, #PG_BASE_BOARD_DATA do
|
|
|
|
local PuzzleBoard
|
|
local BaseBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[i]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
BaseBoard = PuzzleBoard["PB_BaseBoard"]
|
|
if BaseBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PG_DELETE_PUZZLEBOARD ( i, PuzzleMemory )
|
|
PG_REGEN_COMPLETION ( i, PuzzleMemory )
|
|
|
|
end
|
|
|
|
else
|
|
|
|
local PuzzleBoard
|
|
local BaseBoard
|
|
|
|
|
|
PuzzleBoard = PuzzleMemory[Value]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
BaseBoard = PuzzleBoard["PB_BaseBoard"]
|
|
if BaseBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PG_DELETE_PUZZLEBOARD ( Value, PuzzleMemory )
|
|
PG_REGEN_COMPLETION ( Value, PuzzleMemory )
|
|
|
|
end
|
|
|
|
cSetAbstate( PuzzleMemory["PM_NPCHandle"], PG_ABSTATE_DATA["PAD_FOMING_EFFECT"]["INDEX"], 1, PG_ABSTATE_DATA["PAD_FOMING_EFFECT"]["KEEPTIME"] )
|
|
cSetAbstate( PlyHandle, PG_ABSTATE_DATA["PAD_USER_STUN"]["INDEX"], 1, PG_ABSTATE_DATA["PAD_USER_STUN"]["KEEPTIME"] )
|
|
|
|
cHideOtherPlayer( PlyHandle, 1 )
|
|
cTopView( PlyHandle, 1, PG_TOPVIEW_DATA["PTD_CENTER_POS"]["PCP_X"], PG_TOPVIEW_DATA["PTD_CENTER_POS"]["PCP_Y"], PG_TOPVIEW_DATA["PTD_RANGE"], PG_TOPVIEW_DATA["PTD_DEGREE"] )
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
--------------------------------------------------------------------------
|
|
-- 퍼즐 조각 클릭 --
|
|
--------------------------------------------------------------------------
|
|
function PG_CLICK_PIECE( NPCHandle, PlyHandle, PlyRegNum )
|
|
cExecCheck( "PG_CLICK_PIECE" )
|
|
|
|
local PuzzleMemory
|
|
local GameInfo
|
|
local PieceArray
|
|
local PieceInfo
|
|
local NPCGameType
|
|
local PuzzleBoard
|
|
|
|
|
|
PuzzleMemory = g_PuzzleMemory[NPCHandle]
|
|
if PuzzleMemory == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleMemory["PM_State"] ~= PG_GAME_STATE["PGS_PROGRESS"]
|
|
then
|
|
return
|
|
end
|
|
|
|
GameInfo = PuzzleMemory["PM_GameInfo"]
|
|
if GameInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if GameInfo["GI_CharNumber"] ~= PlyRegNum
|
|
then
|
|
return
|
|
end
|
|
|
|
if GameInfo["GI_CharHandle"] ~= PlyHandle
|
|
then
|
|
return
|
|
end
|
|
|
|
if GameInfo["GI_GameMode"] == PG_INVALID_VALUE
|
|
then
|
|
return
|
|
end
|
|
|
|
PieceArray = PuzzleMemory["PM_PieceArray"]
|
|
if PieceArray == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
PieceInfo = PieceArray[NPCHandle]
|
|
if PieceInfo == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
NPCGameType = PieceInfo["PI_GameType"]
|
|
if GameInfo["GI_GameMode"] ~= NPCGameType then
|
|
|
|
if GameInfo["GI_GameMode"] ~= PG_PUZZLE_MODE["PGM_ALL_PLAY"]
|
|
then
|
|
return
|
|
end
|
|
|
|
end
|
|
|
|
PuzzleBoard = PuzzleMemory[NPCGameType]
|
|
if PuzzleBoard == nil
|
|
then
|
|
return
|
|
end
|
|
|
|
if PuzzleBoard["PB_State"] ~= PG_PUZZLE_STATE["PPS_PROGRESS"]
|
|
then
|
|
return
|
|
end
|
|
|
|
GameInfo["GI_NoClickTime"] = PuzzleMemory["PM_CurrentTime"] + PG_NO_CLICK_TIME
|
|
|
|
-- 움직인게 성공했을 때만 퍼즐 완성되었는지 확인한다.
|
|
if PG_PIECE_MOVE( PuzzleMemory, NPCGameType, NPCHandle ) == true
|
|
then
|
|
PG_GET_MOVABLE_CELL( PuzzleBoard )
|
|
if PG_IS_COMPLETE_PUZZLE( PuzzleBoard ) == true
|
|
then
|
|
PuzzleBoard["PB_State"] = PG_PUZZLE_STATE["PPS_COMPLETE"]
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
---------------------------------------------------------------------------------------------------------------------------------------
|
|
--***********************************************************************************************************************************--
|
|
-- --
|
|
-- 게임 진행 데이터 --
|
|
-- --
|
|
--***********************************************************************************************************************************--
|
|
---------------------------------------------------------------------------------------------------------------------------------------
|
|
PG_PROGRESS_DATA =
|
|
{
|
|
-- WAIT
|
|
{
|
|
PPD_STEP_ISLOOP = true, -- 특정상황 발생전까지 아래 스텝을 반복
|
|
|
|
PPD_STEP_COUNT = 3, -- 아래 스텝의 수만큼 세팅해야 함
|
|
PPD_STEP_INFO = -- 스텝 정보
|
|
{
|
|
-- Step 1. NPC 대화 1
|
|
{
|
|
PPD_FUNC = PG_DUMMY_FUNCTION, -- 현재 스텝에서 실행될 함수
|
|
PPD_EFFECTMSG = nil, -- 이펙트 메시지
|
|
PPD_MOBCHAT = { FILENAME = "Event", INDEX= "Xiaoming_Chat01" }, -- 몹챗 정보
|
|
PPD_FACECUT = nil, -- 페이스 컷 정보
|
|
PPD_DELAY = 4, -- 다음 스텝까지 대기시간
|
|
},
|
|
|
|
-- Step 2. NPC 대화 2
|
|
{
|
|
PPD_FUNC = PG_DUMMY_FUNCTION,
|
|
PPD_EFFECTMSG = nil,
|
|
PPD_MOBCHAT = { FILENAME = "Event", INDEX= "Xiaoming_Chat02" },
|
|
PPD_FACECUT = nil,
|
|
PPD_DELAY = 4,
|
|
},
|
|
|
|
-- Step 3. NPC 대화 3
|
|
{
|
|
PPD_FUNC = PG_DUMMY_FUNCTION,
|
|
PPD_EFFECTMSG = nil,
|
|
PPD_MOBCHAT = { FILENAME = "Event", INDEX= "Xiaoming_Chat03" },
|
|
PPD_FACECUT = nil,
|
|
PPD_DELAY = 4,
|
|
},
|
|
}
|
|
},
|
|
|
|
-- COUNT
|
|
{
|
|
PPD_STEP_ISLOOP = false, -- 아래 스텝을 전체 진행시 다음 상태로 변경
|
|
PPD_STEP_COUNT = 6, -- 아래 스텝의 수만큼 세팅해야 함
|
|
PPD_STEP_INFO =
|
|
{
|
|
-- Step 1. 카운트 다운 시작 전 딜레이
|
|
{
|
|
PPD_FUNC = PG_DUMMY_FUNCTION,
|
|
PPD_EFFECTMSG = nil,
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = nil,
|
|
PPD_DELAY = 1,
|
|
},
|
|
-- Step 2. 카운트 다운 시작
|
|
{
|
|
PPD_FUNC = PG_COUNT_EFFECT_BOARD,
|
|
PPD_EFFECTMSG = EFFECT_MSG_TYPE["EMT_COUNT_8_SEC"],
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = nil,
|
|
PPD_DELAY = 2,
|
|
},
|
|
|
|
-- Step 3. NPC 페이스컷
|
|
{
|
|
PPD_FUNC = PG_DUMMY_FUNCTION,
|
|
PPD_EFFECTMSG = nil,
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = { FACECUT = "Xiaoming", FILENAME = "Event", INDEX = "Xiaoming_01" },
|
|
PPD_DELAY = 3,
|
|
},
|
|
|
|
-- Step 4. 퍼즐 조각 전체 삭제
|
|
{
|
|
PPD_FUNC = PG_COUNT_DELETE_BOARD,
|
|
PPD_EFFECTMSG = nil,
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = nil,
|
|
PPD_DELAY = 0,
|
|
},
|
|
|
|
-- Step 5. 랜덤으로 생성된 퍼즐 소환 / 페이스컷
|
|
{
|
|
PPD_FUNC = PG_COUNT_REGEN_PIECES,
|
|
PPD_EFFECTMSG = nil,
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = { FACECUT = "Xiaoming", FILENAME ="Event", INDEX = "Xiaoming_02" },
|
|
PPD_DELAY = 3,
|
|
},
|
|
|
|
-- Step 6. 게임 스타트
|
|
{
|
|
PPD_FUNC = PG_COUNT_GAME_START,
|
|
PPD_EFFECTMSG = EFFECT_MSG_TYPE["EMT_START"],
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = nil,
|
|
PPD_DELAY = 0,
|
|
},
|
|
}
|
|
},
|
|
|
|
--PROGRESS
|
|
{
|
|
PPD_STEP_ISLOOP = true,
|
|
PPD_STEP_COUNT = 1,
|
|
PPD_STEP_INFO =
|
|
{
|
|
-- Step 1. 1초마다 한번씩 게임완료 했는지 확인
|
|
{
|
|
PPD_FUNC = PG_PROGRESS_ISCOMPLETE,
|
|
PPD_EFFECTMSG = nil,
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = nil,
|
|
PPD_DELAY = 1,
|
|
},
|
|
}
|
|
},
|
|
|
|
--COMPLETE
|
|
{
|
|
PPD_STEP_ISLOOP = false,
|
|
PPD_STEP_COUNT = 2,
|
|
PPD_STEP_INFO =
|
|
{
|
|
-- Step 1. 성공시 상태이상 / 캐릭터 타이틀 보상
|
|
{
|
|
PPD_FUNC = PG_COMPLETE_SUCCESS_GAME,
|
|
PPD_EFFECTMSG = EFFECT_MSG_TYPE["EMT_SUCCESS"],
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = { FACECUT = "Xiaoming", FILENAME ="Event", INDEX = "Xiaoming_03" },
|
|
PPD_DELAY = 5,
|
|
},
|
|
|
|
-- Step 2. 게임 초기화
|
|
{
|
|
PPD_FUNC = PG_COMPLETE_INIT_GAME,
|
|
PPD_EFFECTMSG = nil,
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = nil,
|
|
PPD_DELAY = 1,
|
|
},
|
|
}
|
|
},
|
|
|
|
--FAIL
|
|
{
|
|
PPD_STEP_ISLOOP = false,
|
|
PPD_STEP_COUNT = 2,
|
|
PPD_STEP_INFO =
|
|
{
|
|
-- Step 1. 게임 실패시 이펙트 메시지, 페이스컷
|
|
{
|
|
PPD_FUNC = PG_DUMMY_FUNCTION,
|
|
PPD_EFFECTMSG = EFFECT_MSG_TYPE["EMT_FAIL"],
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = { FACECUT = "Xiaoming", FILENAME ="Event", INDEX = "Xiaoming_04" },
|
|
PPD_DELAY = 2,
|
|
},
|
|
|
|
-- Step 2. 게임 초기화
|
|
{
|
|
PPD_FUNC = PG_COMPLETE_INIT_GAME,
|
|
PPD_EFFECTMSG = nil,
|
|
PPD_MOBCHAT = nil,
|
|
PPD_FACECUT = nil,
|
|
PPD_DELAY = 1,
|
|
},
|
|
}
|
|
},
|
|
}
|
|
|