Example #1
0
void ChangePalette(SCNHANDLE hPal) {
	SwapPalette(FindPalette(hBgPal), hPal);

	SetBackPal(hPal);
}
Example #2
0
//writes out a tbg file
int Ctbg::ExportFile(int filetype, CString outfilepath, int type)
{
  CString outfilename;
  CString tmpstr;
  int count,maxcount;
  int i,j;
  int idx;
  int esize;
  int fhandle;
  int ret;

  idx=determinetype(filetype&0xfff);
  if(idx>NUM_OBJTYPE) return -99; //filetype not supported
  if(!tbgext[idx]) return -99;
  if(filetype&TBG_ALT)
  {
    outfilename.Format("%s%s#%c",outfilepath,itemname,tbgext[idx]);
  }
  else
  {
    if(tbgext[idx]=='-') outfilename.Format("%s%s",bgfolder,itemname);
    else outfilename.Format("%s%s-%c",outfilepath,itemname,tbgext[idx]);
  }
	if(type)
	{
		outfilename+=".tp2";
	}
	else
	{
		outfilename+=".tbg";
	}
  new_iap(); //clears headers & counters  
  switch(filetype)
  {
  case REF_CRE|TBG_ALT: //soundrefs
    header.filelength=SND_SLOT_COUNT*sizeof(long);
    ret=collect_creaturerefs(TBG_ALT);
    break;
  case REF_ITM:
    header.filelength=the_item.WriteItemToFile(0,1);
    ret=collect_itemrefs();
    break;
  case REF_SPL:
    header.filelength=the_spell.WriteSpellToFile(0,1);
    ret=collect_spellrefs();
    break;
  case REF_STO:
    header.filelength=the_store.WriteStoreToFile(0,1);
    ret=collect_storerefs();
    break;
  case REF_EFF:
    header.filelength=the_effect.WriteEffectToFile(0,1);
    ret=collect_effectrefs();
    break;
  case REF_ARE:
    header.filelength=the_area.WriteAreaToFile(0,1);
    ret=collect_arearefs();
    break;
  case REF_CRE:
    header.filelength=the_creature.WriteCreatureToFile(0,1);
    ret=collect_creaturerefs(0);
    break;
  case REF_WMP:
    header.filelength=the_map.WriteMapToFile(0,1);
    ret=collect_worldmaprefs();
    break;
  case REF_CHU:
    header.filelength=the_chui.WriteChuiToFile(0,1);
    ret=collect_chuirefs();
    break;
  case REF_SRC:
    header.filelength=the_src.WriteStringToFile(0,1);
    ret=collect_srcrefs();
    break;
  case REF_DLG:
    header.filelength=the_dialog.WriteDialogToFile(0,1);
    ret=collect_dlgrefs();
    break;
  case REF_PRO:
    header.filelength=the_projectile.WriteProjectileToFile(0,1);
    ret=collect_prorefs();
    break;
  default:
    ret=-99;
  }
  if(ret<0) return ret;
	if (type)
	{
		return OutputTP2(outfilename);
	}
  memcpy(header.signature,"TBG4",4);
  if(filetype&TBG_ALT) header.signature[3]=(char) toupper(tbgext[idx]);

  maxcount=header.strrefcount=header.tlkentrycount;
  for(count=0;count<maxcount;count++) tlkentries[count].strrefoffset=count;
  for(count=0;count<header.tlkentrycount;count++)
  {
    for(i=0;i<count;i++)
    {
      //now we use this offset as strref (it will be used differently elsewhere)
      if(tlkentries[count].offset==tlkentries[i].offset)
      {
        //moving the strrref of the same type forward
        SwapPalette(strrefs, tlkentries[i].strrefoffset, tlkentries[count].strrefoffset);
        //removing the tlk header of the same type (# is in count)
        memmove(tlkentries+count, tlkentries+count+1, (maxcount-count-1)*sizeof(tbg_tlk_reference));
        memset(tlkentries+maxcount-1,-1,sizeof(tbg_tlk_reference) );
        //incrementing the ref. count of the previous entry
        tlkentries[i].strrefcount++;
        //adjusting the other entries
        for(j=i+1;j<count;j++)
        {
          tlkentries[j].strrefoffset++;
        }
        header.tlkentrycount--;
        count--;
        break;
      }
    }
  }

  tmpstr.Format("%s%s",itemname,objexts[idx]);
  strncpy(header.filename,tmpstr,sizeof(header.filename) );
  header.genre=get_genre();
  header.tlkentryoffset=sizeof(tbg4_header);
  header.strrefoffset=header.tlkentryoffset+header.tlkentrycount*sizeof(tbg_tlk_reference);
  header.asciioffset=header.strrefoffset+header.strrefcount*sizeof(unsigned long);
  header.fileoffset=header.asciioffset+header.asciicount*sizeof(unsigned long);
  header.textentryoffset=header.fileoffset+header.filelength;

  //adjusting strref offsets
  //setting string offsets (we used this as pointer offset)
  m_tbgnames=new CString[maxcount];
  if(!m_tbgnames) return -3;
  count=0;
  for(i=0;i<header.tlkentrycount;i++)
  {
    m_tbgnames[i]=tlk_entries[0][tlkentries[i].offset].text;
    tlkentries[i].offset=count;
    count+=m_tbgnames[i].GetLength();
  }
  fhandle=open(outfilename, O_RDWR|O_BINARY|O_TRUNC|O_CREAT,S_IREAD|S_IWRITE);
  if(fhandle<1) return -2;
  if(write(fhandle,&header,sizeof(header) )!=sizeof(header) )
  {
    ret=-2;
    goto endofquest;
  }
  esize=header.tlkentrycount*sizeof(tbg_tlk_reference);
  if(write(fhandle,tlkentries,esize )!=esize)
  {
    ret=-2;
    goto endofquest;
  }
  esize=header.strrefcount*sizeof(unsigned long);
  if(write(fhandle,strrefs,esize)!=esize)
  {
    ret=-2;
    goto endofquest;
  }
  switch(filetype)
  {
  case REF_CRE|TBG_ALT: write(fhandle,the_creature.header.strrefs,header.filelength); break;
  case REF_ITM: the_item.WriteItemToFile(fhandle,0); break;
  case REF_SPL: the_spell.WriteSpellToFile(fhandle,0); break;
  case REF_STO: the_store.WriteStoreToFile(fhandle,0); break;
  case REF_EFF: the_effect.WriteEffectToFile(fhandle,0); break;
  case REF_ARE: the_area.WriteAreaToFile(fhandle,0); break;
  case REF_CRE: the_creature.WriteCreatureToFile(fhandle,0); break;
  case REF_WMP: the_map.WriteMapToFile(fhandle,0); break;
  case REF_CHU: the_chui.WriteChuiToFile(fhandle,0); break;
  case REF_SRC: the_src.WriteStringToFile(fhandle,0); break;
  case REF_DLG: the_dialog.WriteDialogToFile(fhandle,0); break;
  case REF_PRO: the_projectile.WriteProjectileToFile(fhandle,0); break;
  default: ret=-99;
  }
  for(i=0;i<header.tlkentrycount;i++)
  {
    if(write(fhandle,m_tbgnames[i].GetBuffer(0),tlkentries[i].length)!=tlkentries[i].length)
    {
      ret=-2;
      goto endofquest;
    }
  }
endofquest:
  close(fhandle);
  return ret;
}