/* * Arcanum Editor - ROM area editor * Copyright (C) 1999 Lucas Wall <kthulhu@usa.net> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * * If you make changes to the source and want to make the public you can * mail the diferences to me <kthulhu@usa.net> and I'll add them to the * main distribution. Of course your name will be added to the program with * information about the changes you made. * * * Packed on Thu Aug 19 03:02:27 1999 * */ /* * File: Tables.cpp * * Changes: * * 19/08/99 Lucas Wall <kthulhu@usa.net> * First source release. Its quite messy and has no * comments. I never planed to release the source code... :-) * */ // Tables.cpp: implementation of the CTables class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "arcaed.h" #include "Tables.h" #include "fread.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // CNumStrData Class ////////////////////////////////////////////////////////////////////// template <> void AFXAPI DestructElements <CNumStrData*> ( CNumStrData** pElements, int nCount ) { for ( int i = 0; i < nCount; i++, pElements++ ) { delete *pElements; } } template <> void AFXAPI DestructElements <CObjTypeData*> ( CObjTypeData** pElements, int nCount ) { for ( int i = 0; i < nCount; i++, pElements++ ) { delete *pElements; } } template <> void AFXAPI DestructElements <CColorData*> ( CColorData** pElements, int nCount ) { for ( int i = 0; i < nCount; i++, pElements++ ) { delete *pElements; } } ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CNumStrData::CNumStrData() { m_num = 0; m_text = ""; m_show = ""; } CNumStrData::~CNumStrData() { } const CNumStrData& CNumStrData::operator=( const CNumStrData &data ) { m_num = data.m_num; m_text = data.m_text; m_show = data.m_show; return *this; } ////////////////////////////////////////////////////////////////////// // CObjTypeData Class ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CObjTypeData::CObjTypeData() { m_num = 0; m_text = ""; } CObjTypeData::~CObjTypeData() { } ////////////////////////////////////////////////////////////////////// // CObjVData Class ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CObjVData::CObjVData() { m_fixedtable = TABLE_NEW; m_text = ""; m_type = 'N'; } CObjVData::~CObjVData() { } ////////////////////////////////////////////////////////////////////// // CColorData Class ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CColorData::CColorData() { m_num = m_r = m_g = m_b = 0; } CColorData::~CColorData() { } ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CTables::CTables() { m_isdoor = 0; m_locked = 0; m_mudtype = MUD_ARCANUM; m_mobprog = TRUE; } CTables::~CTables() { } int CTables::load_data( char *fname, int *line ) { CFile f; if( !f.Open( fname, CFile::modeRead ) ) return TRUE; CArchive ar( &f, CArchive::load ); *line = 0; while( true ) { char letter; CString word; int res; while( ( letter = fread_letter( ar ) ) != '#' && letter != 0 ); if ( letter == 0 ) break; word = fread_word( ar ); word.MakeUpper(); res = TRUE; if ( word == "END" ) break; else if ( word == "GENERAL" ) res = load_general( ar ); else if ( word == "SECTORTYPE" ) res = load_sectortypes( ar ); else if ( word == "ROOMFLAGS" ) res = load_flags( ar, m_roomflags ); else if ( word == "EXITFLAGS" ) res = load_flags( ar, m_exitflags ); else if ( word == "OBJTYPES" ) res = load_objtypes( ar ); else if ( word == "OBJTABLES" ) res = load_objtables( ar ); else if ( word == "EXTRAFLAGS" ) res = load_flags( ar, m_extra_flags ); else if ( word == "WEARFLAGS" ) res = load_flags( ar, m_wear_flags ); else if ( word == "SPELLS" ) res = load_flags( ar, m_spells ); else if ( word == "WEAPONCLASES" ) res = load_flags( ar, m_weapon_clases ); else if ( word == "LIQUIDS" ) res = load_flags( ar, m_liquids ); else if ( word == "ATTACKTYPES" ) res = load_strlist( ar, m_attack_types ); else if ( word == "PORTALFLAGS" ) res = load_flags( ar, m_portal_flags ); else if ( word == "AFFECTFLAGS" ) res = load_flags( ar, m_affect_flags ); else if ( word == "AFFECTLOCATION" ) res = load_numlist( ar, m_affect_location ); else if ( word == "IMMFLAGS" ) res = load_flags( ar, m_imm_flags ); else if ( word == "MERCMSG" ) res = load_numlist( ar, m_mercmsg ); else if ( word == "MOBFLAGS" ) res = load_mobflags( ar ); else if ( word == "ACTFLAGS" ) res = load_flags( ar, m_act_flags ); else if ( word == "OFFFLAGS" ) res = load_flags( ar, m_off_flags ); else if ( word == "PARTS" ) res = load_flags( ar, m_parts_flags ); else if ( word == "FORM" ) res = load_flags( ar, m_form_flags ); else if ( word == "SEX" ) res = load_flags( ar, m_sex ); else if ( word == "SIZE" ) res = load_flags( ar, m_size ); else if ( word == "POS" ) res = load_strlist( ar, m_pos ); else if ( word == "MOBPROGTRIG" ) res = load_flags( ar, m_mobprog_trigs ); else if ( word == "SKILLS" ) res = load_flags( ar, m_skills ); else if ( word == "TRAINFLAGS" ) res = load_flags( ar, m_train_flags ); else if ( word == "WEARPOS" ) res = load_numlist( ar, m_wearpos ); else if ( word == "DIRNAME" ) res = load_numlist( ar, m_dirname ); else if ( word == "RECUNAME" ) res = load_numlist( ar, m_recuname ); else if ( word == "SECTORCOLORS" ) res = load_colorlist( ar, m_sector_colors ); else if ( word == "AFFTO" ) res = load_numlist( ar, m_aff_to ); else if ( word == "CLASSES" ) res = load_numlist( ar, m_classes ); if ( res ) { ar.Close(); f.Close(); return TRUE; } } ar.Close(); f.Close(); return FALSE; } int CTables::load_sectortypes( CArchive &ar ) { CString text; CNumStrData *sector; while ( true ) { text = fread_word( ar ); text.MakeLower(); if ( text == "end" ) break; if ( text == "" ) return TRUE; sector = new CNumStrData(); sector->m_text = text; sector->m_num = fread_number( ar ); m_sectortypes.Add( sector ); } return FALSE; } int CTables::load_objtypes( CArchive &ar ) { CString text; CObjTypeData *objtype; int i; while ( true ) { text = fread_word( ar ); text.MakeLower(); if ( text == "end" ) break; if ( text == "" ) return TRUE; objtype = new CObjTypeData(); objtype->m_text = text; objtype->m_num = fread_number( ar ); for ( i = 0; i < 5; i++ ) { objtype->m_value[i].m_text = fread_string( ar ); objtype->m_value[i].m_type = toupper( fread_letter( ar ) ); } m_objtypes.Add( objtype ); } return FALSE; } int CTables::load_flags( CArchive &ar, CArray< CNumStrData*, CNumStrData* > &flaglist ) { CString text; CNumStrData *flags; while ( true ) { text = fread_word( ar ); text.MakeLower(); if ( text == "end" ) break; if ( text == "" ) return TRUE; flags = new CNumStrData(); flags->m_text = text; flags->m_num = convert_flag( fread_word( ar )[0] ); flaglist.Add( flags ); } return FALSE; } int CTables::load_numlist( CArchive &ar, CArray< CNumStrData*, CNumStrData* > &flaglist ) { CString text; CNumStrData *flags; while ( true ) { text = fread_word( ar ); text.MakeLower(); if ( text == "end" ) break; if ( text == "" ) return TRUE; flags = new CNumStrData(); flags->m_text = text; flags->m_num = fread_number( ar ); flaglist.Add( flags ); } return FALSE; } int CTables::load_strlist( CArchive &ar, CArray< CNumStrData*, CNumStrData* > &flaglist ) { CString text; CNumStrData *flags; while ( true ) { text = fread_word( ar ); text.MakeLower(); if ( text == "end" ) break; if ( text == "" ) return TRUE; flags = new CNumStrData(); flags->m_text = text; flags->m_show = fread_word( ar ); flaglist.Add( flags ); } return FALSE; } int CTables::load_colorlist( CArchive &ar, CArray< CColorData*, CColorData* > &colorlist ) { CString text; CColorData *color; while ( true ) { text = fread_word( ar ); text.MakeLower(); if ( text == "end" ) break; if ( text == "" ) return TRUE; color = new CColorData(); color->m_num = atoi( text ); color->m_r = fread_number( ar ); color->m_g = fread_number( ar ); color->m_b = fread_number( ar ); colorlist.Add( color ); } return FALSE; } int CTables::load_mobflags( CArchive &ar ) { CString text; CMobFlags *mobflags; while ( true ) { text = fread_word( ar ); text.MakeLower(); if ( text == "end" ) break; if ( text == "" ) return TRUE; mobflags = new CMobFlags(); mobflags->m_race = text; mobflags->m_act = fread_flags( ar ); mobflags->m_aff = fread_flags( ar ); mobflags->m_off = fread_flags( ar ); mobflags->m_imm = fread_flags( ar ); mobflags->m_res = fread_flags( ar ); mobflags->m_vul = fread_flags( ar ); mobflags->m_for = fread_flags( ar ); mobflags->m_par = fread_flags( ar ); m_mobflags.Add( mobflags ); } return FALSE; } int CTables::load_objtables(CArchive & ar) { CString text; int objtype, value, num; CNumStrData *flags; num = fread_number( ar ); value = fread_number( ar ); for ( objtype = 0; objtype < m_objtypes.GetSize(); objtype++ ) if ( m_objtypes[objtype]->m_num == num ) break; if ( objtype >= m_objtypes.GetSize() ) return TRUE; if ( value > 4 || value < 0 ) return TRUE; text = fread_word( ar ); text.MakeUpper(); if ( text == "SPELLS" ) { m_objtypes[objtype]->m_value[value].m_fixedtable = TABLE_SPELLS; return FALSE; } else if ( text == "WEAPON_CLASES" ) { m_objtypes[objtype]->m_value[value].m_fixedtable = TABLE_WEAPON_CLASES; return FALSE; } else if ( text == "LIQUIDS" ) { m_objtypes[objtype]->m_value[value].m_fixedtable = TABLE_LIQUIDS; return FALSE; } else if ( text == "ATTACK_TYPES" ) { m_objtypes[objtype]->m_value[value].m_fixedtable = TABLE_ATTACK_TYPES; return FALSE; } else if ( text == "EXIT_FLAGS" ) { m_objtypes[objtype]->m_value[value].m_fixedtable = TABLE_EXIT_FLAGS; return FALSE; } else if ( text == "PORTAL_FLAGS" ) { m_objtypes[objtype]->m_value[value].m_fixedtable = TABLE_PORTAL_FLAGS; return FALSE; } else if ( text == "NEW" ) m_objtypes[objtype]->m_value[value].m_fixedtable = TABLE_NEW; else return TRUE; while ( true ) { text = fread_word( ar ); text.MakeLower(); if ( text == "end" ) break; if ( text == "" ) return TRUE; flags = new CNumStrData(); flags->m_text = text; flags->m_num = convert_flag( fread_letter( ar ) ); m_objtypes[objtype]->m_value[value].m_table.Add( flags ); } return FALSE; } CArray< CNumStrData*, CNumStrData* > *CTables::get_table( int objtype, int value ) { int index; for ( index = 0; index < tables.m_objtypes.GetSize(); index ++ ) if ( objtype == tables.m_objtypes[index]->m_num ) break; if ( index >= tables.m_objtypes.GetSize() || value < 0 || value > 4 ) return NULL; switch ( tables.m_objtypes[index]->m_value[value].m_fixedtable ) { case TABLE_SPELLS: return &tables.m_spells; case TABLE_WEAPON_CLASES: return &tables.m_weapon_clases; case TABLE_LIQUIDS: return &tables.m_liquids; case TABLE_ATTACK_TYPES: return &tables.m_attack_types; case TABLE_EXIT_FLAGS: return &tables.m_exitflags; case TABLE_PORTAL_FLAGS: return &tables.m_portal_flags; } return &tables.m_objtypes[index]->m_value[value].m_table; } int CTables::load_general( CArchive &ar ) { CString word; while ( TRUE ) { word = fread_word( ar ); word.MakeUpper(); if ( word == "END" ) return FALSE; else if ( word == "MUDTYPE" ) { word = fread_word( ar ); word.MakeUpper(); if ( word == "ARCANUM" ) m_mudtype = MUD_ARCANUM; else if ( word == "ROMDEFAULT" ) m_mudtype = MUD_ROMDEFAULT; else if ( word == "ROMOLC" ) m_mudtype = MUD_ROMOLC; else return TRUE; } else if ( word == "ISDOOR" ) m_isdoor = fread_flags( ar ); else if ( word == "LOCKED" ) m_locked = fread_flags( ar ); else if ( word == "MOBPROG" ) m_mobprog = fread_number( ar ); else return TRUE; } return TRUE; }