📄 script.c
字号:
// $Id: script.c,v 1.18 2003/07/04 01:11:38 lemit Exp $
//#define DEBUG_FUNCIN
//#define DEBUG_DISP
//#define DEBUG_RUN
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "socket.h"
#include "timer.h"
#include "map.h"
#include "clif.h"
#include "chrif.h"
#include "itemdb.h"
#include "pc.h"
#include "script.h"
#include "storage.h"
#include "mob.h"
#include "npc.h"
#include "pet.h"
#include "intif.h"
#include "db.h"
#include "skill.h"
#include "chat.h"
#include "battle.h"
#include "party.h"
#include "guild.h"
#include "lock.h"
#ifdef MEMWATCH
#include "memwatch.h"
#endif
#define SCRIPT_BLOCK_SIZE 256
enum { LABEL_NEXTLINE=1,LABEL_START };
static unsigned char * script_buf;
static int script_pos,script_size;
char *str_buf;
int str_pos,str_size;
static struct {
int type;
int str;
int backpatch;
int label;
int (*func)();
int val;
int next;
} *str_data;
int str_num=LABEL_START,str_data_size;
int str_hash[16];
static struct dbt *mapreg_db=NULL;
static struct dbt *mapregstr_db=NULL;
static int mapreg_dirty=-1;
char mapreg_txt[256]="save/mapreg.txt";
#define MAPREG_AUTOSAVE_INTERVAL (10*1000)
static struct dbt *scriptlabel_db=NULL;
struct dbt* script_get_label_db(){ return scriptlabel_db; }
static int scriptlabel_final(void *k,void *d,va_list ap){ return 0; }
static char pos[11][100] = {"摢","懱","嵍庤","塃庤","儘乕僽","孋","傾僋僙僒儕乕1","傾僋僙僒儕乕2","摢2","摢3","憰拝偟偰偄側偄"};
static struct Script_Config {
int warn_func_no_comma;
int warn_cmd_no_comma;
int warn_func_mismatch_paramnum;
int warn_cmd_mismatch_paramnum;
int check_cmdcount;
int check_gotocount;
} script_config;
static int parse_cmd_if=0;
static int parse_cmd;
/*==========================================
* 儘乕僇儖僾儘僩僞僀僾愰尵 (昁梫側暔偺傒)
*------------------------------------------
*/
unsigned char* parse_subexpr(unsigned char *,int);
int buildin_mes(struct script_state *st);
int buildin_goto(struct script_state *st);
int buildin_next(struct script_state *st);
int buildin_close(struct script_state *st);
int buildin_menu(struct script_state *st);
int buildin_rand(struct script_state *st);
int buildin_warp(struct script_state *st);
int buildin_areawarp(struct script_state *st);
int buildin_heal(struct script_state *st);
int buildin_itemheal(struct script_state *st);
int buildin_percentheal(struct script_state *st);
int buildin_jobchange(struct script_state *st);
int buildin_input(struct script_state *st);
int buildin_setlook(struct script_state *st);
int buildin_set(struct script_state *st);
int buildin_setarray(struct script_state *st);
int buildin_cleararray(struct script_state *st);
int buildin_copyarray(struct script_state *st);
int buildin_getarraysize(struct script_state *st);
int buildin_deletearray(struct script_state *st);
int buildin_getelementofarray(struct script_state *st);
int buildin_if(struct script_state *st);
int buildin_getitem(struct script_state *st);
int buildin_getitem2(struct script_state *st);
int buildin_delitem(struct script_state *st);
int buildin_viewpoint(struct script_state *st);
int buildin_countitem(struct script_state *st);
int buildin_checkweight(struct script_state *st);
int buildin_readparam(struct script_state *st);
int buildin_getcharid(struct script_state *st);
int buildin_getpartyname(struct script_state *st);
int buildin_getguildname(struct script_state *st);
int buildin_getguildmaster(struct script_state *st);
int buildin_getguildmasterid(struct script_state *st);
int buildin_strcharinfo(struct script_state *st);
int buildin_getequipname(struct script_state *st);
int buildin_getequipisequiped(struct script_state *st);
int buildin_getequipisenableref(struct script_state *st);
int buildin_getequipisidentify(struct script_state *st);
int buildin_getequiprefinerycnt(struct script_state *st);
int buildin_getequipweaponlv(struct script_state *st);
int buildin_getequippercentrefinery(struct script_state *st);
int buildin_successrefitem(struct script_state *st);
int buildin_failedrefitem(struct script_state *st);
int buildin_cutin(struct script_state *st);
int buildin_statusup(struct script_state *st);
int buildin_statusup2(struct script_state *st);
int buildin_bonus(struct script_state *st);
int buildin_bonus2(struct script_state *st);
int buildin_bonus3(struct script_state *st);
int buildin_skill(struct script_state *st);
int buildin_getskilllv(struct script_state *st);
int buildin_basicskillcheck(struct script_state *st);
int buildin_getgmlevel(struct script_state *st);
int buildin_end(struct script_state *st);
int buildin_checkoption(struct script_state *st);
int buildin_setoption(struct script_state *st);
int buildin_setcart(struct script_state *st);
int buildin_setfalcon(struct script_state *st);
int buildin_setriding(struct script_state *st);
int buildin_savepoint(struct script_state *st);
int buildin_openstorage(struct script_state *st);
int buildin_guildopenstorage(struct script_state *st);
int buildin_itemskill(struct script_state *st);
int buildin_produce(struct script_state *st);
int buildin_monster(struct script_state *st);
int buildin_areamonster(struct script_state *st);
int buildin_killmonster(struct script_state *st);
int buildin_killmonsterall(struct script_state *st);
int buildin_doevent(struct script_state *st);
int buildin_donpcevent(struct script_state *st);
int buildin_addtimer(struct script_state *st);
int buildin_deltimer(struct script_state *st);
int buildin_addtimercount(struct script_state *st);
int buildin_initnpctimer(struct script_state *st);
int buildin_stopnpctimer(struct script_state *st);
int buildin_startnpctimer(struct script_state *st);
int buildin_setnpctimer(struct script_state *st);
int buildin_getnpctimer(struct script_state *st);
int buildin_announce(struct script_state *st);
int buildin_mapannounce(struct script_state *st);
int buildin_areaannounce(struct script_state *st);
int buildin_getusers(struct script_state *st);
int buildin_getmapusers(struct script_state *st);
int buildin_getareausers(struct script_state *st);
int buildin_getareadropitem(struct script_state *st);
int buildin_enablenpc(struct script_state *st);
int buildin_disablenpc(struct script_state *st);
int buildin_sc_start(struct script_state *st);
int buildin_sc_end(struct script_state *st);
int buildin_debugmes(struct script_state *st);
int buildin_catchpet(struct script_state *st);
int buildin_birthpet(struct script_state *st);
int buildin_resetstatus(struct script_state *st);
int buildin_resetskill(struct script_state *st);
int buildin_changebase(struct script_state *st);
int buildin_changesex(struct script_state *st);
int buildin_waitingroom(struct script_state *st);
int buildin_delwaitingroom(struct script_state *st);
int buildin_enablewaitingroomevent(struct script_state *st);
int buildin_disablewaitingroomevent(struct script_state *st);
int buildin_getwaitingroomstate(struct script_state *st);
int buildin_warpwaitingpc(struct script_state *st);
int buildin_attachrid(struct script_state *st);
int buildin_detachrid(struct script_state *st);
int buildin_isloggedin(struct script_state *st);
int buildin_setmapflagnosave(struct script_state *st);
int buildin_setmapflag(struct script_state *st);
int buildin_removemapflag(struct script_state *st);
int buildin_pvpon(struct script_state *st);
int buildin_pvpoff(struct script_state *st);
int buildin_gvgon(struct script_state *st);
int buildin_gvgoff(struct script_state *st);
int buildin_emotion(struct script_state *st);
int buildin_maprespawnguildid(struct script_state *st);
int buildin_agitstart(struct script_state *st); // <Agit>
int buildin_agitend(struct script_state *st);
int buildin_flagemblem(struct script_state *st); // Flag Emblem
int buildin_getcastlename(struct script_state *st);
int buildin_getcastledata(struct script_state *st);
int buildin_setcastledata(struct script_state *st);
int buildin_requestguildinfo(struct script_state *st);
int buildin_getequipcardcnt(struct script_state *st);
int buildin_successremovecards(struct script_state *st);
int buildin_failedremovecards(struct script_state *st);
void push_val(struct script_stack *stack,int type,int val);
int run_func(struct script_state *st);
int mapreg_setreg(int num,int val);
int mapreg_setregstr(int num,const char *str);
struct {
int (*func)();
char *name;
char *arg;
} buildin_func[]={
{buildin_mes,"mes","s"},
{buildin_next,"next",""},
{buildin_close,"close",""},
{buildin_menu,"menu","*"},
{buildin_goto,"goto","l"},
{buildin_jobchange,"jobchange","i"},
{buildin_input,"input","*"},
{buildin_warp,"warp","sii"},
{buildin_areawarp,"areawarp","siiiisii"},
{buildin_setlook,"setlook","ii"},
{buildin_set,"set","ii"},
{buildin_setarray,"setarray","ii*"},
{buildin_cleararray,"cleararray","iii"},
{buildin_copyarray,"copyarray","iii"},
{buildin_getarraysize,"getarraysize","i"},
{buildin_deletearray,"deletearray","ii"},
{buildin_getelementofarray,"getelementofarray","ii"},
{buildin_if,"if","i*"},
{buildin_getitem,"getitem","ii"},
{buildin_getitem2,"getitem2","iiiiiiiii"},
{buildin_delitem,"delitem","ii"},
{buildin_cutin,"cutin","si"},
{buildin_viewpoint,"viewpoint","iiiii"},
{buildin_heal,"heal","ii"},
{buildin_itemheal,"itemheal","ii"},
{buildin_percentheal,"percentheal","ii"},
{buildin_rand,"rand","i*"},
{buildin_countitem,"countitem","i"},
{buildin_checkweight,"checkweight","ii"},
{buildin_readparam,"readparam","i"},
{buildin_getcharid,"getcharid","i"},
{buildin_getpartyname,"getpartyname","i"},
{buildin_getguildname,"getguildname","i"},
{buildin_getguildmaster,"getguildmaster","i"},
{buildin_getguildmasterid,"getguildmasterid","i"},
{buildin_strcharinfo,"strcharinfo","i"},
{buildin_getequipname,"getequipname","i"},
{buildin_getequipisequiped,"getequipisequiped","i"},
{buildin_getequipisenableref,"getequipisenableref","i"},
{buildin_getequipisidentify,"getequipisidentify","i"},
{buildin_getequiprefinerycnt,"getequiprefinerycnt","i"},
{buildin_getequipweaponlv,"getequipweaponlv","i"},
{buildin_getequippercentrefinery,"getequippercentrefinery","i"},
{buildin_successrefitem,"successrefitem","i"},
{buildin_failedrefitem,"failedrefitem","i"},
{buildin_statusup,"statusup","i"},
{buildin_statusup2,"statusup2","ii"},
{buildin_bonus,"bonus","ii"},
{buildin_bonus2,"bonus2","iii"},
{buildin_bonus3,"bonus3","iiii"},
{buildin_skill,"skill","ii*"},
{buildin_getskilllv,"getskilllv","i"},
{buildin_basicskillcheck,"basicskillcheck","*"},
{buildin_getgmlevel,"getgmlevel","*"},
{buildin_end,"end",""},
{buildin_checkoption,"checkoption","i"},
{buildin_setoption,"setoption","i"},
{buildin_setcart,"setcart",""},
{buildin_setfalcon,"setfalcon",""},
{buildin_setriding,"setriding",""},
{buildin_savepoint,"savepoint","sii"},
{buildin_openstorage,"openstorage",""},
{buildin_guildopenstorage,"guildopenstorage","*"},
{buildin_itemskill,"itemskill","iis"},
{buildin_produce,"produce","i"},
{buildin_monster,"monster","siisii*"},
{buildin_areamonster,"areamonster","siiiisii*"},
{buildin_killmonster,"killmonster","ss"},
{buildin_killmonsterall,"killmonsterall","s"},
{buildin_doevent,"doevent","s"},
{buildin_donpcevent,"donpcevent","s"},
{buildin_addtimer,"addtimer","is"},
{buildin_deltimer,"deltimer","s"},
{buildin_addtimercount,"addtimercount","si"},
{buildin_initnpctimer,"initnpctimer","*"},
{buildin_stopnpctimer,"stopnpctimer","*"},
{buildin_startnpctimer,"startnpctimer","*"},
{buildin_setnpctimer,"setnpctimer","*"},
{buildin_getnpctimer,"getnpctimer","i*"},
{buildin_announce,"announce","si"},
{buildin_mapannounce,"mapannounce","ssi"},
{buildin_areaannounce,"areaannounce","siiiisi"},
{buildin_getusers,"getusers","i"},
{buildin_getmapusers,"getmapusers","s"},
{buildin_getareausers,"getareausers","siiii"},
{buildin_getareadropitem,"getareadropitem","siiiii"},
{buildin_enablenpc,"enablenpc","s"},
{buildin_disablenpc,"disablenpc","s"},
{buildin_sc_start,"sc_start","iii"},
{buildin_sc_end,"sc_end","i"},
{buildin_debugmes,"debugmes","s"},
{buildin_catchpet,"pet","i"},
{buildin_birthpet,"bpet",""},
{buildin_resetstatus,"resetstatus",""},
{buildin_resetskill,"resetskill",""},
{buildin_changebase,"changebase","i"},
{buildin_changesex,"changesex",""},
{buildin_waitingroom,"waitingroom","si*"},
{buildin_delwaitingroom,"delwaitingroom","*"},
{buildin_enablewaitingroomevent,"enablewaitingroomevent","*"},
{buildin_disablewaitingroomevent,"disablewaitingroomevent","*"},
{buildin_getwaitingroomstate,"getwaitingroomstate","i*"},
{buildin_warpwaitingpc,"warpwaitingpc","sii*"},
{buildin_attachrid,"attachrid","i"},
{buildin_detachrid,"detachrid",""},
{buildin_isloggedin,"isloggedin","i"},
{buildin_setmapflag,"setmapflagnosave","ssii"},
{buildin_setmapflag,"setmapflag","si"},
{buildin_removemapflag,"removemapflag","si"},
{buildin_pvpon,"pvpon","s"},
{buildin_pvpoff,"pvpoff","s"},
{buildin_gvgon,"gvgon","s"},
{buildin_gvgoff,"gvgoff","s"},
{buildin_emotion,"emotion","i"},
{buildin_maprespawnguildid,"maprespawnguildid","sii"},
{buildin_agitstart,"agitstart",""}, // <Agit>
{buildin_agitend,"agitend",""},
{buildin_flagemblem,"flagemblem","i"}, // Flag Emblem
{buildin_getcastlename,"getcastlename","s"},
{buildin_getcastledata,"getcastledata","si*"},
{buildin_setcastledata,"setcastledata","sii"},
{buildin_requestguildinfo,"requestguildinfo","i*"},
{buildin_getequipcardcnt,"getequipcardcnt","i"},
{buildin_successremovecards,"successremovecards","i"},
{buildin_failedremovecards,"failedremovecards","ii"},
{NULL,NULL,NULL}
};
enum {
C_NOP,C_POS,C_INT,C_PARAM,C_FUNC,C_STR,C_CONSTSTR,C_ARG,
C_NAME,C_EOL,
C_LOR,C_LAND,C_LE,C_LT,C_GE,C_GT,C_EQ,C_NE, //operator
C_XOR,C_OR,C_AND,C_ADD,C_SUB,C_MUL,C_DIV,C_MOD,C_NEG,C_LNOT,C_NOT
};
/*==========================================
* 暥帤楍偺僴僢僔儏傪寁嶼
*------------------------------------------
*/
static int calc_hash(const unsigned char *p)
{
int h=0;
while(*p){
h=(h<<1)+(h>>3)+(h>>5)+(h>>8);
h+=*p++;
}
return h&15;
}
/*==========================================
* str_data偺拞偵柤慜偑偁傞偐専嶕偡傞
*------------------------------------------
*/
// 婛懚偺偱偁傟偽斣崋丄柍偗傟偽-1
static int search_str(const unsigned char *p)
{
int i;
i=str_hash[calc_hash(p)];
while(i){
if(strcmp(str_buf+str_data[i].str,p)==0){
return i;
}
i=str_data[i].next;
}
return -1;
}
/*==========================================
* str_data偵柤慜傪搊榐
*------------------------------------------
*/
// 婛懚偺偱偁傟偽斣崋丄柍偗傟偽搊榐偟偰怴婯斣崋
static int add_str(const unsigned char *p)
{
int i;
char *lowcase;
lowcase=strdup(p);
for(i=0;lowcase[i];i++)
lowcase[i]=tolower(lowcase[i]);
if((i=search_str(lowcase))>=0){
free(lowcase);
return i;
}
free(lowcase);
i=calc_hash(p);
if(str_hash[i]==0){
str_hash[i]=str_num;
} else {
i=str_hash[i];
for(;;){
if(strcmp(str_buf+str_data[i].str,p)==0){
return i;
}
if(str_data[i].next==0)
break;
i=str_data[i].next;
}
str_data[i].next=str_num;
}
if(str_num>=str_data_size){
str_data_size+=128;
str_data=realloc(str_data,sizeof(str_data[0])*str_data_size);
if(str_data==NULL){
printf("out of memory : add_str str_data\n");
exit(1);
}
memset(str_data + (str_data_size - 128), '\0', 128);
}
while(str_pos+strlen(p)+1>=str_size){
str_size+=256;
str_buf=realloc(str_buf,str_size);
if(str_buf==NULL){
printf("out of memory : add_str str_buf\n");
exit(1);
}
memset(str_buf + (str_size - 256), '\0', 256);
}
strcpy(str_buf+str_pos,p);
str_data[str_num].type=C_NOP;
str_data[str_num].str=str_pos;
str_data[str_num].next=0;
str_data[str_num].func=NULL;
str_data[str_num].backpatch=-1;
str_data[str_num].label=-1;
str_pos+=strlen(p)+1;
return str_num++;
}
/*==========================================
* 僗僋儕僾僩僶僢僼傽僒僀僘偺妋擣偲奼挘
*------------------------------------------
*/
static void check_script_buf(int size)
{
if(script_pos+size>=script_size){
script_size+=SCRIPT_BLOCK_SIZE;
script_buf=realloc(script_buf,script_size);
if(script_buf==NULL){
printf("out of memory : check_script_buf \n");
exit(1);
}
memset(script_buf + script_size - SCRIPT_BLOCK_SIZE, '\0',
SCRIPT_BLOCK_SIZE);
}
}
/*==========================================
* 僗僋儕僾僩僶僢僼傽偵侾僶僀僩彂偒崬傓
*------------------------------------------
*/
static void add_scriptb(int a)
{
check_script_buf(1);
script_buf[script_pos++]=a;
}
/*==========================================
* 僗僋儕僾僩僶僢僼傽偵僨乕僞僞僀僾傪彂偒崬傓
*------------------------------------------
*/
static void add_scriptc(int a)
{
while(a>=0x40){
add_scriptb((a&0x3f)|0x40);
a=(a-0x40)>>6;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -