📄 npc.c
字号:
*/
int npc_scriptcont(struct map_session_data *sd,int id)
{
struct npc_data *nd;
if (id!=sd->npc_id)
return 1;
if (npc_checknear(sd,id))
return 1;
nd=(struct npc_data *)map_id2bl(id);
sd->npc_pos=run_script(nd->u.scr.script,sd->npc_pos,sd->bl.id,id);
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int npc_buysellsel(struct map_session_data *sd,int id,int type)
{
struct npc_data *nd;
if (npc_checknear(sd,id))
return 1;
nd=(struct npc_data *)map_id2bl(id);
if (nd->bl.subtype!=SHOP) {
if (battle_config.error_log)
printf("no such shop npc : %d\n",id);
sd->npc_id=0;
return 1;
}
if (nd->flag&1) // 柍岠壔偝傟偰偄傞
return 1;
sd->npc_shopid=id;
if (type==0) {
clif_buylist(sd,nd);
} else {
clif_selllist(sd);
}
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int npc_buylist(struct map_session_data *sd,int n,unsigned short *item_list)
{
struct npc_data *nd;
double z;
int i,j,w,skill,itemamount=0,new=0;
if (npc_checknear(sd,sd->npc_shopid))
return 3;
nd=(struct npc_data*)map_id2bl(sd->npc_shopid);
if (nd->bl.subtype!=SHOP)
return 3;
for(i=0,w=0,z=0;i<n;i++) {
for(j=0;nd->u.shop_item[j].nameid;j++) {
if (nd->u.shop_item[j].nameid==item_list[i*2+1])
break;
}
if (nd->u.shop_item[j].nameid==0)
return 3;
if (itemdb_value_notdc(nd->u.shop_item[j].nameid))
z+=(double)nd->u.shop_item[j].value * item_list[i*2];
else
z+=(double)pc_modifybuyvalue(sd,nd->u.shop_item[j].value) * item_list[i*2];
itemamount+=item_list[i*2];
switch(pc_checkadditem(sd,item_list[i*2+1],item_list[i*2])) {
case ADDITEM_EXIST:
break;
case ADDITEM_NEW:
new++;
break;
case ADDITEM_OVERAMOUNT:
return 2;
}
w+=itemdb_weight(item_list[i*2+1]) * item_list[i*2];
}
if (z > (double)sd->status.zeny)
return 1; // zeny晄懌
if (w+sd->weight > sd->max_weight)
return 2; // 廳検挻夁
if (pc_inventoryblank(sd)<new)
return 3; // 庬椶悢挻夁
pc_payzeny(sd,(int)z);
for(i=0;i<n;i++) {
struct item item_tmp;
memset(&item_tmp,0,sizeof(item_tmp));
item_tmp.nameid = item_list[i*2+1];
item_tmp.identify = 1; // npc斕攧傾僀僥儉偼娪掕嵪傒
pc_additem(sd,&item_tmp,item_list[i*2]);
}
//彜恖宱尡抣
/* if ((sd->status.class == 5) || (sd->status.class == 10) || (sd->status.class == 18)) {
z = z * pc_checkskill(sd,MC_DISCOUNT) / ((1 + 300 / itemamount) * 4000) * battle_config.shop_exp;
pc_gainexp(sd,0,z);
}*/
if (battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_DISCOUNT)) > 0) {
if (sd->status.skill[MC_DISCOUNT].flag != 0)
skill = sd->status.skill[MC_DISCOUNT].flag - 2;
if (skill > 0) {
z = (log(z * (double)skill) * (double)battle_config.shop_exp/100.);
if (z < 1)
z = 1;
pc_gainexp(sd,0,(int)z);
}
}
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int npc_selllist(struct map_session_data *sd,int n,unsigned short *item_list)
{
double z;
int i,skill,itemamount=0;
if (npc_checknear(sd,sd->npc_shopid))
return 1;
for(i=0,z=0;i<n;i++) {
int nameid;
if (item_list[i*2]-2 <0 || item_list[i*2]-2 >=MAX_INVENTORY)
return 1;
nameid=sd->status.inventory[item_list[i*2]-2].nameid;
if (nameid == 0 ||
sd->status.inventory[item_list[i*2]-2].amount < item_list[i*2+1])
return 1;
if (itemdb_value_notoc(nameid))
z+=(double)itemdb_value_sell(nameid) * item_list[i*2+1];
else
z+=(double)pc_modifysellvalue(sd,itemdb_value_sell(nameid)) * item_list[i*2+1];
itemamount+=item_list[i*2+1];
}
if (z > MAX_ZENY) z = MAX_ZENY;
pc_getzeny(sd,(int)z);
for(i=0;i<n;i++) {
pc_delitem(sd,item_list[i*2]-2,item_list[i*2+1],0);
}
//彜恖宱尡抣
/* if ((sd->status.class == 5) || (sd->status.class == 10) || (sd->status.class == 18)) {
z = z * pc_checkskill(sd,MC_OVERCHARGE) / ((1 + 500 / itemamount) * 4000) * battle_config.shop_exp ;
pc_gainexp(sd,0,z);
}*/
if (battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_OVERCHARGE)) > 0) {
if (sd->status.skill[MC_OVERCHARGE].flag != 0)
skill = sd->status.skill[MC_OVERCHARGE].flag - 2;
if (skill > 0) {
z = (log(z * (double)skill) * (double)battle_config.shop_exp/100.);
if (z < 1)
z = 1;
pc_gainexp(sd,0,(int)z);
}
}
return 0;
}
//
// 弶婜壔娭學
//
/*==========================================
* 撉傒崬傓npc僼傽僀儖偺僋儕傾
*------------------------------------------
*/
void npc_clearsrcfile()
{
struct npc_src_list *p=npc_src_first;
while( p ) {
struct npc_src_list *p2=p;
p=p->next;
free(p2);
}
npc_src_first=NULL;
npc_src_last=NULL;
}
/*==========================================
* 撉傒崬傓npc僼傽僀儖偺捛壛
*------------------------------------------
*/
void npc_addsrcfile(char *name)
{
struct npc_src_list *new;
size_t len;
if ( strcmpi(name,"clear")==0 ) {
npc_clearsrcfile();
return;
}
len = sizeof(*new) + strlen(name);
new=calloc(len, 1);
if (new==NULL) {
printf("out of memory : npc_addsrcfile\n");
exit(1);
}
new->next = NULL;
strcpy(new->name,name);
if (npc_src_first==NULL)
npc_src_first = new;
if (npc_src_last)
npc_src_last->next = new;
npc_src_last=new;
}
/*==========================================
* 撉傒崬傓npc僼傽僀儖偺嶍彍
*------------------------------------------
*/
void npc_delsrcfile(char *name)
{
struct npc_src_list *p=npc_src_first,*pp=NULL,**lp=&npc_src_first;
if ( strcmpi(name,"all")==0 ) {
npc_clearsrcfile();
return;
}
for( ; p; lp=&p->next,pp=p,p=p->next ) {
if ( strcmp(p->name,name)==0 ) {
*lp=p->next;
if ( npc_src_last==p )
npc_src_last=pp;
free(p);
break;
}
}
}
/*==========================================
* warp峴夝愅
*------------------------------------------
*/
static int npc_parse_warp(char *w1,char *w2,char *w3,char *w4)
{
int x,y,xs,ys,to_x,to_y,m;
int i,j;
char mapname[24],to_mapname[24];
struct npc_data *nd;
// 堷悢偺屄悢僠僃僢僋
if (sscanf(w1,"%[^,],%d,%d",mapname,&x,&y) != 3 ||
sscanf(w4,"%d,%d,%[^,],%d,%d",&xs,&ys,to_mapname,&to_x,&to_y) != 5) {
printf("bad warp line : %s\n",w3);
return 1;
}
m=map_mapname2mapid(mapname);
nd=calloc(sizeof(struct npc_data), 1);
if (nd==NULL) {
printf("out of memory : npc_parse_warp\n");
exit(1);
}
nd->bl.id=npc_id++;
nd->n=map_addnpc(m,nd);
nd->bl.prev = nd->bl.next = NULL;
nd->bl.m=m;
nd->bl.x=x;
nd->bl.y=y;
nd->dir=0;
nd->flag=0;
memcpy(nd->name,w3,24);
memcpy(nd->exname,w3,24);
nd->chat_id=0;
if (!battle_config.warp_point_debug)
nd->class=WARP_CLASS;
else
nd->class=WARP_DEBUG_CLASS;
nd->speed=200;
memcpy(nd->u.warp.name,to_mapname,16);
xs+=2; ys+=2;
nd->u.warp.x=to_x;
nd->u.warp.y=to_y;
nd->u.warp.xs=xs;
nd->u.warp.ys=ys;
for(i=0;i<ys;i++) {
for(j=0;j<xs;j++) {
int t;
t=map_getcell(m,x-xs/2+j,y-ys/2+i);
if (t==1 || t==5)
continue;
map_setcell(m,x-xs/2+j,y-ys/2+i,t|0x80);
}
}
// printf("warp npc %s %d read done\n",mapname,nd->bl.id);
npc_warp++;
nd->bl.type=BL_NPC;
nd->bl.subtype=WARP;
map_addblock(&nd->bl);
clif_spawnnpc(nd);
strdb_insert(npcname_db,nd->name,nd);
return 0;
}
/*==========================================
* shop峴夝愅
*------------------------------------------
*/
static int npc_parse_shop(char *w1,char *w2,char *w3,char *w4)
{
char *p;
int x, y, dir, m;
int max = 100, pos = 0;
char mapname[24];
struct npc_data *nd;
// 堷悢偺屄悢僠僃僢僋
if (sscanf(w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 ||
strchr(w4, ',') == NULL) {
printf("bad shop line : %s\n", w3);
return 1;
}
m = map_mapname2mapid(mapname);
nd = calloc(sizeof(struct npc_data) +
sizeof(nd->u.shop_item[0]) * (max + 1), 1);
if (nd == NULL) {
printf("out of memory : npc_parse_shop\n");
exit(1);
}
p = strchr(w4, ',');
while (p && pos < max) {
int nameid,value;
p++;
if (sscanf(p, "%d:%d", &nameid, &value) != 2)
break;
nd->u.shop_item[pos].nameid = nameid;
if (value < 0) {
struct item_data *id = itemdb_search(nameid);
value = id->value_buy;
}
nd->u.shop_item[pos].value = value;
pos++;
p=strchr(p,',');
}
if (pos == 0) {
free(nd);
return 1;
}
nd->u.shop_item[pos++].nameid = 0;
nd->bl.prev = nd->bl.next = NULL;
nd->bl.m = m;
nd->bl.x = x;
nd->bl.y = y;
nd->bl.id = npc_id++;
nd->dir = dir;
nd->flag = 0;
memcpy(nd->name, w3, 24);
nd->class = atoi(w4);
nd->speed = 200;
nd->chat_id = 0;
nd = realloc(nd,
sizeof(struct npc_data) + sizeof(nd->u.shop_item[0]) * pos);
if (nd == NULL) {
printf("out of memory : npc_parse_shop realloc\n");
exit(1);
}
//printf("shop npc %s %d read done\n",mapname,nd->bl.id);
npc_shop++;
nd->bl.type=BL_NPC;
nd->bl.subtype=SHOP;
nd->n=map_addnpc(m,nd);
map_addblock(&nd->bl);
clif_spawnnpc(nd);
strdb_insert(npcname_db,nd->name,nd);
return 0;
}
/*==========================================
* NPC偺儔儀儖僨乕僞僐儞僶乕僩
*------------------------------------------
*/
int npc_convertlabel_db(void *key,void *data,va_list ap)
{
char *lname=(char *)key;
int pos=(int)data;
struct npc_data *nd=va_arg(ap,struct npc_data *);
struct npc_label_list *lst=nd->u.scr.label_list;
int num=nd->u.scr.label_list_num;
char *p=strchr(lname,':');
if(!lst){
lst=malloc(sizeof(struct npc_label_list));
num=0;
}else
lst=realloc(lst,sizeof(struct npc_label_list)*(num+1));
*p='\0';
strcpy(lst[num].name,lname);
*p=':';
lst[num].pos=pos;
nd->u.scr.label_list=lst;
nd->u.scr.label_list_num=num+1;
return 0;
}
/*==========================================
* script峴夝愅
*------------------------------------------
*/
static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines)
{
int x,y,dir,m,xs,ys,class;
char mapname[24];
char *srcbuf=NULL,*script;
int srcsize=65536;
int startline=0;
char line[1024];
int i;
struct npc_data *nd;
int evflag=0;
struct dbt *label_db;
char *p;
struct npc_label_list *label_dup=NULL;
int label_dupnum=0;
if(strcmp(w1,"-")==0){
x=0;y=0;m=-1;
}else{
// 堷悢偺屄悢僠僃僢僋
if (sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 ||
( strcmp(w2,"script")==0 && strchr(w4,',')==NULL) ) {
printf("bad script line : %s\n",w3);
return 1;
}
m = map_mapname2mapid(mapname);
}
if(strcmp(w2,"script")==0){
// 僗僋儕僾僩偺夝愅
srcbuf=calloc(srcsize, 1);
if (srcbuf==NULL) {
printf("out of memory : npc_parse_script srcbuf\n");
exit(1);
}
if (strchr(first_line,'{')) {
strcpy(srcbuf,strchr(first_line,'{'));
startline=*lines;
} else
srcbuf[0]=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -