/***********************************************************************************
* *
* _______.____ __ ____ _______ _______ *
* / |\ \ / \ / / _ | ____| __ | ____| *
* | (----` \ \/ \/ / (_) | |__ ____ _/ |_ | |__ *
* \ \ \ / _ | __| / _ \ \ __\ | __| *
* .----) | \ /\ / (_) | | ( <_> ) | | | |____ *
* |_______/ \__/ \__/ |__| \____/ |__| |_______| *
* *
* SWFotE v2.0 (FotE v1.1 cleaned up and considerably modded) by: *
* Greg (Keberus) Mosley *
* Roman (Trelar) Arnold *
* *
* SWFotE v1 & v1.1 copyright (c) 2002 was created by *
* Chris 'Tawnos' Dary (cadary@uwm.edu), *
* Korey 'Eleven' King (no email), *
* Matt 'Trillen' White (mwhite17@ureach.com), *
* Daniel 'Danimal' Berrill (danimal924@yahoo.com), *
* Richard 'Bambua' Berrill (email unknown), *
* Stuart 'Ackbar' Unknown (email unknown) *
* *
* SWR 1.0 copyright (c) 1997, 1998 was created by Sean Cooper *
* based on a concept and ideas from the original SWR immortals: *
* Himself (Durga), Mark Matt (Merth), Jp Coldarone (Exar), Greg Baily (Thrawn), *
* Ackbar, Satin, Streen and Bib as well as much input from our other builders *
* and players. *
* *
* Original SMAUG 1.4a written by Thoric (Derek Snider) with Altrag, *
* Blodkai, Haus, Narn, Scryn, Swordbearer, Tricops, Gorog, Rennard, *
* Grishnakh, Fireblade, and Nivek. *
* *
* Original MERC 2.1 code by Hatchet, Furey, and Kahn. *
* *
* Original DikuMUD code by: Hans Staerfeldt, Katja Nyboe, Tom Madsen, *
* Michael Seifert, and Sebastian Hammer. *
* *
***********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "mud.h"
BMARKET_DATA *first_market_ship;
BMARKET_DATA *last_market_ship;
#if defined(KEY)
#undef KEY
#endif
#define KEY( literal, field, value ) \
if ( !str_cmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
typedef enum
{
SP_NOT_SET,SP_COCKPIT,SP_ENTRANCE,SP_HANGER1, SP_HANGER2, SP_HANGER3, SP_HANGER4,SP_ENGINEROOM,
SP_PILOT,SP_COPILOT,SP_NAVIGATOR,SP_GUNNER,SP_TURRET1,SP_TURRET2,SP_TURRET3,SP_TURRET4,SP_TURRET5,
SP_TURRET6,SP_TURRET7,SP_TURRET8,SP_TURRET9,SP_TURRET10,SP_OTHER
} ship_proto_room_types;
struct ship_prototypes_struct
{
char *name;
char *sname;
char *clan;
int num_rooms;
int cost;
int class;
int tractor;
int primaryType;
int secondaryType;
int primaryCount;
int secondaryCount;
int range_weapons[3];
int hull;
int shields;
int energy;
int chaff;
int maxbombs;
int speed;
int hyperspeed;
int manuever;
int turrets;
int maxcargo;
int mods;
//int plasma;
};
struct ship_prototypes_struct ship_prototypes[256];
int NUM_PROTOTYPES;
typedef struct prototype_room PROTO_ROOM;
struct prototype_room
{
int what_prototype;
PROTO_ROOM *next;
PROTO_ROOM *prev;
char *name;
char *desc;
char *flags;
int tunnel;
int exits[10];
int exflags[10];
int keys[10];
int room_num;
int room_type;
char *rprog[10];
char *reset[10];
};
PROTO_ROOM *first_prototype_room;
PROTO_ROOM *last_prototype_room;
void instaroom( AREA_DATA *pArea, ROOM_INDEX_DATA *pRoom, bool dodoors );
void shiplist(CHAR_DATA *ch);
char *primary_beam_name_proto(int shiptype);
char *secondary_beam_name_proto(int shiptype);
void do_buymobship(CHAR_DATA *ch, char *argument )
{
int x,size,ship_type,vnum,count,caps;
SHIP_DATA *ship;
SHIP_DATA *sship;
char arg[MAX_STRING_LENGTH];
char shipname[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
bool found_proto = FALSE;
AREA_DATA *tarea;
CLAN_DATA *clan;
CLAN_DATA *mainclan;
SPACE_DATA *system;
PLANET_DATA *planet;
bool fsys, fplan, fcap;
argument = one_argument(argument,arg);
if(!arg || !argument)
{
send_to_char("Usage: buymobship <ship type> <starsystem to be sent to>\n\r", ch);
return;
}
if ( IS_NPC(ch) || !ch->pcdata )
{
send_to_char( "&ROnly players can do that!\r\n" ,ch );
return;
}
if ( !ch->pcdata->clan )
{
send_to_char( "You do not belong to any organization.\r\n" ,ch );
return;
}
clan = ch->pcdata->clan;
mainclan = ch->pcdata->clan->mainclan ? ch->pcdata->clan->mainclan : clan;
if ( ( ch->pcdata->bestowments
&& is_name("clanbuyship", ch->pcdata->bestowments))
|| !str_cmp( ch->name, clan->leader ))
;
else
{
send_to_char( "Your organization hasn't seen fit to bestow you with that ability.\r\n" ,ch );
return;
}
if(arg == NULL || !arg || arg[0] == '\0')
{
send_to_char("\n\r&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Available ships &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
for(x=0;x<NUM_PROTOTYPES;x++)
{
if(!ch->pcdata->clan && (!str_cmp(ship_prototypes[x].clan, "The Empire")
|| !str_cmp(ship_prototypes[x].clan, "The New Republic"))) continue;
if(ch->pcdata->clan && str_cmp(ship_prototypes[x].clan, ch->pcdata->clan->name) && str_cmp(ship_prototypes[x].clan, "")) continue;
if(ch->pcdata->clan && str_cmp(ship_prototypes[x].clan, ch->pcdata->clan->name)) continue;
if(ship_prototypes[x].class!= 0 && ship_prototypes[x].class!= 1 && ship_prototypes[x].class!= 2) continue;
ch_printf(ch,"&W|&w %s%-39.39s&W Type: &w%-13.13s &WCost:&w %8d &W|\r\n",
!str_cmp(ship_prototypes[x].clan, "The Empire") ? "&R" :
!str_cmp(ship_prototypes[x].clan, "The New Republic") ? "&G" : "&w",
ship_prototypes[x].name,
ship_prototypes[x].class == 0 ? "Fighter" :
ship_prototypes[x].class == 1 ? "Bomber" :
ship_prototypes[x].class == 2 ? "Midtarget" : "Spacecraft",
ship_prototypes[x].cost);
}
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Refer to 'shiplist' for a complete ship listing &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\n\r",ch);
return;
}
size = NUM_PROTOTYPES;
for(x=0;x<size;x++)
{
if(nifty_is_name_prefix(arg,ship_prototypes[x].name)) {
found_proto = TRUE;
break;
}
}
if(!found_proto)
{
send_to_char("\n\r&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Available ships &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
for(x=0;x<NUM_PROTOTYPES;x++)
{
if(!ch->pcdata->clan && (!str_cmp(ship_prototypes[x].clan, "The Empire")
|| !str_cmp(ship_prototypes[x].clan, "The New Republic"))) continue;
if(ch->pcdata->clan && str_cmp(ship_prototypes[x].clan, ch->pcdata->clan->name) && str_cmp(ship_prototypes[x].clan, "")) continue;
if(ch->pcdata->clan && str_cmp(ship_prototypes[x].clan, ch->pcdata->clan->name)) continue;
if(ship_prototypes[x].class!= 0 && ship_prototypes[x].class!= 1 && ship_prototypes[x].class!= 2) continue;
ch_printf(ch,"&W|&w %s%-39.39s&W Type: &w%-13.13s &WCost:&w %8d &W|\r\n",
!str_cmp(ship_prototypes[x].clan, "The Empire") ? "&R" :
!str_cmp(ship_prototypes[x].clan, "The New Republic") ? "&G" : "&w",
ship_prototypes[x].name,
ship_prototypes[x].class == 0 ? "Fighter" :
ship_prototypes[x].class == 1 ? "Bomber" :
ship_prototypes[x].class == 2 ? "Midtarget" : "Spacecraft",
ship_prototypes[x].cost);
}
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Refer to 'shiplist' for a complete ship listing &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\n\r",ch);
return;
}
ship_type = x;
// Modify later. -||
if( (clan->clan_type == 0) &&
str_cmp(ship_prototypes[ship_type].clan, ch->pcdata->clan->name))
{
send_to_char("Your organization may only purchase its own ship models.\n\r", ch);
return;
}
if(ship_prototypes[x].class!= 0 && ship_prototypes[x].class!= 1 && ship_prototypes[x].class!= 2)
{
send_to_char("You may only purchase fighters, bombers, or midtargets for mobile ships.\n\r", ch);
return;
}
vnum = find_vnum_block(ship_prototypes[ship_type].num_rooms);
if(vnum == -1)
{
send_to_char("There was a problem with your ship: free vnums. Notify an administrator.\r\n",ch);
bug("Ship area is low on vnums.",0);
return;
}
switch(ship_type)
{
default: sprintf(shipname, "Mobile Ship MS"); break;
// NR
case 0: sprintf(shipname, "X-Wing Snubfighter MXW"); break;
case 1: sprintf(shipname, "A-Wing Scout MAW"); break;
case 2: sprintf(shipname, "B-Wing Heavy Fighter MBW"); break;
case 3: sprintf(shipname, "Y-Wing Bomber MYB"); break;
case 4: sprintf(shipname, "K-Wing Heavy Bomber MKW"); break;
// Imp
case 6: sprintf(shipname, "TIE Fighter MTF"); break;
case 7: sprintf(shipname, "TIE Bomber MTB"); break;
case 8: sprintf(shipname, "TIE Defender MTD"); break;
case 9: sprintf(shipname, "XM-1 Missileboat MXM"); break;
case 10: sprintf(shipname, "XG-1 Assault Gunboat MXG"); break;
}
sprintf(shipname,"%s%d (%s)",shipname,number_range(1111, 9999),ship_prototypes[ship_type].sname);
if(ch->pcdata->clan->funds < ship_prototypes[ship_type].cost)
{
send_to_char("Your organization cannot pay for that ship.\r\n",ch);
return;
}
clan = ch->pcdata->clan;
mainclan = ch->pcdata->clan->mainclan ? ch->pcdata->clan->mainclan : clan;
if ( ( ch->pcdata->bestowments
&& is_name("clanbuyship", ch->pcdata->bestowments))
|| !str_cmp( ch->name, clan->leader ))
;
else
{
send_to_char( "Your organization hasn't seen fit to bestow you with that ability.\r\n" ,ch );
return;
}
fsys = fplan = fcap = FALSE;
for(system = first_starsystem; system; system = system->next)
{
if(nifty_is_name(argument, system->name))
{
fsys = TRUE;
break;
}
}
if(!fsys)
{
send_to_char("No such starsystem.\n\r", ch);
return;
}
for(planet = system->first_planet; planet; planet = planet->next_in_system)
{
if(ch->pcdata->clan == planet->governed_by)
fplan = TRUE;
}
if(!fplan)
{
send_to_char("Your organization does not control any planets in that starsystem.\n\r", ch);
return;
}
count = 0;
for(sship = system->first_ship; sship; sship = sship->next_in_starsystem)
{
if(sship->type == MOB_SHIP) count++;
if(sship->class >= SHIP_CRUISER) { fcap = TRUE; caps++; }
}
if(!fcap)
{
send_to_char("There isn't a capital class ship in that starsystem.\n\r", ch);
return;
}
if(count > 3*caps)
{
send_to_char("You can only have 3 mobile ships per capital-class ship in a system.\n\r", ch);
return;
}
for ( tarea = first_area; tarea; tarea = tarea->next )
if ( !str_cmp( SHIP_AREA, tarea->filename ) )
break;
if(make_prototype_rooms(ship_type,vnum,tarea,shipname) == -1)
{
send_to_char("There was a problem with your ship: unable to create a room. Notify an administrator.\r\n",ch);
bug("Ship area unable to make_room.",0);
return;
}
ch->pcdata->clan->funds -= ship_prototypes[ship_type].cost*1.3;
ch_printf(ch, "It costs %d to build the ship and %d to train a pilot.\n\r",
ship_prototypes[ship_type].cost, ship_prototypes[ship_type].cost/3);
ch_printf(ch, "%s is quickly dispatched to the %s system.\n\r", shipname, system->name);
ship = make_prototype_ship(ship_type,vnum,ch,shipname);
ship->owner = STRALLOC(ch->pcdata->clan->name);
save_ship( ship );
write_ship_list( );
extract_ship(ship);
ship_to_starsystem(ship, system);
ship->location = 0;
ship->inship = NULL;
ship->type = MOB_SHIP;
if(ship->home) STRFREE(ship->home);
ship->home = STRALLOC(system->name);
ship->hx = ship->hy = ship->hz = 1;
ship->vx = number_range(-3000, 3000);
ship->vy = number_range(-3000, 3000);
ship->vz = number_range(-3000, 3000);
ship->autopilot = TRUE;
sprintf(buf, "%s enters the starsystem at %.0f %.0f %.0f", ship->name, ship->vx, ship->vy, ship->vz);
echo_to_system(AT_YELLOW, ship, buf, NULL);
return;
}
void do_orderclanship(CHAR_DATA *ch, char *argument )
{
int x,size,ship_type,vnum;
SHIP_DATA *ship;
char arg[MAX_STRING_LENGTH];
bool found_proto = FALSE;
AREA_DATA *tarea;
CLAN_DATA *clan;
CLAN_DATA *mainclan;
if ( IS_NPC(ch) || !ch->pcdata )
{
send_to_char( "&ROnly players can do that!\r\n" ,ch );
return;
}
if ( !ch->pcdata->clan )
{
send_to_char( "You do not belong to any organization.\r\n" ,ch );
return;
}
clan = ch->pcdata->clan;
mainclan = ch->pcdata->clan->mainclan ? ch->pcdata->clan->mainclan : clan;
if ( ( ch->pcdata->bestowments
&& is_name("clanbuyship", ch->pcdata->bestowments))
|| !str_cmp( ch->name, clan->leader ))
;
else
{
send_to_char( "Your organization hasn't seen fit to bestow you with that ability.\r\n" ,ch );
return;
}
if( !IS_SET(ch->in_room->room_flags2,ROOM_SHIPYARD) )
{
send_to_char("You can only purchase a ship at a shipyard.\r\n",ch);
return;
}
if(argument == NULL || !argument || argument[0] == '\0')
{
send_to_char("\n\r&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Available ships &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
for(x=0;x<NUM_PROTOTYPES;x++)
{
if(!ch->pcdata->clan && (!str_cmp(ship_prototypes[x].clan, "The Empire")
|| !str_cmp(ship_prototypes[x].clan, "The New Republic"))) continue;
if(ch->pcdata->clan && str_cmp(ship_prototypes[x].clan, ch->pcdata->clan->name) && str_cmp(ship_prototypes[x].clan, "")) continue;
if(ch->pcdata->clan && str_cmp(ship_prototypes[x].clan, ch->pcdata->clan->name)) continue;
ch_printf(ch,"&W|&w %s%-39.39s&W Type: &w%-13.13s &WCost:&w %8d &W|\r\n",
!str_cmp(ship_prototypes[x].clan, "The Empire") ? "&R" :
!str_cmp(ship_prototypes[x].clan, "The New Republic") ? "&G" : "&w",
ship_prototypes[x].name,
ship_prototypes[x].class == SHIP_FIGHTER ? "Starfighter" :
ship_prototypes[x].class == SHIP_BOMBER ? "Bomber" :
ship_prototypes[x].class == SHIP_SHUTTLE ? "Shuttle" :
ship_prototypes[x].class == SHIP_FREIGHTER ? "Freighter" :
ship_prototypes[x].class == SHIP_FRIGATE ? "Frigate" :
ship_prototypes[x].class == SHIP_TT ? "Troop Transport" :
ship_prototypes[x].class == SHIP_CORVETTE ? "Corvette" :
ship_prototypes[x].class == SHIP_CRUISER ? "Cruiser" :
ship_prototypes[x].class == SHIP_DREADNAUGHT ? "Dreadnaught" :
ship_prototypes[x].class == SHIP_DESTROYER ? "Star Destroyer" :
ship_prototypes[x].class == SHIP_SPACE_STATION ? "Space Station" :
ship_prototypes[x].class == LAND_VEHICLE ? "Land vehicle" : "Unknown",
ship_prototypes[x].cost);
}
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Refer to 'shiplist' for a complete ship listing &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\n\r",ch);
return;
}
argument = one_argument(argument,arg);
size = NUM_PROTOTYPES;
for(x=0;x<size;x++)
{
if(nifty_is_name_prefix(arg,ship_prototypes[x].name)) {
found_proto = TRUE;
break;
}
}
if(!found_proto)
{
send_to_char("\n\r&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Available ships &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
for(x=0;x<NUM_PROTOTYPES;x++)
{
if(!ch->pcdata->clan && (!str_cmp(ship_prototypes[x].clan, "The Empire")
|| !str_cmp(ship_prototypes[x].clan, "The New Republic"))) continue;
if(ch->pcdata->clan && str_cmp(ship_prototypes[x].clan, ch->pcdata->clan->name) && str_cmp(ship_prototypes[x].clan, "")) continue;
if(ch->pcdata->clan && str_cmp(ship_prototypes[x].clan, ch->pcdata->clan->name)) continue;
ch_printf(ch,"&W|&w %s%-39.39s&W Type: &w%-13.13s &WCost:&w %8d &W|\r\n",
!str_cmp(ship_prototypes[x].clan, "The Empire") ? "&R" :
!str_cmp(ship_prototypes[x].clan, "The New Republic") ? "&G" : "&w",
ship_prototypes[x].name,
ship_prototypes[x].class == SHIP_FIGHTER ? "Starfighter" :
ship_prototypes[x].class == SHIP_BOMBER ? "Bomber" :
ship_prototypes[x].class == SHIP_SHUTTLE ? "Shuttle" :
ship_prototypes[x].class == SHIP_FREIGHTER ? "Freighter" :
ship_prototypes[x].class == SHIP_FRIGATE ? "Frigate" :
ship_prototypes[x].class == SHIP_TT ? "Troop Transport" :
ship_prototypes[x].class == SHIP_CORVETTE ? "Corvette" :
ship_prototypes[x].class == SHIP_CRUISER ? "Cruiser" :
ship_prototypes[x].class == SHIP_DREADNAUGHT ? "Dreadnaught" :
ship_prototypes[x].class == SHIP_DESTROYER ? "Star Destroyer" :
ship_prototypes[x].class == SHIP_SPACE_STATION ? "Space Station" :
ship_prototypes[x].class == LAND_VEHICLE ? "Land vehicle" : "Unknown",
ship_prototypes[x].cost);
}
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Refer to 'shiplist' for a complete ship listing &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\n\r",ch);
return;
}
ship_type = x;
if(argument[0] == '\0' || argument == NULL || !argument)
{
send_to_char("What would you like to name your ship?\r\n",ch);
return;
}
// Modify later. -||
if( (clan->clan_type == 0) &&
str_cmp(ship_prototypes[ship_type].clan, ch->pcdata->clan->name))
{
send_to_char("Your organization may only purchase its own ship models.\n\r", ch);
return;
}
vnum = find_vnum_block(ship_prototypes[ship_type].num_rooms);
if(vnum == -1)
{
send_to_char("There was a problem with your ship: free vnums. Notify an administrator.\r\n",ch);
bug("Ship area is low on vnums.",0);
return;
}
argument[0] = UPPER(argument[0]);
sprintf(argument,"%s (%s)",argument,ship_prototypes[ship_type].sname);
for ( ship = first_ship; ship; ship = ship->next )
{
if(!str_cmp(ship->name,argument))
{
send_to_char("That ship name is already in use. Choose another.\r\n",ch);
return;
}
}
if(ch->pcdata->clan->funds < ship_prototypes[ship_type].cost)
{
send_to_char("Your organization cannot pay for that ship.\r\n",ch);
return;
}
for ( tarea = first_area; tarea; tarea = tarea->next )
if ( !str_cmp( SHIP_AREA, tarea->filename ) )
break;
if(make_prototype_rooms(ship_type,vnum,tarea,argument) == -1)
{
send_to_char("There was a problem with your ship: unable to create a room. Notify an administrator.\r\n",ch);
bug("Ship area unable to make_room.",0);
return;
}
ch->pcdata->clan->funds -= ship_prototypes[ship_type].cost;
send_to_char("&wA shipyard salesman enters some information into a datapad.\r\n",ch);
send_to_char("&R&CThe salesman says:&R&W You're all set. Thanks.\n\r", ch);
ship = make_prototype_ship(ship_type,vnum,ch,argument);
ship->owner = ch->pcdata->clan->name;
save_ship( ship );
write_ship_list( );
return;
}
void do_ordership(CHAR_DATA *ch, char *argument)
{
int x,size,ship_type,vnum,count;
SHIP_DATA *ship;
char arg[MAX_STRING_LENGTH];
bool found_proto = FALSE;
AREA_DATA *tarea;
BMARKET_DATA *marketship;
char *bmshipname;
int bmshipcost;
count=0;
if( !IS_SET(ch->in_room->room_flags2,ROOM_SHIPYARD) && !IS_SET(ch->in_room->room_flags2, ROOM_BLACKMARKET))
{
send_to_char("You can only purchase ships at a shipyard.\r\n",ch);
return;
}
if(!IS_SET(ch->in_room->room_flags2, ROOM_BLACKMARKET))
{
if(argument == NULL || !argument || argument[0] == '\0')
{
send_to_char("\n\r&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Available ships &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
for(x=0;x<NUM_PROTOTYPES;x++)
{
if(!ch->pcdata->clan && (!str_cmp(ship_prototypes[x].clan, "The Empire")
|| !str_cmp(ship_prototypes[x].clan, "The New Republic"))) continue;
if(ch->pcdata->clan && str_cmp(ship_prototypes[x].clan, ch->pcdata->clan->name) && str_cmp(ship_prototypes[x].clan, "")) continue;
ch_printf(ch,"&W|&w %s%-39.39s&W Type: &w%-13.13s &WCost:&w %8d &W|\r\n",
!str_cmp(ship_prototypes[x].clan, "The Empire") ? "&R" :
!str_cmp(ship_prototypes[x].clan, "The New Republic") ? "&G" : "&w",
ship_prototypes[x].name,
ship_prototypes[x].class == SHIP_FIGHTER ? "Starfighter" :
ship_prototypes[x].class == SHIP_BOMBER ? "Bomber" :
ship_prototypes[x].class == SHIP_SHUTTLE ? "Shuttle" :
ship_prototypes[x].class == SHIP_FREIGHTER ? "Freighter" :
ship_prototypes[x].class == SHIP_FRIGATE ? "Frigate" :
ship_prototypes[x].class == SHIP_TT ? "Troop Transport" :
ship_prototypes[x].class == SHIP_CORVETTE ? "Corvette" :
ship_prototypes[x].class == SHIP_CRUISER ? "Cruiser" :
ship_prototypes[x].class == SHIP_DREADNAUGHT ? "Dreadnaught" :
ship_prototypes[x].class == SHIP_DESTROYER ? "Star Destroyer" :
ship_prototypes[x].class == SHIP_SPACE_STATION ? "Space Station" :
ship_prototypes[x].class == LAND_VEHICLE ? "Land vehicle" : "Unknown",
ship_prototypes[x].cost);
}
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Refer to 'shiplist' for a complete ship listing &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\n\r",ch);
return;
}
}
else
{
if(argument == NULL || !argument || argument[0] == '\0')
{
ch_printf(ch,"&z+&W------------------------&z The Black Market &W--------------------------&z+\n\r");
for(marketship = first_market_ship; marketship; marketship = marketship->next)
{
for(x=0;x<NUM_PROTOTYPES;x++)
{
if(!str_cmp(marketship->filename, ship_prototypes[x].sname))
{
bmshipname = ship_prototypes[x].name;
bmshipcost = ship_prototypes[x].cost*3;
break;
}
}
ch_printf(ch,"&W|&z %-35.35s&W |&z Quantity: %d&W |&z Cost: %-8d&W |\n\r", bmshipname,marketship->quantity,bmshipcost);
count++;
}
if(count==0)
ch_printf(ch,"&W|&z No ships available. &W|\n\r");
ch_printf(ch,"&z+&W--------------------------------------------------------------------&z+\n\r");
return;
}
}
argument = one_argument(argument, arg);
size = NUM_PROTOTYPES;
for(x=0;x<size;x++)
{
if(!IS_SET(ch->in_room->room_flags2, ROOM_BLACKMARKET))
{
if(nifty_is_name_prefix(arg,ship_prototypes[x].name))
{
found_proto = TRUE;
break;
}
}
else
{
for(marketship = first_market_ship; marketship; marketship = marketship->next)
{
if(nifty_is_name_prefix(arg, ship_prototypes[x].name) && !str_cmp(ship_prototypes[x].sname, marketship->filename))
{
found_proto = 1;
break;
}
}
if(found_proto == 1)
break;
}
}
if(!found_proto)
{
if(!IS_SET(ch->in_room->room_flags2, ROOM_BLACKMARKET))
{
send_to_char("\n\r&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Available ships &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
for(x=0;x<NUM_PROTOTYPES;x++)
{
if(!ch->pcdata->clan && (!str_cmp(ship_prototypes[x].clan, "The Empire")
|| !str_cmp(ship_prototypes[x].clan, "The New Republic"))) continue;
if(ch->pcdata->clan && str_cmp(ship_prototypes[x].clan, ch->pcdata->clan->name) && str_cmp(ship_prototypes[x].clan, "")) continue;
ch_printf(ch,"&W|&w %s%-39.39s&W Type: &w%-13.13s &WCost:&w %8d &W|\r\n",
!str_cmp(ship_prototypes[x].clan, "The Empire") ? "&R" :
!str_cmp(ship_prototypes[x].clan, "The New Republic") ? "&G" : "&w",
ship_prototypes[x].name,
ship_prototypes[x].class == SHIP_FIGHTER ? "Starfighter" :
ship_prototypes[x].class == SHIP_BOMBER ? "Bomber" :
ship_prototypes[x].class == SHIP_SHUTTLE ? "Shuttle" :
ship_prototypes[x].class == SHIP_FREIGHTER ? "Freighter" :
ship_prototypes[x].class == SHIP_FRIGATE ? "Frigate" :
ship_prototypes[x].class == SHIP_TT ? "Troop Transport" :
ship_prototypes[x].class == SHIP_CORVETTE ? "Corvette" :
ship_prototypes[x].class == SHIP_CRUISER ? "Cruiser" :
ship_prototypes[x].class == SHIP_DREADNAUGHT ? "Dreadnaught" :
ship_prototypes[x].class == SHIP_DESTROYER ? "Star Destroyer" :
ship_prototypes[x].class == SHIP_SPACE_STATION ? "Space Station" :
ship_prototypes[x].class == LAND_VEHICLE ? "Land vehicle" : "Unknown",
ship_prototypes[x].cost);
}
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Refer to 'shiplist' for a complete ship listing &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\n\r",ch);
return;
}
else
{
ch_printf(ch,"&z+&W------------------------&z The Black Market &W--------------------------&z+\n\r");
for(marketship = first_market_ship; marketship; marketship = marketship->next)
{
for(x=0;x<NUM_PROTOTYPES;x++)
{
if(!str_cmp(marketship->filename, ship_prototypes[x].sname))
{
bmshipname = ship_prototypes[x].name;
if(marketship->quantity == 1)
bmshipcost = ship_prototypes[x].cost*2.5;
else if(marketship->quantity == 2)
bmshipcost = ship_prototypes[x].cost*2;
else
bmshipcost = ship_prototypes[x].cost*1.5;
}
}
ch_printf(ch,"&W|&z %-35.35s&W |&z Quantity: %d&W |&z Cost: %-8d&W |\n\r", bmshipname,marketship->quantity,bmshipcost);
count++;
}
if(count==0)
ch_printf(ch,"&W|&z No ships available. &W|\n\r");
ch_printf(ch,"&z+&W--------------------------------------------------------------------&z+\n\r");
return;
}
}
ship_type = x;
if(argument[0] == '\0' || argument == NULL || !argument)
{
send_to_char("What do you want to name your ship?\r\n",ch);
return;
}
if(ship_prototypes[ship_type].class == 3 && !IS_IMMORTAL(ch))
{
send_to_char("At the moment, capital ships may only be purchased by clans.\n\r", ch);
return;
}
if(!IS_SET(ch->in_room->room_flags2, ROOM_BLACKMARKET))
{
if(!str_cmp(ship_prototypes[ship_type].clan, "The Empire") ||
!str_cmp(ship_prototypes[ship_type].clan,"The New Republic"))
{
if(!ch->pcdata->clan)
{
send_to_char("You must find a black market to purchase clanned ships.\n\r", ch);
return;
}
else if(str_cmp(ch->pcdata->clan->name, ship_prototypes[ship_type].clan))
{
send_to_char("You must find a black market to purchase other clan's ships.\n\r", ch);
return;
}
}
}
vnum = find_vnum_block(ship_prototypes[ship_type].num_rooms);
if(vnum == -1)
{
send_to_char("There was a problem with your ship: free vnums. Notify an administrator.\r\n",ch);
bug("Ship Shop area is low on vnums.",0);
return;
}
argument[0] = UPPER(argument[0]);
sprintf(argument,"%s (%s)",argument, ship_prototypes[ship_type].sname);
for ( ship = first_ship; ship; ship = ship->next )
{
if(!str_cmp(ship->name,argument))
{
send_to_char("&CThat ship name is already in use. Choose another.\r\n",ch);
return;
}
}
if(!IS_SET(ch->in_room->room_flags2, ROOM_BLACKMARKET))
{
if(ch->gold < ship_prototypes[ship_type].cost)
{
send_to_char("You can't afford that ship.\r\n",ch);
return;
}
}
else
{
if(ch->gold < ship_prototypes[ship_type].cost*3)
{
send_to_char("You can't afford that ship.\n\r", ch);
return;
}
}
if(!str_cmp(argument, "&"))
{
send_to_char("No color codes in ship names.\n\r", ch);
return;
}
for ( tarea = first_area; tarea; tarea = tarea->next )
if ( !str_cmp( SHIP_AREA, tarea->filename ) )
break;
if(make_prototype_rooms(ship_type,vnum,tarea,argument) == -1)
{
send_to_char("There was a problem with your ship: unable to create a room. Notify an administrator.\n\r",ch);
bug("Ship Shop unable to make_room.",0);
return;
}
if(!IS_SET(ch->in_room->room_flags2, ROOM_BLACKMARKET))
{
ch->gold -= ship_prototypes[ship_type].cost;
send_to_char("A shipyard salesman enters some information into a datapad.\r\n",ch);
send_to_char("&R&CA salesman says:&R&W You're all set. Thanks.\n\r", ch);
}
else
{
ch->gold -= ship_prototypes[ship_type].cost*3;
for(marketship = first_market_ship; marketship; marketship = marketship->next)
{
if(!str_cmp(ship_prototypes[ship_type].sname, marketship->filename)) {
remove_market_ship(marketship);
break;
}
}
send_to_char("A smuggler gives a grin and shows you to the ship.\n\r", ch);
send_to_char("&R&CA smuggler says:&R&W There ya go, she's all yours.\n\r", ch);
}
ship = make_prototype_ship(ship_type,vnum,ch,argument);
return;
}
SHIP_DATA *make_prototype_ship(int ship_type,int vnum,CHAR_DATA *ch,char *ship_name)
{
SHIP_DATA *ship;
PROTO_ROOM *proom;
ROOM_INDEX_DATA *room;
char sp_filename[MAX_STRING_LENGTH];
CREATE( ship, SHIP_DATA, 1 );
LINK( ship, first_ship, last_ship, next, prev );
ship->name = STRALLOC( ship_name );
ship->owner = STRALLOC( "" );
ship->protoname = STRALLOC( ship_prototypes[ship_type].sname );
if( !ship_prototypes[ship_type].clan || ( ship_prototypes[ship_type].clan[0] == '\0' ) )
ship->clanowner = STRALLOC( "" );
else
ship->clanowner = STRALLOC( ship_prototypes[ship_type].clan );
ship->description = STRALLOC( "" );
ship->copilot = STRALLOC( "" );
ship->pilot = STRALLOC( "" );
/* Added in check to make sure all things cruiser+ get put in
the right starsystem by Keberus, thanks Guido
*/
if(ch->in_room->area && ch->in_room->area->planet)
{
if( ship_prototypes[ship_type].class >= SHIP_CRUISER && ch->in_room->area->planet->starsystem )
ship->home = STRALLOC( ch->in_room->area->planet->starsystem->name );
else
ship->home = STRALLOC( ch->in_room->area->planet->name );
}
else
ship->home = STRALLOC( "" );
ship->pbeacon = STRALLOC( "" );
ship->type = PLAYER_SHIP;
ship->class = ship_prototypes[ship_type].class;
ship->cost = ship_prototypes[ship_type].cost;
ship->starsystem = NULL;
ship->in_room = NULL;
ship->next_in_room = NULL;
ship->prev_in_room = NULL;
ship->currjump = NULL;
ship->target0 = NULL;
ship->target1 = NULL;
ship->target2 = NULL;
ship->target3 = NULL;
ship->target4 = NULL;
ship->target5 = NULL;
ship->target6 = NULL;
ship->target7 = NULL;
ship->target8 = NULL;
ship->target9 = NULL;
ship->target10 = NULL;
ship->password = number_range(1111,9999);;
ship->maxmods = ship_prototypes[ship_type].mods;
sprintf(sp_filename,"ship_%d.sss",vnum);
ship->filename = str_dup( sp_filename );
ship->pilotseat = vnum;
ship->coseat = vnum;
ship->navseat = vnum;
ship->gunseat = vnum;
ship->entrance = vnum;
ship->engineroom = vnum;
for(proom = first_prototype_room;proom;proom = proom->next)
{
if(proom->what_prototype == ship_type)
{
if(proom->room_num == 1)
ship->firstroom = vnum;
if(proom->room_num == ship_prototypes[ship_type].num_rooms)
ship->lastroom = proom->room_num+vnum-1;
}
}
for(proom = first_prototype_room;proom;proom = proom->next)
{
if(proom->what_prototype == ship_type)
{
room = get_room_index(proom->room_num+vnum-1);
switch(proom->room_type)
{
case SP_COCKPIT : ship->cockpit = proom->room_num+vnum-1; break;
case SP_ENTRANCE : ship->entrance = proom->room_num+vnum-1; break;
case SP_HANGER1 : ship->hanger1 = proom->room_num+vnum-1; break;
case SP_HANGER2 : ship->hanger2 = proom->room_num+vnum-1; break;
case SP_HANGER3 : ship->hanger3 = proom->room_num+vnum-1; break;
case SP_HANGER4 : ship->hanger4 = proom->room_num+vnum-1; break;
case SP_ENGINEROOM : ship->engineroom = proom->room_num+vnum-1; break;
case SP_PILOT : ship->pilotseat = proom->room_num+vnum-1; break;
case SP_COPILOT : ship->coseat = proom->room_num+vnum-1; break;
case SP_NAVIGATOR : ship->navseat = proom->room_num+vnum-1; break;
case SP_GUNNER : ship->gunseat = proom->room_num+vnum-1; break;
case SP_TURRET1 : ship->turret1 = proom->room_num+vnum-1; break;
case SP_TURRET2 : ship->turret2 = proom->room_num+vnum-1; break;
case SP_TURRET3 : ship->turret3 = proom->room_num+vnum-1; break;
case SP_TURRET4 : ship->turret4 = proom->room_num+vnum-1; break;
case SP_TURRET5 : ship->turret5 = proom->room_num+vnum-1; break;
case SP_TURRET6 : ship->turret6 = proom->room_num+vnum-1; break;
case SP_TURRET7 : ship->turret7 = proom->room_num+vnum-1; break;
case SP_TURRET8 : ship->turret8 = proom->room_num+vnum-1; break;
case SP_TURRET9 : ship->turret9 = proom->room_num+vnum-1; break;
case SP_TURRET10 : ship->turret10 = proom->room_num+vnum-1; break;
default : break;
}
}
}
ship->tractorbeam = ship_prototypes[ship_type].tractor;
ship->primaryType = ship_prototypes[ship_type].primaryType;
ship->secondaryType = ship_prototypes[ship_type].secondaryType;
ship->primaryCount = ship_prototypes[ship_type].primaryCount;
ship->secondaryCount = ship_prototypes[ship_type].secondaryCount;
ship->missiles = ship_prototypes[ship_type].range_weapons[0];
ship->torpedos = ship_prototypes[ship_type].range_weapons[1];
ship->rockets = ship_prototypes[ship_type].range_weapons[2];
ship->maxmissiles = ship_prototypes[ship_type].range_weapons[0];
ship->maxtorpedos = ship_prototypes[ship_type].range_weapons[1];
ship->maxrockets = ship_prototypes[ship_type].range_weapons[2];
ship->maxhull = ship_prototypes[ship_type].hull;
ship->hull = ship_prototypes[ship_type].hull;
ship->shield = ship_prototypes[ship_type].shields;
ship->maxshield = ship_prototypes[ship_type].shields;
//ship->plasmashield = ship_prototypes[ship_type].plasma;
//ship->maxplasmashield = ship_prototypes[ship_type].plasma;
ship->energy = ship_prototypes[ship_type].energy;
ship->maxenergy = ship_prototypes[ship_type].energy;
ship->chaff = ship_prototypes[ship_type].chaff;
ship->maxchaff = ship_prototypes[ship_type].chaff;
ship->bombs = ship_prototypes[ship_type].maxbombs;
ship->maxbombs = ship_prototypes[ship_type].maxbombs;
ship->realspeed = ship_prototypes[ship_type].speed;
ship->hyperspeed = ship_prototypes[ship_type].hyperspeed;
#ifdef USECARGO
ship->maxcargo = ship_prototypes[ship_type].maxcargo;
#endif
ship->manuever = ship_prototypes[ship_type].manuever;
//MARKER
ship->shipyard = ch->in_room->vnum;
resetship( ship );
ship->owner = STRALLOC( ch->name );
save_ship( ship );
write_ship_list( );
return ship;
}
int make_prototype_rooms(int ship_type, int vnum,AREA_DATA *tarea,char *Sname)
{
PROTO_ROOM *proom;
ROOM_INDEX_DATA *newroom,*rfrom,*rto;
int value;
char *arg;
char arg2[MAX_STRING_LENGTH];
EXIT_DATA *xit;
int x,y;
int *exits;
int *keys;
int *exflags;
char buf[MAX_STRING_LENGTH];
char newdesc[MAX_STRING_LENGTH];
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
CHAR_DATA *victim;
MOB_INDEX_DATA *pMobIndex;
int rvnum;
char *rarg;
char rtype[MAX_STRING_LENGTH];
for(proom = first_prototype_room;proom;proom = proom->next)
{
if(proom->what_prototype == ship_type)
{
if( (newroom = get_room_index(vnum+proom->room_num-1)) == NULL)
{
newroom = make_room(vnum+proom->room_num-1, tarea);
if(!newroom)
return -1;
}
newroom->area = tarea;
if(proom->room_type == SP_NOT_SET)
{
if(newroom->name)
STRFREE(newroom->name);
sprintf(buf,"SPARE ROOM FOR: %d",vnum);
newroom->name = STRALLOC( buf );
if(newroom->description)
STRFREE(newroom->description);
newroom->description = STRALLOC( "" );
continue;
}
strcpy(newdesc,strlinwrp(proom->desc,60));
if(newroom->name) STRFREE(newroom->name);
newroom->name = STRALLOC( strrep(proom->name,"$SN$",Sname) );
if(newroom->description) STRFREE(newroom->description);
newroom->description = STRALLOC( strrep(newdesc,"$SN$",Sname) );
arg = STRALLOC( proom->flags );
newroom->tunnel = proom->tunnel;
while ( arg[0] != '\0' )
{
arg = one_argument( arg, arg2 );
value = get_sp_rflag( arg2 );
TOGGLE_BIT( newroom->room_flags, 1 << value );
}
for(y=0;y<10;y++)
{
if(proom->reset[y] != NULL && proom->reset[y][0] != '\0')
{
rarg = STRALLOC(proom->reset[y]);
rarg = one_argument(rarg,rtype);
rvnum = atoi(rarg);
switch(UPPER(rtype[0]))
{
case 'O':
if( ( pObjIndex = get_obj_index( rvnum ) ) == NULL)
break;
obj = create_object( pObjIndex, 60 );
obj = obj_to_room( obj, newroom );
break;
case 'M':
if( ( pMobIndex = get_mob_index( rvnum ) ) == NULL)
break;
victim = create_mobile( pMobIndex );
char_to_room( victim, newroom );
break;
default:
break;
}
}
}
instaroom(tarea,newroom,TRUE);
}
}
for(proom = first_prototype_room;proom;proom = proom->next)
{
if(proom->what_prototype == ship_type)
{
exits = proom->exits;
keys = proom->keys;
exflags = proom->exflags;
for(x=0;x<10;x++)
{
if(exits[x] > 0)
{
rfrom = get_room_index(vnum+proom->room_num-1);
rto = get_room_index(vnum+exits[x]-1);
xit = make_exit( rfrom, rto, x );
xit->keyword = STRALLOC( "" );
xit->description = STRALLOC( "" );
xit->key = keys[x] == 0 ? -1 : vnum+keys[x]-1;
xit->exit_info = exflags[x];
}
}
}
}
make_rprogs(ship_type, vnum);
fold_area( tarea, tarea->filename, FALSE );
return 1;
}
int find_vnum_block(int num_needed)
{
bool counting = FALSE;
int count = 0;
AREA_DATA *tarea;
int lrange;
int trange;
int vnum;
int startvnum = -1;
ROOM_INDEX_DATA *room;
for ( tarea = first_area; tarea; tarea = tarea->next )
if ( !str_cmp( SHIP_AREA, tarea->filename ) )
break;
lrange = tarea->low_r_vnum;
trange = tarea->hi_r_vnum;
for ( vnum = lrange; vnum <= trange; vnum++ )
{
// if ( (room = get_room_index( vnum )) == NULL || !strcmp(room->name,"VNUM_AVAILABLE\0"))
if ( (room = get_room_index( vnum )) == NULL )
{
if(!counting)
{
counting = TRUE;
startvnum = vnum;
}
count++;
if(count == num_needed+1)
break;
}
else if(counting)
{
counting = FALSE;
count = 0;
startvnum = -1;
}
}
return startvnum;
}
int get_sp_rflag( char *flag )
{
int x;
for ( x = 0; x < 32; x++ )
if ( !str_cmp( flag, r_flags[x] ) )
return x;
return -1;
}
void make_rprogs(int ship_type, int vnum)
{
PROTO_ROOM *proom;
char argument[MAX_STRING_LENGTH];
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
MPROG_DATA *mprog, *mprg;
ROOM_INDEX_DATA *room;
int mptype, x, size;
for(proom = first_prototype_room;proom;proom = proom->next)
{
if(proom->what_prototype == ship_type)
{
size = 10;
for(x=0;x<size;x++)
{
strcpy(argument, proom->rprog[x]);
if(argument[0] == '\0')
continue;
strcpy(argument, one_argument( argument, arg1 ) );
strcpy(argument, one_argument( argument, arg2 ) );
sprintf(argument,"%s",parse_prog_string(argument,ship_type,vnum));
room = get_room_index(proom->room_num+vnum-1);
mprog = room->mudprogs;
mptype = get_mpflag( arg1 );
if ( mprog )
for ( ; mprog->next; mprog = mprog->next );
CREATE( mprg, MPROG_DATA, 1 );
if ( mprog )
mprog->next = mprg;
else
room->mudprogs = mprg;
room->progtypes |= ( 1 << mptype );
if ( mptype != -1 )
{
mprg->type = 1 << mptype;
if ( mprg->arglist )
STRFREE( mprg->arglist );
mprg->arglist = STRALLOC( arg2 );
}
mprg->comlist = STRALLOC( argument );
mprg->next = NULL;
}
}
}
}
char *parse_prog_string(char *inp,int ship_type,int vnum)
{
char sch[MAX_STRING_LENGTH];
char rep[MAX_STRING_LENGTH];
static char newinp[MAX_STRING_LENGTH];
int x,size;
strcpy(newinp,inp);
size = ship_prototypes[ship_type].num_rooms;
for(x=0;x<size;x++)
{
sprintf(sch,"$RNUM:%d$",x+1);
sprintf(rep,"%d",x+vnum);
sprintf(newinp,"%s",strrep(newinp,sch,rep));
}
return newinp;
}
void save_prototype( int prototype )
{
PROTO_ROOM *proom;
FILE *fpout;
char filename[MAX_STRING_LENGTH];
int x;
fclose( fpReserve );
sprintf(filename,"%s%s.proto",SHIP_PROTOTYPE_DIR,ship_prototypes[prototype].sname);
if ( ( fpout = fopen( filename, "w" ) ) == NULL )
{
perror( filename );
fpReserve = fopen( NULL_FILE, "r" );
return;
}
fprintf( fpout, "#HEADER\n\n");
fprintf( fpout, "Name %s~\n", ship_prototypes[prototype].name );
fprintf( fpout, "Sname %s~\n", ship_prototypes[prototype].sname );
fprintf( fpout, "NumRooms %d\n", ship_prototypes[prototype].num_rooms );
fprintf( fpout, "Cost %d\n", ship_prototypes[prototype].cost );
fprintf( fpout, "Class %d\n", ship_prototypes[prototype].class );
fprintf( fpout, "Tractor %d\n", ship_prototypes[prototype].tractor );
fprintf( fpout, "primaryType %d\n", ship_prototypes[prototype].primaryType );
fprintf( fpout, "secondaryType %d\n", ship_prototypes[prototype].secondaryType);
fprintf( fpout, "primaryCount %d\n", ship_prototypes[prototype].primaryCount);
fprintf( fpout, "secondaryCount %d\n", ship_prototypes[prototype].secondaryCount);
fprintf( fpout, "RangeWeapons0 %d\n", ship_prototypes[prototype].range_weapons[0] );
fprintf( fpout, "RangeWeapons1 %d\n", ship_prototypes[prototype].range_weapons[1] );
fprintf( fpout, "RangeWeapons2 %d\n", ship_prototypes[prototype].range_weapons[2] );
fprintf( fpout, "Hull %d\n", ship_prototypes[prototype].hull );
fprintf( fpout, "Shields %d\n", ship_prototypes[prototype].shields );
fprintf( fpout, "Energy %d\n", ship_prototypes[prototype].energy );
fprintf( fpout, "Chaff %d\n", ship_prototypes[prototype].chaff );
fprintf( fpout, "MaxCargo %d\n", ship_prototypes[prototype].maxcargo );
fprintf( fpout, "Maxbombs %d\n", ship_prototypes[prototype].maxbombs );
fprintf( fpout, "Speed %d\n", ship_prototypes[prototype].speed );
fprintf( fpout, "Hyperspeed %d\n", ship_prototypes[prototype].hyperspeed );
fprintf( fpout, "Manuever %d\n", ship_prototypes[prototype].manuever );
fprintf( fpout, "Turrets %d\n", ship_prototypes[prototype].turrets );
fprintf( fpout, "Mods %d\n", ship_prototypes[prototype].mods );
fprintf( fpout, "Clan %s~\n", ship_prototypes[prototype].clan );
//fprintf( fpout, "Plasma %d\n", ship_prototypes[prototype].plasma );
fprintf( fpout, "End\n");
fprintf( fpout, "\n#ROOMS\n\n" );
for(proom = first_prototype_room;proom;proom = proom->next)
{
if(proom->what_prototype == prototype)
{
fprintf( fpout, "#ROOM\n\n");
fprintf( fpout, "RoomNum %d\n", proom->room_num );
fprintf( fpout, "Name %s~\n",proom->name );
fprintf( fpout, "Desc %s~\n",proom->desc );
fprintf( fpout, "Flags %s~\n",proom->flags );
fprintf( fpout, "Tunnel %d\n", proom->tunnel );
for(x=0;x<10;x++)
fprintf( fpout, "Exits%d %d\n", x, proom->exits[x] );
for(x=0;x<10;x++)
fprintf( fpout, "Exflags%d %d\n", x, proom->exflags[x] );
for(x=0;x<10;x++)
fprintf( fpout, "Keys%d %d\n", x, proom->keys[x] );
fprintf( fpout, "RoomType %d\n", proom->room_type );
for(x=0;x<10;x++)
fprintf( fpout, "Rprog%d %s~\n", x, proom->rprog[x] );
for(x=0;x<10;x++)
fprintf( fpout, "Reset%d %s~\n", x, proom->reset[x] );
fprintf( fpout,"End\n\n");
}
}
fprintf( fpout, "\n#ENDROOMS\n\n" );
fprintf( fpout,"#END\n" );
fclose( fpout );
fpReserve = fopen( NULL_FILE, "r" );
return;
}
void write_prototype_list()
{
FILE *fpout;
char filename[MAX_STRING_LENGTH];
int x;
fclose( fpReserve );
sprintf(filename,"%sprototype.lst",SHIP_PROTOTYPE_DIR);
if ( ( fpout = fopen( filename, "w" ) ) == NULL )
{
perror( filename );
fpReserve = fopen( NULL_FILE, "r" );
return;
}
for(x=0;x<NUM_PROTOTYPES;x++)
fprintf(fpout, "%s.proto\n",ship_prototypes[x].sname);
fprintf(fpout,"$\n");
fclose( fpout );
fpReserve = fopen( NULL_FILE, "r" );
return;
}
void write_all_prototypes()
{
int x;
for(x=0;x<NUM_PROTOTYPES;x++)
save_prototype(x);
write_prototype_list();
}
bool load_prototype_header(FILE *fp,int prototype)
{
char buf[MAX_STRING_LENGTH];
char *word;
bool done = FALSE;
bool fMatch;
while(!done)
{
word = feof( fp ) ? "End" : fread_word( fp );
fMatch = FALSE;
switch ( UPPER(word[0]) )
{
case 'C':
KEY( "Cost", ship_prototypes[prototype].cost, fread_number(fp));
KEY( "Class", ship_prototypes[prototype].class, fread_number(fp));
KEY( "Chaff", ship_prototypes[prototype].chaff, fread_number(fp));
KEY( "Clan", ship_prototypes[prototype].clan, fread_string(fp));
case 'E':
KEY( "Energy", ship_prototypes[prototype].energy, fread_number(fp));
if ( !str_cmp( word, "End" ) )
{
done = TRUE;
fMatch = TRUE;
break;
}
case 'H':
KEY( "Hull", ship_prototypes[prototype].hull, fread_number(fp));
KEY( "Hyperspeed", ship_prototypes[prototype].hyperspeed, fread_number(fp));
case 'M':
KEY( "Maxbombs", ship_prototypes[prototype].maxbombs, fread_number(fp));
KEY( "MaxCargo", ship_prototypes[prototype].maxcargo, fread_number(fp));
KEY( "Manuever", ship_prototypes[prototype].manuever, fread_number(fp));
KEY( "Mods", ship_prototypes[prototype].mods, fread_number(fp));
case 'N':
KEY( "Name", ship_prototypes[prototype].name, fread_string(fp));
KEY( "NumRooms", ship_prototypes[prototype].num_rooms, fread_number(fp));
case 'P':
KEY( "primaryType", ship_prototypes[prototype].primaryType, fread_number(fp));
KEY( "primaryCount", ship_prototypes[prototype].primaryCount, fread_number(fp));
case 'R':
KEY( "RangeWeapons0", ship_prototypes[prototype].range_weapons[0], fread_number(fp));
KEY( "RangeWeapons1", ship_prototypes[prototype].range_weapons[1], fread_number(fp));
KEY( "RangeWeapons2", ship_prototypes[prototype].range_weapons[2], fread_number(fp));
case 'S':
KEY( "secondaryType", ship_prototypes[prototype].secondaryType, fread_number(fp));
KEY( "secondaryCount", ship_prototypes[prototype].secondaryCount, fread_number(fp));
KEY( "Sname", ship_prototypes[prototype].sname, fread_string(fp));
KEY( "Shields", ship_prototypes[prototype].shields, fread_number(fp));
KEY( "Speed", ship_prototypes[prototype].speed, fread_number(fp));
case 'T':
KEY( "Tractor", ship_prototypes[prototype].tractor, fread_number(fp));
KEY( "Turrets", ship_prototypes[prototype].turrets, fread_number(fp));
}
if ( !fMatch )
{
sprintf( buf, "Load_prototype_header: no match: %s", word );
bug( buf, 0 );
}
}
return TRUE;
}
bool fread_prototype_room( FILE *fp, int prototype)
{
PROTO_ROOM *proom;
char buf[MAX_STRING_LENGTH];
char *word;
bool done = FALSE;
bool fMatch;
CREATE(proom, PROTO_ROOM, 1);
proom->what_prototype = prototype;
while(!done)
{
word = feof( fp ) ? "End" : fread_word( fp );
fMatch = FALSE;
switch ( UPPER(word[0]) )
{
case 'D':
KEY( "Desc", proom->desc, fread_string(fp));
case 'E':
if ( !str_cmp( word, "End" ) )
{
done = TRUE;
fMatch = TRUE;
break;
}
KEY( "Exits0", proom->exits[0], fread_number(fp));
KEY( "Exits1", proom->exits[1], fread_number(fp));
KEY( "Exits2", proom->exits[2], fread_number(fp));
KEY( "Exits3", proom->exits[3], fread_number(fp));
KEY( "Exits4", proom->exits[4], fread_number(fp));
KEY( "Exits5", proom->exits[5], fread_number(fp));
KEY( "Exits6", proom->exits[6], fread_number(fp));
KEY( "Exits7", proom->exits[7], fread_number(fp));
KEY( "Exits8", proom->exits[8], fread_number(fp));
KEY( "Exits9", proom->exits[9], fread_number(fp));
KEY( "Exflags0", proom->exflags[0], fread_number(fp));
KEY( "Exflags1", proom->exflags[1], fread_number(fp));
KEY( "Exflags2", proom->exflags[2], fread_number(fp));
KEY( "Exflags3", proom->exflags[3], fread_number(fp));
KEY( "Exflags4", proom->exflags[4], fread_number(fp));
KEY( "Exflags5", proom->exflags[5], fread_number(fp));
KEY( "Exflags6", proom->exflags[6], fread_number(fp));
KEY( "Exflags7", proom->exflags[7], fread_number(fp));
KEY( "Exflags8", proom->exflags[8], fread_number(fp));
KEY( "Exflags9", proom->exflags[9], fread_number(fp));
case 'F':
KEY( "Flags", proom->flags, fread_string(fp));
case 'K':
KEY( "Keys0", proom->keys[0], fread_number(fp));
KEY( "Keys1", proom->keys[1], fread_number(fp));
KEY( "Keys2", proom->keys[2], fread_number(fp));
KEY( "Keys3", proom->keys[3], fread_number(fp));
KEY( "Keys4", proom->keys[4], fread_number(fp));
KEY( "Keys5", proom->keys[5], fread_number(fp));
KEY( "Keys6", proom->keys[6], fread_number(fp));
KEY( "Keys7", proom->keys[7], fread_number(fp));
KEY( "Keys8", proom->keys[8], fread_number(fp));
KEY( "Keys9", proom->keys[9], fread_number(fp));
case 'N':
KEY( "Name", proom->name, fread_string(fp));
case 'R':
KEY( "RoomType", proom->room_type, fread_number(fp));
KEY( "RoomNum", proom->room_num, fread_number(fp));
KEY( "Rprog0", proom->rprog[0], fread_string(fp));
KEY( "Rprog1", proom->rprog[1], fread_string(fp));
KEY( "Rprog2", proom->rprog[2], fread_string(fp));
KEY( "Rprog3", proom->rprog[3], fread_string(fp));
KEY( "Rprog4", proom->rprog[4], fread_string(fp));
KEY( "Rprog5", proom->rprog[5], fread_string(fp));
KEY( "Rprog6", proom->rprog[6], fread_string(fp));
KEY( "Rprog7", proom->rprog[7], fread_string(fp));
KEY( "Rprog8", proom->rprog[8], fread_string(fp));
KEY( "Rprog9", proom->rprog[9], fread_string(fp));
KEY( "Reset0", proom->reset[0], fread_string(fp));
KEY( "Reset1", proom->reset[1], fread_string(fp));
KEY( "Reset2", proom->reset[2], fread_string(fp));
KEY( "Reset3", proom->reset[3], fread_string(fp));
KEY( "Reset4", proom->reset[4], fread_string(fp));
KEY( "Reset5", proom->reset[5], fread_string(fp));
KEY( "Reset6", proom->reset[6], fread_string(fp));
KEY( "Reset7", proom->reset[7], fread_string(fp));
KEY( "Reset8", proom->reset[8], fread_string(fp));
KEY( "Reset9", proom->reset[9], fread_string(fp));
case 'T':
KEY( "Tunnel", proom->tunnel, fread_number(fp));
}
if ( !fMatch )
{
sprintf( buf, "Fread_prototype_room: no match: %s", word );
bug( buf, 0 );
}
}
LINK(proom,first_prototype_room,last_prototype_room,next,prev);
return TRUE;
}
bool load_prototype_rooms( FILE *fp, int prototype)
{
char letter;
char *word;
bool done = FALSE;
while(!done)
{
letter = fread_letter( fp );
if( letter == '#')
{
word = fread_word( fp );
if(!strcmp("ROOM",word))
{
if(!fread_prototype_room(fp,prototype))
return FALSE;
}
if(!strcmp("ENDROOMS",word))
done = TRUE;
}
else
{
bug("Load_prototype_rooms, unknown prefix: %s",letter);
return FALSE;
}
}
return TRUE;
}
int load_prototype( char *prototypefile, int prototype)
{
char filename[256];
FILE *fp;
bool found = FALSE;
int stage = -1;
bool ok = TRUE;
char letter;
char *word;
sprintf( filename, "%s%s", SHIP_PROTOTYPE_DIR, prototypefile );
if ( ( fp = fopen( filename, "r" ) ) != NULL )
{
found = TRUE;
prototype++;
while(ok)
{
letter = fread_letter( fp );
if ( letter != '#' )
{
bug( "Load_prototype: # not found.", 0 );
break;
}
stage++;
word = fread_word( fp );
if(strcmp(word,"END"))
{
switch(stage)
{
case 0:
if(strcmp(word,"HEADER"))
{
bug( "Load_prototype: HEADER not found.", 0);
break;
}
if(!load_prototype_header(fp,prototype))
{
ok = FALSE;
prototype--;
}
break;
case 1:
if(strcmp(word,"ROOMS"))
{
bug( "Load_prototype: ROOMS not found.", 0);
break;
}
if(!load_prototype_rooms(fp,prototype))
{
ok = FALSE;
prototype--;
}
break;
default:
bug( "Load_prototype: Unknown stage: %d",stage);
}
}
else
ok = FALSE;
}
fclose( fp );
}
return prototype;
}
void load_ship_prototypes()
{
FILE *fpList;
char *filename;
char prototypeslist[256];
int prototype;
first_prototype_room = NULL;
last_prototype_room = NULL;
log_string( "Loading ship prototypes..." );
sprintf(prototypeslist,"%sprototype.lst",SHIP_PROTOTYPE_DIR);
fclose( fpReserve );
if ( ( fpList = fopen( prototypeslist, "r" ) ) == NULL )
{
perror( prototypeslist );
exit( 1 );
}
for ( prototype = -1; ; )
{
filename = feof( fpList ) ? "$" : fread_word( fpList );
if ( filename[0] == '$' )
break;
prototype = load_prototype( filename, prototype );
}
fclose( fpList );
log_string(" Done ship prototypes " );
NUM_PROTOTYPES = prototype+1;
fpReserve = fopen( NULL_FILE, "r" );
// write_all_prototypes();
return;
}
void do_makeprototypeship(CHAR_DATA *ch, char *argument)
{
SHIP_DATA *ship;
int prototype;
int cost;
int count;
char ship_name[MAX_STRING_LENGTH];
char name[MAX_STRING_LENGTH];
char sname[MAX_STRING_LENGTH];
char scost[MAX_STRING_LENGTH];
char buf[MAX_STRING_LENGTH];
int x,len;
ROOM_INDEX_DATA *room;
MPROG_DATA *mprg;
EXIT_DATA *eroom;
int room_count = 1;
PROTO_ROOM *proom;
argument = one_argument(argument,ship_name);
argument = one_argument(argument,scost);
argument = one_argument(argument,sname);
strcpy(name,argument);
if(!ship_name || ship_name[0] == '\0')
{
send_to_char("You must specify a valid ship name.\r\n",ch);
send_to_char("USAGE: makeprototypeship <ship name> <cost> <short name> <long name>\r\n",ch);
return;
}
cost = atoi(scost);
if(cost <= 0)
{
send_to_char("The cost must be greater than 0.\r\n",ch);
send_to_char("USAGE: makeprototypeship <ship name> <cost> <short name> <long name>\r\n",ch);
return;
}
if(!sname || sname[0] == '\0')
{
send_to_char("You must specify a short name for the ship.\r\n",ch);
send_to_char("USAGE: makeprototypeship <ship name> <cost> <short name> <long name>\r\n",ch);
return;
}
len = strlen(sname);
for(x=0;x<len;x++)
sname[x] = UPPER(sname[x]);
if(!name || name[0] == '\0')
{
send_to_char("You must specify a long name for the ship.\r\n",ch);
send_to_char("USAGE: makeprototypeship <ship name> <cost> <short name> <long name>\r\n",ch);
return;
}
if(!scost || scost[0] == '\0')
{
send_to_char("You must specify a cost for the ship.\r\n",ch);
send_to_char("USAGE: makeprototypeship <ship name> <cost> <short name> <long name>\r\n",ch);
return;
}
if(( ship = get_ship(ship_name) ) == NULL)
{
send_to_char("You must specify a valid ship name.\r\n",ch);
send_to_char("USAGE: makeprototypeship <ship name> <short name> <long name> <cost>\r\n",ch);
return;
}
prototype = NUM_PROTOTYPES++;
ship_prototypes[prototype].tractor = ship->tractorbeam;
ship_prototypes[prototype].primaryType = ship->primaryType;
ship_prototypes[prototype].secondaryType = ship->secondaryType;
ship_prototypes[prototype].primaryCount = ship->primaryCount;
ship_prototypes[prototype].secondaryCount = ship->secondaryCount;
ship_prototypes[prototype].range_weapons[0] = ship->maxmissiles;
ship_prototypes[prototype].range_weapons[1] = ship->maxtorpedos;
ship_prototypes[prototype].range_weapons[2] = ship->maxrockets;
ship_prototypes[prototype].hull = ship->maxhull;
ship_prototypes[prototype].shields = ship->maxshield;
//ship_prototypes[prototype].plasma = ship->maxplasmashield;
ship_prototypes[prototype].energy = ship->maxenergy;
ship_prototypes[prototype].chaff = ship->maxchaff;
#ifdef USECARGO
ship_prototypes[prototype].maxcargo = ship->maxcargo;
#endif
ship_prototypes[prototype].maxbombs = ship->maxbombs;
ship_prototypes[prototype].speed = ship->realspeed;
ship_prototypes[prototype].hyperspeed = ship->hyperspeed;
ship_prototypes[prototype].manuever = ship->manuever;
ship_prototypes[prototype].cost = cost;
sprintf(buf,"%s: '%s'",sname,name);
ship_prototypes[prototype].name = STRALLOC( buf );
ship_prototypes[prototype].sname = STRALLOC( sname );
ship_prototypes[prototype].class = ship->class;
ship_prototypes[prototype].num_rooms = ship->lastroom - ship->firstroom + 1;
if(ship->turret1 != 0)
count++;
if(ship->turret2 != 0)
count++;
if(ship->turret3 != 0)
count++;
if(ship->turret4 != 0)
count++;
if(ship->turret5 != 0)
count++;
if(ship->turret6 != 0)
count++;
if(ship->turret7 != 0)
count++;
if(ship->turret8 != 0)
count++;
if(ship->turret9 != 0)
count++;
if(ship->turret10 != 0)
count++;
ship_prototypes[prototype].turrets = count;
for ( room = get_room_index(ship->firstroom) ; room ; room = room->next_in_ship )
{
CREATE(proom, PROTO_ROOM, 1);
proom->room_num = room_count;
proom->name = STRALLOC(room->name);
proom->desc = STRALLOC(room->description);
proom->flags = STRALLOC(flag_string(room->room_flags, r_flags));
proom->tunnel = room->tunnel;
for(x=0;x<10;x++)
{
eroom = get_exit_num(room, x);
if(eroom)
{
proom->exits[x] = eroom->to_room->vnum;
proom->exflags[x] = eroom->exit_info;
proom->keys[x] = eroom->key;
}
}
if( ship->cockpit == room->vnum)
proom->room_type = 1;
if( ship->entrance == room->vnum)
proom->room_type = 2;
if( ship->hanger1 == room->vnum)
proom->room_type = 3;
if( ship->hanger2 == room->vnum)
proom->room_type = 4;
if( ship->hanger3 == room->vnum)
proom->room_type = 5;
if( ship->hanger4 == room->vnum)
proom->room_type = 6;
if( ship->engineroom == room->vnum)
proom->room_type = 7;
if( ship->pilotseat == room->vnum)
proom->room_type = 8;
if( ship->coseat == room->vnum)
proom->room_type = 9;
if( ship->navseat == room->vnum)
proom->room_type = 8;
if( ship->gunseat == room->vnum)
proom->room_type = 9;
if( ship->turret1 == room->vnum)
proom->room_type = 10;
if( ship->turret2 == room->vnum)
proom->room_type = 11;
if( ship->turret3 == room->vnum)
proom->room_type = 12;
if( ship->turret4 == room->vnum)
proom->room_type = 13;
if( ship->turret5 == room->vnum)
proom->room_type = 14;
if( ship->turret6 == room->vnum)
proom->room_type = 15;
if( ship->turret7 == room->vnum)
proom->room_type = 16;
if( ship->turret8 == room->vnum)
proom->room_type = 17;
if( ship->turret9 == room->vnum)
proom->room_type = 18;
if( ship->turret10 == room->vnum)
proom->room_type = 19;
x = 1;
for ( mprg = room->mudprogs; mprg; mprg = mprg->next )
{
sprintf(buf, "%s %s %s ~", mprog_flags[mprg->type], mprg->arglist, mprg->comlist);
proom->rprog[x] = STRALLOC(buf);
x++;
}
/* Remind me to add resets later
for(x=0;x<10;x++)
fprintf( fpout, "Reset%d %s~\n", x, proom->reset[x] );
fprintf( fpout,"End\n\n");
*/
LINK(proom,first_prototype_room,last_prototype_room,next,prev);
room_count++;
}
send_to_char("Done.\r\n",ch);
save_prototype(prototype);
return;
}
char pbname[MAX_STRING_LENGTH];
char *primary_beam_name_proto(int shiptype)
{
if(ship_prototypes[shiptype].primaryCount != 0)
{
sprintf(pbname, "%d %s", ship_prototypes[shiptype].primaryCount,
(ship_prototypes[shiptype].primaryType == SINGLE_LASER && ship_prototypes[shiptype].primaryCount == 1)? "Single-laser cannon" :
(ship_prototypes[shiptype].primaryType == SINGLE_LASER && ship_prototypes[shiptype].primaryCount != 1)? "Single-laser cannons" :
(ship_prototypes[shiptype].primaryType == DUAL_LASER && ship_prototypes[shiptype].primaryCount == 1)? "Dual-laser cannon" :
(ship_prototypes[shiptype].primaryType == DUAL_LASER && ship_prototypes[shiptype].primaryCount != 1)? "Dual-laser cannons" :
(ship_prototypes[shiptype].primaryType == TRI_LASER && ship_prototypes[shiptype].primaryCount == 1)? "Triple-laser cannon" :
(ship_prototypes[shiptype].primaryType == TRI_LASER && ship_prototypes[shiptype].primaryCount != 1)? "Triple-laser cannons" :
(ship_prototypes[shiptype].primaryType == QUAD_LASER && ship_prototypes[shiptype].primaryCount == 1)? "Quad-laser cannon" :
(ship_prototypes[shiptype].primaryType == QUAD_LASER && ship_prototypes[shiptype].primaryCount != 1)? "Quad-laser cannons" :
(ship_prototypes[shiptype].primaryType == AUTOBLASTER && ship_prototypes[shiptype].primaryCount == 1)? "Autoblaster turret" :
(ship_prototypes[shiptype].primaryType == AUTOBLASTER && ship_prototypes[shiptype].primaryCount != 1)? "Autoblaster turrets" :
(ship_prototypes[shiptype].primaryType == HEAVY_LASER && ship_prototypes[shiptype].primaryCount == 1)? "Heavy laser cannon" :
(ship_prototypes[shiptype].primaryType == HEAVY_LASER && ship_prototypes[shiptype].primaryCount != 1)? "Heavy laser cannons" :
(ship_prototypes[shiptype].primaryType == LIGHT_ION && ship_prototypes[shiptype].primaryCount == 1)? "Light ion cannon" :
(ship_prototypes[shiptype].primaryType == LIGHT_ION && ship_prototypes[shiptype].primaryCount != 1)? "Light ion cannons" :
(ship_prototypes[shiptype].primaryType == REPEATING_ION && ship_prototypes[shiptype].primaryCount == 1)? "Repeating ion cannon" :
(ship_prototypes[shiptype].primaryType == REPEATING_ION && ship_prototypes[shiptype].primaryCount != 1)? "Repeating ion cannons" :
(ship_prototypes[shiptype].primaryType == HEAVY_ION && ship_prototypes[shiptype].primaryCount == 1)? "Heavy ion cannon" :
(ship_prototypes[shiptype].primaryType == HEAVY_ION && ship_prototypes[shiptype].primaryCount != 1)? "Heavy ion cannons" :
"unknown");
return pbname;
}
else
return "None.";
}
char *secondary_beam_name_proto(int shiptype)
{
if(ship_prototypes[shiptype].secondaryCount != 0)
{
sprintf(pbname, "%d %s", ship_prototypes[shiptype].secondaryCount,
(ship_prototypes[shiptype].secondaryType == SINGLE_LASER && ship_prototypes[shiptype].secondaryCount == 1)? "Single-laser cannon" :
(ship_prototypes[shiptype].secondaryType == SINGLE_LASER && ship_prototypes[shiptype].secondaryCount != 1)? "Single-laser cannons" :
(ship_prototypes[shiptype].secondaryType == DUAL_LASER && ship_prototypes[shiptype].secondaryCount == 1)? "Dual-laser cannon" :
(ship_prototypes[shiptype].secondaryType == DUAL_LASER && ship_prototypes[shiptype].secondaryCount != 1)? "Dual-laser cannons" :
(ship_prototypes[shiptype].secondaryType == TRI_LASER && ship_prototypes[shiptype].secondaryCount == 1)? "Triple-laser cannon" :
(ship_prototypes[shiptype].secondaryType == TRI_LASER && ship_prototypes[shiptype].secondaryCount != 1)? "Triple-laser cannons" :
(ship_prototypes[shiptype].secondaryType == QUAD_LASER && ship_prototypes[shiptype].secondaryCount == 1)? "Quad-laser cannon" :
(ship_prototypes[shiptype].secondaryType == QUAD_LASER && ship_prototypes[shiptype].secondaryCount != 1)? "Quad-laser cannons" :
(ship_prototypes[shiptype].secondaryType == AUTOBLASTER && ship_prototypes[shiptype].secondaryCount == 1)? "Autoblaster turret" :
(ship_prototypes[shiptype].secondaryType == AUTOBLASTER && ship_prototypes[shiptype].secondaryCount != 1)? "Autoblaster turrets" :
(ship_prototypes[shiptype].secondaryType == HEAVY_LASER && ship_prototypes[shiptype].secondaryCount == 1)? "Heavy laser cannon" :
(ship_prototypes[shiptype].secondaryType == HEAVY_LASER && ship_prototypes[shiptype].secondaryCount != 1)? "Heavy laser cannons" :
(ship_prototypes[shiptype].secondaryType == LIGHT_ION && ship_prototypes[shiptype].secondaryCount == 1)? "Light ion cannon" :
(ship_prototypes[shiptype].secondaryType == LIGHT_ION && ship_prototypes[shiptype].secondaryCount != 1)? "Light ion cannons" :
(ship_prototypes[shiptype].secondaryType == REPEATING_ION && ship_prototypes[shiptype].secondaryCount == 1)? "Repeating ion cannon" :
(ship_prototypes[shiptype].secondaryType == REPEATING_ION && ship_prototypes[shiptype].secondaryCount != 1)? "Repeating ion cannons" :
(ship_prototypes[shiptype].secondaryType == HEAVY_ION && ship_prototypes[shiptype].secondaryCount == 1)? "Heavy ion cannon" :
(ship_prototypes[shiptype].secondaryType == HEAVY_ION && ship_prototypes[shiptype].secondaryCount != 1)? "Heavy ion cannons" :
"unknown");
return pbname;
}
else
return "None.";
}
void do_shipstat( CHAR_DATA *ch, char *argument )
{
int shiptype;
char buf1[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char buf3[MAX_STRING_LENGTH];
char buf4[MAX_STRING_LENGTH];
char buf5[MAX_STRING_LENGTH];
char buf6[MAX_STRING_LENGTH];
char buf7[MAX_STRING_LENGTH];
char buf8[MAX_STRING_LENGTH];
char buf9[MAX_STRING_LENGTH];
char buf10[MAX_STRING_LENGTH];
if ( IS_NPC( ch ) )
{
send_to_char( "Huh?\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char( "Usage: shipstat <ship number>\n\r", ch );
return;
}
shiptype = atoi(argument)-1;
if(shiptype < 0 || shiptype > NUM_PROTOTYPES-1)
{
send_to_char("Invalid number.\n\r", ch);
return;
}
if(ship_prototypes[shiptype].primaryType > 0) sprintf(buf1, "%d", ship_prototypes[shiptype].primaryType);
else sprintf(buf1, "&RNone.");
if(ship_prototypes[shiptype].secondaryType > 0) sprintf(buf2, "%d", ship_prototypes[shiptype].secondaryType);
else sprintf(buf2, "&RNone.");
if(ship_prototypes[shiptype].range_weapons[0] > 0) sprintf(buf3, "%d", ship_prototypes[shiptype].range_weapons[0]);
else sprintf(buf3, "&RNone.");
if(ship_prototypes[shiptype].shields > 0) sprintf(buf4, "%d", ship_prototypes[shiptype].shields);
else sprintf(buf4, "&RNone.");
if(ship_prototypes[shiptype].range_weapons[1] > 0) sprintf(buf5, "%d", ship_prototypes[shiptype].range_weapons[1]);
else sprintf(buf5, "&RNone.");
if(ship_prototypes[shiptype].hyperspeed > 0) sprintf(buf6, "Class %d", ship_prototypes[shiptype].hyperspeed);
else sprintf(buf6, "&RNone.");
if(ship_prototypes[shiptype].range_weapons[2] > 0) sprintf(buf7, "%d", ship_prototypes[shiptype].range_weapons[2]);
else sprintf(buf7, "&RNone.");
if(ship_prototypes[shiptype].maxbombs > 0) sprintf(buf8, "%d", ship_prototypes[shiptype].maxbombs);
else sprintf(buf8, "&RNone.");
if(ship_prototypes[shiptype].turrets > 0) sprintf(buf9, "%d", ship_prototypes[shiptype].turrets);
else sprintf(buf9, "&RNone.");
if(ship_prototypes[shiptype].chaff > 0) sprintf(buf10, "%d", ship_prototypes[shiptype].chaff);
else sprintf(buf10, "&RNone.");
ch_printf(ch, "&R&z+&W---------------------------------------------------------------&z+\n\r");
ch_printf(ch, "&W| Name: &w%-35.35s &WCost: &w%8d &W|\r\n",
ship_prototypes[shiptype].name, ship_prototypes[shiptype].cost);
ch_printf(ch, "&z+&W---------------------------------------------------------------&z+\n\r\n\r");
ch_printf(ch, "&W Primary Weapon System:&w %-30.30s\n\r", primary_beam_name_proto(shiptype));
ch_printf(ch, "&W Secondary:&w %-30.30s\n\r\n\r", secondary_beam_name_proto(shiptype));
ch_printf(ch, "&W Missiles:&w %-5s&W Torpedos:&w %-5s&W Rockets:&w %-5s\n\r",
buf3, buf5, buf7);
ch_printf(ch, "&W Planetary bombs:&w %-5s&W Chaff:&w %-5s\n\r",
buf8, buf10);
ch_printf(ch, "\n\r&W Hull:&w %-5d&W Shields:&w %-5s&W Speed:&w %-5d&W Energy:&w %d\n\r",
ship_prototypes[shiptype].hull, buf4,
ship_prototypes[shiptype].speed, ship_prototypes[shiptype].energy);
ch_printf(ch, "&W Maneuverability:&w %d &WHyperdrive:&w %-5s\n\r", ship_prototypes[shiptype].manuever, buf6);
ch_printf(ch, "&W Turrets:&w %-5s\n\r",buf9);
ch_printf(ch, "&W MaxCargo %d", ship_prototypes[shiptype].maxcargo);
return;
}
void load_market_list()
{
FILE *fpList;
char *filename;
char list[256];
BMARKET_DATA *marketship;
int quantity;
first_market_ship = NULL;
last_market_ship = NULL;
log_string( "Loading black market." );
sprintf( list, "%s%s", SHIP_PROTOTYPE_DIR, "blackmarket.lst" );
fclose( fpReserve );
if ( ( fpList = fopen( list, "r" ) ) == NULL )
{
perror( list );
exit( 1 );
}
for ( ; ; )
{
filename = feof( fpList ) ? "$" : fread_word( fpList );
if ( filename[0] == '$' )
break;
CREATE( marketship, BMARKET_DATA, 1 );
LINK( marketship, first_market_ship, last_market_ship, next, prev );
marketship->filename = STRALLOC(filename);
quantity = fread_number( fpList );
marketship->quantity = quantity;
}
fclose( fpList );
log_string("Finished loading blackmarket." );
fpReserve = fopen( NULL_FILE, "r" );
return;
}
void save_market_list()
{
BMARKET_DATA *marketship;
FILE *fpout;
char filename[256];
sprintf( filename, "%s%s", SHIP_PROTOTYPE_DIR, "blackmarket.lst" );
fpout = fopen( filename, "w" );
if ( !fpout )
{
bug( "FATAL: cannot open blackmarket.lst for writing.\n\r", 0 );
return;
}
for ( marketship = first_market_ship; marketship; marketship= marketship->next )
{
fprintf( fpout, "%s\n", marketship->filename );
fprintf( fpout, "%d\n", marketship->quantity );
}
fprintf( fpout, "$\n" );
fclose( fpout );
}
void add_market_ship( SHIP_DATA *ship )
{
BMARKET_DATA *marketship;
bool found;
if(!ship) return;
for ( marketship = first_market_ship; marketship; marketship = marketship->next )
{
if ( !str_cmp( marketship->filename , ship->protoname ))
{
//Debugging bug("Found, adding quantity", 0);
found = TRUE;
marketship->quantity++;
return;
}
}
//Debugging bug("Not found, adding to .lst", 0);
CREATE( marketship, BMARKET_DATA, 1 );
LINK( marketship, first_market_ship, last_market_ship, next, prev );
marketship->filename = STRALLOC( ship->protoname );
marketship->quantity = 1;
save_market_list();
}
void remove_market_ship( BMARKET_DATA *marketship )
{
if(marketship->quantity > 1)
marketship->quantity--;
else
{
UNLINK( marketship, first_market_ship, last_market_ship, next, prev );
STRFREE( marketship->filename );
DISPOSE( marketship );
}
save_market_list();
}
void make_random_marketlist()
{
// BMARKET_DATA *marketship;
BMARKET_DATA *nmarketship;
FILE *fpout;
char filename[256];
int x,priority,count;
// Clear previously loaded data *** Change of plans, delete file and rebuild from scratch
// *** db.c does not load from file anymore
/* for( marketship = first_market_ship; marketship; marketship = marketship->next )
{
UNLINK( marketship, first_market_ship, last_market_ship, next, prev );
STRFREE( marketship->filename );
DISPOSE( marketship );
}*/
sprintf( filename, "%s%s", SHIP_PROTOTYPE_DIR, "blackmarket.lst" );
fpout = fopen(filename, "w");
fprintf( fpout, "$\n" );
fclose( fpout );
// Make a new list
count = 0;
while(1)
{
for(x=0;x<NUM_PROTOTYPES;x++)
{
if(str_cmp(ship_prototypes[x].clan,"The Empire") && str_cmp(ship_prototypes[x].clan,"The New Republic"))
continue;
if(count == 1)
{
if(number_range(1, 10) == 1)
{
save_market_list();
return;
}
}
if(count == 2)
{
if(number_range(1, 10) < 3)
{
save_market_list();
return;
}
}
if(count == 3)
{
if(number_range(1, 10) != 3)
{
save_market_list();
return;
}
}
if(count == 4)
{
save_market_list();
return;
}
priority = 0;
if(!str_cmp(ship_prototypes[x].sname,"TIE")) priority = 10;
if(!str_cmp(ship_prototypes[x].sname,"TIE.D")) priority = 1;
if(!str_cmp(ship_prototypes[x].sname,"TIE.B")) priority = 5;
if(!str_cmp(ship_prototypes[x].sname,"XM-1")) priority = 3;
if(!str_cmp(ship_prototypes[x].sname,"XG-1")) priority = 4;
if(!str_cmp(ship_prototypes[x].sname,"X-Wing")) priority = 8;
if(!str_cmp(ship_prototypes[x].sname,"Y-Wing")) priority = 8;
if(!str_cmp(ship_prototypes[x].sname,"B-Wing")) priority = 2;
if(!str_cmp(ship_prototypes[x].sname,"A-Wing")) priority = 6;
if(!str_cmp(ship_prototypes[x].sname,"K-Wing")) priority = 3;
if(priority != 0)
{
if(priority == 1 || priority == 2)
{
if(number_range(1, 25) >= 24)
{
/* for(marketship = first_market_ship; marketship; marketship = marketship->next)
{
if(str_cmp(marketship->filename, ship_prototypes[x].sname))
{*/
CREATE(nmarketship, BMARKET_DATA, 1);
LINK(nmarketship, first_market_ship, last_market_ship, next, prev);
nmarketship->filename = STRALLOC(ship_prototypes[x].sname);
nmarketship->quantity = 1;
count++;
/* }
} */
}
}
if(priority <= 5 && priority >= 3)
{
if(number_range(1, 25) >= 22)
{
/* for(marketship = first_market_ship; marketship; marketship = marketship->next)
{
if(str_cmp(ship_prototypes[x].sname, marketship->filename))
{*/
CREATE( nmarketship, BMARKET_DATA, 1 );
LINK( nmarketship, first_market_ship, last_market_ship, next, prev );
nmarketship->filename = STRALLOC(ship_prototypes[x].sname);
if(priority >= 4 && (number_range(1, 10) == 10)) nmarketship->quantity = number_range(1, 3);
else nmarketship->quantity = 1;
count++;
/* }
}*/
}
}
if(priority > 5 && priority < 9)
{
if(number_range(1, 25) >= 20)
{
/* for(marketship = first_market_ship; marketship; marketship = marketship->next)
{
if(str_cmp(ship_prototypes[x].sname, marketship->filename))
{*/
CREATE(nmarketship, BMARKET_DATA, 1);
LINK(nmarketship, first_market_ship, last_market_ship, next, prev);
nmarketship->filename = STRALLOC(ship_prototypes[x].sname);
if((priority == 5 || priority == 6) && (number_range(1, 10) == 10)) nmarketship->quantity = number_range(1, 3);
else nmarketship->quantity = 1;
count++;
/* }
}*/
}
}
if(priority >= 9)
{
if(number_range(1, 25) >= 18)
{
/* for(marketship = first_market_ship; marketship; marketship = marketship->next)
{
if(str_cmp(ship_prototypes[x].sname, marketship->filename))
{*/
CREATE(nmarketship, BMARKET_DATA, 1);
LINK(nmarketship, first_market_ship, last_market_ship, next, prev);
nmarketship->filename = STRALLOC(ship_prototypes[x].sname);
if(number_range(1, 10) == 10)
nmarketship->quantity = number_range(1, 3);
else
nmarketship->quantity = 1;
count++;
/* }
}*/
}
}
}
} // End for prototypes
}
save_market_list();
}
void do_generate_market(CHAR_DATA *ch, char *argument)
{
BMARKET_DATA *marketship;
if(IS_NPC(ch)) return;
if(!first_market_ship)
{
bug("Error 0.");
return;
}
marketship = first_market_ship;
if(!(marketship))
{
bug("Error 2.");
return;
}
// Clear list
for(marketship = first_market_ship; marketship; marketship = marketship->next)
{
UNLINK( marketship, first_market_ship, last_market_ship, next, prev );
STRFREE( marketship->filename );
// Pretty sure you don't need this, especially after its been unlinked.
// DISPOSE( marketship );
}
// Generate new
make_random_marketlist();
return;
}
void do_installmodule( CHAR_DATA *ch, char *argument )
{
SHIP_DATA *ship;
MODULE_DATA *mod;
int i=0, maxmod;
bool checktool,checkmod;
OBJ_DATA *obj;
OBJ_DATA *modobj;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
int x;
int chance;
//Max slots per mod.
int maxslot = 2;
//Damned Slots.
int primary=0;
int secondary=0;
int missile=0;
int rocket=0;
int torpedo=0;
int hull=0;
int shields=0;
int speed=0;
int hyperspeed=0;
int energy=0;
int manuever=0;
int alarm=0;
int chaff=0;
int slave=0;
int tractor=0;
strcpy( arg , argument );
checktool = FALSE;
checkmod = FALSE;
switch( ch->substate )
{
default:
if ( (ship = ship_from_engine(ch->in_room->vnum)) != NULL )
{
ship = ship_from_engine(ch->in_room->vnum);
strcpy(arg, ship->name);
}
if (!ship)
{
send_to_char("You need to be in the ships engine room.\n\r", ch);
return;
}
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_MODULE)
{
checkmod = TRUE;
modobj = obj;
}
}
if ( checktool == FALSE )
{
send_to_char("You need a toolkit to install a module.\n\r", ch);
return;
}
if ( checkmod == FALSE )
{
send_to_char("You need a module to install!\n\r", ch);
return;
}
for(i=0,mod=ship->first_module;mod;mod=mod->next)
{
++i;
if(mod->affect == AFFECT_PRIMARY)
++primary;
if(mod->affect == AFFECT_SECONDARY)
++secondary;
if(mod->affect == AFFECT_MISSILE)
++missile;
if(mod->affect == AFFECT_ROCKET)
++rocket;
if(mod->affect == AFFECT_TORPEDO)
++torpedo;
if(mod->affect == AFFECT_HULL)
++hull;
if(mod->affect == AFFECT_SHIELD)
++shields;
if(mod->affect == AFFECT_SPEED)
++speed;
if(mod->affect == AFFECT_HYPER)
++hyperspeed;
if(mod->affect == AFFECT_ENERGY)
++energy;
if(mod->affect == AFFECT_MANUEVER)
++manuever;
if(mod->affect == AFFECT_ALARM)
++alarm;
if(mod->affect == AFFECT_CHAFF)
++chaff;
if(mod->affect == AFFECT_SLAVE)
++slave;
if(mod->affect == AFFECT_TRACTOR)
++tractor;
}
//Holy ifchecks batman!
if (modobj->value[0] == AFFECT_ALARM && (ship->alarm == 1))
{
send_to_char("This ship already has an alarm system!\n\r", ch);
return;
}
if (modobj->value[0] == AFFECT_HYPER && (ship->hyperspeed == 1))
{
send_to_char("This ship already has a first class hyperspeed drive.\n\r", ch);
return;
}
if (modobj->value[0] == AFFECT_SLAVE && (ship->slave > 0))
{
send_to_char("This ship already has an slave circuit!\n\r", ch);
return;
}
if (modobj->value[0] == AFFECT_TRACTOR && (ship->tractorbeam > 0))
{
send_to_char("This ship already has a tractor beam!\n\r", ch);
return;
}
if((modobj->value[0] == AFFECT_PRIMARY && primary >= maxslot) ||
(modobj->value[0] == AFFECT_SECONDARY && secondary >= maxslot) ||
(modobj->value[0] == AFFECT_MISSILE && missile >= maxslot) ||
(modobj->value[0] == AFFECT_ROCKET && rocket >= maxslot) ||
(modobj->value[0] == AFFECT_TORPEDO && torpedo >= maxslot) ||
(modobj->value[0] == AFFECT_HULL && hull >= maxslot) ||
(modobj->value[0] == AFFECT_SHIELD && shields >= maxslot) ||
(modobj->value[0] == AFFECT_SPEED && speed >= maxslot) ||
(modobj->value[0] == AFFECT_HYPER && hyperspeed >= maxslot) ||
(modobj->value[0] == AFFECT_ENERGY && energy >= maxslot) ||
(modobj->value[0] == AFFECT_MANUEVER && manuever >= maxslot) ||
(modobj->value[0] == AFFECT_ALARM && alarm >= maxslot) ||
(modobj->value[0] == AFFECT_SLAVE && slave >= maxslot) ||
(modobj->value[0] == AFFECT_TRACTOR && tractor >= maxslot) ||
(modobj->value[0] == AFFECT_CHAFF && chaff >= maxslot))
{
send_to_char("&RYou've already filled that slot to its maximum.\n\r", ch);
return;
}
for(x=0;x<NUM_PROTOTYPES;x++)
{
if(!str_cmp(ship->protoname, ship_prototypes[x].sname) )
{
maxmod = ship_prototypes[x].mods;
break;
}
}
if (i >= maxmod)
{
send_to_char("This ship is already at it's module limit!\n\r", ch);
return;
}
if( IS_SET(ship->flags, SHIP_SIMULATOR))
{
send_to_char("Simulators can't have modules, fool!\n\r", ch);
return;
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_installmodule]);
if ( number_percent( ) < chance )
{
ch->dest_buf = str_dup(arg);
send_to_char( "&GYou begin the long process of installing a new module.\n\r", ch);
sprintf(buf, "$n takes out $s toolkit and a module and begins to work.\n\r");
act( AT_PLAIN, buf, ch, NULL, argument , TO_ROOM );
add_timer ( ch , TIMER_DO_FUN , 5 , do_installmodule , 1 );
return;
}
send_to_char("&RYou are unable to figure out what to do.\n\r",ch);
learn_from_failure( ch, gsn_installmodule );
return;
case 1:
if ( !ch->dest_buf )
return;
strcpy(arg, ch->dest_buf);
DISPOSE( ch->dest_buf);
break;
case SUB_TIMER_DO_ABORT:
DISPOSE( ch->dest_buf );
ch->substate = SUB_NONE;
send_to_char("&RYou are interupted and fail to finish.\n\r", ch);
return;
}
ch->substate = SUB_NONE;
for ( obj = ch->last_carrying; obj; obj = obj->prev_content )
{
if (obj->item_type == ITEM_TOOLKIT)
checktool = TRUE;
if (obj->item_type == ITEM_MODULE){
checkmod = TRUE;
modobj = obj;
}
}
chance = IS_NPC(ch) ? ch->top_level
: (int) (ch->pcdata->learned[gsn_installmodule]);
ship = ship_from_engine(ch->in_room->vnum);
if (!ship){
send_to_char("Error: Something went wrong. Contact an Admin!\n\r", ch);
return;
}
if ( number_percent( ) > chance*2 )
{
send_to_char("&RYou finish installing the new module and everything's looking good...\n\r", ch);
send_to_char("&RThen it turns bright red and melts!\n\r", ch);
learn_from_failure( ch, gsn_installmodule );
return;
}
CREATE(mod, MODULE_DATA, 1);
LINK(mod, ship->first_module, ship->last_module, next, prev);
mod->affect = modobj->value[0];
mod->ammount = modobj->value[1];
if(mod->affect == AFFECT_PRIMARY)
ship->primaryCount+=mod->ammount;
if(mod->affect == AFFECT_SECONDARY)
ship->secondaryCount+=mod->ammount;
if(mod->affect == AFFECT_MISSILE)
{
ship->maxmissiles+=mod->ammount;
ship->missiles=ship->maxmissiles;
}
if(mod->affect == AFFECT_ROCKET)
{
ship->maxrockets+=mod->ammount;
ship->rockets=ship->maxrockets;
}
if(mod->affect == AFFECT_TORPEDO)
{
ship->maxtorpedos+=mod->ammount;
ship->torpedos=ship->maxtorpedos;
}
if(mod->affect == AFFECT_HULL)
ship->maxhull+=mod->ammount;
if(mod->affect == AFFECT_SHIELD)
ship->maxshield+=mod->ammount;
if(mod->affect == AFFECT_SPEED)
ship->realspeed+=mod->ammount;
if(mod->affect == AFFECT_HYPER)
ship->hyperspeed-=mod->ammount;
if(mod->affect == AFFECT_ENERGY)
ship->maxenergy+=mod->ammount;
if(mod->affect == AFFECT_MANUEVER)
ship->manuever+=mod->ammount;
if(mod->affect == AFFECT_ALARM)
ship->alarm+=mod->ammount;
if(mod->affect == AFFECT_CHAFF)
ship->maxchaff+=mod->ammount;
if(mod->affect == AFFECT_SLAVE)
ship->slave+=mod->ammount;
if(mod->affect == AFFECT_TRACTOR)
ship->tractorbeam+=mod->ammount;
save_ship(ship);
separate_obj( modobj );
obj_from_char( modobj );
extract_obj(modobj);
send_to_char("You finish installing your new module.\n\r", ch);
{
long xpgain;
xpgain = ((ch->skill_level[TECHNICIAN_ABILITY]+1) * 300);
gain_exp(ch, xpgain, TECHNICIAN_ABILITY);
ch_printf( ch , " You gain %d experience for being a Technician.\n\r", xpgain );
learn_from_success( ch, gsn_installmodule ) ;
}
return;
}
void do_shiplist(CHAR_DATA *ch, char *argument)
{
int x;
send_to_char("\n\r&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Complete ship listing &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
for(x=0;x<NUM_PROTOTYPES;x++)
ch_printf(ch,"&W|&w &w(&W%2d&w) %s%-35.35s&W Type: %s %-15.15s &W |\r\n", x+1,
!str_cmp(ship_prototypes[x].clan, "The Empire") ? "&R" :
!str_cmp(ship_prototypes[x].clan, "The New Republic") ? "&G" : "&w",
ship_prototypes[x].name,
!str_cmp(ship_prototypes[x].clan, "The Empire") ? "&RImperial" :
!str_cmp(ship_prototypes[x].clan, "The New Republic") ? "&GRepublic" :
"&wCivilian",
ship_prototypes[x].class == SHIP_FIGHTER ? "Starfighter" :
ship_prototypes[x].class == SHIP_BOMBER ? "Bomber" :
ship_prototypes[x].class == SHIP_SHUTTLE ? "Shuttle" :
ship_prototypes[x].class == SHIP_FREIGHTER ? "Freighter" :
ship_prototypes[x].class == SHIP_FRIGATE ? "Frigate" :
ship_prototypes[x].class == SHIP_TT ? "Troop Transport" :
ship_prototypes[x].class == SHIP_CORVETTE ? "Corvette" :
ship_prototypes[x].class == SHIP_CRUISER ? "Cruiser" :
ship_prototypes[x].class == SHIP_DREADNAUGHT ? "Dreadnaught" :
ship_prototypes[x].class == SHIP_DESTROYER ? "Star Destroyer" :
ship_prototypes[x].class == SHIP_SPACE_STATION ? "Space Station" :
ship_prototypes[x].class == LAND_VEHICLE ? "Land vehicle" : "Unknown");
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\r\n",ch);
send_to_char("&W|&w Use 'shipstat (number)' to get ship information &W|\r\n",ch);
send_to_char("&z+&W-----------------------------------------------------------------------------&z+\n\r",ch);
return;
}
/*free up ship data by Keberus */
void free_ship( SHIP_DATA *ship )
{
MODULE_DATA *mod, *mod_next;
TURRET_DATA *turret, *tnext;
STRFREE( ship->clanowner );
STRFREE( ship->copilot );
STRFREE( ship->description );
STRFREE( ship->home );
STRFREE( ship->name );
STRFREE( ship->owner );
STRFREE( ship->pilot );
DISPOSE( ship->filename );
STRFREE( ship->protoname );
STRFREE( ship->pbeacon );
STRFREE( ship->dest );
/*dispose of ship module data*/
for( mod = ship->first_module; mod; mod = mod_next )
{
mod_next = mod->next;
UNLINK( mod, ship->first_module, ship->last_module, next, prev );
DISPOSE(mod);
}
/*dispose of ship turret data*/
for( turret = ship->first_turret; turret; turret = tnext )
{
tnext = turret->next;
UNLINK( turret, ship->first_turret, ship->last_turret, next, prev );
DISPOSE(turret);
}
DISPOSE( ship );
return;
}