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

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

?? script.c

?? 最新的仙鏡傳說服務器C語言源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
 *------------------------------------------
 */
unsigned char* parse_script(unsigned char *src,int line)
{
	unsigned char *p,*tmpp;
	int i;
	static int first=1;

	if(first){
		add_buildin_func();
		read_constdb();
	}
	first=0;
	script_buf=calloc(SCRIPT_BLOCK_SIZE, 1);
	if(script_buf==NULL){
		printf("out of memory : parse_script\n");
		exit(1);
	}
	script_pos=0;
	script_size=SCRIPT_BLOCK_SIZE;
	str_data[LABEL_NEXTLINE].type=C_NOP;
	str_data[LABEL_NEXTLINE].backpatch=-1;
	str_data[LABEL_NEXTLINE].label=-1;
	for(i=LABEL_START;i<str_num;i++){
		if(str_data[i].type==C_POS || str_data[i].type==C_NAME){
			str_data[i].type=C_NOP;
			str_data[i].backpatch=-1;
			str_data[i].label=-1;
		}
	}

	// 奜晹梡label db偺弶婜壔
	if(scriptlabel_db!=NULL)
		strdb_final(scriptlabel_db,scriptlabel_final);
	scriptlabel_db=strdb_init(50);

	// for error message
	startptr = src;
	startline = line;

	p=src;
	p=skip_space(p);
	if(*p!='{'){
		disp_error_message("not found '{'",p);
		return NULL;
	}
	for(p++;p && *p && *p!='}';){
		p=skip_space(p);
		// label偩偗摿庩張棟
		tmpp=skip_space(skip_word(p));
		if(*tmpp==':'){
			int l,c;

			c=*skip_word(p);
			*skip_word(p)=0;
			l=add_str(p);
			if(str_data[l].label!=-1){
				*skip_word(p)=c;
				disp_error_message("dup label ",p);
				exit(1);
			}
			set_label(l,script_pos);
			strdb_insert(scriptlabel_db,p,script_pos);	// 奜晹梡label db搊榐
			*skip_word(p)=c;
			p=tmpp+1;
			continue;
		}

		// 懠偼慡晹堦弿偔偨
		p=parse_line(p);
		p=skip_space(p);
		add_scriptc(C_EOL);

		set_label(LABEL_NEXTLINE,script_pos);
		str_data[LABEL_NEXTLINE].type=C_NOP;
		str_data[LABEL_NEXTLINE].backpatch=-1;
		str_data[LABEL_NEXTLINE].label=-1;
	}

	add_scriptc(C_NOP);

	script_size = script_pos;
	script_buf=realloc(script_buf,script_pos);
	if(script_buf==NULL){
		printf("out of momory : parse_script realloc\n");
		exit(1);
	}

	// 枹夝寛偺儔儀儖傪夝寛
	for(i=LABEL_START;i<str_num;i++){
		if(str_data[i].type==C_NOP){
			int j,next;
			str_data[i].type=C_NAME;
			str_data[i].label=i;
			for(j=str_data[i].backpatch;j>=0 && j!=0x00ffffff;){
				next=(*(int*)(script_buf+j)) & 0x00ffffff;
				script_buf[j]=i;
				script_buf[j+1]=i>>8;
				script_buf[j+2]=i>>16;
				j=next;
			}
		}
	}

#ifdef DEBUG_DISP
	for(i=0;i<script_pos;i++){
		if((i&15)==0) printf("%04x : ",i);
		printf("%02x ",script_buf[i]);
		if((i&15)==15) printf("\n");
	}
	printf("\n");
#endif

	return script_buf;
}

//
// 幚峴宯
//
enum {STOP=1,END,RERUNLINE,GOTO};

/*==========================================
 * rid偐傜sd傊偺夝寛
 *------------------------------------------
 */
struct map_session_data *script_rid2sd(struct script_state *st)
{
	struct map_session_data *sd=map_id2sd(st->rid);
	if(!sd){
		printf("script_rid2sd: fatal error ! player not attached!\n");
	}
	return sd;
}


/*==========================================
 * 曄悢偺撉傒庢傝
 *------------------------------------------
 */
int get_val(struct script_state*st,struct script_data* data)
{
	struct map_session_data *sd=NULL;
	if(data->type==C_NAME){
		char *name=str_buf+str_data[data->u.num&0x00ffffff].str;
		char prefix=*name;
		char postfix=name[strlen(name)-1];
		
		if(prefix!='$')
			sd=script_rid2sd(st);
		
		if(postfix=='$'){
		
			data->type=C_CONSTSTR;
			if( prefix=='@' || prefix=='l' ){
				data->u.str = pc_readregstr(sd,data->u.num);
			}else if(prefix=='$'){
				data->u.str = (char *)numdb_search(mapregstr_db,data->u.num);
			}else{
				printf("script: get_val: illeagal scope string variable.\n");
				data->u.str = "!!ERROR!!";
			}
			if( data->u.str == NULL )
				data->u.str ="";
			
		}else{
		
			data->type=C_INT;
			if(str_data[data->u.num&0x00ffffff].type==C_INT){
				data->u.num = str_data[data->u.num&0x00ffffff].val;
			}else if(str_data[data->u.num&0x00ffffff].type==C_PARAM){
				data->u.num = pc_readparam(sd,str_data[data->u.num&0x00ffffff].val);
			}else if(prefix=='@' || prefix=='l'){
				data->u.num = pc_readreg(sd,data->u.num);
			}else if(prefix=='$'){
				data->u.num = (int)numdb_search(mapreg_db,data->u.num);
			}else if(prefix=='#'){
				if( name[1]=='#')
					data->u.num = pc_readaccountreg2(sd,name);
				else
					data->u.num = pc_readaccountreg(sd,name);
			}else{
				data->u.num = pc_readglobalreg(sd,name);
			}
		}
	}
	return 0;
}
/*==========================================
 * 曄悢偺撉傒庢傝2
 *------------------------------------------
 */
void* get_val2(struct script_state*st,int num)
{
	struct script_data dat;
	dat.type=C_NAME;
	dat.u.num=num;
	get_val(st,&dat);
	if( dat.type==C_INT ) return (void*)dat.u.num;
	else return (void*)dat.u.str;
}

/*==========================================
 * 曄悢愝掕梡
 *------------------------------------------
 */
static int set_reg(struct map_session_data *sd,int num,char *name,void *v)
{
	char prefix=*name;
	char postfix=name[strlen(name)-1];
	
	if( postfix=='$' ){
		char *str=(char*)v;
		if( prefix=='@' || prefix=='l'){
			pc_setregstr(sd,num,str);
		}else if(prefix=='$') {
			mapreg_setregstr(num,str);
		}else{
			printf("script: set_reg: illeagal scope string variable !");
		}
	}else{
		// 悢抣
		int val = (int)v;
		if(str_data[num&0x00ffffff].type==C_PARAM){
			pc_setparam(sd,str_data[num&0x00ffffff].val,val);
		}else if(prefix=='@' || prefix=='l') {
			pc_setreg(sd,num,val);
		}else if(prefix=='$') {
			mapreg_setreg(num,val);
		}else if(prefix=='#') {
			if( name[1]=='#' )
				pc_setaccountreg2(sd,name,val);	
			else
				pc_setaccountreg(sd,name,val);	
		}else{
			pc_setglobalreg(sd,name,val);
		}
	}
	return 0;
}

/*==========================================
 * 暥帤楍傊偺曄姺
 *------------------------------------------
 */
char* conv_str(struct script_state *st,struct script_data *data)
{
	get_val(st,data);
	if(data->type==C_INT){
		char *buf;
		buf=calloc(16, 1);
		if(buf==NULL){
			printf("out of memory : conv_str\n");
			exit(1);
		}
		sprintf(buf,"%d",data->u.num);
		data->type=C_STR;
		data->u.str=buf;
#if 1
	} else if(data->type==C_NAME){
		// 僥儞億儔儕丅杮棃柍偄偼偢
		data->type=C_CONSTSTR;
		data->u.str=str_buf+str_data[data->u.num].str;
#endif
	}
	return data->u.str;
}

/*==========================================
 * 悢抣傊曄姺
 *------------------------------------------
 */
int conv_num(struct script_state *st,struct script_data *data)
{
	char *p;
	get_val(st,data);
	if(data->type==C_STR || data->type==C_CONSTSTR){
		p=data->u.str;
		data->u.num = atoi(p);
		if(data->type==C_STR)
			free(p);
		data->type=C_INT;
	}
	return data->u.num;
}

/*==========================================
 * 僗僞僢僋傊悢抣傪僾僢僔儏
 *------------------------------------------
 */
void push_val(struct script_stack *stack,int type,int val)
{
	if(stack->sp >= stack->sp_max){
		stack->sp_max += 64;
		stack->stack_data = realloc(stack->stack_data,
			sizeof(stack->stack_data[0]) * stack->sp_max);
		if(stack->stack_data==NULL){
			printf("push_val:stack over flow\n");
			exit(1);
		}
		memset(stack->stack_data + (stack->sp_max - 64), 0,
			64 * sizeof(*(stack->stack_data)));
	}
//	if(battle_config.etc_log)
//		printf("push (%d,%d)-> %d\n",type,val,stack->sp);
	stack->stack_data[stack->sp].type=type;
	stack->stack_data[stack->sp].u.num=val;
	stack->sp++;
}

/*==========================================
 * 僗僞僢僋傊暥帤楍傪僾僢僔儏
 *------------------------------------------
 */
void push_str(struct script_stack *stack,int type,unsigned char *str)
{
	if(stack->sp>=stack->sp_max){
		stack->sp_max += 64;
		stack->stack_data = realloc(stack->stack_data,
			sizeof(stack->stack_data[0]) * stack->sp_max);
		if(stack->stack_data==NULL){
			printf("push_val:stack over flow\n");
			exit(1);
		}
		memset(stack->stack_data + (stack->sp_max - 64), '\0',
			64 * sizeof(*(stack->stack_data)));
	}
//	if(battle_config.etc_log)
//		printf("push (%d,%x)-> %d\n",type,str,stack->sp);
	stack->stack_data[stack->sp].type=type;
	stack->stack_data[stack->sp].u.str=str;
	stack->sp++;
}

/*==========================================
 * 僗僞僢僋傊暋惢傪僾僢僔儏
 *------------------------------------------
 */
void push_copy(struct script_stack *stack,int pos)
{
	switch(stack->stack_data[pos].type){
	case C_CONSTSTR:
		push_str(stack,C_CONSTSTR,stack->stack_data[pos].u.str);
		break;
	case C_STR:
		push_str(stack,C_STR,strdup(stack->stack_data[pos].u.str));
		break;
	default:
		push_val(stack,stack->stack_data[pos].type,stack->stack_data[pos].u.num);
		break;
	}
}

/*==========================================
 * 僗僞僢僋偐傜億僢僾
 *------------------------------------------
 */
void pop_stack(struct script_stack* stack,int start,int end)
{
	int i;
	for(i=start;i<end;i++){
		if(stack->stack_data[i].type==C_STR){
			free(stack->stack_data[i].u.str);
		}
	}
	if(stack->sp>end){
		memmove(&stack->stack_data[start],&stack->stack_data[end],sizeof(stack->stack_data[0])*(stack->sp-end));
	}
	stack->sp-=end-start;
}

//
// 杽傔崬傒娭悢
//
/*==========================================
 *
 *------------------------------------------
 */
int buildin_mes(struct script_state *st)
{
	conv_str(st,& (st->stack->stack_data[st->start+2]));
	clif_scriptmes(script_rid2sd(st),st->oid,st->stack->stack_data[st->start+2].u.str);
	return 0;
}

/*==========================================
 *
 *------------------------------------------
 */
int buildin_goto(struct script_state *st)
{
	int pos;

	if( st->stack->stack_data[st->start+2].type!=C_POS ){
		printf("script: goto: not label !\n");
		st->state=END;
		return 0;
	}

	pos=conv_num(st,& (st->stack->stack_data[st->start+2]));
	st->pos=pos;
	st->state=GOTO;
	return 0;
}

/*==========================================
 *
 *------------------------------------------
 */
int buildin_next(struct script_state *st)
{
	st->state=STOP;
	clif_scriptnext(script_rid2sd(st),st->oid);
	return 0;
}

/*==========================================
 *
 *------------------------------------------
 */
int buildin_close(struct script_state *st)
{
	st->state=END;
	clif_scriptclose(script_rid2sd(st),st->oid);
	return 0;
}

/*==========================================
 *
 *------------------------------------------
 */
int buildin_menu(struct script_state *st)
{
	char *buf;
	int len,i;
	struct map_session_data *sd;

	sd=script_rid2sd(st);

	if(sd->state.menu_or_input==0){
		st->state=RERUNLINE;
		sd->state.menu_or_input=1;
		for(i=st->start+2,len=16;i<st->end;i+=2){
			conv_str(st,& (st->stack->stack_data[i]));
			len+=strlen(st->stack->stack_data[i].u.str)+1;
		}
		buf=calloc(len, 1);
		if(buf==NULL){
			printf("out of memory : buildin_menu\n");
			exit(1);
		}
		buf[0]=0;
		for(i=st->start+2,len=0;i<st->end;i+=2){
			strcat(buf,st->stack->stack_data[i].u.str);
			strcat(buf,":");
		}
		clif_scriptmenu(script_rid2sd(st),st->oid,buf);
		free(buf);
	} else if(sd->npc_menu==0xff){	// cansel
		sd->state.menu_or_input=0;
		st->state=END;
	} else {	// goto摦嶌
		// ragemu屳姺偺偨傔
		pc_setreg(sd,add_str("l15"),sd->npc_menu);
		pc_setreg(sd,add_str("@menu"),sd->npc_menu);
		sd->state.menu_or_input=0;
		if(sd->npc_menu>0 && sd->npc_menu<(st->end-st->start)/2){
			int pos;
			if( st->stack->stack_data[st->start+sd->npc_menu*2+1].type!=C_POS ){
				printf("script: menu: not label !\n");
				st->state=END;
				return 0;
			}
			pos=conv_num(st,& (st->stack->stack_data[st->start+sd->npc_menu*2+1]));
			st->pos=pos;
			st->state=GOTO;
		}
	}
	return 0;
}

/*==========================================
 *
 *------------------------------------------
 */
int buildin_rand(struct script_state *st)
{
	int range,min,max;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美另类久久久精品| 色中色一区二区| 精品国产伦一区二区三区观看方式 | 欧美激情一区二区在线| 国产成人免费网站| 国产欧美精品日韩区二区麻豆天美| 国产成人免费网站| 最新国产成人在线观看| 欧美日韩午夜在线视频| 日本不卡一区二区| 精品精品欲导航| 大白屁股一区二区视频| 亚洲毛片av在线| 在线不卡免费av| 国产白丝精品91爽爽久久| 亚洲天堂福利av| 欧美高清精品3d| 高清国产午夜精品久久久久久| 最新欧美精品一区二区三区| 欧美日韩精品一区二区三区四区 | 精品久久久久久无| 成人午夜av电影| 亚洲国产日韩在线一区模特| 欧美一区二区三区在线看| 国产成人在线看| 亚洲国产wwwccc36天堂| 久久婷婷久久一区二区三区| 99久久精品国产网站| 免费精品视频最新在线| 国产精品久久久久久久裸模| 欧美男生操女生| 成人性色生活片| 天堂蜜桃一区二区三区 | 一二三四社区欧美黄| 日韩视频一区在线观看| 91在线精品秘密一区二区| 日本大胆欧美人术艺术动态 | 亚洲国产婷婷综合在线精品| 久久久久88色偷偷免费| 欧美日韩免费一区二区三区视频| 国产福利不卡视频| 亚洲一区二区精品视频| 国产色产综合色产在线视频| 欧美疯狂做受xxxx富婆| 91视频精品在这里| 国产一区激情在线| 日日夜夜一区二区| 伊人夜夜躁av伊人久久| 国产精品三级久久久久三级| 精品国产乱子伦一区| 欧美私模裸体表演在线观看| 99久久夜色精品国产网站| 国产一区二区导航在线播放| 日韩精品国产精品| 亚洲精品国产第一综合99久久| 国产午夜亚洲精品不卡| 精品国产污污免费网站入口 | 色噜噜久久综合| 从欧美一区二区三区| 国产麻豆日韩欧美久久| 久久99精品一区二区三区| 丝袜脚交一区二区| 亚洲国产综合视频在线观看| 亚洲美女淫视频| 国产精品每日更新在线播放网址| 日韩免费观看高清完整版| 欧美日高清视频| 欧美日韩一区二区电影| 91成人免费在线视频| 不卡视频在线看| 成人一区二区三区视频| 国产精品69久久久久水密桃| 精品一区免费av| 免费高清视频精品| 日本免费新一区视频| 日韩在线观看一区二区| 天天综合天天综合色| 亚洲va欧美va人人爽| 亚洲一线二线三线视频| 亚洲欧美日韩国产另类专区 | 欧洲在线/亚洲| 91农村精品一区二区在线| 99视频在线观看一区三区| av不卡免费在线观看| 91尤物视频在线观看| 色婷婷激情综合| 欧美午夜精品理论片a级按摩| 一本高清dvd不卡在线观看| 欧美在线视频不卡| 欧美日韩国产一区二区三区地区| 欧美影院一区二区| 欧美人狂配大交3d怪物一区| 69堂亚洲精品首页| wwwwww.欧美系列| 日本一区二区免费在线观看视频| 国产精品网站导航| 亚洲人成影院在线观看| 亚洲一二三专区| 免费成人深夜小野草| 国产中文一区二区三区| 成人免费观看视频| 色拍拍在线精品视频8848| 欧美日韩高清一区二区不卡| 欧美一区日韩一区| 久久色中文字幕| 亚洲色图19p| 美女国产一区二区三区| 成人黄色电影在线 | 色噜噜狠狠成人网p站| 欧美日韩二区三区| 欧美不卡一区二区三区四区| 欧美激情中文字幕一区二区| 亚洲精选视频在线| 日本在线观看不卡视频| 国产剧情一区二区三区| 91美女在线看| 欧美电视剧免费全集观看| 欧美国产精品专区| 亚洲福利视频三区| 国产自产高清不卡| 欧美制服丝袜第一页| 久久综合九色综合欧美98| 亚洲视频在线一区观看| 蜜桃在线一区二区三区| av不卡在线播放| 欧美大片在线观看一区二区| 亚洲你懂的在线视频| 激情六月婷婷久久| 欧美色欧美亚洲另类二区| 国产清纯在线一区二区www| 99久久er热在这里只有精品15| 欧美性欧美巨大黑白大战| 26uuu久久综合| 午夜精品久久久久久久久久久 | 中文字幕亚洲电影| 免播放器亚洲一区| 欧美自拍偷拍一区| 国产肉丝袜一区二区| 免费成人av资源网| 欧美日韩一区二区三区在线看 | 国产九色sp调教91| 欧美欧美欧美欧美| 一区二区三区.www| zzijzzij亚洲日本少妇熟睡| 91麻豆精品国产91久久久使用方法| 国产精品护士白丝一区av| 精品无人码麻豆乱码1区2区| 欧美日韩国产综合视频在线观看 | 日韩一二三区视频| 一个色在线综合| 色综合久久中文综合久久牛| 国产精品你懂的| 丰满少妇久久久久久久| 久久婷婷国产综合精品青草 | 亚洲国产精品久久久久婷婷884| 国产精品一卡二| 日韩欧美第一区| 奇米888四色在线精品| 欧美日韩国产另类不卡| 一区二区三区中文字幕| 91麻豆国产福利在线观看| 国产欧美综合在线| 国产成人欧美日韩在线电影| 欧美成人r级一区二区三区| 丝袜美腿高跟呻吟高潮一区| 欧美色爱综合网| 亚洲高清视频的网址| 91福利在线观看| 亚洲永久免费av| 欧美视频第二页| 亚洲成人自拍网| 91麻豆精品国产91久久久使用方法 | 日韩—二三区免费观看av| 欧美三级韩国三级日本三斤| 夜夜嗨av一区二区三区中文字幕| 91美女在线视频| 亚洲一区二区在线视频| 欧美性猛交xxxxxxxx| 性做久久久久久久久| 正在播放一区二区| 免费欧美日韩国产三级电影| 精品国产一区二区在线观看| 国内精品免费**视频| 亚洲国产高清在线观看视频| 成人av影视在线观看| 亚洲日本免费电影| 欧美日韩一区三区| 麻豆成人在线观看| 国产欧美日韩中文久久| 91在线视频在线| 日韩电影在线免费观看| 337p日本欧洲亚洲大胆精品 | 99久免费精品视频在线观看| 日韩美女视频一区| 欧美色图一区二区三区| 久久精品免费看| 欧美国产视频在线| 94-欧美-setu| 免费成人深夜小野草| 中文字幕在线不卡一区|