⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gen.cpp

📁 三国志IX武将编辑器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void CGen::OnSelectAll()
{
	UpdateData();
	for(int i=0;i<3;i++)
	{
		m_data.Extra_1[i]=TRUE;
        m_data.Extra_2[i]=TRUE;
        m_data.Extra_3[i]=TRUE;
        m_data.Extra_4[i]=TRUE;
        m_data.Extra_5[i]=TRUE;
	}

    for(i=0;i<4;i++)
	{
        m_data.Extra_6[i]=TRUE;
        m_data.Extra_7[i]=TRUE;
        m_data.Extra_8[i]=TRUE;
        m_data.Extra_9[i]=TRUE;
	}
  
	UpdateData(FALSE);
}

void CGen::OnSelectNone()
{
    UpdateData();
	for(int i=0;i<3;i++)
	{
		m_data.Extra_1[i]=FALSE;
        m_data.Extra_2[i]=FALSE;
        m_data.Extra_3[i]=FALSE;
        m_data.Extra_4[i]=FALSE;
        m_data.Extra_5[i]=FALSE;
	}

    for(i=0;i<4;i++)
	{
        m_data.Extra_6[i]=FALSE;
        m_data.Extra_7[i]=FALSE;
        m_data.Extra_8[i]=FALSE;
        m_data.Extra_9[i]=FALSE;
	}

	UpdateData(FALSE);
}

void CGen::OnMaxSet()
{
    OnSelectAll();

	m_data.Skill1=65535;
	m_data.Skill2=65535;
	m_data.Skill3=65535;
	m_data.Skill4=65535;
	m_data.Skill5=65535;
	m_data.Skill6=65535;
	m_data.Skill7=65535;
	m_data.Skill8=65535;
	m_data.Skill9=65535;

	m_data.Basic_Brains=255;
	m_data.Basic_Command=255;
	m_data.Basic_Force=255;
	m_data.Basic_Polity=255;

	UpdateData(FALSE);
}

void CGen::OnPhotoChange()
{
    UpdateData();

	if(m_data.photo!=0xffff)
	m_photo.m_code=m_data.photo-PHOTO_SEEK;
	else
	m_photo.m_code=0;

    m_photo.oldpos.x=-1;
	m_photo.oldpos.y=-1;

	if(m_photo.DoModal()==IDOK)
	{
	if(m_photo.m_code!=0)
	m_data.photo=m_photo.m_code+PHOTO_SEEK;
	else
	m_data.photo=0xffff;

	UpdateData(FALSE);
    Invalidate();
	}
}

void CGen::OnCustomdrawSlider(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
    OnReleasedcaptureSlider(pNMHDR, pResult);
}

void CGen::OnReleasedcaptureSlider(NMHDR* pNMHDR, LRESULT* pResult)
{
    int pos=m_Slider.GetPos();
    m_data.Birthday=pos;

    CSan9EditApp *app=(CSan9EditApp*)AfxGetApp();
	int p;
	if(m_data.Parent!=65535)
	p=app->m_GenCode[m_data.Parent-700].Birthday;
	else p=120;

	if(p+15>m_data.Birthday) 
	{
        //m_Slider.SetPos(p+15);
		pos=p+15;
	}
    
	m_data.Birthday=pos;
	m_char.Format("%d",pos);
	this->SetDlgItemText(IDC_BIRTHDAY,m_char);
	m_char="";

	*pResult = 0;
}

BOOL CGen::ReadBuffer()
{
	if(buf!=NULL) delete[] buf;
	buf=new char[m_len+1];

	if(m_index!=-1)
	{
		long seek=0x04;

		seek+=m_len*m_index;

		CFile file;
		if(file.Open(m_name,CFile::modeRead))
		{
		  if(buf!=NULL) delete[] buf;
		  buf=new char[m_len+1];
		  file.Seek(seek,CFile::begin);
		  int recive=file.Read(buf,m_len);
		  file.Close();
		  if(recive<m_len) return FALSE;
		}
		else return FALSE;

		if(*(buf+0x25)==(char)0xff) 
		{
			delete[] buf;
			return FALSE;
		}
	}
	else
	{
       //初始化新增武将原始数据
	   NewData();
	}

    return TRUE;
}

void CGen::NewData(BOOL add)
{
    if(buf==NULL) buf=new char[m_len+1];

	*(buf+0x1f)=0;
    //肖像
	*(buf+0x02)=(char)(0xff);
	*(buf+0x03)=(char)(0xff);

	
    //父母
	*(buf+0x04)=(char)0xff;
	*(buf+0x05)=(char)0xff;

	//相性
	*(buf+0x06)=(char)0xff;
	*(buf+0x07)=(char)0xff;
  

	//年龄
	*(buf+0x1a)=(char)(5);

	//统率
	*(buf+0x1e)=1;
	//武力
	*(buf+0x1b)=1;
	//智力
	*(buf+0x1c)=1;
	//政治
	*(buf+0x1d)=1;

	int i;
	//姓,名,字
	for(i=0;i<4;i++)
	{
	 *(buf+i+0x35)='\0';
	 *(buf+i+0x3a)='\0';
	 *(buf+i+0x3f)='\0';
	}

	//信念
	*(buf+0x20)=0;
	//性格
	*(buf+0x21)=0;

	//传记
	for(i=0;i<150;i++)
	{
	*(buf+i+0x4f)='\0';
	}

    //技能
	for(i=0x08;i<=0x19;i++)
	{
	*(buf+i)=0;
	}
    
	//兵法
	for(i=0x2f;i<=0x34;i++)
	{
	*(buf+i)=0;
	}

	if(add)
	*(buf+0x25)=(char)0x00;
	else
    *(buf+0x25)=(char)0xff;
}

BOOL CGen::ReadData()
{
     if(buf==NULL) return FALSE;
	  //处理buf至m_data

     //容貌
      m_data.photo=(unsigned char)(*(buf+0x02))+(unsigned char)(*(buf+0x03))*0x100;

     //父母
	  m_data.Parent=(unsigned char)(*(buf+0x04))+(unsigned char)(*(buf+0x05))*0x100;
     //相性
      m_data.Friend=(unsigned char)(*(buf+0x06))+(unsigned char)(*(buf+0x07))*0x100;
	 //性别
     if(*(buf+0x1f)==1)
     m_data.Sex=FALSE;
     else m_data.Sex=TRUE;

     //年龄
     m_data.Birthday=(unsigned char)(*(buf+0x1a))+130;

     //统率
     m_data.Basic_Command=(unsigned char)(*(buf+0x1e));
	  //武力
     m_data.Basic_Force=(unsigned char)(*(buf+0x1b));
	  //智力
     m_data.Basic_Brains=(unsigned char)(*(buf+0x1c));
	  //政治
     m_data.Basic_Polity=(unsigned char)(*(buf+0x1d));

	 
      //姓
     for(int i=0x35;i<=0x38;i++)
	  m_data.FirstName[i-0x35]=*(buf+i);
     m_data.FirstName[i-0x35]='\0';

	 CString text;

	 text=m_bgigb.BigtoGB(m_data.FirstName); 
	 strcpy(m_data.FirstName,text);

	 //名
     for(i=0x3a;i<=0x3d;i++)
		  m_data.SecondName[i-0x3a]=*(buf+i);
      m_data.SecondName[i-0x3a]='\0';

     text=m_bgigb.BigtoGB(m_data.SecondName); 
	 strcpy(m_data.SecondName,text);
	  //字

	  for(i=0x3f;i<=0x42;i++)
		  m_data.ThirdName[i-0x3f]=*(buf+i);
      m_data.ThirdName[i-0x3f]='\0';

      text=m_bgigb.BigtoGB(m_data.ThirdName); 
	  strcpy(m_data.ThirdName,text);
	  //信念
      m_data.Persuasion=(unsigned char)(*(buf+0x20))+1;
	  //性格
      m_data.Kidney=(unsigned char)(*(buf+0x21))+1;

	  //传记
      for(i=0x4f;i<=0xe4;i++)
		  m_data.Biography+=*(buf+i);

	  text=m_bgigb.BigtoGB(m_data.Biography); 
	  m_data.Biography=text;

	  //熟练度

	  m_data.Skill1=(unsigned char)(*(buf+0x08))+(unsigned char)(*(buf+0x09))*0x100;
	  m_data.Skill2=(unsigned char)(*(buf+0x0a))+(unsigned char)(*(buf+0x0b))*0x100;
	  m_data.Skill3=(unsigned char)(*(buf+0x0c))+(unsigned char)(*(buf+0x0d))*0x100;
	  m_data.Skill4=(unsigned char)(*(buf+0x0e))+(unsigned char)(*(buf+0x0f))*0x100;
	  m_data.Skill5=(unsigned char)(*(buf+0x10))+(unsigned char)(*(buf+0x11))*0x100;
	  m_data.Skill6=(unsigned char)(*(buf+0x12))+(unsigned char)(*(buf+0x13))*0x100;
	  m_data.Skill7=(unsigned char)(*(buf+0x14))+(unsigned char)(*(buf+0x15))*0x100;
	  m_data.Skill8=(unsigned char)(*(buf+0x16))+(unsigned char)(*(buf+0x17))*0x100;
	  m_data.Skill9=(unsigned char)(*(buf+0x18))+(unsigned char)(*(buf+0x19))*0x100;

	  //兵法
	  _int64 extras=(unsigned char)(*(buf+0x2f));
	  extras+=((unsigned char)(*(buf+0x30)))*0x100;
      extras+=((unsigned char)(*(buf+0x31)))*0x10000;
      extras+=((unsigned char)(*(buf+0x32)))*0x1000000;
      extras+=((unsigned char)(*(buf+0x33)))*0x100000000;
      extras+=((unsigned char)(*(buf+0x34)))*0x10000000000;

      _int64 flags=0x40000000;

	  i=31;
	  while(flags>0)
	  {
		 if(extras>=flags)
		 {
         if(i>=28) m_data.Extra_9[i-28]=TRUE;
		 else
		 if(i>=24) m_data.Extra_8[i-24]=TRUE;
         else
		 if(i>=20) m_data.Extra_7[i-20]=TRUE;
         else
		 if(i>=16) m_data.Extra_6[i-16]=TRUE;
         else
		 if(i>=13) m_data.Extra_5[i-13]=TRUE;
         else
		 if(i>=10) m_data.Extra_4[i-10]=TRUE;
         else
		 if(i>=7)  m_data.Extra_3[i-7]=TRUE;
         else
		 if(i>=4)  m_data.Extra_2[i-4]=TRUE;
         else
		 if(i>=1)  m_data.Extra_1[i-1]=TRUE;

		 extras-=flags;
		 }
		 flags/=2;
		 i--;
	  }

   return TRUE;
}

BOOL CGen::SaveBuffer()
{
	if(*(buf+0x25)!=(char)0xff)
	{
		if(m_FirstName=="" || m_SecondName=="") 
		{
			MessageBox("您还没有填写姓名!");
			return FALSE;
		}
		if(m_data.photo==0xffff) 
		{
		   MessageBox("您还没有选择容貌!");
		   return FALSE;
		}
        
		/*
		CString str;
		this->GetDlgItemText(IDC_PARENT,str);
		int num=atol(str);
		if( (num>785 && num!=65535) || str.GetLength()>5) 
		{
			MessageBox("父母编号范围是0-785,65535表示没有父母!");
			m_data.Parent=65535;
			this->SetDlgItemText(IDC_PARENT,"65535");
			return FALSE;
		}

	    this->GetDlgItemText(IDC_FRIEND,str);
		num=atol(str);
		if( (num>785 && num!=65535) || str.GetLength()>5) 
		{
			MessageBox("相性的范围是0-785,65535表示,没有相性相符的武将");
            m_data.Friend=65535;
			this->SetDlgItemText(IDC_FRIEND,"65535");
			return FALSE;
		}
		*/
	}

	strcpy(m_data.FirstName,m_FirstName);
	strcpy(m_data.SecondName,m_SecondName);
	strcpy(m_data.ThirdName,m_ThirdName);

	//开始保存m_data;

	//肖像
	*(buf+0x02)=m_data.photo&0xff;
	*(buf+0x03)=m_data.photo/0x100;

    //父母
	*(buf+0x04)=m_data.Parent&0xff;
	*(buf+0x05)=m_data.Parent/0x100;

	//相性
	*(buf+0x06)=m_data.Friend&0xff;
	*(buf+0x07)=m_data.Friend/0x100;

	//性别
    if(m_data.Sex) *(buf+0x1f)=0;
	else *(buf+0x1f)=1;

	//年龄
	*(buf+0x1a)=(char)(m_data.Birthday-130);

    //统率
    *(buf+0x1e)=(char)m_data.Basic_Command;
	//武力
    *(buf+0x1b)=(char)m_data.Basic_Force;
	//智力
    *(buf+0x1c)=(char)m_data.Basic_Brains;
	//政治
    *(buf+0x1d)=(char)m_data.Basic_Polity;

	int i;

    CString text;
    text=m_bgigb.GBtoBig(m_data.FirstName); 
	strcpy(m_data.FirstName,text);
    //姓
	for(i=0;i<4;i++)
	{
         if(i<text.GetLength())
         *(buf+i+0x35)=m_data.FirstName[i];
		 else
         *(buf+i+0x35)='\0';
	}
    strcpy(m_data.FirstName,m_bgigb.GetText());
	//名
    text=m_bgigb.GBtoBig(m_data.SecondName); 
	strcpy(m_data.SecondName,text);
	for(i=0;i<4;i++)
	{
         if(i<text.GetLength())
         *(buf+i+0x3a)=m_data.SecondName[i];
		 else 
		 *(buf+i+0x3a)='\0';
	}
    strcpy(m_data.SecondName,m_bgigb.GetText());
	//字
    text=m_bgigb.GBtoBig(m_data.ThirdName); 
	strcpy(m_data.ThirdName,text);

	for(i=0;i<4;i++)
	{
		 if(i<text.GetLength())
         *(buf+i+0x3f)=m_data.ThirdName[i];
		 else
		 *(buf+i+0x3f)='\0';
	}
    strcpy(m_data.ThirdName,m_bgigb.GetText());

    //信念
    *(buf+0x20)=(char)(m_data.Persuasion-1);
	//性格
    *(buf+0x21)=(char)(m_data.Kidney-1);

	//传记
    text=m_bgigb.GBtoBig(m_data.Biography); 
	m_data.Biography=text;
   
	for(i=0;i<150;i++)
	{
         if(i<m_data.Biography.GetLength())
         *(buf+i+0x4f)=m_data.Biography[i];
		 else
         *(buf+i+0x4f)='\0';
	}
    m_data.Biography=m_bgigb.GetText();

	*(buf+0x08)=(char)(m_data.Skill1&0xff);*(buf+0x09)=(char)(m_data.Skill1/0x100);
    *(buf+0x0a)=(char)(m_data.Skill2&0xff);*(buf+0x0b)=(char)(m_data.Skill2/0x100);
	*(buf+0x0c)=(char)(m_data.Skill3&0xff);*(buf+0x0d)=(char)(m_data.Skill3/0x100);
	*(buf+0x0e)=(char)(m_data.Skill4&0xff);*(buf+0x0f)=(char)(m_data.Skill4/0x100);
	*(buf+0x10)=(char)(m_data.Skill5&0xff);*(buf+0x11)=(char)(m_data.Skill5/0x100);
	*(buf+0x12)=(char)(m_data.Skill6&0xff);*(buf+0x13)=(char)(m_data.Skill6/0x100);
	*(buf+0x14)=(char)(m_data.Skill7&0xff);*(buf+0x15)=(char)(m_data.Skill7/0x100);
	*(buf+0x16)=(char)(m_data.Skill8&0xff);*(buf+0x17)=(char)(m_data.Skill8/0x100);
	*(buf+0x18)=(char)(m_data.Skill9&0xff);*(buf+0x19)=(char)(m_data.Skill9/0x100);

    //兵法
	_int64 extras=0;

	extras+=m_data.Extra_1[0]*0x1+m_data.Extra_1[1]*0x2+m_data.Extra_1[2]*0x4;
    extras+=m_data.Extra_2[0]*0x8+m_data.Extra_2[1]*0x10+m_data.Extra_2[2]*0x20;
	extras+=m_data.Extra_3[0]*0x40+m_data.Extra_3[1]*0x80+m_data.Extra_3[2]*0x100;
	extras+=m_data.Extra_4[0]*0x200+m_data.Extra_4[1]*0x400+m_data.Extra_4[2]*0x800;
	extras+=m_data.Extra_5[0]*0x1000+m_data.Extra_5[1]*0x2000+m_data.Extra_5[2]*0x4000;
	extras+=m_data.Extra_6[0]*0x8000+m_data.Extra_6[1]*0x10000+m_data.Extra_6[2]*0x20000+m_data.Extra_6[3]*0x40000;
	extras+=m_data.Extra_7[0]*0x80000+m_data.Extra_7[1]*0x100000+m_data.Extra_7[2]*0x200000+m_data.Extra_7[3]*0x400000;
	extras+=m_data.Extra_8[0]*0x800000+m_data.Extra_8[1]*0x1000000+m_data.Extra_8[2]*0x2000000+m_data.Extra_8[3]*0x4000000;
	extras+=m_data.Extra_9[0]*0x8000000+m_data.Extra_9[1]*0x10000000+m_data.Extra_9[2]*0x20000000+m_data.Extra_9[3]*0x40000000;
	

    *(buf+0x2f)=(char)(extras&0xff);extras/=0x100;
    *(buf+0x30)=(char)(extras&0xff);extras/=0x100;
    *(buf+0x31)=(char)(extras&0xff);extras/=0x100;
    *(buf+0x32)=(char)(extras&0xff);extras/=0x100;
    *(buf+0x33)=(char)(extras&0xff);extras/=0x100;
    *(buf+0x34)=(char)(extras&0xff);

	return TRUE;
}

BOOL CGen::SaveData()
{
	if(SaveBuffer()==FALSE) return FALSE;

    CFile file;
	if(m_index==-1)//重新确定m_index
	{
		if(file.Open(m_name,CFile::modeRead))
		{
		   char *tempbuf=new char[file.GetLength()+1];
		   file.Read(tempbuf,file.GetLength());
		   file.Close();
           int index=0;
		
		   while(*(tempbuf+4+index*m_len+0x25)!=(char)0xff)
		   {
			   index++;
		   }
		   
		   delete[] tempbuf;
		   m_index=index;
		}
		else
		{
			MessageBox("文件保存失败!");
			return FALSE;
		}
	}

    ::SetFileAttributes(m_name,FILE_ATTRIBUTE_NORMAL);

	if(file.Open(m_name,CFile::modeWrite))
	{
       long seek=0x04;
	   seek+=m_len*m_index;
	   file.Seek(seek,CFile::begin);
	   file.Write(buf,m_len);
	   file.Close();
	}
	else
	{
		MessageBox("保存失败!");
	}

	return TRUE;
}

void CGen::OnOK() //保存
{
	// TODO: Add extra validation here
	UpdateData();

	if(SaveData())
	CDialog::OnOK();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -