Site hosted by Angelfire.com: Build your free website today!
ESCAPE

escape koden. läs guiden RECALL först, innan detta, för jag förklara bara nya grejer var gång.
Sårhär set koden ut:

void do_escape( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *location;

if (IS_NPC(ch) || !IS_HERO(ch))
return;

if ( ch->position >= POS_SLEEPING )
{
send_to_char( "You can only do this if you are dying.\n\r", ch );
return;
}

if ( ( location = get_room_index( ROOM_VNUM_TEMPLE ) ) == NULL )
{
send_to_char( "You are completely lost.\n\r", ch );
return;
}

if ( ch->in_room == location )
return;

ch->move = 0;
ch->mana = 0;
act( "$n fades out of existance.", ch, NULL, NULL, TO_ROOM );
char_from_room( ch );
char_to_room( ch, location );
act( "$n fades into existance.", ch, NULL, NULL, TO_ROOM );
do_look( ch, "auto" );
sprintf(buf,"%s has escaped defenceless from a fight.",ch->name);
do_info(ch,buf);

return;
}

void do_escape (char_data *ch, char *argument* ) - en funktion börjar alltid såhär

char buf[MAX_STRING_LENGTH];
ROOM_INDEX_DATA *location;

vi skapar två nya variablar. noterna att en variabel, som skapas i en funktion, funkar ENDAST BARA i den funktionen, den för varje gång vi hoppar ut ur funktionen.

char buf [MAX_STRING_LENGHT] - vi skapar en sträng (char) och döper den (buf) och ger den ett max-värde (MAX_STRING_LENGHT - 4000-nånting)
ROOM_INDEX_DATA *location - vi skapar ett temporärt rum, och döper den till 'location'

if (IS_NPC(ch) || !IS_HERO(ch))
return;

om personen som utför kommandet är en NPC (non player character) eller ( || ) är inte immortal.
IS_HERO - vi frågar hon spelaren ch är en immortal. level 'hero' användes i de gamla MERC muddarna, men ingen har brytt sig om att dom tog bort level HERO
! - betyder motsatt. DVS: "IS_HERO" - är han immortal? "!IS_HERO" - är han INTE immortal?

alltså, betyder IF-satsen: om personen är ett monster eller är en dödling ( icke immortal) gör detta:
return; - avbryt

if ( ch->position >= POS_SLEEPING )
{
send_to_char( "You can only do this if you are dying.\n\r", ch );
return;
}

det finns olika nivåer på en persons 'position' kan vara. de är definerade i merc.h. sök igenom merc.h efter 'POS_' och titta själv.
aja, om spelarens (ch) postion ÄR MER ÄN ELLER ÄR 'POS_SLEEPING'

>= - betyder 'är mer än eller är' ex: 5 >= 4 är sant. 4 >= 4 är sant. 3 >= 4, stämmer inte.

if ( ( location = get_room_index( ROOM_VNUM_TEMPLE ) ) == NULL )
{
send_to_char( "You are completely lost.\n\r", ch );
return;
}

vi bestämer att location är rummet 'ROOM_VNUM_TEMPLE' (ROOM_VNUM_TEMPLE är också definerat i merc.h)
om rummet finns inte: skicka till spelaren 'You are complete..."

if ( ch->in_room == location )
return;

om spelaren är redan i 'ROOM_VNUM_TEMPLE', gör return;

ch->move = 0;
ch->mana = 0;
act( "$n fades out of existance.", ch, NULL, NULL, TO_ROOM );
char_from_room( ch );
char_to_room( ch, location );
act( "$n fades into existance.", ch, NULL, NULL, TO_ROOM );
do_look( ch, "auto" );
sprintf(buf,"%s has escaped defenceless from a fight.",ch->name);
do_info(ch,buf);

return;
}

här sätter vi att spelarens move och mana blir 0 (ch->move = 0, ch->mana = 0)
act() - skicka '$n fades out of..' till alla i rummet
char_from_room() - ta ut spelaren
char_to_room() sätt dit spelaren ch, till rummet location
act() - skriv på skärmen '$n fades into ex...'
do_look() - gör så att spelare tittar automatiskt ("auto")

sprintf - här bestämmer vi att buf ska innehålla '$s has excaped fenceless from a fight'. Det roliga med sprintf är att man ska byta ut saker i texten.
som du ser börjar texte med %s. %s är faktiskt en sträng, som bestäms senare av ch-name. alltså blir %s "Tragon".

ex: sprintf( buf, "%s hoppar på %s och ger honom %d slag, ch->name, victim->name, 34 ); ch är Corgrath, victim är Tragon.
då kommer buf faktiskt innehålla: Corgrath hoppar på Tragon och ger honom 32 slag.
%s - stränger (text)
%d - heltal (siffror)

do_info() - är den funktionen som är just 'INFO -> bla, bla bla'