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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? magic.c

?? MUD服務器程序
?? C
?? 第 1 頁 / 共 5 頁
字號:
/***************************************************************************
 *  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;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色老综合老女人久久久| 国产最新精品精品你懂的| 久久免费国产精品| 精品久久免费看| 久久综合成人精品亚洲另类欧美| 制服丝袜av成人在线看| 777奇米四色成人影色区| 欧美日韩午夜精品| 欧美一级国产精品| 欧美精品一区二区三区一线天视频| 欧美一区二区在线免费播放 | 国产精品乱码久久久久久| 久久精品夜色噜噜亚洲a∨| 中文字幕电影一区| 亚洲精品国产a| 青青青伊人色综合久久| 精油按摩中文字幕久久| 国产精品 欧美精品| 成人视屏免费看| 91女厕偷拍女厕偷拍高清| 91免费观看视频在线| 欧美丰满少妇xxxbbb| 精品日韩在线一区| 中文字幕av资源一区| 一区二区三区在线免费播放 | 日韩视频在线一区二区| 久久久久久麻豆| 日韩一区在线看| 日本人妖一区二区| 国产成人免费在线视频| 91九色02白丝porn| 欧美一区二区免费视频| 国产精品毛片高清在线完整版| 一二三区精品视频| 毛片av中文字幕一区二区| 成人av电影免费在线播放| 在线综合亚洲欧美在线视频 | 一本色道久久加勒比精品| 欧美一区二区三区爱爱| 国产精品久久久久久久浪潮网站| 亚洲福利视频一区| 成人av免费观看| 日韩一级完整毛片| 亚洲精品欧美综合四区| 国产一区免费电影| 欧美精品在线一区二区三区| 国产精品进线69影院| 蜜桃精品视频在线观看| 91亚洲国产成人精品一区二三| 精品国产网站在线观看| 亚洲午夜电影在线观看| 成人av在线影院| 国产视频在线观看一区二区三区 | 在线观看www91| 国产欧美视频在线观看| 秋霞国产午夜精品免费视频| 一本在线高清不卡dvd| 亚洲国产精品成人综合色在线婷婷| 亚洲丰满少妇videoshd| 色狠狠av一区二区三区| 国产蜜臀av在线一区二区三区 | 久久久久久久免费视频了| 日韩国产欧美三级| 欧美精品日韩精品| 一级中文字幕一区二区| 91伊人久久大香线蕉| 中日韩免费视频中文字幕| 激情欧美日韩一区二区| 日韩免费看的电影| 久久99国产精品成人| 日韩一区二区三| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美视频一区在线观看| 一区二区三区免费| 欧美亚洲动漫制服丝袜| 午夜欧美一区二区三区在线播放| 94-欧美-setu| 亚洲精品日产精品乱码不卡| 色域天天综合网| 亚洲午夜视频在线| 欧美老女人在线| 久久精品国产99久久6| 日韩欧美国产综合| 国产一区二区三区免费| 国产清纯美女被跳蛋高潮一区二区久久w | 国产乱子伦一区二区三区国色天香 | 欧美乱妇23p| 青青草成人在线观看| 91精品国产一区二区三区| 久久精品二区亚洲w码| 精品欧美久久久| 国产91高潮流白浆在线麻豆| 中文字幕一区二区三区蜜月| 色综合视频在线观看| 亚洲一区二区高清| 日韩欧美国产麻豆| 成人动漫中文字幕| 亚洲图片欧美色图| 精品国产一区二区三区忘忧草 | 亚洲自拍偷拍九九九| 日韩欧美一区中文| 成人精品高清在线| 一区二区三区免费网站| 精品国产91久久久久久久妲己 | 午夜精品久久久| 久久午夜色播影院免费高清 | 日韩电影在线观看一区| 久久精品一级爱片| 欧美浪妇xxxx高跟鞋交| 国产一区视频在线看| 一区二区欧美视频| 久久婷婷国产综合精品青草| 91精品办公室少妇高潮对白| 捆绑变态av一区二区三区| 国产精品国产成人国产三级| 欧美美女一区二区三区| 99久免费精品视频在线观看 | 成人免费一区二区三区视频 | 亚洲欧美在线观看| 2020国产精品自拍| 色婷婷亚洲综合| 国产麻豆视频一区二区| 午夜精品123| 亚洲狼人国产精品| 久久久久久久久久久久久久久99| 欧美日韩久久久一区| 99热这里都是精品| 国产乱妇无码大片在线观看| 日本系列欧美系列| 亚洲一区二区在线播放相泽| 国产精品久久久久久亚洲伦| ww亚洲ww在线观看国产| 91精品国产综合久久久蜜臀粉嫩 | 欧美一区二区三区在线看 | 亚洲一区二区精品视频| 专区另类欧美日韩| 久久久另类综合| 精品国产91九色蝌蚪| 欧美精品高清视频| 欧美日韩一级片在线观看| 91网页版在线| 色系网站成人免费| 不卡在线视频中文字幕| 国产精品综合网| 国产高清不卡二三区| 久久99久久99| 韩国视频一区二区| 国产精品一区二区在线观看网站| 免费人成黄页网站在线一区二区| 亚洲国产日韩精品| 亚洲国产一区二区a毛片| 亚洲午夜久久久久| 日韩综合一区二区| 青草av.久久免费一区| 久久电影网站中文字幕| 精品一区二区三区日韩| 精品一区免费av| 成人一区二区三区| 91在线播放网址| 欧美三级韩国三级日本一级| 欧美精三区欧美精三区| 欧美一级国产精品| 国产视频一区二区在线观看| 国产清纯白嫩初高生在线观看91| 国产精品麻豆视频| 一区二区三区视频在线看| 亚洲国产精品精华液网站| 日本成人在线电影网| 国产久卡久卡久卡久卡视频精品| 成人午夜私人影院| 欧美主播一区二区三区美女| 91精品啪在线观看国产60岁| 久久免费国产精品| 亚洲精品国久久99热| 免费人成在线不卡| av网站一区二区三区| 欧美性极品少妇| 欧美精品一区二区在线播放| 亚洲柠檬福利资源导航| 午夜精品一区二区三区免费视频| 久久se精品一区二区| 91在线观看免费视频| 制服丝袜中文字幕一区| 国产欧美日本一区二区三区| 亚洲自拍与偷拍| 国产伦理精品不卡| 欧美日韩一卡二卡| 国产情人综合久久777777| 亚洲成av人综合在线观看| 国产成人免费高清| 欧美久久久久久蜜桃| 一区免费观看视频| 毛片av一区二区三区| 色偷偷88欧美精品久久久| 久久亚洲欧美国产精品乐播| 亚洲最大成人综合| 国产成人福利片| 精品国产伦一区二区三区观看体验| 国产精品进线69影院| 狠狠色丁香婷综合久久|