亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? magic.c

?? MUD服務(wù)器程序
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/

#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"



/*
 * Local functions.
 */
void	say_spell	args( ( CHAR_DATA *ch, int sn ) );



/*
 * Lookup a skill by name.
 */
int skill_lookup( const char *name )
{
    int sn;

    for ( sn = 0; sn < MAX_SKILL; sn++ )
    {
	if ( skill_table[sn].name == NULL )
	    break;
	if ( LOWER(name[0]) == LOWER(skill_table[sn].name[0])
	&&   !str_prefix( name, skill_table[sn].name ) )
	    return sn;
    }

    return -1;
}



/*
 * Lookup a skill by slot number.
 * Used for object loading.
 */
int slot_lookup( int slot )
{
    extern bool fBootDb;
    int sn;

    if ( slot <= 0 )
	return -1;

    for ( sn = 0; sn < MAX_SKILL; sn++ )
    {
	if ( slot == skill_table[sn].slot )
	    return sn;
    }

    if ( fBootDb )
    {
	bug( "Slot_lookup: bad slot %d.", slot );
	abort( );
    }

    return -1;
}



/*
 * Utter mystical words for an sn.
 */
void say_spell( CHAR_DATA *ch, int sn )
{
    char buf  [MAX_STRING_LENGTH];
    char buf2 [MAX_STRING_LENGTH];
    CHAR_DATA *rch;
    char *pName;
    int iSyl;
    int length;

    struct syl_type
    {
	char *	old;
	char *	new;
    };

    static const struct syl_type syl_table[] =
    {
	{ " ",		" "		},
	{ "ar",		"abra"		},
	{ "au",		"kada"		},
	{ "bless",	"fido"		},
	{ "blind",	"nose"		},
	{ "bur",	"mosa"		},
	{ "cu",		"judi"		},
	{ "de",		"oculo"		},
	{ "en",		"unso"		},
	{ "light",	"dies"		},
	{ "lo",		"hi"		},
	{ "mor",	"zak"		},
	{ "move",	"sido"		},
	{ "ness",	"lacri"		},
	{ "ning",	"illa"		},
	{ "per",	"duda"		},
	{ "ra",		"gru"		},
	{ "re",		"candus"	},
	{ "son",	"sabru"		},
	{ "tect",	"infra"		},
	{ "tri",	"cula"		},
	{ "ven",	"nofo"		},
	{ "a", "a" }, { "b", "b" }, { "c", "q" }, { "d", "e" },
	{ "e", "z" }, { "f", "y" }, { "g", "o" }, { "h", "p" },
	{ "i", "u" }, { "j", "y" }, { "k", "t" }, { "l", "r" },
	{ "m", "w" }, { "n", "i" }, { "o", "a" }, { "p", "s" },
	{ "q", "d" }, { "r", "f" }, { "s", "g" }, { "t", "h" },
	{ "u", "j" }, { "v", "z" }, { "w", "x" }, { "x", "n" },
	{ "y", "l" }, { "z", "k" },
	{ "", "" }
    };

    buf[0]	= '\0';
    for ( pName = skill_table[sn].name; *pName != '\0'; pName += length )
    {
	for ( iSyl = 0; (length = strlen(syl_table[iSyl].old)) != 0; iSyl++ )
	{
	    if ( !str_prefix( syl_table[iSyl].old, pName ) )
	    {
		strcat( buf, syl_table[iSyl].new );
		break;
	    }
	}

	if ( length == 0 )
	    length = 1;
    }

    sprintf( buf2, "$n utters the words, '%s'.", buf );
    sprintf( buf,  "$n utters the words, '%s'.", skill_table[sn].name );

    for ( rch = ch->in_room->people; rch; rch = rch->next_in_room )
    {
	if ( rch != ch )
	    act( ch->class==rch->class ? buf : buf2, ch, NULL, rch, TO_VICT );
    }

    return;
}



/*
 * Compute a saving throw.
 * Negative apply's make saving throw better.
 */
bool saves_spell( int level, CHAR_DATA *victim )
{
    int save;

    save = 50 + ( victim->level - level - victim->saving_throw ) * 5;
    save = URANGE( 5, save, 95 );
    return number_percent( ) < save;
}



/*
 * The kludgy global is for spells who want more stuff from command line.
 */
char *target_name;

void do_cast( CHAR_DATA *ch, char *argument )
{
    char arg1[MAX_INPUT_LENGTH];
    char arg2[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    OBJ_DATA *obj;
    void *vo;
    int mana;
    int sn;

    /*
     * Only MOBprogrammed mobs not charmed can cast spells
     * like PC's
     */
    if ( IS_NPC(ch)
	&& ( !ch->pIndexData->progtypes
	    || IS_AFFECTED( ch, AFF_CHARM ) ) )
	return;

    target_name = one_argument( argument, arg1 );
    one_argument( target_name, arg2 );

    if ( arg1[0] == '\0' )
    {
	send_to_char( "Cast which what where?\n\r", ch );
	return;
    }

    if ( ( sn = skill_lookup( arg1 ) ) < 0
    || ( !IS_NPC(ch) && ch->level < skill_table[sn].skill_level[ch->class] ) )
    {
	send_to_char( "You can't do that.\n\r", ch );
	return;
    }
  
    if ( ch->position < skill_table[sn].minimum_position )
    {
	send_to_char( "You can't concentrate enough.\n\r", ch );
	return;
    }

    mana = MANA_COST(ch, sn);

    /*
     * Locate targets.
     */
    victim	= NULL;
    obj		= NULL;
    vo		= NULL;
      
    switch ( skill_table[sn].target )
    {
    default:
	bug( "Do_cast: bad target for sn %d.", sn );
	return;

    case TAR_IGNORE:
	break;

    case TAR_CHAR_OFFENSIVE:
	if ( arg2[0] == '\0' )
	{
	    if ( ( victim = ch->fighting ) == NULL )
	    {
		send_to_char( "Cast the spell on whom?\n\r", ch );
		return;
	    }
	}
	else
	{
	    if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
	    {
		send_to_char( "They aren't here.\n\r", ch );
		return;
	    }
	}

/*	if ( !IS_NPC(ch) )
	{
	    if ( !IS_NPC(victim) && ch != victim )
	    {
		send_to_char( "You can't do that on a player.\n\r", ch );
		return;
	    }

	    if ( IS_AFFECTED(ch, AFF_CHARM) && ch->master == victim )
	    {
		send_to_char( "You can't do that on your own follower.\n\r",
		    ch );
		return;
	    }
	}
*/
	vo = (void *) victim;
	break;

    case TAR_CHAR_DEFENSIVE:
	if ( arg2[0] == '\0' )
	{
	    victim = ch;
	}
	else
	{
	    if ( ( victim = get_char_room( ch, arg2 ) ) == NULL )
	    {
		send_to_char( "They aren't here.\n\r", ch );
		return;
	    }
	}

	vo = (void *) victim;
	break;

    case TAR_CHAR_SELF:
	if ( arg2[0] != '\0' && !is_name( arg2, ch->name ) )
	{
	    send_to_char( "You cannot cast this spell on another.\n\r", ch );
	    return;
	}

	vo = (void *) ch;
	break;

    case TAR_OBJ_INV:
	if ( arg2[0] == '\0' )
	{
	    send_to_char( "What should the spell be cast upon?\n\r", ch );
	    return;
	}

	if ( ( obj = get_obj_carry( ch, arg2 ) ) == NULL )
	{
	    send_to_char( "You are not carrying that.\n\r", ch );
	    return;
	}

	vo = (void *) obj;
	break;
    }
	    
    if ( !IS_NPC(ch) && ch->mana < mana )
    {
	send_to_char( "You don't have enough mana.\n\r", ch );
	return;
    }
      
    if ( str_cmp( skill_table[sn].name, "ventriloquate" ) )
	say_spell( ch, sn );
      
    WAIT_STATE( ch, skill_table[sn].beats );
      
    if ( !IS_NPC(ch) && number_percent( ) > ch->pcdata->learned[sn] )
    {
	send_to_char( "You lost your concentration.\n\r", ch );
	ch->mana -= mana / 2;
    }
    else
    {
	ch->mana -= mana;
	(*skill_table[sn].spell_fun) ( sn, ch->level, ch, vo );
    }

    if ( skill_table[sn].target == TAR_CHAR_OFFENSIVE
	&& victim->master != ch && victim != ch )
    {
	CHAR_DATA *vch;
	CHAR_DATA *vch_next;

	for ( vch = ch->in_room->people; vch; vch = vch_next )
	{
	    vch_next = vch->next_in_room;
	    if ( victim == vch && victim->fighting == NULL )
	    {
		multi_hit( victim, ch, TYPE_UNDEFINED );
		break;
	    }
	}
    }

    return;
}



/*
 * Cast spells at targets using a magical object.
 */
void obj_cast_spell( int sn, int level, CHAR_DATA *ch, CHAR_DATA *victim, OBJ_DATA *obj )
{
    void *vo;

    if ( sn <= 0 )
	return;

    if ( sn >= MAX_SKILL || skill_table[sn].spell_fun == 0 )
    {
	bug( "Obj_cast_spell: bad sn %d.", sn );
	return;
    }

    switch ( skill_table[sn].target )
    {
    default:
	bug( "Obj_cast_spell: bad target for sn %d.", sn );
	return;

    case TAR_IGNORE:
	vo = NULL;
	break;

    case TAR_CHAR_OFFENSIVE:
	if ( victim == NULL )
	    victim = ch->fighting;
	if ( victim == NULL || !IS_NPC(victim) )
	{
	    send_to_char( "You can't do that.\n\r", ch );
	    return;
	}
	vo = (void *) victim;
	break;

    case TAR_CHAR_DEFENSIVE:
	if ( victim == NULL )
	    victim = ch;
	vo = (void *) victim;
	break;

    case TAR_CHAR_SELF:
	vo = (void *) ch;
	break;

    case TAR_OBJ_INV:
	if ( obj == NULL )
	{
	    send_to_char( "You can't do that.\n\r", ch );
	    return;
	}
	vo = (void *) obj;
	break;
    }

    target_name = "";
    (*skill_table[sn].spell_fun) ( sn, level, ch, vo );

    if ( skill_table[sn].target == TAR_CHAR_OFFENSIVE && victim->master != ch )
    {
	CHAR_DATA *vch;
	CHAR_DATA *vch_next;

	for ( vch = ch->in_room->people; vch; vch = vch_next )
	{
	    vch_next = vch->next_in_room;
	    if ( victim == vch && victim->fighting == NULL )
	    {
		multi_hit( victim, ch, TYPE_UNDEFINED );
		break;
	    }
	}
    }

    return;
}



/*
 * Spell functions.
 */
void spell_acid_blast( int sn, int level, CHAR_DATA *ch, void *vo )
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    int dam;

    dam = dice( level, 6 );
    if ( saves_spell( level, victim ) )
	dam /= 2;
    damage( ch, victim, dam, sn );
    return;
}



void spell_armor( int sn, int level, CHAR_DATA *ch, void *vo )
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if ( is_affected( victim, sn ) )
	return;
    af.type      = sn;
    af.duration  = 24;
    af.modifier  = -20;
    af.location  = APPLY_AC;
    af.bitvector = 0;
    affect_to_char( victim, &af );
    send_to_char( "You feel someone protecting you.\n\r", victim );
    if ( ch != victim )
	send_to_char( "Ok.\n\r", ch );
    return;
}



void spell_bless( int sn, int level, CHAR_DATA *ch, void *vo )
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if ( victim->position == POS_FIGHTING || is_affected( victim, sn ) )
	return;
    af.type      = sn;
    af.duration  = 6+level;
    af.location  = APPLY_HITROLL;
    af.modifier  = level / 8;
    af.bitvector = 0;
    affect_to_char( victim, &af );

    af.location  = APPLY_SAVING_SPELL;
    af.modifier  = 0 - level / 8;
    affect_to_char( victim, &af );
    send_to_char( "You feel righteous.\n\r", victim );
    if ( ch != victim )
	send_to_char( "Ok.\n\r", ch );
    return;
}



void spell_blindness( int sn, int level, CHAR_DATA *ch, void *vo )
{
    CHAR_DATA *victim = (CHAR_DATA *) vo;
    AFFECT_DATA af;

    if ( IS_AFFECTED(victim, AFF_BLIND) || saves_spell( level, victim ) )
	return;

    af.type      = sn;
    af.location  = APPLY_HITROLL;
    af.modifier  = -4;
    af.duration  = 1+level;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜一区二区三区在线观看| 国产一区二区三区免费播放| 国产日韩亚洲欧美综合| 91视频观看免费| 蜜臀久久久99精品久久久久久| 最新日韩在线视频| 337p粉嫩大胆噜噜噜噜噜91av| 在线国产电影不卡| 国产精品18久久久久久久久| 天天色天天操综合| 亚洲日本成人在线观看| 久久久久久久久97黄色工厂| 日韩视频不卡中文| 欧美日韩成人综合| 色欧美88888久久久久久影院| 国产盗摄女厕一区二区三区| 日韩**一区毛片| 亚洲图片自拍偷拍| 一区二区三区精品在线观看| 中文字幕av一区二区三区免费看 | 国产91高潮流白浆在线麻豆| 天堂一区二区在线免费观看| 亚洲精品亚洲人成人网在线播放| 国产人成一区二区三区影院| 日韩精品一区二区三区蜜臀 | 亚洲人成电影网站色mp4| 国产日韩影视精品| 国产调教视频一区| 久久只精品国产| 亚洲精品一区二区三区蜜桃下载 | 国产调教视频一区| 久久久久一区二区三区四区| 在线成人免费观看| 欧美精品777| 欧美欧美欧美欧美| 欧美精品在线一区二区三区| 欧美撒尿777hd撒尿| 欧美性淫爽ww久久久久无| 在线免费观看一区| 在线观看免费视频综合| 欧美视频在线一区二区三区 | 欧美日韩一区二区三区四区| 在线亚洲免费视频| 欧美综合一区二区| 欧美色男人天堂| 91精品国产黑色紧身裤美女| 91精品国产综合久久久久久久久久 | 国产欧美视频一区二区| 国产日韩高清在线| 国产精品每日更新在线播放网址| 日本一区二区三级电影在线观看 | 一区二区三区中文字幕| 樱花影视一区二区| 五月天欧美精品| 美美哒免费高清在线观看视频一区二区 | 欧美高清dvd| 精品久久人人做人人爽| 国产亲近乱来精品视频| 亚洲色欲色欲www在线观看| 亚洲欧美国产三级| 日日夜夜免费精品| 狠狠色丁香久久婷婷综合_中| 国产成人精品影视| 一本一道波多野结衣一区二区| 99re8在线精品视频免费播放| 欧美自拍偷拍一区| 精品久久久久久久久久久久包黑料 | 亚洲成av人片| 国产在线播放一区二区三区| 99精品欧美一区二区三区小说| 在线亚洲人成电影网站色www| 在线播放91灌醉迷j高跟美女| 精品理论电影在线| ㊣最新国产の精品bt伙计久久| 亚欧色一区w666天堂| 国产在线国偷精品免费看| av电影在线不卡| 欧美精品123区| 国产精品入口麻豆九色| 五月婷婷久久综合| 成人黄动漫网站免费app| 欧美视频一区在线| 久久久99久久| 婷婷久久综合九色综合绿巨人| 国产在线一区二区综合免费视频| 一本色道**综合亚洲精品蜜桃冫| 欧美电影免费观看高清完整版在线观看 | 欧美视频自拍偷拍| 国产午夜精品一区二区三区视频| 亚洲永久免费av| 国产毛片一区二区| 欧美日韩成人综合在线一区二区| 国产网站一区二区| 午夜精品福利在线| 成人午夜免费电影| 日韩美女视频在线| 亚洲在线中文字幕| 国产成人av资源| 日韩一级二级三级| 亚洲综合一区二区三区| 大桥未久av一区二区三区中文| 欧美理论电影在线| 亚洲欧美日韩在线不卡| 国产激情一区二区三区| 日韩欧美一级精品久久| 一区二区三区精品在线| 大胆亚洲人体视频| 久久久久久一级片| 久久99精品国产| 欧美一区二区三区四区视频| 亚洲激情五月婷婷| voyeur盗摄精品| 国产色产综合色产在线视频| 麻豆免费看一区二区三区| 欧美日韩激情一区二区三区| 综合在线观看色| av午夜一区麻豆| 国产精品天干天干在观线| 国产福利一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av | 欧美日韩一级黄| 一区二区在线免费| 97超碰欧美中文字幕| 亚洲国产精品高清| 成人一区在线看| 中文在线免费一区三区高中清不卡| 久久99精品视频| 日韩视频永久免费| 久久精品国产精品亚洲综合| 欧美一区二区视频免费观看| 天堂成人免费av电影一区| 欧美日韩第一区日日骚| 日韩国产欧美一区二区三区| 欧美日本国产一区| 日精品一区二区三区| 欧美日产在线观看| 美腿丝袜亚洲一区| 精品日韩av一区二区| 国产麻豆精品视频| 欧美国产视频在线| 91免费看视频| 一区二区激情小说| 欧美乱妇20p| 免费在线观看精品| 久久综合给合久久狠狠狠97色69| 国内精品写真在线观看| 欧美国产日韩在线观看| 一本久久综合亚洲鲁鲁五月天| 亚洲精品成人悠悠色影视| 欧美日韩精品欧美日韩精品| 奇米影视在线99精品| 精品国产三级a在线观看| 国产激情精品久久久第一区二区 | 26uuu久久天堂性欧美| 成人中文字幕合集| 亚洲永久精品国产| 日韩欧美国产1| 国产a级毛片一区| 尤物av一区二区| 日韩欧美一卡二卡| 成人国产精品免费观看视频| 亚洲精品第1页| 欧美成人一区二区| eeuss影院一区二区三区| 夜夜嗨av一区二区三区 | 亚洲免费观看高清| 91精品国产综合久久久久久漫画| 国产一区二区在线免费观看| 一色屋精品亚洲香蕉网站| 欧美日韩一级二级| 国产精品自拍三区| 亚洲制服丝袜av| 精品成a人在线观看| 色女孩综合影院| 免费美女久久99| 一区二区中文字幕在线| 欧美电影一区二区| 成人avav影音| 日韩国产精品大片| 亚洲丝袜精品丝袜在线| 欧美一二三区在线观看| 99国产精品久久久久久久久久久| 爽好久久久欧美精品| 欧美国产一区在线| 欧美一区二区三区人| 99精品偷自拍| 国产精品正在播放| 日欧美一区二区| 亚洲青青青在线视频| 欧美r级在线观看| 91官网在线观看| 福利91精品一区二区三区| 日韩电影免费在线看| 中文字幕一区av| 久久精品视频免费观看| 91精品国产综合久久久久久久久久| www.日本不卡| 韩国v欧美v亚洲v日本v| 日韩精品乱码免费| 亚洲一区二区黄色|