void ChangePalette(SCNHANDLE hPal) { SwapPalette(FindPalette(hBgPal), hPal); SetBackPal(hPal); }
//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; }