//Copyright Paul Reiche, Fred Ford. 1992-2002 /* * 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 * (at your option) 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. */ #include "build.h" #include "coderes.h" #include "corecode.h" #include "globdata.h" #include "nameref.h" #include "races.h" #include "init.h" static RESOURCE code_resources[] = { NULL_RESOURCE, ARILOU_CODE, CHMMR_CODE, HUMAN_CODE, ORZ_CODE, PKUNK_CODE, SHOFIXTI_CODE, SPATHI_CODE, SUPOX_CODE, THRADDASH_CODE, UTWIG_CODE, VUX_CODE, YEHAT_CODE, MELNORME_CODE, DRUUGE_CODE, ILWRATH_CODE, MYCON_CODE, SLYLANDRO_CODE, UMGAH_CODE, URQUAN_CODE, ZOQFOTPIK_CODE, SYREEN_CODE, KOHR_AH_CODE, ANDROSYNTH_CODE, CHENJESU_CODE, MMRNMHRM_CODE, SIS_CODE, SAMATRA_CODE, URQUAN_DRONE_CODE }; RACE_DESC * load_ship (SPECIES_ID SpeciesID, BOOLEAN LoadBattleData) { RACE_DESC *RDPtr = 0; void *CodeRef; if (SpeciesID >= NUM_SPECIES_ID) return NULL; CodeRef = CaptureCodeRes (LoadCodeRes (code_resources[SpeciesID]), &GlobData, (void **)(&RDPtr)); if (!CodeRef) goto BadLoad; RDPtr->CodeRef = CodeRef; if (RDPtr->ship_info.icons_rsc != NULL_RESOURCE) { RDPtr->ship_info.icons = CaptureDrawable (LoadGraphic ( RDPtr->ship_info.icons_rsc)); if (!RDPtr->ship_info.icons) { /* goto BadLoad */ } } if (RDPtr->ship_info.melee_icon_rsc != NULL_RESOURCE) { RDPtr->ship_info.melee_icon = CaptureDrawable (LoadGraphic ( RDPtr->ship_info.melee_icon_rsc)); if (!RDPtr->ship_info.melee_icon) { /* goto BadLoad */ } } if (RDPtr->ship_info.race_strings_rsc != NULL_RESOURCE) { RDPtr->ship_info.race_strings = CaptureStringTable (LoadStringTable ( RDPtr->ship_info.race_strings_rsc)); if (!RDPtr->ship_info.race_strings) { /* goto BadLoad */ } } if (LoadBattleData) { DATA_STUFF *RawPtr = &RDPtr->ship_data; if (!load_animation (RawPtr->ship, RawPtr->ship_rsc[0], RawPtr->ship_rsc[1], RawPtr->ship_rsc[2])) goto BadLoad; if (RawPtr->weapon_rsc[0] != NULL_RESOURCE) { if (!load_animation (RawPtr->weapon, RawPtr->weapon_rsc[0], RawPtr->weapon_rsc[1], RawPtr->weapon_rsc[2])) goto BadLoad; } if (RawPtr->special_rsc[0] != NULL_RESOURCE) { if (!load_animation (RawPtr->special, RawPtr->special_rsc[0], RawPtr->special_rsc[1], RawPtr->special_rsc[2])) goto BadLoad; } if (RawPtr->captain_control.captain_rsc != NULL_RESOURCE) { RawPtr->captain_control.background = CaptureDrawable (LoadGraphic ( RawPtr->captain_control.captain_rsc)); if (!RawPtr->captain_control.background) goto BadLoad; } if (RawPtr->victory_ditty_rsc != NULL_RESOURCE) { RawPtr->victory_ditty = LoadMusic (RawPtr->victory_ditty_rsc); if (!RawPtr->victory_ditty) goto BadLoad; } if (RawPtr->ship_sounds_rsc != NULL_RESOURCE) { RawPtr->ship_sounds = CaptureSound ( LoadSound (RawPtr->ship_sounds_rsc)); if (!RawPtr->ship_sounds) goto BadLoad; } } ExitFunc: return RDPtr; // TODO: We should really free the resources that did load here BadLoad: if (CodeRef) DestroyCodeRes (ReleaseCodeRes (CodeRef)); RDPtr = 0; /* failed */ goto ExitFunc; } void free_ship (RACE_DESC *raceDescPtr, BOOLEAN FreeIconData, BOOLEAN FreeBattleData) { if (raceDescPtr->uninit_func != NULL) (*raceDescPtr->uninit_func) (raceDescPtr); if (FreeBattleData) { DATA_STUFF *shipData = &raceDescPtr->ship_data; free_image (shipData->special); free_image (shipData->weapon); free_image (shipData->ship); DestroyDrawable ( ReleaseDrawable (shipData->captain_control.background)); DestroyMusic (shipData->victory_ditty); DestroySound (ReleaseSound (shipData->ship_sounds)); } if (FreeIconData) { SHIP_INFO *shipInfo = &raceDescPtr->ship_info; DestroyDrawable (ReleaseDrawable (shipInfo->melee_icon)); DestroyDrawable (ReleaseDrawable (shipInfo->icons)); DestroyStringTable (ReleaseStringTable (shipInfo->race_strings)); } DestroyCodeRes (ReleaseCodeRes (raceDescPtr->CodeRef)); }