--主程序入口
function JY_Main() --主程序入口
 os.remove("debug.txt"); --清除以前的debug输出
 xpcall(JY_Main_sub,myErrFun); --捕获调用错误
end

function myErrFun(err) --错误处理，打印错误信息
 lib.Debug(err); --输出错误信息
 lib.Debug(debug.traceback()); --输出调用堆栈信息
end

function JY_Main_sub() --真正的游戏主程序入口
 dofile(CONFIG.ScriptPath .. "mouse.lua");
 SetGlobalConst();
 SetGlobal();
 --禁止访问全程变量
 setmetatable(_G,{ __newindex =function (_,n)
 error("attempt read write to undeclared variable " .. n,2);
 end,
 __index =function (_,n)
 error("attempt read read to undeclared variable " .. n,2);
 end,
 } );
 lib.Debug("JY_Main start.");

 math.randomseed(tostring(os.time()):reverse():sub(1, 6)); --初始化随机数发生器
 
 lib.EnableKeyRepeat(CONFIG.KeyRepeatDelay,CONFIG.KeyRePeatInterval); --设置键盘重复率


 PicCatchIni();
 lib.GetKey();
 JYOL_Mini_Endless();
end

function CleanMemory() --清理lua内存
 if CONFIG.CleanMemory==1 then
 collectgarbage("collect");
 end
end

function limitX(x,minv,maxv) --限制x的范围
 if x<minv then
 x=minv;
 elseif x>maxv then
 x=maxv;
 end
 return x
end
function DrawStringS(x,y,str,color,size) --显示阴影字符串
 if CONFIG.Windows then
 if CC.FontType==0 then
 lib.DrawStr(x-1,y,str,color,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x,y,str,color,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 elseif CC.FontType==1 then
 lib.DrawStr(x,y,str,color,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet);
 end
 else
 if CC.FontType==0 then
 lib.DrawStr(x-1,y,str,color,size,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x,y,str,color,size,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 elseif CC.FontType==1 then
 lib.DrawStr(x,y,str,color,size,CC.FontName,CC.SrcCharSet,CC.OSCharSet);
 end
 end
end
function DrawString(x,y,str,color,size) --显示阴影字符串
 if CONFIG.Windows then
 if CC.FontType==0 then
 lib.DrawStr(x,y,str,color,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 elseif CC.FontType==1 then
 lib.DrawStr(x,y,str,color,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet);
 end
 else
 if CC.FontType==0 then
 lib.DrawStr(x,y,str,color,size,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 elseif CC.FontType==1 then
 lib.DrawStr(x,y,str,color,size,CC.FontName,CC.SrcCharSet,CC.OSCharSet);
 end
 end
end
function DrawString2(x,y,str,color,size) --显示阴影字符串
 lib.DrawStr(x-2,y-1,str,C_BLACK,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x-2,y,str,C_BLACK,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x-2,y+1,str,C_BLACK,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x-1,y-1,str,C_BLACK,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x,y-1,str,C_BLACK,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x+1,y-1,str,C_BLACK,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x+1,y,str,C_BLACK,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x+1,y+1,str,C_BLACK,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x,y+1,str,C_BLACK,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 lib.DrawStr(x-1,y+1,str,C_BLACK,size,0,CC.FontName,CC.SrcCharSet,CC.OSCharSet,1);
 DrawString(x,y,str,color,size);
end
function DrawStr(x,y,str,color,size) --显示字符串,会分行
 
 local strarray={};
 local num,maxlen;
 maxlen=0;
 num,strarray=Split(str,'*');
 for i=1,num do
 local len=#strarray[i];
 if len>maxlen then
 maxlen=len;
 end
 end
 if maxlen==0 then
 return;
 end
 for i=1,num do
 DrawString(x,y+size*(i-1),strarray[i],color,size);
 end
end
function Split(szFullString,szSeparator)
 local nFindStartIndex = 1;
 local nSplitIndex = 1;
 local nSplitArray = {};
 while true do
 local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
 if not nFindLastIndex then
 nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString));
 break;
 end
 nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1);
 nFindStartIndex = nFindLastIndex + string.len(szSeparator);
 nSplitIndex = nSplitIndex + 1;
 end
 return nSplitIndex,nSplitArray;
end
function ShowScreen()
 if JY.Dark then
 Light(4);
 else
 lib.ShowSurface(0);
 end
end

function RGB(r,g,b) --设置颜色RGB
 return r*65536+g*256+b;
end
--产生对话显示需要的字符串，即每隔n个中文字符加一个星号
function GenTalkString(str,n) --产生对话显示需要的字符串
 local tmpstr="";
 local num=0;
 for s in string.gmatch(str .. "*","(.-)%*") do --去掉对话中的所有*. 字符串尾部加一个星号，避免无法匹配
 tmpstr=tmpstr .. s;
 end

 local newstr="";
 while #tmpstr>0 do
 num=num+1;
 local w=0;
 while w<#tmpstr do
 local v=string.byte(tmpstr,w+1); --当前字符的值
 if v>=128 then
 w=w+2;
 else
 w=w+1;
 end
 if w >= 2*n-1 then --为了避免跨段中文字符
 break;
 end
 end

 if w<#tmpstr then
 if w==2*n-1 and string.byte(tmpstr,w+1)<128 then
 newstr=newstr .. string.sub(tmpstr,1,w+1) .. "*";
 tmpstr=string.sub(tmpstr,w+2,-1);
 else
 newstr=newstr .. string.sub(tmpstr,1,w) .. "*";
 tmpstr=string.sub(tmpstr,w+1,-1);
 end
 else
 newstr=newstr .. tmpstr;
 break;
 end
 end
 return newstr,num;
end
function GetRGB(color) --分离颜色的RGB分量
 color=color%(65536*256);
 local r=math.floor(color/65536);
 color=color%65536;
 local g=math.floor(color/256);
 local b=color%256;
 return r,g,b;
end

--等待键盘输入
function WaitKey(flag) --等待键盘输入
 local keyPress=-1;
 while true do
 local eventtype,keypress,x,y=lib.GetKey(1);
 if eventtype==1 or eventtype==3 then
 MOUSE.status='IDLE';
 break;
 end
 lib.Delay(20);
 end
 lib.Delay(100);
 return keyPress;
end
function LoadRecord(id) -- 读取游戏进度
 local t1=lib.GetTime();
 --读取R*.idx文件
 local data=Byte.create(4*10);
 Byte.loadfile(data,CC.R_GRPFilename[0],0,4*10);
 local idx={};
 idx[0]=100;
 for i =1,10 do
 idx[i]=Byte.get32(data,4*(i-1)*1);
 end
 --读取R*.grp文件
 JY.Data_Base=Byte.create(idx[1]-idx[0]+CC.PersonSize); --基本数据
 Byte.loadfile(JY.Data_Base,CC.R_GRPFilename[id],idx[0],idx[1]-idx[0]+CC.PersonSize); --基本数据和主角属性
 JY.Base={};
 --设置访问基本数据的方法，这样就可以用访问表的方式访问了．而不用把二进制数据转化为表．节约加载时间和空间
 local meta_t={
 __index=function(t,k)
 return GetDataFromStruct(JY.Data_Base,0,CC.Base_S,k);
 end,

 __newindex=function(t,k,v)
 SetDataFromStruct(JY.Data_Base,0,CC.Base_S,k,v);
 end
 }
 setmetatable(JY.Base,meta_t);
 JY.Person[0]={};
 local meta_t={
 __index=function(t,k)
 return GetDataFromStruct(JY.Data_Base,(idx[1]-idx[0]),CC.Person_S,k);
 end,
 __newindex=function(t,k,v)
 SetDataFromStruct(JY.Data_Base,(idx[1]-idx[0]),CC.Person_S,k,v);
 end
 }
 setmetatable(JY.Person[0],meta_t);

 JY.PersonNum=math.floor((idx[2]-idx[1])/CC.PersonSize); --人物 /读取newgamesave
 --JY.Data_Person_Base=Byte.create(CC.PersonSize*JY.PersonNum);
 JY.Data_Person=Byte.create(CC.PersonSize*JY.PersonNum);
 Byte.loadfile(JY.Data_Person, CC.R_GRPFilename[0],idx[1],CC.PersonSize*JY.PersonNum);
 for i=1,JY.PersonNum-1 do
 JY.Person[i]={};
 local meta_t={
 __index=function(t,k)
 return GetDataFromStruct(JY.Data_Person,i*CC.PersonSize,CC.Person_S,k);
 end,
 __newindex=function(t,k,v)
 SetDataFromStruct(JY.Data_Person,i*CC.PersonSize,CC.Person_S,k,v);
 end
 }
 setmetatable(JY.Person[i],meta_t);
 end
 JY.ForceNum=math.floor((idx[3]-idx[2])/CC.ForceSize); --场景 /读取newgamesave
 JY.Data_Force=Byte.create(CC.ForceSize*JY.ForceNum);
 Byte.loadfile(JY.Data_Force,CC.R_GRPFilename[0],idx[2],CC.ForceSize*JY.ForceNum);
 for i=0,JY.ForceNum-1 do
 JY.Force[i]={};
 local meta_t={
 __index=function(t,k)
 return GetDataFromStruct(JY.Data_Force,i*CC.ForceSize,CC.Force_S,k);
 end,

 __newindex=function(t,k,v)
 SetDataFromStruct(JY.Data_Force,i*CC.ForceSize,CC.Force_S,k,v);
 end
 }
 setmetatable(JY.Force[i],meta_t);
 end
 JY.MapNum=math.floor((idx[4]-idx[3])/CC.MapSize); --场景
 JY.Data_Map=Byte.create(CC.MapSize*JY.MapNum);
 Byte.loadfile(JY.Data_Map,CC.R_GRPFilename[0],idx[3],CC.MapSize*JY.MapNum);
 for i=0,JY.MapNum-1 do
 JY.Map[i]={};
 local meta_t={
 __index=function(t,k)
 return GetDataFromStruct(JY.Data_Map,i*CC.MapSize,CC.Map_S,k);
 end,

 __newindex=function(t,k,v)
 SetDataFromStruct(JY.Data_Map,i*CC.MapSize,CC.Map_S,k,v);
 end
 }
 setmetatable(JY.Map[i],meta_t);
 end
 JY.ItemNum=math.floor((idx[5]-idx[4])/CC.ItemSize); --道具 /读取newgamesave
 JY.Data_Item=Byte.create(CC.ItemSize*JY.ItemNum);
 Byte.loadfile(JY.Data_Item,CC.R_GRPFilename[0],idx[4],CC.ItemSize*JY.ItemNum);
 for i=0,JY.ItemNum-1 do
 JY.Item[i]={};
 local meta_t={
 __index=function(t,k)
 return GetDataFromStruct(JY.Data_Item,i*CC.ItemSize,CC.Item_S,k);
 end,

 __newindex=function(t,k,v)
 SetDataFromStruct(JY.Data_Item,i*CC.ItemSize,CC.Item_S,k,v);
 end
 }
 setmetatable(JY.Item[i],meta_t);
 end
 JY.KungfuNum=math.floor((idx[6]-idx[5])/CC.KungfuSize); --武功 /读取newgamesave
 JY.Data_Kungfu=Byte.create(CC.KungfuSize*JY.KungfuNum);
 Byte.loadfile(JY.Data_Kungfu,CC.R_GRPFilename[0],idx[5],CC.KungfuSize*JY.KungfuNum);
 for i=0,JY.KungfuNum-1 do
 JY.Kungfu[i]={};
 local meta_t={
 __index=function(t,k)
 return GetDataFromStruct(JY.Data_Kungfu,i*CC.KungfuSize,CC.Kungfu_S,k);
 end,

 __newindex=function(t,k,v)
 SetDataFromStruct(JY.Data_Kungfu,i*CC.KungfuSize,CC.Kungfu_S,k,v);
 end
 }
 setmetatable(JY.Kungfu[i],meta_t);
 end
 JY.SkillNum=math.floor((idx[7]-idx[6])/CC.SkillSize); --招式 /读取newgamesave
 JY.Data_Skill=Byte.create(CC.SkillSize*JY.SkillNum);
 Byte.loadfile(JY.Data_Skill,CC.R_GRPFilename[0],idx[6],CC.SkillSize*JY.SkillNum);
 for i=0,JY.SkillNum-1 do
 JY.Skill[i]={};
 local meta_t={
 __index=function(t,k)
 return GetDataFromStruct(JY.Data_Skill,i*CC.SkillSize,CC.Skill_S,k);
 end,

 __newindex=function(t,k,v)
 SetDataFromStruct(JY.Data_Skill,i*CC.SkillSize,CC.Skill_S,k,v);
 end
 }
 setmetatable(JY.Skill[i],meta_t);
 end
 JY.LingwuNum=math.floor((idx[8]-idx[7])/CC.LingwuSize); --领悟 /读取newgamesave
 JY.Data_Lingwu=Byte.create(CC.LingwuSize*JY.LingwuNum);
 Byte.loadfile(JY.Data_Lingwu,CC.R_GRPFilename[0],idx[7],CC.LingwuSize*JY.LingwuNum);
 for i=0,JY.LingwuNum-1 do
 JY.Lingwu[i]={};
 local meta_t={
 __index=function(t,k)
 return GetDataFromStruct(JY.Data_Lingwu,i*CC.LingwuSize,CC.Lingwu_S,k);
 end,

 __newindex=function(t,k,v)
 SetDataFromStruct(JY.Data_Lingwu,i*CC.LingwuSize,CC.Lingwu_S,k,v);
 end
 }
 setmetatable(JY.Lingwu[i],meta_t);
 end
	JY.Data_Str=Byte.create(idx[9]-idx[8]);
	Byte.loadfile(JY.Data_Str,CC.R_GRPFilename[0],idx[8],idx[9]-idx[8]);
	JY.StrNum=Byte.get16(JY.Data_Str,0);
	JY.Str={};
	local meta_t={
	    __index=function(t,k)
			return Byte.getstr(JY.Data_Str,Byte.get32(JY.Data_Str,2+4*(k-1)),Byte.get32(JY.Data_Str,2+4*k)-Byte.get32(JY.Data_Str,2+4*(k-1)));
		end,

		__newindex=function(t,k,v)
	        return;
	 	end
	}
	setmetatable(JY.Str,meta_t);
 collectgarbage();
 
end
function fileexist(filename) --检测文件是否存在
 local inp=io.open(filename,"rb");
 if inp==nil then
 return false;
 end
 inp:close();
 return true;
end
function filelength(filename) --得到文件长度
 local inp=io.open(filename,"rb");
 if inp==nil then
 return -1;
 end
 local l= inp:seek("end");
 inp:close();
 return l;
end
function copyfile(source,destination)
 local sourcefile = io.open(source,"rb");
 local destinationfile = io.open(destination,"wb");
 destinationfile:write(sourcefile:read("*a"));
 sourcefile:close();
 destinationfile:close();
end
function creatfile(destination)
 local destinationfile = io.open(destination,"wb");
 destinationfile:write();
 destinationfile:close();
end
-- 写游戏进度
-- id=0 新进度，=1/2/3 进度
function SaveRecord(id) -- 写游戏进度
 local t1=lib.GetTime();
 --
 --读取R*.idx文件
 local data=Byte.create(4*8);
 Byte.loadfile(data,CC.R_GRPFilename[0],0,4*8);
 local idx={};
 idx[0]=100;
 for i =1,8 do
 idx[i]=Byte.get32(data,4*(i-1));
 end
 
 --写R*.grp文件
 if filelength(CC.R_GRPFilename[id])~=idx[1]+CC.PersonSize then
 creatfile(CC.R_GRPFilename[id]);
 end
 
 --Base
 Byte.savefile(JY.Data_Base,CC.R_GRPFilename[id],idx[0],idx[1]-idx[0]+CC.PersonSize);
  
end
--从数据的结构中翻译数据
--data 二进制数组
--offset data中的偏移
--t_struct 数据的结构，在jyconst中有很多定义
--key 访问的key
function GetDataFromStruct(data,offset,t_struct,key) --从数据的结构中翻译数据，用来取数据
 local t=t_struct[key];
 local r;
 if t[2]==0 then
 if t[3]==4 then
 r=Byte.get32(data,t[1]+offset);
 else
 r=Byte.get16(data,t[1]+offset);
 end
 elseif t[2]==1 then
 if t[3]==4 then
 r=Byte.get32(data,t[1]+offset);
 else
 r=Byte.getu16(data,t[1]+offset);
 end
 elseif t[2]==2 then
 if CC.SrcCharSet==1 then
 r=lib.CharSet(Byte.getstr(data,t[1]+offset,t[3]),0);
 else
 r=Byte.getstr(data,t[1]+offset,t[3]);
 end
 end
 
 return r;
end
function SetDataFromStruct(data,offset,t_struct,key,v) --从数据的结构中翻译数据，保存数据
 local t=t_struct[key];
 
 if t[2]==0 then
 if t[3]==4 then
 Byte.set32(data,t[1]+offset,v);
 else
 Byte.set16(data,t[1]+offset,v);
 end
 elseif t[2]==1 then
 if t[3]==4 then
 Byte.set32(data,t[1]+offset,v);
 else
 Byte.setu16(data,t[1]+offset,v);
 end
 elseif t[2]==2 then
 local s;
 if CC.SrcCharSet==1 then
 s=lib.CharSet(v,1);
 else
 s=v;
 end
 Byte.setstr(data,t[1]+offset,t[3],s);
 end
end
function GetPersonData(offset,t_struct,key)
 if t_struct[key][4] then
 return GetDataFromStruct(JY.Data_Person,offset,t_struct,key);
 else
 return GetDataFromStruct(JY.Data_Person_Base,offset,t_struct,key);
 end
end
function between(v,Min,Max)
 if Min>Max then
 Min,Max=Max,Min;
 end
 if v>=Min and v<=Max then
 return true;
 end
 return false;
end
function Light(frame) --场景变亮
 frame=frame or CC.FrameNum;
 if JY.Dark then
 JY.Dark=false;
 lib.ShowSlow(frame,0);
 lib.GetKey();
 end
end
function Dark(frame) --场景变黑
 frame=frame or CC.FrameNum;
 if not JY.Dark then
 JY.Dark=true;
 lib.ShowSlow(frame,1);
 lib.GetKey();
 end
end
--播放MP3
function PlayBGM(id)
 id=id or 0;
 JY.CurrentBGM=id;
 if JY.EnableMusic==0 then
 return ;
 end
 if id>=0 then
 lib.PlayMIDI(string.format(CC.BGMFile,id));
 end
end
function StopBGM()
 JY.CurrentBGM=-1;
 lib.PlayMIDI("");
end
--播放音效e**
function PlayWavE(id) --播放音效e**
 if JY.EnableSound==0 then
 return ;
 end

  if JY.Base["开启音乐"]==1 then
 lib.PlayMIDI(CONFIG.SoundPath .. "game.mp3");
 else
 lib.PlayMIDI("");
 end

 if id>=0 then
 if id<2 or JY.Base["开启音效"]>0 then
 lib.PlayWAV(string.format(CC.EFile,id));


 end
 end
end
function PlayWavA(id) --播放音效e**
 if JY.EnableSound==0 then
 return ;
 end
 if id>=0 then
 lib.PlayWAV(string.format(CC.ATKFile,id));
 end
end
--产生对话显示需要的字符串，即每隔n个中文字符加一个星号
function GenTalkString(str,n) --产生对话显示需要的字符串
 local tmpstr="";
 local num=0;
 for s in string.gmatch(str .. "*","(.-)%*") do --去掉对话中的所有*. 字符串尾部加一个星号，避免无法匹配
 tmpstr=tmpstr .. s;
 end

 local newstr="";
 while #tmpstr>0 do
 num=num+1;
 local w=0;
 while w<#tmpstr do
 local v=string.byte(tmpstr,w+1); --当前字符的值
 if v>=128 then
 w=w+2;
 else
 w=w+1;
 end
 if w >= 2*n-1 then --为了避免跨段中文字符
 break;
 end
 end

 if w<#tmpstr then
 if w==2*n-1 and string.byte(tmpstr,w+1)<128 then
 newstr=newstr .. string.sub(tmpstr,1,w+1) .. "*";
 tmpstr=string.sub(tmpstr,w+2,-1);
 else
 newstr=newstr .. string.sub(tmpstr,1,w) .. "*";
 tmpstr=string.sub(tmpstr,w+1,-1);
 end
 else
 newstr=newstr .. tmpstr;
 break;
 end
 end
 return newstr,num;
end
--==============================================================--
function JYOL_Mini_Endless()
	
	lib.PicLoadCache(0,9*2,0,0,1);
	Light();
	for i=1,10 do
		lib.GetKey(1);
		lib.Delay(100);
	end
	WaitKey();
	Dark();

 JY.Status=GAME_START;
 JY.co_auto=coroutine.create(Auto);
 JY.co_learn=coroutine.create(Learn);
 JY.co_fight=coroutine.create(Fight);
 if fileexist(CC.R_GRPFilename[1]) then
 LoadRecord(1);
 math.randomseed(JY.Base.Seed);
 JY.Status=GAME_AUTO;
 else
 NewPerson(0);
 end
 lib.Debug("game start");
 JYOL_Mini_Endless_Cycle();
end
function NewPerson(id)
 JY.Leaving={};
 if JY.Status~=GAME_START then
 JY.Status=GAME_START;
 local m=1;
 for i=98,9999 do
	if JY.Base["武功等级"..i]>0 then
	JY.Leaving[m]=i;
	m=m+1;
	end
 end
 end
if fileexist(CC.R_GRPFilename[1]) and id==2 then
CleanMemory();
local name=JY.Person[JY.pid]["名称"];
local pic=JY.Person[JY.pid]["头像"];
JY.JCSX={};
JY.JCWX={};
local j=9;
local k=0;
JY.JCSX[1]=2;
JY.JCSX[2]=JY.Base["重生次数"]+1;
JY.JCSX[3]=limitX(JY.Base["伤害基数"]+math.modf(JY.Base["基本伤害"]*0.1),0,10000);
JY.JCSX[4]=limitX(JY.Base["命中基数"]+math.modf(JY.Base["基本命中"]*0.1),0,10000);
JY.JCSX[5]=limitX(JY.Base["格挡基数"]+math.modf(JY.Base["基本格挡"]*0.1),0,10000);
JY.JCSX[6]=limitX(JY.Base["闪避基数"]+math.modf(JY.Base["基本闪避"]*0.1),0,10000);
JY.JCSX[7]=JY.Base["时"];
JY.JCSX[8]=JY.Base["分"];
JY.JCSX[9]=JY.Base["秒"];
for i=1,9999 do
	if JY.Base["武功等级上限"..i]>0 then
	j=j+1;
	JY.JCSX[j]=JY.Base["武功等级上限"..i];
	k=k+1;
	JY.JCWX[k]=i;
	end
end
j=9;
k=0;
 LoadRecord(0);
 JY.Person[JY.pid]["名称"]=name;
 JY.Person[JY.pid]["头像"]=pic;
elseif fileexist(CC.R_GRPFilename[1]) and id==1 then
CleanMemory();
local name=JY.Person[JY.pid]["名称"];
local pic=JY.Person[JY.pid]["头像"];
JY.JCSX={};
JY.JCWX={};
local j=9;
local k=0;
JY.JCSX[1]=1;
JY.JCSX[2]=JY.Base["重生次数"];
JY.JCSX[3]=limitX(JY.Base["伤害基数"]-math.modf(JY.Base["基本伤害"]*0.05),0,10000);
JY.JCSX[4]=limitX(JY.Base["命中基数"]-math.modf(JY.Base["基本命中"]*0.05),0,10000);
JY.JCSX[5]=limitX(JY.Base["格挡基数"]-math.modf(JY.Base["基本格挡"]*0.05),0,10000);
JY.JCSX[6]=limitX(JY.Base["闪避基数"]-math.modf(JY.Base["基本闪避"]*0.05),0,10000);
JY.JCSX[7]=JY.Base["时"];
JY.JCSX[8]=JY.Base["分"];
JY.JCSX[9]=JY.Base["秒"];
for i=1,9999 do
	if JY.Base["武功等级上限"..i]>0 then
	j=j+1;
	JY.JCSX[j]=JY.Base["武功等级上限"..i];
	k=k+1;
	JY.JCWX[k]=i;
	end
end
j=9;
k=0;
 LoadRecord(0);
 JY.Person[JY.pid]["名称"]=name;
 JY.Person[JY.pid]["头像"]=pic;
elseif id==0 then
CleanMemory();
 JY.JCSX={};
 JY.JCSX[1]=0;
 JY.JCSX[2]=0;
 JY.JCSX[3]=0;
 JY.JCSX[4]=0;
 JY.JCSX[5]=0;
 JY.JCSX[6]=0;
 JY.JCSX[7]=0;
 JY.JCSX[8]=0;
 JY.JCSX[9]=0;
 for i=1,9999 do
 JY.Base["武功等级上限"..i]=0;
 end
 LoadRecord(0);
 JY.Person[JY.pid]["名称"]=IniName();
else 
 LoadRecord(0);
 JY.Person[JY.pid]["名称"]=IniName();
end
 ResetAttrib();
 OpenPersonIni();
end
function ResetAttrib()
 JY.pid=0;
 for i,v in pairs({"膂力","根骨","机敏","悟性","福缘"}) do
 JY.Base[v.."加值"]=0;
 end
 JY.Base["潜能"]=500;
 JY.Base["实战"]=0;
 JY.Base["节"]=0;
 JY.Base["秒"]=0;
 JY.Base["分"]=0;
 JY.Base["时"]=0;
 JY.Person[JY.pid]["生命最大值"]=400;
 JY.Person[JY.pid]["内力最大值"]=400;
if fileexist(CC.R_GRPFilename[1]) then
JY.Base["伤害基数"]=JY.JCSX[3];
JY.Base["命中基数"]=JY.JCSX[4];
JY.Base["格挡基数"]=JY.JCSX[5];
JY.Base["闪避基数"]=JY.JCSX[6];
JY.Base["基本伤害"]=JY.Base["伤害基数"];
JY.Base["基本命中"]=JY.Base["命中基数"];
JY.Base["基本格挡"]=JY.Base["格挡基数"];
JY.Base["基本闪避"]=JY.Base["闪避基数"];
end
 JY.Person[JY.pid]["生命"]=JY.Person[JY.pid]["生命最大值"];
 JY.Person[JY.pid]["内力"]=JY.Person[JY.pid]["内力最大值"];
 for i,v in pairs({"膂力","根骨","机敏","悟性","福缘"}) do
 JY.Person[JY.pid][v]=4;

 JY.Base[v.."成长"]=0; 
 end
 JY.Base["自由属性点"]=0;
 JY.Base["相性"]=math.random(256)-1; 
 SetFreePoint();
 for i=1,5 do
 if JY.Person[JY.pid]["武功"..i]>0 and JY.Person[JY.pid]["武功等级"..i]>0 then
 local n=JY.Person[JY.pid]["武功"..i];
 JY.Base["武功等级"..n]=JY.Person[JY.pid]["武功等级"..i];
 JY.Base["武功等级上限"..n]=limitX(JY.Base["武功等级上限"..n],10,limitX(JY.Base["重生次数"]*10+10,10,100));
 end
 end
 for i,v in pairs({"内功","轻功","特技"}) do
 if JY.Person[JY.pid][v]>0 and JY.Person[JY.pid][v.."等级"]>0 then
 local n=JY.Person[JY.pid][v];
 JY.Base["武功等级"..n]=JY.Person[JY.pid][v.."等级"];
 JY.Base["武功等级上限"..n]=limitX(JY.Base["武功等级上限"..n],10,limitX(JY.Base["重生次数"]*10+10,10,100));
 end
 end 
end
function MainMenu()
 local bt={};
 local x,y=154,120;
 table.insert(bt,{id=1,x1=x,y1=y,x2=x+146,y2=y+36,tx=x+73,ty=y+18,txt="重新开始",pic1=145,pic2=146,pic3=147,pic4=148,enable=true,show=true});
 y=y+42;
 table.insert(bt,{id=2,x1=x,y1=y,x2=x+146,y2=y+36,tx=x+73,ty=y+18,txt="读取存档",pic1=145,pic2=146,pic3=147,pic4=148,enable=true,show=true});
 y=y+42;
 table.insert(bt,{id=3,x1=x,y1=y,x2=x+146,y2=y+36,tx=x+73,ty=y+18,txt="离开游戏",pic1=145,pic2=146,pic3=147,pic4=148,enable=true,show=true});
 if not fileexist(CC.R_GRPFilename[1]) then
 bt[2].enable=false;
 end
 local current=0;
 local hold=false;
 local function redraw()
 lib.PicLoadCache(0,490*2,0,0,1);
 for i,v in pairs(bt) do
 if v.show then
 if v.enable then
 if current==v.id then
 if hold then
 lib.PicLoadCache(0,v.pic3*2,v.x1,v.y1,1);
 else
 lib.PicLoadCache(0,v.pic2*2,v.x1,v.y1,1);
 end
 else
 lib.PicLoadCache(0,v.pic1*2,v.x1,v.y1,1);
 end
 else
 lib.PicLoadCache(0,v.pic4*2,v.x1,v.y1,1);
 end
 if #v.txt>0 then
 if current==v.id and hold then
 DrawStringS(v.tx-16*#v.txt/4+1,v.ty-16/2+1,v.txt,C_WHITE,16);
 else
 DrawStringS(v.tx-16*#v.txt/4,v.ty-16/2,v.txt,C_WHITE,16);
 end
 end
 end
 end
 end
 
 while true do
 local t1=lib.GetTime();
 redraw();
 ShowScreen();
 local delay=CC.FrameNum-lib.GetTime()+t1;
 if delay>0 then
 lib.Delay(delay);
 end
 getkey();
 current=0;
 hold=false;
 for i,v in pairs(bt) do
 if v.show then
 if v.enable then
 if MOUSE.CLICK(v.x1,v.y1,v.x2,v.y2) then
 PlayWavE(0);
 return v.id;
 elseif MOUSE.HOLD(v.x1,v.y1,v.x2,v.y2) then
 current=v.id;
 hold=true;
 elseif MOUSE.IN(v.x1,v.y1,v.x2,v.y2) then
 current=v.id;
 end
 else
 if MOUSE.CLICK(v.x1,v.y1,v.x2,v.y2) then
 PlayWavE(1);
 end
 end
 end
 end
 end
end
function JYOL_Mini_Endless_Cycle()
 local t0=os.clock();
 local t1;
 local t2;
 if JY.Base["倒计时"]>0 then
 JY.bt[5].txt=string.format("%02d:%02d",math.modf(JY.Base["倒计时"]/60),JY.Base["倒计时"]%60);
 else
 JY.bt[5].txt="Boss";
 SetMainMenu();
 end
 
 while JY.Status>=0 do
 t2=lib.GetTime();
 DrawGame();
 ShowScreen();
 for i=1,JY.SPD do
 JYOL_Mini_Endless_Core();
 end
 --======================--
 JY.Base["节"]=JY.Base["节"]+1;
 if JY.Base["节"]>=20 then 
 JY.Base["节"]=0;
 JY.Base["秒"]=JY.Base["秒"]+1;
 if JY.Base["倒计时"]>0 then
 JY.Base["倒计时"]=JY.Base["倒计时"]-15;
 if JY.Base["倒计时"]>0 then
 JY.bt[5].txt=string.format("%02d:%02d",math.modf(JY.Base["倒计时"]/60),JY.Base["倒计时"]%60);
 else
 JY.bt[5].txt="Boss";
 SetMainMenu();
 end
 end
 if JY.Base["秒"]>=60 then 
 JY.Base["秒"]=0;
 JY.Base["分"]=JY.Base["分"]+1;
 if JY.Base["分"]>=60 then 
 JY.Base["分"]=0;
 JY.Base["时"]=JY.Base["时"]+1;
 end
 --每分钟自动存档一次
 JY.Base.Seed=math.random(999999);
 SaveRecord(1);
 math.randomseed(JY.Base.Seed);
 end
 end
 local delay=CC.FrameNum-lib.GetTime()+t2;
 if delay>0 then
 lib.Delay(delay);
 end
 getkey();
 ButtonEvent();
 t1=os.clock();
 if t1-t0<0.045 then
 CycleDelay(0.05);
 end
 t0=os.clock();
 end
end
function CycleDelay(delay)
 local t0=os.clock();
 while between(os.clock()-t0,0,delay) do
 getkey();
 end
end
function JYOL_Mini_Endless_Core()
 if #JY.TEXT_BUFF>0 then --显示文本
 ShowText();
 elseif JY.WAIT>0 then
 JY.WAIT=JY.WAIT-1;
 elseif JY.Status==GAME_AUTO then
 coroutine.resume(JY.co_auto);
 elseif JY.Status==GAME_FIGHT then
 coroutine.resume(JY.co_fight);
 elseif JY.Status==GAME_LEARN then
 coroutine.resume(JY.co_learn);
 elseif JY.Status==GAME_START then
 
 end
end
function cycle_test()
 while #JY.TEXT_BUFF>0 do
 ShowText();
 DrawGame();
 DrawString(16,32,JY.TEXT_BUFF,C_WHITE,16);
 ShowScreen();
 getkey();
 end
end
function ShowText()
 local MAX_LINE=12; --最大行数
 local MAX_NUM=50; --每行最大字数
 local current=#JY.TEXT; --获取当前行
 if #JY.TEXT_BUFF<=0 then
 return;
 end
 local tv=string.sub(JY.TEXT_BUFF,1,1);
 local v="";
 if tv=="\\" then --控制字符
 if string.sub(JY.TEXT_BUFF,1,2)=="\\n" then --换行
 JY.TEXT_BUFF=string.sub(JY.TEXT_BUFF,3,-1);
 if #JY.TEXT[current]>0 then
 table.insert(JY.TEXT,"");
 JY.CURRENT_COLOR=M_White; --换行时，颜色恢复默认
 table.insert(JY.TEXT_COLOR,{[1]={s=1,c=JY.CURRENT_COLOR}});
 current=#JY.TEXT; --获取当前行
 if current>MAX_LINE then --超出最大行数时，remove掉第一行
 table.remove(JY.TEXT,1);
 table.remove(JY.TEXT_COLOR,1);
 end
 end
 elseif string.sub(JY.TEXT_BUFF,1,6)=="\\white" then --white
 JY.TEXT_BUFF=string.sub(JY.TEXT_BUFF,7,-1);
 JY.CURRENT_COLOR=M_White;
 table.insert(JY.TEXT_COLOR[current],{s=#JY.TEXT[current]+1,c=JY.CURRENT_COLOR});
 ShowText();
 elseif string.sub(JY.TEXT_BUFF,1,4)=="\\red" then --red
 JY.TEXT_BUFF=string.sub(JY.TEXT_BUFF,5,-1);
 JY.CURRENT_COLOR=M_Red;
 table.insert(JY.TEXT_COLOR[current],{s=#JY.TEXT[current]+1,c=JY.CURRENT_COLOR});
 ShowText();
 elseif string.sub(JY.TEXT_BUFF,1,7)=="\\yellow" then --yellow
 JY.TEXT_BUFF=string.sub(JY.TEXT_BUFF,8,-1);
 JY.CURRENT_COLOR=M_Yellow;
 table.insert(JY.TEXT_COLOR[current],{s=#JY.TEXT[current]+1,c=JY.CURRENT_COLOR});
 ShowText();
 elseif string.sub(JY.TEXT_BUFF,1,7)=="\\orange" then --orange
 JY.TEXT_BUFF=string.sub(JY.TEXT_BUFF,8,-1);
 JY.CURRENT_COLOR=M_Orange;
 table.insert(JY.TEXT_COLOR[current],{s=#JY.TEXT[current]+1,c=JY.CURRENT_COLOR});
 ShowText();
 elseif string.sub(JY.TEXT_BUFF,1,6)=="\\green" then --M_PaleGreen
 JY.TEXT_BUFF=string.sub(JY.TEXT_BUFF,7,-1);
 JY.CURRENT_COLOR=M_PaleGreen;
 table.insert(JY.TEXT_COLOR[current],{s=#JY.TEXT[current]+1,c=JY.CURRENT_COLOR});
 ShowText();
 end
 return;
 end
 tv=string.sub(JY.TEXT_BUFF,1,1);
 if string.byte(tv)<128 then --英文以及数字
 v=tv;
 JY.TEXT_BUFF=string.sub(JY.TEXT_BUFF,2,-1);
 else --汉字
 v=string.sub(JY.TEXT_BUFF,1,2);
 JY.TEXT_BUFF=string.sub(JY.TEXT_BUFF,3,-1);
 end
 if #v>0 then
 if #JY.TEXT[current]+#v>MAX_NUM then --当前行空间不足时，新增一行
 table.insert(JY.TEXT,"");
 table.insert(JY.TEXT_COLOR,{[1]={s=1,c=JY.CURRENT_COLOR}});
 current=#JY.TEXT; --获取当前行
 end
 JY.TEXT[current]=JY.TEXT[current]..v; --加到当前行行尾
 if #JY.TEXT[current]>=MAX_NUM then --到达行尾时，新增一行
 table.insert(JY.TEXT,"");
 table.insert(JY.TEXT_COLOR,{[1]={s=1,c=JY.CURRENT_COLOR}});
 current=#JY.TEXT; --获取当前行
 end
 if current>MAX_LINE then --超出最大行数时，remove掉第一行
 table.remove(JY.TEXT,1);
 table.remove(JY.TEXT_COLOR,1);
 end
 end
end
function Auto()
while true do
if JY.Base["体力"]==25 then
 GAME_VER="观岛香月威力加强版v3.1 牛逼模式"; 
elseif JY.Base["体力"]==-25 then
 GAME_VER="观岛香月威力加强版v3.1 二逼模式"; 
else
 JY.Base["体力"]=0;
 GAME_VER="观岛香月威力加强版v3.1 逗逼模式"; 
end
 GetTitle(); JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white正在思考做什么...\\n";
 JY.WAIT=1;
 coroutine.yield();
 local r=math.random(1000000)/10000;
 if JY.Base["指令"]==2 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white输了比武...\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white万念俱灰，决定一死重新投胎...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,6 do
 JY.TEXT_BUFF="........................\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 JY.Base["指令"]=0;
 NewPerson(1);
 JY.WAIT=1;
 coroutine.yield();
 elseif JY.Base["指令"]==5 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white错误的选择了重生...\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white连重生等级都没看到，"..JY.Person[JY.pid]["名称"].."羞愧的决定一死并重新投胎...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,6 do
 JY.TEXT_BUFF="........................\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 JY.Base["指令"]=0;
 NewPerson(0);
 JY.WAIT=1;
 coroutine.yield();
 elseif JY.Base["指令"]==1 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white觉得已近人生巅峰...\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white决定转世重生继续修炼...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,6 do
 JY.TEXT_BUFF="........................\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 JY.Base["指令"]=0;
 NewPerson(2);
 JY.WAIT=1;
 coroutine.yield();
 elseif JY.Base["指令"]==3 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white觉得有必要记录下如今的现状...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,5 do
 JY.TEXT_BUFF="记录现状中........................\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 JY.CENTER_MSG="";
 JY.Base["指令"]=0;
 SetMainMenu();
 SaveRecord(2);
 coroutine.yield();
 JY.TEXT_BUFF="记录完成\\n";
 JY.WAIT=1;
 coroutine.yield();
 elseif JY.Base["指令"]==4 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white觉得过去的时光是如此美妙令人向往...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,5 do
 JY.TEXT_BUFF="回忆过去中........................\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 JY.CENTER_MSG="";
 JY.Base["指令"]=0;
 local stat=JY.Base["体力"];
 SetMainMenu();
 LoadRecord(2);
 JY.Base["体力"]=stat;
 coroutine.yield();
 JY.TEXT_BUFF="回忆完了\\n";
 JY.WAIT=1;
 coroutine.yield();
 elseif JY.Base["当前事件"]>0 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white决定去挑战Boss...\\n";
 JY.WAIT=1;
 coroutine.yield();
 MapEvent();
 elseif JY.Base["下个场景"]>0 then 
 EnterMap();
 elseif r<3 then
 Sleep();
 elseif r<6 then
 Thinking();
 elseif r<9 then
 Eating();
 elseif r<12 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white决定去和路人聊天...\\n";
 JY.WAIT=1;
 coroutine.yield();
 MapTalk("老头","当日华山论剑，他用\\orange黯然销魂掌\\white，破了我的七十二路\\orange空明拳\\white；我改\\orange降龙十八掌\\white，他伸开食指中指，竟是\\orange六脉神剑\\white商阳剑和中冲剑并用，又胜我一筹。可见天下武功彼此克制，武学之道玄之又玄！\\n");
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white听得心驰目眩...\\n";
 JY.WAIT=1;
 coroutine.yield();
 MapTalk("老太太","玩个石头剪子布都说得这般威风！\\n");
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white目瞪口呆...\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white历练上升！\\n";
 JY.WAIT=1;
 coroutine.yield();
 if JY.Person[JY.pid]["等级"]<100 then
 JY.Base["实战"]=JY.Base["实战"]+10+limitX(JY.Base["重生次数"],0,100);
 CheckLvUp(JY.pid);
 end
 elseif r<17 and CanRetreat() and math.random(1000000)/10000>75 then
 Retreat();
 elseif r<19 and math.random(1000000)/10000>50 then
 local gamemod={"牛逼","逗逼","二逼"};
 local rmod;
 rmod=math.random(#gamemod);
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white开启\\orange"..gamemod[rmod].."模式...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,5+math.random(5) do
 JY.TEXT_BUFF="\\orange"..gamemod[rmod].."模式\\white开启中...\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 if rmod==1 then
 if JY. Base ["体力"]==25 then
 JY.TEXT_BUFF="\\red已经处在牛逼模式\\n";
 GAME_VER="观岛香月威力加强版v3.1 牛逼模式";
 JY. Base ["体力"]=25;
 JY.WAIT=1; 
 coroutine.yield();
 elseif JY. Base ["体力"]~=25 and math.random(100000)/1000>80 and JY.Person[JY.pid]["名称"]~="霹焱仙人" then
 JY.TEXT_BUFF="\\red开启成功\\n";
 GAME_VER="观岛香月威力加强版v3.1 牛逼模式";
 JY. Base ["体力"]=25;
 JY.WAIT=1;
 coroutine.yield();
 else
 JY.TEXT_BUFF="\\red开启失败\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 elseif rmod==2 then
 if JY. Base ["体力"]==0 then
 JY.TEXT_BUFF="\\red已经处在逗逼模式\\n";
 GAME_VER="观岛香月威力加强版v3.1 逗逼模式";
 JY. Base ["体力"]=0;
 JY.WAIT=1;
 coroutine.yield();
 elseif JY. Base ["体力"]~=0 and math.random(100000)/1000>70 then
 JY.TEXT_BUFF="\\red开启成功\\n";
 GAME_VER="观岛香月威力加强版v3.1 逗逼模式";
 JY. Base ["体力"]=0;
 JY.WAIT=1;
 coroutine.yield();
 else
 JY.TEXT_BUFF="\\red开启失败\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 elseif rmod==3 then
 if JY. Base ["体力"]==-25 then
 JY.TEXT_BUFF="\\red已经处在二逼模式\\n";
 GAME_VER="观岛香月威力加强版v3.1 二逼模式";
 JY. Base ["体力"]=-25;
 JY.WAIT=1;
 coroutine.yield();
 elseif JY. Base ["体力"]~=-25 and math.random(100000)/1000>85 and JY.Person[JY.pid]["名称"]~="霹焱仙人" then
 JY.TEXT_BUFF="\\red开启成功\\n";
 GAME_VER="观岛香月威力加强版v3.1 二逼模式";
 JY. Base ["体力"]=-25;
 JY.WAIT=1;
 coroutine.yield();
 else
 JY.TEXT_BUFF="\\red开启失败\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
end
 elseif r<22 and math.random(1000000)/10000>50 then
 Xiaobao();
 elseif r<limitX(23+math.modf(JY.Base["潜能"]/1000),23,52) then
 JY.Status=GAME_LEARN;
 coroutine.yield();
 elseif r>97 then
 Girl();
 else
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white决定去找人比武...\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white正在寻找对手...\\n";
 JY.WAIT=1;
 coroutine.yield();
 if r>95 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white还在寻找对手...\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 if r>96 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white没有发现对手...\\n";
 JY.WAIT=1;
 coroutine.yield();
 else
 MapFight();
 end
 end
 end
end
function GetTitle()
	for tid=1,48 do
		if JY.Base["开启称号"..tid]==0 then
			local pass=true;
			--等级
			if JY.Person[0]["等级"]<JY.Item[tid]["需人物等级"] then
				pass=false;
			end
			--关卡
			for j=1,5 do
			 if JY.Item[tid]["需通过场景"..j]>0 then
				local sid=JY.Item[tid]["需通过场景"..j];
				local sta=1+JY.Item[tid]["需通过场景进度"..j];
				if JY.Base["开启场景"..sid]<sta then
					pass=false;
				end
			 end
			end
			--武功组合
			for i=1,6 do
				local kfid=JY.Item[tid]["需武功"..i];
				if kfid>0 then
					if JY.Base["武功等级"..kfid]<JY.Item[tid]["需武功等级"] then
						pass=false;
					end
				end
			end
			
			if pass then
				GetTitle_sub(tid);
			end
		end
	end
end
function GetTitle_sub(tid)
 local p=JY.Person[0];
 PlayWavE(11);
 JY.Base["开启称号"..tid]=1;
 InsertLog(8,tid,0);
 JY.TEXT_BUFF=string.format("\\yellow%s\\white获得称号\\orange%s\\white！\\n",p["名称"],JY.Item[tid]["名称"]);
 JY.WAIT=1;
 coroutine.yield();
 for i,v in pairs({"生命","内力"}) do
 if JY.Item[tid][v]>0 then
	if JY.Base["开启专家"]==1 then
		p[v.."最大值"]=p[v.."最大值"]+JY.Item[tid][v];
		p[v]=p[v.."最大值"];
		JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white%s上限上升到%d \\green(%+d)\\white！\\n",v,p[v],JY.Item[tid][v]);
		InsertLog(2,i,p[v]);
		JY.WAIT=1;
		coroutine.yield();
	else
		p[v.."最大值"]=p[v.."最大值"]+JY.Item[tid][v];
		p[v]=p[v.."最大值"];
		JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white%s上限上升到%d \\green(%+d)\\white！\\n",v,p[v],JY.Item[tid][v]);
		InsertLog(2,i,p[v]);
		JY.WAIT=1;
		coroutine.yield();
	end
 end
 end
 for i,v in pairs({"伤害","命中","格挡","闪避"}) do
 if JY.Item[tid][v]>0 then
	if JY.Base["开启专家"]==1 then
		JY.Base["基本"..v]=JY.Base["基本"..v]+JY.Item[tid][v]*2;
		JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white基本%s上升到%d \\green(%+d)\\white！\\n",v,JY.Base["基本"..v],JY.Item[tid][v]*2);
	else
		JY.Base["基本"..v]=JY.Base["基本"..v]+JY.Item[tid][v];
		JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white基本%s上升到%d \\green(%+d)\\white！\\n",v,JY.Base["基本"..v],JY.Item[tid][v]);
	end
 InsertLog(2,i+7,JY.Base["基本"..v]);
 JY.WAIT=1;
 coroutine.yield();
 end
 end
end
function GetWeapon(tid)
	tid=tid-100;
	if between(tid,01,48) and JY.Base["开启武器"..tid]==0 then
		local p=JY.Person[0];
		PlayWavE(11);
		JY.Base["开启武器"..tid]=1;
		InsertLog(9,tid+100,0);
		JY.TEXT_BUFF=string.format("\\yellow%s\\white获得武器\\green%s\\white！\\n",p["名称"],JY.Item[tid+100]["名称"]);
		JY.WAIT=1;
		coroutine.yield();
	end
end
function Xiaobao()
 local name_t={"尹志平","田伯光","云中鹤","韦小宝","莫小宝","宋小宝"};
 local xb_name=name_t[math.random(#name_t)];
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white结识了\\yellow"..xb_name.."\\white，相谈甚欢...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,5+math.random(5) do
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white和\\yellow"..xb_name.."\\orange肮脏的PY交易\\white中............\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white潜能增加............\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.Base["潜能"]=limitX(JY.Base["潜能"]+250,0,999999);
 end
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white与\\yellow"..xb_name.."\\white友好度上升...\\n";
 JY.WAIT=1;
 coroutine.yield();
end
function Girl()
 local str_l={"撸管","揉道","打飞机","献菊花","进行一场肮脏的PY交易",
 "看A片","下A片","给四大山冲V6会员","当老司机","信春哥","看暴走大事件","看大头儿子小头爸爸","斗破苍穹","武动乾坤"}
 local r=0;
 r=math.random(#str_l);
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white决定去"..str_l[r].."...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,5+math.random(5) do
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\orange"..str_l[r].."中............\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.Base["潜能"]=limitX(JY.Base["潜能"]+25,0,999999);
 end
 if r>5 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white吃了药,感觉自己萌萌哒...\\n";
 else
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white膝盖中了一箭...\\n";
 end
 JY.WAIT=1;
 coroutine.yield();
end
function Sleep()
 Record("睡觉次数");
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white决定去睡觉...\\n";
 local r=math.random(100);
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="zZzZzZ\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="zZzZzZzZzZzZ\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="zZzZzZzZzZzZzZzZzZ\\n";
 JY.WAIT=1;
 coroutine.yield();
 if between(r,90,100) then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white梦到仙人指点了一套武功";
 JY.WAIT=1;
 coroutine.yield();
 local kf_t={};
 for i=1,JY.KungfuNum-1 do
 if JY.Kungfu[i]["做梦"]>0 then
 table.insert(kf_t,i);
 end
 end
 local kfid=TableRandom(kf_t);
 if kfid<=0 then
 kfid=110;
 end
 JY.TEXT_BUFF="，似乎叫做\\orange"..JY.Kungfu[kfid]["名称"].."\\white。\\n";
 JY.WAIT=1;
 coroutine.yield();
 InsertLog(5,0,kfid);
 JY.TEXT_BUFF="zZzZzZ\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="zZzZzZzZzZzZ\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="zZzZzZzZzZzZzZzZzZ\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white睡醒了";
 JY.WAIT=1;
 coroutine.yield();
 if JY.Person[JY.pid]["名称"]=="霹焱仙人" then
	if JY.Base["武功等级"..kfid]==0 and CheckKungfu(kfid) then
		JY.TEXT_BUFF="，发现自己真的学会了\\orange"..JY.Kungfu[kfid]["名称"].."\\white！\\n";
		JY.Base["武功等级"..kfid]=1;
		InsertLog(3,JY.Base["武功等级"..kfid],kfid);
		if JY.Base["武功等级上限"..kfid]<limitX(JY.Base["武功等级上限"..kfid]+10,10,limitX(JY.Base["重生次数"]*10+10,10,100)) then
		JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]+10,10,limitX(JY.Base["重生次数"]*10+10,10,100));
		InsertLog(7,JY.Base["武功等级上限"..kfid],kfid);
		end
		PlayWavE(11);
	elseif CheckKungfu(kfid) then
		JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]+10,10,limitX(JY.Base["重生次数"]*10+10,10,limitX(JY.Base["重生次数"]*10+10,10,100)));
		JY.TEXT_BUFF="，经仙人指点，发现自己的\\orange"..JY.Kungfu[kfid]["名称"].."\\white能力有新的提升空间了。\\n";
		InsertLog(7,JY.Base["武功等级上限"..kfid],kfid);
	end
 else
 if JY.Base["武功等级"..kfid]>0 and JY.Base["武功等级上限"..kfid]<limitX(JY.Base["武功等级上限"..kfid]+10,10,limitX(JY.Base["重生次数"]*10+10,10,100)) and CheckKungfu(kfid) then
 JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]+10,10,limitX(JY.Base["重生次数"]*10+10,10,limitX(JY.Base["重生次数"]*10+10,10,100)));
 JY.TEXT_BUFF="，经仙人指点，发现自己的\\orange"..JY.Kungfu[kfid]["名称"].."\\white能力有新的提升空间了。\\n";
 InsertLog(7,JY.Base["武功等级上限"..kfid],kfid);
 elseif JY.Kungfu[kfid].Lv>6 or math.random(60)>10+JY.Person[JY.pid]["福缘"] then
 JY.TEXT_BUFF="，发现原来真的只是做了一场梦。\\n";
 InsertLog(5,2,kfid);
 elseif JY.Base["武功等级"..kfid]==0 and CheckKungfu(kfid) and math.random(50)<17+JY.Person[JY.pid]["悟性"]-JY.Kungfu[kfid].Lv*2 then
 JY.TEXT_BUFF="，发现自己真的学会了\\orange"..JY.Kungfu[kfid]["名称"].."\\white！\\n";
 JY.Base["武功等级"..kfid]=1;
 InsertLog(3,JY.Base["武功等级"..kfid],kfid);
 if JY.Base["武功等级上限"..kfid]<limitX(JY.Base["武功等级上限"..kfid]+10,10,limitX(JY.Base["重生次数"]*10+10,10,100)) then
 JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]+10,10,limitX(JY.Base["重生次数"]*10+10,10,100));
 InsertLog(7,JY.Base["武功等级上限"..kfid],kfid);
 end
 PlayWavE(11);
 else
 JY.TEXT_BUFF="，发现梦中学会的武功全都忘记了。\\n";
 InsertLog(5,3,kfid);
 end
 end
 JY.WAIT=1;
 coroutine.yield();
 else
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white睡醒了";
 JY.WAIT=1;
 coroutine.yield();
 if r<71 then
 JY.TEXT_BUFF="，做了个春梦。\\n";
 JY.WAIT=1;
 coroutine.yield();
 else
if JY.Base["开启专家"]==1 then
 JY.WAIT=1;
 JY.Person[JY.pid]["内力最大值"]=limitX(JY.Person[JY.pid]["内力最大值"]+limitX(JY.Base["重生次数"],1,100)*2,0,30000);
 JY.TEXT_BUFF=string.format("，睡得好香啊。\\n\\yellow"..JY.Person[JY.pid]["名称"].."\\white内力上限上升到%d \\green(%+d)\\white！\\n",JY.Person[JY.pid]["内力最大值"],limitX(JY.Base["重生次数"],1,100)*2);
 InsertLog(2,2,JY.Person[0]["内力最大值"]);
 PlayWavE(11)
 JY.WAIT=1;
 coroutine.yield();
else
 JY.WAIT=1;
 JY.Person[JY.pid]["内力最大值"]=limitX(JY.Person[JY.pid]["内力最大值"]+limitX(JY.Base["重生次数"],1,100),0,30000);
 JY.TEXT_BUFF=string.format("，睡得好香啊。\\n\\yellow"..JY.Person[JY.pid]["名称"].."\\white内力上限上升到%d \\green(%+d)\\white！\\n",JY.Person[JY.pid]["内力最大值"],limitX(JY.Base["重生次数"],1,100));
 InsertLog(2,2,JY.Person[0]["内力最大值"]);
 PlayWavE(11)
 JY.WAIT=1;
 coroutine.yield();
end
 end
 end
 JY.Person[JY.pid]["生命"]=JY.Person[JY.pid]["生命最大值"];
 JY.Person[JY.pid]["内力"]=JY.Person[JY.pid]["内力最大值"];
end
function Eating()
 Record("进食次数");
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white觉得饿了...\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white正在思考吃什么...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,3+math.random(3) do
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white思考中............\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 local str_l={"红烧肉","汤包","烧饼","麻花","包子","五香驴肉","刀削面","羊肉泡馍","锅盔","拉面","烤羊肉","抓饭","煎包","烧麦","酥油饼","棕子","八宝饭","豆皮","热干面","臭豆腐","月饼","龙抄手","担担面","汤圆","夫妻肺片","糍粑","卤牛肉","过桥米线","切糕","冷面","饺子","麻辣烫","打卤面","炸酱面","冰糖葫芦","花生酥","闷黄鱼","鸡蛋灌饼","烤肉","烤全羊","凤爪","牛肉干","柿饼","凉皮","鱼香肉丝","水煮鱼","小葱拌豆腐","皮蛋","烤鸭","烤红薯"};
 local r=math.random(#str_l);
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white决定去吃\\orange"..str_l[r].."\\white...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,3+math.random(3) do
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white进食中............\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 r=math.random(10);
 if r<3 then
if JY.Base["开启专家"]==1 then
 JY.WAIT=1;
 JY.Person[JY.pid]["生命最大值"]=limitX(JY.Person[JY.pid]["生命最大值"]+limitX(JY.Base["重生次数"],1,100)*2,0,30000);
 JY.TEXT_BUFF=string.format("\\yellow"..JY.Person[JY.pid]["名称"].."\\white吃饱了！\\n\\yellow"..JY.Person[JY.pid]["名称"].."\\white生命上限上升到%d \\green(%+d)\\white！\\n",JY.Person[JY.pid]["生命最大值"],limitX(JY.Base["重生次数"],1,100)*2);
 InsertLog(2,1,JY.Person[0]["生命最大值"]);
 PlayWavE(11)
 JY.WAIT=1;
 coroutine.yield();
else
 JY.WAIT=1;
 JY.Person[JY.pid]["生命最大值"]=limitX(JY.Person[JY.pid]["生命最大值"]+limitX(JY.Base["重生次数"],1,100),0,30000);
 JY.TEXT_BUFF=string.format("\\yellow"..JY.Person[JY.pid]["名称"].."\\white吃饱了！\\n\\yellow"..JY.Person[JY.pid]["名称"].."\\white生命上限上升到%d \\green(%+d)\\white！\\n",JY.Person[JY.pid]["生命最大值"],limitX(JY.Base["重生次数"],1,100));
 InsertLog(2,1,JY.Person[0]["生命最大值"]);
 PlayWavE(11)
 JY.WAIT=1;
 coroutine.yield();
end
 else
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white感觉还能再吃一点！\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 JY.Person[JY.pid]["生命"]=JY.Person[JY.pid]["生命最大值"];
 JY.Person[JY.pid]["内力"]=JY.Person[JY.pid]["内力最大值"];
end
function Thinking()
 Record("思考次数");
 local str_l={"九旬老太为何裸死街头？","数百头母驴为何半夜惨叫？","数百只小母狗意外身亡的背后又隐藏着哪些不为人知的秘密？","女生宿舍内衣为何频频失窃？"};
 local str_s={"这一切的背后，是人性的扭曲还是道德的沦丧？","小卖部保险套为何屡遭黑手？","老尼姑的门夜夜被敲，究竟是人是鬼？","连环强歼母猪案，究竟是何人所为？"};
 local r=math.random(#str_l);
 for i=1,3+math.random(3) do
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\orange正在思考"..str_l[r].."...\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 for i=1,3+math.random(3) do
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\orange思考"..str_s[r].."............\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 r=math.random(10);
 if r<4 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white似乎想明白了什么，历练上升！\\n";
 JY.WAIT=1;
 coroutine.yield();
 if JY.Person[JY.pid]["等级"]<100 then
 JY.Base["实战"]=JY.Base["实战"]+10+limitX(JY.Base["重生次数"],0,100);
 CheckLvUp(JY.pid);
 end
 elseif r==4 then
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white突然感到十分空虚...\\n";
 JY.WAIT=1;
 coroutine.yield();
 for i=1,6+math.random(3) do
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white空虚中............\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white终于恢复正常了...\\n";
 JY.WAIT=1;
 coroutine.yield();
 else
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white想着想着睡着了...\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
end
function Retreat()
 Record("闭关次数");
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white决定去闭关...\\n";
 JY.WAIT=1;
 coroutine.yield();
 StartEFT(41);
 for i=1,5+math.random(5) do
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white闭关中............\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.Base["潜能"]=limitX(JY.Base["潜能"]-25,0,999999);
 end
 local r=math.random(100);
 if r<1 then --睡觉
 StopEFT();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white觉得困了...\\n";
 JY.WAIT=1;
 coroutine.yield();
 Sleep();
 elseif r<2 then --进食
 StopEFT();
 Eating();
 elseif r<3 then --思考
 StopEFT();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white走神了...\\n";
 JY.WAIT=1;
 coroutine.yield();
 Thinking();
 else
 local kf_t={};
 local lw_kfid;
 for i=1,JY.LingwuNum-1 do
 lw_kfid=JY.Lingwu[i]["武功"];
 if lw_kfid>0 and JY.Base["武功等级"..lw_kfid]==0 and CheckKungfu(lw_kfid) and KFBGCK(i) or lw_kfid>0 and CheckKungfu(lw_kfid) and KFBGCK(i) and JY.Base["武功等级"..lw_kfid]==JY.Base["武功等级上限"..lw_kfid] and JY.Base["武功等级上限"..lw_kfid]<limitX(JY.Base["重生次数"]*10+10,10,100) then
 table.insert(kf_t,i);
 end
 end
 local lw=TableRandom(kf_t);
 lw_kfid=JY.Lingwu[lw]["武功"];
 local qz=JY.Lingwu[lw]["前置1"];
 if lw>0 and JY.Base["武功等级"..qz]>=5 then
 InsertLog(6,0,0);
 local flag=true;
 for idx=1,7 do
 StopEFT();
 qz=JY.Lingwu[lw]["前置"..idx];
 if qz>0 then
 if JY.Base["武功等级"..qz]>0 then
 local str="\\orange"..JY.Kungfu[qz]["名称"].."\\white";
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white从"..str.."中得到灵感...\\n";
 JY.WAIT=1;
 coroutine.yield();
 StartEFT(qz);
 for i=1,5+math.random(5) do
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white研习"..str.."中............\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.Base["潜能"]=limitX(JY.Base["潜能"]-10,0,999999);
 end
 if JY.Base["武功等级"..qz]<limitX(JY.Base["武功等级"..lw_kfid],JY.Lingwu[lw]["等级"..idx],limitX(JY.Base["重生次数"]*10+10,10,100)) then
 StopEFT();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white觉得"..str.."似乎还有可以提升的空间...\\n";
 flag=false;
 JY.WAIT=1;
 coroutine.yield();
 InsertLog(6,1,qz);
 break;
 end
 else
 StopEFT();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white觉得似乎还欠缺点什么...\\n";
 flag=false;
 JY.WAIT=1;
 coroutine.yield();
 break;
 end
 end
 end
 StopEFT();
 if flag then
	if JY.Base["武功等级"..lw_kfid]==0 then
	PlayWavE(11);
	JY.TEXT_BUFF=string.format("\\yellow%s\\white在闭关中领悟出\\orange%s\\n",JY.Person[JY.pid]["名称"],JY.Kungfu[lw_kfid]["名称"]);
	JY.Base["武功等级"..lw_kfid]=1;
	InsertLog(3,JY.Base["武功等级"..lw_kfid],lw_kfid);
	JY.Base["武功等级上限"..lw_kfid]=limitX(JY.Base["武功等级上限"..lw_kfid]+5,5,limitX(JY.Base["重生次数"]*10+10,10,100));
	InsertLog(7,JY.Base["武功等级上限"..lw_kfid],lw_kfid);
	elseif JY.Base["武功等级"..lw_kfid]>0 and JY.Base["武功等级上限"..lw_kfid]<limitX(JY.Base["重生次数"]*10+10,10,100) then
	PlayWavE(11);
	JY.TEXT_BUFF=string.format("\\yellow%s\\white在闭关中领悟出\\orange%s\\white的真髓!\\n",JY.Person[JY.pid]["名称"],JY.Kungfu[lw_kfid]["名称"]);
	JY.Base["武功等级上限"..lw_kfid]=limitX(JY.Base["武功等级上限"..lw_kfid]+5,5,limitX(JY.Base["重生次数"]*10+10,10,100));
	InsertLog(7,JY.Base["武功等级上限"..lw_kfid],lw_kfid);
	end
	JY.WAIT=1;
	coroutine.yield();
	return;
 end
 else
 for i=1,5+math.random(5) do
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white闭关中............\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.Base["潜能"]=limitX(JY.Base["潜能"]-25,0,999999);
 end
 end
 StopEFT();
 PlayWavE(2);
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white没有什么收获...\\n";
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white闭关结束...\\n";
 JY.WAIT=1;
 coroutine.yield();
 end
end
function CanRetreat()
 if JY.Base["潜能"]<2000 then
 return false;
 end
 for i=1,JY.LingwuNum-1 do
 local lw_kfid=JY.Lingwu[i]["武功"];
 if lw_kfid>0 and CheckKungfu(lw_kfid) and JY.Base["武功等级"..lw_kfid]==0 and KFBGCK(i) or lw_kfid>0 and CheckKungfu(lw_kfid) and KFBGCK(i) and JY.Base["武功等级"..lw_kfid]==JY.Base["武功等级上限"..lw_kfid] and JY.Base["武功等级上限"..lw_kfid]<limitX(JY.Base["重生次数"]*10+10,10,100) then
 return true;
 end
 end
 return false;
end
function EnterMap()
 local sid=JY.Base["下个场景"];
 local status=JY.Base["开启场景"..sid];
 local mid=1;
 if not between(status,1,10) then
 status=1;
 JY.Base["开启场景"..sid]=1;
 end
 mid=JY.Force[sid]["地图"..status];
 JY.Base["当前场景"]=sid;
 JY.Base["下个场景"]=0;
 JY.Base["当前地图"]=mid;
 JY.Base["倒计时"]=JY.Base.BossTimer;
 JY.CENTER_MSG="";
 JY.bt[5].txt=string.format("%02d:%02d",math.modf(JY.Base["倒计时"]/60),JY.Base["倒计时"]%60);
 JY.TEXT_BUFF=string.format("\\yellow%s\\white来到\\yellow%s\\n",JY.Person[JY.pid]["名称"],JY.Force[sid]["名称"]);
 SetMainMenu();
 JY.WAIT=1;
 coroutine.yield();
end
function MapFight()
 local e_level=0;
 local min=60*JY.Base["时"]+JY.Base["分"];
 if JY.Map[JY.Base["当前地图"]]["小Boss1"]>0 and math.random(100)<25 then
 local t_eid={};
 for i=1,10 do
 local v=JY.Map[JY.Base["当前地图"]]["小Boss"..i];
 if v>0 then
 table.insert(t_eid,v);
 end
 end
 JY.eid=TableRandom(t_eid);
 e_level=1;
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white发现对手\\yellow"..JY.Person[JY.eid]["名称"].."\\n";
 else
 local t_eid={};
 for i=1,20 do
 local v=JY.Map[JY.Base["当前地图"]]["杂兵"..i];
 if v>0 then
 table.insert(t_eid,v);
 end
 end
 JY.eid=TableRandom(t_eid);
 JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white发现对手"..JY.Person[JY.eid]["名称"].."\\n";
 end
 JY.WAIT=1;
 coroutine.yield();
 CallFight(e_level);
end
function MapEvent()
 local sid=JY.Base["当前场景"];
 local m=JY.Map[JY.Base["当前地图"]]
 local pass=true;
 for i=1,10 do
 JY.CENTER_MSG="";
 local eid=m["通关Boss"..i];
	if eid>0 then
		JY.eid=eid;
		if m["战斗前剧情"..i]>0 then
			JY.TEXT_BUFF=JY.Str[m["战斗前剧情"..i]];
		else
			JY.TEXT_BUFF=JY.Str[1];
		end
		
		JY.WAIT=2;
		JY.TEXT_BUFF=GenEventStr(JY.TEXT_BUFF);
		JY.WAIT=1;
		coroutine.yield();
		
		if CallFight(2) then
			if m["战斗后剧情"..i]>0 then
				JY.TEXT_BUFF=JY.Str[m["战斗后剧情"..i]];
				JY.WAIT=2;
				
				JY.TEXT_BUFF=GenEventStr(JY.TEXT_BUFF);
				JY.WAIT=1;
				coroutine.yield();
						end
		else
			pass=false;
			break;
		end
	end
 end
 if pass then
  JY.Base["开启场景"..sid]=JY.Base["开启场景"..sid]+1;
  if JY.Base["开启场景"..sid]>10 then
	JY.Base["开启场景"..sid]=10;
  end
 JY.Base["当前地图"]=JY.Force[sid]["地图"..JY.Base["开启场景"..sid]];
 SetMapEntry();
 end
 JY.Base["当前事件"]=0;
 JY.Base["倒计时"]=JY.Base.BossTimer;
 JY.bt[5].txt=string.format("%02d:%02d",math.modf(JY.Base["倒计时"]/60),JY.Base["倒计时"]%60);
 SetMainMenu();
end
function GenEventStr(str)
	str=string.gsub(str,"$N",JY.Person[JY.pid]["名称"]);
	str=string.gsub(str,"$C",JY.Person[JY.pid]["外号"]);
	str=string.gsub(str,"$n",JY.Person[JY.eid]["名称"]);
	str=string.gsub(str,"$c",JY.Person[JY.eid]["外号"]);
	return str;
end
function MapTalk(name,s)
 if name=="主角" then
 name=JY.Person[JY.pid]["名称"];
 end
 if #name==0 then
 JY.TEXT_BUFF=s.."\\n";
 else
 JY.TEXT_BUFF="\\yellow"..name.."\\white: "..s.."\\n";
 end
 JY.WAIT=1;
 coroutine.yield();
end
function CallFight(e_level)
	JY.Status=GAME_FIGHT;
	coroutine.yield();
	local qn=1;
	local ll=1;
	local win=false;
	Record("战斗次数");
	if JY.Person[JY.pid]["生命"]>0 then --胜利了
		win=true;
		Record("胜利次数");
		if math.random(100)<100+20*e_level then
			local t_kf={};
			if JY.Person[JY.eid]["掉落武器"]>0 then
				table.insert(t_kf,1);	--掉落武器
			end
			for i=1,5 do
				if JY.Person[JY.eid]["掉宝"..i]>1 then
					if JY.Base["武功等级上限"..(JY.Person[JY.eid]["掉宝"..i])]<limitX(JY.Base["重生次数"]*10+10,10,100) and CheckKungfu(JY.Person[JY.eid]["掉宝"..i]) then
					table.insert(t_kf,JY.Person[JY.eid]["掉宝"..i]);
					elseif JY.Base["武功等级"..(JY.Person[JY.eid]["掉宝"..i])]==0 and CheckKungfu(JY.Person[JY.eid]["掉宝"..i]) then
					table.insert(t_kf,JY.Person[JY.eid]["掉宝"..i]);
					end
				end
			end
			local cc=false;
			local dd=false;
			local qid=math.ceil(JY.Person[JY.eid]["掉落武器"])-100;
			local kfid=TableRandom(t_kf);
				if JY.Person[JY.eid]["掉落武器"]>0 then
					if JY.Base["开启武器"..(qid)]==0 then
					cc=true;
					else cc=false;
					end
				end
				for i=1,5 do
					if JY.Person[JY.eid]["掉宝"..i]>1 then
						if JY.Base["武功等级上限"..(JY.Person[JY.eid]["掉宝"..i])]<limitX(JY.Base["重生次数"]*10+10,10,100) and CheckKungfu(JY.Person[JY.eid]["掉宝"..i]) and (JY.Kungfu[kfid]["暴率"]+JY.Base["重生次数"]*10+JY.Person[JY.pid]["福缘"]*10)>0 then
							dd=true;
						elseif JY.Base["武功等级"..(JY.Person[JY.eid]["掉宝"..i])]==0 and CheckKungfu(JY.Person[JY.eid]["掉宝"..i]) and (JY.Kungfu[kfid]["暴率"]+JY.Base["重生次数"]*10+JY.Person[JY.pid]["福缘"]*10)>0 then
							dd=true;
						end
					end
				end
				if e_level>1 then
				InsertLog(4,2,JY.eid);
				end
                if cc or dd then
				InsertLog(4,0,JY.eid);
				end
			if kfid==1 then
				local tid=JY.Person[JY.eid]["掉落武器"]
				if math.random(10000000)/10000<JY.Item[tid]["暴率"]/50+JY.Base["重生次数"]*10+JY.Person[JY.pid]["福缘"]*10  then
					GetWeapon(tid);
				end
			elseif kfid>0 and JY.Base["武功等级上限"..kfid]<=limitX(JY.Base["重生次数"]*10+10,10,100) and CheckKungfu(kfid) then
				if  math.random(10000000)/10000<JY.Kungfu[kfid]["暴率"]+JY.Base["重生次数"]*10+JY.Person[JY.pid]["福缘"]*10 then
					if JY.Base["武功等级"..kfid]==0 then
					PlayWavE(11);
					JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white在战斗中领悟了\\orange"..JY.Kungfu[kfid]["名称"].."\\n";
					JY.Base["武功等级"..kfid]=1;
					InsertLog(3,JY.Base["武功等级"..kfid],kfid);
					JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]+5,5,limitX(JY.Base["重生次数"]*10+10,10,100));
					InsertLog(7,JY.Base["武功等级上限"..kfid],kfid);
					elseif JY.Base["武功等级"..kfid]>0 and JY.Base["武功等级上限"..kfid]<limitX(JY.Base["重生次数"]*10+10,10,100) then
					PlayWavE(11);
					JY.TEXT_BUFF="\\yellow"..JY.Person[JY.pid]["名称"].."\\white在战斗中提高了\\orange"..JY.Kungfu[kfid]["名称"].."\\n";
					if JY.Person[JY.pid]["名称"]=="苍老师" then
					JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]+2,2,limitX(JY.Base["重生次数"]*10+10,10,100));
					else
					JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]+1,1,limitX(JY.Base["重生次数"]*10+10,10,100));
					end
					InsertLog(7,JY.Base["武功等级上限"..kfid],kfid);
					end
					JY.WAIT=1;
					coroutine.yield();
				end
			end
		end
		qn=JY.Person[JY.eid]["生命最大值"]+math.random(10)-math.random(10);
	else
		if JY.Base["开启专家"]>0 then
		JY.Base["指令"]=2;
		end
		if e_level>1 then
			InsertLog(4,3,JY.eid);
		end
		qn=1+math.modf((JY.Person[JY.eid]["生命最大值"]-JY.Person[JY.eid]["生命"])/2);
	end
	if JY.Person[JY.pid]["等级"]/3>JY.Person[JY.eid]["等级"] then
		qn=1+math.floor(qn*10/(10+JY.Person[JY.pid]["等级"]/3-JY.Person[JY.eid]["等级"]));
	end
	if qn>600 then
		qn=300+math.floor(qn/4)+30*limitX(JY.Base["重生次数"],0,100);
	elseif qn>300 then
		qn=200+math.floor(qn/3)+20*limitX(JY.Base["重生次数"],0,100);
	elseif qn>100 then
		qn=100+math.floor(qn/2)+10*limitX(JY.Base["重生次数"],0,100);
	end
	if e_level>1 and win then
		JY.Person[JY.pid]["生命"]=limitX(math.modf((JY.Person[JY.pid]["生命"]*1+JY.Person[JY.pid]["生命最大值"])/2),1,JY.Person[JY.pid]["生命最大值"]);
		JY.Person[JY.pid]["内力"]=limitX(math.modf((JY.Person[JY.pid]["内力"]*1+JY.Person[JY.pid]["内力最大值"])/2),1,JY.Person[JY.pid]["内力最大值"]);
	else
		JY.Person[JY.pid]["生命"]=JY.Person[JY.pid]["生命最大值"];
		JY.Person[JY.pid]["内力"]=JY.Person[JY.pid]["内力最大值"];
	end
	if JY.Person[JY.pid]["名称"]=="苍老师" then
	qn=qn*2;
	elseif JY.Person[JY.pid]["名称"]=="四大山" then
	qn=qn*0.5;
	end
	JY.pid=0;
	JY.Base["潜能"]=limitX(JY.Base["潜能"]+qn,0,999999);
	JY.TEXT_BUFF=string.format("\\yellow%s\\white得到潜能%d点。\\n",JY.Person[JY.pid]["名称"],qn);
	JY.WAIT=1;
	coroutine.yield();
	Record("潜能合计",qn);
	if e_level>1 then
		ll=9+9*limitX(JY.Base["重生次数"],0,100);
	elseif e_level>0 then
		ll=3+3*limitX(JY.Base["重生次数"],0,100);
	else
		ll=1+limitX(JY.Base["重生次数"],0,100);
	end
	if JY.Person[JY.pid]["等级"]/3>JY.Person[JY.eid]["等级"]+4 then
		ll=1+limitX(JY.Base["重生次数"],0,100);
	elseif JY.Person[JY.pid]["等级"]/3<JY.Person[JY.eid]["等级"] then
		if win then
			ll=ll+3+3*limitX(JY.Base["重生次数"],0,100);
		end
	else
		if win then
			ll=ll+1+limitX(JY.Base["重生次数"],0,100);
		end
	end
	if math.random(400)<JY.Person[JY.pid]["福缘"]+1 then 
		ll=ll+200+20*limitX(JY.Base["重生次数"],0,100);
	end
	if math.random(40)<JY.Person[JY.pid]["悟性"]+1 then 
		ll=ll+2+2*limitX(JY.Base["重生次数"],0,100);
	end
	if JY.Person[JY.pid]["名称"]=="苍老师" then
	ll=ll*2;
	elseif JY.Person[JY.pid]["名称"]=="四大山" then
	ll=ll*0.5;
	end
	JY.TEXT_BUFF=string.format("\\yellow%s\\white得到历练%d点。\\n",JY.Person[JY.pid]["名称"],ll);
	JY.WAIT=1;
	coroutine.yield();
	if JY.Person[JY.pid]["等级"]<100 then
		JY.Base["实战"]=JY.Base["实战"]+ll;
		CheckLvUp(JY.pid);
	end
	return win;
end
function CheckXX(kfid)
 local k=JY.Kungfu[kfid];
 local kfxx=0;
 for i=1,#k["名称"] do
	kfxx=kfxx+string.byte(k["名称"],i);
 end
 kfxx=kfxx%128
 local xx=math.abs(JY.Base["相性"]-kfxx*2)%256;
 xx=math.min(xx,256-xx);
 xx=limitX(xx*k.Lv/7,0,128);
 if math.random()>0.97^xx then
 return false;
 else
 return true;
 end
end
function CheckKungfu(kfid,flag)
 --flag bixie/kuihua
 local p=JY.Person[JY.pid];
 local k=JY.Kungfu[kfid];
 
 if p["性别"]==0 then
 if k["性别"]==1 or k["性别"]==3 or k["性别"]==5 or k["性别"]==7 then
 return true;
 end

 --bixie/kuihua
 if flag then
 if k["性别"]==4 then
 return true;
 end
 end

 elseif p["性别"]==1 and p["名称"]~="观岛香月" then
 if k["性别"]==2 or k["性别"]==3 or k["性别"]==6 or k["性别"]==7 then
 return true;
 end

 elseif p["性别"]==2 then
 if k["性别"]==4 or k["性别"]==5 or k["性别"]==6 or k["性别"]==7 then
 return true;
 end

 elseif p["名称"]=="观岛香月" then
 if k["性别"]==1 or k["性别"]==2 or k["性别"]==3 or k["性别"]==4 or k["性别"]==5 or k["性别"]==6 or k["性别"]==7 then
 return true;
 end

 end
 return false;
end
function SetMapEntry()
	for i=1,48 do
		if JY.Base["开启场景"..i]==0 then
			local flag=true;
			for j=1,10 do
				if JY.Force[i]["前置地图"..j]>0 then
					local sid=JY.Force[i]["前置地图"..j];
					local sta=1+JY.Force[i]["前置地图进度"..j];
					if JY.Base["开启场景"..sid]<sta then
						flag=false;
						break;
					end
				end
			end
			if flag then
				PlayWavE(11);
				JY.Base["开启场景"..i]=1;
				JY.TEXT_BUFF=string.format("\\yellow%s\\white开放！\\n",JY.Force[i]["名称"]);
				JY.WAIT=1;
				coroutine.yield();
			end
		end
	end
end
function Fight()
 while true do
 Fight_sub();
 JY.Status=GAME_AUTO;
 coroutine.yield();
 end
end
function Fight_sub()
 JY.info={};
 JY.info[JY.pid]={
 is_def=false;
 s_pic=0;
 };
 JY.info[JY.eid]={
 is_def=false;
 s_pic=0;
 };
 JY.Person[JY.eid]["生命"]=JY.Person[JY.eid]["生命最大值"];
 JY.Person[JY.eid]["内力"]=JY.Person[JY.eid]["内力最大值"];
 JY.Person[JY.pid]["招架"]=0;
 JY.Person[JY.pid]["招架等级"]=0;
 for i=1,5 do
 if JY.Person[JY.pid]["武功"..i]>0 then
 JY.Person[JY.pid]["招架"]=JY.Person[JY.pid]["武功"..i];
 JY.Person[JY.pid]["招架等级"]=JY.Person[JY.pid]["武功等级"..i];
 break;
 end
 end
 JY.Person[JY.eid]["招架"]=0;
 JY.Person[JY.eid]["招架等级"]=0;
 for i=1,5 do
 if JY.Person[JY.eid]["武功"..i]>0 then
 JY.Person[JY.eid]["招架"]=JY.Person[JY.eid]["武功"..i];
 JY.Person[JY.eid]["招架等级"]=JY.Person[JY.eid]["武功等级"..i];
 break;
 end
 end
 local id1,id2=JY.pid,JY.eid;
 if math.random()<(JY.Person[id2]["机敏"]+JY.Person[id2]["福缘"])/(JY.Person[id1]["机敏"]+JY.Person[id1]["福缘"]+JY.Person[id2]["机敏"]+JY.Person[id2]["福缘"]) then
 id1,id2=id2,id1;
 end
 JY.WAIT=2;
 coroutine.yield();
 DoAction(id1,id2,"TYPE_REGULAR");
 JY.info[JY.pid]={
 is_def=false;
 s_pic=0;
 };
 JY.info[JY.eid]={
 is_def=false;
 s_pic=0;
 };
 JY.WAIT=2;
 coroutine.yield();
end
function DoAction(pid,eid,action_type)
 local guard_msg={
 [1]="$N注视著$n的行动，企图寻找机会出手。\\n",
 [2]="$N正盯著$n的一举一动，随时准备发动攻势。\\n",
 [3]="$N缓缓地移动脚步，想要找出$n的破绽。\\n",
 [4]="$N目不转睛地盯著$n的动作，寻找进攻的最佳时机。\\n",
 [5]="$N慢慢地移动著脚步，伺机出手。\\n",
 };
 local riposte_msg={
 [1]="$N一击不中，露出了破绽！\\n",
 [2]="$n见$N攻击失误，趁机发动攻击！\\n"
 };
 local beast_msg = {
 [1]="$N怒吼一声，扑了过来攻击$n！\\n",
 [2]="$N对着$n大吼，想杀死$n！\\n",
 [3]="$N发出连串低吼，突然暴起攻击$n！\\n",
 [4]="$N对着$n一声怒鸣，飞冲了过来！\\n" ,
 [5]="$N怒鸣几声，突然暴起攻击$n！\\n" ,
 [6]="$N一声锐鸣，猛然向$n发起攻击！\\n" ,
 };
 local limb_damage={
 --人类身体部位
 [1]={"头部",50},
 [2]={"颈部",50},
 [3]={"胸口",50},
 [4]={"后心",50},
 [5]={"左肩",75},
 [6]={"右肩",50},
 [7]={"左臂",50},
 [8]={"右臂",50},
 [9]={"左手",50},
 [10]={"右手",100},
 [11]={"腰间",50},
 [12]={"小腹",50},
 [13]={"左腿",50},
 [14]={"右腿",50},
 [15]={"左脚",50},
 [16]={"右脚",50},
 --动物身体部位
 [17]={"身体",50},
 [18]={"前脚",50},
 [19]={"后脚",50},
 [20]={"腿部",50},
 [21]={"尾巴",50},
 [22]={"翅膀",50},
 [23]={"爪子",50},
 };
 local limb_t={};
 for i=1,16 do
 if limb_damage[i][2]+30>JY.Person[pid]["福缘"]*5 then
 table.insert(limb_t,10);
 elseif limb_damage[i][2]+30>JY.Person[pid]["福缘"]*4 then
 table.insert(limb_t,5);
 else
 table.insert(limb_t,2);
 end
 end
 local beast=0;
 local limb_index=PercentRandom(limb_t);
 local limb=limb_damage[limb_index][1];
 local N_str,n_str,w_str,i_str,l_str;
 N_str="\\yellow"..JY.Person[pid]["名称"].."\\white";
 n_str="\\yellow"..JY.Person[eid]["名称"].."\\white";
 w_str="无形掌力";
 i_str="无形掌力";
 local weapon;
 weapon=JY.Person[pid]["武器"];
 if weapon>0 then
 w_str=JY.Item[weapon]["名称"];
 end
 weapon=JY.Person[eid]["武器"];
 if weapon>0 then
 i_str=JY.Item[weapon]["名称"];
 end
 l_str=limb;
 if JY.Person[pid]["生命"]<=0 then
 return;
 end
 JY.info[pid].is_def=false;
 if action_type=="TYPE_REGULAR" then
 if math.random(10)<3 then 
 JY.info[pid].is_def=true;
 JY.info[pid].s_pic=31014;
 PlayWavE(6);
 JY.TEXT_BUFF=GenFightStr(guard_msg[math.random(5)],N_str,n_str,w_str,i_str,l_str);
 JY.WAIT=1;
 coroutine.yield();
 if pid==0 then
 Record("防御次数");
 end
 
 JY.info[pid].s_pic=0;
 DoAction(eid,pid,"TYPE_REGULAR");
 return;
 elseif math.random(100)<5+JY.Person[JY.pid]["机敏"] and JY.Person[JY.pid]["名称"]~="苍老师" then
 beast=1;
 end
 end
 local atk_kf_id,atk_skill_id,msg,ap,dp,pp,damage,damage_type,nl_cost;
 local damage2,ap2,pp2,dp2;
 atk_kf_id,atk_skill_id,damage_type,msg,ap,damage,nl_cost=Query_Action(pid);
 damage2,ap2,pp2,dp2=GetBasePT(pid,false);
 damage=damage*0.7+damage2*0.3;
 ap=ap*0.7+ap2*0.3;
	weapon=JY.Person[pid]["武器"];
	local use_weapon=false;
	if weapon>0 then
		if JY.Item[weapon]["类型"]==JY.Kungfu[atk_kf_id]["类型描述"] or JY.Item[weapon]["类型"]=="神器" then
			w_str=JY.Item[weapon]["名称"];
			use_weapon=true;
		end
	end
	if use_weapon then
		w_str="\\green"..w_str.."\\white";
		damage=damage+JY.Item[weapon]["伤害"];
		ap=ap+JY.Item[weapon]["命中"];
	else
		w_str=JY.Kungfu[atk_kf_id]["武器"];
	end
 local kfid,lv;
 for i,v in pairs({"内功","轻功","特技"}) do
 kfid=JY.Person[pid][v];
 lv=JY.Person[pid][v.."等级"];
 if kfid>0 then
 if pid==0 then
 lv=QueryMySkillLv(kfid);
 end
 ap=ap+JY.Kungfu[kfid].AP*(5+lv);
 damage=damage+JY.Kungfu[kfid].Damage*(5+lv);
 end
 end
 dp=0;
 pp=0;
 kfid=JY.Person[eid]["招架"];
 lv=JY.Person[eid]["招架等级"];
 if kfid>0 then
 if eid==0 then
 lv=QueryMySkillLv(kfid,061);
 end
 dp=JY.Kungfu[kfid].DP*(5+lv);
 pp=JY.Kungfu[kfid].PP*(5+lv);
 end
 damage2,ap2,pp2,dp2=GetBasePT(eid,false);
 pp=pp*0.7+pp2*0.3;
 dp=dp*0.7+dp2*0.3;
	weapon=JY.Person[eid]["武器"];
	i_str=JY.Kungfu[kfid]["武器"];
	if weapon>0 then
		pp=pp+JY.Item[weapon]["格挡"];
		dp=dp+JY.Item[weapon]["闪避"];
		if JY.Item[weapon]["类型"]==JY.Kungfu[kfid]["类型描述"] then
			i_str="\\green"..JY.Item[weapon]["名称"].."\\white";
		end
	end
 
 for i,v in pairs({"内功","轻功","特技"}) do
 kfid=JY.Person[eid][v];
 lv=JY.Person[eid][v.."等级"];
 if kfid>0 then
 if eid==0 then
 lv=QueryMySkillLv(kfid);
 end
 dp=dp+JY.Kungfu[kfid].DP*(5+lv);
 pp=pp+JY.Kungfu[kfid].PP*(5+lv);
 end
 end
 --ap/dp/pp/damage修正
 ap=ap/10;
 dp=dp/10;
 pp=pp/10;
 damage=damage/10;
 if atk_skill_id>0 then
 ap=ap*JY.Skill[atk_skill_id].AP/1000;
 dp=dp*JY.Skill[atk_skill_id].VsDP/1000;
 pp=pp*JY.Skill[atk_skill_id].VsPP/1000;
 damage=damage*JY.Skill[atk_skill_id].Damage/1000;
 end
 damage=damage*(JY.Person[pid]["膂力"])/10;
 ap=ap*(JY.Person[pid]["福缘"])/10;
 dp=dp*(JY.Person[eid]["机敏"])/10;
 pp=pp*(JY.Person[eid]["机敏"])/10;
 
 damage=damage+JY.Person[pid]["内力"]/10;
 ap=ap+JY.Person[pid]["内力"]/10;
 dp=dp+JY.Person[eid]["内力"]/10;
 pp=pp+JY.Person[eid]["内力"]/10;

 damage=damage+limb_damage[limb_index][2];
 if pid==0 then
 damage=(damage+JY.Base["基本伤害"])*(100+limitX(JY.Base["重生次数"],0,100))*(100+JY. Base ["体力"])/10000;
 ap=(ap+JY.Base["基本命中"])*(100+limitX(JY.Base["重生次数"],0,100))*(100+JY. Base ["体力"])/10000;
 else
 damage=(damage+JY.Person[pid]["等级"]*JY.Person[pid]["膂力"]*2)*1.25;
 ap=(ap+JY.Person[pid]["等级"]*JY.Person[pid]["福缘"]*2)*1.25;
 end
 if eid==0 then
 pp=(pp+JY.Base["基本格挡"])*(100+limitX(JY.Base["重生次数"],0,100))*(100+JY. Base ["体力"])/10000;
 dp=(dp+JY.Base["基本闪避"])*(100+limitX(JY.Base["重生次数"],0,100))*(100+JY. Base ["体力"])/10000;
 else
 pp=(pp+JY.Person[eid]["等级"]*JY.Person[eid]["机敏"]*2)*1.25;
 dp=(dp+JY.Person[eid]["等级"]*JY.Person[eid]["机敏"]*2)*1.25;
 end
 if JY.Person[pid]["名称"]=="四大山" then
	damage=damage*1.5;
	ap=ap*1.5;
 end
 if JY.Person[eid]["名称"]=="四大山" then
	pp=pp*1.5;
	dp=dp*1.5;
 end
 damage=damage+ap*0.25-pp*0.25-dp*0.25;
 damage=(damage)*(0.45-JY.Person[eid]["根骨"]/100);
 damage=(damage)*((JY.Person[pid]["内力"]+JY.Person[pid]["内力最大值"])/(JY.Person[pid]["内力最大值"]*2));
 --内力影响
 
 if action_type=="TYPE_QUICK" then --命中上升，攻击下降
 msg="紧跟着"..msg;
 ap=ap*2;
 damage=damage;
 JY.info[eid].s_pic=31017; 
 elseif JY.info[eid].is_def then --防守
 ap=ap*0.75;
 damage=damage*0.75;
elseif action_type=="TYPE_RIPOSTE" then --反击
 damage=damage*1.5;
 ap=ap*1.5;
 JY.info[eid].s_pic=31016; 
 elseif beast>0 then
 msg=beast_msg[beast]..msg;  
 JY.info[eid].s_pic=31015;   --暴击
 damage=damage*2;
 end
 damage=math.modf(damage)+math.random(10)-math.random(10);
 if damage<1 then
 damage=1;
 end
 if ap<1 then
 ap=1;
 end
 if pid==0 then
 Record("伤害",damage);
 Record("命中",ap);
 elseif eid==0 then
 Record("格挡",pp);
 Record("闪避",dp);
 end
 
 JY.info[pid].s_pic=atk_kf_id+31100;
 PlayWavE(JY.Kungfu[atk_kf_id]["音效"]);
 JY.Person[pid]["内力"]=limitX(JY.Person[pid]["内力"]-nl_cost,0,JY.Person[pid]["内力最大值"]);
 JY.TEXT_BUFF=GenFightStr(msg,N_str,n_str,w_str,i_str,l_str);
 JY.WAIT=1;
 coroutine.yield();
 if pid==0 then
 Record("攻击次数");
 end
 JY.info[pid].s_pic=0;
 local dodge_msg;
 local dodge_or_parry=PercentRandom({dp,pp});
 if dodge_or_parry==1 then --DP
 dodge_msg=Query_Dodge(eid);
 else
 dodge_msg=Query_Parry(eid);
 end
 local damage_msg;
 if math.random()>limitX(ap/(ap+pp+dp),0.05,0.95) then --基础命中率为5%-95%
 if dodge_or_parry==1 then --DP
 PlayWavE(79);
 JY.info[eid].s_pic=31013;
 else
 PlayWavE(30);
 JY.info[eid].s_pic=31012;
 end
 JY.TEXT_BUFF=GenFightStr(dodge_msg.."\\n",N_str,n_str,w_str,i_str,l_str);
 JY.WAIT=2;
 coroutine.yield();
 if eid==0 then
 if dodge_or_parry==1 then --DP
 Record("闪避次数");
 else
 Record("格挡次数");
 end
 end
 JY.info[eid].s_pic=0;
 if action_type=="TYPE_RIPOSTE" then
 
 elseif JY.info[eid].is_def then
 JY.TEXT_BUFF=GenFightStr(riposte_msg[math.random(2)],N_str,n_str,w_str,i_str,l_str); --反击
 JY.WAIT=1;
 coroutine.yield();
 DoAction(eid,pid,"TYPE_RIPOSTE");
 if JY.Person[pid]["生命"]<=0 then
 PlayWavE(38);
 JY.info[eid].s_pic=31020;
 JY.info[pid].s_pic=31021;
 JY.TEXT_BUFF=GenFightStr(Query_Winner_Msg(),n_str,N_str,w_str,i_str,l_str);
 JY.WAIT=2;
 coroutine.yield();
 else
 DoAction(eid,pid,"TYPE_QUICK");
 end
 else
 DoAction(eid,pid,"TYPE_REGULAR");
 end
 else
 damage_msg=Query_Damage_Msg(damage,damage_type);
 if damage>JY.Person[eid]["生命"]/4 then
 PlayWavE(36);
 else
 PlayWavE(35);
 end
if damage>30000 then
damage=30000
end
 JY.info[eid].s_pic=damage;
 JY.TEXT_BUFF=GenFightStr(damage_msg,N_str,n_str,w_str,i_str,l_str);
 JY.WAIT=2;
 coroutine.yield();
 if pid==0 then
 Record("命中次数");
 end
 JY.info[eid].s_pic=0;


 while damage>0 and JY.Person[eid]["生命"]>0 do
 if damage<20 then
 JY.Person[eid]["生命"]=JY.Person[eid]["生命"]-damage;
 if JY.Person[eid]["生命"]<0 then
 JY.Person[eid]["生命"]=0;
 end
 damage=0;
 coroutine.yield();
 else
 JY.Person[eid]["生命"]=JY.Person[eid]["生命"]-20;
 damage=damage-20;
 coroutine.yield();
 end
 end
 if action_type=="TYPE_RIPOSTE" then
 
 elseif JY.Person[eid]["生命"]<=0 then
 PlayWavE(38);
 JY.info[pid].s_pic=31020;
 JY.info[eid].s_pic=31021;
 JY.TEXT_BUFF=GenFightStr(Query_Winner_Msg(),N_str,n_str,w_str,i_str,l_str);
 JY.WAIT=2;
 coroutine.yield();
 else
 JY.TEXT_BUFF=Query_Status_Msg(eid);
 JY.WAIT=2;
 coroutine.yield();
 DoAction(eid,pid,"TYPE_REGULAR");
 end
 end
end
function GenFightStr(str,N_str,n_str,w_str,i_str,l_str)
 str=string.gsub(str,"$N",N_str);
 str=string.gsub(str,"$n",n_str);
 str=string.gsub(str,"$p",n_str);
 str=string.gsub(str,"$w",w_str);
 str=string.gsub(str,"$i",i_str);
 str=string.gsub(str,"$l",l_str);
 return str;
end
function CheckSex(sex,sex_r)
 local p=JY.Person[JY.pid];
 if sex==0 then
 if sex_r==1 or sex_r==3 or sex_r==5 or sex_r==7 then
 return true;
 end

 elseif sex==1 and p["名称"]~="观岛香月" then
 if sex_r==2 or sex_r==3 or sex_r==6 or sex_r==7 then
 return true;
 end

 elseif sex==2 then
 if sex_r==4 or sex_r==5 or sex_r==6 or sex_r==7 then
 return true;
 end

 elseif p["名称"]=="观岛香月" then
 if sex_r==1 or sex_r==2 or sex_r==3 or sex_r==4 or sex_r==5 or sex_r==6 or sex_r==7 then
 return true;
 end

 end
 return false;
end
function Query_Action(pid)
 local kfid,lv=0,0;
 local p=JY.Person[pid];
 local kf={};
 for i=1,5 do
 if p["武功"..i]>0 then
 table.insert(kf,1+p["武功等级"..i]*5);
 else
 table.insert(kf,0);
 end
 end
 local r=PercentRandom(kf);
 if r>0 then
 kfid=p["武功"..r];
 lv=p["武功等级"..r];
 end
 if kfid<=0 then
 kfid=001;
 lv=limitX(p["等级"],0,1);
 end
 if pid==0 then
 lv=QueryMySkillLv(kfid);
 end
 local nl_cost=lv+JY.Kungfu[kfid]["内力消耗"]*(5+lv/5);
 
	local function CheckPairs(sid)
		local kid;
		for i=1,6 do
			kid=JY.Skill[sid]["需武功"..i];
			if kid>0 then
				local pass=false;
				for i,v in pairs({"武功1","武功2","武功3","武功4","武功5","内功","轻功","特技"}) do
					if p[v]==kid then
						pass=true;
						break;
					end
				end
				if not pass then
					return false;
				end
			end
			kid=JY.Skill[sid]["忌武功"..i];
			if kid>0 then
				for i,v in pairs({"武功1","武功2","武功3","武功4","武功5","内功","轻功","特技"}) do
					if p[v]==kid then
						return false;
					end
				end
			end
		end
		return true;
	end
 --select skill
 local skill_t={};
 local n=0
 for i,v in pairs(JY.Skill) do
 if v["武功"]==kfid then
 if v["类型"]=="攻击" and between(lv,v["等级1"],v["等级2"]) and CheckSex(p["性别"],v["性别"]) and CheckPairs(i) then
 table.insert(skill_t,i);
 n=n+1;
 end
 end
 end
 local skillid=0;
 local skillname="";
 if n==1 then
 skillid=skill_t[1];
 elseif n>1 then
 skillid=skill_t[math.random(n)];
 else
 
 end
 
 if skillid>0 then
 skillname=JY.Skill[skillid]["名称"];
 if string.len(JY.Skill[skillid]["名称"])>0 then
 skillname=JY.Kungfu[kfid]["名称"].."·"..skillname;
 else
 skillname=JY.Kungfu[kfid]["名称"];
 end
 local hurttype="伤害";
 hurttype=JY.Skill[skillid]["子类型"];
 if string.len(hurttype)>4 then
 hurttype=string.sub(hurttype,4*math.random((#hurttype)/4)-3);
 hurttype=string.sub(hurttype,1,4);
 end
 
 JY.Person[pid]["招架"]=kfid;
 JY.Person[pid]["招架等级"]=lv;
 return kfid,skillid,hurttype,JY.Skill[skillid]["文本"],JY.Kungfu[kfid].AP*(5+lv),JY.Kungfu[kfid].Damage*(5+lv),nl_cost;
 else
 return kfid,0,"伤害","$N使出\\orange"..JY.Kungfu[kfid]["名称"].."\\white，",JY.Kungfu[kfid].AP*(5+lv),JY.Kungfu[kfid].Damage*(5+lv),nl_cost;
 end
end
function Query_Dodge(pid)
 local function Query_Dodge_Sub(kfid)
 local skill_t={};
 for i,v in pairs(JY.Skill) do
 if v["武功"]==kfid then
 if v["类型"]=="闪避" then
 table.insert(skill_t,i);
 end
 end
 end
 local skillid=TableRandom(skill_t);
 if skillid>0 then
 return JY.Skill[skillid]["文本"];
 else
 return "";
 end
 end
 local msg={};
 local pt={};
 local T={"招架","内功","轻功","特技"};
 for i,v in pairs(T) do
 local kfid=JY.Person[pid][v];
 local kflv=JY.Person[pid][v.."等级"];
 if kfid>0 then
 table.insert(msg,Query_Dodge_Sub(kfid));
 else
 table.insert(msg,"");
 end
 if kfid>0 and #msg[i]>0 then
 table.insert(pt,JY.Kungfu[kfid].DP*(5+kflv));
 else
 table.insert(pt,0);
 end
 end
 local r=PercentRandom(pt);
 if r>0 then
 return msg[r];
 else
 return Query_Dodge_Sub(51);
 end
end
function Query_Parry(pid)
 local function Query_Parry_Sub(kfid)
 local skill_t={};
 for i,v in pairs(JY.Skill) do
 if v["武功"]==kfid then
 if v["类型"]=="招架" then
 table.insert(skill_t,i);
 end
 end
 end
 local skillid=TableRandom(skill_t);
 if skillid>0 then
 return JY.Skill[skillid]["文本"];
 else
 return "";
 end
 end
 local msg={};
 local pt={};
 local T={"招架","内功","轻功","特技"};
 for i,v in pairs(T) do
 local kfid=JY.Person[pid][v];
 local kflv=JY.Person[pid][v.."等级"];
 if kfid>0 then
 table.insert(msg,Query_Parry_Sub(kfid));
 else
 table.insert(msg,"");
 end
 if kfid>0 and #msg[i]>0 then
 table.insert(pt,JY.Kungfu[kfid].PP*(5+kflv));
 else
 table.insert(pt,0);
 end
 end
 local r=PercentRandom(pt);
 if r>0 then
 return msg[r];
 else
 return "但是被格开了。";
 end
end
function Query_Damage_Msg(damage,damage_type)
 if damage==0 then 
 return "结果没有造成任何伤害。\\n";
 end
 if damage_type=="割伤" or damage_type=="擦伤" or damage_type=="刀伤" or damage_type=="砍伤" then
 if damage<150 then
 return "结果只是轻轻地划破$p的皮肉。\\n";
 elseif damage<300 then
 return "结果在$p$l划出一道细长的血痕。\\n";
 elseif damage<600 then
 return "结果「嗤」地一声划出一道伤口！\\n";
 elseif damage<1200 then
 return "结果「嗤」地一声划出一道血淋淋的伤口！\\n";
 elseif damage<2400 then
 return "结果「嗤」地一声划出一道又长又深的伤口，溅得$N满脸鲜血！\\n";
 else
 return "结果只听见$n一声惨嚎，$w已在$p$l划出一道深及见骨的可怕伤口！！\\n";
 end
 elseif damage_type=="拉伤" or damage_type=="鞭伤" or damage_type=="抽伤" then
 if damage<150 then
 return "结果只是轻轻地划过了$n的皮肤。\\n";
 elseif damage<300 then
 return "结果在$n的$l抽出一道细长的血印。\\n";
 elseif damage<600 then
 return "结果「啪」地一声$w将$n的$l皮肤扯开，形成一道尺许长的伤口！\\n";
 elseif damage<1200 then
 return "只听$n「啊」地一声吐出一口鲜血，原来$p$l内的骨头已经被$w的劲力抽裂！\\n";
 elseif damage<2400 then
 return "结果随着「咔」地一声，$w已将$n$l处的骨头硬生生地抽断，断骨从肉里冒了出来！\\n";
 else
 return "结果$n一声惨嚎，$w已从$p$l处撕下了一大片血淋淋的皮肉，鲜血溅得满地！！\\n";
 end
 elseif damage_type=="抓伤" then
 if damage<150 then
 return "结果只是在$n$l处轻轻刮过，没有什么伤害。\\n";
 elseif damage<300 then
 return "结果$n皱了皱眉，$p的$l已经被拉出了一道浅浅的血痕。\\n";
 elseif damage<600 then
 return "结果拉下来$n$l的一点皮肉，疼得$p「哇哇」怪叫了起来！\\n";
 elseif damage<1200 then
 return "结果「唰」地一声，$n的$l上顿时被抓出五道血痕，鲜血流了出来！\\n";
 elseif damage<1600 then
 return "结果$n疼得大叫一声，$p$l上被抓出了几道深深的血沟，鲜血直流！\\n";
 elseif damage<2000 then
 return "结果只听见$n一声惨嚎，$N的手爪已在$p的$l处刺出了五个血肉模糊的窟窿！\\n";
 elseif damage<2400 then
 return "结果「啊」地一声惨叫，$n身上$l处被$N抓下了一大片皮肉，鲜血横飞满地！\\n";
 else
 return "结果$n一声凄惨的嘶叫，$l处被连皮带肉扯下一大块，露出了白森森的骨头！！\\n";
 end
 elseif damage_type=="震伤" then
 if damage<150 then
 return "结果$n受到$N的劲力一震，闷哼一声。\\n";
 elseif damage<300 then
 return "结果$n被$N以劲力一震，「嘿」地一声退了两步。\\n";
 elseif damage<600 then
 return "结果$n被$N以劲力一震，胸口有如受到一记重锤，连退了五六步！\\n";
 elseif damage<1200 then
 return "结果$N的劲力一下震得$n连退了好几步，差一点摔倒！\\n";
 elseif damage<2400 then
 return "结果$n被$N的劲力震得全身气血倒流，口中鲜血狂喷而出！\\n";
 else
 return "结果$n被$N的劲力震得眼前一黑，内脏碎裂，身子凭空飞了出去！！\\n";
 end
 elseif damage_type=="刺伤" then
 if damage<300 then
 return "结果只是轻轻地刺破$p的皮肉。\\n";
 elseif damage<600 then
 return "结果在$p$l刺出一个创口。\\n";
 elseif damage<1200 then
 return "结果「噗」地一声刺入了$n$l寸许！\\n";
 elseif damage<1800 then
 return "结果「噗」地一声刺进$n的$l，使$p不由自主地退了几步！\\n";
 elseif damage<2400 then
 return "结果「噗嗤」地一声，$w已在$p$l刺出一个血肉模糊的血窟窿！\\n";
 else
 return "结果只听见$n一声惨嚎，$w已在$p的$l对穿而出，鲜血溅得满地！！\\n";
 end
 elseif damage_type=="摔伤" or damage_type=="撞伤" then
 if damage<300 then
 return "结果$n脚下不稳，在地上擦破了点儿皮。\\n";
 elseif damage<600 then
 return "结果「啪」地一声，$n在地上摔了个屁礅。\\n";
 elseif damage<1200 then
 return "结果$n一不小心，被$N重重摔倒在地！\\n";
 elseif damage<1800 then
 return "结果$n被一下摔倒在地，「噗地」一声喷出了一大口鲜血！\\n";
 elseif damage<2400 then
 return "结果被$N这一下摔在地上，骨头「卡嚓」一声断了！\\n";
 else
 return "结果只听见$n一声惨嚎，被$N摔得血肉横飞，惨不忍睹！！\\n";
 end
 elseif damage_type=="挫伤" or damage_type=="砸伤" then
 if damage<300 then
 return "结果只是轻轻地碰撞到了$n一下，没有造成什么伤害。\\n";
 elseif damage<600 then
 return "结果$w只将$n的$l砸出一块瘀红。\\n";
 elseif damage<1200 then
 return "结果「啪」地一声，$w打中$n的$l，登时肿了一块老高！\\n";
 elseif damage<1800 then
 return "结果$w重重得击中$n的$l，打得$p倒退数步，「哇」地吐出一大口鲜血！\\n";
 elseif damage<2400 then
 return "结果只听见「硼」地一声巨响，$w打在$n身上，将$p像一捆稻草般击飞出去！\\n";
 else
 return "结果$w一下打在$n的身上，几声骨碎声中，$p象散了架似的瘫了下去！！\\n";
 end
 elseif damage_type=="瘀伤" then
 if damage<150 then
 return "结果只是轻轻地碰到，比拍苍蝇稍微重了点。\\n";
 elseif damage<300 then
 return "结果在$p的$l造成一处瘀青。\\n";
 elseif damage<750 then
 return "结果一击命中，$n的$l登时肿了一块老高！\\n";
 elseif damage<1200 then
 return "结果一击命中，$n闷哼了一声显然吃了不小的亏！\\n";
 elseif damage<1500 then
 return "结果「砰」地一声，$n退了两步！\\n";
 elseif damage<1800 then
 return "结果这一下「砰」地一声打得$n连退了好几步，差一点摔倒！\\n";
 elseif damage<2400 then
 return "结果重重地击中，$n「哇」地一声吐出一口鲜血！\\n";
 else
 return "结果只听见「砰」地一声巨响，$n像一捆稻草般飞了出去！！\\n";
 end
 
 elseif damage_type=="内伤" then
 if damage<300 then
 return "结果只是把$n打得退了半步，毫发无损。\\n";
 elseif damage<600 then
 return "结果$n痛哼一声，在$p的$l造成一处瘀伤。\\n";
 elseif damage<900 then
 return "结果一击命中，把$n打得痛得弯下腰去！\\n";
 elseif damage<1200 then
 return "结果$n闷哼了一声，脸上一阵青一阵白，显然受了点内伤！\\n";
 elseif damage<1800 then
 return "结果$n脸色一下变得惨白，昏昏沉沉接连退了好几步！\\n";
 elseif damage<2250 then
 return "结果重重地击中，$n「哇」地一声吐出一口鲜血！\\n";
 elseif damage<2700 then
 return "结果「轰」地一声，$n全身气血倒流，口中鲜血狂喷而出！\\n";
 else
 return "结果只听见几声喀喀轻响，$n一声惨叫，像滩软泥般塌了下去！！\\n";
 end
 else
 if damage<300 then
 return "结果只是勉强造成一处轻微"..damage_type.."。\\n";
 elseif damage<600 then
 return "结果造成轻微的"..damage_type.."。\\n";
 elseif damage<900 then
 return "结果造成一处"..damage_type.."。\\n";
 elseif damage<1500 then
 return "结果造成一处严重"..damage_type.."！\\n";
 elseif damage<1800 then
 return "结果造成颇为严重的"..damage_type.."！\\n";
 elseif damage<2100 then
 return "结果造成相当严重的"..damage_type.."！\\n";
 elseif damage<2400 then
 return "结果造成十分严重的"..damage_type.."！\\n";
 elseif damage<2700 then
 return "结果造成极其严重的"..damage_type.."！\\n";
 else
 return "结果造成非常可怕的严重"..damage_type.."！！\\n";
 end
 end
end
function Query_Winner_Msg()
 local num=7;
 local winner_msg={
 "$N哈哈大笑，愉快地说道：承让了！\\n",
 "$N双手一拱，笑著说道：知道我的利害了吧！\\n",
 "$N哈哈大笑，双手一拱，笑著说道：承让！\\n",
 "$N胜了这招，向后跃开三尺，笑道：承让！\\n",
 "$n脸色微变，说道：佩服，佩服！\\n",
 "$n向后退了几步，说道：这场比试算我输了，佩服，佩服！\\n",
 "$n向后一纵，躬身做揖说道：阁下武艺不凡，果然高明！\\n",
 };
 return winner_msg[math.random(num)];
end
function Query_Status_Msg(pid)
 local ratio=math.modf(100*JY.Person[pid]["生命"]/JY.Person[pid]["生命最大值"]);
 local name=JY.Person[pid]["名称"];
 if ratio==100 then
 return name.."看起来气血充盈，并没有受伤。\\n";
 elseif ratio>95 then
 return name.."似乎受了点轻伤，不过光从外表看不大出来。\\n";
 elseif ratio>90 then
 return name.."看起来可能受了点轻伤。\\n";
 elseif ratio>80 then
 return name.."受了几处伤，不过似乎并不碍事。\\n";
 elseif ratio>60 then
 return "\\yellow"..name.."受伤不轻，看起来状况并不太好。\\n";
 elseif ratio>40 then
 return "\\yellow"..name.."气息粗重，动作开始散乱，看来所受的伤著实不轻。\\n";
 elseif ratio>30 then
 return "\\yellow"..name.."已经伤痕累累，正在勉力支撑著不倒下去。\\n";
 elseif ratio>20 then
 return "\\yellow"..name.."受了相当重的伤，只怕会有生命危险。\\n";
 elseif ratio>10 then
 return "\\yellow"..name.."伤重之下已经难以支撑，眼看就要倒在地上。\\n";
 elseif ratio>5 then
 return "\\yellow"..name.."受伤过重，已经奄奄一息，命在旦夕了。\\n";
 else
 return "\\yellow"..name.."受伤过重，已经有如风中残烛，随时都可能断气。\\n";
 end
end
function QueryMySkillLv(kfid,basic)
 return limitX(JY.Base["武功等级"..kfid],1,250);
end
function Learn()
 while true do
 Learn_sub();
 StopEFT();
 JY.Status=GAME_AUTO;
 coroutine.yield();
 end
end
function Learn_sub()
 local p=JY.Person[JY.pid];
 local kfid=0;
 local str1="\\yellow%s\\white决定去修炼武功...\\n";
 local str2="\\yellow%s\\white正在思考修炼什么...\\n";
 local str3="\\yellow%s\\white考虑了半天，还是没想好要修炼什么...\\n";
 local str4="\\yellow%s\\white决定修炼\\orange%s\\n";
 local str5="\\n\\yellow%s\\white正在修炼\\orange%s\\white";
 local str6="\\n\\yellow%s\\white潜能耗尽，修炼武功结束...\\n";
 local str7="\\n\\orange%s\\white等级上升！\\n";
 local str8="\\orange%s\\white已修炼至登峰造极！\\n";
 local str9="\\orange%s\\white已修炼至化境！\\n";
 local str10="\\yellow%s\\white修炼武功结束...\\n";
 local str_l={[2]="抚琴",[3]="下棋",[4]="临帖",[5]="作画",[6]="烧菜",[7]="吟诗",[8]="品酒",[9]="养花"};
 if JY.Base["潜能"]>1000 and math.random(20)==1 then --随机添加 没有学过的生活技能
 local ys_t={0,0};
 for i=2,9 do
 if JY.Base["武功等级"..i]==0 then
 table.insert(ys_t,i);
 end
 end
 kfid=TableRandom(ys_t);
 end
 if kfid==0 then --没有初次修炼生活的技能， 那么正常开始随机修炼的武功
 local t_kf={};
 for i,v in pairs({"武功1","武功2","武功3","武功4","武功5","内功","轻功","特技"}) do
 if p[v]>0 then
 if between(JY.Base["武功等级"..p[v]],1,limitX(JY.Base["武功等级上限"..p[v]],2,limitX(JY.Base["重生次数"]*10+10,10,100))-1) then
	for j=1,100-JY.Base["武功等级"..p[v]] do
		table.insert(t_kf,p[v]);
	end
 end
 end
 end
 if JY.Base["修炼备选"]>0 then
 for i=1,JY.KungfuNum-1 do
 if between(JY.Base["武功等级"..i],1,limitX(JY.Base["武功等级上限"..i],2,limitX(JY.Base["重生次数"]*10+10,10,100))-1) and JY.Person[JY.pid]["名称"]~="四大山" then
	for j=1,100-JY.Base["武功等级"..i] do
		table.insert(t_kf,i);
	end
 end
 end
 end
 kfid=TableRandom(t_kf);
 end
 --一定几率不修炼
 if JY.Base["潜能"]<=2000 then
 kfid=0;
 end
 if between(kfid,2,9) then --艺术类
 JY.Base["武功等级上限"..kfid]=limitX(JY.Base["重生次数"]*10+10,10,100);
 str1="\\yellow%s\\white决定去"..str_l[kfid].."...\\n";
 str5="\\n\\yellow%s\\white正在"..str_l[kfid];
 str6="\\n\\yellow%s\\white停止"..str_l[kfid].."...\\n";
 str7="\\n\\orange%s\\white等级上升！\\n";
 str8="\\orange%s\\white已至登峰造极！\\n";
 str9="\\orange%s\\white已至化境！\\n";
 str10="\\yellow%s\\white"..str_l[kfid].."结束...\\n";
 JY.TEXT_BUFF=string.format(str1,JY.Person[JY.pid]["名称"]);
 JY.WAIT=1;
 coroutine.yield();
 else --其他
 JY.TEXT_BUFF=string.format(str1,JY.Person[JY.pid]["名称"]);
 JY.WAIT=1;
 coroutine.yield();
 JY.TEXT_BUFF=string.format(str2,JY.Person[JY.pid]["名称"]);
 JY.WAIT=1;
 coroutine.yield();
 if kfid>0 then --正常武功
 JY.TEXT_BUFF=string.format(str4,JY.Person[JY.pid]["名称"],JY.Kungfu[kfid]["名称"]);
 JY.WAIT=1;
 coroutine.yield();
 else --没有武功
 JY.TEXT_BUFF=string.format(str3,JY.Person[JY.pid]["名称"]);
 JY.WAIT=1;
 coroutine.yield();
 return;
 end
 end
 
 JY.LEARN_KFID=kfid;
 StartEFT(JY.LEARN_KFID);
 local frame=12;
 while true do
 JY.TEXT_BUFF=string.format(str5,JY.Person[JY.pid]["名称"],JY.Kungfu[kfid]["名称"]);
 coroutine.yield();
 for i=1,frame do
 JY.TEXT_BUFF=".";
 if JY.Person[JY.pid]["名称"]=="苍老师" then
 JY.Base["潜能"]=JY.Base["潜能"]-(JY.Base["武功等级"..kfid]*JY.Kungfu[kfid].Lv-math.modf(i/10))/2;
 --JY.WAIT=1;
 coroutine.yield();
 if JY.Base["潜能"]<(JY.Base["武功等级"..kfid]*JY.Kungfu[kfid].Lv-math.modf(i/10))/2 then
 JY.Base["潜能"]=0;
 PlayWavE(2);
 JY.TEXT_BUFF=string.format(str6,JY.Person[JY.pid]["名称"]);
 JY.WAIT=2;
 coroutine.yield();
 JY.LEARN_KFID=0;
 return;
 end
 elseif JY.Person[JY.pid]["名称"]=="四大山" then
 JY.Base["潜能"]=JY.Base["潜能"]-(JY.Base["武功等级"..kfid]*JY.Kungfu[kfid].Lv-math.modf(i/10))*2;
 --JY.WAIT=1;
 coroutine.yield();
 if JY.Base["潜能"]<(JY.Base["武功等级"..kfid]*JY.Kungfu[kfid].Lv-math.modf(i/10))*2 then
 JY.Base["潜能"]=0;
 PlayWavE(2);
 JY.TEXT_BUFF=string.format(str6,JY.Person[JY.pid]["名称"]);
 JY.WAIT=2;
 coroutine.yield();
 JY.LEARN_KFID=0;
 return;
 end
 else
 JY.Base["潜能"]=JY.Base["潜能"]-JY.Base["武功等级"..kfid]*JY.Kungfu[kfid].Lv-math.modf(i/10);
 --JY.WAIT=1;
 coroutine.yield();
 if JY.Base["潜能"]<JY.Base["武功等级"..kfid]*JY.Kungfu[kfid].Lv+math.modf(i/10) then
 JY.Base["潜能"]=0;
 PlayWavE(2);
 JY.TEXT_BUFF=string.format(str6,JY.Person[JY.pid]["名称"]);
 JY.WAIT=2;
 coroutine.yield();
 JY.LEARN_KFID=0;
 return;
 end
 end
 end
 local exp_add=limitX(JY.Base["重生次数"],0,100)*200+math.modf(frame*(JY.Base["武功等级"..kfid]*200+200)/(21-JY.Person[0]["悟性"]));
 if JY.Person[JY.pid]["名称"]=="苍老师" then
 local exp_add=exp_add*1.5;
 elseif JY.Person[JY.pid]["名称"]=="四大山" then
 local exp_add=exp_add*0.5;
 end
 JY.Base["武功经验"..kfid]=JY.Base["武功经验"..kfid]+exp_add;
 local next_exp=GetSkillExp(kfid);
 if JY.Base["武功经验"..kfid]>=next_exp then
 JY.Base["武功经验"..kfid]=0;
 JY.Base["武功等级"..kfid]=JY.Base["武功等级"..kfid]+1;
 UpdateKFLv();
 InsertLog(3,JY.Base["武功等级"..kfid],kfid);
 PlayWavE(11);
 JY.TEXT_BUFF=string.format(str7,JY.Kungfu[kfid]["名称"]);
 JY.WAIT=1;
 coroutine.yield();
 if JY.Base["武功等级"..kfid]>=0 then
 if JY.Base["武功等级"..kfid]>=40 then
 JY.TEXT_BUFF=string.format(str9,JY.Kungfu[kfid]["名称"]);
 elseif JY.Base["武功等级"..kfid]>=20 and JY.Base["武功等级"..kfid]<40 then
 JY.TEXT_BUFF=string.format(str8,JY.Kungfu[kfid]["名称"]);
 end
 JY.WAIT=1;
 coroutine.yield();
 if JY.Base["武功等级"..kfid]==10 or JY.Base["武功等级"..kfid]==20 or JY.Base["武功等级"..kfid]==30 or JY.Base["武功等级"..kfid]==40 or JY.Base["武功等级"..kfid]==50 or JY.Base["武功等级"..kfid]==60 or JY.Base["武功等级"..kfid]==70 or JY.Base["武功等级"..kfid]==80 or JY.Base["武功等级"..kfid]==90 or JY.Base["武功等级"..kfid]==100 then
 AddKFAttrib(JY.pid,kfid);
 end
 end
 JY.TEXT_BUFF=string.format(str10,JY.Person[JY.pid]["名称"]);
 JY.WAIT=2;
 coroutine.yield();
 JY.LEARN_KFID=0;
 return;
 end
 end
end
function UpdateKFLv()
 local p=JY.Person[0];
 for i=1,5 do
 local r=p["武功"..i];
 if r>0 then
 p["武功等级"..i]=JY.Base["武功等级"..r];
 end
 end
 for i,v in pairs({"内功","轻功","特技"}) do
 local r=p[v];
 if r>0 then
 p[v.."等级"]=JY.Base["武功等级"..r];
 end
 end
end
function AddKFAttrib(pid,kfid)
 if JY.Base["武功等级"..kfid]==100 then
	local p=JY.Person[pid];
	for i,v in pairs({"生命","内力"}) do
		if JY.Kungfu[kfid][v]>0 then
			if JY.Base["开启专家"]==1 then
				p[v.."最大值"]=p[v.."最大值"]+JY.Kungfu[kfid][v]*2;
				p[v]=p[v.."最大值"];
				JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white%s上限上升到%d \\green(%+d)\\white！\\n",v,p[v],JY.Kungfu[kfid][v]*2);
			else
				p[v.."最大值"]=p[v.."最大值"]+JY.Kungfu[kfid][v];
				p[v]=p[v.."最大值"];
				JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white%s上限上升到%d \\green(%+d)\\white！\\n",v,p[v],JY.Kungfu[kfid][v]);
			end
				InsertLog(2,i,p[v]);
				JY.WAIT=1;
				coroutine.yield();
		end
	end
	local ms={"伤害","命中","格挡","闪避"};
	for r=1,4 do
		local v=ms[r];
		if JY.Kungfu[kfid][v]>0 then
			if JY.Base["开启专家"]==1 then
			JY.Base["基本"..v]=JY.Base["基本"..v]+JY.Kungfu[kfid][v]*2;
			JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white基本%s上升到%d \\green(%+d)\\white！\\n",v,JY.Base["基本"..v],JY.Kungfu[kfid][v]*2);
			else
			JY.Base["基本"..v]=JY.Base["基本"..v]+JY.Kungfu[kfid][v];
			JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white基本%s上升到%d \\green(%+d)\\white！\\n",v,JY.Base["基本"..v],JY.Kungfu[kfid][v]);
			end
		InsertLog(2,r+7,JY.Base["基本"..v]);
		JY.WAIT=1;
		coroutine.yield();
		else
		JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white的修炼结果不是很令人满意，什么基本属性都没有提升！\\n");
		end
	end
 else
 local p=JY.Person[pid];
 local ms={"伤害","命中","格挡","闪避"};
 local lf=4;
 local r=math.random(lf);
 local v=ms[r];
 if JY.Kungfu[kfid][v]>0 then
 if JY.Base["开启专家"]==1 then
 JY.Base["基本"..v]=JY.Base["基本"..v]+JY.Kungfu[kfid][v]*2;
 JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white基本%s上升到%d \\green(%+d)\\white！\\n",v,JY.Base["基本"..v],JY.Kungfu[kfid][v]*2);
 else
 JY.Base["基本"..v]=JY.Base["基本"..v]+JY.Kungfu[kfid][v];
 JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white基本%s上升到%d \\green(%+d)\\white！\\n",v,JY.Base["基本"..v],JY.Kungfu[kfid][v]);
 end
 InsertLog(2,r+7,JY.Base["基本"..v]);
 JY.WAIT=1;
 coroutine.yield();
 else JY.TEXT_BUFF=string.format("\\yellow"..p["名称"].."\\white的修炼结果不是很令人满意，什么基本属性都没有提升！\\n");
 end
 end
end
function DrawGame()
 if JY.Status==GAME_START then
 lib.PicLoadCache(0,490*2,0,0,1);
 else
 lib.PicLoadCache(0,2*2,0,0,1);
 lib.PicLoadCache(0,0*2,0,CC.ScreenH-292,1);
 --绘制文本信息
 for i,v in pairs(JY.TEXT) do
 for index=1,#JY.TEXT_COLOR[i] do
 local start=JY.TEXT_COLOR[i][index].s;
 local endp;
 if index<#JY.TEXT_COLOR[i] then
 endp=JY.TEXT_COLOR[i][index+1].s-1;
 else
 endp=-1;
 end
 DrawString(16+16*start/2,514+20*i,string.sub(v,start,endp),JY.TEXT_COLOR[i][index].c,16);
 end
 end
 --结束绘制文本信息
 --
 DrawString(6,10,string.format("%s",JY.Person[0]["名称"]),M_LemonChiffon,16);
 DrawString(6,26,string.format("%s",JY.Force[JY.Base["当前场景"]]["名称"]),M_LemonChiffon,16);
 DrawString(6,42,string.format("修为 Lv%02d",JY.Person[0]["等级"]),M_LemonChiffon,16);
 DrawString(6,58,string.format("历练 %04.1f%%",100*JY.Base["实战"]/CC.Exp[JY.Person[0]["等级"]+1]),M_LemonChiffon,16);
 DrawString(6,74,string.format("潜能 %d",JY.Base["潜能"]),M_LemonChiffon,16);
 DrawString(6,90,string.format("用时 %02d:%02d:%02d",JY.Base["时"],JY.Base["分"],JY.Base["秒"]),M_LemonChiffon,16);
if JY.Person[0]["性别"]==0 then
 DrawString(6,122,string.format("性别 男"),M_LemonChiffon,16);
end
if JY.Person[0]["性别"]==1 then
 DrawString(6,122,string.format("性别 女"),M_LemonChiffon,16);
end
if JY.Person[0]["性别"]==2 then
 DrawString(6,122,string.format("性别 妖"),M_LemonChiffon,16);
end

DrawString(30,485,os.date("当前时间：%Y年%m月%d日%H:%M:%S"),M_LemonChiffon,16);

if CONFIG.Windows then
DrawString(320,485,"设备：PC",M_LemonChiffon,16);
else
DrawString(320,485,"设备：Android",M_LemonChiffon,16);
end

 DrawString(6,106,"版本 "..JY.Base["数据版本号"].."	"..GAME_VER,M_LemonChiffon,16);
 
 end
 
 --EFT
 
 if JY.EFT1>0 then
 lib.PicLoadCache(2,(JY.EFT1+os.clock()*4%JY.EFT2)*2,115,192,1); 
 end
 
 if JY.Status==GAME_LEARN and JY.LEARN_KFID>0 then
 DrawLearnKF(JY.LEARN_KFID);
 elseif JY.Status==GAME_FIGHT then
 local self={};
 self.x1=16;
 self.y1=380;
 lib.PicLoadCache(0,88*2,self.x1,self.y1,1);
 lib.PicLoadCache(1,JY.Person[JY.pid]["头像"]*2,self.x1+12,self.y1+14,1);
 DrawStringS(self.x1+88,self.y1+14,JY.Person[JY.pid]["名称"],M_White,16);
 DrawString(self.x1+88,self.y1+38,"生命",M_White,16);
 DrawString(self.x1+88,self.y1+58,"内力",M_White,16);
 DrawString(self.x1+88,self.y1+78,"状态",M_White,16);
 for i=0,19 do
 if 50*(180+i)<JY.Person[JY.pid]["生命"] then
 lib.PicLoadCache(0,201*2,self.x1+128+5*i,self.y1+39,1);
 elseif 50*(160+i)<JY.Person[JY.pid]["生命"] then
 lib.PicLoadCache(0,202*2,self.x1+128+5*i,self.y1+39,1);
 elseif 50*(140+i)<JY.Person[JY.pid]["生命"] then
 lib.PicLoadCache(0,203*2,self.x1+128+5*i,self.y1+39,1);
 elseif 50*(120+i)<JY.Person[JY.pid]["生命"] then
 lib.PicLoadCache(0,204*2,self.x1+128+5*i,self.y1+39,1);
 elseif 50*(100+i)<JY.Person[JY.pid]["生命"] then
 lib.PicLoadCache(0,205*2,self.x1+128+5*i,self.y1+39,1);
 elseif 50*(80+i)<JY.Person[JY.pid]["生命"] then
 lib.PicLoadCache(0,206*2,self.x1+128+5*i,self.y1+39,1);
 elseif 50*(60+i)<JY.Person[JY.pid]["生命"] then
 lib.PicLoadCache(0,207*2,self.x1+128+5*i,self.y1+39,1);
 elseif 50*(40+i)<JY.Person[JY.pid]["生命"] then
 lib.PicLoadCache(0,208*2,self.x1+128+5*i,self.y1+39,1);
 elseif 50*(20+i)<JY.Person[JY.pid]["生命"] then
 lib.PicLoadCache(0,209*2,self.x1+128+5*i,self.y1+39,1);
 elseif 50*i<JY.Person[JY.pid]["生命"] then
 lib.PicLoadCache(0,68*2,self.x1+128+5*i,self.y1+39,1);
 elseif 50*i<JY.Person[JY.pid]["生命最大值"] then
 lib.PicLoadCache(0,69*2,self.x1+128+5*i,self.y1+39,1);
 else
 break;
 end
 end
 for i=0,19 do 
 if 50*(180+i)<JY.Person[JY.pid]["内力"] then
 lib.PicLoadCache(0,61*2,self.x1+128+5*i,self.y1+59,1);
 elseif 50*(160+i)<JY.Person[JY.pid]["内力"] then
 lib.PicLoadCache(0,61*2,self.x1+128+5*i,self.y1+59,1);
 elseif 50*(140+i)<JY.Person[JY.pid]["内力"] then
 lib.PicLoadCache(0,62*2,self.x1+128+5*i,self.y1+59,1);
 elseif 50*(120+i)<JY.Person[JY.pid]["内力"] then
 lib.PicLoadCache(0,62*2,self.x1+128+5*i,self.y1+59,1);
 elseif 50*(100+i)<JY.Person[JY.pid]["内力"] then
 lib.PicLoadCache(0,63*2,self.x1+128+5*i,self.y1+59,1);
 elseif 50*(80+i)<JY.Person[JY.pid]["内力"] then
 lib.PicLoadCache(0,63*2,self.x1+128+5*i,self.y1+59,1);
 elseif 50*(60+i)<JY.Person[JY.pid]["内力"] then
 lib.PicLoadCache(0,64*2,self.x1+128+5*i,self.y1+59,1);
 elseif 50*(40+i)<JY.Person[JY.pid]["内力"] then
 lib.PicLoadCache(0,65*2,self.x1+128+5*i,self.y1+59,1);
 elseif 50*(20+i)<JY.Person[JY.pid]["内力"] then
 lib.PicLoadCache(0,66*2,self.x1+128+5*i,self.y1+59,1);
 elseif 50*i<JY.Person[JY.pid]["内力"] then
 lib.PicLoadCache(0,67*2,self.x1+128+5*i,self.y1+59,1);
 elseif 50*i<JY.Person[JY.pid]["内力最大值"] then
 lib.PicLoadCache(0,69*2,self.x1+128+5*i,self.y1+59,1);
 else
 break;
 end
 end
 self.x2=142;
 self.y2=128;
 lib.PicLoadCache(0,89*2,self.x2,self.y2,1);
 lib.PicLoadCache(1,JY.Person[JY.eid]["头像"]*2,self.x2+292-12-64,self.y2+14,1);
 DrawStringS(self.x2+292-88-16*#JY.Person[JY.eid]["名称"]/2,self.y2+14,JY.Person[JY.eid]["名称"],M_White,16);
 DrawString(self.x2+292-88-32,self.y2+38,"生命",M_White,16);
 DrawString(self.x2+292-88-32,self.y2+58,"内力",M_White,16);
 DrawString(self.x2+292-88-32,self.y2+78,"状态",M_White,16);
 for i=0,19 do
 if 50*(180+i)<JY.Person[JY.eid]["生命"] then
 lib.PicLoadCache(0,201*2,self.x2+292-128-5*i-5,self.y2+39,1);
 elseif 50*(160+i)<JY.Person[JY.eid]["生命"] then
 lib.PicLoadCache(0,202*2,self.x2+292-128-5*i-5,self.y2+39,1);
 elseif 50*(140+i)<JY.Person[JY.eid]["生命"] then
 lib.PicLoadCache(0,203*2,self.x2+292-128-5*i-5,self.y2+39,1);
 elseif 50*(120+i)<JY.Person[JY.eid]["生命"] then
 lib.PicLoadCache(0,204*2,self.x2+292-128-5*i-5,self.y2+39,1);
 elseif 50*(100+i)<JY.Person[JY.eid]["生命"] then
 lib.PicLoadCache(0,205*2,self.x2+292-128-5*i-5,self.y2+39,1);
 elseif 50*(80+i)<JY.Person[JY.eid]["生命"] then
 lib.PicLoadCache(0,206*2,self.x2+292-128-5*i-5,self.y2+39,1);
 elseif 50*(60+i)<JY.Person[JY.eid]["生命"] then
 lib.PicLoadCache(0,207*2,self.x2+292-128-5*i-5,self.y2+39,1);
 elseif 50*(40+i)<JY.Person[JY.eid]["生命"] then
 lib.PicLoadCache(0,208*2,self.x2+292-128-5*i-5,self.y2+39,1);
 elseif 50*(20+i)<JY.Person[JY.eid]["生命"] then
 lib.PicLoadCache(0,209*2,self.x2+292-128-5*i-5,self.y2+39,1);
 elseif 50*i<JY.Person[JY.eid]["生命"] then
 lib.PicLoadCache(0,68*2,self.x2+292-128-5*i-5,self.y2+39,1);
 elseif 50*i<JY.Person[JY.eid]["生命最大值"] then
 lib.PicLoadCache(0,69*2,self.x2+292-128-5*i-5,self.y2+39,1);
 else
 break;
 end
 end
 for i=0,19 do
 if 50*(180+i)<JY.Person[JY.eid]["内力"] then
 lib.PicLoadCache(0,61*2,self.x2+292-128-5*i-5,self.y2+59,1);
 elseif 50*(160+i)<JY.Person[JY.eid]["内力"] then
 lib.PicLoadCache(0,61*2,self.x2+292-128-5*i-5,self.y2+59,1);
 elseif 50*(140+i)<JY.Person[JY.eid]["内力"] then
 lib.PicLoadCache(0,62*2,self.x2+292-128-5*i-5,self.y2+59,1);
 elseif 50*(120+i)<JY.Person[JY.eid]["内力"] then
 lib.PicLoadCache(0,62*2,self.x2+292-128-5*i-5,self.y2+59,1);
 elseif 50*(100+i)<JY.Person[JY.eid]["内力"] then
 lib.PicLoadCache(0,63*2,self.x2+292-128-5*i-5,self.y2+59,1);
 elseif 50*(80+i)<JY.Person[JY.eid]["内力"] then
 lib.PicLoadCache(0,63*2,self.x2+292-128-5*i-5,self.y2+59,1);
 elseif 50*(60+i)<JY.Person[JY.eid]["内力"] then
 lib.PicLoadCache(0,64*2,self.x2+292-128-5*i-5,self.y2+59,1);
 elseif 50*(40+i)<JY.Person[JY.eid]["内力"] then
 lib.PicLoadCache(0,65*2,self.x2+292-128-5*i-5,self.y2+59,1);
 elseif 50*(20+i)<JY.Person[JY.eid]["内力"] then
 lib.PicLoadCache(0,66*2,self.x2+292-128-5*i-5,self.y2+59,1);
 elseif 50*i<JY.Person[JY.eid]["内力"] then
 lib.PicLoadCache(0,67*2,self.x2+292-128-5*i-5,self.y2+59,1);
 elseif 50*i<JY.Person[JY.eid]["内力最大值"] then
 lib.PicLoadCache(0,69*2,self.x2+292-128-5*i-5,self.y2+59,1);
 else
 break;
 end
 end
 local v=JY.info[JY.pid];
 if type(v)=='table' then
 local dx,dy;
 local width=48;
 dx=CC.ScreenW/2;
 dy=self.y1+64;
 if v.s_pic>30000 then
 lib.PicLoadCache(0,(v.s_pic-30000)*2,dx,dy,0);
 else
 if v.s_pic>=100 then
 dx=dx+width;
 elseif v.s_pic>=10 then
 dx=dx+width/2;
 end
 local hurt=v.s_pic;
 while hurt>0 do
 local pic_id=1000+hurt%10;
 lib.PicLoadCache(0,pic_id*2,dx,dy,0);
 dx=dx-width;
 hurt=math.modf(hurt/10);
 end
 end
 end
 v=JY.info[JY.eid];
 if type(v)=='table' then
 local dx,dy;
 local width=48;
 dx=CC.ScreenW/2;
 dy=self.y2+64;
 if v.s_pic>30000 then
 lib.PicLoadCache(0,(v.s_pic-30000)*2,dx,dy,0);
 else
 if v.s_pic>=100 then
 dx=dx+width;
 elseif v.s_pic>=10 then
 dx=dx+width/2;
 end
 local hurt=v.s_pic;
 while hurt>0 do
 local pic_id=1000+hurt%10;
 lib.PicLoadCache(0,pic_id*2,dx,dy,0);
 dx=dx-width;
 hurt=math.modf(hurt/10);
 end
 end
 end
 end
 
 if #JY.CENTER_MSG>0 then
 if JY.Status==GAME_START then
 DrawHelp(-1,480,JY.CENTER_MSG);
 else
 DrawHelp(-1,255,JY.CENTER_MSG);
 end
 end
 --人物属性界面
 if JY.bt[11].show or JY.bt[34].show then
 DrawPersonStatus(0);
 end
 --地图选择界面
 if JY.bt[13].show then
 DrawMapSelect();
 end
 if JY.bt[14].show then
 DrawLog();
 end
 if JY.bt[15].show then
 DrawSetting();
 end
 if JY.bt[17].show then
 DrawTitle();
 end
 if JY.bt[18].show then
 DrawWeapon();
 end
 if JY.bt[198].show then
 if JY.bt[198].event==1 then
 DrawHelp(-1,255,"* 确定要关闭游戏吗？ ***");
 elseif JY.bt[198].event==2 then
 DrawHelp(-1,255,string.format("* 转世重生需要%d级，不到级别无效 ***",limitX(JY.Base["重生次数"]*9+9,9,99)));
 elseif JY.bt[198].event==3 then
 DrawHelp(-1,255,"* 确定手动保存存档ESAVE1吗 ***");
 elseif JY.bt[198].event==4 then
 DrawHelp(-1,255,"* 确定手动读取存档ESAVE1吗 ***");
 end
 lib.PicLoadCache(0,164*2,JY.bt[198].x1-8,JY.bt[198].y1-10,1);
 end
 for i,v in pairs(JY.bt) do
 if v.show then
 if v.enable then
 if v.select then
 lib.PicLoadCache(0,v.pic3*2,v.x1,v.y1,1);
 elseif JY.current==v.id then
 if JY.hold then
 lib.PicLoadCache(0,v.pic3*2,v.x1,v.y1,1);
 else
 lib.PicLoadCache(0,v.pic2*2,v.x1,v.y1,1);
 end
 else
 lib.PicLoadCache(0,v.pic1*2,v.x1,v.y1,1);
 end
 else
 lib.PicLoadCache(0,v.pic4*2,v.x1,v.y1,1);
 end
 if between(v.sp,90,95) then
 if JY.current==v.id and JY.hold then
 lib.PicLoadCache(0,v.sp*2,v.x1+21+1+15,v.y1+26+1,1);
 else
 lib.PicLoadCache(0,v.sp*2,v.x1+21+15,v.y1+26,1);
 end
 end
 if #v.txt>0 then
 
 if v.select then
 DrawStringS(v.tx-16*#v.txt/4+1,v.ty-16/2+1,v.txt,C_WHITE,16);
 elseif JY.current==v.id and JY.hold then
 DrawStringS(v.tx-16*#v.txt/4+1,v.ty-16/2+1,v.txt,C_WHITE,16);
 else
 DrawStringS(v.tx-16*#v.txt/4,v.ty-16/2,v.txt,C_WHITE,16);
 end
 end
 end
 end
 if JY.HELPINDEX>0 then
 DrawHelp(MOUSE.x,MOUSE.y+24,JY.bt[JY.HELPINDEX].help,JY.bt[JY.HELPINDEX].helppic);
 end
 
 
end
function DrawHelp(x,y,str,pic) --显示带框的字符串
 local size=16;
 local color=C_WHITE;
 local strarray={};
 local num,maxlen;
 maxlen=0
 num,strarray=Split(str,'*')
 for i=1,num do
 local len=#strarray[i];
 if len>maxlen then
 maxlen=len;
 end
 end
 if maxlen==0 then
 return;
 end
 local w=size*maxlen/2;
 local h=size*num+6*(num-1);
 if x==-1 then
 x=(CC.ScreenW)/2;
 end
 if y==-1 then
 y=(CC.ScreenH-h)/2;
 end
 if x<0 then
 x=CC.ScreenW-size/2*maxlen+x;
 end
 if y<0 then
 y=CC.ScreenH-size*num+y;
 end
 x=x-w/2;
 x=limitX(x,16,CC.ScreenW-w-16);
 local boxw,boxh;
 boxw=w+80; --88
 boxh=h+16; --24
 local boxx=x-(boxw-w)/2;
 local boxy=y-(boxh-h)/2;
 --Left Top
 lib.SetClip(boxx,boxy,boxx+boxw/2,boxy+boxh/2);
 lib.PicLoadCache(0,12*2,boxx,boxy,1);
 --Left Bot
 lib.SetClip(boxx,boxy+boxh/2,boxx+boxw/2,boxy+boxh);
 lib.PicLoadCache(0,12*2,boxx,boxy+boxh-304,1);
 --Right Top
 lib.SetClip(boxx+boxw/2,boxy,boxx+boxw,boxy+boxh/2);
 lib.PicLoadCache(0,12*2,boxx+boxw-320,boxy,1);
 --Right Bot
 lib.SetClip(boxx+boxw/2,boxy+boxh/2,boxx+boxw,boxy+boxh);
 lib.PicLoadCache(0,12*2,boxx+boxw-320,boxy+boxh-304,1);
 lib.SetClip(0,0,0,0);
 for i=1,num do
 DrawStringS(x,y+(size+6)*(i-1),strarray[i],color,size);
 end
 if pic~=nil then
 lib.PicLoadCache(0,pic*2,x+string.find(strarray[1]," ")*size/2+9,y+9);
 end
end
function DrawPersonStatus(pid)
 local tx,ty=45-45,JY.bt[11].y1-272;
 lib.PicLoadCache(0,10*2,tx,ty,1);
 local p=JY.Person[pid];
 --head
 lib.PicLoadCache(1,p["头像"]*2,tx+45+6,ty+24,1);
 --武功
 tx,ty=66-59,JY.bt[11].y1-138;
 for i=1,5 do
 local r=p["武功"..i];
 if r>0 then
 DrawString(tx,ty,string.format("%-14sLv%02d",JY.Kungfu[r]["名称"],JY.Base["武功等级"..r]),M_Yellow,16);
 ty=ty+16;
 end
 end
 for i,v in pairs({"内功"}) do
 local r=p[v];
 if r>0 then
 DrawString(tx,ty,string.format("%-14sLv%02d",JY.Kungfu[r]["名称"],JY.Base["武功等级"..r]),M_Pink,16);
 ty=ty+16;
 end
 end
 for i,v in pairs({"轻功"}) do
 local r=p[v];
 if r>0 then
 DrawString(tx,ty,string.format("%-14sLv%02d",JY.Kungfu[r]["名称"],JY.Base["武功等级"..r]),M_LemonChiffon,16);
 ty=ty+16;
 end
 end
 for i,v in pairs({"特技"}) do
 local r=p[v];
 if r>0 then
 DrawString(tx,ty,string.format("%-14sLv%02d",JY.Kungfu[r]["名称"],JY.Base["武功等级"..r]),M_Orange,16);
 ty=ty+16;
 end
 end
 if JY.PersonStatusPage==1 then
 DrawString(256,JY.bt[11].y1-255,string.format("Page %02d/%02d",JY.KF_CURRENT_PAGE,JY.KF_MAX_PAGE),M_White,16);
 return;
 end
 if JY.PersonStatusPage==2 then
 DrawRecord();
 return;
 end
 
 tx,ty=45+130,JY.bt[11].y1-256;
 --status
 lib.PicLoadCache(0,36*2,tx-8,ty-4-6,1);
 if string.len(p["外号"])>0 then
 DrawString(tx,ty,string.format("%-18s Lv%d",p["外号"].."·"..p["名称"],p["等级"]),M_White,16);
 else
 DrawString(tx,ty,string.format("%-18s Lv%d",p["名称"],p["等级"]),M_White,16);
 end
 ty=ty+21;
 lib.PicLoadCache(0,25*2,tx-8,ty-4,1);
 DrawString(tx,ty,"生命: "..p["生命"]..'/'..p["生命最大值"],M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,25*2,tx-8,ty-4,1);
 DrawString(tx,ty,"内力: "..p["内力"]..'/'..p["内力最大值"],M_White,16);
 ty=ty+21;
 local damage,ap,pp,dp,damage1,ap1,pp1,dp1=GetBasePT(pid,true);
 lib.PicLoadCache(0,25*2,tx-8,ty-4,1);
 DrawString(tx,ty,"伤害: "..damage1.."+"..damage,M_White,16);
 lib.PicLoadCache(0,25*2,tx-8+130,ty-4,1);
 DrawString(tx+130,ty,"命中: "..ap1.."+"..ap,M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,25*2,tx-8,ty-4,1);
 DrawString(tx,ty,"格挡: "..pp1.."+"..pp,M_White,16);
 lib.PicLoadCache(0,25*2,tx-8+130,ty-4,1);
 DrawString(tx+130,ty,"闪避: "..dp1.."+"..dp,M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,25*2,tx-8,ty-4,1);
 if p["武器"]>0 then
 DrawString(tx,ty,"武器: "..JY.Item[p["武器"]]["名称"],M_White,16);
 else
 DrawString(tx,ty,"武器: 无",M_White,16);
 end
 ty=ty+21;
 
 for i,v in pairs({"膂力","根骨","机敏","悟性","福缘"}) do
 lib.PicLoadCache(0,25*2,tx-8,ty-4,1);
 DrawString(tx,ty,v..": ",M_White,16);
 lib.PicLoadCache(0,(100+limitX(p[v],0,20))*2,tx+48,ty+1,1);
 DrawString(tx+200,ty,limitX(p[v],0,20),M_White,16);
 ty=ty+21;
 end
 lib.PicLoadCache(0,29*2,tx-8,ty-4,1);
 DrawString(tx,ty,"武功等级上限:"..limitX(JY.Base["重生次数"]*10+10,10,100),M_White,16);
 if JY.Base["自由属性点"]>0 then
 lib.PicLoadCache(0,28*2,tx-8+130,ty-4,1);
 DrawString(tx+130,ty,"自由属性点:"..JY.Base["自由属性点"],M_White,16);
 ty=ty+21;
 end
end
function GetBasePT(pid,flag)
 local p=JY.Person[pid];
 local damage,ap,pp,dp=0,0,0,0;
 local damage1,ap1,pp1,dp1=JY.Base["基本伤害"],JY.Base["基本命中"],JY.Base["基本格挡"],JY.Base["基本闪避"];
 for i=1,5 do
 local kfid=p["武功"..i];
 local lv=p["武功等级"..i]+5;
 if kfid>0 then
 damage=math.max(damage,JY.Kungfu[kfid].Damage*lv);
 ap=math.max(ap,JY.Kungfu[kfid].AP*lv);
 pp=math.max(pp,JY.Kungfu[kfid].PP*lv);
 dp=math.max(dp,JY.Kungfu[kfid].DP*lv);
 end
 end
 if flag then
 for i,v in pairs({"内功","轻功","特技"}) do
 local kfid=p[v];
 local lv=p[v.."等级"]+5;
 if kfid>0 then
 damage=damage+JY.Kungfu[kfid].Damage*lv;
 ap=ap+JY.Kungfu[kfid].AP*lv;
 pp=pp+JY.Kungfu[kfid].PP*lv;
 dp=dp+JY.Kungfu[kfid].DP*lv;
 end
 end
 if p["武器"]>0 then
 damage=damage+JY.Item[p["武器"]]["伤害"];
 ap=ap+JY.Item[p["武器"]]["命中"];
 end
 damage=math.modf(damage/10);
 ap=math.modf(ap/10);
 pp=math.modf(pp/10);
 dp=math.modf(dp/10);
 end
 return damage,ap,pp,dp,damage1,ap1,pp1,dp1;
end
function DrawMapSelect()
 local tx,ty=45,JY.bt[11].y1-272;
 lib.PicLoadCache(0,11*2,tx-45,ty,1);
 ty=ty+0;
 lib.PicLoadCache(0,1*2,tx+1-45,ty,1);
 DrawStringS(tx+8-45,ty+10,"场景选择",M_PaleTurquoise,16);
end
function DrawLog()
 local tx,ty=45,JY.bt[14].y1-272;
 local num_per_page=14;
 lib.PicLoadCache(0,200*2,tx,ty,1);
 ty=ty+0;
 lib.PicLoadCache(0,1*2,tx+1,ty,1);
 DrawStringS(tx+8,ty+10,"战绩回顾",C_WHITE,16);
 DrawString(275,JY.bt[14].y1-258,string.format("Page %02d/%02d",JY.LOG_CURRENT_PAGE,JY.LOG_MAX_PAGE),M_White,16);
 tx=tx+10;
 ty=ty+40;
 for i=1+num_per_page*(JY.LOG_CURRENT_PAGE-1),math.min(num_per_page*JY.LOG_CURRENT_PAGE,GetLogNum()) do
 DrawStringColor(tx,ty,ReadLog(i),16);
 ty=ty+16;
 end
end
function DrawStringColor(x,y,str,size)
 local str_t={};
 local color=C_WHITE;
 local tmps="";
 while #str>0 do
 local tv=string.sub(str,1,1);
 if tv=="\\" then
 if #tmps>0 then
 table.insert(str_t,{s=tmps,c=color});
 tmps="";
 end
 if string.sub(str,1,6)=="\\white" then --white
 color=M_White;
 str=string.sub(str,7,-1);
 elseif string.sub(str,1,4)=="\\red" then --red
 color=M_Red;
 str=string.sub(str,5,-1);
 elseif string.sub(str,1,7)=="\\yellow" then --yellow
 color=M_Yellow;
 str=string.sub(str,8,-1);
 elseif string.sub(str,1,7)=="\\orange" then --orange
 color=M_Orange;
 str=string.sub(str,8,-1);
 elseif string.sub(str,1,6)=="\\green" then --M_PaleGreen
 color=M_PaleGreen;
 str=string.sub(str,7,-1);
 else
 str=string.sub(str,2,-1);
 end
 else
 if string.byte(tv)<128 then --英文以及数字
 tmps=tmps..tv;
 str=string.sub(str,2,-1);
 else --汉字
 tmps=tmps..string.sub(str,1,2);
 str=string.sub(str,3,-1);
 end
 end
 end
 if #tmps>0 then
 table.insert(str_t,{s=tmps,c=color});
 tmps="";
 end
 local tx=x;
 for i,v in pairs(str_t) do
 if #v.s>0 then
 DrawString(tx,y,v.s,v.c,size);
 tx=tx+size*#v.s/2;
 end
 end
end
function DrawSetting()
 local tx,ty=45,JY.bt[14].y1-272;
 lib.PicLoadCache(0,200*2,tx,ty,1);
 lib.PicLoadCache(0,1*2,tx+1,ty,1);
 DrawStringS(tx+8,ty+10,"游戏设定",C_WHITE,16);
 tx=60;
 ty=JY.bt[81].y1;
 lib.PicLoadCache(0,32*2,tx,ty,1);
 DrawStringS(tx+10,ty+8,"武功音效",C_WHITE,16);
 ty=JY.bt[83].y1;
 lib.PicLoadCache(0,33*2,tx,ty,1);
 DrawStringS(tx+10,ty+8,"修炼备选武功",C_WHITE,16);
 ty=JY.bt[87].y1;
 lib.PicLoadCache(0,32*2,tx,ty,1);
 DrawStringS(tx+10,ty+8,"开启音乐",C_WHITE,16);
 ty=JY.bt[85].y1;
 lib.PicLoadCache(0,32*2,tx,ty,1);
 DrawStringS(tx+10,ty+8,"开启专家",C_WHITE,16);

 ty=JY.bt[91].y1;
 lib.PicLoadCache(0,32*2,tx,ty,1);
 DrawStringS(tx+10,ty+8,"功能指令",C_WHITE,16);

 ty=JY.bt[92].y1;
 lib.PicLoadCache(0,32*2,tx,ty,1);
 DrawStringS(tx+10,ty+8,"其他指令",C_WHITE,16);

end
function DrawRecord()
 local b=JY.Base;
 local tx,ty=45+150,JY.bt[14].y1-256;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("战斗次数: %d",b["战斗次数"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("胜利次数: %d",b["胜利次数"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("攻击次数: %d",b["攻击次数"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("命中次数: %d",b["命中次数"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("格挡次数: %d",b["格挡次数"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("闪避次数: %d",b["闪避次数"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("睡觉次数: %d",b["睡觉次数"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("进食次数: %d",b["进食次数"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("思考次数: %d",b["思考次数"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("闭关次数: %d",b["闭关次数"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("潜能合计: %d",b["潜能合计"]),M_White,16);
 ty=ty+21;
 lib.PicLoadCache(0,27*2,tx-8,ty-4,1);
 DrawString(tx,ty,string.format("重生次数: %d",b["重生次数"]),M_White,16);
 ty=ty+21;
end
function DrawTitle()
 local tx,ty=45,JY.bt[11].y1-272;
 lib.PicLoadCache(0,11*2,tx-45,ty,1);
 ty=ty+0;
 lib.PicLoadCache(0,1*2,tx+1-45,ty,1);
 DrawStringS(tx+8-45,ty+10,"称号",M_PaleTurquoise,16);
end
function DrawWeapon()
 local tx,ty=45,JY.bt[11].y1-272;
 lib.PicLoadCache(0,11*2,tx-45,ty,1);
 ty=ty+0;
 lib.PicLoadCache(0,1*2,tx+1-45,ty,1);
 DrawStringS(tx+8-45,ty+10,"武器",M_PaleTurquoise,16);
end
function StartEFT(kfid)
 local dh_raw= {
 [1]={810,12}, --拳掌
 [2]={890,5}, --铁掌
 [3]={990,10}, --指法
 [4]={640,12}, --毒功
 [11]={800,9}, --御剑
 [12]={600,13}, --刺叶子
 [13]={570,20}, --刺苍蝇
 [21]={770,7}, --耍刀
 [31]={780,14}, --枪棍
 [32]={740,9}, --暗器1
 [33]={750,5}, --暗器2
 [34]={760,8}, --暗器3
 [71]={920,18}, --内功
 [81]={660,11}, --轻功1
 [82]={690,4}, --轻功2
 [83]={680,7}, --轻功3
 [84]={850,5}, --闪避
 [101]={630,3}, --弹琴
 [102]={910,4}, --下棋
 [103]={870,3}, --书法
 [104]={1010,3}, --作画
 [105]={540,3}, --煮茶
 [106]={950,7}, --浇花
 [107]={860,6}, --烧菜
 [108]={550,13}, --采药
 [109]={620,3}, --丹药
 [110]={730,1}, --看道经
 [111]={731,1}, --看棋谱
 [112]={732,1}, --看医术
 [113]={733,1}, --看书
 [114]={734,1}, --看挂轴
 [115]={735,1}, --看佛经
 [116]={736,1}, --看书法
 [117]={830,5}, --劈材
 [118]={840,4}, --扫地
 [119]={880,4}, --挑水
 [120]={900,3}, --洗衣
 [121]={940,4}, --研墨
 --
 [201]={960,6}, --硬功1
 [202]={970,15}, --硬功2
 [203]={700,25}, --锻炼成功
 [204]={700,30}, --锻炼失败
 };
 local v=JY.Kungfu[kfid]["修炼动画"];
 if type(dh_raw[v])=="table" then
 JY.EFT1=dh_raw[v][1];
 JY.EFT2=dh_raw[v][2];
 end
end
function StopEFT()
 JY.EFT1=0;
 JY.EFT2=0;
end
function DrawLearnKF(kfid)
 local cy=192;
 local sl=100*JY.Base["武功经验"..kfid]/GetSkillExp(kfid);
 --local T={[0]="基础","拳脚","剑法","刀法","枪棍","奇门","","内功","轻功","特技","基础",""};
 cy=cy+264;
 lib.PicLoadCache(0,3*2,0,cy-8,1);
 DrawString(20,cy,string.format("%-16s%-8sLv%02d  Exp",JY.Kungfu[kfid]["名称"],JY.Kungfu[kfid]["类型描述"],JY.Base["武功等级"..kfid]),M_Orange,16);
 DrawString(310+40,cy,string.format("(%05.2f%%)",sl),M_Orange,16);
 lib.PicLoadCache(0,(40+math.modf(sl/10)+math.modf(os.clock()*2%2))*2,250+40,cy+1,1); 
end
function GetSkillExp(kfid)
local hard=5*(JY.Kungfu[kfid].Lv-1)+JY.Kungfu[kfid].Hard/10;	--修炼难度系数
local lv=JY.Base["武功等级"..kfid];
hard=hard+5*math.modf(lv/10);
return math.modf(5*(lv+5)^(2+hard/50)+hard^2);
end
function PicCatchIni()
 lib.PicInit(CC.PaletteFile); --加载原来的256色调色板
 lib.PicLoadFile(CC.SMAPPicFile[1],CC.SMAPPicFile[2],0);
 lib.PicLoadFile(CC.HeadPicFile[1],CC.HeadPicFile[2],1);
 lib.PicLoadFile(CC.HeadPicFile[1],CC.HeadPicFile[2],11,75);
 lib.PicLoadFile(CC.EFT[1],CC.EFT[2],2);
 ButtonIni();
end
function ButtonIni()
 JY.bt={};
 local x,y;
 x,y=98,8; --属性
 JY.bt[1]={id=1,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="属性",pic1=160,pic2=161,pic3=162,pic4=163,sp=0,enable=true,show=true};
 x=x+87; --道具
 JY.bt[2]={id=2,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="武器",pic1=160,pic2=161,pic3=162,pic4=163,sp=0,enable=true,show=true};
 x=x+87; --成就
 JY.bt[3]={id=3,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="称号",pic1=160,pic2=161,pic3=162,pic4=163,sp=0,enable=true,show=true};
 x=x+87; --记录
 JY.bt[4]={id=4,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="战绩",pic1=160,pic2=161,pic3=162,pic4=163,sp=0,enable=true,show=true};
 
 y=y+40; --Boss
 x=JY.bt[1].x1;
 JY.bt[5]={id=5,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="Boss",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=false,show=true};
 x=x+87; --场景
 JY.bt[6]={id=6,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="场景",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=true};
 x=x+87; --设定
 JY.bt[7]={id=7,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="设定",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=true};
 x=x+87; --关闭
 JY.bt[8]={id=8,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="关闭",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=true};
 y=y+40; --加速
 JY.bt[10]={id=10,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="X1",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=false};

x=JY.bt[1].x1;
 x=x+87; 


 --人物属性界面 关闭按钮
 x,y=340+20,420;
 JY.bt[11]={id=11,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="关闭",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=false};
 --开启选择武功
 x,y=90+20,JY.bt[11].y1+4;
 JY.bt[12]={id=12,x1=x,y1=y,x2=x+45,y2=y+28,tx=x+31-8,ty=y+14,txt="拳脚",pic1=135,pic2=136,pic3=137,pic4=138,sp=0,enable=true,show=false};
 x,y=90+70,JY.bt[11].y1+4;
 JY.bt[19]={id=19,x1=x,y1=y,x2=x+45,y2=y+28,tx=x+31-8,ty=y+14,txt="刀剑",pic1=135,pic2=136,pic3=137,pic4=138,sp=0,enable=true,show=false};
 x,y=90+120,JY.bt[11].y1+4;
 JY.bt[20]={id=20,x1=x,y1=y,x2=x+45,y2=y+28,tx=x+31-8,ty=y+14,txt="奇功",pic1=135,pic2=136,pic3=137,pic4=138,sp=0,enable=true,show=false};
 x,y=90+170,JY.bt[11].y1+4;
 JY.bt[21]={id=21,x1=x,y1=y,x2=x+45,y2=y+28,tx=x+31-8,ty=y+14,txt="轻内",pic1=135,pic2=136,pic3=137,pic4=138,sp=0,enable=true,show=false};
 x,y=90+220,JY.bt[11].y1+4;
 JY.bt[22]={id=22,x1=x,y1=y,x2=x+45,y2=y+28,tx=x+31-8,ty=y+14,txt="特技",pic1=135,pic2=136,pic3=137,pic4=138,sp=0,enable=true,show=false};
 x,y=90-30,JY.bt[11].y1+4;
 JY.bt[23]={id=23,x1=x,y1=y,x2=x+45,y2=y+28,tx=x+31-8,ty=y+14,txt="武功",pic1=135,pic2=136,pic3=137,pic4=138,sp=0,enable=true,show=false};
 x,y=90-80,JY.bt[11].y1+4;
 JY.bt[16]={id=16,x1=x,y1=y,x2=x+45,y2=y+28,tx=x+31-8,ty=y+14,txt="统计",pic1=135,pic2=136,pic3=137,pic4=138,sp=0,enable=true,show=false};
 --地图选择界面 关闭按钮
 x,y=183,650,JY.bt[11].y1;
 JY.bt[13]={id=13,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="关闭",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=false};
 --战绩界面 关闭按钮
 x,y=183,JY.bt[11].y1;
 JY.bt[14]={id=14,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="关闭",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=false};
 --设定界面 关闭按钮
 x,y=183,JY.bt[11].y1;
 JY.bt[15]={id=15,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="关闭",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=false};
 --统计/成就界面 关闭按钮
 --称号选择界面 关闭按钮
 x,y=183,650,JY.bt[11].y1;
 JY.bt[17]={id=17,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="关闭",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=false};
 --武器选择界面 关闭按钮
 x,y=183,650,JY.bt[11].y1;
 JY.bt[18]={id=18,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="卸下",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=false};
 
 --人物属性初始化
 x,y=52,JY.bt[11].y1;
 JY.bt[31]={id=31,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="自动姓名",pic1=160,pic2=161,pic3=162,pic4=163,sp=0,enable=true,show=false};
 x=x+87;
 JY.bt[32]={id=32,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="手动更名",pic1=160,pic2=161,pic3=162,pic4=163,sp=0,enable=true,show=false};
 x=x+87;
 JY.bt[33]={id=33,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="重置属性",pic1=160,pic2=161,pic3=162,pic4=163,sp=0,enable=true,show=false};
 x=x+87;
 JY.bt[34]={id=34,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="完成",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=false};
 x,y=45+3,JY.bt[11].y1-272+22;
 JY.bt[35]={id=35,x1=x,y1=y,x2=x+64,y2=y+80,tx=x,ty=y,txt="",pic1=999,pic2=999,pic3=999,pic4=999,sp=0,enable=true,show=false};
 
 --设定 开启/关闭
 x,y=220,JY.bt[11].y1-230;
 JY.bt[81]={id=81,x1=x,y1=y,x2=x+70,y2=y+24,tx=x+36,ty=y+14,txt="开启",pic1=175,pic2=176,pic3=177,pic4=178,sp=0,enable=true,show=false};
 x=x+80;
 JY.bt[82]={id=82,x1=x,y1=y,x2=x+70,y2=y+24,tx=x+36,ty=y+14,txt="关闭",pic1=175,pic2=176,pic3=177,pic4=178,sp=0,enable=true,show=false};
 x,y=220,y+30;
 JY.bt[83]={id=83,x1=x,y1=y,x2=x+70,y2=y+24,tx=x+36,ty=y+14,txt="开启",pic1=175,pic2=176,pic3=177,pic4=178,sp=0,enable=true,show=false};
 x=x+80;
 JY.bt[84]={id=84,x1=x,y1=y,x2=x+70,y2=y+24,tx=x+36,ty=y+14,txt="关闭",pic1=175,pic2=176,pic3=177,pic4=178,sp=0,enable=true,show=false};
 x,y=220,y+30;
 JY.bt[87]={id=87,x1=x,y1=y,x2=x+70,y2=y+24,tx=x+36,ty=y+14,txt="开启",pic1=175,pic2=176,pic3=177,pic4=178,sp=0,enable=true,show=false};
 x=x+80;
 JY.bt[88]={id=88,x1=x,y1=y,x2=x+70,y2=y+24,tx=x+36,ty=y+14,txt="关闭",pic1=175,pic2=176,pic3=177,pic4=178,sp=0,enable=true,show=false};
 x,y=220+4,y+40;
 JY.bt[92]={id=92,x1=x,y1=y,x2=x+62,y2=y+28,tx=x+26-2,ty=y+14,txt="备份",pic1=135,pic2=136,pic3=137,pic4=138,sp=0,enable=true,show=false};
 x,y=220+86,y;
 JY.bt[93]={id=93,x1=x,y1=y,x2=x+62,y2=y+28,tx=x+26-2,ty=y+14,txt="恢复",pic1=135,pic2=136,pic3=137,pic4=138,sp=0,enable=true,show=false};
 x,y=220,y+50;
 JY.bt[85]={id=85,x1=x,y1=y,x2=x+70,y2=y+24,tx=x+36,ty=y+14,txt="开启",pic1=175,pic2=176,pic3=177,pic4=178,sp=0,enable=true,show=false};
 x=x+80;
 JY.bt[86]={id=86,x1=x,y1=y,x2=x+70,y2=y+24,tx=x+36,ty=y+14,txt="关闭",pic1=175,pic2=176,pic3=177,pic4=178,sp=0,enable=false,show=false};
 x,y=220+4,y+40;
 JY.bt[91]={id=91,x1=x,y1=y,x2=x+62,y2=y+28,tx=x+26-2,ty=y+14,txt="重生",pic1=135,pic2=136,pic3=137,pic4=138,sp=0,enable=true,show=false};
 
 --武功列表
 for i=1,10 do
 y=JY.bt[11].y1-262+24*i;
 x=194-32+5;
 JY.bt[100+i*2-1]={id=100+i*2-1,x1=x,y1=y,x2=x+98,y2=y+26,tx=x+49+18,ty=y+13-3,txt="",pic1=140,pic2=141,pic3=142,pic4=143,kfid=0,sp=0,enable=true,show=false};
 x=294+10;
 JY.bt[100+i*2]={id=100+i*2,x1=x,y1=y,x2=x+98,y2=y+26,tx=x+49+18,ty=y+13-3,txt="",pic1=140,pic2=141,pic3=142,pic4=143,kfid=0,sp=0,enable=true,show=false};
 end
 --上一页/下一页 武功
 x,y=200,JY.bt[11].y1-262;--,98;
 JY.bt[121]={id=121,x1=x,y1=y,x2=x+30,y2=y+30,tx=x+15,ty=y+15,txt="",pic1=150,pic2=151,pic3=152,pic4=153,sp=0,enable=false,show=false};
 x=356;
 JY.bt[122]={id=122,x1=x,y1=y,x2=x+30,y2=y+30,tx=x+15,ty=y+15,txt="",pic1=155,pic2=156,pic3=157,pic4=158,sp=0,enable=false,show=false};
 --上一页/下一页 LOG
 x,y=240,JY.bt[11].y1-266;--94;
 JY.bt[123]={id=123,x1=x,y1=y,x2=x+30,y2=y+30,tx=x+15,ty=y+15,txt="",pic1=150,pic2=151,pic3=152,pic4=153,sp=0,enable=false,show=false};
 x=368;
 JY.bt[124]={id=124,x1=x,y1=y,x2=x+30,y2=y+30,tx=x+15,ty=y+15,txt="",pic1=155,pic2=156,pic3=157,pic4=158,sp=0,enable=false,show=false};
 
 --自由加点
 x,y=350,JY.bt[11].y1-48;
 JY.bt[131]={id=131,x1=x-10,y1=y,x2=x+8,y2=y+18,tx=x,ty=y+9,txt="+",pic1=165,pic2=166,pic3=167,pic4=168,sp=0,enable=false,show=false}; --福缘
 y=y-21;
 JY.bt[132]={id=132,x1=x-10,y1=y,x2=x+8,y2=y+18,tx=x,ty=y+9,txt="+",pic1=165,pic2=166,pic3=167,pic4=168,sp=0,enable=false,show=false}; --悟性
 y=y-21;
 JY.bt[133]={id=133,x1=x-10,y1=y,x2=x+8,y2=y+18,tx=x,ty=y+9,txt="+",pic1=165,pic2=166,pic3=167,pic4=168,sp=0,enable=false,show=false}; --机敏
 y=y-21;
 JY.bt[134]={id=134,x1=x-10,y1=y,x2=x+8,y2=y+18,tx=x,ty=y+9,txt="+",pic1=165,pic2=166,pic3=167,pic4=168,sp=0,enable=false,show=false}; --根骨
 y=y-21;
 JY.bt[135]={id=135,x1=x-10,y1=y,x2=x+8,y2=y+18,tx=x,ty=y+9,txt="+",pic1=165,pic2=166,pic3=167,pic4=168,sp=0,enable=false,show=false}; --膂力
 y=y-21*4;
 JY.bt[136]={id=136,x1=x-10,y1=y,x2=x+8,y2=y+18,tx=x,ty=y+9,txt="+",pic1=165,pic2=166,pic3=167,pic4=168,sp=0,enable=false,show=false}; --内力
 y=y-21;
 JY.bt[137]={id=137,x1=x-10,y1=y,x2=x+8,y2=y+18,tx=x,ty=y+9,txt="+",pic1=165,pic2=166,pic3=167,pic4=168,sp=0,enable=false,show=false}; --生命
 
 --地图/称号列表
 for i=1,24 do
 y=JY.bt[11].y1-272+38*i;
 x=51-50;
 JY.bt[140+i*4-3]={id=140+i*4-3,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42+15,ty=y+17,txt="",pic1=210,pic2=211,pic3=212,pic4=213,mapid=0,sp=0,enable=true,show=false};
 x=x+88+24;
 JY.bt[140+i*4-2]={id=140+i*4-2,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42+15,ty=y+17,txt="",pic1=210,pic2=211,pic3=212,pic4=213,mapid=0,sp=0,enable=true,show=false};
 x=x+88+24;
 JY.bt[140+i*4-1]={id=140+i*4-1,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42+15,ty=y+17,txt="",pic1=210,pic2=211,pic3=212,pic4=213,mapid=0,sp=0,enable=true,show=false};
 x=x+88+24;
 JY.bt[140+i*4]={id=140+i*4,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42+15,ty=y+17,txt="",pic1=210,pic2=211,pic3=212,pic4=213,mapid=0,sp=0,enable=true,show=false};
 end
 
 --是/否
 x,y=137,310;
 JY.bt[198]={id=198,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="是",pic1=160,pic2=161,pic3=162,pic4=163,sp=0,event=0,enable=true,show=false};
 x=226;
 --退出
 JY.bt[199]={id=199,x1=x,y1=y,x2=x+84,y2=y+36,tx=x+42,ty=y+17,txt="否",pic1=130,pic2=131,pic3=132,pic4=133,sp=0,enable=true,show=false};
end
function ButtonEvent()
 JY.current=0;
 JY.HELPINDEX=0;
 JY.hold=false;
 for i,v in pairs(JY.bt) do
 if v.show then
 if v.enable then
 if MOUSE.CLICK(v.x1,v.y1,v.x2,v.y2) then
 if v.id==1 then --属性
 PlayWavE(0);
 OpenPersonStatus();
 elseif v.id==2 then --武器
 PlayWavE(0);
 OpenWeaponList();
 elseif v.id==3 then --称号
 PlayWavE(0);
 OpenTitleList();
 --OpenRecord();
 elseif v.id==4 then --战绩
 PlayWavE(0);
 OpenLog();
 elseif v.id==5 then --Boss
 PlayWavE(0);
 JY.Base["当前事件"]=JY.Map[JY.Base["当前地图"]]["事件"];
 if JY.Base["当前事件"]>0 then
 JY.CENTER_MSG="** 即将挑战Boss **";
 end
 SetMainMenu();
 elseif v.id==6 then --场景
 PlayWavE(0);
 OpenMapList();
 elseif v.id==7 then --设定
 PlayWavE(0);
 OpenSetting();
 elseif v.id==8 then --退出
 PlayWavE(0);
 JY.bt[198].event=1;
 JY.bt[198].show=true;
 JY.bt[199].show=true;
 SetMainMenu();
 elseif v.id==10 then
	PlayWavE(0);
	JY.SPD=JY.SPD*2;
		if JY.SPD>1024 then
		JY.SPD=1;
	end
	v.txt="X"..JY.SPD;
 elseif v.id==11 then
 PlayWavE(0);
 ClosePersonStatus();
 elseif v.id==12 then
 PlayWavE(0);
 if JY.PersonStatusPage==0 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=1;
 OpenKungfuList();
 elseif JY.PersonStatusPage==2 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=1;
 OpenKungfuList();  
elseif JY.Base["分类"]==1 then
 CloseKungfuList();
else
 CloseKungfuList();
 JY.PersonStatusPage=1;
 JY.Base["分类"]=1;
 OpenKungfuList();
 end
 elseif v.id==13 then
 PlayWavE(0);
 CloseMapList();
 elseif v.id==14 then
 PlayWavE(0);
 CloseLog();
 elseif v.id==15 then
 PlayWavE(0);
 CloseSetting();
 elseif v.id==16 then
 PlayWavE(0);
 if JY.PersonStatusPage==0 then
 JY.PersonStatusPage=2;
 elseif JY.PersonStatusPage==1 then
 CloseKungfuList();
 JY.PersonStatusPage=2;
 else
 JY.PersonStatusPage=0;
 end
 SetFreePoint();
 elseif v.id==17 then
 PlayWavE(0);
 CloseTitleList();
 elseif v.id==18 then
 PlayWavE(0);
 JY.Person[0]["武器"]=0;
 CloseWeaponList();
 elseif v.id==19 then
 PlayWavE(0);
 if JY.PersonStatusPage==0 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=2;
 OpenKungfuList();
 elseif JY.PersonStatusPage==2 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=2;
 OpenKungfuList();  
elseif JY.Base["分类"]==2 then
 CloseKungfuList();
else
 CloseKungfuList();
 JY.PersonStatusPage=1;
 JY.Base["分类"]=2;
 OpenKungfuList();
 end
 elseif v.id==20 then
 PlayWavE(0);
 if JY.PersonStatusPage==0 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=3;
 OpenKungfuList();
 elseif JY.PersonStatusPage==2 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=3;
 OpenKungfuList();  
elseif JY.Base["分类"]==3 then
 CloseKungfuList();
else
 CloseKungfuList();
 JY.PersonStatusPage=1;
 JY.Base["分类"]=3;
 OpenKungfuList();
 end
 elseif v.id==21 then
 PlayWavE(0);
 if JY.PersonStatusPage==0 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=4;
 OpenKungfuList();
 elseif JY.PersonStatusPage==2 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=4;
 OpenKungfuList();  
elseif JY.Base["分类"]==4 then
 CloseKungfuList();
else
 CloseKungfuList();
 JY.PersonStatusPage=1;
 JY.Base["分类"]=4;
 OpenKungfuList();
 end
 elseif v.id==22 then
 PlayWavE(0);
 if JY.PersonStatusPage==0 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=5;
 OpenKungfuList();
 elseif JY.PersonStatusPage==2 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=5;
 OpenKungfuList();  
elseif JY.Base["分类"]==5 then
 CloseKungfuList();
else
 CloseKungfuList();
 JY.PersonStatusPage=1;
 JY.Base["分类"]=5;
 OpenKungfuList();
 end
 elseif v.id==23 then
 PlayWavE(0);
 if JY.PersonStatusPage==0 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=6;
 OpenKungfuList();
 elseif JY.PersonStatusPage==2 then
 JY.PersonStatusPage=1;
 JY.Base["分类"]=6;
 OpenKungfuList();  
elseif JY.Base["分类"]==6 then
 CloseKungfuList();
else
 CloseKungfuList();
 JY.PersonStatusPage=1;
 JY.Base["分类"]=6;
 OpenKungfuList();
 end
 elseif v.id==31 then
 PlayWavE(0);
 JY.Person[JY.pid]["名称"]=IniName();
 elseif v.id==32 then
 PlayWavE(0);
 for ii,vv in pairs({31,32,33,34,35}) do
 JY.bt[vv].enable=false;
 end
 local str=JY.Person[JY.pid]["名称"];
 local str2=JY.Person[JY.pid]["外号"];
 JY.Person[JY.pid]["名称"]="";
 JY.Person[JY.pid]["外号"]="";
 JY.CENTER_MSG="";
 JY.Person[JY.pid]["名称"]=Input(str);
 JY.CENTER_MSG="*1. 本游戏为放置类游戏, 基本不需要操作*2. 本游戏为自动存档, 每分钟自动保存*3. 选择不同的场景, 将面对强弱各异的对手*4. 人物等级上限为100级*5. 武功修炼完全随机, 等级上限为100级*6. 大武侠(dawuxia.net)祝游戏愉快*";
 JY.Person[JY.pid]["外号"]=str2;
 for ii,vv in pairs({31,32,33,34,35}) do
 JY.bt[vv].enable=true;
 end
 elseif v.id==33 then
 PlayWavE(0);
 ResetAttrib();
 elseif v.id==34 then
 PlayWavE(0);
 ClosePersonIni();
 elseif v.id==35 then
 PlayWavE(0);
 JY.Person[JY.pid]["头像"]=JY.Person[JY.pid]["头像"]+1;
 if JY.Person[JY.pid]["头像"]>85 then
 JY.Person[JY.pid]["头像"]=78;
 end
 elseif v.id==91 then
 PlayWavE(0);
 CloseSetting();
 JY.bt[198].event=2;
 JY.bt[198].show=true;
 JY.bt[199].show=true;
 SetMainMenu();
 elseif v.id==92 then
 PlayWavE(0);
 CloseSetting();
 JY.bt[198].event=3;
 JY.bt[198].show=true;
 JY.bt[199].show=true;
 SetMainMenu();
 elseif v.id==93 then
 PlayWavE(0);
 CloseSetting();
 JY.bt[198].event=4;
 JY.bt[198].show=true;
 JY.bt[199].show=true;
 SetMainMenu();
 elseif between(v.id,101,120) then
 SetKungfu(v.kfid);
 elseif v.id==121 then
 PlayWavE(0);
 JY.KF_CURRENT_PAGE=limitX(JY.KF_CURRENT_PAGE-1,1,JY.KF_MAX_PAGE);
 QueryKungfuList();
 JY.bt[121].enable=JY.KF_CURRENT_PAGE>1;
 JY.bt[122].enable=JY.KF_CURRENT_PAGE<JY.KF_MAX_PAGE;
 elseif v.id==122 then
 PlayWavE(0);
 JY.KF_CURRENT_PAGE=limitX(JY.KF_CURRENT_PAGE+1,1,JY.KF_MAX_PAGE);
 QueryKungfuList();
 JY.bt[121].enable=JY.KF_CURRENT_PAGE>1;
 JY.bt[122].enable=JY.KF_CURRENT_PAGE<JY.KF_MAX_PAGE;
 elseif v.id==123 then
 PlayWavE(0);
 JY.LOG_CURRENT_PAGE=limitX(JY.LOG_CURRENT_PAGE-1,1,JY.LOG_MAX_PAGE);
 JY.bt[123].enable=JY.LOG_CURRENT_PAGE>1;
 JY.bt[124].enable=JY.LOG_CURRENT_PAGE<JY.LOG_MAX_PAGE;
 elseif v.id==124 then
 PlayWavE(0);
 JY.LOG_CURRENT_PAGE=limitX(JY.LOG_CURRENT_PAGE+1,1,JY.LOG_MAX_PAGE);
 JY.bt[123].enable=JY.LOG_CURRENT_PAGE>1;
 JY.bt[124].enable=JY.LOG_CURRENT_PAGE<JY.LOG_MAX_PAGE;
 elseif v.id==131 then --福缘
 PlayWavE(0);
 JY.Person[JY.pid]["福缘"]=limitX(JY.Person[JY.pid]["福缘"]+1,1,20);
 InsertLog(2,7,JY.Person[JY.pid]["福缘"]);
 AddFreePT(-1);
 SetFreePoint();
 elseif v.id==132 then --悟性
 PlayWavE(0);
 JY.Person[JY.pid]["悟性"]=limitX(JY.Person[JY.pid]["悟性"]+1,1,20);
 InsertLog(2,6,JY.Person[JY.pid]["悟性"]);
 AddFreePT(-1);
 SetFreePoint();
 elseif v.id==133 then --机敏
 PlayWavE(0);
 JY.Person[JY.pid]["机敏"]=limitX(JY.Person[JY.pid]["机敏"]+1,1,20);
 InsertLog(2,5,JY.Person[JY.pid]["机敏"]);
 AddFreePT(-1);
 SetFreePoint();
 elseif v.id==134 then --根骨
 PlayWavE(0);
 JY.Person[JY.pid]["根骨"]=limitX(JY.Person[JY.pid]["根骨"]+1,1,20);
 InsertLog(2,4,JY.Person[JY.pid]["根骨"]);
 AddFreePT(-1);
 SetFreePoint();
 elseif v.id==135 then --膂力
 PlayWavE(0);
 JY.Person[JY.pid]["膂力"]=limitX(JY.Person[JY.pid]["膂力"]+1,1,20);
 InsertLog(2,3,JY.Person[JY.pid]["膂力"]);
 AddFreePT(-1);
 SetFreePoint();
 elseif v.id==136 then --内力
 PlayWavE(0);
 JY.Person[JY.pid]["内力最大值"]=limitX(JY.Person[JY.pid]["内力最大值"]+80,1,30000);
 InsertLog(2,2,JY.Person[JY.pid]["内力最大值"]);
 AddFreePT(-1);
 SetFreePoint();
 elseif v.id==137 then --生命
 PlayWavE(0);
 JY.Person[JY.pid]["生命最大值"]=limitX(JY.Person[JY.pid]["生命最大值"]+80,1,30000);
 InsertLog(2,1,JY.Person[JY.pid]["生命最大值"]);
 AddFreePT(-1);
 SetFreePoint();
 elseif between(v.id,141,188) then
 PlayWavE(0);
 if JY.bt[13].show then
 if v.mapid~=JY.Base["当前场景"] then
 JY.Base["下个场景"]=v.mapid;
 JY.CENTER_MSG="** 即将进入"..JY.Force[v.mapid]["名称"].." **";
 end
 CloseMapList();
 elseif JY.bt[17].show then
 JY.Person[0]["外号"]=JY.Item[v.mapid]["名称"];
 CloseTitleList();
 elseif JY.bt[18].show then
 JY.Person[0]["武器"]=100+v.mapid;
 CloseWeaponList();
 end
 elseif v.id==198 then
 PlayWavE(0);
 JY.bt[198].show=false;
 JY.bt[199].show=false;
 if v.event==1 then
 lib.Delay(350);
 os.exit();
 elseif v.event==2 and JY.Person[0]["等级"]>limitX(JY.Base["重生次数"]*9+8,8,98) then
 JY.Base["指令"]=1;
 JY.CENTER_MSG="** 即将转世重生 **";
 elseif v.event==2 and JY.Person[0]["等级"]<limitX(JY.Base["重生次数"]*9+9,9,99) then
 JY.Base["指令"]=5;
 JY.CENTER_MSG="** 即将投胎转世 **";
 elseif v.event==3 then
 JY.Base["指令"]=3; 
 JY.CENTER_MSG="** 即将保存文件ESAVE1 **";
 elseif v.event==4 then
 JY.Base["指令"]=4;
 JY.CENTER_MSG="** 即将读取文件ESAVE1 **";
 end
 v.event=0;
 SetMainMenu();
 elseif v.id==199 then
 PlayWavE(0);
 JY.bt[198].show=false;
 JY.bt[199].show=false;
 SetMainMenu();
 end
 return;
 elseif MOUSE.HOLD(v.x1,v.y1,v.x2,v.y2) then
 JY.current=v.id;
 JY.hold=true;
 if v.id==81 and (not v.select) then
 v.select=true;
 JY.bt[82].select=false;
 JY.Base["开启音效"]=1;
 PlayWavE(0);
 elseif v.id==82 and (not v.select) then
 v.select=true;
 JY.bt[81].select=false;
 JY.Base["开启音效"]=0;
 PlayWavE(0);
 elseif v.id==83 and (not v.select) then
 v.select=true;
 JY.bt[84].select=false;
 JY.Base["修炼备选"]=1;
 PlayWavE(0);
 elseif v.id==84 and (not v.select) then
 v.select=true;
 JY.bt[83].select=false;
 JY.Base["修炼备选"]=0;
 PlayWavE(0);
 elseif v.id==85 and (not v.select) then
 v.select=true;
 JY.bt[86].select=false;
 JY.bt[86].enable=false;
 JY.Base["开启专家"]=1;
 JY.Base["数据版本号"]="专家难度";
 if JY.Base["开启专家"]>0 and JY.Base["战斗次数"]>JY.Base["胜利次数"] then
    JY.Base["指令"]=2;
 end
 PlayWavE(0);
 elseif v.id==86 and (not v.select) then
 v.select=true;
 JY.bt[85].select=false;
 JY.Base["开启专家"]=0;
 JY.Base["数据版本号"]="普通难度";
 PlayWavE(0);
 elseif v.id==87 and (not v.select) then
 v.select=true;
 JY.bt[88].select=false;
 JY.Base["开启音乐"]=1;
 PlayWavE(0);
 elseif v.id==88 and (not v.select) then
 v.select=true;
 JY.bt[87].select=false;
 JY.Base["开启音乐"]=0;
 PlayWavE(0);
 end
 return;
 elseif MOUSE.IN(v.x1,v.y1,v.x2,v.y2) then
 JY.current=v.id;
 if v.enable and v.help~=nil then
 JY.HELPINDEX=v.id;
 end
 return;
 end
 else
 if MOUSE.CLICK(v.x1,v.y1,v.x2,v.y2) then
 PlayWavE(1);
 return;
 end
 end
 end
 end
end
function SetMainMenu()
 local flag=true;
 for i,v in pairs({11,12,13,14,15,16,17,18,34,198,199}) do
 if JY.bt[v].show then
 flag=false;
 break;
 end
 end
 for i,v in pairs({1,2,3,4,5,6,7,8}) do
 JY.bt[v].enable=flag;
 end
 if JY.Base["下个场景"]>0 then --已经决定换地图
 JY.bt[5].enable=false;
 JY.bt[6].enable=false;
 end
 if JY.Base["倒计时"]>0 then --不满足条件时，
 JY.bt[5].enable=false;
 end
 if JY.Base["当前事件"]>0 then --已经开启了Boss战
 JY.bt[5].enable=false;
 JY.bt[6].enable=false;
 end
 if JY.Base["指令"]>0 then --等待执行指令
 JY.bt[5].enable=false;
 JY.bt[6].enable=false;
 end
end
function OpenPersonStatus()
 if JY.bt[198].show then
 return;
 end
 JY.bt[11].show=true;
 JY.bt[12].show=true;
 JY.bt[19].show=true;
 JY.bt[20].show=true;
 JY.bt[21].show=true;
 JY.bt[22].show=true;
 JY.bt[23].show=true;
 JY.bt[16].show=true;
 JY.PersonStatusPage=0;
 SetMainMenu();
 SetFreePoint();
end
function ClosePersonStatus()
 if JY.bt[198].show then
 return;
 end
 JY.bt[11].show=false;
 JY.bt[12].show=false;
 JY.bt[19].show=false;
 JY.bt[20].show=false;
 JY.bt[21].show=false;
 JY.bt[22].show=false;
 JY.bt[23].show=false; 
 JY.bt[16].show=false;
 CloseKungfuList();
 SetMainMenu();
 SetFreePoint();
end
function OpenKungfuList()
 local num_per_page=20;
 local total_num=0;
 if JY.Base["分类"]==1 then
 for i=1,JY.KungfuNum-1 do
 if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==1 then
		total_num=total_num+1;
 end
 end
 end
 elseif JY.Base["分类"]==2 then
 for i=1,JY.KungfuNum-1 do
 if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==2 then
		total_num=total_num+1;
 end
 end
 end
 for i=1,JY.KungfuNum-1 do
 if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==3 then
		total_num=total_num+1;
 end
 end
 end
 elseif JY.Base["分类"]==3 then
 for i=1,JY.KungfuNum-1 do
 if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==4 then
		total_num=total_num+1;
 end
 end
 end
 for i=1,JY.KungfuNum-1 do
 if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==5 then
		total_num=total_num+1;
 end
 end
 end
 elseif JY.Base["分类"]==4 then
 for i=1,JY.KungfuNum-1 do
 if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==7 then
		total_num=total_num+1;
 end
 end
 end
 for i=1,JY.KungfuNum-1 do
 if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==8 then
		total_num=total_num+1;
 end
 end
 end
 elseif JY.Base["分类"]==5 then
 for i=1,JY.KungfuNum-1 do
 if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==9 then
		total_num=total_num+1;
 end
 end
 end
 elseif JY.Base["分类"]==6 then
 for i=1,JY.KungfuNum-1 do
 if JY.Base["武功等级"..i]>0 then
		total_num=total_num+1;
 end
 end
 end 
 JY.KF_MAX_PAGE=1+math.modf((total_num-1)/num_per_page);
 JY.KF_CURRENT_PAGE=1;
 JY.PersonStatusPage=1;
 JY.bt[121].show=true;
 JY.bt[122].show=true;
 JY.bt[121].enable=JY.KF_CURRENT_PAGE>1;
 JY.bt[122].enable=JY.KF_CURRENT_PAGE<JY.KF_MAX_PAGE;
 QueryKungfuList();
 SetFreePoint();
end
function CloseKungfuList()
 local num_per_page=20;
 JY.KF_MAX_PAGE=0;
 JY.KF_CURRENT_PAGE=0;
 JY.PersonStatusPage=0;
 JY.bt[121].show=false;
 JY.bt[122].show=false;
 for i=1,num_per_page do
 JY.bt[100+i].txt="";
 JY.bt[100+i].show=false;
 end
 SetFreePoint();
end
function QueryKungfuList()
 local num_per_page=20;
 local lv=0; 
 local num=0;
 local start=num_per_page*(JY.KF_CURRENT_PAGE-1);
 for i=1,num_per_page do
 JY.bt[100+i].txt="";
 JY.bt[100+i].show=false;
 end
 local fl=JY.Base["分类"];

 if fl==1 then
 for i=1,JY.KungfuNum-1 do
	if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==1 then
		lv=JY.Base["武功等级"..i];
 if lv>0 then
 num=num+1;
 lv=lv+5;
 if between(num,start+1,start+num_per_page) then
 JY.bt[100+num-start].txt=string.format("%-14s%02d",JY.Kungfu[i]["名称"],JY.Base["武功等级"..i]);
 JY.bt[100+num-start].kfid=i;
 JY.bt[100+num-start].help=string.format("%-18sLv%02d   MAX%02d*%s*伤害: %4d 命中: %4d*格挡: %4d 闪避: %4d",
 JY.Kungfu[i]["名称"],JY.Base["武功等级"..i],JY.Base["武功等级上限"..i],GenTalkString(JY.Kungfu[i]["说明"],15),
 math.floor(JY.Kungfu[i].Damage*lv/10),math.floor(JY.Kungfu[i].AP*lv/10),
 math.floor(JY.Kungfu[i].PP*lv/10),math.floor(JY.Kungfu[i].DP*lv/10));
 JY.bt[100+num-start].helppic=180+JY.Kungfu[i].Lv;
 JY.bt[100+num-start].show=true;
 end
 end
 end
 end
 end
 elseif fl==2 then
 for i=1,JY.KungfuNum-1 do
	if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==2 then
 local lv=JY.Base["武功等级"..i];
 if lv>0 then
 num=num+1;
 lv=lv+5;
 if between(num,start+1,start+num_per_page) then
 JY.bt[100+num-start].txt=string.format("%-14s%02d",JY.Kungfu[i]["名称"],JY.Base["武功等级"..i]);
 JY.bt[100+num-start].kfid=i;
 JY.bt[100+num-start].help=string.format("%-18sLv%02d   MAX%02d*%s*伤害: %4d 命中: %4d*格挡: %4d 闪避: %4d",
 JY.Kungfu[i]["名称"],JY.Base["武功等级"..i],JY.Base["武功等级上限"..i],GenTalkString(JY.Kungfu[i]["说明"],15),
 math.floor(JY.Kungfu[i].Damage*lv/10),math.floor(JY.Kungfu[i].AP*lv/10),
 math.floor(JY.Kungfu[i].PP*lv/10),math.floor(JY.Kungfu[i].DP*lv/10));
 JY.bt[100+num-start].helppic=180+JY.Kungfu[i].Lv;
 JY.bt[100+num-start].show=true;
 end
 end
 end
 end
 end
 for i=1,JY.KungfuNum-1 do
	if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==3 then
 local lv=JY.Base["武功等级"..i];
 if lv>0 then
 num=num+1;
 lv=lv+5;
 if between(num,start+1,start+num_per_page) then
 JY.bt[100+num-start].txt=string.format("%-14s%02d",JY.Kungfu[i]["名称"],JY.Base["武功等级"..i]);
 JY.bt[100+num-start].kfid=i;
 JY.bt[100+num-start].help=string.format("%-18sLv%02d   MAX%02d*%s*伤害: %4d 命中: %4d*格挡: %4d 闪避: %4d",
 JY.Kungfu[i]["名称"],JY.Base["武功等级"..i],JY.Base["武功等级上限"..i],GenTalkString(JY.Kungfu[i]["说明"],15),
 math.floor(JY.Kungfu[i].Damage*lv/10),math.floor(JY.Kungfu[i].AP*lv/10),
 math.floor(JY.Kungfu[i].PP*lv/10),math.floor(JY.Kungfu[i].DP*lv/10));
 JY.bt[100+num-start].helppic=180+JY.Kungfu[i].Lv;
 JY.bt[100+num-start].show=true;
 end
 end
 end
 end
 end
 elseif fl==3 then
 for i=1,JY.KungfuNum-1 do
	if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==4 then
 local lv=JY.Base["武功等级"..i];
 if lv>0 then
 num=num+1;
 lv=lv+5;
 if between(num,start+1,start+num_per_page) then
 JY.bt[100+num-start].txt=string.format("%-14s%02d",JY.Kungfu[i]["名称"],JY.Base["武功等级"..i]);
 JY.bt[100+num-start].kfid=i;
 JY.bt[100+num-start].help=string.format("%-18sLv%02d   MAX%02d*%s*伤害: %4d 命中: %4d*格挡: %4d 闪避: %4d",
 JY.Kungfu[i]["名称"],JY.Base["武功等级"..i],JY.Base["武功等级上限"..i],GenTalkString(JY.Kungfu[i]["说明"],15),
 math.floor(JY.Kungfu[i].Damage*lv/10),math.floor(JY.Kungfu[i].AP*lv/10),
 math.floor(JY.Kungfu[i].PP*lv/10),math.floor(JY.Kungfu[i].DP*lv/10));
 JY.bt[100+num-start].helppic=180+JY.Kungfu[i].Lv;
 JY.bt[100+num-start].show=true;
 end
 end
 end
 end
 end
 for i=1,JY.KungfuNum-1 do
	if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==5 then
 local lv=JY.Base["武功等级"..i];
 if lv>0 then
 num=num+1;
 lv=lv+5;
 if between(num,start+1,start+num_per_page) then
 JY.bt[100+num-start].txt=string.format("%-14s%02d",JY.Kungfu[i]["名称"],JY.Base["武功等级"..i]);
 JY.bt[100+num-start].kfid=i;
 JY.bt[100+num-start].help=string.format("%-18sLv%02d   MAX%02d*%s*伤害: %4d 命中: %4d*格挡: %4d 闪避: %4d",
 JY.Kungfu[i]["名称"],JY.Base["武功等级"..i],JY.Base["武功等级上限"..i],GenTalkString(JY.Kungfu[i]["说明"],15),
 math.floor(JY.Kungfu[i].Damage*lv/10),math.floor(JY.Kungfu[i].AP*lv/10),
 math.floor(JY.Kungfu[i].PP*lv/10),math.floor(JY.Kungfu[i].DP*lv/10));
 JY.bt[100+num-start].helppic=180+JY.Kungfu[i].Lv;
 JY.bt[100+num-start].show=true;
 end
 end
 end
 end
 end
 elseif fl==4 then
 for i=1,JY.KungfuNum-1 do
	if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==7 then
 local lv=JY.Base["武功等级"..i];
 if lv>0 then
 num=num+1;
 lv=lv+5;
 if between(num,start+1,start+num_per_page) then
 JY.bt[100+num-start].txt=string.format("%-14s%02d",JY.Kungfu[i]["名称"],JY.Base["武功等级"..i]);
 JY.bt[100+num-start].kfid=i;
 JY.bt[100+num-start].help=string.format("%-18sLv%02d   MAX%02d*%s*伤害: %4d 命中: %4d*格挡: %4d 闪避: %4d",
 JY.Kungfu[i]["名称"],JY.Base["武功等级"..i],JY.Base["武功等级上限"..i],GenTalkString(JY.Kungfu[i]["说明"],15),
 math.floor(JY.Kungfu[i].Damage*lv/10),math.floor(JY.Kungfu[i].AP*lv/10),
 math.floor(JY.Kungfu[i].PP*lv/10),math.floor(JY.Kungfu[i].DP*lv/10));
 JY.bt[100+num-start].helppic=180+JY.Kungfu[i].Lv;
 JY.bt[100+num-start].show=true;
 end
 end
 end
 end
 end
 for i=1,JY.KungfuNum-1 do
	if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==8 then
 local lv=JY.Base["武功等级"..i];
 if lv>0 then
 num=num+1;
 lv=lv+5;
 if between(num,start+1,start+num_per_page) then
 JY.bt[100+num-start].txt=string.format("%-14s%02d",JY.Kungfu[i]["名称"],JY.Base["武功等级"..i]);
 JY.bt[100+num-start].kfid=i;
 JY.bt[100+num-start].help=string.format("%-18sLv%02d   MAX%02d*%s*伤害: %4d 命中: %4d*格挡: %4d 闪避: %4d",
 JY.Kungfu[i]["名称"],JY.Base["武功等级"..i],JY.Base["武功等级上限"..i],GenTalkString(JY.Kungfu[i]["说明"],15),
 math.floor(JY.Kungfu[i].Damage*lv/10),math.floor(JY.Kungfu[i].AP*lv/10),
 math.floor(JY.Kungfu[i].PP*lv/10),math.floor(JY.Kungfu[i].DP*lv/10));
 JY.bt[100+num-start].helppic=180+JY.Kungfu[i].Lv;
 JY.bt[100+num-start].show=true;
 end
 end
 end
 end
 end
 elseif fl==5 then
 for i=1,JY.KungfuNum-1 do
	if JY.Base["武功等级"..i]>0 then
	if JY.Kungfu[i]["类型"]==9 then
 local lv=JY.Base["武功等级"..i];
 if lv>0 then
 num=num+1;
 lv=lv+5;
 if between(num,start+1,start+num_per_page) then
 JY.bt[100+num-start].txt=string.format("%-14s%02d",JY.Kungfu[i]["名称"],JY.Base["武功等级"..i]);
 JY.bt[100+num-start].kfid=i;
 JY.bt[100+num-start].help=string.format("%-18sLv%02d   MAX%02d*%s*伤害: %4d 命中: %4d*格挡: %4d 闪避: %4d",
 JY.Kungfu[i]["名称"],JY.Base["武功等级"..i],JY.Base["武功等级上限"..i],GenTalkString(JY.Kungfu[i]["说明"],15),
 math.floor(JY.Kungfu[i].Damage*lv/10),math.floor(JY.Kungfu[i].AP*lv/10),
 math.floor(JY.Kungfu[i].PP*lv/10),math.floor(JY.Kungfu[i].DP*lv/10));
 JY.bt[100+num-start].helppic=180+JY.Kungfu[i].Lv;
 JY.bt[100+num-start].show=true;
 end
 end
 end
 end
 end
 elseif fl==6 then
 for i=1,JY.KungfuNum-1 do
 local lv=JY.Base["武功等级"..i];
 if lv>0 then
 num=num+1;
 lv=lv+5;
 if between(num,start+1,start+num_per_page) then
 JY.bt[100+num-start].txt=string.format("%-14s%02d",JY.Kungfu[i]["名称"],JY.Base["武功等级"..i]);
 JY.bt[100+num-start].kfid=i;
 JY.bt[100+num-start].help=string.format("%-18sLv%02d   MAX%02d*%s*伤害: %4d 命中: %4d*格挡: %4d 闪避: %4d",
 JY.Kungfu[i]["名称"],JY.Base["武功等级"..i],JY.Base["武功等级上限"..i],GenTalkString(JY.Kungfu[i]["说明"],15),
 math.floor(JY.Kungfu[i].Damage*lv/10),math.floor(JY.Kungfu[i].AP*lv/10),
 math.floor(JY.Kungfu[i].PP*lv/10),math.floor(JY.Kungfu[i].DP*lv/10));
 JY.bt[100+num-start].helppic=180+JY.Kungfu[i].Lv;
 JY.bt[100+num-start].show=true;
 end
 end
 end
 end
 end
function OpenMapList()
 JY.bt[13].show=true;
 QueryMapList();
 SetMainMenu();
end
function CloseMapList()
 for i=1,48 do
 JY.bt[140+i].show=false;
 end
 JY.bt[13].show=false;
 SetMainMenu();
end
function QueryMapList()
 for i=1,48 do
 JY.bt[140+i].txt=JY.Force[i]["名称"];
 JY.bt[140+i].help=nil;
 JY.bt[140+i].mapid=i;
 JY.bt[140+i].show=true;
 if JY.Base["开启场景"..i]>0 then
 JY.bt[140+i].enable=true;
 JY.bt[140+i].sp=89+JY.Base["开启场景"..i];
 else
 JY.bt[140+i].enable=false;
 end
 end
end
function OpenTitleList()
 JY.bt[17].show=true;
 QueryTitleList();
 SetMainMenu();
end
function CloseTitleList()
 for i=1,48 do
 JY.bt[140+i].show=false;
 end
 JY.bt[17].show=false;
 SetMainMenu();
end
function QueryTitleList()
 for i=1,48 do
 JY.bt[140+i].mapid=i;
 JY.bt[140+i].show=true;
 if JY.Base["开启称号"..i]>0 then
 JY.bt[140+i].txt=JY.Item[i]["名称"];
 JY.bt[140+i].help=GenTalkString(JY.Item[i]["说明"],15);
 JY.bt[140+i].enable=true;
 JY.bt[140+i].sp=0;
 else
 JY.bt[140+i].txt="----";
 JY.bt[140+i].help=nil;
 JY.bt[140+i].enable=false;
 JY.bt[140+i].sp=0;
 end
 end
end
function OpenWeaponList()
 JY.bt[18].show=true;
 QueryWeaponList();
 SetMainMenu();
end
function CloseWeaponList()
 for i=1,48 do
 JY.bt[140+i].show=false;
 end
 JY.bt[18].show=false;
 SetMainMenu();
end
function QueryWeaponList()
 for i=1,48 do
 JY.bt[140+i].mapid=i;
 JY.bt[140+i].show=true;
 if JY.Base["开启武器"..i]>0 then
 JY.bt[140+i].txt=JY.Item[100+i]["名称"];
 JY.bt[140+i].help=JY.Item[100+i]["名称"].."         "..GenTalkString(	JY.Item[100+i]["类型"],15).."*"..GenTalkString(	JY.Item[100+i]["说明"],15)..string.format("*伤害 %+d 命中 %+d*格挡 %+d 闪避 %+d",
																math.modf(JY.Item[100+i]["伤害"]/10),math.modf(JY.Item[100+i]["命中"]/10),
																math.modf(JY.Item[100+i]["格挡"]/10),math.modf(JY.Item[100+i]["闪避"]/10));
 JY.bt[140+i].enable=true;
 JY.bt[140+i].sp=0;
 else
 JY.bt[140+i].txt="----";
 JY.bt[140+i].help=nil;
 JY.bt[140+i].enable=false;
 JY.bt[140+i].sp=0;
 end
 end
end
function OpenLog()
 JY.bt[14].show=true;
 JY.bt[123].show=true;
 JY.bt[124].show=true;
 local num_per_page=14;
 JY.LOG_MAX_PAGE=1+math.modf((GetLogNum()-1)/num_per_page);
 JY.LOG_CURRENT_PAGE=JY.LOG_MAX_PAGE;
 JY.bt[123].enable=JY.LOG_CURRENT_PAGE>1;
 JY.bt[124].enable=JY.LOG_CURRENT_PAGE<JY.LOG_MAX_PAGE;
 SetMainMenu();
end
function CloseLog()
 JY.bt[14].show=false;
 JY.bt[123].show=false;
 JY.bt[124].show=false;
 SetMainMenu();
end
function OpenSetting()
 JY.bt[15].show=true;
 for i=81,88 do
 JY.bt[i].show=true;
 end
 for i=91,93 do
 JY.bt[i].show=true;
 if JY.Base["指令"]>0 then --等待执行指令
 JY.bt[i].enable=false;
 else
 JY.bt[i].enable=true;
 end
 end
 if JY.Base["开启音效"]>0 then
 JY.bt[81].select=true;
 JY.bt[82].select=false;
 else
 JY.bt[82].select=true;
 JY.bt[81].select=false;
 end
 if JY.Base["修炼备选"]>0 then
 JY.bt[83].select=true;
 JY.bt[84].select=false;
 else
 JY.bt[84].select=true;
 JY.bt[83].select=false;
 end
 if JY.Base["开启音乐"]>0 then
 JY.bt[87].select=true;
 JY.bt[88].select=false;
 else
 JY.bt[88].select=true;
 JY.bt[87].select=false;
 end
 if JY.Base["开启专家"]>0 then
 JY.Base["数据版本号"]="专家难度";
 JY.bt[85].select=true;
 JY.bt[86].select=false;
 if JY.Base["开启专家"]>0 and JY.Base["战斗次数"]>JY.Base["胜利次数"] then
    JY.Base["指令"]=2;
 end
 else
 JY.Base["数据版本号"]="普通难度";
 JY.bt[86].select=true;
 JY.bt[85].select=false;
 end
 JY.bt[10].show=true;
 SetMainMenu();
end
function CloseSetting()
 JY.bt[15].show=false;
 for i=81,88 do
 JY.bt[i].show=false;
 end
 for i=91,93 do
 JY.bt[i].show=false;
 end
 JY.bt[10].show=false;
 SetMainMenu();
end
function OpenRecord()
 JY.bt[16].show=true;
 SetMainMenu();
end
function CloseRecord()
 JY.bt[16].show=false;
 SetMainMenu();
end
function KFBGCK(i)
	local qz;
	for idx=1,7 do
		qz=JY.Lingwu[i]["前置"..idx];
		if qz>0 and JY.Base["武功等级"..qz]==0 then
			return false;
		end
	end
	return true;
end
function OpenPersonIni()
 ClosePersonStatus();
 CloseMapList();
 CloseTitleList();
 CloseLog();
 CloseSetting();
 CloseRecord();
 JY.bt[31].show=true;
 JY.bt[32].show=true;
 JY.bt[33].show=true;
 JY.bt[34].show=true;
 JY.bt[35].show=true;
 JY.CENTER_MSG="*1. 本游戏为放置类游戏, 基本不需要操作*2. 本游戏为自动存档, 每分钟自动保存*3. 选择不同的场景, 将面对强弱各异的对手*4. 人物等级上限为100级*5. 武功修炼完全随机, 等级上限为100级*6. 大武侠(dawuxia.net)祝游戏愉快*";
 SetFreePoint();
 SetMainMenu();
end
function ClosePersonIni()
 if JY.Person[JY.pid]["头像"]==82 or JY.Person[JY.pid]["头像"]==83 or JY.Person[JY.pid]["头像"]==151 then
 JY.Person[JY.pid]["性别"]=1;
 elseif  JY.Person[JY.pid]["头像"]==84 or JY.Person[JY.pid]["头像"]==85 or JY.Person[JY.pid]["头像"]==119 then
 JY.Person[JY.pid]["性别"]=2;
 elseif JY.Person[JY.pid]["头像"]==78 or JY.Person[JY.pid]["头像"]==79 or JY.Person[JY.pid]["头像"]==80 or JY.Person[JY.pid]["头像"]==81 or JY.Person[JY.pid]["头像"]==118 or JY.Person[JY.pid]["头像"]==142 then
 JY.Person[JY.pid]["性别"]=0;
 end
 ClosePersonStatus();
 JY.bt[11].x1=360;
 JY.bt[11].txt="关闭";
 JY.bt[31].show=false;
 JY.bt[32].show=false;
 JY.bt[33].show=false;
 JY.bt[34].show=false;
 JY.bt[35].show=false;
 JY.CENTER_MSG="";
 SetFreePoint();
 SetMainMenu();
 JY.TEXT_BUFF=string.format("\\yellow"..JY.Person[JY.pid]["名称"].."\\white来到这个世界。\\n你目前的武功上限为%d级...\\n",limitX(JY.Base["重生次数"]*10+10,10,100));
 JY.WAIT=1;

 if fileexist(CC.R_GRPFilename[1]) then
 JY.Base["重生次数"]=JY.JCSX[2];
 if JY.JCSX[1]~=0 then
 JY.Base["时"]=JY.JCSX[7];
 JY.Base["分"]=JY.JCSX[8];
 JY.Base["秒"]=JY.JCSX[9];
 end
 end
 if JY.Base["重生次数"]>0 then
 local j=9;
 for i=1,#JY.JCWX do
	j=j+1;
	local s=JY.JCWX[i];
    JY.Base["武功等级上限"..s]=JY.JCSX[j];
 end
 j=9;
 JY.JCWX={};
if JY.JCSX[1]==0 or JY.JCSX[1]==2 then
if JY.Person[JY.pid]["名称"]=="观岛香月" then
 for d=1,#JY.Leaving do
 local kfid=JY.Leaving[d]; 
 if kfid>0 then
 JY.Base["武功等级"..kfid]=1;
 JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]-10,1,limitX(JY.Base["重生次数"]*10+10,10,100));;
 end
end
else
 for k=1,limitX(JY.Base["重生次数"]*10+10,10,100) do
 local kfid=TableRandom(JY.Leaving); 
 if kfid>0 and CheckKungfu(kfid) then
	if JY.Base["武功等级"..kfid]>0 then
		JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]+1,1,limitX(JY.Base["重生次数"]*10+10,10,100));
	else
	JY.Base["武功等级"..kfid]=1;
	JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]+5,1,limitX(JY.Base["重生次数"]*10+10,10,100));
	end
 end
 end
 JY.Leaving={}; 
end
else
if JY.Person[JY.pid]["名称"]=="观岛香月" then
 for d=1,#JY.Leaving do
 local kfid=JY.Leaving[d]; 
 if kfid>0 then
 JY.Base["武功等级"..kfid]=1;
 JY.Base["武功等级上限"..kfid]=limitX(JY.Base["武功等级上限"..kfid]-10,1,limitX(JY.Base["重生次数"]*10+10,10,100));
 end
end
end
end
end
if JY.Person[JY.pid]["名称"]=="苍老师" then
 JY.Person[JY.pid]["性别"]=2;
 JY.Person[JY.pid]["头像"]=119;
 JY.Person[JY.pid]["生命最大值"]=400;
 JY.Person[JY.pid]["内力最大值"]=400;
JY.Base["武功等级"..223]=1;
JY.Base["武功等级"..715]=1;
JY.Base["武功等级"..811]=1;
JY.Base["武功等级上限"..223]=limitX(JY.Base["重生次数"]*10+10,10,100);
JY.Base["武功等级上限"..715]=limitX(JY.Base["重生次数"]*10+10,10,100);
JY.Base["武功等级上限"..811]=limitX(JY.Base["重生次数"]*10+10,10,100);
 JY.Person[JY.pid]["生命"]=JY.Person[JY.pid]["生命最大值"];
 JY.Person[JY.pid]["内力"]=JY.Person[JY.pid]["内力最大值"];
 for i,v in pairs({"膂力","根骨","机敏","悟性","福缘"}) do
 JY.Person[JY.pid][v]=4;
 JY.Base[v.."成长"]=0; --升级不加属性
 end
JY.Base["自由属性点"]=0;
end
if JY.Person[JY.pid]["名称"]=="四大山" then
 JY.Person[JY.pid]["性别"]=0;
 JY.Person[JY.pid]["头像"]=118;	
 JY.Person[JY.pid]["生命最大值"]=400;
 JY.Person[JY.pid]["内力最大值"]=400;
JY.Base["武功等级"..90]=1;
JY.Base["武功等级"..91]=1;
JY.Base["武功等级"..92]=1;
JY.Base["武功等级"..93]=1;
JY.Base["武功等级"..94]=1;
JY.Base["武功等级"..95]=1;
JY.Base["武功等级上限"..90]=limitX(JY.Base["重生次数"]*10+10,10,100);
JY.Base["武功等级上限"..91]=limitX(JY.Base["重生次数"]*10+10,10,100);
JY.Base["武功等级上限"..92]=limitX(JY.Base["重生次数"]*10+10,10,100);
JY.Base["武功等级上限"..93]=limitX(JY.Base["重生次数"]*10+10,10,100);
JY.Base["武功等级上限"..94]=limitX(JY.Base["重生次数"]*10+10,10,100);
JY.Base["武功等级上限"..95]=limitX(JY.Base["重生次数"]*10+10,10,100);
 JY.Person[JY.pid]["生命"]=JY.Person[JY.pid]["生命最大值"];
 JY.Person[JY.pid]["内力"]=JY.Person[JY.pid]["内力最大值"];
 for i,v in pairs({"膂力","根骨","机敏","悟性","福缘"}) do
 JY.Person[JY.pid][v]=4;
 JY.Base[v.."成长"]=0; --升级不加属性
 end
JY.Base["自由属性点"]=0;
end
if JY.Person[JY.pid]["名称"]=="霹焱仙人" then
 JY.Person[JY.pid]["性别"]=0;
 JY.Person[JY.pid]["头像"]=142;	
 JY.Person[JY.pid]["生命最大值"]=400;
 JY.Person[JY.pid]["内力最大值"]=400;
JY.Base["武功等级"..72]=1;
JY.Base["武功等级"..73]=1;
JY.Base["武功等级上限"..72]=limitX(JY.Base["重生次数"]*10+10,10,100);
JY.Base["武功等级上限"..73]=limitX(JY.Base["重生次数"]*10+10,10,100);
 JY.Person[JY.pid]["生命"]=JY.Person[JY.pid]["生命最大值"];
 JY.Person[JY.pid]["内力"]=JY.Person[JY.pid]["内力最大值"];
 for i,v in pairs({"膂力","根骨","机敏","悟性","福缘"}) do
 JY.Person[JY.pid][v]=4;
 JY.Base[v.."成长"]=0; --升级不加属性
 end
JY.Base["自由属性点"]=0;
end
if JY.Person[JY.pid]["名称"]=="观岛香月" then
 JY.Person[JY.pid]["性别"]=1;
 JY.Person[JY.pid]["头像"]=151;	
 JY.Person[JY.pid]["生命最大值"]=400;
 JY.Person[JY.pid]["内力最大值"]=400;
 JY.Person[JY.pid]["生命"]=JY.Person[JY.pid]["生命最大值"];
 JY.Person[JY.pid]["内力"]=JY.Person[JY.pid]["内力最大值"];
 for i,v in pairs({"膂力","根骨","机敏","悟性","福缘"}) do
 JY.Person[JY.pid][v]=4;
 JY.Base[v.."成长"]=0; --升级不加属性
 end
JY.Base["自由属性点"]=0;
end
if fileexist(CC.R_GRPFilename[1]) then
JY.Base["伤害基数"]=JY.JCSX[3];
JY.Base["命中基数"]=JY.JCSX[4];
JY.Base["格挡基数"]=JY.JCSX[5];
JY.Base["闪避基数"]=JY.JCSX[6];
JY.Person[0]["生命最大值"]=400;
JY.Person[0]["内力最大值"]=400;
JY.Base["基本伤害"]=JY.Base["伤害基数"];
JY.Base["基本命中"]=JY.Base["命中基数"];
JY.Base["基本格挡"]=JY.Base["格挡基数"];
JY.Base["基本闪避"]=JY.Base["闪避基数"];
 for i=1,5 do
 if JY.Person[JY.pid]["武功"..i]>0 and JY.Person[JY.pid]["武功等级"..i]>0 then
 local n=JY.Person[JY.pid]["武功"..i];
 JY.Base["武功等级"..n]=JY.Person[JY.pid]["武功等级"..i];
 JY.Base["武功等级上限"..n]=limitX(JY.Base["重生次数"]*10+10,10,100);
 end
 end
 for i,v in pairs({"内功","轻功","特技"}) do
 if JY.Person[JY.pid][v]>0 and JY.Person[JY.pid][v.."等级"]>0 then
 local n=JY.Person[JY.pid][v];
 JY.Base["武功等级"..n]=JY.Person[JY.pid][v.."等级"];
 JY.Base["武功等级上限"..n]=limitX(JY.Base["重生次数"]*10+10,10,100);
 end
 end 
 end
JY.JCSX={};
if JY.Base["重生次数"]>9 and JY.Person[JY.pid]["名称"]~="观岛香月" and JY.Person[JY.pid]["名称"]~="霹焱仙人" and JY.Person[JY.pid]["名称"]~="四大山" and JY.Person[JY.pid]["名称"]~="苍老师" then
	JY.Base["武功等级"..71]=1;
	JY.Base["武功等级上限"..71]=limitX(JY.Base["重生次数"]*10+10,10,100);
end
 CleanMemory();
 JY.Status=GAME_AUTO;
 JY.Base.Seed=tostring(os.time()):reverse():sub(1, 6);
 math.randomseed(JY.Base.Seed);
end
function SetFreePoint()
 if (JY.bt[11].show or JY.bt[34].show) and JY.PersonStatusPage==0 then
 JY.bt[131].show=true;
 JY.bt[132].show=true;
 JY.bt[133].show=true;
 JY.bt[134].show=true;
 JY.bt[135].show=true;
 JY.bt[136].show=true;
 JY.bt[137].show=true;
 if JY.Base["自由属性点"]>0 then
 if JY.Person[JY.pid]["福缘"]<20 then
 JY.bt[131].enable=true;
 else
 JY.bt[131].enable=false;
 end
 if JY.Person[JY.pid]["悟性"]<20 then
 JY.bt[132].enable=true;
 else
 JY.bt[132].enable=false;
 end
 if JY.Person[JY.pid]["机敏"]<20 then
 JY.bt[133].enable=true;
 else
 JY.bt[133].enable=false;
 end
 if JY.Person[JY.pid]["根骨"]<20 then
 JY.bt[134].enable=true;
 else
 JY.bt[134].enable=false;
 end
 if JY.Person[JY.pid]["膂力"]<20 then
 JY.bt[135].enable=true;
 else
 JY.bt[135].enable=false;
 end
 if JY.Person[JY.pid]["内力最大值"]<30000 then
 JY.bt[136].enable=true;
 else
 JY.bt[136].enable=false;
 end
 if JY.Person[JY.pid]["生命最大值"]<30000 then
 JY.bt[137].enable=true;
 else
 JY.bt[137].enable=false;
 end
 else
 JY.bt[131].enable=false;
 JY.bt[132].enable=false;
 JY.bt[133].enable=false;
 JY.bt[134].enable=false;
 JY.bt[135].enable=false;
 JY.bt[136].enable=false;
 JY.bt[137].enable=false;
 end
 else
 JY.bt[131].show=false;
 JY.bt[132].show=false;
 JY.bt[133].show=false;
 JY.bt[134].show=false;
 JY.bt[135].show=false;
 JY.bt[136].show=false;
 JY.bt[137].show=false;
 end
end
function SetKungfu(kfid)
 local p=JY.Person[JY.pid];
 local kind=JY.Kungfu[kfid]["类型"];
 if kind==7 then
 if p["内功"]==kfid then
 PlayWavE(1);
 p["内功"]=0;
 p["内功等级"]=0;
 else
 PlayWavE(0);
 p["内功"]=kfid;
 p["内功等级"]=JY.Base["武功等级"..kfid];
 end
 elseif kind==8 then
 if p["轻功"]==kfid then
 PlayWavE(1);
 p["轻功"]=0;
 p["轻功等级"]=0;
 else
 PlayWavE(0);
 p["轻功"]=kfid;
 p["轻功等级"]=JY.Base["武功等级"..kfid];
 end
 elseif kind==9 then
 if p["特技"]==kfid then
 PlayWavE(1);
 p["特技"]=0;
 p["特技等级"]=0;
 else
 PlayWavE(0);
 p["特技"]=kfid;
 p["特技等级"]=JY.Base["武功等级"..kfid];
 end
 else
 for i=1,5 do
 if p["武功"..i]==kfid then
 PlayWavE(1);
 for j=i,4 do
 p["武功"..j]=p["武功"..(j+1)];
 p["武功等级"..j]=p["武功等级"..(j+1)];
 end
 p["武功"..5]=0;
 p["武功等级"..5]=0;
 return;
 end
 end
 for i=1,5 do
 if p["武功"..i]==0 then
 PlayWavE(0);
 p["武功"..i]=kfid;
 p["武功等级"..i]=JY.Base["武功等级"..kfid];
 return;
 end
 end
 for i=1,4 do
 p["武功"..i]=p["武功"..(i+1)];
 p["武功等级"..i]=p["武功等级"..(i+1)];
 end
 PlayWavE(0);
 p["武功"..5]=kfid;
 p["武功等级"..5]=JY.Base["武功等级"..kfid];
 end
end
function CheckLvUp(pid)
 if JY.Base["实战"]>=CC.Exp[JY.Person[JY.pid]["等级"]+1] then
 JY.Base["实战"]=0;
 LvUp(pid);
 PlayWavE(11);
 JY.TEXT_BUFF="\\yellow"..JY.Person[pid]["名称"].."\\white修为上升！\\n";
 JY.WAIT=1;
 coroutine.yield();
 if JY.Base["生命加值"]>0 then
 JY.TEXT_BUFF=string.format("\\yellow"..JY.Person[pid]["名称"].."\\white生命上限上升到%d \\green(%+d)\\white！\\n",JY.Person[pid]["生命最大值"],JY.Base["生命加值"]);
 JY.WAIT=1;
 coroutine.yield();
 end
 if JY.Base["内力加值"]>0 then
 JY.TEXT_BUFF=string.format("\\yellow"..JY.Person[pid]["名称"].."\\white内力上限上升到%d \\green(%+d)\\white！\\n",JY.Person[pid]["内力最大值"],JY.Base["内力加值"]);
 JY.WAIT=1;
 coroutine.yield();
 end
 JY.TEXT_BUFF="\\yellow"..JY.Person[pid]["名称"].."\\white获得1点自由属性点！\\n";
 AddFreePT(1);
 JY.WAIT=1;
 coroutine.yield();
 end
end
function AddFreePT(n)
 JY.Base["自由属性点"]=limitX(JY.Base["自由属性点"]+n,0,99);
end
function LvUp(pid)
 local lv=JY.Person[pid]["等级"]+1;
 JY.Person[pid]["等级"]=lv;
 InsertLog(1,JY.Person[pid]["等级"]);
 JY.Person[pid]["生命"]=JY.Person[pid]["生命最大值"];
 JY.Person[pid]["内力"]=JY.Person[pid]["内力最大值"];
 JY.Person[pid]["生命最大值"]=limitX(JY.Person[pid]["生命最大值"]+16,1,30000);
 JY.Person[pid]["内力最大值"]=limitX(JY.Person[pid]["内力最大值"]+16,1,30000);
 JY.Base["生命加值"]=JY.Person[pid]["生命最大值"]-JY.Person[pid]["生命"];
 JY.Base["内力加值"]=JY.Person[pid]["内力最大值"]-JY.Person[pid]["内力"];
 JY.Person[pid]["生命"]=JY.Person[pid]["生命最大值"];
 JY.Person[pid]["内力"]=JY.Person[pid]["内力最大值"];
 if JY.Base["生命加值"]>0 then
 InsertLog(2,1,JY.Person[pid]["生命最大值"]);
 end
 if JY.Base["内力加值"]>0 then
 InsertLog(2,2,JY.Person[pid]["内力最大值"]);
 end
end
function CalNextLv(pid)
 local lv=JY.Person[pid]["等级"];
 for i,v in pairs({"膂力","根骨","机敏","悟性","福缘"}) do
 JY.Base[v.."加值"]=0;
 if JY.Person[pid][v]<20 and JY.Base[v.."成长"]>0 then
 if math.random()<JY.Base[v.."成长"]/limitX(26-lv,1,30) then
 JY.Base[v.."加值"]=JY.Base[v.."加值"]+1;
 end
 if math.random(100)<JY.Person[pid]["福缘"] then --高福缘 额外提高成长速度
 JY.Base[v.."加值"]=JY.Base[v.."加值"]+1;
 end
 end
 JY.Base[v.."成长"]=JY.Base[v.."成长"]-JY.Base[v.."加值"];
 end
 JY.Base["生命加值"]=limitX(JY.Base["生命成长"]+math.random(4)-math.random(4),1,40);
 JY.Base["内力加值"]=limitX(JY.Base["内力成长"]+math.random(4)-math.random(4),1,40);
end
function TableRandom(t)
 local n=#t;
 if n==1 then
 return t[1];
 elseif n>1 then
 math.random(n)
 JY.WAIT=1;
 math.random(n)
 JY.WAIT=1;
 math.random(n)
 JY.WAIT=1;
 math.random(n)
 JY.WAIT=1;
 n=math.random(n);
 return t[n];
 else
 return 0;
 end
end
function PercentRandom(t)
 local pt={};
 local pv=0;
 pt[0]=pv;
 for i,v in pairs(t) do
 pv=pv+v;
 pt[i]=pv;
 end
 if pv==0 then
 return 0;
 end
 local v=math.random()*pv;
 for i=1,#t do
 if v>=pt[i-1] and v<pt[i] then
 return i;
 end
 end
 return 1;
end
function InsertLog(kind,v1,v2)
 if JY.Status==GAME_START then
 return;
 end
 local idx=2162+2;
 local current=GetLogNum()+1;
 if current>1386 then
 current=current-14;
 for i=idx,idx+8*(current-1),8 do
 Byte.set32(JY.Data_Base,i,Byte.get32(JY.Data_Base,i+8*14));
 Byte.set32(JY.Data_Base,i+4,Byte.get32(JY.Data_Base,i+8*14+4));
 end
 end
 SetLogNum(current);
 idx=idx+8*current;
 Byte.set32(JY.Data_Base,idx,0);
 Byte.set32(JY.Data_Base,idx+4,0);
 local tab=os.date("*t");
 Byte.setu16(JY.Data_Base,idx,256*tab.month+tab.day);
 idx=idx+2;
 Byte.setu16(JY.Data_Base,idx,256*tab.hour+tab.min);
 idx=idx+2;
 Byte.setu16(JY.Data_Base,idx,kind+256*v1);
 idx=idx+2;
 Byte.setu16(JY.Data_Base,idx,v2);
 
 local num_per_page=14;
 JY.LOG_MAX_PAGE=1+math.modf((current-1)/num_per_page);
 if not JY.bt[124].enable then
 JY.LOG_CURRENT_PAGE=JY.LOG_MAX_PAGE;
 end
 JY.bt[123].enable=JY.LOG_CURRENT_PAGE>1;
 JY.bt[124].enable=JY.LOG_CURRENT_PAGE<JY.LOG_MAX_PAGE;
end
function ReadLog(id)
 local idx=2162+2;
 if not between(id,1,1386) then
 return "Error: Index over limited";
 end
 idx=idx+8*id;
 local month=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 local day=Byte.getu16(JY.Data_Base,idx)%256;
 idx=idx+2;
 local hour=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 local min=Byte.getu16(JY.Data_Base,idx)%256;
 idx=idx+2;
 local kind=Byte.getu16(JY.Data_Base,idx)%256;
 if kind==1 then
 local lv=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white修为上升至\\greenLv%02d",month,day,hour,min,JY.Person[0]["名称"],lv);
 elseif kind==2 then
 local attrib_t={"生命","内力","膂力","根骨","机敏","悟性","福缘","基本伤害","基本命中","基本格挡","基本闪避"};
 local aid=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 local attrib="";
 if between(aid,1,11) then
 attrib=attrib_t[aid];
 end
 idx=idx+2;
 local value=Byte.getu16(JY.Data_Base,idx);
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white%s上升至\\green%02d",month,day,hour,min,JY.Person[0]["名称"],attrib,value);
 elseif kind==3 then
 local lv=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 idx=idx+2;
 local kfid=Byte.getu16(JY.Data_Base,idx);
 if lv>99 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white修炼\\orange%s\\white登峰造极",month,day,hour,min,JY.Person[0]["名称"],JY.Kungfu[kfid]["名称"],lv);
 elseif lv==1 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white领悟了\\orange%s",month,day,hour,min,JY.Person[0]["名称"],JY.Kungfu[kfid]["名称"],lv);
 else 
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white修炼\\orange%s\\white至\\greenLv%02d",month,day,hour,min,JY.Person[0]["名称"],JY.Kungfu[kfid]["名称"],lv);
 end
 elseif kind==4 then
 local flag=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 idx=idx+2;
 local eid=Byte.getu16(JY.Data_Base,idx);
 if flag==0 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white击败\\orange%s",month,day,hour,min,JY.Person[0]["名称"],JY.Person[eid]["名称"]);
 elseif flag==1 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white败于\\orange%s",month,day,hour,min,JY.Person[0]["名称"],JY.Person[eid]["名称"]);
 elseif flag==2 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white击败\\red%s·%s",month,day,hour,min,JY.Person[0]["名称"],JY.Person[eid]["外号"],JY.Person[eid]["名称"]);
 elseif flag==3 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white败于\\red%s·%s",month,day,hour,min,JY.Person[0]["名称"],JY.Person[eid]["外号"],JY.Person[eid]["名称"]);
 else
 return string.format("%02d/%02d %02d:%02d Error: Flag over limited %d",month,day,hour,min,flag);
 end
 elseif kind==5 then
 local flag=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 idx=idx+2;
 local kfid=Byte.getu16(JY.Data_Base,idx);
 if flag==0 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white梦见仙人指点\\orange%s",month,day,hour,min,JY.Person[0]["名称"],JY.Kungfu[kfid]["名称"]);
 elseif flag==2 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white醒来发现做了一场梦",month,day,hour,min,JY.Person[0]["名称"],JY.Kungfu[kfid]["名称"]);
 elseif flag==3 and JY.Base["武功等级"..kfid]>0 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white学过\\orange%s\\white但没掌握要领",month,day,hour,min,JY.Person[0]["名称"],JY.Kungfu[kfid]["名称"]);
 elseif flag==3 and JY.Base["武功等级"..kfid]==0 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white没有学会\\orange%s",month,day,hour,min,JY.Person[0]["名称"],JY.Kungfu[kfid]["名称"]);
 else
 return string.format("%02d/%02d %02d:%02d Error: Flag over limited %d",month,day,hour,min,flag);
 end
 elseif kind==6 then
 local flag=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 idx=idx+2;
 local kfid=Byte.getu16(JY.Data_Base,idx);
 if flag==0 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white闭关了",month,day,hour,min,JY.Person[0]["名称"]);
 elseif flag==1 then
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white的\\orange%s\\white还有潜力",month,day,hour,min,JY.Person[0]["名称"],JY.Kungfu[kfid]["名称"]);
 else
 return string.format("%02d/%02d %02d:%02d Error: Flag over limited %d",month,day,hour,min,flag);
 end
 elseif kind==7 then
 local lv=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 idx=idx+2;
 local kfid=Byte.getu16(JY.Data_Base,idx);
 return string.format("%02d/%02d %02d:%02d \\orange%s\\white上限提高至\\greenLv%02d",month,day,hour,min,JY.Kungfu[kfid]["名称"],lv);
 elseif kind==8 then
 local tid=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white获得称号\\orange%s",month,day,hour,min,JY.Person[0]["名称"],JY.Item[tid]["名称"]);
 elseif kind==9 then
 local tid=math.modf(Byte.getu16(JY.Data_Base,idx)/256);
 return string.format("%02d/%02d %02d:%02d \\yellow%s\\white获得武器\\green%s",month,day,hour,min,JY.Person[0]["名称"],JY.Item[tid]["名称"]);
 else
 return string.format("%02d/%02d %02d:%02d Error: undefined event %d",month,day,hour,min,kind);
 end
end
function GetLogNum()
 local idx=2162;
 return Byte.getu16(JY.Data_Base,idx);
end
function SetLogNum(num)
 local idx=2162;
 Byte.setu16(JY.Data_Base,idx,num);
end
function Record(k,v)
 v=v or 1;
 if k=="战斗次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="胜利次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="攻击次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="命中次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="防御次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="格挡次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="闪避次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="睡觉次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="进食次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="思考次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="闭关次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,99999999);
 elseif k=="潜能合计" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,999999999);
 elseif k=="重生次数" then
 JY.Base[k]=limitX(JY.Base[k]+v,0,100);
 elseif k=="伤害" or k=="命中" or k=="格挡" or k=="闪避" then
 if v<1 then
 v=1;
 end
 if JY.Base["开启专家"]>0 and JY.Base["战斗次数"]>JY.Base["胜利次数"] then
    JY.Base["指令"]=2;
 end
 for i=1,10 do
 if JY.Base[k..i]==0 then
 JY.Base[k..i]=v;
 if i==10 then
 JY.Base[k..1]=0;
 else
 JY.Base[k..(i+1)]=0;
 end
 break;
 end
 end
 local sum,num=0,0;
 for i=1,10 do
 if JY.Base[k..i]>0 then
 sum=sum+JY.Base[k..i];
 num=num+1;
 end
 end
 if num>0 then
 JY.Base["平均"..k]=sum/num;
 else
 JY.Base["平均"..k]=0;
 end
 if v>JY.Base["最大"..k] then
 JY.Base["最大"..k]=v;
 end
 end
end
function SetGlobal() --设置游戏内部使用的全程变量
 JY={};
 JY.SPD=1;
 JY.Status=GAME_START --游戏当前状态
 JY.WAIT=0; --延时
 JY.TEXT={[1]=""}; --显示文本
 JY.CURRENT_COLOR=M_White; --当前文本颜色
 JY.TEXT_COLOR={[1]={[1]={s=1,c=JY.CURRENT_COLOR}}}; --文本颜色
 JY.TEXT_BUFF=""; --待显示文本
 JY.HELPINDEX=0;
 JY.CENTER_MSG="";
 JY.EFT1=0;
 JY.EFT2=0;
 JY.pid=0;
 JY.eid=0;
 JY.info={}; --战斗信息
 JY.co_fight=nil;
 JY.co_learn=nil;
 JY.co_auto=nil;
 JY.bt={};
 JY.current=0;
 JY.hold=false;
 JY.KF_CURRENT_PAGE=0;
 JY.KF_MAX_PAGE=0;
 JY.LEARN_KFID=0;
 JY.LOG_CURRENT_PAGE=0;
 JY.LOG_MAX_PAGE=0;
 JY.PersonStatusPage=0;
 JY.Leaving={}; 
 --保存R×数据
 JY.Base={}; --基本数据
 JY.PersonNum=0; --人物个数
 JY.Person={}; --人物数据
 JY.ForceNum=0; --人物个数
 JY.Force={}; --人物数据
 JY.MapNum=0; --场景个数
 JY.Map={}; --场景数据
 JY.ItemNum=0; --道具个数
 JY.Item={}; --道具数据
 JY.KungfuNum=0; --武功个数
 JY.Kungfu={}; --武功数据
 JY.SkillNum=0; --招式个数
 JY.Skill={}; --招式数据
 JY.LingwuNum=0; --领悟个数
 JY.Lingwu={}; --领悟数据
 JY.Name={};
 JY.SubMap=-1; --当前子场景编号
 JY.SubMapX=0; --子场景显示位置偏移，场景移动指令使用
 JY.SubMapY=0;

 JY.Darkness=0; --=0 屏幕正常显示，=1 不显示，屏幕全黑

 JY.MmapMusic=0; --切换大地图音乐，返回主地图时，如果设置，则播放此音乐

 JY.CurrentBGM=0; --当前播放的音乐id，用来在关闭音乐时保存音乐id．
 JY.EnableMusic=1; --是否播放音乐 1 播放，0 不播放
 JY.EnableSound=1; --是否播放音效 1 播放，0 不播放
 
 JY.Dark=true;
end
function SetGlobalConst()
 GAME_VER="观岛香月威力加强版v3.1";
 -- 游戏状态定义
 GAME_START =0; --开始画面,各种选单
 GAME_AUTO =1; --
 GAME_FIGHT =2; --
 GAME_LEARN =3; --
 GAME_WMAP =4; --
 GAME_WMAP2 =5; --
 GAME_DEAD =6; --
 GAME_END =7; --
 GAME_WARWIN =8; --
 GAME_WARLOSE =9; --
 -- SDL 键码定义，这里名字仍然使用directx的名字
 VK_ESCAPE=27
 VK_Y=121
 VK_N=110
 VK_SPACE=32
 VK_RETURN=13

 SDLK_UP=273
 SDLK_DOWN=274
 SDLK_LEFT=276
 SDLK_RIGHT=275

 if CONFIG.Rotate==0 then
 VK_UP=SDLK_UP;
 VK_DOWN=SDLK_DOWN;
 VK_LEFT=SDLK_LEFT;
 VK_RIGHT=SDLK_RIGHT;
 else --右转90度
 VK_UP=SDLK_RIGHT;
 VK_DOWN=SDLK_LEFT;
 VK_LEFT=SDLK_UP;
 VK_RIGHT=SDLK_DOWN;
 end

 -- 游戏中颜色定义
 C_STARTMENU=RGB(132, 0, 4); -- 开始菜单颜色
 C_RED=RGB(216, 20, 24); -- 开始菜单选中项颜色

 C_WHITE=RGB(236, 236, 236); --游戏内常用的几个颜色值
 C_ORANGE=RGB(252, 148, 16);
 C_GOLD=RGB(236, 200, 40);
 C_BLACK=RGB(0,0,0);
 
 M_Black=RGB(0,0,0);
 M_Sienna=RGB(160,82,45);
 M_DarkOliveGreen=RGB(85,107,47);
 M_DarkGreen=RGB(0,100,0);
 M_DarkSlateBlue=RGB(72,61,139);
 M_Navy=RGB(0,0,128);
 M_Indigo=RGB(75,0,130);
 M_DarkSlateGray=RGB(47,79,79);
 M_DarkRed=RGB(139,0,0);
 M_DarkOrange=RGB(255,140,0); --(239,101,0)
 M_Olive=RGB(128,128,0);
 M_Green=RGB(0,128,0);
 M_Teal=RGB(0,128,128);
 M_Blue=RGB(0,0,255);
 M_SlateGray=RGB(112,128,144);
 M_DimGray=RGB(105,105,105);
 M_Red=RGB(255,0,0);
 M_SandyBrown=RGB(244,164,96);
 M_YellowGreen=RGB(154,205,50);
 M_SeaGreen=RGB(46,139,87);
 M_MediumTurquoise=RGB(72,209,204);
 M_RoyalBlue=RGB(65,105,225);
 M_Purple=RGB(128,0,128);
 M_Gray=RGB(128,128,128);
 M_Magenta=RGB(255,0,255);
 M_Orange=RGB(255,165,0);
 M_Yellow=RGB(255,255,0);
 M_Lime=RGB(0,255,0);
 M_Cyan=RGB(0,255,255);
 M_DeepSkyBlue=RGB(0,191,255);
 M_DarkOrchid=RGB(153,50,204);
 M_Silver=RGB(192,192,192);
 M_Pink=RGB(255,192,203);
 M_Wheat=RGB(245,222,179);
 M_LemonChiffon=RGB(255,250,205);
 M_PaleGreen=RGB(152,251,152);
 M_PaleTurquoise=RGB(175,238,238);
 M_LightBlue=RGB(173,216,230);
 M_Plum=RGB(221,160,221);
 M_White=RGB(255,255,255);
 
 C_Name=RGB(255,207,85);

 --游戏数据全局变量
 CC={}; --定义游戏中使用的常量，这些可以在修改游戏时修改之
 CC.Debug=0;
 CC.FPS=false;
 CC.PASCODE= { 
 "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",
 "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",
 ".","\\","?","*","+","-",
 };
 --config
 CC.FontType=0;
 CC.MusicVolume=CONFIG.MusicVolume;
 CC.SoundVolume=CONFIG.SoundVolume;
 
 CC.SrcCharSet=0; --源代码的字符集 0 gb 1 big5，用于转换R×。 如果源码被转换为big5，则应设为1
 CC.OSCharSet=CONFIG.OSCharSet; --OS 字符集，0 GB, 1 Big5
 CC.FontName=CONFIG.FontName; --显示字体

 CC.ScreenW=CONFIG.Width; --显示窗口宽高
 CC.ScreenH=CONFIG.Height;

 --定义记录文件名。S和D由于是固定大小，因此不再定义idx了。
 CC.R_IDXFilename={[0]=CONFIG.DataPath .. "newgame.idx",
 CONFIG.DataPath .. "r1.idx",
 CONFIG.DataPath .. "r2.idx",
 CONFIG.DataPath .. "r3.idx",
 CONFIG.DataPath .. "r4.idx",
 CONFIG.DataPath .. "r5.idx",};
 CC.R_GRPFilename={[0]=CONFIG.DataPath .. "newgame.grp",
 CONFIG.DataPath .. "ESAVE0.grp",
 CONFIG.DataPath .. "ESAVE1.grp",
 CONFIG.DataPath .. "ESAVE2.grp",
 CONFIG.DataPath .. "ESAVE3.grp",
 CONFIG.DataPath .. "ESAVE4.grp",
 CONFIG.DataPath .. "ESAVE5.grp",
 CONFIG.DataPath .. "ESAVE6.grp",
 CONFIG.DataPath .. "ESAVE7.grp",
 CONFIG.DataPath .. "ESAVE8.grp",
 CONFIG.DataPath .. "ESAVE9.grp",};
 CC.S_Filename={[0]=CONFIG.DataPath .. "allsin.grp",
 CONFIG.DataPath .. "s1.grp",
 CONFIG.DataPath .. "s2.grp",
 CONFIG.DataPath .. "s3.grp",};

 CC.TempS_Filename=CONFIG.DataPath .. "allsinbk.grp";

 CC.D_Filename={[0]=CONFIG.DataPath .. "alldef.grp",
 CONFIG.DataPath .. "d1.grp",
 CONFIG.DataPath .. "d2.grp",
 CONFIG.DataPath .. "d3.grp",};

 CC.PaletteFile=CONFIG.DataPath .. "mmap.col";
 CC.SavedataFile=CONFIG.DataPath .. "savedata.grp";
 CC.MapFile=CONFIG.DataPath .. "HEXZMAP.R3";
 CC.FirstFile=CONFIG.PicturePath .. "title.png";
 CC.DeadFile=CONFIG.PicturePath .. "dead.png";

 CC.MMapFile={CONFIG.DataPath .. "earth.002",
 CONFIG.DataPath .. "surface.002",
 CONFIG.DataPath .. "building.002",
 CONFIG.DataPath .. "buildx.002",
 CONFIG.DataPath .. "buildy.002"};

 --各种贴图文件名。
 CC.MMAPPicFile={CONFIG.DataPath .. "mmap.idx",CONFIG.DataPath .. "mmap.grp"};
 CC.SMAPPicFile={CONFIG.DataPath .. "smap.idx",CONFIG.DataPath .. "smap.grp"};
 CC.WMAPPicFile={CONFIG.DataPath .. "wmap.idx",CONFIG.DataPath .. "wmap.grp"};
 CC.EFT={CONFIG.DataPath .. "eft.idx",CONFIG.DataPath .. "eft.grp"};

 CC.HeadPicFile={CONFIG.DataPath .. "hdgrp.idx",CONFIG.DataPath .. "hdgrp.grp"};
 CC.UIPicFile={CONFIG.DataPath .. "ui.idx",CONFIG.DataPath .. "ui.grp"};


 CC.BGMFile=CONFIG.SoundPath .. "M%02d.mp3";
 CC.ATKFile=CONFIG.SoundPath .. "Atk%02d.wav";
 CC.EFile=CONFIG.SoundPath .. "Se%02d.wav";

 CC.WarFile=CONFIG.DataPath .. "war.sta";
 CC.WarMapFile={CONFIG.DataPath .. "warfld.idx",
 CONFIG.DataPath .. "warfld.grp"};

 CC.TalkIdxFile=CONFIG.ScriptPath .. "oldtalk.idx";
 CC.TalkGrpFile=CONFIG.ScriptPath .. "oldtalk.grp";

 
 
 --定义记录文件R×结构。 lua不支持结构，无法直接从二进制文件中读取，因此需要这些定义，用table中不同的名字来仿真结构。
 CC.TeamNum=16; --队伍人数
 CC.MyThingNum=400; --主角物品数量
 CC.Kungfunum=5; --角色武功数量
 CC.MaxKungfuNum=80;
 CC.Base_S={}; --保存基本数据的结构，以便以后存取
 CC.Base_S["名称"]={0,2,14}; --nouse
 CC.Base_S["章节名"]={14,2,14}; --章节名
CC.Base_S["数据版本号"]={28,2,14}; --数据版本号
 CC.Base_S["Seed"]={42,0,4};
	CC.Base_S["BossTimer"]={52,0,2};
	CC.Base_S["MaxSPD"]={54,0,2};
 CC.Base_S["无用"]={56,2,14}; --nouse
 CC.Base_S["无用1"]={70,2,14};
 CC.Base_S["下个场景"]={84,0,2};
 CC.Base_S["当前地图"]={86,0,2};
 CC.Base_S["当前场景"]={88,0,2};
 CC.Base_S["当前音乐"]={90,0,2};
 CC.Base_S["当前事件"]={92,0,2};
 CC.Base_S["武将数量"]={94,0,2};
 CC.Base_S["相性"]={96,0,2};
 CC.Base_S["指令"]={98,0,2};
 CC.Base_S["时"]={100,0,2} -- 起始位置(从0开始)，数据类型(0有符号 1无符号，2字符串)，长度
 CC.Base_S["分"]={102,0,2};
 CC.Base_S["秒"]={104,0,2};
 CC.Base_S["节"]={106,0,2};
 CC.Base_S["倒计时"]={108,0,2};
 CC.Base_S["力量"]={110,0,2};
 CC.Base_S["自由属性点"]={112,0,2};
 CC.Base_S["体力"]={114,0,2};
 CC.Base_S["实战"]={116,0,4};
 CC.Base_S["潜能"]={120,0,4};
 CC.Base_S["黄金"]={124,0,4};
 CC.Base_S["膂力成长"]={128,0,2};
 CC.Base_S["根骨成长"]={130,0,2};
 CC.Base_S["机敏成长"]={132,0,2};
 CC.Base_S["悟性成长"]={134,0,2};
 CC.Base_S["福缘成长"]={136,0,2};
 CC.Base_S["生命成长"]={138,0,2};
 CC.Base_S["内力成长"]={140,0,2};
 CC.Base_S["膂力加值"]={142,0,2};
 CC.Base_S["根骨加值"]={144,0,2};
 CC.Base_S["机敏加值"]={146,0,2};
 CC.Base_S["悟性加值"]={148,0,2};
 CC.Base_S["福缘加值"]={150,0,2};
 CC.Base_S["生命加值"]={152,0,2};
 CC.Base_S["内力加值"]={154,0,2};
 
 CC.Base_S["开启专家"]={156,0,2};
 CC.Base_S["开启音效"]={158,0,2};
 CC.Base_S["修炼备选"]={160,0,2};
 CC.Base_S["开启音乐"]={162,0,2};
 
 CC.Base_S["基本伤害"]={190,0,2};
 CC.Base_S["基本命中"]={192,0,2};
 CC.Base_S["基本格挡"]={194,0,2};
 CC.Base_S["基本闪避"]={196,0,2};
 --统计信息
 CC.Base_S["重生次数"]={198,0,2};
 CC.Base_S["战斗次数"]={200,0,4};
 CC.Base_S["胜利次数"]={204,0,4};
 CC.Base_S["攻击次数"]={208,0,4};
 CC.Base_S["命中次数"]={212,0,4};
 CC.Base_S["防御次数"]={216,0,4};
 CC.Base_S["格挡次数"]={220,0,4};
 CC.Base_S["闪避次数"]={224,0,4};
 CC.Base_S["睡觉次数"]={228,0,4};
 CC.Base_S["进食次数"]={232,0,4};
 CC.Base_S["思考次数"]={236,0,4};
 CC.Base_S["闭关次数"]={240,0,4};
 CC.Base_S["潜能合计"]={244,0,4};
 
 CC.Base_S["最大伤害"]={248,1,2};
 CC.Base_S["平均伤害"]={250,1,2};
 for i=1,10 do
 CC.Base_S["伤害"..i]={250+2*i,1,2};
 end
 CC.Base_S["最大命中"]={272,1,2};
 CC.Base_S["平均命中"]={274,1,2};
 for i=1,10 do
 CC.Base_S["命中"..i]={274+2*i,1,2};
 end
 CC.Base_S["最大格挡"]={296,1,2};
 CC.Base_S["平均格挡"]={298,1,2};
 for i=1,10 do
 CC.Base_S["格挡"..i]={298+2*i,1,2};
 end
 CC.Base_S["最大闪避"]={320,1,2};
 CC.Base_S["平均闪避"]={322,1,2};
 for i=1,10 do
 CC.Base_S["闪避"..i]={322+2*i,1,2};
 end
 CC.Base_S["生命基数"]={344,0,2};
 CC.Base_S["内力基数"]={346,0,2};
 CC.Base_S["伤害基数"]={348,0,2};
 CC.Base_S["命中基数"]={350,0,2};
 CC.Base_S["格挡基数"]={352,0,2};
 CC.Base_S["闪避基数"]={354,0,2};
 CC.Base_S["分类"]={356,0,2}
 for i=1,48 do 
 CC.Base_S["开启场景" .. i]={1824+2*(i-1),0,2};
 end
 for i=1,50 do
 CC.Base_S["开启称号" .. i]={1924+2*(i-1),0,2};
 end
 for i=1,50 do
 CC.Base_S["开启武器" .. i]={2024+2*(i-1),0,2};
 end
 for i=1,10000 do
 CC.Base_S["武功等级" .. i]={15160+2*i,0,2};
 end
 for i=1,10000 do
 CC.Base_S["武功经验" .. i]={35158+4*i,0,4};
 end
for i=1,10000 do
 CC.Base_S["武功等级上限" .. i]={75160+2*i,0,2};
 end

 
 --
 CC.PersonSize=126; --每个人物数据占用字节
 CC.Person_S={}; --保存人物数据的结构，以便以后存取
 CC.Person_S["代号"]={0,0,2,false} --true 实际存储 false 不存储
 CC.Person_S["头像"]={2,0,2,false}
 CC.Person_S["战斗动作"]={4,0,2,false}
 CC.Person_S["名称"]={6,2,14,false}
 CC.Person_S["外号"]={20,2,14,false}
 CC.Person_S["性别"]={34,0,2,false}
 CC.Person_S["等级"]={36,0,2,false}
 CC.Person_S["实战1"]={38,0,4,false}
 CC.Person_S["潜能1"]={42,0,4,false}
 CC.Person_S["生命"]={46,0,2,true}
 CC.Person_S["生命最大值"]={48,1,2,false}
 CC.Person_S["内力性质"]={50,0,2,false}
 CC.Person_S["内力"]={52,0,2,true}
 CC.Person_S["内力最大值"]={54,1,2,false}
 CC.Person_S["体力"]={56,0,2, false}
 CC.Person_S["名声"]={58,0,2,false}
 CC.Person_S["膂力"]={60,0,2,false}
 CC.Person_S["悟性"]={62,0,2,false}
 CC.Person_S["根骨"]={64,0,2,false}
 CC.Person_S["机敏"]={66,0,2,false}
 CC.Person_S["福缘"]={68,0,2,false}
 CC.Person_S["门派"]={70,0,2,false}
 CC.Person_S["位置"]={72,0,2,false}
 CC.Person_S["武功1"]={74,0,2,false}
 CC.Person_S["武功等级1"]={76,0,2,false}
 CC.Person_S["武功2"]={78,0,2,false}
 CC.Person_S["武功等级2"]={80,0,2,false}
 CC.Person_S["武功3"]={82,0,2,false}
 CC.Person_S["武功等级3"]={84,0,2,false}
 CC.Person_S["武功4"]={86,0,2,false}
 CC.Person_S["武功等级4"]={88,0,2,false}
 CC.Person_S["武功5"]={90,0,2,false}
 CC.Person_S["武功等级5"]={92,0,2,false}
 CC.Person_S["内功"]={94,0,2,false}
 CC.Person_S["内功等级"]={96,0,2,false}
 CC.Person_S["轻功"]={98,0,2,false}
 CC.Person_S["轻功等级"]={100,0,2,false}
 CC.Person_S["特技"]={102,0,2,false}
 CC.Person_S["特技等级"]={104,0,2,false}
 CC.Person_S["招架"]={106,0,2,true}
 CC.Person_S["招架等级"]={108,0,2,true}
 CC.Person_S["武器"]={110,0,2,false}
 CC.Person_S["掉宝1"]={112,0,2,false}
 CC.Person_S["掉宝2"]={114,0,2,false}
 CC.Person_S["掉宝3"]={116,0,2,false}
 CC.Person_S["掉宝4"]={118,0,2,false}
 CC.Person_S["掉宝5"]={120,0,2,false}
 CC.Person_S["掉落武器"]={122,0,2,false}
 CC.Person_S["图鉴"]={124,0,2,true}
 
 CC.ForceSize=68; --每个兵种数据占用字节
 CC.Force_S={}; --保存兵种数据的结构，以便以后存取
 CC.Force_S["代号"]={0,0,2}
 CC.Force_S["名称"]={2,2,14}
 CC.Force_S["地图1"]={16,0,2}
 CC.Force_S["地图2"]={18,0,2}
 CC.Force_S["地图3"]={20,0,2}
 CC.Force_S["地图4"]={22,0,2}
 CC.Force_S["地图5"]={24,0,2}
 CC.Force_S["地图6"]={26,0,2}
	for i=1,10 do
		CC.Force_S["前置地图"..i]={26+2*i,0,2}
		CC.Force_S["前置地图进度"..i]={46+2*i,0,2}
	end
 
 CC.MapSize=128; --每个场景数据占用字节
 CC.Map_S={}; --保存场景数据的结构，以便以后存取
 CC.Map_S["代号"]={0,0,2}
 CC.Map_S["图片"]={2,0,2}
 CC.Map_S["音乐"]={4,0,2}
 for i=1,20 do
 CC.Map_S["杂兵"..i]={4+2*i,0,2}
 end
 for i=1,10 do
 CC.Map_S["小Boss"..i]={44+2*i,0,2}
 end
 CC.Map_S["事件"]={66,0,2}
 for i=1,10 do
 CC.Map_S["通关Boss"..i]={66+2*i,0,2}
 CC.Map_S["战斗前剧情"..i]={86+2*i,0,2}
 CC.Map_S["战斗后剧情"..i]={106+2*i,0,2}
 end
 
 
	CC.ItemSize=280; --每个道具数据占用字节
	CC.Item_S={};
	CC.Item_S["代号"]={0,0,2}
	CC.Item_S["名称"]={2,2,14}
	CC.Item_S["说明"]={16,2,200}
	CC.Item_S["类型"]={216,2,14}
	CC.Item_S["生命"]={230,0,2}
	CC.Item_S["内力"]={232,0,2}
	CC.Item_S["伤害"]={234,0,2}
	CC.Item_S["命中"]={236,0,2}
	CC.Item_S["格挡"]={238,0,2}
	CC.Item_S["闪避"]={240,0,2}
	for i=1,6 do
		CC.Item_S["需武功"..i]={240+2*i,0,2}
	end
	CC.Item_S["需武功等级"]={254,0,2}
	CC.Item_S["需人物等级"]={256,0,2}
	for j=1,5 do
	CC.Item_S["需通过场景"..j]={256+2*j,0,2}
	CC.Item_S["需通过场景进度"..j]={266+2*j,0,2}
	end
	CC.Item_S["暴率"]={278,0,2}
 
 
 
 CC.KungfuSize=490; --每个武功数据占用字节
 CC.Kungfu_S={}; --保存武功数据的结构，以便以后存取
 CC.Kungfu_S["代号"]={0,0,2}
 CC.Kungfu_S["名称"]={2,2,14}
 CC.Kungfu_S["武器"]={16,2,14}
 CC.Kungfu_S["说明"]={30,2,400}
 CC.Kungfu_S["类型"]={430,0,2}
 CC.Kungfu_S["类型描述"]={432,2,14}
 CC.Kungfu_S["Lv"]={446,0,2}
 CC.Kungfu_S["AP"]={448,0,2}
 CC.Kungfu_S["DP"]={450,0,2}
 CC.Kungfu_S["PP"]={452,0,2}
 CC.Kungfu_S["Damage"]={454,0,2}
 --CC.Kungfu_S["Def"]={440,0,2}
 CC.Kungfu_S["Hard"]={456,0,2}
 CC.Kungfu_S["音效"]={458,0,2}
 
 CC.Kungfu_S["生命"]={460,0,2}
 CC.Kungfu_S["内力"]={462,0,2}
 CC.Kungfu_S["伤害"]={464,0,2}
 CC.Kungfu_S["命中"]={466,0,2}
 CC.Kungfu_S["格挡"]={468,0,2}
 CC.Kungfu_S["闪避"]={470,0,2}
 CC.Kungfu_S["性别"]={480,0,2}
 CC.Kungfu_S["做梦"]={482,0,2}
 CC.Kungfu_S["修炼动画"]={484,0,2}
 CC.Kungfu_S["内力消耗"]={486,0,2}
 CC.Kungfu_S["暴率"]={488,0,2}

 CC.SkillSize=486; --每个招式数据占用字节
 CC.Skill_S={}; --保存招式数据的结构，以便以后存取
 CC.Skill_S["武功"]={0,0,2}
 CC.Skill_S["名称"]={2,2,14}
 CC.Skill_S["类型"]={16,2,14}
 CC.Skill_S["子类型"]={30,2,14}
 CC.Skill_S["等级"]={44,0,2}
 CC.Skill_S["性别"]={46,0,2}
 CC.Skill_S["等级1"]={48,0,2}
 CC.Skill_S["等级2"]={50,0,2}
 CC.Skill_S["AP"]={52,0,2}
 CC.Skill_S["Damage"]={54,0,2}
 CC.Skill_S["VsDP"]={56,0,2}
 CC.Skill_S["VsPP"]={58,0,2}
	for i=1,6 do
		CC.Skill_S["需武功"..i]={58+2*i,0,2}
		CC.Skill_S["忌武功"..i]={70+2*i,0,2}
	end
 CC.Skill_S["备用"]={84,0,2}
 CC.Skill_S["文本"]={86,2,400}
 
 CC.LingwuSize=32;
 CC.Lingwu_S={};
 CC.Lingwu_S["代号"]={0,0,2}
 CC.Lingwu_S["武功"]={2,0,2}
 CC.Lingwu_S["前置1"]={4,0,2}
 CC.Lingwu_S["前置2"]={6,0,2}
 CC.Lingwu_S["前置3"]={8,0,2}
 CC.Lingwu_S["前置4"]={10,0,2}
 CC.Lingwu_S["前置5"]={12,0,2}
 CC.Lingwu_S["前置6"]={14,0,2}
 CC.Lingwu_S["前置7"]={16,0,2}
 CC.Lingwu_S["等级1"]={18,0,2}
 CC.Lingwu_S["等级2"]={20,0,2}
 CC.Lingwu_S["等级3"]={22,0,2}
 CC.Lingwu_S["等级4"]={24,0,2}
 CC.Lingwu_S["等级5"]={26,0,2}
 CC.Lingwu_S["等级6"]={28,0,2}
 CC.Lingwu_S["等级7"]={30,0,2}
 
 CC.DX={[0]=2,-2,-2,2}; --不同方向x，y的加减值，用于走路改变坐标值
 CC.DY={[0]=-1,1,-1,1};
 --1,2,3,4 下 上 左 右
 CC.DirectX={0,0,-1,1}; --不同方向x，y的加减值，用于走路改变坐标值
 CC.DirectY={1,-1,0,0};

 CC.RowPixel=4; -- 每行字的间距像素数

 CC.MenuBorderPixel=5; -- 菜单四周边框留的像素数，也用于绘制字符串的box四周留得像素
 CC.MouseClickType=0; --0 满足1且2，1只检查初始点击位置， 2只检查最终释放位置
 CC.OpearteSpeed=4; --游戏操作反应速度
 CC.WarDelay=1; --战斗操作反应速度
 CC.FrameNum=50; --帧数
 CC.Exp={
 4,8,12,16,20,24,28,32,36,40,
 48,56,64,72,80,88,96,104,112,120,
 136,152,168,184,200,216,232,248,264,280,
 312,344,376,408,440,472,504,536,568,600,
 664,728,792,856,920,984,1048,1112,1176,1240,
 1368,1496,1624,1752,1880,2008,2136,2264,2392,2520,
 2776,3032,3288,3544,3800,4056,4312,4568,4824,5080,
 5592,6104,6616,7128,7640,8152,8664,9176,9688,10200,
 11224,12248,13272,14296,15320,16344,17368,18392,19416,20440,
 22488,24536,26584,28632,30680,32728,34776,36824,38872,99999,
 99999999,99999999,99999999,99999999,99999999,
 99999999,99999999,99999999,99999999,99999999,
 99999999,99999999,99999999,99999999,99999999,
 99999999,99999999,99999999,99999999,99999999,
 99999999,99999999,99999999,99999999,99999999,
 99999999,99999999,99999999,99999999,99999999,
 99999999,99999999,99999999,99999999,99999999,};
end


