diff options
Diffstat (limited to 'src/uqm/loadship.c')
-rw-r--r-- | src/uqm/loadship.c | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/src/uqm/loadship.c b/src/uqm/loadship.c new file mode 100644 index 0000000..3396134 --- /dev/null +++ b/src/uqm/loadship.c @@ -0,0 +1,200 @@ +//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)); +} |