📄 script.c
字号:
if(st->end>st->start+3){
min=conv_num(st,& (st->stack->stack_data[st->start+2]));
max=conv_num(st,& (st->stack->stack_data[st->start+3]));
if(max<min){
int tmp;
tmp=min;
min=max;
max=tmp;
}
range=max-min+1;
push_val(st->stack,C_INT,rand()%range+min);
} else {
range=conv_num(st,& (st->stack->stack_data[st->start+2]));
push_val(st->stack,C_INT,rand()%range);
}
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_warp(struct script_state *st)
{
int x,y;
char *str;
struct map_session_data *sd=script_rid2sd(st);
str=conv_str(st,& (st->stack->stack_data[st->start+2]));
x=conv_num(st,& (st->stack->stack_data[st->start+3]));
y=conv_num(st,& (st->stack->stack_data[st->start+4]));
if(strcmp(str,"Random")==0)
pc_randomwarp(sd,3);
else if(strcmp(str,"SavePoint")==0){
if(map[sd->bl.m].flag.noreturn) // 挶嬛巭
return 0;
pc_setpos(sd,sd->status.save_point.map,
sd->status.save_point.x,sd->status.save_point.y,3);
}else
pc_setpos(sd,str,x,y,0);
return 0;
}
/*==========================================
* 僄儕傾巜掕儚乕僾
*------------------------------------------
*/
int buildin_areawarp_sub(struct block_list *bl,va_list ap)
{
int x,y;
char *map;
map=va_arg(ap, char *);
x=va_arg(ap,int);
y=va_arg(ap,int);
if(strcmp(map,"Random")==0)
pc_randomwarp((struct map_session_data *)bl,3);
else
pc_setpos((struct map_session_data *)bl,map,x,y,0);
return 0;
}
int buildin_areawarp(struct script_state *st)
{
int x,y,m;
char *str;
char *mapname;
int x0,y0,x1,y1;
mapname=conv_str(st,& (st->stack->stack_data[st->start+2]));
x0=conv_num(st,& (st->stack->stack_data[st->start+3]));
y0=conv_num(st,& (st->stack->stack_data[st->start+4]));
x1=conv_num(st,& (st->stack->stack_data[st->start+5]));
y1=conv_num(st,& (st->stack->stack_data[st->start+6]));
str=conv_str(st,& (st->stack->stack_data[st->start+7]));
x=conv_num(st,& (st->stack->stack_data[st->start+8]));
y=conv_num(st,& (st->stack->stack_data[st->start+9]));
if( (m=map_mapname2mapid(mapname))< 0)
return 0;
map_foreachinarea(buildin_areawarp_sub,
m,x0,y0,x1,y1,BL_PC, str,x,y );
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_heal(struct script_state *st)
{
int hp,sp;
hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
pc_heal(script_rid2sd(st),hp,sp);
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_itemheal(struct script_state *st)
{
int hp,sp;
hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
pc_itemheal(script_rid2sd(st),hp,sp);
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_percentheal(struct script_state *st)
{
int hp,sp;
hp=conv_num(st,& (st->stack->stack_data[st->start+2]));
sp=conv_num(st,& (st->stack->stack_data[st->start+3]));
pc_percentheal(script_rid2sd(st),hp,sp);
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_jobchange(struct script_state *st)
{
int job;
job=conv_num(st,& (st->stack->stack_data[st->start+2]));
pc_jobchange(script_rid2sd(st),job);
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_input(struct script_state *st)
{
struct map_session_data *sd=NULL;
int num=(st->end>st->start+2)?st->stack->stack_data[st->start+2].u.num:0;
char *name=(st->end>st->start+2)?str_buf+str_data[num&0x00ffffff].str:"";
// char prefix=*name;
char postfix=name[strlen(name)-1];
sd=script_rid2sd(st);
if(sd->state.menu_or_input){
sd->state.menu_or_input=0;
if( postfix=='$' ){
// 暥帤楍
if(st->end>st->start+2){ // 堷悢1屄
set_reg(sd,num,name,(void*)sd->npc_str);
}else{
printf("buildin_input: string discarded !!\n");
}
}else{
// 悢抣
if(st->end>st->start+2){ // 堷悢1屄
set_reg(sd,num,name,(void*)sd->npc_amount);
} else {
// ragemu屳姺偺偨傔
pc_setreg(sd,add_str("l14"),sd->npc_amount);
}
}
} else {
st->state=RERUNLINE;
if(postfix=='$')clif_scriptinputstr(sd,st->oid);
else clif_scriptinput(sd,st->oid);
sd->state.menu_or_input=1;
}
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_if(struct script_state *st)
{
int sel,i;
sel=conv_num(st,& (st->stack->stack_data[st->start+2]));
if(!sel)
return 0;
// 娭悢柤傪僐僺乕
push_copy(st->stack,st->start+3);
// 娫偵堷悢儅乕僇傪擖傟偰
push_val(st->stack,C_ARG,0);
// 巆傝偺堷悢傪僐僺乕
for(i=st->start+4;i<st->end;i++){
push_copy(st->stack,i);
}
run_func(st);
return 0;
}
/*==========================================
* 曄悢愝掕
*------------------------------------------
*/
int buildin_set(struct script_state *st)
{
struct map_session_data *sd=NULL;
int num=st->stack->stack_data[st->start+2].u.num;
char *name=str_buf+str_data[num&0x00ffffff].str;
char prefix=*name;
char postfix=name[strlen(name)-1];
if( st->stack->stack_data[st->start+2].type!=C_NAME ){
printf("script: buildin_set: not name\n");
return 0;
}
if( prefix!='$' )
sd=script_rid2sd(st);
if( postfix=='$' ){
// 暥帤楍
char *str = conv_str(st,& (st->stack->stack_data[st->start+3]));
set_reg(sd,num,name,(void*)str);
}else{
// 悢抣
int val = conv_num(st,& (st->stack->stack_data[st->start+3]));
set_reg(sd,num,name,(void*)val);
}
return 0;
}
/*==========================================
* 攝楍曄悢愝掕
*------------------------------------------
*/
int buildin_setarray(struct script_state *st)
{
struct map_session_data *sd=NULL;
int num=st->stack->stack_data[st->start+2].u.num;
char *name=str_buf+str_data[num&0x00ffffff].str;
char prefix=*name;
char postfix=name[strlen(name)-1];
int i,j;
if( prefix!='$' && prefix!='@' ){
printf("buildin_setarray: illeagal scope !\n");
return 0;
}
if( prefix!='$' )
sd=script_rid2sd(st);
for(j=0,i=st->start+3; i<st->end && j<128;i++,j++){
void *v;
if( postfix=='$' )
v=(void*)conv_str(st,& (st->stack->stack_data[i]));
else
v=(void*)conv_num(st,& (st->stack->stack_data[i]));
set_reg( sd, num+(j<<24), name, v);
}
return 0;
}
/*==========================================
* 攝楍曄悢僋儕傾
*------------------------------------------
*/
int buildin_cleararray(struct script_state *st)
{
struct map_session_data *sd=NULL;
int num=st->stack->stack_data[st->start+2].u.num;
char *name=str_buf+str_data[num&0x00ffffff].str;
char prefix=*name;
char postfix=name[strlen(name)-1];
int sz=conv_num(st,& (st->stack->stack_data[st->start+4]));
int i;
void *v;
if( prefix!='$' && prefix!='@' ){
printf("buildin_cleararray: illeagal scope !\n");
return 0;
}
if( prefix!='$' )
sd=script_rid2sd(st);
if( postfix=='$' )
v=(void*)conv_str(st,& (st->stack->stack_data[st->start+3]));
else
v=(void*)conv_num(st,& (st->stack->stack_data[st->start+3]));
for(i=0;i<sz;i++)
set_reg(sd,num+(i<<24),name,v);
return 0;
}
/*==========================================
* 攝楍曄悢僐僺乕
*------------------------------------------
*/
int buildin_copyarray(struct script_state *st)
{
struct map_session_data *sd=NULL;
int num=st->stack->stack_data[st->start+2].u.num;
char *name=str_buf+str_data[num&0x00ffffff].str;
char prefix=*name;
char postfix=name[strlen(name)-1];
int num2=st->stack->stack_data[st->start+3].u.num;
char *name2=str_buf+str_data[num2&0x00ffffff].str;
char prefix2=*name2;
char postfix2=name2[strlen(name2)-1];
int sz=conv_num(st,& (st->stack->stack_data[st->start+4]));
int i;
if( prefix!='$' && prefix!='@' && prefix2!='$' && prefix2!='@' ){
printf("buildin_copyarray: illeagal scope !\n");
return 0;
}
if( (postfix=='$' || postfix2=='$') && postfix!=postfix2 ){
printf("buildin_copyarray: type mismatch !\n");
return 0;
}
if( prefix!='$' || prefix2!='$' )
sd=script_rid2sd(st);
for(i=0;i<sz;i++)
set_reg(sd,num+(i<<24),name, get_val2(st,num2+(i<<24)) );
return 0;
}
/*==========================================
* 攝楍曄悢偺僒僀僘強摼
*------------------------------------------
*/
static int getarraysize(struct script_state *st,int num,int postfix)
{
int i=(num>>24),c=i;
for(;i<128;i++){
void *v=get_val2(st,num+(i<<24));
if(postfix=='$' && *((char*)v) ) c=i;
if(postfix!='$' && (int)v )c=i;
}
return c+1;
}
int buildin_getarraysize(struct script_state *st)
{
int num=st->stack->stack_data[st->start+2].u.num;
char *name=str_buf+str_data[num&0x00ffffff].str;
char prefix=*name;
char postfix=name[strlen(name)-1];
if( prefix!='$' && prefix!='@' ){
printf("buildin_copyarray: illeagal scope !\n");
return 0;
}
push_val(st->stack,C_INT,getarraysize(st,num,postfix) );
return 0;
}
/*==========================================
* 攝楍曄悢偐傜梫慺嶍彍
*------------------------------------------
*/
int buildin_deletearray(struct script_state *st)
{
struct map_session_data *sd=NULL;
int num=st->stack->stack_data[st->start+2].u.num;
char *name=str_buf+str_data[num&0x00ffffff].str;
char prefix=*name;
char postfix=name[strlen(name)-1];
int count=1;
if( (st->end > st->start+3) )
count=conv_num(st,& (st->stack->stack_data[st->start+3]));
int i,sz=getarraysize(st,num,postfix)-(num>>24)-count+1;
if( prefix!='$' && prefix!='@' ){
printf("buildin_deletearray: illeagal scope !\n");
return 0;
}
if( prefix!='$' )
sd=script_rid2sd(st);
for(i=0;i<sz;i++){
set_reg(sd,num+(i<<24),name, get_val2(st,num+((i+count)<<24) ) );
}
for(;i<(128-(num>>24));i++){
if( postfix!='$' ) set_reg(sd,num+(i<<24),name, 0);
if( postfix=='$' ) set_reg(sd,num+(i<<24),name, "");
}
return 0;
}
/*==========================================
* 巜掕梫慺傪昞偡抣(僉乕)傪強摼偡傞
*------------------------------------------
*/
int buildin_getelementofarray(struct script_state *st)
{
if( st->stack->stack_data[st->start+2].type==C_NAME ){
int i=conv_num(st,& (st->stack->stack_data[st->start+3]));
if(i>127 || i<0){
printf("script: getelementofarray (operator[]): param2 illeagal number %d\n",i);
push_val(st->stack,C_INT,0);
}else{
push_val(st->stack,C_NAME,
(i<<24) | st->stack->stack_data[st->start+2].u.num );
}
}else{
printf("script: getelementofarray (operator[]): param1 not name !\n");
push_val(st->stack,C_INT,0);
}
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_setlook(struct script_state *st)
{
int type,val;
type=conv_num(st,& (st->stack->stack_data[st->start+2]));
val=conv_num(st,& (st->stack->stack_data[st->start+3]));
pc_changelook(script_rid2sd(st),type,val);
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_cutin(struct script_state *st)
{
int type;
conv_str(st,& (st->stack->stack_data[st->start+2]));
type=conv_num(st,& (st->stack->stack_data[st->start+3]));
clif_cutin(script_rid2sd(st),st->stack->stack_data[st->start+2].u.str,type);
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_viewpoint(struct script_state *st)
{
int type,x,y,id,color;
type=conv_num(st,& (st->stack->stack_data[st->start+2]));
x=conv_num(st,& (st->stack->stack_data[st->start+3]));
y=conv_num(st,& (st->stack->stack_data[st->start+4]));
id=conv_num(st,& (st->stack->stack_data[st->start+5]));
color=conv_num(st,& (st->stack->stack_data[st->start+6]));
clif_viewpoint(script_rid2sd(st),st->oid,type,x,y,id,color);
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int buildin_countitem(struct script_state *st)
{
int nameid,count,i;
struct map_session_data *sd;
struct script_data *data;
sd = script_rid2sd(st);
data=&(st->stack->stack_data[st->start+2]);
get_val(st,data);
if( data->type==C_STR || data->type==C_CONSTSTR ){
const char *name=conv_str(st,data);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -