Binary files athena-dev-2.1.1-mod0641/MonsterEditor.exe and 641mod/MonsterEditor.exe differ diff -rNu athena-dev-2.1.1-mod0641/ToDo.txt 641mod/ToDo.txt --- athena-dev-2.1.1-mod0641/ToDo.txt Wed Dec 31 16:00:00 1969 +++ 641mod/ToDo.txt Mon Dec 22 09:39:26 2003 @@ -0,0 +1,61 @@ +ITEM FIX: a setting to delay between casts as % +FIX: Critical Explosion(5) *Works but Critical Rate won't go up* +ITEM FIX: Auto-spell cast up to Level 3 Soul Strike with % chance +FIX: MATK +ITEM FIX: Consumes 2 SP with each hit +ITEM FIX: Unable to upgrade(dont know how yet) +ITEM FIX: % change do % damage +CARD CHECK FIX: (4143 Orc_hero, 4140 Abyss_Knight, 4145 Berzebub) + + + + +item rogue's treasure +event OnStartEquip: +AddExtParam User VAR_DEXAMOUNT 99 +AddExtParam User VAR_LUKAMOUNT 99 +SubExtParam User VAR_CRITICALSUCCESSVALUE 330 +SubExtParam User VAR_HITSUCCESSVALUE 99 +subextparam user var_luckydodge 10 +return +event OnFinishEquip: +AddExtParam User VAR_CRITICALSUCCESSVALUE 330 +AddExtParam User VAR_HITSUCCESSVALUE 99 +addextparam user var_luckydodge 10 +SubExtParam User VAR_DEXAMOUNT 99 +SubExtParam User VAR_LUKAMOUNT 99 +return + + + +item Bow Thimble +event OnStartEquip: +AddExtParam User VAR_DEXAMOUNT 20 +SubExtParam User VAR_HITSUCCESSVALUE 20 +return +event OnFinishEquip: +AddExtParam User VAR_HITSUCCESSVALUE 20 +SubExtParam User VAR_DEXAMOUNT 20 +return + + + + +byte info +------------------------------------ +0 0xc3(word) +2 account #(long) +6 position(byte) +7 view(byte) + + +positions:(byte 6) +0 class +1 hair style +2 weapon +3 head bottom +4 head top +5 head middle +6 hair color +7 clothes color +8 shield diff -rNu athena-dev-2.1.1-mod0641/char/GNUmakefile 641mod/char/GNUmakefile --- athena-dev-2.1.1-mod0641/char/GNUmakefile Wed Dec 31 16:00:00 1969 +++ 641mod/char/GNUmakefile Tue Dec 9 16:07:31 2003 @@ -0,0 +1,16 @@ +all: char-server + +COMMON_OBJ = ../common/core.o ../common/socket.o ../common/timer.o ../common/db.o +COMMON_H = ../common/core.h ../common/socket.h ../common/timer.h ../common/db.h + +char-server: char.o inter.o int_party.o int_guild.o int_storage.o int_pet.o $(COMMON_OBJ) + $(CC) -o ../$@ $^ + +char.o: char.c char.h inter.h int_pet.h ../common/core.h ../common/socket.h ../common/timer.h ../common/mmo.h ../common/version.h +inter.o: inter.c inter.h int_party.h int_guild.h int_storage.h int_pet.h ../common/mmo.h char.h ../common/socket.h +int_party.o: int_party.c int_party.h inter.h ../common/mmo.h char.h ../common/socket.h +int_guild.o: int_guild.c int_guild.h inter.h ../common/mmo.h char.h ../common/socket.h +int_storage.o: int_storage.c int_storage.h inter.h ../common/mmo.h char.h ../common/socket.h +int_pet.o: int_pet.c int_pet.h inter.h ../common/mmo.h char.h ../common/socket.h +clean: + rm -f *.o ../char-server Binary files athena-dev-2.1.1-mod0641/char-server.exe and 641mod/char-server.exe differ diff -rNu athena-dev-2.1.1-mod0641/common/GNUmakefile 641mod/common/GNUmakefile --- athena-dev-2.1.1-mod0641/common/GNUmakefile Wed Dec 31 16:00:00 1969 +++ 641mod/common/GNUmakefile Tue Dec 9 16:07:31 2003 @@ -0,0 +1,11 @@ +all: core.o socket.o timer.o grfio.o db.o + +core.o: core.c core.h +socket.o: socket.c socket.h +timer.o: timer.c timer.h +grfio.o: grfio.c grfio.h +db.o: db.c db.h + + +clean: + rm -f *.o diff -rNu athena-dev-2.1.1-mod0641/common/core.c 641mod/common/core.c --- athena-dev-2.1.1-mod0641/common/core.c Wed Jul 9 17:20:00 2003 +++ 641mod/common/core.c Wed Dec 24 14:16:59 2003 @@ -1,71 +1,71 @@ -// $Id: core.c,v 1.3 2003/06/29 05:49:50 lemit Exp $ -// original : core.c 2003/02/26 18:03:12 Rev 1.7 - -#include -#include -#include -#include - -#include "core.h" -#include "socket.h" -#include "timer.h" - -#ifdef MEMWATCH -#include "memwatch.h" -#endif - -static void (*term_func)(void)=NULL; - -/*====================================== - * CORE : Set function - *-------------------------------------- - */ -void set_termfunc(void (*termfunc)(void)) -{ - term_func = termfunc; -} - -/*====================================== - * CORE : Signal Sub Function - *-------------------------------------- - */ - -static void sig_proc(int sn) -{ - int i; - switch(sn){ - case SIGINT: - case SIGTERM: - if(term_func) - term_func(); - for(i=0;i +#include +#include +#include + +#include "core.h" +#include "socket.h" +#include "timer.h" + +#ifdef MEMWATCH +#include "memwatch.h" +#endif + +static void (*term_func)(void)=NULL; + +/*====================================== + * CORE : Set function + *-------------------------------------- + */ +void set_termfunc(void (*termfunc)(void)) +{ + term_func = termfunc; +} + +/*====================================== + * CORE : Signal Sub Function + *-------------------------------------- + */ + +static void sig_proc(int sn) +{ + int i; + switch(sn){ + case SIGINT: + case SIGTERM: + if(term_func) + term_func(); + for(i=0;i= atcommand_config.rurap) { - sscanf(message, "%s%s%s%d%d", command, temp1, temp0, &x, &y); - if ((pl_sd=map_nick2sd(temp1))!=NULL) { +//「@charwarp 名前 マップファイル名 x座標 y座標」と入力 + if ((strcmpi(command, "@rura+") == 0 || strcmpi(command, "@send") == 0 || strcmpi(command, "@warp+") == 0 || strcmpi(command, "@charwarp")) == 0 && gm_level >= atcommand_config.rurap) { + sscanf(message, "%s%s%d%d %[^\n]", command, temp1, &x, &y, temp0); + if ((pl_sd=map_nick2sd(temp0))!=NULL) { if(gm_level > pc_isGM(pl_sd)) { if (x >= 0 && x < 400 && y >= 0 && y < 400) { - if(pc_setpos(pl_sd, temp0, x, y, 3)==0){ - clif_displaymessage(pl_sd->fd,"跳ぶーー( ゜Д゜)"); + if(pc_setpos(pl_sd, temp1, x, y, 2)==0){ + clif_displaymessage(pl_sd->fd,"They've been warped,"); }else{ - clif_displaymessage(fd,"そんなマップファイル名は存在しません。"); + clif_displaymessage(fd,"Map not found."); } }else{ - clif_displaymessage(fd,"座標値が不正です。"); + clif_displaymessage(fd,"Coordinates out of range."); } + }else{ + clif_displaymessage(fd,"You don't have athority to warp this person."); } }else{ - clif_displaymessage(fd,"そんな人は存在しません。"); + clif_displaymessage(fd,"Character not found."); } return 1; } //ルーラ -//「@rura マップファイル名 x座標 y座標」と入力 - if (strcmpi(command, "@rura") == 0 && gm_level >= atcommand_config.rura) { +//「@warp マップファイル名 x座標 y座標」と入力 + if ((strcmpi(command, "@rura") == 0 || strcmpi(command, "@warp")) == 0 && gm_level >= atcommand_config.rura) { sscanf(message, "%s%s%d%d", command, temp0, &x, &y); if (x >= 0 && x < 400 && y >= 0 && y < 400) { if(pc_setpos(sd, temp0, x, y, 3)==0){ - clif_displaymessage(fd,"跳ぶーー( ゜Д゜)"); + clif_displaymessage(fd,"Warped."); }else{ - clif_displaymessage(fd,"そんなマップファイル名は存在しません。"); + clif_displaymessage(fd,"Map not found."); } }else{ - clif_displaymessage(fd,"座標値が不正です。"); + clif_displaymessage(fd,"Coordinates out of range."); } return 1; } //任意のキャラの居場所を調べる //「@where キャラ名」と入力 if(strcmpi(command, "@where") == 0 && gm_level >= atcommand_config.where){ - sscanf(message, "%s%s", command, temp1); + sscanf(message, "%s %[^\n]", command, temp1); if ((pl_sd=map_nick2sd(temp1))!=NULL) { sprintf(moji, "%s %s %d %d", temp1, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); clif_displaymessage(fd,moji); }else{ -// clif_displaymessage(fd,"そんな人は存在しません。"); - sprintf(moji, "%s %d %d", sd->mapname, sd->bl.x, sd->bl.y); - clif_displaymessage(fd,moji); + clif_displaymessage(fd,"Character does not exist."); } return 1; } //任意のキャラの所へ移動する //「@jumpto キャラ名」と入力 - if(strcmpi(command, "@jumpto") == 0 && gm_level >= atcommand_config.jumpto){ + if((strcmpi(command, "@jumpto") == 0 || strcmpi(command, "@warpto") == 0) && gm_level >= atcommand_config.jumpto){ sscanf(message, "%s %[^\n]", command, temp1); if ((pl_sd=map_nick2sd(temp1))!=NULL) { pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3); sprintf(moji,"Jump to %s",temp1); clif_displaymessage(fd,moji); }else{ - clif_displaymessage(fd,"そんな人は存在しません。"); + clif_displaymessage(fd,"Character not found."); } return 1; } @@ -118,10 +118,10 @@ sscanf(message, "%s%d%d", command, &x, &y); if (x >= 0 && x < 400 && y >= 0 && y < 400) { pc_setpos(sd, sd->mapname, x, y, 3); - sprintf(moji, "Jump to %d %d ( ゜Д゜)", x, y); + sprintf(moji, "Jump to %d %d now)", x, y); clif_displaymessage(fd,moji); }else{ - clif_displaymessage(fd,"座標値が不正です。"); + clif_displaymessage(fd,"Command failed."); } return 1; } @@ -130,25 +130,87 @@ if(strcmpi(command, "@who") == 0 && gm_level >= atcommand_config.who){ for(i=0;isession_data) && pl_sd->state.auth){ - clif_displaymessage(fd,pl_sd->status.name); + sprintf(moji, "Name: %s | Location: %s %d %d", pl_sd->status.name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); + clif_displaymessage(fd, moji); + } + } + return 1; + } + +//Who2 by Sara, prints job and levels + if(strcmpi(command, "@who2") == 0 && gm_level >= atcommand_config.who){ + for(i=0;isession_data) && pl_sd->state.auth){ + //Check Job, copy name to temp variable + if (pl_sd->status.class == 0){sprintf(temp0, "Novice");} + if (pl_sd->status.class == 1){sprintf(temp0, "Swordsman");} + if (pl_sd->status.class == 2){sprintf(temp0, "Mage");} + if (pl_sd->status.class == 3){sprintf(temp0, "Archer");} + if (pl_sd->status.class == 4){sprintf(temp0, "Acolyte");} + if (pl_sd->status.class == 5){sprintf(temp0, "Merchant");} + if (pl_sd->status.class == 6){sprintf(temp0, "Thief");} + if (pl_sd->status.class == 7){sprintf(temp0, "Knight");} + if (pl_sd->status.class == 8){sprintf(temp0, "Priest");} + if (pl_sd->status.class == 9){sprintf(temp0, "Wizard");} + if (pl_sd->status.class == 10){sprintf(temp0, "Blacksmith");} + if (pl_sd->status.class == 11){sprintf(temp0, "Hunter");} + if (pl_sd->status.class == 12){sprintf(temp0, "Assassin");} + if (pl_sd->status.class == 13){sprintf(temp0, "Knight 2");} + if (pl_sd->status.class == 14){sprintf(temp0, "Crusader");} + if (pl_sd->status.class == 15){sprintf(temp0, "Monk");} + if (pl_sd->status.class == 16){sprintf(temp0, "Sage");} + if (pl_sd->status.class == 17){sprintf(temp0, "Rogue");} + if (pl_sd->status.class == 18){sprintf(temp0, "Alchemist");} + if (pl_sd->status.class == 19){sprintf(temp0, "Bard");} + if (pl_sd->status.class == 20){sprintf(temp0, "Dancer");} + if (pl_sd->status.class == 21){sprintf(temp0, "Crusader 2");} + if (pl_sd->status.class == 22){sprintf(temp0, "Wedding");} + if (pl_sd->status.class == 23){sprintf(temp0, "Super Novice");} + sprintf(moji, "Name: %s | Job: %s | BLvl: %d | JLvl: %d", pl_sd->status.name, temp0, pl_sd->status.base_level, pl_sd->status.job_level); + clif_displaymessage(fd, moji); + } + } + return 1; + } + +//Who3 by Sara, prints guild and party names + if(strcmpi(command, "@who3") == 0 && gm_level >= atcommand_config.who){ + for(i=0;isession_data) && pl_sd->state.auth){ + struct guild *g=guild_search(pl_sd->status.guild_id); + if(g==NULL){ + sprintf(temp1,"None"); + }else{ + sprintf(temp1, "%s", g->name); + } + struct party *p=party_search(pl_sd->status.party_id); + if(p==NULL){ + sprintf(temp0, "None"); + }else{ + sprintf(temp0, "%s", p->name); + } + sprintf(moji, "Name: %s | Party: %s | Guild: %s", pl_sd->status.name, temp0, temp1); + clif_displaymessage(fd, moji); } } return 1; } + + //現在位置を含め、冒険の記録をセーブする //「@save」と入力 if (strcmpi(command, "@save") == 0 && gm_level >= atcommand_config.save) { pc_setsavepoint(sd,sd->mapname,sd->bl.x,sd->bl.y); pc_makesavestatus(sd); chrif_save(sd); - clif_displaymessage(fd,"うむ、そなたの冒険を記録したぞ(´Д`)"); + clif_displaymessage(fd,"Character data respawn point saved."); return 1; } //セーブ地点にワープする //「@load」と入力 if (strcmpi(command, "@load") == 0 && gm_level >= atcommand_config.load) { pc_setpos(sd,sd->status.save_point.map , sd->status.save_point.x , sd->status.save_point.y, 0); - clif_displaymessage(fd,"セーブ地点へ帰還ー"); + clif_displaymessage(fd,"Warping to respawn point.."); return 1; } //歩行スピード変更 @@ -160,7 +222,7 @@ //sd->walktimer = x; //この文を追加 by れあ clif_updatestatus(sd,SP_SPEED); - clif_displaymessage(fd,"速度変更!"); + clif_displaymessage(fd,"Speed changed."); } return 1; } @@ -207,18 +269,18 @@ sd->opt2=y; sd->status.option=z; clif_changeoption(&sd->bl); - clif_displaymessage(fd,"秘技!七変化!"); + clif_displaymessage(fd,"Options changed."); return 1; } //消える //「@hide」と入力 if (strcmpi(command, "@hide") == 0 && gm_level >= atcommand_config.hide) { if(sd->status.option&0x40){ - sd->status.option^=0x40; - clif_displaymessage(fd,"invisible off!"); + sd->status.option ^= 0x40; + clif_displaymessage(fd,"Invidible: Off."); }else{ - sd->status.option^=0x40; - clif_displaymessage(fd,"invisible!"); + sd->status.option ^= 0x40; + clif_displaymessage(fd,"Invisible: On."); } clif_changeoption(&sd->bl); return 1; @@ -251,9 +313,11 @@ */ if (strcmpi(command, "@jobchange") == 0 && gm_level >= atcommand_config.jobchange) { sscanf(message, "%s%d", command, &x); - if ((x >= 0 && x < MAX_PC_CLASS)) { + if (x >= 0 && x < MAX_PC_CLASS) { pc_jobchange(sd,x); - clif_displaymessage(fd,"(`・ω・´)シャキーン!!"); + clif_displaymessage(fd,"Your job has been changed."); + }else{ + clif_displaymessage(fd,"Invalid job ID"); } return 1; } @@ -261,7 +325,7 @@ //「@die」と入力する。 if (strcmpi(command, "@die") == 0 && gm_level >= atcommand_config.die) { pc_damage(NULL,sd,sd->status.hp+1); - clif_displaymessage(fd,"シボンヌ(´Д`)"); + clif_displaymessage(fd,"A pity! You've died."); return 1; } //他殺 @@ -273,10 +337,11 @@ if ((pl_sd=map_nick2sd(temp1))!=NULL) { if(gm_level > pc_isGM(pl_sd)) { pc_damage(NULL,pl_sd,pl_sd->status.hp+1); - clif_displaymessage(fd,"殺しました"); + clif_displaymessage(pl_sd->fd,"A pity! You've died."); + clif_displaymessage(fd,"Character Killed."); } }else{ - clif_displaymessage(fd,"そんな人いません."); + clif_displaymessage(fd,"Character not found."); } return 1; } @@ -289,7 +354,7 @@ pc_setghosttimer(sd,battle_config.ghost_time); clif_updatestatus(sd,SP_HP); clif_resurrection(&sd->bl,1); - clif_displaymessage(fd,"( ゜∀)キタ!!( ゜∀゜ )キターーー"); + clif_displaymessage(fd,"You've been revived! It's a miracle!"); return 1; } //天の声 @@ -318,15 +383,15 @@ clif_heal(fd,SP_HP,x); clif_heal(fd,SP_SP,y); pc_heal(sd,x,y); - clif_displaymessage(fd,"HP,SPを回復しました"); + clif_displaymessage(fd,"HP,SP Recovered."); return 1; } //アイテムゲット //「@item アイテムの名前orID 個数」と入力 if (strcmpi(command, "@item") == 0 && gm_level >= atcommand_config.item) { + sscanf(message, "%s%s%d", command, temp0, &y); struct item item_tmp; struct item_data *item_data; - sscanf(message, "%s%s%d", command, temp0, &y); if(y==0) y=1; //個数指定が無かったら1個にするbyれあ if( (x=atoi(temp0))>0 ){ @@ -351,9 +416,9 @@ if((flag = pc_additem(sd,&item_tmp,a2))) clif_additem(sd,0,0,flag); } - clif_displaymessage(fd,"アイテムゲトー( ・∀・)"); +// clif_displaymessage(fd,"アイテムゲトー( ・∀・)"); } else { - clif_displaymessage(fd,"お客様のお探しの商品はございません(´Д`) "); + clif_displaymessage(fd,"Invalid Item ID."); } return 1; } @@ -364,7 +429,7 @@ if (sd->status.inventory[i].amount && sd->status.inventory[i].equip ==0) pc_delitem(sd,i,sd->status.inventory[i].amount,0); } - clif_displaymessage(fd,"全アイテム破棄しました(´∀`) "); + clif_displaymessage(fd,"All of your items have been removed.."); return 1; } //所持アイテムのチェック @@ -373,7 +438,7 @@ } //Lvアップコマンド //「@Lvup 増加値」と入力 - if (strcmpi(command, "@lvup") == 0 && gm_level >= atcommand_config.lvup) { + if ((strcmpi(command, "@lvup") == 0 || strcmpi(command, "@lvlup") == 0 || strcmpi(command, "@baseup") == 0 || strcmpi(command, "@baselvlup") == 0) && gm_level >= atcommand_config.lvup) { sscanf(message, "%s%d", command, &x); if(x >= 1){ for(i=sd->status.base_level+1;i<=sd->status.base_level+x;i++){ @@ -389,25 +454,25 @@ pc_calcstatus(sd,0); pc_heal(sd,sd->status.max_hp,sd->status.max_sp); clif_misceffect(&sd->bl,0); - clif_displaymessage(fd,"Lvあーーーーーっぷ"); + clif_displaymessage(fd,"Base Level Raised."); }else if(x<0 && sd->status.base_level+x>0){ sd->status.base_level+=x; clif_updatestatus(sd,SP_BASELEVEL); clif_updatestatus(sd,SP_NEXTBASEEXP); pc_calcstatus(sd,0); - clif_displaymessage(fd,"Lvだうーーーーーん"); + clif_displaymessage(fd,"Base Level Lowered."); } return 1; } //JobLvアップコマンド //「@jobLvup 増加値」と入力 - if(strcmpi(command, "@joblvup") == 0 && gm_level >= atcommand_config.joblvup){ + if((strcmpi(command, "@joblvup") == 0 || strcmpi(command, "@jlvup") == 0 || strcmpi(command, "@joblvlup") == 0 || strcmpi(command, "@jlvlup") ==0) && gm_level >= atcommand_config.joblvup){ y = 50; sscanf(message, "%s%d", command, &x); if(sd->status.class == 0) y -= 40; if(sd->status.job_level == y){ - clif_displaymessage(fd,"既に最高レベルです"); + clif_displaymessage(fd,"Job level can't go any higher."); }else if(x >= 1){ if(sd->status.job_level + x > y) x = y - sd->status.job_level; @@ -418,19 +483,19 @@ clif_updatestatus(sd,SP_SKILLPOINT); pc_calcstatus(sd,0); clif_misceffect(&sd->bl,1); - clif_displaymessage(fd,"JobLvあーーーーーっぷ"); + clif_displaymessage(fd,"Job Level Raised."); }else if(x<0 && sd->status.job_level+x>0 ){ sd->status.job_level+=x; clif_updatestatus(sd,SP_JOBLEVEL); clif_updatestatus(sd,SP_NEXTJOBEXP); pc_calcstatus(sd,0); - clif_displaymessage(fd,"JobLvだうーーーーーん"); + clif_displaymessage(fd,"Job Level Lowered."); } return 1; } //ヘルプコマンド @コマンドの全容を説明してくれる。 //「@help」と入力 - if ((strcmpi(command, "@h") == 0 || strcmpi(command, "@help") == 0) && gm_level >= atcommand_config.help) { +/* if ((strcmpi(command, "@h") == 0 || strcmpi(command, "@help") == 0) && gm_level >= atcommand_config.help) { char moji[400]; FILE *file; if( (file = fopen("help.txt", "r"))!=NULL){ @@ -448,26 +513,26 @@ } fclose(file); }else - clif_displaymessage(fd,"ヘルプファイルが読めません"); + clif_displaymessage(fd,"Help.txt not found."); return 1; - } + }*/ //GMになる! 同垢の全キャラはPTから抜け、倉庫は空にして下さい。 //「@GM」と入力 - if (strcmpi(command, "@GM") == 0 && gm_level >= atcommand_config.gm) { +/* if (strcmpi(command, "@GM") == 0 && gm_level >= atcommand_config.gm) { moji[0]=0; sscanf(message, "%s %[^\n]", command,moji); if(sd->status.party_id) - clif_displaymessage(fd,"PTを抜けてから実行してください"); + clif_displaymessage(fd,"You must leave your party first."); else if(sd->status.guild_id) - clif_displaymessage(fd,"ギルドを抜けてから実行してください"); + clif_displaymessage(fd,"ou must leave your guild first."); else{ pc_makesavestatus(sd); chrif_save(sd); - clif_displaymessage(fd,"GMになるために問い合わせ中..."); + clif_displaymessage(fd,"Command completed successfully."); chrif_changegm(sd->status.account_id,moji,strlen(moji)+1); } return 1; - } + }*/ //PVP解除  ただ、マップ移動しないと解除されません。 //「@pvpoff」と入力 @@ -486,7 +551,7 @@ } } } - clif_displaymessage(fd,"(´ー`)まったーり♪仲良くね"); + clif_displaymessage(fd,"PvP: Off."); } return 1; } @@ -507,7 +572,7 @@ } } } - clif_displaymessage(fd,"Kill Kill Kill Kill Kill Kill〜〜〜〜〜〜〜〜(゜Д゜#)"); + clif_displaymessage(fd,"PvP: On!!"); } return 1; } @@ -517,7 +582,7 @@ if(map[sd->bl.m].flag.gvg) { map[sd->bl.m].flag.gvg = 0; clif_send0199(sd->bl.m,0); - clif_displaymessage(fd,"guild vg guild off"); + clif_displaymessage(fd,"GvG: Off."); } return 1; } @@ -527,35 +592,36 @@ if(!map[sd->bl.m].flag.gvg) { map[sd->bl.m].flag.gvg = 1; clif_send0199(sd->bl.m,3); - clif_displaymessage(fd,"guild vg guild on"); + clif_displaymessage(fd,"GvG: On!!"); } return 1; } + //髪型、髪の色、服の色、変更 //「@model x y z」のように値を入力、ただしこれらを変更した状態で2HQを使うとエラーが・・・(´Д`) 解明しだい直します。 /* 例:@model 15 4 0 -x [0〜19]髪型 +x [0〜17]髪型 y [0〜8]髪の色 z [0〜4]服の色 */ if (strcmpi(command, "@model") == 0 && gm_level >= atcommand_config.model) { sscanf(message, "%s%d%d%d", command, &x, &y, &z); - if (x >= 0 && x < 20 && y >= 0 && y < 9 && z >= 0 && z <= 4) { + if (x >= 0 && x < 18 && y >= 0 && y < 9 && z >= 0 && z <= 4) { //服の色変更 - if ((sd->status.class == 12 || sd->status.class == 14 || sd->status.class == 15 || sd->status.class == 16 || sd->status.class == 17 || sd->status.class == 21) && z != 0) { - //服の色未実装職の判定 - clif_displaymessage(fd,"服染め未実装です"); + if ((sd->status.class == 12 || sd->status.class >= 14) && z != 0) { + //アサシンは服の色未実装 + clif_displaymessage(fd,"You can't use this command with this class."); } else { pc_changelook(sd,LOOK_HAIR,x); pc_changelook(sd,LOOK_HAIR_COLOR,y); pc_changelook(sd,LOOK_CLOTHES_COLOR,z); - clif_displaymessage(fd,"イメチェン!!"); + clif_displaymessage(fd,"Appearence Changed."); } } else { - clif_displaymessage(fd,"不正な値です。キャンセルしました〜"); + clif_displaymessage(fd,"An invalid number was specified."); } return 1; } @@ -577,42 +643,54 @@ { "yuno.gat", 157, 51 }, // 9=ジュノー { "amatsu.gat", 198, 84 }, // 10=アマツ { "gonryun.gat", 160, 120 }, // 11=ゴンリュン - + { "umbala.gat", 145, 155 }, // 12=Umbala (done by Sara) }; sscanf(message, "%s%d", command, &x); if (x >= 0 && x= atcommand_config.monster) { + if ((strcmpi(command, "@monster") == 0 || strcmpi(command, "@spawn") == 0) && gm_level >= atcommand_config.monster) { i1 = i2 = x = y = 0; - sscanf(message, "%s %s %s %d%d%d", command, temp1, temp0, &i2, &x, &y); + int c; + if (sscanf(message, "%s %s %s %d%d%d", command, temp1, temp0, &i2, &x, &y) < 4) { + sscanf(message, "%s %s %d%d%d", command, temp0, &i2, &x, &y); + sprintf(temp1,"GM Monster"); + } + if( (i1=atoi(temp0))==0 ) i1=mobdb_searchname(temp0); printf("%s name=%s id=%d count=%d (%d,%d)\n", command, temp1, i1, i2, x, y); - if(i1>=1000 && i1<2000 && mob_db[i1].max_hp>0){ - for(i=0;i=1000 && i1<3030 && mob_db[i1].max_hp>0){ + for(i=z=0;ibl.x + (rand()%10 - 5); - else mx = x; - if(y<=0) my=sd->bl.y + (rand()%10 - 5); - else my = y; - mob_once_spawn(sd,"this",mx,my,temp1,i1,1,""); + do{ + mx = sd->bl.x + (rand()%10 - 5); + my = sd->bl.y + (rand()%10 - 5); + if (z==20) break; + }while( ( (c=map_getcell(sd->bl.m,mx,my))==1 || c==5) ); + + if(x>0) mx = x; + if(y>0) my = y; + + mob_once_spawn(sd,"this",mx,my,temp1,i1,1,"GM_Monster"); } - clif_displaymessage(fd,"モンスター召喚 !!"); + clif_displaymessage(fd,"Monster Summoned !!"); }else{ - clif_displaymessage(fd,"無効なモンスターIDです。"); + clif_displaymessage(fd,"Invalid monster ID."); } return 1; } + + // 精錬 @refine 装備場所ID +数値 // 右手=2 左手=32 両手=34 頭=256/257/768/769 体=16 肩=4 足=64 if(strcmpi(command,"@refine")==0 && gm_level >= atcommand_config.refine){ @@ -653,6 +731,7 @@ (i1<=500 || i1>1099) && (i1<4001 || i1>4148) && (i1<7001 || i1>10019) && itemdb_isequip(i1)){ struct item tmp_item; + if(i2<0 || i2>4) i2=0; // 属性範囲 if(i3<0 || i3>3 ) i3=0; // 星のかけら個数 memset(&tmp_item,0,sizeof(tmp_item)); @@ -672,13 +751,13 @@ return 1; } // 任意位置メモ @memo 番号 番号は0~2 - if(strcmpi(command,"@memo")==0 && gm_level >= atcommand_config.memo){ +/* if(strcmpi(command,"@memo")==0 && gm_level >= atcommand_config.memo){ i1=0; sscanf(message,"%s%d",command,&i1); if(i1<0 || i1>2) i1=0; pc_memo(sd,i1); return 1; - } + }*/ // デバグ用(周辺gatを調べる) if(strcmpi(command,"@gat")==0 && gm_level >= atcommand_config.gat){ @@ -705,8 +784,9 @@ if(i1>0 || sd->status.status_point+i1>=0){ sd->status.status_point += i1; clif_updatestatus(sd,SP_STATUSPOINT); + clif_displaymessage(fd,"Status Point(s) given."); }else - clif_displaymessage(fd,"範囲エラー"); + clif_displaymessage(fd,"Invalid number."); return 1; } @@ -716,8 +796,9 @@ if(i1>0 || sd->status.skill_point+i1>=0){ sd->status.skill_point += i1; clif_updatestatus(sd,SP_SKILLPOINT); + clif_displaymessage(fd,"Skill Point(s) given."); }else - clif_displaymessage(fd,"範囲エラー"); + clif_displaymessage(fd,"Invalid number."); return 1; } @@ -727,8 +808,9 @@ if(i1>0 || sd->status.zeny+i1>=0){ sd->status.zeny += i1; clif_updatestatus(sd,SP_ZENY); + clif_displaymessage(fd,"Zeny given."); }else - clif_displaymessage(fd,"範囲エラー"); + clif_displaymessage(fd,"Invalid number."); return 1; } @@ -739,13 +821,13 @@ (i2=3,strcmpi(command,"@int")==0) || (i2=4,strcmpi(command,"@dex")==0) || (i2=5,strcmpi(command,"@luk")==0) ) && gm_level >= atcommand_config.param){ + + sscanf(message,"%s%d",command,&i1); + unsigned char *p[]={ &sd->status.str,&sd->status.agi,&sd->status.vit, &sd->status.int_,&sd->status.dex,&sd->status.luk }; - - sscanf(message,"%s%d",command,&i1); - i=(int)(*p[i2])+i1; if(i< 1)i1=1-*p[i2]; if(i>99)i1=99-*p[i2]; @@ -753,7 +835,7 @@ clif_updatestatus(sd,SP_STR+i2); clif_updatestatus(sd,SP_USTR+i2); pc_calcstatus(sd,0); - clif_displaymessage(fd,"基本パラメータ変更 !!"); + clif_displaymessage(fd,"Stat Changed."); return 1; } @@ -762,18 +844,19 @@ struct guild *g; sscanf(message,"%s%d",command,&i1); if( sd->status.guild_id<=0 || (g=guild_search(sd->status.guild_id))==NULL){ - clif_displaymessage(fd,"ギルドに所属していません"); + clif_displaymessage(fd,"You're not in a guild."); return 1; } if( strcmp(sd->status.name,g->master)!=0 ){ - clif_displaymessage(fd,"ギルドマスターではありません"); + clif_displaymessage(fd,"You're not the master of your guild."); return 1; } if( g->guild_lv+i1>=1 && g->guild_lv+i1<=50){ intif_guild_change_basicinfo(g->guild_id,GBI_GUILDLV,&i1,2); + clif_displaymessage(fd,"Guild Level changed."); }else - clif_displaymessage(fd,"範囲エラー"); + clif_displaymessage(fd,"Guild Level change failed."); return 1; } @@ -798,6 +881,7 @@ if(i1 >= 0 && i1 <= 1000) { sd->pet.intimate = i1; clif_send_petstatus(sd); + clif_displaymessage(fd,"Pet friendship level changed."); } } return 1; @@ -810,6 +894,7 @@ if(i1 >= 0 && i1 <= 100) { sd->pet.hungry = i1; clif_send_petstatus(sd); + clif_displaymessage(fd,"Pet hunger level changed."); } } return 1; @@ -821,6 +906,7 @@ sd->pet.rename_flag = 0; intif_save_petdata(sd->status.account_id,&sd->pet); clif_send_petstatus(sd); + clif_displaymessage(fd,"Pet renaming enabled."); } return 1; } @@ -834,11 +920,11 @@ if ((pl_sd=map_nick2sd(temp1))!=NULL) { if(gm_level > pc_isGM(pl_sd)) { pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); - sprintf(moji,"%s 召喚 !!",temp1); + sprintf(moji,"Recalled %s!!",temp1); clif_displaymessage(fd,moji); } }else{ - clif_displaymessage(fd,"そんな人いません."); + clif_displaymessage(fd,"Character not found."); } return 1; } @@ -849,15 +935,16 @@ sscanf(message, "%s%d %[^\n]", command, &x, temp1); if ((pl_sd=map_nick2sd(temp1))!=NULL) { if(gm_level > pc_isGM(pl_sd)) { - if ((x >= 0 && x < MAX_PC_CLASS)) { + if (x >= 0 && x < MAX_PC_CLASS) { pc_jobchange(pl_sd,x); - clif_displaymessage(fd,"JOB変更 !!"); + clif_displaymessage(pl_sd->fd,"Job changed"); + clif_displaymessage(fd,"Character's Job changed"); }else{ - clif_displaymessage(fd,"JOB-IDが変です."); + clif_displaymessage(fd,"Invalid Job ID."); } } }else{ - clif_displaymessage(fd,"そんな人いません."); + clif_displaymessage(fd,"Character not found."); } return 1; } @@ -873,9 +960,9 @@ pc_setghosttimer(sd,battle_config.ghost_time); clif_updatestatus(pl_sd,SP_HP); clif_resurrection(&pl_sd->bl,1); - clif_displaymessage(fd,"甦らせました"); + clif_displaymessage(fd,"Character Revived."); }else{ - clif_displaymessage(fd,"そんな人いません."); + clif_displaymessage(fd,"Character not found."); } return 1; } @@ -885,32 +972,36 @@ if (strcmpi(command, "@charstats") == 0 && gm_level >= atcommand_config.charstats) { sscanf(message, "%s %[^\n]", command, temp1); if ((pl_sd=map_nick2sd(temp1))!=NULL) { - sprintf(moji,"%s のステータス情報", pl_sd->status.name); - clif_displaymessage(fd,moji); - sprintf(moji,"Base Level - %d", pl_sd->status.base_level); - clif_displaymessage(fd,moji); - sprintf(moji,"Job Level - %d", pl_sd->status.job_level); - clif_displaymessage(fd,moji); - sprintf(moji,"Hp - %d", pl_sd->status.hp); - clif_displaymessage(fd,moji); - sprintf(moji,"MaxHp - %d", pl_sd->status.max_hp); + sprintf(moji,"%s Stats", pl_sd->status.name); clif_displaymessage(fd,moji); - sprintf(moji,"Sp - %d", pl_sd->status.sp); + sprintf(moji,"Base Level - %d Job Level - %d", pl_sd->status.base_level, pl_sd->status.job_level); clif_displaymessage(fd,moji); - sprintf(moji,"MaxSp - %d", pl_sd->status.max_sp); - clif_displaymessage(fd,moji); - sprintf(moji,"Str - %d", pl_sd->status.str); - clif_displaymessage(fd,moji); - sprintf(moji,"Agi - %d", pl_sd->status.agi); +// sprintf(moji,"Job Level - %d", pl_sd->status.job_level); +// clif_displaymessage(fd,moji); + + sprintf(moji,"Hp - %d MaxHP - %d", pl_sd->status.hp, pl_sd->status.max_hp); clif_displaymessage(fd,moji); - sprintf(moji,"Vit - %d", pl_sd->status.vit); +// sprintf(moji,"MaxHp - %d", pl_sd->status.max_hp); +// clif_displaymessage(fd,moji); + sprintf(moji,"Sp - %d MaxSP - %d", pl_sd->status.sp, pl_sd->status.max_sp); clif_displaymessage(fd,moji); - sprintf(moji,"Int - %d", pl_sd->status.int_); +// sprintf(moji,"MaxSp - %d", pl_sd->status.max_sp); +// clif_displaymessage(fd,moji); + + sprintf(moji,"Str - %d Agi - %d", pl_sd->status.str, pl_sd->status.agi); clif_displaymessage(fd,moji); - sprintf(moji,"Dex - %d", pl_sd->status.dex); +// sprintf(moji,"Agi - %d", pl_sd->status.agi); +// clif_displaymessage(fd,moji); + + sprintf(moji,"Vit - %d Int - %d", pl_sd->status.vit, pl_sd->status.int_); clif_displaymessage(fd,moji); - sprintf(moji,"Luk - %d", pl_sd->status.luk); +// sprintf(moji,"Int - %d", pl_sd->status.int_); +// clif_displaymessage(fd,moji); + + sprintf(moji,"Dex - %d Luk - %d", pl_sd->status.dex, pl_sd->status.luk); clif_displaymessage(fd,moji); +// sprintf(moji,"Luk - %d", pl_sd->status.luk); +// clif_displaymessage(fd,moji); sprintf(moji,"Zeny - %d", pl_sd->status.zeny); clif_displaymessage(fd,moji); }else{ @@ -936,10 +1027,10 @@ pl_sd->opt2=y; pl_sd->status.option=z; clif_changeoption(&pl_sd->bl); - clif_displaymessage(fd,"オプション変更"); + clif_displaymessage(fd,"Character's options changed."); } }else{ - clif_displaymessage(fd,"そんな人いません."); + clif_displaymessage(fd,"Character not found."); } return 1; } @@ -951,10 +1042,10 @@ if ((pl_sd=map_nick2sd(temp1))!=NULL) { if(gm_level > pc_isGM(pl_sd)) { pc_setsavepoint(pl_sd,temp0,x,y); - clif_displaymessage(fd,"セーブポイントを変更しました."); + clif_displaymessage(fd,"Character's respawn point changed."); } }else{ - clif_displaymessage(fd,"そんな人いません."); + clif_displaymessage(fd,"Character not found."); } return 1; } @@ -967,7 +1058,7 @@ if(session[i] && (pl_sd=session[i]->session_data) && pl_sd->state.auth){ pl_sd->opt2 |= 0x10; clif_changeoption(&pl_sd->bl); - clif_displaymessage(pl_sd->fd,"夜の帳をおろしました."); + clif_displaymessage(pl_sd->fd,"Night has fallen."); } } return 1; @@ -981,7 +1072,7 @@ if(session[i] && (pl_sd=session[i]->session_data) && pl_sd->state.auth){ pl_sd->opt2 &= !0x10; clif_changeoption(&pl_sd->bl); - clif_displaymessage(pl_sd->fd,"朝日を出しました."); + clif_displaymessage(pl_sd->fd,"Day has arrived."); } } return 1; @@ -996,11 +1087,11 @@ if(session[i] && (pl_sd=session[i]->session_data) && pl_sd->state.auth){ if(gm_level > pc_isGM(pl_sd)) { pc_damage(NULL,pl_sd,pl_sd->status.hp+1); - clif_displaymessage(pl_sd->fd,"神の審判が下りました."); + clif_displaymessage(pl_sd->fd,"The holy messenger has given judgement."); } } } - clif_displaymessage(fd,"審判を下しました."); + clif_displaymessage(fd,"Judgement was made."); return 1; } //October 6, 2003 @@ -1013,12 +1104,12 @@ if(sd->bl.m == pl_sd->bl.m){ if(gm_level > pc_isGM(pl_sd)) { pc_damage(NULL,pl_sd,pl_sd->status.hp+1); - clif_displaymessage(pl_sd->fd,"神の審判が下りました."); + clif_displaymessage(pl_sd->fd,"The holy messenger has given judgement."); } } } } - clif_displaymessage(fd,"審判を下しました."); + clif_displaymessage(fd,"Judgement was made on the map."); return 1; } //September 21, 2003 @@ -1034,10 +1125,10 @@ pc_setstand(pl_sd); clif_updatestatus(pl_sd,SP_HP); clif_resurrection(&pl_sd->bl,1); - clif_displaymessage(pl_sd->fd,"慈悲を頂きました."); + clif_displaymessage(pl_sd->fd,"Mercy has been shown."); } } - clif_displaymessage(fd,"死体を蘇らせました"); + clif_displaymessage(fd,"Mercy has been granted."); return 1; } //October 6, 2003 @@ -1052,16 +1143,16 @@ pc_setstand(pl_sd); clif_updatestatus(pl_sd,SP_HP); clif_resurrection(&pl_sd->bl,1); - clif_displaymessage(pl_sd->fd,"慈悲を頂きました."); + clif_displaymessage(pl_sd->fd,"You've been granted mercy."); } } } - clif_displaymessage(fd,"死体を蘇らせました."); + clif_displaymessage(fd,"Mercy was granted on the map."); return 1; } //@charbaselvl <#> //Description: Change a characters base level. - if (strcmpi(command, "@charbaselvl") == 0 && gm_level >= atcommand_config.charbaselvl) { + if ((strcmpi(command, "@charbaselvl") == 0 || strcmpi(command, "@charlvl") == 0) && gm_level >= atcommand_config.charbaselvl) { sscanf(message, "%s%d %[^\n]", command, &x, temp1); if ((pl_sd=map_nick2sd(temp1))!=NULL) { if(gm_level > pc_isGM(pl_sd)) { @@ -1079,13 +1170,13 @@ pc_calcstatus(pl_sd,0); pc_heal(pl_sd,pl_sd->status.max_hp,pl_sd->status.max_sp); clif_misceffect(&pl_sd->bl,0); - clif_displaymessage(fd,"Baseレベルを上げました"); + clif_displaymessage(fd,"Character's Base Level Raised"); }else if(x<0 && pl_sd->status.base_level+x>0){ pl_sd->status.base_level+=x; clif_updatestatus(pl_sd,SP_BASELEVEL); clif_updatestatus(pl_sd,SP_NEXTBASEEXP); pc_calcstatus(pl_sd,0); - clif_displaymessage(fd,"Baseレベルを下げました"); + clif_displaymessage(fd,"character's Base Level Lowered"); } } } @@ -1100,7 +1191,7 @@ if(pl_sd->status.class == 0) y -= 40; if(pl_sd->status.job_level == y){ - clif_displaymessage(fd,"既に最高レベルです"); + clif_displaymessage(fd,"Character's Job Level can't go any higher."); }else if(x >= 1){ if(pl_sd->status.job_level + x > y) x = y - pl_sd->status.job_level; @@ -1111,13 +1202,13 @@ clif_updatestatus(pl_sd,SP_SKILLPOINT); pc_calcstatus(pl_sd,0); clif_misceffect(&pl_sd->bl,1); - clif_displaymessage(fd,"Jobレベルを上げました"); + clif_displaymessage(fd,"Character's Job Level Raised"); }else if(x<0 && sd->status.job_level+x>0 ){ pl_sd->status.job_level+=x; clif_updatestatus(pl_sd,SP_JOBLEVEL); clif_updatestatus(pl_sd,SP_NEXTJOBEXP); pc_calcstatus(pl_sd,0); - clif_displaymessage(fd,"Jobレベルを下げました"); + clif_displaymessage(fd,"Character's Job Level Lowered"); } } } @@ -1145,11 +1236,191 @@ return 1; } +//@chardyeclothes +//Description: Changes target characters clothes color. + if(strcmpi(command, "@chardyeclothes") == 0 && gm_level >= atcommand_config.chardyeclothes){ + sscanf(message, "%s%d %[^\n]", command, &x, temp1); + if ((pl_sd=map_nick2sd(temp1))!=NULL) { + if(x >= 0 && x <= 4){ + if(pl_sd->status.class == 12){ + clif_displaymessage(fd,"Cannot change Assassins clothing color."); + }else{ + pc_changelook(pl_sd,LOOK_CLOTHES_COLOR,x); + clif_displaymessage(fd,"Color Chnaged."); + } + } + } + return 1; + } +//@chardyehair +//Description: Changes target characters hair color. + if(strcmpi(command, "@chardyehair") == 0 && gm_level >= atcommand_config.chardyehair){ + sscanf(message, "%s%d %[^\n]", command, &x, temp1); + if ((pl_sd=map_nick2sd(temp1))!=NULL) { + if(x >= 0 && x <= 9){ + pc_changelook(pl_sd,LOOK_HAIR_COLOR,x); + clif_displaymessage(fd,"Color Chnaged."); + } + } + return 1; + } +//@charstylehair +//Description: Changes target characters hair style. + if(strcmpi(command, "@charstylehair") == 0 && gm_level >= atcommand_config.charstylehair){ + sscanf(message, "%s%d %[^\n]", command, &x, temp1); + if ((pl_sd=map_nick2sd(temp1))!=NULL) { + if(x >= 0 && x <= 20){ + pc_changelook(pl_sd,LOOK_HAIR,x); + clif_displaymessage(fd,"Color Chnaged."); + } + } + return 1; + } + +//@charzeny +//Description: Give a player Zeny + if(strcmpi(command, "@charzeny") == 0 && gm_level >= atcommand_config.charzeny){ + sscanf(message,"%s%d %[^\n]",command,&x,temp1); + if ((pl_sd=map_nick2sd(temp1))!=NULL) { + if (x>0 || pl_sd->status.zeny>=0 ) { + pc_getzeny(pl_sd, x); + pc_calcstatus(pl_sd,0); + clif_displaymessage(fd,"Character recieved Zeny."); + }else{ + clif_displaymessage(fd,"Character cannot have any more zeny."); + } + }else{ + clif_displaymessage(fd,"Character does not exist"); + } + return 1; + } +//@charstpoint +//Description: Give a player Stat points + if (strcmpi(command, "@charstpoint") == 0 && gm_level >= atcommand_config.charstpoint) { + sscanf(message,"%s%d %[^\n]",command,&i1,temp1); + if ((pl_sd=map_nick2sd(temp1))!=NULL) { + if (i1>0 || pl_sd->status.status_point+i1>=0) { + pl_sd->status.status_point += i1; + clif_updatestatus(pl_sd,SP_STATUSPOINT); + pc_calcstatus(pl_sd,0); + clif_displaymessage(fd,"Character recieved stat point(s)."); + }else{ + clif_displaymessage(fd,"Charaster does not exist."); + } + } + return 1; + } +//@charskpoint +//Description: Give a player Skill points + if (strcmpi(command, "@charskpoint") == 0 && gm_level >= atcommand_config.charskpoint) { + sscanf(message,"%s%d %[^\n]",command,&i1,temp1); + if ((pl_sd=map_nick2sd(temp1))!=NULL) { + if (i1>0 || pl_sd->status.skill_point+i1>=0) { + pl_sd->status.skill_point += i1; + clif_updatestatus(sd,SP_SKILLPOINT); + pc_calcstatus(pl_sd,0); + clif_displaymessage(fd,"Character recieved skill point(s)."); + }else{ + clif_displaymessage(fd,"Charaster does not exist."); + } + } + return 1; + } +//Added by RoVeRT - October 10, 2003 +//@resetstat +//resets all stats to 1 and gives points + if (strcmpi(command, "@resetstat") == 0 && gm_level >= atcommand_config.resetstat) { + sscanf(message,"%s",command); + pc_resetstate(sd); + clif_displaymessage(fd,"Your stats have been reset."); + return 1; + } + +//Added by RoVeRT - October 10, 2003 +//@resetskill +//resets all skills to 0 and gives points + if (strcmpi(command, "@resetskill") == 0 && gm_level >= atcommand_config.resetskill) { + sscanf(message,"%s",command); + pc_resetskill(sd); + clif_displaymessage(fd,"Your skills have been reset."); + return 1; + } +//Added by RoVeRT - October 10, 2003 +//@charresetstat +//resets all stats to 1 and gives points + if (strcmpi(command, "@charresetstat") == 0 && gm_level >= atcommand_config.charresetstat) { + sscanf(message,"%s %[^\n]",command,temp1); + if ((pl_sd=map_nick2sd(temp1))!=NULL) { + pc_resetstate(pl_sd); + clif_updatestatus(pl_sd,SP_STATUSPOINT); + clif_displaymessage(fd,"Your stats have been reset."); + }else{ + clif_displaymessage(fd,"Charaster does not exist."); + } + return 1; + } + +//Added by RoVeRT - October 10, 2003 +//@charresetskill +//resets all skills to 0 and gives points + if (strcmpi(command, "@charresetskill") == 0 && gm_level >= atcommand_config.charresetskill) { + sscanf(message,"%s %[^\n]",command,temp1); + if ((pl_sd=map_nick2sd(temp1))!=NULL) { + pc_resetskill(pl_sd); + clif_updatestatus(pl_sd,SP_SKILLPOINT); + clif_displaymessage(fd,"Your skills have been reset."); + }else{ + clif_displaymessage(fd,"Charaster does not exist."); + } + return 1; + } + +//Added by RoVeRT - October 24, 2003 +//@reloaditemdb +//resets all skills to 0 and gives points + if (strcmpi(command, "@reloaditemdb") == 0 && gm_level == 99) { + do_init_itemdb(); + clif_displaymessage(fd,"Item DB reloaded"); + return 1; + } + + +//Added by RoVeRT - October 10, 2003 +//@chardelitem +//resets all skills to 0 and gives points + if (strcmpi(command, "@chardelitem") == 0 && gm_level == 99) { + sscanf(message,"%s%s %[^\n]",command,temp0,temp1); + if ((pl_sd=map_nick2sd(temp1))!=NULL) { + struct item_data *item_data; + int itid; + if(y==0) y=1; //個数指定が無かったら1個にするbyれあ + + if( (x=atoi(temp0))>0 ) + x=((item_data=itemdb_search(x))?x:0); + else if( (item_data=itemdb_searchname(temp0))!=NULL ) + x=item_data->nameid; + + if( x>0 ) { + itid = pc_search_inventory(pl_sd, x); + if(itid >= 0){ + pc_delitem(pl_sd, itid, 1,0); + clif_displaymessage(pl_sd->fd,"Item Removed."); + clif_displaymessage(fd,"Item Removed."); + } else + clif_displaymessage(fd,"Player does not have Item."); + } else + clif_displaymessage(fd,"Item does not exist."); + }else{ + clif_displaymessage(fd,"Charaster does not exist."); + } + return 1; + } + if(strcmpi(command, "@questskill") == 0 && gm_level >= atcommand_config.questskill){ sscanf(message, "%s %d", command, &x); if(skill_get_inf2(x)&0x01){ pc_skill(sd,x,1,0); - clif_displaymessage(fd,"クエストスキルを覚えました"); + clif_displaymessage(fd,"ou have learned the skill."); } return 1; } @@ -1160,10 +1431,11 @@ sd->status.skill[x].lv=0; sd->status.skill[x].flag=0; clif_skillinfoblock(sd); - clif_displaymessage(fd,"スキルを忘れました"); + clif_displaymessage(fd,"You have forgotten the skill."); } return 1; } + if(strcmpi(command, "@spiritball") == 0 && gm_level >= atcommand_config.spiritball){ sscanf(message, "%s %d", command, &x); if(x>=0 && x<=0x7FFF){ @@ -1175,24 +1447,42 @@ return 1; } - if(strcmpi(command, "@party") == 0 && gm_level >= atcommand_config.party){ - if(sscanf(message, "%s %[^\n]", command, moji) >= 2) { - party_create(sd,moji); - } + if(strcmpi(command, "@hatch") == 0 && gm_level >= atcommand_config.hatch){ + clif_sendegg(sd); return 1; } - if(strcmpi(command, "@guild") == 0 && gm_level >= atcommand_config.guild){ - if(sscanf(message, "%s %[^\n]", command, moji) >= 2) { - int temp = battle_config.guild_emperium_check; - battle_config.guild_emperium_check = 0; - guild_create(sd,moji); - battle_config.guild_emperium_check = temp; - } + + if(strcmpi(command, "@skillall") == 0 && gm_level >= 99){ + int i; + for(i=1;i<158;i++) + sd->status.skill[i].lv = skill_get_max(i); + for(i=210;i<291;i++) + sd->status.skill[i].lv = skill_get_max(i); + for(i=304;istatus.skill[i].lv = skill_get_max(i); + + pc_calcstatus(sd,0); + clif_skillinfoblock(sd); return 1; } - } + if(strcmpi(command, "@test") == 0 && gm_level >= 99){ + sscanf(message, "%s %s", command, temp0); +// i1 = pc_checkequip(sd,x); +// i2 = sd->status.inventory[pc_search_inventory(sd, i1)].amount; +// sprintf(moji,"Item: %d Qty: %d",i1,i2); +// clif_displaymessage(fd, moji); +//clif_status_change((struct block_list *)sd,x,y); + +skill_castend_map( sd, 27, temp0); + + + return 1; + } + + + } return 0; } @@ -1218,8 +1508,8 @@ } data[] ={ { "broadcast",&atcommand_config.broadcast }, { "local_broadcast",&atcommand_config.local_broadcast }, - { "mapmove",&atcommand_config.mapmove }, { "resetstate",&atcommand_config.resetstate }, + { "mapmove",&atcommand_config.mapmove }, { "rura+",&atcommand_config.rurap }, { "rura",&atcommand_config.rura }, { "where",&atcommand_config.where }, @@ -1239,16 +1529,14 @@ { "kami",&atcommand_config.kami }, { "heal",&atcommand_config.heal }, { "item",&atcommand_config.item }, - { "itemcheck",&atcommand_config.itemcheck }, { "itemreset",&atcommand_config.itemreset }, + { "itemcheck",&atcommand_config.itemcheck }, { "lvup",&atcommand_config.lvup }, { "joblvup",&atcommand_config.joblvup }, { "help",&atcommand_config.help }, { "GM",&atcommand_config.gm }, { "pvpoff",&atcommand_config.pvpoff }, { "pvpon",&atcommand_config.pvpon }, - { "gvgoff",&atcommand_config.gvgoff }, - { "gvgon",&atcommand_config.gvgon }, { "model",&atcommand_config.model }, { "go",&atcommand_config.go }, { "monster",&atcommand_config.monster }, @@ -1282,11 +1570,17 @@ { "charbaselvl",&atcommand_config.charbaselvl }, { "charjlvl",&atcommand_config.charjlvl }, { "kick",&atcommand_config.kick }, + { "chardyeclothes", &atcommand_config.chardyeclothes}, + { "chardyehair", &atcommand_config.chardyehair}, + { "charstylehair", &atcommand_config.charstylehair}, + { "resetstat", &atcommand_config.resetstat}, + { "resetskill", &atcommand_config.resetskill}, + { "charresetstat", &atcommand_config.charresetstat}, + { "charresetskill", &atcommand_config.charresetskill}, { "questskill",&atcommand_config.questskill }, { "lostskill",&atcommand_config.lostskill }, { "spiritball",&atcommand_config.spiritball }, - { "party",&atcommand_config.party }, - { "guild",&atcommand_config.guild }, + { "hatch",&atcommand_config.hatch }, }; if(line[0] == '/' && line[1] == '/') diff -rNu athena-dev-2.1.1-mod0641/map/atcommand.h 641mod/map/atcommand.h --- athena-dev-2.1.1-mod0641/map/atcommand.h Fri Dec 12 18:39:58 2003 +++ 641mod/map/atcommand.h Thu Dec 18 17:57:49 2003 @@ -75,8 +75,17 @@ int questskill; int lostskill; int spiritball; - int party; - int guild; + int chardyeclothes; + int chardyehair; + int charstylehair; + int charzeny; + int charstpoint; + int charskpoint; + int resetstat; + int resetskill; + int charresetstat; + int charresetskill; + int hatch; } atcommand_config; #define ATCOMMAND_CONF_FILENAME "conf/atcommand_athena.conf" diff -rNu athena-dev-2.1.1-mod0641/map/battle.c 641mod/map/battle.c --- athena-dev-2.1.1-mod0641/map/battle.c Wed Dec 24 01:15:40 2003 +++ 641mod/map/battle.c Wed Dec 24 23:32:16 2003 @@ -578,6 +578,8 @@ skill_status_change_end(target,SC_STONE,-1); if(sc_data[SC_SLEEP].timer!=-1) skill_status_change_end(target,SC_SLEEP,-1); + if(sc_data[SC_SPELLBREAKER].timer!=-1) + skill_castcancel(target); } @@ -593,7 +595,8 @@ struct map_session_data *tsd=(struct map_session_data *)target; if(tsd->skilltimer!=-1){ // 詠唱妨害 // フェンカードや妨害されないスキルかの検査 - if( !pc_check_equip_dcard(tsd,4077) && tsd->state.skillcastcancel) +// if( !pc_check_equip_dcard(tsd,4077) && tsd->state.skillcastcancel) + if( tsd->no_dispell==0 && tsd->state.skillcastcancel) // RoVeRT skill_castcancel(target); } return pc_damage(bl,tsd,damage); @@ -687,6 +690,11 @@ // ニューマ damage=0; } + if(sc_data[SC_DEFENDER].timer!=-1 && damage>0 && + flag&BF_WEAPON && flag&BF_LONG ){ + // ニューマ + damage-=damage*sc_data[SC_DEFENDER].val2/100; + } if(sc_data[SC_AETERNA].timer!=-1 && damage>0){ // レックスエーテルナ damage<<=1; @@ -937,6 +945,7 @@ if(cri < 1) cri = 1; } + if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 ) // 睡眠中はクリティカルが倍に cri <<=1; @@ -995,6 +1004,9 @@ div_=t_size+1; damage*=div_; break; + case KN_BRANDISHSPEAR: // スピアブーメラン + damage = damage*(100+ 20*skill_lv)/100; + break; case KN_SPEARSTAB: // スピアスタブ damage = damage*(100+ 15*skill_lv)/100; blewcount=6; @@ -1006,6 +1018,10 @@ damage = damage*(100+ 50*skill_lv)/100; //blewcount=4;skill.cで吹き飛ばしやってみた break; + case AS_SPLASHER: + damage = damage*(200+ 20*skill_lv)/100; + div_=6; + break; case AS_SONICBLOW: // ソニックブロウ damage = damage*(300+ 50*skill_lv)/100; div_=8; @@ -1147,6 +1163,7 @@ if(skill_num==TF_POISON){ damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) ); } + if(skill_num==MC_CARTREVOLUTION){ damage = battle_attr_fix(damage, 0, battle_get_element(target) ); } @@ -1168,7 +1185,6 @@ if(damage > 0) damage = 1; } - if(battle_config.skill_min_damage) { if(div_ < 255) { if(damage > 0 && damage < div_) @@ -1260,7 +1276,8 @@ // サイズ修正 // ペコ騎乗していて、槍で攻撃した場合は中型のサイズ修正を100にする // ウェポンパーフェクション,ドレイクC - if( pc_check_equip_wcard(sd,4137) ){ // ドレイクカード +// if( pc_check_equip_wcard(sd,4137) ){ // ドレイクカード + if( sd->perfect_damage!=0 ){ atkmax = watk; atkmax_ = watk_; } @@ -1351,7 +1368,6 @@ damage2 += atkmin_ ; if(sd->weapontype1 == 11 && sd->arrow_atk > 0) damage += rand()%(sd->arrow_atk+1); - // スキル修正1(攻撃力倍化系) // オーバートラスト(+5% 〜 +25%),他攻撃系スキルの場合ここで補正 // バッシュ,マグナムブレイク, @@ -1397,6 +1413,9 @@ div_=t_size+1; damage*=div_; break; + case KN_BRANDISHSPEAR: // スピアブーメラン + damage = damage*(100+ 20*skill_lv)/100; + break; case KN_SPEARSTAB: // スピアスタブ damage = damage*(100+ 15*skill_lv)/100; blewcount=6; @@ -1412,6 +1431,10 @@ damage = damage*(300+ 50*skill_lv)/100; div_=8; break; + case AS_SPLASHER: + damage = damage*(200+ 20*skill_lv)/100; + div_=6; + break; case AC_CHARGEARROW: // チャージアロー if(sd->weapontype1 != 11 && sd->arrow_atk > 0) damage += rand()%(sd->arrow_atk+1); @@ -1526,7 +1549,7 @@ div_ = 255; //三段掌用に… damage = damage * (100 + 20 * pc_checkskill(sd, MO_TRIPLEATTACK)) / 100; } - + if( skill_num!=NPC_CRITICALSLASH ){ // 対 象の防御力によるダメージの減少 // ディバインプロテクション(ここでいいのかな?) @@ -1603,7 +1626,6 @@ damage=damage*cardfix/100; damage2=damage2*cardfix/100; } - // 属 性の適用 damage=battle_attr_fix(damage,s_ele, battle_get_element(target) ); damage2=battle_attr_fix(damage2,s_ele_, battle_get_element(target) ); @@ -1659,10 +1681,27 @@ if(skill_num==TF_POISON){ damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) ); } + if(skill_num==MC_CARTREVOLUTION){ damage = battle_attr_fix(damage, 0, battle_get_element(target) ); } +// start RoVeRT + if (sd->bonus3[TYPE_HP].val1 && rand()%100 < sd->bonus3[TYPE_HP].val2){ + int hp = damage * sd->bonus3[TYPE_HP].val1/100; + pc_heal(sd, hp,0); // val2 % chance to recover val1 % of damage as HP + } + + if (sd->bonus3[TYPE_SP].val1 && rand()%100 < sd->bonus3[TYPE_SP].val2){ + int sp = damage * sd->bonus3[TYPE_SP].val1/100; + pc_heal(sd, 0,sp); // val2 % chance to recover val1 % of damage as SP + } + + if (pc_check_equip_wcard(sd,4163) && (rand()%100 < 4)) { + damage *=3; // Executioner Card - 4% chance of +300% damage + } +// end RoVeRT + // 完全回避の判定 if( skill_num==0 && tsd!=NULL && rand()%100 < tsd->flee2){ damage=damage2=0; @@ -1682,7 +1721,6 @@ if(damage2 > 0) damage2 = 1; } - if(battle_config.skill_min_damage) { if(div_ < 255) { if(damage > 0 && damage < div_) @@ -1872,9 +1910,10 @@ if(div_>1 && skill_num != WZ_VERMILION) damage*=div_; - if( target->type==BL_PC && - pc_check_equip_dcard((struct map_session_data *)target,4128) ) - damage=0; // 黄 金蟲カード(魔法ダメージ0) + if( target->type==BL_PC) +// pc_check_equip_dcard((struct map_session_data *)target,4128) ) + if (rand()%100 < ((struct map_session_data *)target)->refmagic) // RoVeRT + damage=0; // 黄 金蟲カード(魔法ダメージ0) damage=battle_calc_damage(target,damage,aflag); // 最終修正 @@ -1886,6 +1925,12 @@ damage = div_; } + if (target->type == BL_MOB) { + struct mob_data* tmd=(struct mob_data *)target; + if (tmd->class == 1288) + damage = 0; + } + md.damage=damage; md.div_=div_; md.amotion=battle_get_amotion(bl); @@ -1974,6 +2019,12 @@ damage = div_; } + if (target->type == BL_MOB) { + struct mob_data* tmd=(struct mob_data *)target; + if (tmd->class == 1288) + damage = 0; + } + md.damage=damage; md.div_=div_; md.amotion=battle_get_amotion(bl); @@ -2040,6 +2091,7 @@ } else { clif_arrow_fail(sd,0); + pc_stopattack(sd); // RoVeRT return 0; } } diff -rNu athena-dev-2.1.1-mod0641/map/clif.c 641mod/map/clif.c --- athena-dev-2.1.1-mod0641/map/clif.c Wed Dec 24 00:17:20 2003 +++ 641mod/map/clif.c Tue Dec 23 13:36:02 2003 @@ -5018,6 +5018,7 @@ */ void clif_parse_Wis(int fd,struct map_session_data *sd) { + if(atcommand(fd,sd,RFIFOP(fd,28))) return; intif_wis_message(sd,RFIFOP(fd,4),RFIFOP(fd,28),RFIFOW(fd,2)-28); /* struct map_session_data *dstsd; @@ -6003,6 +6004,40 @@ } /*========================================== + * GM funtions + *------------------------------------------ + */ +void clif_parse_Shift(int fd,struct map_session_data *sd) // RoVeRT +{ + struct map_session_data *pl_sd; + + if ((pl_sd=map_nick2sd(RFIFOP(fd,2)))!=NULL && pc_isGM(sd) >= atcommand_config.jumpto) + pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3); +} + +void clif_parse_Recall(int fd,struct map_session_data *sd) // RoVeRT +{ + struct map_session_data *pl_sd; + + if ((pl_sd=map_nick2sd(RFIFOP(fd,2)))!=NULL && pc_isGM(sd) >= atcommand_config.recall) { + if(pc_isGM(sd) > pc_isGM(pl_sd)) + pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); + } +} + +void clif_parse_Hide(int fd,struct map_session_data *sd) // RoVeRT +{ + if (pc_isGM(sd) >= atcommand_config.hide) { +// if(sd->status.option&0x40){ +// sd->status.option ^= 0x40; +// }else{ + sd->status.option ^= 0x40; +// } + clif_changeoption(&sd->bl); + } +} + +/*========================================== * GMによるチャット禁止時間参照(?) *------------------------------------------ */ @@ -6232,7 +6267,8 @@ clif_parse_ResetChar, NULL,NULL,NULL,NULL, clif_parse_LGMmessage, - NULL,NULL, + clif_parse_Hide, // /hide + NULL, clif_parse_CatchPet, // 1a0 NULL, @@ -6250,7 +6286,12 @@ // 1b0 NULL,NULL, clif_parse_OpenVending, - NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, + NULL,NULL,NULL,NULL,NULL, NULL,NULL, + clif_parse_Shift, // /remove + clif_parse_Shift, // /shift + clif_parse_Recall, // /recall + clif_parse_Recall, // /summon + NULL,NULL, // 1c0 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, diff -rNu athena-dev-2.1.1-mod0641/map/map.c 641mod/map/map.c --- athena-dev-2.1.1-mod0641/map/map.c Sun Dec 14 23:44:40 2003 +++ 641mod/map/map.c Thu Dec 18 15:01:10 2003 @@ -1139,7 +1139,7 @@ while(fgets(line,1020,fp)){ if(line[0] == '/' && line[1] == '/') continue; - i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2); + i=sscanf(line,"%[^:]: %[^\r\n\t]",w1,w2); if(i!=2) continue; if(strcmpi(w1,"userid")==0){ diff -rNu athena-dev-2.1.1-mod0641/map/map.h 641mod/map/map.h --- athena-dev-2.1.1-mod0641/map/map.h Tue Dec 23 22:48:08 2003 +++ 641mod/map/map.h Tue Dec 23 13:53:46 2003 @@ -104,6 +104,10 @@ struct pet_db; struct item_data; +struct combo_bonus { // RoVeRT + int val1,val2; +}; + struct map_session_data { struct block_list bl; struct { @@ -179,6 +183,10 @@ int spirit_timer[10]; unsigned short combo_flag, skill_old; unsigned int combo_delay1, combo_delay2, combo_delay3, triple_delay; + struct combo_bonus bonus3[3]; // RoVeRT + int refphysical,refmagic; // RoVeRT + int indestructible[2]; // RoVeRT + int reincarnation,perfect_damage,splash_attack,no_dispell,no_gemstone; // RoVeRT int reg_num; struct script_reg *reg; @@ -213,6 +221,11 @@ char eventqueue[MAX_EVENTQUEUE][50]; int eventtimer[MAX_EVENTTIMER]; + + int last_skillid,last_skilllv; // RoVeRT + int cast_skillid,cast_skilllv; // RoVeRT + int autospell_tick; // RoVeRT + int fwall_count,iwall_count; // RoVeRT }; struct npc_item_list { @@ -363,6 +376,13 @@ SP_CRITICAL_DEF,SP_MVP_ADD_ATK_RATE,SP_NEAR_ATK_DEF,SP_LONG_ATK_DEF, //75-78 SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_MATK, //79-81 SP_CARTINFO=99, // 99 + + SP_REFMAGIC, SP_DAMAGE2HPSP,SP_ONDEATH, // 100-102 RoVeRT + SP_REINCARNATION, SP_PERFECTDAMAGE, SP_INDESTRUCTIBLE, SP_SPLASHATTACK,SP_NODISPELL,SP_NOGEMSTONE, // 103-108 RoVeRT +}; + +enum { + TYPE_HP,TYPE_SP,TYPE_MEAT,TYPE_ZENY, }; enum { diff -rNu athena-dev-2.1.1-mod0641/map/mob.c 641mod/map/mob.c --- athena-dev-2.1.1-mod0641/map/mob.c Mon Dec 15 23:35:58 2003 +++ 641mod/map/mob.c Thu Dec 18 16:09:42 2003 @@ -26,7 +26,7 @@ #define MOB_LAZYMOVEPERC 50 // 手抜きモードMOBの移動確率(千分率) #define MOB_LAZYWARPPERC 20 // 手抜きモードMOBのワープ確率(千分率) -struct mob_db mob_db[2000]; +struct mob_db mob_db[3030]; /*========================================== * ローカルプロトタイプ宣言 (必要な物のみ) @@ -89,7 +89,7 @@ int x,int y,const char *mobname,int class,int amount,const char *event) { struct mob_data *md; - int m; + int m,i; if(strcmp(mapname,"this")==0) m=sd->bl.m; @@ -110,7 +110,7 @@ if(x<=0) x=sd->bl.x; if(y<=0) y=sd->bl.y; - for(;amount>0;amount--){ + for(i=amount;i>0;i--){ md=malloc(sizeof(struct mob_data)); if(md==NULL){ printf("mob_once_spawn: out of memory !\n"); @@ -154,8 +154,12 @@ int x0,int y0,int x1,int y1, const char *mobname,int class,int amount,const char *event) { - int x,y,i,c,max,lx=-1,ly=-1,id=0; - int m=map_mapname2mapid(mapname); + int x,y,i,c,max,lx=-1,ly=-1,id=0,m; + + if(strcmp(mapname,"this")==0) + m=sd->bl.m; + else + m=map_mapname2mapid(mapname); max=(y1-y0+1)*(x1-x0+1)*3; if(max>1000)max=1000; @@ -355,6 +359,22 @@ if( mobskill_use(md,tick,-2) ) // スキル使用 return 0; + if(sd->sc_data[SC_AUTOCOUNTER].timer != -1){ + pc_attack(sd,md->bl.id,0); + skill_status_change_end(&sd->bl,SC_AUTOCOUNTER,-1); + return 0; + } + if(sd->sc_data[SC_AUTOGUARD].timer != -1){ + pc_attack(sd,md->bl.id,0); + skill_status_change_end(&sd->bl,SC_AUTOGUARD,-1); + return 0; + } + if(sd->sc_data[SC_REFLECTSHIELD].timer != -1){ + pc_attack(sd,md->bl.id,0); + skill_status_change_end(&sd->bl,SC_AUTOCOUNTER,-1); + return 0; + } + battle_weapon_attack(&md->bl,&sd->bl,tick,0); md->attackabletime = tick + mob_get_adelay(md); @@ -407,7 +427,7 @@ case MS_ATTACK: tick = gettick(); i=DIFF_TICK(md->attackabletime,tick); - if(i>0 && i<2000) + if(i>0 && i<3030) md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0); else if(type) md->timer=add_timer(tick+mob_db[md->class].amotion,mob_timer,md->bl.id,0); @@ -1838,7 +1858,7 @@ struct mob_data *md; int bx=md2->bl.x,by=md2->bl.y,m=md2->bl.m; - if(class<=1000 || class>2000) // 値が異常なら召喚を止める + if(class<=1000 || class>3030) // 値が異常なら召喚を止める return 0; for(;amount>0;amount--){ @@ -2312,7 +2332,7 @@ } class=atoi(str[0]); - if(class>=2000 || class==0) + if(class>=3030 || class==0) continue; memcpy(mob_db[class].name,str[1],24); @@ -2390,7 +2410,7 @@ int class; if(line[0] == '/' && line[1] == '/') continue; - if( (class=atoi(line))>1000 && class<2000 ) + if( (class=atoi(line))>1000 && class<3030 ) mob_db[class].summonflag=1; } fclose(fp); diff -rNu athena-dev-2.1.1-mod0641/map/npc.c 641mod/map/npc.c --- athena-dev-2.1.1-mod0641/map/npc.c Tue Dec 2 18:24:06 2003 +++ 641mod/map/npc.c Thu Dec 18 15:02:56 2003 @@ -157,6 +157,41 @@ } /*========================================== + * OnTimer NPC event - by RoVeRT + *------------------------------------------ + */int npc_do_ontimer_sub(void *key,void *data,va_list ap) +{ + char *p=(char *)key; + struct event_data *ev=(struct event_data *)data; + int *c=va_arg(ap,int *); + struct map_session_data *sd=va_arg(ap,struct map_session_data *); + int option=va_arg(ap,int); + int tick=0; + char temp[10]; + char event[100]; + + if(ev->nd->bl.id==(int)*c && (p=strchr(p,':')) && p && strncasecmp("::OnTimer",p,8)==0 ){ + sscanf(&p[9],"%s",temp); + tick=atoi(temp); + + strcpy( event, ev->nd->name); + strcat( event, p); + + if (option!=0) { + pc_addeventtimer(sd,tick,event); + } else { + pc_deleventtimer(sd,event); + } + } + return 0; +} +int npc_do_ontimer(int npc_id, struct map_session_data *sd, int option) +{ + strdb_foreach(ev_db,npc_do_ontimer_sub,&npc_id,sd,option); + return 0; +} + +/*========================================== * イベント型のNPC処理 *------------------------------------------ */ diff -rNu athena-dev-2.1.1-mod0641/map/npc.h 641mod/map/npc.h --- athena-dev-2.1.1-mod0641/map/npc.h Thu Oct 23 12:12:54 2003 +++ 641mod/map/npc.h Thu Dec 18 16:14:14 2003 @@ -22,6 +22,7 @@ void npc_addsrcfile(char *); int do_init_npc(void); int npc_event_do_oninit(void); +int npc_do_ontimer(int,struct map_session_data *,int); #endif diff -rNu athena-dev-2.1.1-mod0641/map/pc.c 641mod/map/pc.c --- athena-dev-2.1.1-mod0641/map/pc.c Wed Dec 24 23:00:42 2003 +++ 641mod/map/pc.c Wed Dec 24 23:31:33 2003 @@ -164,7 +164,8 @@ } } else - sd->spiritball++; + sd->spiritball+=sd->skilllv; + if (sd->spiritball > max) sd->spiritball = max; sd->spirit_timer[sd->spiritball-1] = add_timer(gettick()+interval,pc_spiritball_timer,sd->bl.id,0); clif_spiritball(sd); @@ -209,7 +210,8 @@ { //----------------------- // 死亡した - if( pc_check_equip_dcard(sd,4144) ) { // オシリスカード +// if( pc_check_equip_dcard(sd,4144) ) { // オシリスカード + if( sd->reincarnation!=0) { // RoVeRT sd->status.hp=sd->status.max_hp; sd->status.sp=sd->status.max_sp; } @@ -282,7 +284,8 @@ int pc_makesavestatus(struct map_session_data *sd) { // 服の色は色々弊害が多いので保存対象にはしない - sd->status.clothes_color=0; + //This line disabled clothes color saving - Sara + //sd->status.clothes_color=0; // 死亡状態だったのでhpを1、位置をセーブ場所に変更 if(pc_isdead(sd)){ @@ -767,6 +770,12 @@ sd->arrow_atk=0; sd->arrow_ele=0; sd->nhealhp=sd->nhealsp=sd->nshealhp=sd->nshealsp=sd->nsshealhp=sd->nsshealsp=0; + sd->refmagic=0; // RoVeRT + sd->reincarnation=0; // RoVeRT + sd->perfect_damage=0; // RoVeRT + sd->splash_attack=0; // RoVeRT + sd->no_dispell=0; // RoVeRT + sd->no_gemstone=0; // RoVeRT memset(sd->addele,0,sizeof(sd->addele)); memset(sd->addrace,0,sizeof(sd->addrace)); memset(sd->addsize,0,sizeof(sd->addsize)); @@ -777,6 +786,8 @@ memset(sd->subrace,0,sizeof(sd->subrace)); memset(sd->addeff,0,sizeof(sd->addeff)); memset(sd->reseff,0,sizeof(sd->reseff)); + memset(sd->bonus3,0,sizeof(sd->bonus3)); // RoVeRT + memset(sd->indestructible,0,sizeof(sd->indestructible)); // RoVeRT sd->wcard_count=0; sd->dcard_count=0; @@ -1034,7 +1045,7 @@ // 最大SP計算 sd->status.max_sp += ((sp_coefficient[sd->status.class] * bl / 10) + 10) * (100 + sd->paramc[3]) / 100 + sd->parame[3]; if(sd->sprate!=100) - sd->status.max_sp = sd->status.max_sp*sd->sprate/100; + sd->status.max_sp=sd->status.max_sp*sd->sprate/100; if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp) sd->status.max_sp = battle_config.max_sp; @@ -1083,7 +1094,7 @@ if(sd->sc_data[SC_PROVOKE].timer!=-1){ // プロボック sd->def2 = sd->def2*(100-6*sd->sc_data[SC_PROVOKE].val1)/100; sd->watk = sd->watk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100; - } + } // re-add lv 4 weap chk 2 drum if(sd->sc_data[SC_DRUMBATTLE].timer!=-1){ // 戦 太鼓の響き sd->watk += sd->sc_data[SC_DRUMBATTLE].val2; sd->def += sd->sc_data[SC_DRUMBATTLE].val3; @@ -1115,6 +1126,8 @@ if(sd->sc_data[SC_WHISTLE].timer!=-1){ // 口笛 sd->flee += sd->sc_data[SC_WHISTLE].val2 * sd->flee/100; sd->flee2+= sd->sc_data[SC_WHISTLE].val2 * sd->flee2/100; + sd->status.sp--; + clif_updatestatus(sd,SP_SP); } if(sd->sc_data[SC_HUMMING].timer!=-1) // ハミング sd->hit += sd->sc_data[SC_HUMMING].val2 * sd->hit/100; @@ -1161,6 +1174,9 @@ sd->aspd = sd->aspd * 125 / 100; sd->speed = sd->speed * 125 / 100; } + if(sd->sc_data[SC_POISON].timer!=-1){ + sd->status.hp -= sd->hprate /100; + } /* if(sd->sc_data[SC_DEFENDER].timer!=-1) // Defender sd->def2 += ((sd->status.vit+20)*skill*10)/100; if(sd->sc_data[SC_CASTCANCEL].timer!=-1){ // Cast Cancel @@ -1398,6 +1414,27 @@ if(sd->state.lr_flag == 0) sd->double_rate += val; break; + case SP_ATTACKRANGE: // bAtkRange = 56 + sd->attackrange+=val; + break; + case SP_REFMAGIC: // bRefMagic = 82 + sd->refmagic=val; + break; + case SP_REINCARNATION: // 85 + sd->reincarnation=1; + break; + case SP_PERFECTDAMAGE: // 86 + sd->perfect_damage=1; + break; + case SP_SPLASHATTACK: // 88 + sd->splash_attack=(val>10?10:val); + break; + case SP_NODISPELL: // 89 + sd->no_dispell=1; + break; + case SP_NOGEMSTONE: // 90 + sd->no_gemstone=1; + break; default: printf("pc_bonus: unknown type %d %d !\n",type,val); break; @@ -1444,6 +1481,9 @@ case SP_RESEFF: sd->reseff[type2]+=val; break; + case SP_INDESTRUCTIBLE: + sd->indestructible[type2]=1; + break; default: printf("pc_bonus2: unknown type %d %d %d!\n",type,type2,val); break; @@ -1452,6 +1492,25 @@ return 0; } +/*========================================== + * 装 備品による能力等のボーナス設定 + *------------------------------------------ + */ +int pc_bonus3(struct map_session_data *sd,int type,int type3,int val,int chance) // RoVeRT +{ + switch(type){ + case SP_DAMAGE2HPSP: + case SP_ONDEATH: + sd->bonus3[type3].val1+=val; + sd->bonus3[type3].val2+=chance; + break; + default: + printf("pc_bonus3: unknown type %d %d %d %d!\n",type,type3,val,chance); + break; + } + + return 0; +} /*========================================== * スクリプトによるスキル所得 @@ -2112,6 +2171,7 @@ } } clif_changemap(sd,mapname,x,y); + sd->fwall_count=0; } memcpy(sd->mapname,mapname,16); @@ -2973,7 +3033,7 @@ if(pc_issit(sd)) pc_setstand(sd); // 歩 いていたら足を止める - if(sd->sc_data[SC_ENDURE].timer == -1) + if(sd->sc_data[SC_ENDURE].timer == -1 && sd->status.skill[SM_ENDURE].flag!=1) // RoVeRT pc_stop_walking(sd,3); sd->status.hp-=damage; @@ -3686,6 +3746,7 @@ else clif_equipitemack(sd,n,pos,1); +//FIX int arrow=pc_search_inventory(sd,pc_checkequip(sd,0x8000)); // RoVeRT for(i=0;i<11;i++) { if(pos & equip_pos[i]) sd->equip_index[i] = n; @@ -3744,6 +3805,10 @@ clif_changelook(&sd->bl,LOOK_SHOES,0); pc_checkallowskill(sd,n); // 装備品でスキルか解除されるかチェック +/*//FIX if (itemdb_look(sd->status.inventory[n].nameid) == 11 && arrow){ // RoVeRT + clif_arrowequip(sd,arrow); + sd->status.inventory[arrow].equip=32768; + }*/ pc_calcstatus(sd,0); return 0; @@ -3964,6 +4029,8 @@ a = natural_heal_diff_tick; if(pc_issit(sd)) a += a; + if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // RoVeRT + a += a; return a; } @@ -3971,7 +4038,10 @@ static int pc_natural_heal_hp(struct map_session_data *sd) { int bhp; - int inc_num,bonus,skill,hp_flag; + int inc_num,bonus,skill,hp_flag,dtick; + + if (sd->sc_data[SC_TRICKDEAD].timer != -1) // RoVeRT + return 0; if(pc_checkoverhp(sd)) { sd->hp_sub = sd->inchealhptick = 0; @@ -3984,7 +4054,7 @@ if(sd->walktimer == -1) { inc_num = pc_hpheal(sd); sd->hp_sub += inc_num; - sd->inchealhptick += inc_num; + sd->inchealhptick += pc_issit(sd)?inc_num/2:inc_num; // RoVeRT } else if(hp_flag) { inc_num = pc_hpheal(sd); @@ -4016,10 +4086,11 @@ clif_updatestatus(sd,SP_HP); if(sd->nshealhp > 0) { - if(sd->inchealhptick >= battle_config.natural_heal_skill_interval && sd->status.hp < sd->status.max_hp) { + dtick = (sd->sc_data[SC_MAGNIFICAT].timer==-1 )?battle_config.natural_heal_skill_interval:battle_config.natural_heal_skill_interval*2; // RoVeRT + if(sd->inchealhptick >= dtick && sd->status.hp < sd->status.max_hp) { bonus = sd->nshealhp;; - while(sd->inchealhptick >= battle_config.natural_heal_skill_interval) { - sd->inchealhptick -= battle_config.natural_heal_skill_interval; + while(sd->inchealhptick >= dtick) { + sd->inchealhptick -= dtick; if(sd->status.hp + bonus <= sd->status.max_hp) sd->status.hp += bonus; else { @@ -4059,7 +4130,10 @@ static int pc_natural_heal_sp(struct map_session_data *sd) { int bsp; - int inc_num,bonus; + int inc_num,bonus,dtick; + + if (sd->sc_data[SC_TRICKDEAD].timer != -1) // RoVeRT + return 0; if(pc_checkoversp(sd)) { sd->sp_sub = sd->inchealsptick = 0; @@ -4072,7 +4146,7 @@ if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1) sd->sp_sub += inc_num; if(sd->walktimer == -1) - sd->inchealsptick += inc_num; + sd->inchealsptick += pc_issit(sd)?inc_num/2:inc_num; else sd->inchealsptick = 0; if(sd->sp_sub >= battle_config.natural_healsp_interval){ @@ -4092,10 +4166,11 @@ clif_updatestatus(sd,SP_SP); if(sd->nshealsp > 0) { - if(sd->inchealsptick >= battle_config.natural_heal_skill_interval && sd->status.sp < sd->status.max_sp) { + dtick = (sd->sc_data[SC_MAGNIFICAT].timer==-1 )?battle_config.natural_heal_skill_interval:battle_config.natural_heal_skill_interval*2; // RoVeRT + if(sd->inchealsptick >= dtick && sd->status.sp < sd->status.max_sp) { bonus = sd->nshealsp; - while(sd->inchealsptick >= battle_config.natural_heal_skill_interval) { - sd->inchealsptick -= battle_config.natural_heal_skill_interval; + while(sd->inchealsptick >= dtick) { + sd->inchealsptick -= dtick; if(sd->status.sp + bonus <= sd->status.max_sp) sd->status.sp += bonus; else { diff -rNu athena-dev-2.1.1-mod0641/map/pc.h 641mod/map/pc.h --- athena-dev-2.1.1-mod0641/map/pc.h Fri Dec 19 00:11:26 2003 +++ 641mod/map/pc.h Thu Dec 18 16:13:45 2003 @@ -70,6 +70,7 @@ int pc_calcstatus(struct map_session_data*,int); int pc_bonus(struct map_session_data*,int,int); int pc_bonus2(struct map_session_data *sd,int,int,int); +int pc_bonus3(struct map_session_data *sd,int,int,int,int); int pc_skill(struct map_session_data*,int,int,int); int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip); diff -rNu athena-dev-2.1.1-mod0641/map/script.c 641mod/map/script.c --- athena-dev-2.1.1-mod0641/map/script.c Fri Dec 19 00:39:00 2003 +++ 641mod/map/script.c Thu Dec 18 16:03:14 2003 @@ -3,6 +3,11 @@ //#define DEBUG_DISP //#define DEBUG_RUN +//following by RoVeRT +//updated getitem, delitem, countiem, checkweight to use either item names or numbers (ex. 717 = blue gem or Blue_Gemstone = blue gem) +//added npctimer +//added mapwarp + #include #include #include @@ -96,6 +101,7 @@ int buildin_cutin(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); // RoVeRT int buildin_skill(struct script_state *st); int buildin_getskilllv(struct script_state *st); int buildin_basicskillcheck(struct script_state *st); @@ -140,6 +146,8 @@ int buildin_pvpoff(struct script_state *st); int buildin_gvgon(struct script_state *st); int buildin_gvgoff(struct script_state *st); +int buildin_mapwarp(struct script_state *st); +int buildin_npctimer(struct script_state *st); void push_val(struct script_stack *stack,int type,int val); int run_func(struct script_state *st); @@ -161,16 +169,16 @@ {buildin_setlook,"setlook","ii"}, {buildin_set,"set","ii"}, {buildin_if,"if","igi"}, - {buildin_getitem,"getitem","ii"}, - {buildin_delitem,"delitem","ii"}, + {buildin_getitem,"getitem","si"}, + {buildin_delitem,"delitem","si"}, {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_countitem,"countitem","s"}, + {buildin_checkweight,"checkweight","si"}, {buildin_readparam,"readparam","i"}, {buildin_strcharinfo,"strcharinfo","i"}, {buildin_getequipname,"getequipname","i"}, @@ -184,6 +192,7 @@ {buildin_failedrefitem,"failedrefitem","i"}, {buildin_bonus,"bonus","ii"}, {buildin_bonus2,"bonus2","iii"}, + {buildin_bonus3,"bonus3","iiii"}, // RoVeRT {buildin_skill,"skill","ii*"}, {buildin_getskilllv,"getskilllv","i"}, {buildin_basicskillcheck,"basicskillcheck","*"}, @@ -226,8 +235,10 @@ {buildin_removemapflag,"removemapflag","si"}, {buildin_pvpon,"pvpon","s"}, {buildin_pvpoff,"pvpoff","s"}, - {buildin_pvpon,"gvgon","s"}, - {buildin_pvpoff,"gvgoff","s"}, + {buildin_gvgon,"gvgon","s"}, + {buildin_gvgoff,"gvgoff","s"}, + {buildin_mapwarp,"mapwarp","ssii"}, + {buildin_npctimer,"npctimer","i"}, {NULL,NULL,NULL} }; enum { @@ -1278,6 +1289,7 @@ sd->state.menu_or_input=0; if(st->end>st->start+2){ // 引数1個 int num=st->stack->stack_data[st->start+2].u.num; + if (num<0) num=0; if(str_buf[str_data[num].str]=='@' || str_buf[str_data[num].str]=='l') pc_setreg(sd,num,sd->npc_amount); else if(str_buf[str_data[num].str]=='$') @@ -1404,10 +1416,17 @@ */ int buildin_countitem(struct script_state *st) { - int nameid,count,i; + int count,i,nameid; + char *id; struct map_session_data *sd; + struct item_data *item_data; + + id=conv_str(st,& (st->stack->stack_data[st->start+2])); - nameid=conv_num(st,& (st->stack->stack_data[st->start+2])); + if( (nameid=atoi(id))>0 ) + nameid=((item_data=itemdb_exists(nameid))?nameid:0); + else if( (item_data=itemdb_searchname(id))!=NULL ) + nameid=item_data->nameid; sd=map_id2sd(st->rid); for(i=0,count=0;istack->stack_data[st->start+2])); + id=conv_str(st,& (st->stack->stack_data[st->start+2])); amount=conv_num(st,& (st->stack->stack_data[st->start+3])); + if( (nameid=atoi(id))>0 ) + nameid=((item_data=itemdb_exists(nameid))?nameid:0); + else if( (item_data=itemdb_searchname(id))!=NULL ) + nameid=item_data->nameid; + sd=map_id2sd(st->rid); if(itemdb_weight(nameid)*amount + sd->weight > sd->max_weight){ push_val(st->stack,C_INT,0); @@ -1448,16 +1474,24 @@ */ int buildin_getitem(struct script_state *st) { - int nameid,amount,flag; + int nameid,amount,flag = 0; struct item item_tmp; struct map_session_data *sd; + char *id; + struct item_data *item_data; sd = map_id2sd(st->rid); - nameid=conv_num(st,& (st->stack->stack_data[st->start+2])); + id=conv_str(st,& (st->stack->stack_data[st->start+2])); amount=conv_num(st,& (st->stack->stack_data[st->start+3])); - if(nameid<0) // ランダム + if( (nameid=atoi(id))>0 ) + nameid=((item_data=itemdb_exists(nameid))?nameid:0); + else if( (item_data=itemdb_searchname(id))!=NULL ) + nameid=item_data->nameid; + + if(nameid<0) { // ランダム nameid=itemdb_searchrandomid(-nameid); + } if(nameid > 0) { memset(&item_tmp,0,sizeof(item_tmp)); @@ -1480,10 +1514,17 @@ { int nameid,amount,i; struct map_session_data *sd; + char *id; + struct item_data *item_data; - nameid=conv_num(st,& (st->stack->stack_data[st->start+2])); + id=conv_str(st,& (st->stack->stack_data[st->start+2])); amount=conv_num(st,& (st->stack->stack_data[st->start+3])); + if( (nameid=atoi(id))>0 ) + nameid=((item_data=itemdb_exists(nameid))?nameid:0); + else if( (item_data=itemdb_searchname(id))!=NULL ) + nameid=item_data->nameid; + sd=map_id2sd(st->rid); for(i=0;istatus.inventory[i].nameid==nameid){ @@ -1782,6 +1823,26 @@ return 0; } + +/*========================================== + * 装備品による能力値ボーナス + *------------------------------------------ + */ +int buildin_bonus3(struct script_state *st) // RoVeRT +{ + int type,type2,val1,val2; + struct map_session_data *sd; + + type=conv_num(st,& (st->stack->stack_data[st->start+2])); + type2=conv_num(st,& (st->stack->stack_data[st->start+3])); + val1=conv_num(st,& (st->stack->stack_data[st->start+4])); + val2=conv_num(st,& (st->stack->stack_data[st->start+5])); + sd=map_id2sd(st->rid); + pc_bonus3(sd,type,type2,val1,val2); + + return 0; +} + /*========================================== * スキル所得 *------------------------------------------ @@ -2557,6 +2618,39 @@ clif_send0199(m,0); } + return 0; +} + +int buildin_mapwarp(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=0; + y0=0; + x1=map[map_mapname2mapid(mapname)].xs; + y1=map[map_mapname2mapid(mapname)].ys; + str=conv_str(st,& (st->stack->stack_data[st->start+3])); + x=conv_num(st,& (st->stack->stack_data[st->start+4])); + y=conv_num(st,& (st->stack->stack_data[st->start+5])); + + 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_npctimer(struct script_state *st) +{ + int option; + option=conv_num(st,& (st->stack->stack_data[st->start+2])); + npc_do_ontimer(st->oid, map_id2sd(st->rid), option); return 0; } diff -rNu athena-dev-2.1.1-mod0641/map/skill.c 641mod/map/skill.c --- athena-dev-2.1.1-mod0641/map/skill.c Fri Dec 12 16:58:34 2003 +++ 641mod/map/skill.c Wed Dec 24 23:52:02 2003 @@ -52,7 +52,8 @@ -1,-1,-1,-1,-1,-1,-1,-1, /* 60- */ SC_TWOHANDQUICKEN, /* 2HQ */ - -1,-1,-1,-1,-1, + SC_AUTOCOUNTER, + -1,-1,-1,-1, SC_IMPOSITIO, /* インポシティオマヌス */ SC_SUFFRAGIUM, /* サフラギウム */ SC_ASPERSIO, /* アスペルシオ */ @@ -67,7 +68,11 @@ SC_AETERNA, /* レックスエーテルナ */ -1, /* 80- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1, + SC_SIGHTTRASHER, + -1, + SC_METEOSTORM, + -1,-1,-1,-1,-1,-1, /* 90- */ -1,-1, SC_QUAGMIRE, /* クァグマイア */ @@ -115,9 +120,13 @@ SC_STRIPHELM, -1, /* 220- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1, + SC_GANGSTER, + -1,-1,-1,-1,-1,-1, /* 230- */ - -1,-1,-1,-1, + -1,-1, + SC_CANNIBALIZE, + SC_SPHEREMINE, SC_CP_WEAPON, SC_CP_SHIELD, SC_CP_ARMOR, @@ -127,9 +136,9 @@ -1,-1,-1,-1,-1,-1,-1,-1,-1, SC_AUTOGUARD, /* 250- */ - -1, + -1,-1, SC_REFLECTSHIELD, - -1,-1,-1, + -1,-1, SC_DEVOTION, SC_PROVIDENCE, SC_DEFENDER, @@ -138,13 +147,15 @@ /* 260- */ -1,-1,-1,-1,-1,-1,-1,-1, SC_STEELBODY, - -1, + SC_BLADESTOP, /* 270- */ - SC_EXPLOSIONSPIRITS,-1,-1,-1,-1, + SC_EXPLOSIONSPIRITS, + -1,-1,-1,-1, SC_CASTCANCEL, -1, SC_SPELLBREAKER, - -1,-1, + SC_FREECAST, + SC_AUTOSPELL, /* 280- */ SC_FLAMELAUNCHER, SC_FROSTWEAPON, @@ -153,22 +164,36 @@ -1, SC_VOLCANO, SC_DELUGE, - -1,-1,-1, + SC_VIOLENTGALE, + SC_LANDPROTECTOR, + -1, /* 290- */ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 300- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1, + SC_ADAPTATION, + -1,-1, + SC_KIMARICHMAN, + SC_ETERNALCHAOS, SC_DRUMBATTLE, /* 310- */ - -1,-1,-1, + SC_NIBELUNGEN, + SC_LOKIWAIL, + SC_INTOABYSS, SC_SIEGFRIED, - -1,-1,-1,-1,-1, + -1,-1,-1, + SC_DISSONANCE, + -1, SC_WHISTLE, /* 320- */ SC_ASSNCROS, SC_POEMBRAGI, SC_APPLEIDUN, - -1,-1,-1,-1,-1,-1, + -1,-1, + SC_UGLYDANCE, + -1, + SC_HUMMING, + SC_DONTFORGETME, SC_FORTUNE, /* 330- */ SC_SERVICE4U, @@ -196,7 +221,6 @@ int skill_get_delay( int id ,int lv ){ return skill_db[id].delay[lv-1]; } int skill_get_inf2( int id ){ return skill_db[id].inf2; } - /* プロトタイプ */ struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag); @@ -211,10 +235,10 @@ case PR_SANCTUARY: return 0x83; /* サンクチュアリ */ case PR_MAGNUS: return 0x84; /* マグヌスエクソシズム */ case AL_PNEUMA: return 0x85; /* ニューマ */ + case WZ_SIGHTRASHER: return 0x86; /* ST */ case WZ_METEOR: return 0x86; /* メテオストーム */ case WZ_VERMILION: return 0x86; /* ロードオブヴァーミリオン */ case WZ_STORMGUST: return 0x86; /* ストームガスト(とりあえずLoVと同じで処理) */ - case CR_GRANDCROSS: return 0x86; /* グランドクロス */ case WZ_FIREPILLAR: return (flag==0)?0x87:0x88; /* ファイアーピラー */ case HT_TALKIEBOX: return (flag==0)?0x99:0x8c; /* トーキーボックス */ case WZ_ICEWALL: return 0x8d; /* アイスウォール */ @@ -229,7 +253,14 @@ case HT_FLASHER: return 0x96; /* フラッシャー */ case HT_FREEZINGTRAP: return 0x97; /* フリージングトラップ */ case HT_CLAYMORETRAP: return 0x98; /* クレイモアートラップ */ + case AM_DEMONSTRATION: return 0xb3; /* Demonstration */ +// case CR_HOLYCROSS: return 0x86; /* Test */ + case CR_GRANDCROSS: return 0x86; /* Grand Cross */ + case MO_EXTREMITYFIST: return 0x86; /* Practice */ + case SA_VOLCANO: return 0x9a; /* Volcano */ case SA_DELUGE: return 0x9b; /* デリュージ */ + case SA_VIOLENTGALE: return 0x9c; /* Gale */ + case SA_LANDPROTECTOR: return 0x9d; /* LAND */ case BD_LULLABY: return 0x9e; /* 子守歌 */ case BD_RICHMANKIM: return 0x9f; /* ニヨルドの宴 */ case BD_ETERNALCHAOS: return 0xa0; /* 永遠の混沌 */ @@ -249,18 +280,41 @@ case DC_FORTUNEKISS: return 0xae; /* 幸運のキス */ case DC_SERVICEFORYOU: return 0xaf; /* サービスフォーユー */ case RG_GRAFFITI: return 0xb0; /* グラフィティ */ + case 336: return (flag==0)?0x81:0xb2; + default: return 0; } return 0; - /* - 0x89,0x8a,0x8b 表示無し - 0x9a 炎属性の詠唱みたいなエフェクト - 0x9b 水属性の詠唱みたいなエフェクト - 0x9c 風属性の詠唱みたいなエフェクト - 0x9d 白い小さなエフェクト - */ + /* 0x89,0x8a,0x8b 表示無し */ + /* 0x9a 炎属性の詠唱みたいなエフェクト */ + /* 0x9b 水属性の詠唱みたいなエフェクト */ + /* 0x9c 風属性の詠唱みたいなエフェクト */ + /* 0x9d 白い小さなエフェクト */ + /* 0x9e Zの文字(子守唄?) */ + /* 0x9f ゼニーの袋(ニヨルドの宴?) */ + /* 0xa0 緑色の回るエフェクト(エターナルカオス?) */ + /* 0xa1 ♪(謎) */ + /* 0xa2 回る青白い弾(ニーベルングの指輪?) */ + /* 0xa3 紫のQMっぽい感じ(ロキの叫び?) */ + /* 0xa4 リソースエラー */ + /* 0xa5 青い回るエフェクト(不死身のジークフリード?) */ + /* 0xa6 白い壁っぽい(謎) */ + /* 0xa7 ♪(謎) */ + /* 0xa8 赤い壁(夕陽のアサシンクロス?) */ + /* 0xa9 リソースエラー(spell008?) */ + /* 0xaa イドゥンの林檎 */ + /* 0xab (謎) */ + /* 0xac ♪2つ(口笛?) */ + /* 0xad 緑の壁(私を忘れないで…?) */ + /* 0xae 幸運のキス */ + /* 0xaf 赤いQMっぽい感じ(ブラギの詩??) */ + /* 0xb0 ? */ + /* 0xb1 Alchemist Demonstration */ + /* 0xb2 = Pink Warp Portal */ + } + int skill_check_condition( struct map_session_data *sd ); int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag ); @@ -274,6 +328,8 @@ return dx>dy ? dx : dy; } +static int skill_area_temp[8]; /* 一時変数。必要なら使う。 */ +int skill_area_sub( struct block_list *bl,va_list ap ); /*========================================== * スキル追加効果 *------------------------------------------ @@ -282,7 +338,7 @@ { struct map_session_data *sd=NULL; struct map_session_data *sd2=NULL; - int skill,skill2; + int skill=0,skill2; int rate; if(src->type==BL_PC) @@ -303,6 +359,74 @@ if((skill*15 + 55) + (skill2 = pc_checkskill(sd,TF_STEAL))*10 > rand()%1000) if(pc_steal_item(sd,bl)) clif_skill_nodamage(src,bl,TF_STEAL,skill2,1); + + if (sd->splash_attack) { // RoVeRT + skill_castend_damage_id(src,bl,174,sd->splash_attack,tick,0); + } + + if (sd && sd->sc_data[SC_AUTOSPELL].timer != -1) { /* RoVeRT */ + if ((tick - sd->autospell_tick) >= 3000 && sd->sc_data[SC_AUTOSPELL].val1 < rand()%100) { + int skilllv=1,max=3,limit=-1,sp; + int lv = pc_checkskill(sd,SA_AUTOSPELL); + + int levels[]={1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3}; + struct { int skill,max; } skills[] = { + { MG_NAPALMBEAT, 3 }, + { MG_COLDBOLT, 3 }, + { MG_FIREBOLT, 3 }, + { MG_LIGHTNINGBOLT, 3 }, + { MG_SOULSTRIKE, 3 }, + { MG_FIREBALL, 2 }, + { MG_FROSTDIVER, 1 }, + }; + + switch(lv) { + case NV_BASIC: + skill = 0; + break; + case SM_SWORD: + case SM_TWOHAND: + case SM_RECOVERY: + skill = rand()%4; + max = lv-1; + limit = 0; + break; + case SM_BASH: + case SM_PROVOKE: + case SM_MAGNUM: + skill = rand()%5; + max = lv-4; + limit = 3; + break; + case SM_ENDURE: + case MG_SRECOVERY: + skill = rand()%6; + max = lv-7; + limit = 5; + break; + case MG_SIGHT: + skill = rand()%7; + max = 1; + limit = 6; + break; + } + + do{ skilllv=levels[rand()%sizeof(levels)]+1; } while(skilllv>skills[skill].max || (skill>limit && skilllv>max)); + + sp=skill_get_sp(skills[skill].skill, skilllv) * 2/3; + if(sd->dsprate!=100) + sp=sp*sd->dsprate/100; + + if (sd->status.sp >= sp && pc_checkskill(sd,skills[skill].skill) >= skilllv) { + sd->status.sp-=sp; + clif_updatestatus(sd,SP_SP); + + sd->autospell_tick = tick; + + skill_castend_damage_id(src,bl,skills[skill].skill,skilllv,tick,0xf00000); + } + } + } break; case SM_BASH: /* バッシュ(急所攻撃) */ @@ -312,6 +436,11 @@ } break; + case PR_STRECOVERY: + if( battle_get_race(bl)==1 && battle_get_race(bl)==6 ) + skill_status_change_start(bl,SC_BLIND,1,0); + break; + case TF_POISON: /* インベナム */ if(battle_get_elem_type(bl)!=9 && rand()%100< 2*skilllv+10 ) skill_status_change_start(bl,SC_POISON,skilllv,0); @@ -326,7 +455,7 @@ case WZ_FROSTNOVA: /* フロストノヴァ */ case WZ_STORMGUST: /* ストームガスト */ case HT_FREEZINGTRAP: /* フリージングトラップ */ - case BA_FROSTJOKE: /* 寒いジョーク */ +// case BA_FROSTJOKE: /* 寒いジョーク */ /* rate=battle_get_lv(src)/2 +battle_get_int(src)/3+ skilllv*2 +15 -battle_get_mdef(bl); if(rate>95)rate=95; @@ -365,7 +494,19 @@ skill_status_change_start(bl,SC_STAN,1,3000); break; - case CR_HOLYCROSS: /* ホーリークロス */ + case CR_AUTOGUARD: /* ランドマイン */ + if( rand()%100 < 3*skilllv ){ + skill_status_change_start(bl,SC_AUTOGUARD,skilllv,skilllv*500+1000); + } + break; + + case CR_REFLECTSHIELD: /* ランドマイン */ + if( rand()%100 < 3*skilllv ){ + skill_status_change_start(bl,SC_REFLECTSHIELD,skilllv,skilllv*500+1000); + } + break; + + case CR_HOLYCROSS: /* 砂まき */ if( rand()%100 < 3*skilllv ) skill_status_change_start(bl,SC_BLIND,1,0); break; @@ -432,9 +573,9 @@ struct map_session_data *sd=NULL; struct mob_data *md=NULL; - if (target->type==BL_PC) + if(target->type==BL_PC) sd=(struct map_session_data *)target; - else if (target->type==BL_MOB) + else if(target->type==BL_MOB) md=(struct mob_data *)target; if(!(count&0x10000 && (sd||md))){ /* 指定なしなら位置関係から方向を求める */ @@ -781,7 +922,7 @@ { struct map_session_data *sd=NULL; int i; - + if(src->type==BL_PC) sd=(struct map_session_data *)src; if(sd && pc_isdead(sd)) @@ -792,29 +933,35 @@ if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) return 0; + switch(skillid) { + /* 武器攻撃系スキル */ case SM_BASH: /* バッシュ */ case MC_MAMMONITE: /* メマーナイト */ case AC_DOUBLE: /* ダブルストレイフィング */ - case AS_SONICBLOW: /* ソニックブロー */ + case TF_POISON: case KN_PIERCE: /* ピアース */ - case KN_SPEARBOOMERANG: /* スピアブーメラン */ - case TF_POISON: /* インベナム */ - case TF_SPRINKLESAND: /* 砂まき */ +// case KN_BRANDISHSPEAR: case AC_CHARGEARROW: /* チャージアロー */ - case KN_SPEARSTAB: /* スピアスタブ */ + case KN_SPEARSTAB: + case KN_SPEARBOOMERANG: + case AS_SONICBLOW: +// case AS_GRIMTOOTH: + case TF_SPRINKLESAND: /* 砂まき */ case RG_BACKSTAP: /* バックスタブ */ - case RG_RAID: /* サプライズアタック */ +// case RG_RAID: /* サプライズアタック */ case RG_INTIMIDATE: /* インティミデイト */ + /* Shield Test */ + case CR_SHIELDCHARGE: + case CR_SHIELDBOOMERANG: + /* Testing */ + case MO_INVESTIGATE: + case CR_HOLYCROSS: /* ホーリークロス */ case BA_MUSICALSTRIKE: /* ミュージカルストライク */ case DC_THROWARROW: /* 矢撃ち */ - case BA_DISSONANCE: /* 不協和音 */ - case MO_INVESTIGATE: /* 発勁 */ - case CR_HOLYCROSS: /* ホーリークロス */ /* 以下MOB専用 */ - /* 単体攻撃、SP減少攻撃、遠距離攻撃、防御無視攻撃、多段攻撃 */ case NPC_PIERCINGATT: case NPC_MENTALBREAKER: case NPC_RANGEATTACK: @@ -843,7 +990,7 @@ case NPC_TELEKINESISATTACK: case NPC_LICK: if(skillid==RG_BACKSTAP && pc_ishiding(sd)) - skill_status_change_end(src, SC_HIDDING, -1); // ハイディング解除 + skill_status_change_end(src, SC_HIDDING, -1); /* ハイディング解除 */ skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); break; case MO_FINGEROFFENSIVE: /* 指弾 */ @@ -885,7 +1032,7 @@ sd->combo_delay3 = tick + sd->combo_delay2 - 300; break; case MO_EXTREMITYFIST: /* 阿修羅覇鳳拳 */ - { + { int dx,dy; skill_status_change_end(src, SC_EXPLOSIONSPIRITS, -1); dx = ((sd->bl.x - bl->x)>0?-4:4); @@ -905,15 +1052,21 @@ sd->canmove_tick = tick + skill_get_delay(skillid, skilllv); skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); pc_walktoxy(sd, sd->to_x, sd->to_y); + } break; - } + /* 武器系範囲攻撃スキル */ - case AC_SHOWER: /* アローシャワー */ - case SM_MAGNUM: /* マグナムブレイク */ - case AS_GRIMTOOTH: /* グリムトゥース */ - case KN_BOWLINGBASH: /* ボウリングバッシュ */ - case MC_CARTREVOLUTION: /* カートレヴォリューション */ - case NPC_SPLASHATTACK: /* スプラッシュアタック */ + /* アローシャワー、マグナムブレイク、ボウリングバッシュ、カートレヴォリューション */ + case AC_SHOWER: + case SM_MAGNUM: + case KN_BRANDISHSPEAR: + case KN_BOWLINGBASH: + case MC_CARTREVOLUTION: + case AS_SPLASHER: + case AS_GRIMTOOTH: + case RG_RAID: + /* スプラッシュアタック */ + case NPC_SPLASHATTACK: if(flag&3){ /* 個別にダメージを与える */ if(bl->id!=skill_area_temp[1]){ @@ -932,11 +1085,11 @@ if( skillid==SM_MAGNUM ){ x=src->x; y=src->y; - }else if(skillid==AC_SHOWER) /* アローシャワー範囲 */ + }else if(skillid==AC_SHOWER ||skillid==AS_GRIMTOOTH ||skillid==AS_SPLASHER) /* アローシャワー範囲 */ ar=2; - else if(skillid==NPC_SPLASHATTACK) /* スプラッシュアタックは範囲7*7 */ + else if(skillid==NPC_SPLASHATTACK ||skillid==KN_BRANDISHSPEAR || skillid==RG_RAID) /* スプラッシュアタックは範囲7*7 */ ar=3; - else if(skillid==KN_BOWLINGBASH){/*ボウリングバッシュを仮実装してみる(吹き飛ばしはここでやる) */ + else if(skillid==KN_BOWLINGBASH){/* ボウリングバッシュを仮実装してみる(吹き飛ばしはここでやる) */ int i; /* 他人から聞いた動きなので間違ってる可能性大&効率が悪いっす>< */ for(i=0;i<4;i++){ skill_blown(src,bl,1|0x20000); @@ -947,14 +1100,14 @@ skill_area_sub_count); if(skill_area_temp[0]>1)break; } - /* if(i==4)break; */ + /* if(i==4)break; */ x=bl->x;y=bl->y; } skill_area_temp[1]=bl->id; skill_area_temp[2]=x; skill_area_temp[3]=y; /* まずターゲットに攻撃を加える */ - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0); + if (src->type == BL_MOB) skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0); /* その後ターゲット以外の範囲内の敵全体に処理を行う */ map_foreachinarea(skill_area_sub, bl->m,x-ar,y-ar,x+ar,y+ar,0, @@ -962,39 +1115,49 @@ skill_castend_damage_id); } break; - + + /* 魔法系スキル */ - case MG_SOULSTRIKE: /* ソウルストライク */ - case MG_COLDBOLT: /* コールドボルト */ - case MG_FIREBOLT: /* ファイアーボルト */ - case MG_LIGHTNINGBOLT: /* ライトニングボルト */ - case WZ_EARTHSPIKE: /* アーススパイク */ - case AL_HEAL: /* ヒール */ - case AL_HOLYLIGHT: /* ホーリーライト */ - case ALL_RESURRECTION: /* リザレクション */ - case PR_TURNUNDEAD: /* ターンアンデッド */ - case MG_FROSTDIVER: /* フロストダイバー */ - case WZ_JUPITEL: /* ユピテルサンダー */ - case NPC_MAGICALATTACK: /* MOB:魔法打撃攻撃 */ + /* ソウルストライク */ + case MG_SOULSTRIKE: + /* コールドボルト、ファイアーボルト、ライトニングボルト、アーススパイク */ + case MG_COLDBOLT: + case MG_FIREBOLT: + case MG_LIGHTNINGBOLT: + case WZ_EARTHSPIKE: + /* ヒールアタック、ホーリーライト、攻撃リザレクション、ターンアンデッド */ + case AL_HEAL: + case AL_HOLYLIGHT: + case ALL_RESURRECTION: + case PR_TURNUNDEAD: + /* フロストダイバ、ユピテルサンダー */ + case MG_FROSTDIVER: + case WZ_JUPITEL: + /* MOB:魔法打撃攻撃 */ + case NPC_MAGICALATTACK: skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); break; - case WZ_WATERBALL: /* ウォーターボール */ + /* ウォーターボール */ + case WZ_WATERBALL: skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); if(skilllv>1) skill_status_change_start(src,SC_WATERBALL,skilllv,bl->id); break; - case PR_BENEDICTIO: /* 聖体降福 */ + /* 聖体 */ + case PR_BENEDICTIO: if(battle_get_race(bl)==1 || battle_get_race(bl)==6) skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); break; /* 魔法系範囲攻撃スキル */ - case MG_NAPALMBEAT: /* ナパームビート */ - case MG_FIREBALL: /* ファイヤーボール */ - case MG_THUNDERSTORM: /* サンダーストーム(flag=2のみ) */ - case WZ_HEAVENDRIVE: /* ヘブンズドライブ(flag=2のみ) */ + /* ナパームビート、ファイヤーボール、 */ + case MG_NAPALMBEAT: + case MG_FIREBALL: + /* (サンダーストーム、ヘブンズドライブ:flag=2のみ呼ばれる) */ + case MG_THUNDERSTORM: + case WZ_HEAVENDRIVE: if(flag&3){ /* 個別にダメージを与える */ if(bl->id!=skill_area_temp[1]){ @@ -1030,8 +1193,9 @@ break; } break; - - case WZ_FROSTNOVA: /* フロストノヴァ */ + + /* フロストノヴァ */ + case WZ_FROSTNOVA: /* 個別にダメージを与える */ if(bl->id!=skill_area_temp[1] && (bl->x!=skill_area_temp[2] || bl->y!=skill_area_temp[3]) ) @@ -1040,7 +1204,8 @@ /* その他 */ - case HT_BLITZBEAT: /* ブリッツビート */ + /* ブリッツビート、自動鷹 */ + case HT_BLITZBEAT: if(flag&1){ /* 個別にダメージを与える */ if(bl->id!=skill_area_temp[1]) @@ -1061,13 +1226,14 @@ break; } break; - - case TF_THROWSTONE: /* 石投げ */ - case NPC_SMOKING: /* スモーキング */ + /* 石投げ、タバコを吸う */ + case TF_THROWSTONE: + case NPC_SMOKING: skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,0 ); break; - case NPC_SELFDESTRUCTION: /* 自爆 */ + /* 自爆 */ + case NPC_SELFDESTRUCTION: if(flag&1){ /* 個別にダメージを与える */ if(src->type==BL_MOB){ @@ -1091,6 +1257,14 @@ break; } break; + + case AC_MAKINGARROW: // 矢作成 + if(sd!=NULL) { + clif_skill_nodamage(src,bl,skillid,5,1); + clif_arrow_create_list(sd); + } + break; + /* HP吸収/HP吸収魔法 */ case NPC_BLOODDRAIN: @@ -1099,8 +1273,8 @@ skill_attack( (skillid==NPC_BLOODDRAIN)?BF_WEAPON:BF_MAGIC, src,src,bl,skillid,skilllv,tick,flag), 0 ); break; - } + } return 0; } @@ -1130,12 +1304,12 @@ if(sd && pc_isdead(sd)) return 0; if(dstsd && pc_isdead(dstsd) && skillid != ALL_RESURRECTION) - return 0; + return 0; switch(skillid) { #if 0 - case SM_RECOVERY: /* SP回復向上 */ + case SM_RECOVERY: { int a=0,i,bonus,c=0; bonus=100+(skilllv*10); @@ -1170,20 +1344,27 @@ } } } - if(c==0){clif_displaymessage(sd->fd,"Potions.");} + if(c==0){clif_displaymessage(sd->fd,"Potions.");}*/ #endif - case AL_HEAL: /* ヒール */ + case AL_HEAL: { int heal=skill_calc_heal( src, skilllv ); int heal_get_jobexp; - if( bl->type==BL_PC && - pc_check_equip_dcard((struct map_session_data *)bl,4128) ) - heal=0; /* 黄金蟲カード(ヒール量0) */ + if( bl->type==BL_PC) { +// if (pc_check_equip_dcard((struct map_session_data *)bl,4128) ) +// heal=0; /* 黄金蟲カード(ヒール量0) */ +// if (pc_check_equip_dcard((struct map_session_data *)bl,4146) && rand()%100 < 30 ) +// heal=0; /* Maya Card 30% chance refelect magic */ + if (rand()%100 < ((struct map_session_data *)bl)->refmagic) { + heal=0; + } + } + clif_skill_nodamage(src,bl,skillid,heal,1); heal_get_jobexp = battle_heal(NULL,bl,heal,0); - // JOB経験値獲得 + /* JOB経験値獲得 */ if(src->type == BL_PC && bl->type==BL_PC && heal > 0 && src != bl){ heal_get_jobexp = heal_get_jobexp * battle_config.heal_exp / 100; if(heal_get_jobexp <= 0) @@ -1192,8 +1373,8 @@ } } break; - - case ALL_RESURRECTION: /* リザレクション */ + /* リザレクション */ + case ALL_RESURRECTION: if(bl->type==BL_PC){ int per=0; struct map_session_data *tsd=(struct map_session_data*)bl; @@ -1211,7 +1392,8 @@ } tsd->status.hp=tsd->status.max_hp*per/100; if(tsd->status.hp<=0) tsd->status.hp=1; - if( pc_check_equip_dcard(tsd,4144) ){ /* オシリスカード */ +// if( pc_check_equip_dcard(tsd,4144) ){ /* オシリスカード */ + if( tsd->reincarnation!=0 ){ tsd->status.hp=tsd->status.max_hp; tsd->status.sp=tsd->status.max_sp; } @@ -1224,57 +1406,81 @@ } break; - case AL_INCAGI: /* 速度増加 */ - case AL_DECAGI: /* 速度減少 */ - case AL_BLESSING: /* ブレッシング */ - case KN_TWOHANDQUICKEN: /* ツーハンドクイッケン */ - case CR_SPEARQUICKEN: /* スピアクイッケン */ - case PR_IMPOSITIO: /* イムポシティオマヌス */ - case PR_ASPERSIO: /* アスペルシオ */ - case PR_KYRIE: /* キリエエレイソン */ - case PR_LEXDIVINA: /* レックスディビーナ */ - case PR_LEXAETERNA: /* レックスエーテルナ */ - case AS_ENCHANTPOISON: /* エンチャントポイズン */ - case AS_POISONREACT: /* ポイズンリアクト */ - case AC_CONCENTRATION: /* 集中力向上 */ - case MC_LOUD: /* ラウドボイス */ - case MG_ENERGYCOAT: /* エナジーコート */ - case SM_PROVOKE: /* プロボック */ - case SM_ENDURE: /* インデュア */ - case PR_SUFFRAGIUM: /* サフラギウム */ - case MG_SIGHT: /* サイト */ - case AL_RUWACH: /* ルアフ */ - case PR_BENEDICTIO: /* 聖体降福 */ - case CR_PROVIDENCE: /* プロヴィデンス */ - case SA_FLAMELAUNCHER: /* フレイムランチャー */ - case SA_FROSTWEAPON: /* フロストウェポン */ - case SA_LIGHTNINGLOADER:/* ライトニングローダー */ - case SA_SEISMICWEAPON: /* サイズミックウェポン */ - case MO_EXPLOSIONSPIRITS: // 爆裂波動 - case MO_STEELBODY: // 金剛 -#if 0 - case CR_AUTOGUARD: /* オートガード */ - case CR_DEFENDER: /* ディフェンダー */ - case SA_CASTCANCEL: /* キャストキャンセル */ - case SA_VOLCANO: /* ボルケーノ */ - case SA_DELUGE: /* デリュージ */ - case SA_VIOLENTGALE: /* バイオレントゲイル */ - case SA_LANDPROTECTOR: /* ランドプロテクター */ - case BA_FROSTJOKE: /* 寒いジョーク */ -#endif - clif_skill_nodamage( (skillid==PR_KYRIE)?bl:src,bl,skillid,skilllv,1); + /* プロボック、インデュア、サフラギウム、サイト、ルアフ */ + case SM_PROVOKE: case SM_ENDURE: case PR_SUFFRAGIUM: case MG_SIGHT: + case AL_RUWACH: + /* 速度向上、速度上昇、ブレッシング、ツーハンドクィッケン */ + case AL_INCAGI: + case AL_DECAGI: + case AL_BLESSING: + case KN_TWOHANDQUICKEN: + case KN_AUTOCOUNTER: + /* 聖体 */ + case PR_BENEDICTIO: + case 350: + /* インポシティオ、アスペルシオ、キリエ、デビナ、エーテルナ、 */ + case PR_IMPOSITIO: + case PR_ASPERSIO: + case PR_KYRIE: + case PR_LEXDIVINA: + case PR_LEXAETERNA: + /* Eポイズン、ポイズンリアクト、集中力向上、ラウドボイス、エナジーコート */ + case AS_ENCHANTPOISON: + case AS_POISONREACT: + case AC_CONCENTRATION: + case MC_LOUD: + case MG_ENERGYCOAT: + /* ????? */ + /* Alchemist AppleGirl */ + case AM_CP_WEAPON: + case AM_CP_SHIELD: + case AM_CP_ARMOR: + case AM_CP_HELM: +// case CR_AUTOGUARD: + /* プロヴィデンス、 */ +// case CR_REFLECTSHIELD: + case CR_PROVIDENCE: + case CR_DEFENDER: + case CR_SPEARQUICKEN: + /* オートガード、ディフェンダー、気功 */ + case MO_STEELBODY: + case MO_BLADESTOP: + case MO_EXPLOSIONSPIRITS: /*case SA_FREECAST: FreeCast isnt a useable skill */ + /* 金剛、キャストキャンセル、フリーキャスト、 */ + /* blank */ + /* フレイムランチャー、フロストウェポン、ライトニングローダー、サイズミック */ + case SA_FLAMELAUNCHER: + case SA_FROSTWEAPON: + case SA_LIGHTNINGLOADER: + case SA_SEISMICWEAPON: + case SA_SPELLBREAKER: + /* ボルケーノ、デリュージ、バイオレントゲイル、ランドプロテクター */ +/* case SA_VOLCANO: + case SA_DELUGE: + case SA_VIOLENTGALE: + case SA_LANDPROTECTOR:*/ + /* 寒いジョーク */ +// case BA_FROSTJOKE: + +/* clif_skill_nodamage( (skillid==PR_KYRIE)?bl:src,bl,skillid,skilllv,1); */ + clif_skill_nodamage( (skillid==73 || skillid==249)?bl:src,bl,skillid,skilllv,1); /* Combined by RoVeRT */ skill_status_change_start( bl, SkillStatusChangeTable[skillid], skilllv, 0 ); + if(skillid==SM_PROVOKE && bl->type==BL_MOB) mob_target((struct mob_data *)bl,src,skill_get_range(skillid)); break; - case MO_CALLSPIRITS: // 気功 + case CR_AUTOGUARD: + case CR_REFLECTSHIELD: + clif_skill_nodamage(src,bl,skillid,skilllv,1); + break; + case MO_CALLSPIRITS: /* CALLSPIRITS */ if(sd) { clif_skill_nodamage(src,bl,skillid,skilllv,1); pc_addspiritball(sd,60*10*1000,skilllv); } break; - case MO_ABSORBSPIRITS: // 気奪 + case MO_ABSORBSPIRITS: /* ABSORBSPIRITS */ if(sd && dstsd) { if(sd == dstsd || map[sd->bl.m].flag.pvp || map[sd->bl.m].flag.gvg) { if(dstsd->spiritball > 0) { @@ -1299,12 +1505,12 @@ } break; - case AC_MAKINGARROW: /* 矢作成 */ +/* case AC_MAKINGARROW: // 矢作成 if(sd) { clif_arrow_create_list(sd); clif_skill_nodamage(src,bl,skillid,skilllv,1); } - break; + break;*/ case BS_HAMMERFALL: /* ハンマーフォール */ clif_skill_nodamage(src,bl,skillid,skilllv,1); @@ -1313,6 +1519,13 @@ } break; + case BA_FROSTJOKE: /* ハンマーフォール */ + clif_skill_nodamage(src,bl,skillid,skilllv,1); + if( rand()%100 < (20+ 10*skilllv) ) { + skill_status_change_start(bl,SC_FREEZE,skilllv,10000); + } + break; + case RG_RAID: /* サプライズアタック */ clif_skill_nodamage(src,bl,skillid,skilllv,1); { @@ -1325,16 +1538,36 @@ src,skillid,skilllv,tick, flag|BCT_ENEMY|1, skill_castend_damage_id); } - skill_status_change_end(src, SC_HIDDING, -1); // ハイディング解除 + skill_status_change_end(src, SC_HIDDING, -1); /* ハイディング解除 */ + break; + + case RG_GANGSTER: + clif_skill_nodamage(src,bl,skillid,skilllv,1); + { + if(pc_checkskill(sd,RG_GANGSTER) < 0){ + return 0; + } + int x=bl->x,y=bl->y; + skill_area_temp[1]=bl->id; + skill_area_temp[2]=x; + skill_area_temp[3]=y; + map_foreachinarea(skill_area_sub, + bl->m,x-1,y-1,x+1,y+1,0, + src,skillid,skilllv,tick, flag|BCT_ALL, + skill_castend_damage_id); + } + skill_status_change_start( bl, SC_GANGSTER , skilllv, 0 ); break; /* パーティスキル */ - case AL_ANGELUS: /* エンジェラス */ - case PR_MAGNIFICAT: /* マグニフィカート */ - case PR_GLORIA: /* グロリア */ - case BS_ADRENALINE: /* アドレナリンラッシュ */ - case BS_WEAPONPERFECT: /* ウェポンパーフェクション */ - case BS_OVERTHRUST: /* オーバートラスト */ + /* アンゼルス、マグニフィカート、グロリア */ + case AL_ANGELUS: + case PR_MAGNIFICAT: + case PR_GLORIA: + /* アドレナリン、ウェポンパーフェクション、オーバートラスト */ + case BS_ADRENALINE: + case BS_WEAPONPERFECT: + case BS_OVERTHRUST: if( sd==NULL || sd->status.party_id==0 || (flag&1) ){ /* 個別の処理 */ clif_skill_nodamage(bl,bl,skillid,skilllv,1); @@ -1349,20 +1582,18 @@ } break; - /*(付加と解除が必要) */ - case BS_MAXIMIZE: /* マキシマイズパワー */ - case NV_TRICKDEAD: /* 死んだふり */ - case TF_HIDING: /* ハイディング */ - case AS_CLOAKING: /* クローキング */ - if(skillid != AS_CLOAKING) - clif_skill_nodamage(src,bl,skillid,skilllv,1); + /* (付加と解除が必要) */ + /* マキシマイズパワー、死んだふり、ハイディング、クローキング */ + case BS_MAXIMIZE: + case NV_TRICKDEAD: + case TF_HIDING: + case AS_CLOAKING: + clif_skill_nodamage(src,bl,skillid,skilllv,1); { int sc=SkillStatusChangeTable[skillid]; - if( (battle_get_sc_data(bl))[sc].timer==-1 ) - /* 付加する */ + if( (battle_get_sc_data(bl))[sc].timer==-1 ) /* 付加する */ skill_status_change_start(bl, sc, skilllv, 0); - else - /* 解除する */ + else /* 解除する */ skill_status_change_end(bl, sc, -1); if(skillid==AS_CLOAKING) @@ -1370,40 +1601,32 @@ } break; - /* 対地スキル */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - case BA_WHISTLE: /* 口笛 */ - case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ - case BA_APPLEIDUN: /* イドゥンの林檎 */ - case DC_FORTUNEKISS: /* 幸運のキス */ - case DC_SERVICEFORYOU: /* サービスフォーユー */ -#if 0 - case BD_LULLABY: /* 子守唄 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - case BA_DISSONANCE: /* 不協和音 */ - case BA_WHISTLE: /* 口笛 */ - case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ - case BA_POEMBRAGI: /* ブラギの詩 */ - case BA_APPLEIDUN: /* イドゥンの林檎 */ - case DC_UGLYDANCE: /* 自分勝手なダンス */ - case DC_HUMMING: /* ハミング */ - case DC_DONTFORGETME: /* 私を忘れないで… */ - case DC_FORTUNEKISS: /* 幸運のキス */ - case DC_SERVICEFORYOU: /* サービスフォーユー */ -#endif + /* 子守唄、ニヨルドの宴、永遠の混沌、戦太鼓の響き、ニーベルングの指輪 */ + case BD_LULLABY: + case BD_RICHMANKIM: + case BD_ETERNALCHAOS: + case BD_DRUMBATTLEFIELD: + case BD_RINGNIBELUNGEN: + /* ロキの叫び、深淵の中に、不死身のジークフリード */ + case BD_ROKISWEIL: + case BD_SIEGFRIED: + /* 不協和音、口笛、夕陽のアサシンクロス、ブラギの詩、イドゥンの林檎 */ + case BA_DISSONANCE: + case BA_WHISTLE: + case BA_ASSASSINCROSS: + case BA_POEMBRAGI: + case BA_APPLEIDUN: + /* 自分勝手なダンス、ハミング、私を忘れないで…、幸運のキス、サービスフォーユー */ + case DC_UGLYDANCE: + case DC_HUMMING: + case DC_DONTFORGETME: + case DC_FORTUNEKISS: + case DC_SERVICEFORYOU: + clif_skill_nodamage(src,bl,skillid,skilllv,1); skill_unitsetting(src,skillid,skilllv,src->x,src->y,0); break; - - case TF_STEAL: // スティール + + case TF_STEAL: /* スティール */ if(pc_steal_item(sd,bl)) { clif_skill_nodamage(src,bl,skillid,skilllv,1); mob_target((struct mob_data *)bl,src,skill_get_range(skillid)); @@ -1412,7 +1635,7 @@ clif_skill_nodamage(src,bl,skillid,skilllv,0); break; - case RG_STEALCOIN: // スティールコイン + case RG_STEALCOIN: /* スティールコイン */ if(pc_steal_coin(sd,bl)) { clif_skill_nodamage(src,bl,skillid,skilllv,1); mob_target((struct mob_data *)bl,src,skill_get_range(skillid)); @@ -1421,6 +1644,14 @@ clif_skill_nodamage(src,bl,skillid,skilllv,0); break; +/* case BD_INTOABYSS: + if(skillid==BD_INTOABYSS){ + (void skill_check_condition( sd )); + clif_skill_nodamage(src,bl,skillid,0,0); + skill_unitsetting(src,skillid,skilllv,src->x,src->y,0); + } + break;*/ + /* ストーンカース */ case MG_STONECURSE: /* ストーンカース */ clif_skill_nodamage(src,bl,skillid,skilllv,1); if( rand()%100 < skilllv*4+20 ) @@ -1444,8 +1675,14 @@ skill_status_change_end(bl, SC_POISON , -1 ); break; + case PR_SLOWPOISON: /* リカバリー */ + clif_skill_nodamage(src,bl,skillid,skilllv,1); + skill_status_change_end(bl, SC_POISON , -1 ); + break; + case PR_STRECOVERY: /* リカバリー */ clif_skill_nodamage(src,bl,skillid,skilllv,1); + if( rand()%100 < skilllv*81+20 ) skill_status_change_end(bl, SC_FREEZE , -1 ); skill_status_change_end(bl, SC_STONE , -1 ); skill_status_change_end(bl, SC_SLEEP , -1 ); @@ -1459,17 +1696,19 @@ } break; - case MC_IDENTIFY: /* アイテム鑑定 */ + /* アイテム鑑定 */ + case MC_IDENTIFY: if(sd!=NULL) clif_item_identify_list(sd); break; - - case MC_VENDING: /* 露店開設 */ + /* 露店開設 */ + case MC_VENDING: if(sd!=NULL) clif_openvendingreq(sd,2+sd->skilllv); break; - - case AL_TELEPORT: /* テレポート */ + + /* テレポート */ + case AL_TELEPORT: clif_skill_nodamage(src,bl,skillid,skilllv,1); if( sd ){ if(map[sd->bl.m].flag.noteleport) /* テレポ禁止 */ @@ -1483,14 +1722,13 @@ }else if( bl->type==BL_MOB ) mob_warp((struct mob_data *)bl,-1,-1,3); break; - case AL_HOLYWATER: /* アクアベネディクタ */ - if(sd) { + if(sd) { int eflag; struct item item_tmp; clif_skill_nodamage(src,bl,skillid,skilllv,1); memset(&item_tmp,0,sizeof(item_tmp)); - item_tmp.nameid=523; // 聖水 + item_tmp.nameid=523; /* 聖水 */ item_tmp.identify=1; eflag = pc_additem(sd,&item_tmp,1); if(eflag) { @@ -1499,109 +1737,126 @@ } } break; - - case WZ_FROSTNOVA: /* フロストノヴァ */ + /* フロストノヴァ */ + case WZ_FROSTNOVA: skill_area_temp[1]=bl->id; skill_area_temp[2]=bl->x; skill_area_temp[3]=bl->y; /* まずターゲットにエフェクトを出す */ -/* clif_skill_nodamage(src,bl,skillid,skilllv,1); - clif_skill_damage(src,bl,tick,battle_get_amotion(src),0,-1,1,skillid,skilllv,6); - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, ); */ +/* clif_skill_nodamage(src,bl,skillid,skilllv,1); */ +/* clif_skill_damage(src,bl,tick,battle_get_amotion(src),0,-1,1,skillid,skilllv,6); */ +/* skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, ); */ /* その後ターゲット以外の範囲内の敵全体に処理を行う */ map_foreachinarea(skill_area_sub, bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0, src,skillid,skilllv,tick, flag|BCT_ENEMY|1, skill_castend_damage_id); break; - - case RG_STRIPWEAPON: /* ストリップウェポン */ - /*{ - int i,a=0,b=0; - if(skilllv==1){a=1100 > 2000;} - else if(skilllv==2){a=1100 > 2000;} - else if(skilllv==3){a=1100 > 2000;} - else if(skilllv==4){a=1100 > 2000;} - else if(skilllv==5){a=1100 > 2000;} - if(a>0){ - for(i=0;istatus.inventory[i].nameid==a){ - pc_unequipitem(sd,i); - b=1; - if(skilllv==1){a=rand()%7;} - else if(skilllv==2){a=rand()%9;} - else if(skilllv==3){a=rand()%11;} - else if(skilllv==4){a=rand()%13;} - else if(skilllv==5){a=rand()%15;} +/* case RG_STRIPWEAPON: + { + int i; + if( !bl->type==BL_PC && !pc_checkequip(sd,2)) + return 0; + else if( bl->type==BL_PC && pc_checkequip(sd,2)) + for(i=1100;i<2000;i++) pc_unequipitem(sd,i); /. 装備外し + skill_status_change_start( bl, + SkillStatusChangeTable[skillid], skilllv, 0 ); } - if(b==0){clif_displaymessage(sd->fd,"Nothing Equiped.");}*/ break; - - case RG_STRIPSHIELD: /* ストリップシールド */ - /*{ - int i,a=0,b=0; - if(skilllv==1){a=2100 > 2200;} - else if(skilllv==2){a=2100 > 2200;} - else if(skilllv==3){a=2100 > 2200;} - else if(skilllv==4){a=2100 > 2200;} - else if(skilllv==5){a=2100 > 2200;} - if(a>0){ - for(i=0;istatus.inventory[i].nameid==a){ - pc_unequipitem(sd,i); - b=1; - if(skilllv==1){a=rand()%7;} - else if(skilllv==2){a=rand()%9;} - else if(skilllv==3){a=rand()%11;} - else if(skilllv==4){a=rand()%13;} - else if(skilllv==5){a=rand()%15;} + case RG_STRIPSHIELD: + { + int i; + if( !bl->type==BL_PC && !pc_checkequip(sd,32)) + return 0; + else if( bl->type==BL_PC && pc_checkequip(sd,32)) + for(i=2100;i<2200;i++) pc_unequipitem(sd,i); /. 装備外し + skill_status_change_start( bl, + SkillStatusChangeTable[skillid], skilllv, 0 ); } - if(b==0){clif_displaymessage(sd->fd,"Nothing Equiped.");}*/ break; - case RG_STRIPARMOR: /* ストリップアーマー */ - /*{ - int i,a=0,b=0; - if(skilllv==1){a=2300 > 2400;} - else if(skilllv==2){a=2300 > 2400;} - else if(skilllv==3){a=2300 > 2400;} - else if(skilllv==4){a=2300 > 2400;} - else if(skilllv==5){a=2300 > 2400;} - if(a>0){ - for(i=0;istatus.inventory[i].nameid==a){ - pc_unequipitem(sd,i); - b=1; - if(skilllv==1){a=rand()%7;} - else if(skilllv==2){a=rand()%9;} - else if(skilllv==3){a=rand()%11;} - else if(skilllv==4){a=rand()%13;} - else if(skilllv==5){a=rand()%15;} + case RG_STRIPARMOR: + { + int i; + if( !bl->type==BL_PC && !pc_checkequip(sd,16)) + return 0; + else if( bl->type==BL_PC && pc_checkequip(sd,16)) + for(i=2300;i<2400;i++) pc_unequipitem(sd,i); /. 装備外し + skill_status_change_start( bl, + SkillStatusChangeTable[skillid], skilllv, 0 ); } - if(b==0){clif_displaymessage(sd->fd,"Nothing Equiped.");}*/ break; + case RG_STRIPHELM: + { + int i; + if( !bl->type==BL_PC && !pc_checkequip(sd,256)) + return 0; + else if( bl->type==BL_PC && pc_checkequip(sd,256)) + for(i=2200;i<2300;i++) pc_unequipitem(sd,i); /. 装備外し + skill_status_change_start( bl, + SkillStatusChangeTable[skillid], skilllv, 0 ); + } + break;*/ + case RG_STRIPWEAPON: /* ストリップウェポン */ + case RG_STRIPSHIELD: /* ストリップシールド */ + case RG_STRIPARMOR: /* ストリップアーマー */ case RG_STRIPHELM: /* ストリップヘルム */ - /*{ - int i,a=0,b=0; - if(skilllv==1){a=2200 > 2300;} - else if(skilllv==2){a=2200 > 2300;} - else if(skilllv==3){a=2200 > 2300;} - else if(skilllv==4){a=2200 > 2300;} - else if(skilllv==5){a=2200 > 2300;} - if(a>0){ - for(i=0;istatus.inventory[i].nameid==a){ - pc_unequipitem(sd,i); - b=1; - if(skilllv==1){a=rand()%7;} - else if(skilllv==2){a=rand()%9;} - else if(skilllv==3){a=rand()%11;} - else if(skilllv==4){a=rand()%13;} - else if(skilllv==5){a=rand()%15;} + { + int i,equip=0,item_id; + int EquipmentTable[]={2,32,16,256}; + if(bl->type==BL_PC) { + item_id = pc_checkequip(dstsd,EquipmentTable[skillid-215]); + if (item_id!=-1) { + equip=1; + for(i=0;istatus.inventory[i].nameid == item_id)) { + if (rand()%100 < (5+skilllv*2)) { + equip=2; +// new method pc_unequipitem(sd,sd->equip_index[i],0); + pc_unequipitem(dstsd,i,0); + skill_status_change_start( bl, + SkillStatusChangeTable[skillid], skilllv, 0 ); + } + } + } + if(equip==0){clif_displaymessage(sd->fd,"Nothing Equiped.");} + else if (equip==1){clif_skill_fail(sd,skillid,0,0);} + } + } + clif_skill_nodamage(src,bl,skillid,0,1); + if(bl->type==BL_MOB && rand()%100 < (5+skilllv*2)) { + skill_status_change_start( bl, + SkillStatusChangeTable[skillid], skilllv, 0 ); } - if(b==0){clif_displaymessage(sd->fd,"Nothing Equiped.");}*/ break; - case RG_INTIMIDATE: /* インティミデイト */ - if( sd ){ + case AM_ACIDTERROR: + { + int i,equip=0,item_id; + int EquipmentTable[]={16}; + if(bl->type==BL_PC) { + item_id = pc_checkequip(dstsd,EquipmentTable[skillid]); + if (item_id) { + equip=1; + for(i=0;istatus.inventory[i].nameid == item_id)) { + if (rand()%100 < (3+skilllv*2)) { + equip=2; + pc_unequipitem(dstsd,i,0); + skill_status_change_start( bl, SkillStatusChangeTable[skillid], skilllv, 0 ); + } + } + } + if(equip==0){clif_displaymessage(sd->fd,"Nothing Equiped.");} + else if (equip==1){clif_skill_fail(sd,skillid,0,0);} + } + } + clif_skill_nodamage(src,bl,skillid,skilllv,1); + if(bl->type==BL_MOB && rand()%100 < (3+skilllv*2)) { + skill_status_change_start( bl, + SkillStatusChangeTable[skillid], skilllv, 0 ); + } + break; + case RG_INTIMIDATE: + if( sd ){ if(map[sd->bl.m].flag.noteleport) /* テレポ禁止 */ break; if( sd->skilllv==1 ) @@ -1614,7 +1869,7 @@ mob_warp((struct mob_data *)bl,-1,-1,3); break; /* PotionPitcher added by Tato [17/08/03] */ - case AM_POTIONPITCHER: /* ポーションピッチャー */ + case AM_POTIONPITCHER: { int a=0,i,bonus,c=0; bonus=100+(skilllv*10); @@ -1648,15 +1903,8 @@ } } break; - case AM_CP_WEAPON: - break; - case AM_CP_SHIELD: - break; - case AM_CP_ARMOR: - break; - case AM_CP_HELM: - break; - case SA_DISPELL: /* ディスペル */ + /* ディスペル */ + case SA_DISPELL: clif_skill_nodamage(src,bl,skillid,skilllv,1); skill_status_change_end(bl, SC_SILENCE , -1 ); skill_status_change_end(bl, SC_BLIND , -1 ); @@ -1666,9 +1914,26 @@ skill_status_change_end(bl, SC_SLEEP , -1 ); skill_status_change_end(bl, SC_STAN , -1 ); skill_status_change_end(bl, SC_POISON , -1 ); + skill_status_change_end(bl, SC_CURSE , -1 ); + skill_status_change_end(bl, SC_INCREASEAGI , -1 ); + skill_status_change_end(bl, SC_SUFFRAGIUM , -1 ); + skill_status_change_end(bl, SC_MAGNIFICAT , -1 ); + skill_status_change_end(bl, SC_APPLEIDUN , -1 ); + skill_status_change_end(bl, SC_CP_WEAPON , -1 ); + skill_status_change_end(bl, SC_CP_ARMOR , -1 ); + skill_status_change_end(bl, SC_CP_SHIELD , -1 ); + skill_status_change_end(bl, SC_CP_HELM , -1 ); + skill_status_change_end(bl, SC_DECREASEAGI , -1 ); + skill_status_change_end(bl, SC_FROSTWEAPON,-1); + skill_status_change_end(bl, SC_LIGHTNINGLOADER,-1); + skill_status_change_end(bl, SC_SEISMICWEAPON,-1); + skill_status_change_end(bl, SC_FLAMELAUNCHER,-1); + skill_status_change_end(bl, SC_DIVINA , -1 ); + skill_status_change_end(bl, SC_GLORIA , -1 ); + skill_status_change_end(bl, SC_MAGNIFICAT, -1 ); break; - - case TF_BACKSLIDING: /* バックステップ */ + /* バックステップ */ + case TF_BACKSLIDING: battle_stopwalking(src,1); skill_blown(src,bl,5|0x10000); clif_fixpos(src); @@ -1689,29 +1954,49 @@ if(md){ clif_skill_nodamage(src,bl,skillid,skilllv,1); md->def_ele=skill_get_pl(skillid); - if(md->def_ele==0) /* ランダム変化、ただし、*/ + if(md->def_ele==0) /* ランダム変化、ただし、 */ md->def_ele=rand()%9; /* 不死属性は除く */ md->def_ele+=(1+rand()%4)*20; /* 属性レベルはランダム */ } break; - - case NPC_SUICIDE: /* 自決 */ + + /* 自決 */ + case NPC_SUICIDE: if(md){ clif_skill_nodamage(src,bl,skillid,skilllv,1); mob_damage(NULL,md,md->hp); } break; - case NPC_SUMMONSLAVE: /* 手下召喚 */ - case NPC_SUMMONMONSTER: /* MOB召喚 */ + /* 手下召喚、MOB召喚 */ + case NPC_SUMMONSLAVE: + case NPC_SUMMONMONSTER: if(md) mob_summonslave(md,mob_db[md->class].skill[md->skillidx].val1, skilllv,(skillid==NPC_SUMMONSLAVE)?1:0); break; - - case NPC_EMOTION: /* エモーション */ + /* エモーション */ + case NPC_EMOTION: clif_emotion(&md->bl,mob_db[md->class].skill[md->skillidx].val1); break; + + case BD_ENCORE: /* RoVeRT */ + sd->skillitem = sd->last_skillid; + sd->skillitemlv = sd->last_skilllv; + clif_item_skill(sd,sd->last_skillid,sd->last_skilllv,sd->status.name); + sd->last_skillid = BD_ENCORE; + break; + + case SA_CASTCANCEL: /* RoVeRT */ + clif_skill_nodamage(src,bl,skillid,skilllv,1); + skill_castcancel(src); + break; + + case SA_AUTOSPELL: /* RoVeRT */ + clif_skill_nodamage(src,bl,skillid,skilllv,1); + skill_status_change_start( bl, SkillStatusChangeTable[skillid], skilllv, 0 ); + break; + } return 0; } @@ -1763,17 +2048,17 @@ return 0; } } - + printf("PC %d skill castend skill=%d\n",sd->bl.id,sd->skillid); - if( (skill_get_inf(sd->skillid)&1) && // 彼我敵対関係チェック + if( (skill_get_inf(sd->skillid)&1) && /* 彼我敵対関係チェック */ battle_check_target(&sd->bl,bl, BCT_ENEMY)<=0 ) return 0; switch( skill_get_nk(sd->skillid) ) { /* 攻撃系/吹き飛ばし系 */ - case 0: case 2: + case 0: case 2: skill_castend_damage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0); break; case 1:/* 支援系 */ @@ -1783,7 +2068,6 @@ skill_castend_nodamage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0); break; } - return 0; } @@ -1804,8 +2088,9 @@ switch(skillid) { - case MG_THUNDERSTORM: /* サンダーストーム */ - case WZ_HEAVENDRIVE: /* ヘヴンズドライブ */ + /* サンダーストーム、ヘブンズドライブ */ + case MG_THUNDERSTORM: + case WZ_HEAVENDRIVE: skill_area_temp[1]=src->id; skill_area_temp[2]=x; skill_area_temp[3]=y; @@ -1815,7 +2100,8 @@ skill_castend_damage_id); break; - case PR_BENEDICTIO: /* 聖体降福 */ + /* 聖体 */ + case PR_BENEDICTIO: skill_area_temp[1]=src->id; map_foreachinarea(skill_area_sub, src->m,x-1,y-1,x+1,y+1,0, @@ -1826,7 +2112,7 @@ src,skillid,skilllv,tick, flag|BCT_ENEMY|1, skill_castend_damage_id); break; - + case BS_HAMMERFALL: /* ハンマーフォール */ skill_area_temp[1]=src->id; skill_area_temp[2]=x; @@ -1836,31 +2122,58 @@ src,skillid,skilllv,tick, flag|BCT_ENEMY|2, skill_castend_nodamage_id); break; + + case BA_FROSTJOKE: /* ハンマーフォール */ + skill_area_temp[1]=src->id; + skill_area_temp[2]=x; + skill_area_temp[3]=y; + map_foreachinarea(skill_area_sub, + src->m,x-2,y-2,x+2,y+2,0, + src,skillid,skilllv,tick, flag|BCT_ENEMY|2, + skill_castend_nodamage_id); + break; - case MG_SAFETYWALL: /* セイフティウォール */ - case MG_FIREWALL: /* ファイヤーウォール */ - case AL_PNEUMA: /* ニューマ */ - case WZ_ICEWALL: /* アイスウォール */ - case WZ_FIREPILLAR: /* ファイアピラー */ - case WZ_QUAGMIRE: /* クァグマイア */ - case WZ_VERMILION: /* ロードオブヴァーミリオン */ - case WZ_STORMGUST: /* ストームガスト */ - case PR_SANCTUARY: /* サンクチュアリ */ - case PR_MAGNUS: /* マグヌスエクソシズム */ - case HT_SKIDTRAP: /* スキッドトラップ */ - case HT_LANDMINE: /* ランドマイン */ - case HT_ANKLESNARE: /* アンクルスネア */ - case HT_SHOCKWAVE: /* ショックウェーブトラップ */ - case HT_SANDMAN: /* サンドマン */ - case HT_FLASHER: /* フラッシャー */ - case HT_FREEZINGTRAP: /* フリージングトラップ */ - case HT_BLASTMINE: /* ブラストマイン */ - case HT_CLAYMORETRAP: /* クレイモアートラップ */ - case AS_VENOMDUST: /* ベノムダスト */ + /* セイフティウォール、ニューマ、ファイヤーウォール、アイスウォール */ + case MG_SAFETYWALL: + case AL_PNEUMA: + case MG_FIREWALL: + case WZ_ICEWALL: + /* ファイヤーピラー、クァグマイア */ + case WZ_FIREPILLAR: + case WZ_QUAGMIRE: + case AM_DEMONSTRATION: + /* ロードオブバーミリオン、ストームガスト */ + case WZ_VERMILION: + case WZ_STORMGUST: + /* サンクチュアリ、マグヌスエクソシズム */ + case PR_SANCTUARY: + case PR_MAGNUS: + case WZ_SIGHTRASHER: + /* スキッドトラップ、ランドマイン、アンクルスネア、ショックウェーブ */ + case HT_SKIDTRAP: + case HT_LANDMINE: + case HT_ANKLESNARE: + case HT_SHOCKWAVE: + /* サンドマン、フラッシャー、フリージング、ブラストマイン */ + case HT_SANDMAN: + case HT_FLASHER: + case HT_FREEZINGTRAP: + case HT_BLASTMINE: + /* クレイモアー、ベノムダスト */ + case HT_CLAYMORETRAP: + case AS_VENOMDUST: + case CR_GRANDCROSS: + /* Test */ + case SA_VOLCANO: + case SA_DELUGE: + case SA_VIOLENTGALE: + case SA_LANDPROTECTOR: + if(skillid == 81) + skill_status_change_end(src, SC_SIGHT, -1); skill_unitsetting(src,skillid,skilllv,x,y,0); break; - case WZ_METEOR: //メテオストーム + case WZ_METEOR: /* メテオストーム */ for(i=0;i<2+(skilllv>>1);i++) { int j = 0, c; do { @@ -1889,8 +2202,16 @@ } skill_addtimerskill(src,tick+i*1000,0,tmpx,tmpy,skillid,skilllv,-1,flag); break; - - case AL_WARP: /* ワープポータル */ + /* ワープポータル */ + case AL_WARP: + if(map[sd->bl.m].flag.noteleport) /* テレポ禁止 */ + break; + clif_skill_warppoint(sd,sd->skillid,sd->status.save_point.map, + (sd->skilllv>1)?sd->status.memo_point[0].map:"", + (sd->skilllv>2)?sd->status.memo_point[1].map:"", + (sd->skilllv>3)?sd->status.memo_point[2].map:""); + break; + case 336: if(map[sd->bl.m].flag.noteleport) /* テレポ禁止 */ break; clif_skill_warppoint(sd,sd->skillid,sd->status.save_point.map, @@ -1902,8 +2223,56 @@ if(sd) pc_movepos(sd,x,y); break; - } + case AM_CANNIBALIZE: /* RoVeRT */ + { + int m,c; + int i,x,y; + + int qty=skilllv*2/3; + qty = (qty>1)?qty:1; + + struct mob_data *md; + for(i=0;iskillx + (rand()%6 - 3); + y = sd->skilly + (rand()%6 - 3); + }while( ( (c=map_getcell(sd->bl.m,x,y))==1 || c==5) ); + + if ((m=mob_once_spawn(sd,"this",x,y,"--ja--",1118, 1,""))){ + md=(struct mob_data*)map_id2bl(m); + skill_status_change_start((struct block_list *)map_id2bl(m), SC_CANNIBALIZE, skilllv, 0 ); + md->hp = md->hp * skilllv * 10 / 100; + } + } + } + break; + case AM_SPHEREMINE: /* RoVeRT */ + { + int m,c; + int i,x,y; + + int qty=skilllv*2/3; + qty = (qty>1)?qty:1; + + struct mob_data *md; + for(i=0;iskillx + (rand()%6 - 3); + y = sd->skilly + (rand()%6 - 3); + }while( ( (c=map_getcell(sd->bl.m,x,y))==1 || c==5) ); + + if ((m=mob_once_spawn(sd,"this",x,y,"--ja--",1142, 1,""))){ + /* Permanent residence time of suicide bombing being 5 seconds, drift speed 300 (per 0.1 seconds becomes quick 5 at a time) */ + md=(struct mob_data*)map_id2bl(m); + skill_status_change_start((struct block_list *)map_id2bl(m), SC_SPHEREMINE, skilllv, 0 ); + /* md->hp = md->hp * skilllv * 10 / 100; /. == instant explode */ + } + } + } + break; + + } return 0; } @@ -1913,7 +2282,7 @@ */ int skill_castend_map( struct map_session_data *sd,int skill_num, const char *map) { - int x=0,y=0; + int x=0,y=0,itid=0; if( sd==NULL || sd->bl.prev == NULL || pc_isdead(sd)) return 0; @@ -1923,7 +2292,7 @@ if( skill_num != sd->skillid) /* 不正パケットらしい */ return 0; - + pc_stopattack(sd); printf("PC %d skill castend skill =%d map=%s\n",sd->bl.id,skill_num,map); @@ -1932,15 +2301,14 @@ return 0; switch(skill_num){ - case AL_TELEPORT: /* テレポート */ + case AL_TELEPORT: /* テレポート */ if(strcmp(map,"Random")==0) pc_randomwarp(sd,3); else pc_setpos(sd,sd->status.save_point.map, sd->status.save_point.x,sd->status.save_point.y,3); break; - - case AL_WARP: /* ワープポータル */ + case AL_WARP: /* ワープポータル */ { const struct point *p[]={ &sd->status.save_point,&sd->status.memo_point[0], @@ -1957,6 +2325,13 @@ } if(x==0 || y==0) /* 不正パケット? */ return 0; + +// if(!pc_check_equip_dcard(sd,4132) && (itid=pc_search_inventory(sd, 717)) <= 0){ + if(!sd->no_gemstone && (itid=pc_search_inventory(sd, 717)) <= 0){ // RoVeRT + clif_skill_fail(sd,sd->skillid,8,0); + return 0; + }else + pc_delitem(sd, itid, 1, 0); group=skill_unitsetting(&sd->bl,sd->skillid,sd->skilllv,sd->skillx,sd->skilly,0); group->valstr=malloc(16); @@ -1968,16 +2343,51 @@ group->val2=(x<<16)|y; } break; - - case RG_INTIMIDATE: /* インティミデイト */ + case RG_INTIMIDATE: /* テレポート */ if(strcmp(map,"Random")==0) pc_randomwarp(sd,3); else pc_setpos(sd,sd->status.save_point.map, sd->status.save_point.x,sd->status.save_point.y,3); break; + case 336: /* ワープポータル */ + { + const struct point *p[]={ + &sd->status.save_point,&sd->status.memo_point[0], + &sd->status.memo_point[1],&sd->status.memo_point[2], + }; + struct skill_unit_group *group; + int i; + for(i=0;iskilllv;i++){ + if(strcmp(map,p[i]->map)==0){ + x=p[i]->x; + y=p[i]->y; + break; + } + } + if(x==0 || y==0) /* 不正パケット? */ + return 0; +/* +// if(!pc_check_equip_dcard(sd,4132) && (itid=pc_search_inventory(sd, 717)) <= 0){ + if(!sd->no_gemstone && (itid=pc_search_inventory(sd, 717)) <= 0){ // RoVeRT + clif_skill_fail(sd,sd->skillid,8,0); + return 0; + }else + pc_delitem(sd, itid, 1, 0);*/ + + group=skill_unitsetting(&sd->bl,sd->skillid,sd->skilllv,sd->skillx,sd->skilly,0); + group->valstr=malloc(16); + if(group->valstr==NULL){ + printf("skill_castend_map: out of memory !\n"); + exit(0); + } + memcpy(group->valstr,map,16); + group->val2=(x<<16)|y; + } + break; } + return 0; } @@ -1991,29 +2401,26 @@ int i,count=1,limit=10000,val1=skilllv,val2=0; int target=BCT_ENEMY,interval=1000,range=0; int dir=0; - + switch(skillid){ /* 設定 */ - - case MG_SAFETYWALL: /* セイフティウォール */ + + case MG_SAFETYWALL: /* セイフティウォール */ limit=5000*skilllv; val2=skilllv+1; target=(battle_config.defnotenemy)?BCT_NOENEMY:BCT_ALL; break; - - case MG_FIREWALL: /* ファイヤーウォール */ + case MG_FIREWALL: /* ファイヤーウォール */ dir=map_calc_dir(src,x,y); if(dir&1) count=5; else count=3; limit=1000*(val2=(4+skilllv)); interval=250; break; - - case AL_PNEUMA: /* ニューマ */ + case AL_PNEUMA: /* ニューマ */ target=(battle_config.defnotenemy)?BCT_NOENEMY:BCT_ALL; range=1; break; - - case AL_WARP: /* ワープポータル */ + case AL_WARP: /* ワープポータル */ target=BCT_ALL; val1=skillid+6; if(flag==0) @@ -2021,8 +2428,13 @@ else limit=5000*(1+skilllv); break; - - case PR_SANCTUARY: /* サンクチュアリ */ + case KN_BRANDISHSPEAR: /* ボルケーノ */ + range=4; + break; + case KN_SPEARBOOMERANG: /* ボルケーノ */ + range=3; + break; + case PR_SANCTUARY: /* サンクチュアリ */ count=21; limit=1000*(3*skilllv+1); val1=skilllv+3; @@ -2030,14 +2442,12 @@ target=BCT_ALL; range=1; break; - - case PR_MAGNUS: /* マグヌスエクソシズム */ + case PR_MAGNUS: /* マグヌス */ count=33; limit=1000*(skilllv+4); interval=3000; break; - - case WZ_FIREPILLAR: /* ファイアーピラー */ + case WZ_FIREPILLAR: /* ファイヤーピラー */ if(flag==0) limit=30000; else @@ -2046,158 +2456,221 @@ val1=skilllv+2; range=1; break; - case WZ_METEOR: /* メテオストーム */ + case WZ_METEOR: /* ロードオブヴァーミリオン */ limit=500; interval=500; - range=2; + range=4; + count=2*(skilllv); break; - - case WZ_VERMILION: /* ロードオブヴァーミリオン */ + case WZ_VERMILION: /* ロードオブヴァーミリオン */ limit=3500; interval=1500; range=4; break; - - case WZ_ICEWALL: /* アイスウォール */ + case WZ_ICEWALL: /* アイスウォール */ limit=4000*(1+skilllv); count=5; break; - - case WZ_STORMGUST: /* ストームガスト */ + case WZ_STORMGUST: /* ストームガスト */ limit=2000+skilllv*300; interval=450; range=4; break; - - case WZ_QUAGMIRE: /* クァグマイア */ + case WZ_QUAGMIRE: /* クァグマイア */ limit=5000*skilllv; interval=200; count=25; break; - - case HT_SKIDTRAP: /* スキッドトラップ */ + case HT_SKIDTRAP: /* スキッドトラップ */ limit=60000*(6-skilllv); range=1; break; - - case HT_LANDMINE: /* ランドマイン */ + case HT_LANDMINE: /* ランドマイン */ limit=40000*(6-skilllv); range=1; break; - - case HT_ANKLESNARE: /* アンクルスネア */ + case HT_ANKLESNARE: /* アンクルスネア */ limit=50000*(6-skilllv); range=1; val1=skilllv*5000; interval=val1+5000; break; - - case HT_SHOCKWAVE: /* ショックウェーブトラップ */ + case HT_SHOCKWAVE: /* ショックウェーブ */ limit=40000*(6-skilllv); range=1; val1=skilllv*15+10; break; - - case HT_SANDMAN: /* サンドマン */ + case HT_SANDMAN: /* サンドマン */ limit=30000*(6-skilllv); range=1; break; - - case HT_FLASHER: /* フラッシャー */ + case HT_FLASHER: /* フラッシャー */ limit=30000*(6-skilllv); range=1; break; - - case HT_FREEZINGTRAP: /* フリージングトラップ */ + case HT_FREEZINGTRAP: /* フリージング */ limit=30000*(6-skilllv); range=1; break; - - case HT_BLASTMINE: /* ブラストマイン */ + case HT_BLASTMINE: /* ブラストマイン */ limit=5000*(6-skilllv); interval=3000; range=1; break; - - case HT_CLAYMORETRAP: /* クレイモアートラップ */ + case HT_CLAYMORETRAP: /* クレイモアートラップ */ limit=20000*(skilllv); interval=3000; range=1; break; - - case AS_VENOMDUST: /* ベノムダスト */ + case AS_VENOMDUST: /* ベノムダスト */ limit=5000*skilllv; interval=1000; count=5; break; - - case CR_GRANDCROSS: /* グランドクロス */ - count=33; + case AM_DEMONSTRATION: /* ファイヤーピラー */ + limit=5000*skilllv; + interval=2000; + val1=skilllv+2; + range=1; + break; + case CR_SHIELDBOOMERANG: /* ボルケーノ */ + range=3; + break; + case CR_GRANDCROSS: /* グランドクロス */ + count=33; /* 64; */ limit=1000*(skilllv+4); interval=3000; + range=3; break; - - case SA_VOLCANO: /* ボルケーノ */ - range=skilllv+4; + case MO_STEELBODY: /* サービスフォーユー */ + val1=skilllv; target=BCT_ALL; break; - - case SA_DELUGE: /* デリュージ */ - range=skilllv+4; + case MO_BLADESTOP: /* サービスフォーユ */ + target=BCT_ALL; + break; + case SA_VOLCANO: /* グランドクロス */ + count=33; + limit=40000; + val1=skilllv*15+10; + target=BCT_ALL; + break; + case SA_DELUGE: /* グランドクロス */ + count=33; + limit=40000; + val1=skilllv*15+10; + target=BCT_ALL; + break; + case SA_VIOLENTGALE: /* グランドクロス */ + count=33; + limit=40000; + val1=skilllv*15+10; + target=BCT_ALL; + break; + case SA_LANDPROTECTOR: /* グランドクロス */ + count=33; + limit=40000; + val1=skilllv*15+10; + target=BCT_ALL; + break; + case BD_ETERNALCHAOS: + count=64; target=BCT_ALL; break; - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ count=81; - limit=40000*(6-skilllv); - val1=skilllv*15+10; + limit=40000*(6-skilllv); + val1=skilllv*15+10; + target=BCT_ALL; + break; + case BD_RINGNIBELUNGEN: + count=49; + target=BCT_ALL; + break; + case BD_ROKISWEIL: /* 戦太鼓の響き */ + count=81; +// limit=40000*(6-skilllv); + val1=skilllv*15+10; + target=BCT_ALL; + break; + case BD_INTOABYSS: + count=49; + target=BCT_ALL; + break; + case BD_SIEGFRIED: /* 不死身のジークフリード */ + count=81; + target=BCT_ALL; + break; + case BA_DISSONANCE: /* 不協和音 */ + count=81; + target=BCT_ENEMY; + break; + case BA_FROSTJOKE: /* 口笛 */ + count=81; +// limit=40000*(6-skilllv); + range=9; + val1=skilllv*15+10; + target=BCT_ALL; + break; + case BA_WHISTLE: /* イドゥンの林檎 */ + count=81; +// limit=40000*(6-skilllv); + target=BCT_ALL; + break; + case BA_ASSASSINCROSS: /* イドゥンの林檎 */ + count=81; +// limit=40000*(6-skilllv); target=BCT_ALL; break; - - case BD_SIEGFRIED: /* 不死身のジークフリード */ + case BA_POEMBRAGI: /* イドゥンの林檎 */ count=81; +// limit=40000*(6-skilllv); target=BCT_ALL; break; - - case BA_DISSONANCE: /* 不協和音 */ + case BA_APPLEIDUN: /* イドゥンの林檎 */ count=81; - target=BCT_ENEMY; +// limit=40000*(6-skilllv); + target=BCT_ALL; break; - - case BA_WHISTLE: /* 口笛 */ + case DC_UGLYDANCE: /* 自分勝手なダンス */ count=81; - limit=40000*(6-skilllv); - range=9; +// limit=40000*(6-skilllv); + range=5; val1=skilllv*15+10; target=BCT_ALL; break; - - case BA_APPLEIDUN: /* イドゥンの林檎 */ + case DC_HUMMING: /* サービスフォーユー */ count=81; +// limit=40000*(6-skilllv); + val1=skilllv*15+10; target=BCT_ALL; break; - - case DC_UGLYDANCE: /* 自分勝手なダンス */ + case DC_DONTFORGETME: /* サービスフォーユー */ count=81; - limit=40000*(6-skilllv); - range=5; +// limit=40000*(6-skilllv); val1=skilllv*15+10; target=BCT_ALL; break; - - case DC_FORTUNEKISS: /* 幸運のキス */ + case DC_FORTUNEKISS: /* 幸運のキス */ count=81; - limit=40000*(6-skilllv); +// limit=40000*(6-skilllv); val1=skilllv*15+10; target=BCT_ALL; break; - - case DC_SERVICEFORYOU: /* サービスフォーユー */ + case DC_SERVICEFORYOU: /* サービスフォーユー */ count=81; - limit=40000*(6-skilllv); +// limit=40000*(6-skilllv); val1=skilllv*15+10; target=BCT_ALL; break; + case 336: /* ワープポータル */ + target=BCT_ALL; + val1=skillid+6; + if(flag==0) + limit=2000; + else + limit=5000*(1+skilllv); + break; }; group=skill_initunitgroup(src,count,skillid,skilllv, @@ -2214,8 +2687,9 @@ int ux=x,uy=y,val1=skilllv,val2=0,limit=group->limit,alive=1; int range=0; switch(skillid){ /* 設定 */ - case MG_FIREWALL: /* ファイヤーウォール */ - { + /* ファイヤーウォール */ + case MG_FIREWALL: + { if(dir&1){ /* 斜め配置 */ static const int dx[][5]={ { 1,1,0,0,-1 }, { -1,-1,0,0,1 }, @@ -2233,8 +2707,9 @@ val2=group->val2; } break; - - case PR_SANCTUARY: /* サンクチュアリ */ + + /* サンクチュアリ */ + case PR_SANCTUARY: { static const int dx[]={ -1,0,1, -2,-1,0,1,2, -2,-1,0,1,2, -2,-1,0,1,2, -1,0,1 }; @@ -2244,8 +2719,8 @@ uy+=dy[i]; } break; - - case PR_MAGNUS: /* マグヌスエクソシズム */ + /* マグヌスエクソシズム */ + case PR_MAGNUS: { static const int dx[]={ -1,0,1, -1,0,1, -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -1,0,1, -1,0,1, }; @@ -2256,8 +2731,73 @@ uy+=dy[i]; } break; - - case WZ_ICEWALL: /* アイスウォール */ + case CR_GRANDCROSS: + { + static const int dx[]={ -1,0,1, -1,0,1, -3,-2,-1,0,1,2,3, + -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -1,0,1, -1,0,1, }; + static const int dy[]={ + -3,-3,-3, -2,-2,-2, -1,-1,-1,-1,-1,-1,-1, + 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 2,2,2, 3,3,3 }; + ux+=dx[i]; + uy+=dy[i]; + } + break; + case SA_VOLCANO: + { + static const int dx[]={ -1,0,1, -1,0,1, -3,-2,-1,0,1,2,3, + -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -1,0,1, -1,0,1, }; + static const int dy[]={ + -3,-3,-3, -2,-2,-2, -1,-1,-1,-1,-1,-1,-1, + 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 2,2,2, 3,3,3 }; + ux+=dx[i]; + uy+=dy[i]; + } + break; + case SA_DELUGE: + { + static const int dx[]={ -1,0,1, -1,0,1, -3,-2,-1,0,1,2,3, + -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -1,0,1, -1,0,1, }; + static const int dy[]={ + -3,-3,-3, -2,-2,-2, -1,-1,-1,-1,-1,-1,-1, + 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 2,2,2, 3,3,3 }; + ux+=dx[i]; + uy+=dy[i]; + } + break; + case SA_VIOLENTGALE: { + static const int dx[]={ -1,0,1, -1,0,1, -3,-2,-1,0,1,2,3, + -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -1,0,1, -1,0,1, }; + static const int dy[]={ + -3,-3,-3, -2,-2,-2, -1,-1,-1,-1,-1,-1,-1, + 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 2,2,2, 3,3,3 }; + ux+=dx[i]; + uy+=dy[i]; + } + break; + case SA_LANDPROTECTOR: + { + static const int dx[]={ -1,0,1, -1,0,1, -3,-2,-1,0,1,2,3, + -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -1,0,1, -1,0,1, }; + static const int dy[]={ + -3,-3,-3, -2,-2,-2, -1,-1,-1,-1,-1,-1,-1, + 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 2,2,2, 3,3,3 }; + ux+=dx[i]; + uy+=dy[i]; + } + break; + case WZ_SIGHTRASHER: + { + static const int dx[]={ 3,2,1, -1,-2,-3, 0,0,0, 0,0,0, + 1,-1,1,-1, 2,-2,2,-2, 3,-3,3,-3, }; + static const int dy[]={ + 0,0,0, 0,0,0, 3,2,1, -1,-2,-3, + 1,1,-1,-1, 2,2,-2,-2, 3,3,-3,-3 }; + ux+=dx[i]; + uy+=dy[i]; + } + break; + /* アイスウォール */ + case WZ_ICEWALL: { static const int dirx[8]={0,-1,-1,-1,0,1,1,1}; static const int diry[8]={1,1,0,-1,-1,-1,0,1}; @@ -2273,13 +2813,13 @@ } } break; - - case WZ_QUAGMIRE: /* クァグマイア */ + /* クァグマイア */ + case WZ_QUAGMIRE: ux+=(i%5-2); uy+=(i/5-2); break; - - case AS_VENOMDUST: /* ベノムダスト */ + /* ベノムダスト */ + case AS_VENOMDUST: { static const int dx[]={-1,0,0,0,1}; static const int dy[]={0,-1,0,1,0}; @@ -2289,24 +2829,28 @@ break; /* ダンスなど */ - case BD_LULLABY: /* 子守歌 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD:/* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - case BA_DISSONANCE: /* 不協和音 */ - case BA_WHISTLE: /* 口笛 */ - case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ - case BA_POEMBRAGI: /* ブラギの詩 */ - case BA_APPLEIDUN: /* イドゥンの林檎 */ - case DC_UGLYDANCE: /* 自分勝手なダンス */ - case DC_HUMMING: /* ハミング */ - case DC_DONTFORGETME: /* 私を忘れないで… */ - case DC_FORTUNEKISS: /* 幸運のキス */ - case DC_SERVICEFORYOU: /* サービスフォーユー */ + /* 子守唄、ニヨルドの宴、永遠の混沌、戦太鼓の響き、ニーベルングの指輪 */ + case BD_LULLABY: + case BD_RICHMANKIM: + case BD_ETERNALCHAOS: + case BD_DRUMBATTLEFIELD: + case BD_RINGNIBELUNGEN: + /* ロキの叫び、深淵の中に、不死身のジークフリード */ + case BD_ROKISWEIL: + case BD_INTOABYSS: + case BD_SIEGFRIED: + /* 不協和音、口笛、夕陽のアサシンクロス、ブラギの詩、イドゥンの林檎 */ + case BA_DISSONANCE: + case BA_WHISTLE: + case BA_ASSASSINCROSS: + case BA_POEMBRAGI: + case BA_APPLEIDUN: + /* 自分勝手なダンス、ハミング、私を忘れないで…、幸運のキス、サービスフォーユー */ + case DC_UGLYDANCE: + case DC_HUMMING: + case DC_DONTFORGETME: + case DC_FORTUNEKISS: + case DC_SERVICEFORYOU: ux+=(i%9-4); uy+=(i/9-4); if(i==40) @@ -2382,9 +2926,13 @@ } if( race!=1 && race!=6 ){ int heal=sg->val2; - if( bl->type==BL_PC && - pc_check_equip_dcard((struct map_session_data *)bl,4128) ) - heal=0; /* 黄金蟲カード(ヒール量0) */ + if( bl->type==BL_PC ){ +// pc_check_equip_dcard((struct map_session_data *)bl,4128) ) +// heal=0; /* 黄金蟲カード(ヒール量0) */ + if (rand()%100 < ((struct map_session_data *)bl)->refmagic) { + heal=0; + } + } clif_skill_nodamage(&src->bl,bl,/*sg->skill_id*/28,heal,1); battle_heal(NULL,bl,heal,0); }else @@ -2410,9 +2958,13 @@ } if( element!=9 && race!=6 ){ int heal=sg->val2; - if( bl->type==BL_PC && - pc_check_equip_dcard((struct map_session_data *)bl,4128) ) - heal=0; /* 黄金蟲カード(ヒール量0) */ + if( bl->type==BL_PC){ +// pc_check_equip_dcard((struct map_session_data *)bl,4128) ) +// heal=0; /* 黄金蟲カード(ヒール量0) */ + if (rand()%100 < ((struct map_session_data *)bl)->refmagic) { + heal=0; + } + } clif_skill_nodamage(&src->bl,bl,/*sg->skill_id*/28,heal,1); battle_heal(NULL,bl,heal,0); }else @@ -2456,11 +3008,12 @@ } } break; - case 0x86: /* ロードオブヴァーミリオン(&ストームガスト) */ + /* ロードオブヴァーミリオン(&ストームガスト) */ + case 0x86: + case 0xab: skill_attack(BF_MAGIC,ss,&src->bl,bl, sg->skill_id,sg->skill_lv,tick,0); break; - case 0x7f: /* ファイヤーウォール */ if( (src->val2--)>0) skill_attack(BF_MAGIC,ss,&src->bl,bl, @@ -2508,7 +3061,8 @@ case 0x96: /* フラッシャー */ case 0x94: /* ショックウェーブトラップ */ case 0x91: /* アンクルスネア */ - skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,tick); + if (sg->unit_id!=0x91 || sg->val2==0) // コレだけを追加 + skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,tick); if(sg->val2==0){ sg->limit=DIFF_TICK(tick,sg->tick) +((sg->unit_id==0x91)?sg->val1/((battle_get_mode(bl)&0x20)?5:1):500); @@ -2534,25 +3088,34 @@ skill_status_change_start(bl,type,src->group->val1,(int)src); } break; - - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ - case 0xa1: /* 戦太鼓の響き */ - case 0xa2: /* ニーベルングの指輪 */ - case 0xa3: /* ロキの叫び */ - case 0xa4: /* 深淵の中に */ - case 0xa5: /* 不死身のジークフリード */ - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ - case 0xa8: /* 夕陽のアサシンクロス */ - case 0xa9: /* ブラギの詩 */ - case 0xaa: /* イドゥンの林檎 */ - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ - case 0xaf: /* サービスフォーユー */ + + /* Volcano, Deluge, Gale, Land */ + case 0x9a: + case 0x9b: + case 0x9c: + case 0x9d: + /* 子守唄、ニヨルドの宴、永遠の混沌、戦太鼓の響き、ニーベルングの指輪 */ + case 0x9e: + case 0x9f: + case 0xa0: + case 0xa1: + case 0xa2: + /* ロキの叫び、深淵の中に、不死身のジークフリード */ + case 0xa3: + case 0xa4: + case 0xa5: + /* 不協和音、口笛、夕陽のアサシンクロス、ブラギの詩、イドゥンの林檎 */ + case 0xa6: + case 0xa7: + case 0xa8: + case 0xa9: + case 0xaa: + /* 自分勝手なダンス、ハミング、私を忘れないで…、幸運のキス、サービスフォーユー */ + case 0xac: + case 0xad: + case 0xae: + case 0xaf: + /* Blah */ { struct skill_unit *unit2; struct status_change *sc_data=battle_get_sc_data(bl); @@ -2568,6 +3131,23 @@ } } break; + case 0xb2: + if(bl->type==BL_PC){ + pc_setpos((struct map_session_data *)bl, + sg->valstr,sg->val2>>16,sg->val2&0xffff,0); + } + break; + + /* Blah */ + case 0xb1: + case 0xb3: + case 0xb4: + case 0xb5: + { + skill_attack(BF_MAGIC,ss,&src->bl,bl, + sg->skill_id,sg->skill_lv,tick,0); + } break; + /* default: printf("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); break;*/ @@ -2588,18 +3168,19 @@ return 0; switch(sg->unit_id){ - case 0x83: /* サンクチュアリ */ - { + + /* サンクチュアリ */ + case 0x83: { int i,*list=sg->vallist; for(i=0;iid) list[i]=0; - } - break; - - case 0x7e: /* セイフティウォール */ - case 0x85: /* ニューマ */ - case 0x8e: /* クァグマイア */ + } break; + + /* ニューマ/セイフティウォール/クァグマイア */ + case 0x85: + case 0x7e: + case 0x8e: { struct skill_unit *unit2; struct status_change *sc_data=battle_get_sc_data(bl); @@ -2613,7 +3194,8 @@ } } break; - case 0x91: /* アンクルスネア */ + /* アンクルスネア */ + case 0x91: { struct block_list *target=map_id2bl(sg->val2); if( target==bl ) @@ -2621,47 +3203,49 @@ sg->limit=DIFF_TICK(tick,sg->tick)+1000; } break; - - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ -#if 0 - case 0xa1: /* 戦太鼓の響き */ -#endif - case 0xa2: /* ニーベルングの指輪 */ - case 0xa3: /* ロキの叫び */ -#if 0 - case 0xa4: /* 深淵の中に */ -#endif - case 0xa5: /* 不死身のジークフリード */ -#if 0 - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ -#endif - case 0xa8: /* 夕陽のアサシンクロス */ -#if 0 - case 0xa9: /* ブラギの詩 */ -#endif - case 0xaa: /* イドゥンの林檎 */ -#if 0 - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ -#endif - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ -#if 0 - case 0xaf: /* サービスフォーユー */ -#endif + + /* Volcano, Deluge, Gale, Land */ + case 0x9a: + case 0x9b: + case 0x9c: + case 0x9d: + /* 子守唄、ニヨルドの宴、永遠の混沌、戦太鼓の響き、ニーベルングの指輪 */ + case 0x9e: + case 0x9f: + case 0xa0: + case 0xa1: + case 0xa2: + /* ロキの叫び、深淵の中に、不死身のジークフリード */ + case 0xa3: + case 0xa4: + case 0xa5: + case 0xa6: + case 0xa7: + /* 不協和音、口笛、夕陽のアサシンクロス、ブラギの詩、イドゥンの林檎 */ + case 0xa8: + case 0xa9: + case 0xaa: + case 0xab: + case 0xac: + /* 自分勝手なダンス、ハミング、私を忘れないで…、幸運のキス、サービスフォーユー */ + case 0xad: + case 0xae: + case 0xaf: + /* Blah */ + case 0xb1: + case 0xb2: + case 0xb3: + case 0xb4: + case 0xb5: { struct skill_unit *unit2; struct status_change *sc_data=battle_get_sc_data(bl); int type=SkillStatusChangeTable[sg->skill_id]; if(sc_data[type].timer!=-1 && (unit2=(struct skill_unit *)sc_data[type].val4)==src){ skill_status_change_end(bl,type,-1); - } - } - break; - + } + } break; + /* default: printf("skill_unit_onout: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); break;*/ @@ -2683,27 +3267,44 @@ return 0; switch(sg->unit_id){ - case 0x85: /* ニューマ */ - case 0x7e: /* セイフティウォール */ - case 0x8e: /* クァグマイヤ */ - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ - case 0xa1: /* 戦太鼓の響き */ - case 0xa2: /* ニーベルングの指輪 */ - case 0xa3: /* ロキの叫び */ - case 0xa4: /* 深淵の中に */ - case 0xa5: /* 不死身のジークフリード */ - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ - case 0xa8: /* 夕陽のアサシンクロス */ - case 0xa9: /* ブラギの詩 */ - case 0xaa: /* イドゥンの林檎 */ - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ - case 0xaf: /* サービスフォーユー */ + + /* Volcano, Deluge, Gale, Land */ + case 0x9a: + case 0x9b: + case 0x9c: + case 0x9d: + /* ニューマ/セイフティウォール/クァグマイヤ */ + case 0x85: + case 0x7e: + case 0x8e: + /* 子守唄、ニヨルドの宴、永遠の混沌、戦太鼓の響き、ニーベルングの指輪 */ + case 0x9e: + case 0x9f: + case 0xa0: + case 0xa1: + case 0xa2: + /* ロキの叫び、深淵の中に、不死身のジークフリード */ + case 0xa3: + case 0xa4: + case 0xa5: + /* 不協和音、口笛、夕陽のアサシンクロス、ブラギの詩、イドゥンの林檎 */ + case 0xa6: + case 0xa7: + case 0xa8: + case 0xa9: + case 0xaa: + /* 自分勝手なダンス、ハミング、私を忘れないで…、幸運のキス、サービスフォーユー */ + case 0xab: + case 0xac: + case 0xad: + case 0xae: + case 0xaf: + /* Blah */ + case 0xb1: + case 0xb2: + case 0xb3: + case 0xb4: + case 0xb5: return skill_unit_onout(src,bl,tick); /* default: @@ -2788,7 +3389,7 @@ sd->skilltimer=-1; if(pc_isdead(sd)) return 0; - + if(!battle_config.skill_out_range_consume) { if(skill_get_range(sd->skillid) + battle_config.pc_skill_add_range < distance(sd->bl.x,sd->bl.y,sd->skillx,sd->skilly)) { clif_skill_fail(sd,sd->skillid,0,0); @@ -2837,6 +3438,20 @@ if(sd->skillitem==sd->skillid) { /* アイテムの場合無条件成功 */ sd->skillitem = sd->skillitemlv = -1; + + if (sd->last_skillid==BD_ENCORE){ + sp = skill_get_sp(sd->skillid, sd->skilllv)/2; + + if( sp>0 && sd->status.sp < sp) { /* SPチェック */ + clif_skill_fail(sd,sd->skillid,1,0); /* SP不足:失敗通知 */ + return 0; + } + if(sp) { /* SP消費 */ + sd->status.sp-=sp; + clif_updatestatus(sd,SP_SP); + } + } + }else{ if(sd->sc_data[SC_DIVINA].timer!=-1 || sd->sc_data[SC_STEELBODY].timer!=-1) { clif_skill_fail(sd,sd->skillid,0,0); @@ -2856,51 +3471,51 @@ case SA_VOLCANO: case SA_DELUGE: case SA_VIOLENTGALE: - item_id[0]=715; // yellow_gem = 715; + item_id[0]=715; /* yellow_gem = 715; */ item_amount[0]+=1; break; case SA_DISPELL: - item_id[1]=715; // yellow_gem = 715; + item_id[1]=715; /* yellow_gem = 715; */ item_amount[1]+=1; break; - case MG_STONECURSE: // ストーンカース - case AS_VENOMDUST: // ベナムダスト - item_id[0]=716; // red_gem = 716; + case MG_STONECURSE: /* ストーンカース */ + case AS_VENOMDUST: /* ベナムダスト */ + item_id[0]=716; /* red_gem = 716; */ item_amount[0]+=1; break; case SA_LANDPROTECTOR: - item_id[1]=715; // yellow_gem = 715; + item_id[1]=715; /* yellow_gem = 715; */ item_amount[1]+=1; break; - case MG_SAFETYWALL: // セイフティウォール - case AL_WARP: // ワープポータル - case ALL_RESURRECTION: // リザレクション - case PR_SANCTUARY: // サンクチュアリ - case PR_MAGNUS: // マグヌスエクソシズム - case WZ_FIREPILLAR: // ファイアーピラー - item_id[0]=717; // blue_gem = 717; + case MG_SAFETYWALL: /* セイフティウォール */ +/* remove to after location selection case AL_WARP: /. ワープポータル */ + case ALL_RESURRECTION: /* リザレクション */ + case PR_SANCTUARY: /* サンクチュアリ */ + case PR_MAGNUS: /* マグヌスエクソシズム */ + case WZ_FIREPILLAR: /* ファイアーピラー */ + item_id[0]=717; /* blue_gem = 717; */ item_amount[0]+=1; break; case SA_FLAMELAUNCHER: - item_id[0]=990; // 火原石 + item_id[0]=990; /* 火原石 */ item_amount[0]+=1; break; case SA_FROSTWEAPON: - item_id[0]=991; // 水原石 + item_id[0]=991; /* 水原石 */ item_amount[0]+=1; break; case SA_LIGHTNINGLOADER: - item_id[0]=992; // 風原石 + item_id[0]=992; /* 風原石 */ item_amount[0]+=1; break; case SA_SEISMICWEAPON: - item_id[0]=993; // 地原石 + item_id[0]=993; /* 地原石 */ item_amount[0]+=1; break; @@ -2914,26 +3529,26 @@ case HT_FLASHER: /* フラッシャー */ case HT_FREEZINGTRAP: /* フリージングトラップ */ case HT_CLAYMORETRAP: /* クレイモアートラップ */ - item_id[0]=1065; // 設置用トラップ; + item_id[0]=1065; /* 設置用トラップ; */ item_amount[0]+=1; break; case AL_HOLYWATER: /* アクアベネディクタ */ - if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y)!=3){ //水場判定 + if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y)!=3){ /* 水場判定 */ clif_skill_fail(sd,sd->skillid,0,0); return 0; } - item_id[0]=713; // 空きビン; + item_id[0]=713; /* 空きビン; */ item_amount[0]+=1; break; case PR_ASPERSIO: /* アスペルシオ */ - item_id[0]=523; // 聖水; + item_id[0]=523; /* 聖水; */ item_amount[0]+=1; break; case WZ_WATERBALL: /* ウォーターボール */ - if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y)!=3){ //水場判定 + if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y)!=3){ /* 水場判定 */ clif_skill_fail(sd,sd->skillid,0,0); return 0; } @@ -2947,48 +3562,51 @@ } break; - case MC_VENDING: // 露店開設 + case MC_VENDING: /* 露店開設 */ if(!pc_iscarton(sd)) { clif_skill_fail(sd,sd->skillid,0,0); return 0; } break; - case AC_DOUBLE: // ダブルストレイフィング - case AC_SHOWER: // アローシャワー + case AC_DOUBLE: /* ダブルストレイフィング */ + case AC_SHOWER: /* アローシャワー */ + case AC_CHARGEARROW: /* チャージアロー */ if( sd->status.weapon != 11) { - clif_skill_fail(sd,sd->skillid,6,0); // 弓 + clif_skill_fail(sd,sd->skillid,6,0); /* 弓 */ return 0; } + item_id[0]=1749 > 1771; + item_amount[0]+=1; break; - case KN_BRANDISHSPEAR: // ブランディッシュスピア + case KN_BRANDISHSPEAR: /* ブランディッシュスピア */ if(!pc_isriding(sd)) { clif_skill_fail(sd,sd->skillid,0,0); - return 0; // ,ペコペコ状態 + return 0; /* ,ペコペコ状態 */ } break; - case KN_PIERCE: // ピアース - case KN_SPEARSTAB: // スピアスタブ - case KN_SPEARBOOMERANG: // スピアブーメラン + case KN_PIERCE: /* ピアース */ + case KN_SPEARSTAB: /* スピアスタブ */ + case KN_SPEARBOOMERANG: /* スピアブーメラン */ if(sd->status.weapon != 4 && sd->status.weapon != 5) { - clif_skill_fail(sd,sd->skillid,6,0); // 窓 + clif_skill_fail(sd,sd->skillid,6,0); /* 窓 */ return 0; } break; - case KN_TWOHANDQUICKEN: // ツーハンドクイッケン + case KN_TWOHANDQUICKEN: /* ツーハンドクイッケン */ if( sd->status.weapon != 3) { - clif_skill_fail(sd,sd->skillid,6,0); // 両手剣 + clif_skill_fail(sd,sd->skillid,6,0); /* 両手剣 */ return 0; } break; - case BS_ADRENALINE: // アドレナリンラッシュ - case BS_HAMMERFALL: // ハンマーフォール + case BS_ADRENALINE: /* アドレナリンラッシュ */ + case BS_HAMMERFALL: /* ハンマーフォール */ if( sd->status.weapon != 6 && sd->status.weapon != 7 && sd->status.weapon != 8) { - clif_skill_fail(sd,sd->skillid,6,0); // 斧・でメイス + clif_skill_fail(sd,sd->skillid,6,0); /* 斧・でメイス */ return 0; } break; @@ -3009,19 +3627,60 @@ break; case AS_GRIMTOOTH: /* グリムトゥース */ - if(!pc_ishiding(sd)) { // ハイディング状態 + if(!pc_ishiding(sd)) { /* ハイディング状態 */ clif_skill_fail(sd,sd->skillid,0,0); return 0; } if( sd->status.weapon != 16) { - clif_skill_fail(sd,sd->skillid,6,0); // カタール消費 + clif_skill_fail(sd,sd->skillid,6,0); /* カタール消費 */ return 0; } break; - case CR_SPEARQUICKEN: // スピアクイッケン - if( sd->status.weapon != 4 && sd->status.weapon != 5) { - clif_skill_fail(sd,sd->skillid,6,0); // 両手槍 + case AS_SONICBLOW: /* SONICBLOW */ + if( sd->status.weapon != 16) { + clif_skill_fail(sd,sd->skillid,6,0); /* 両手槍 */ + return 0; + } + break; + + case AM_CANNIBALIZE: + item_id[0]=7137; + item_amount[0]+=1; + break; + + case AM_DEMONSTRATION: + case AM_SPHEREMINE: + item_id[0]=7138; + item_amount[0]+=1; + break; + + case AM_ACIDTERROR: + item_id[0]=7136; + item_amount[0]+=1; + break; + + case AM_CP_WEAPON: + case AM_CP_SHIELD: + case AM_CP_ARMOR: + case AM_CP_HELM: + item_id[0]=7139; + item_amount[0]+=1; + break; + + case CR_AUTOGUARD: /* スピアクイッケン */ + case CR_SHIELDCHARGE: + case CR_SHIELDBOOMERANG: + case CR_REFLECTSHIELD: + if(!sd->status.shield) { + clif_skill_fail(sd,sd->skillid,0,0); /* 両手槍 */ + return 0; + } + break; + + case CR_SPEARQUICKEN: /* スピアクイッケン */ + if( sd->status.weapon != 4 || sd->status.weapon != 5) { + clif_skill_fail(sd,sd->skillid,6,0); /* 両手槍 */ return 0; } break; @@ -3033,7 +3692,7 @@ } break; - case MO_EXTREMITYFIST: // 阿修羅覇鳳拳 + case MO_EXTREMITYFIST: /* 阿修羅覇鳳拳 */ tick = gettick(); if( sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1) { clif_skill_fail(sd,sd->skillid,0,0); @@ -3041,14 +3700,14 @@ } else { if(sd->combo_delay3 <= tick && tick <= sd->combo_delay3 + battle_config.asuradelay) - spiritball = 4; // 氣球 - else spiritball = 5; // 氣球 + spiritball = 4; /* 氣球 */ + else spiritball = 5; /* 氣球 */ } sd->skill_old = 0; break; - case MO_FINGEROFFENSIVE: //指弾 - spiritball = sd->skilllv; // 氣球 + case MO_FINGEROFFENSIVE: /* 指弾 */ + spiritball = sd->skilllv; /* 氣球 */ if (sd->spiritball > 0 && sd->spiritball < spiritball) { spiritball = sd->spiritball; sd->spiritball_old = sd->spiritball; @@ -3056,8 +3715,8 @@ else sd->spiritball_old = sd->skilllv; break; - case MO_INVESTIGATE: //発勁 - spiritball = 1; // 氣球 + case MO_INVESTIGATE: /* 発勁 */ + spiritball = 1; /* 氣球 */ break; case MO_BODYRELOCATION: @@ -3065,15 +3724,15 @@ clif_skill_fail(sd,sd->skillid,0,0); return 0; } else - spiritball = 1; // 氣球 + spiritball = 1; /* 氣球 */ break; - case MO_STEELBODY: // 金剛 - case MO_EXPLOSIONSPIRITS: // 爆裂波動 - spiritball = 5; // 氣球 + case MO_STEELBODY: /* 金剛 */ + case MO_EXPLOSIONSPIRITS: /* 爆裂波動 */ + spiritball = 5; /* 氣球 */ break; - case MO_CHAINCOMBO: //連打掌 + case MO_CHAINCOMBO: /* 連打掌 */ tick = gettick(); if(sd->combo_delay1 <= tick && tick <= sd->combo_delay1 + 300) { if(sd->skill_old == sd->skillid) @@ -3087,7 +3746,7 @@ } break; - case MO_COMBOFINISH: //猛龍拳 + case MO_COMBOFINISH: /* 猛龍拳 */ tick = gettick(); spiritball = 1; if(sd->combo_delay2 <= tick && tick <= sd->combo_delay2 + 300) { @@ -3102,9 +3761,71 @@ } break; -// case RG_BACKSTAP: // バックスタブ - case RG_RAID: // サプライズアタック - if(!pc_ishiding(sd)) { // ハイディング状態 +/* case RG_BACKSTAP: /. バックスタブ */ + case RG_RAID: /* サプライズアタック */ + if(!pc_ishiding(sd)) { /* ハイディング状態 */ + clif_skill_fail(sd,sd->skillid,0,0); + return 0; + } + break; + + case SA_CASTCANCEL: + sp=skill_get_sp(sd->cast_skillid, sd->cast_skilllv) / 2; /* 消費SP */ + if(sd->dsprate!=100) + sp=sp*sd->dsprate/100; /* 消費SP修正 */ + + sd->cast_skillid = -1; + sd->cast_skilllv = -1; + break; + + case BA_MUSICALSTRIKE: + if( sd->status.weapon != 13) { + clif_skill_fail(sd,sd->skillid,6,0); /* 両手剣 */ + return 0; + } + break; + + case BA_DISSONANCE: + case BA_WHISTLE: + case BA_ASSASSINCROSS: + case BA_POEMBRAGI: + case BA_APPLEIDUN: + if(sd->sc_data[SkillStatusChangeTable[sd->skillid]].timer!=-1) + sp=0; /* 解除する場合はSP消費しない */ + break; + + case DC_THROWARROW: + if( sd->status.weapon != 14) { + clif_skill_fail(sd,sd->skillid,6,0); /* 両手剣 */ + return 0; + } + break; + + case DC_UGLYDANCE: + case DC_HUMMING: + case DC_DONTFORGETME: + case DC_FORTUNEKISS: + case DC_SERVICEFORYOU: + if(sd->sc_data[SkillStatusChangeTable[sd->skillid]].timer!=-1) + sp=0; /* 解除する場合はSP消費しない */ + break; + + case MG_FIREWALL: + if(sd->fwall_count < 5 ) + sd->fwall_count++; + else { + sd->status.sp-=sp; + clif_updatestatus(sd,SP_SP); + clif_skill_fail(sd,sd->skillid,0,0); + return 0; + } + break; + case WZ_ICEWALL: + if(sd->iwall_count < 10 && !(sd->bl.x == sd->skillx && sd->bl.y == sd->skilly)) + sd->iwall_count++; + else { + sd->status.sp-=sp; + clif_updatestatus(sd,SP_SP); clif_skill_fail(sd,sd->skillid,0,0); return 0; } @@ -3118,18 +3839,19 @@ } if( spiritball > 0 && sd->spiritball < spiritball) { - clif_skill_fail(sd,sd->skillid,0,0); // 氣球不足 + clif_skill_fail(sd,sd->skillid,0,0); /* 氣球不足 */ return 0; } if (item_id[0] || item_id[1] || item_id[2]) { for(j=0;j<3;j++) { if(!item_id[j] || - ((item_id[j] == 715 || item_id[j] == 716 || item_id[j] == 717) && pc_check_equip_dcard(sd,4132))) - continue; // アイテム無し、3種ジェム&ミストレスカード、は無処理 +// ((item_id[j] == 715 || item_id[j] == 716 || item_id[j] == 717) && pc_check_equip_dcard(sd,4132))) + ((item_id[j] == 715 || item_id[j] == 716 || item_id[j] == 717) && sd->no_gemstone)) // RoVeRT + continue; /* アイテム無し、3種ジェム&ミストレスカード、は無処理 */ if((i[j]=pc_search_inventory(sd,item_id[j])) == -1 || - sd->status.inventory[i[j]].amount < item_amount[j]) { // アイテムなし - if(item_id[j] == 716 || item_id[j] == 717) // 赤&青ジェムの場合のみ + sd->status.inventory[i[j]].amount < item_amount[j]) { /* アイテムなし */ + if(item_id[j] == 716 || item_id[j] == 717) /* 赤&青ジェムの場合のみ */ clif_skill_fail(sd,sd->skillid,(6+(item_id[j]-715)),0); else clif_skill_fail(sd,sd->skillid,0,0); @@ -3138,21 +3860,30 @@ } for(j=0;j<3;j++) { if(i[j] != 0) { - pc_delitem(sd,i[j],item_amount[j],0); // アイテム消費 + pc_delitem(sd,i[j],item_amount[j],0); /* アイテム消費 */ } } } - if(sp) { // SP消費 + if(sp) { /* SP消費 */ sd->status.sp-=sp; clif_updatestatus(sd,SP_SP); } - if(zeny) { // Zeny消費 + if(zeny) { /* Zeny消費 */ sd->status.zeny -= zeny; clif_updatestatus(sd,SP_ZENY); } - if(spiritball) // 氣球消費 + if(spiritball) /* 氣球消費 */ pc_delspiritball(sd,spiritball,0); + + if (sd->skillid != BD_ENCORE) { + sd->last_skillid= sd->skillid; + sd->last_skilllv= sd->skilllv; + } + if (sd->cast_skillid) { + sd->cast_skillid = -1; + sd->cast_skilllv = -1; + } } return 1; } @@ -3269,7 +4000,7 @@ case RG_STRIPARMOR: /* ストリップアーマー */ case RG_STRIPHELM: /* ストリップヘルム */ case CR_GRANDCROSS: /* グランドクロス */ - case MO_CALLSPIRITS: // 気功 + case MO_CALLSPIRITS: /* 気功 */ case MO_INVESTIGATE: /* 発勁 */ case MO_STEELBODY: /* 金剛*/ sd->state.skillcastcancel=0; @@ -3311,6 +4042,8 @@ md->state.targettype = ATTACKABLE; md->min_chase=13; } + sd->cast_skillid = skill_num; + sd->cast_skilllv = skill_lv; } if( casttime<=0 ) /* 詠唱の無いものはキャンセルされない */ @@ -3446,6 +4179,7 @@ + /*---------------------------------------------------------------------------- * ステータス異常 *---------------------------------------------------------------------------- @@ -3527,7 +4261,7 @@ if (ii != -1) clif_status_change(bl,ii,0); /* アイコン消去 */ } - + switch(type){ /* 正常に戻るときなにか処理が必要 */ case SC_STONE: case SC_FREEZE: @@ -3718,7 +4452,7 @@ option=battle_get_option(bl); opt1=battle_get_opt1(bl); opt2=battle_get_opt2(bl); - + if(bl->type==BL_MOB){ md=(struct mob_data *)bl; if( (mob_db[md->class].mode & 0x20 || mob_db[md->class].mexp > 0) && @@ -3762,10 +4496,10 @@ case SC_BLESSING: /* ブレッシング */ tick = 1000 * (40 + val1 * 20); if(md && battle_get_element(bl) != 9 && battle_get_race(bl) != 6) { - if(sc_data[SC_CURSE].timer!=-1 ) - skill_status_change_end(bl,SC_CURSE,-1); - if(sc_data[SC_STONE].timer!=-1 ) - skill_status_change_end(bl,SC_STONE,-1); + if(sc_data[SC_CURSE].timer!=-1 ) + skill_status_change_end(bl,SC_CURSE,-1); + if(sc_data[SC_STONE].timer!=-1 ) + skill_status_change_end(bl,SC_STONE,-1); } break; case SC_ANGELUS: /* アンゼルス */ @@ -3854,6 +4588,7 @@ if(sc_data[SC_LOUD].timer!=-1 ) skill_status_change_end(bl,SC_LOUD,-1); break; + break; case SC_SIGNUMCRUCIS: /* シグナムクルシス */ tick = 5000 * 60 * 25; break; @@ -3890,7 +4625,8 @@ val2=90-val1; break; case SC_WHISTLE: /* 口笛 */ - tick = 1000 * 60; + tick = 1000 * val1; + val2 = tick; break; case SC_APPLEIDUN: /* イドゥンの林檎 */ tick = 1000 * 60 * 3; @@ -3928,6 +4664,14 @@ tick = 1000 * 60; val2 = (val1+3)*10; break; + case SC_DISSONANCE: + tick = 1000 * 30; + val2 = 30 + val1*10; + break; + case SC_UGLYDANCE: + tick = 1000 * 30; + val2 = 30 + val1*10; + break; case SC_EXPLOSIONSPIRITS: // 爆裂波動 tick = 1000 * 60 * 3; val2 = 75 + 25*val1; @@ -3935,6 +4679,82 @@ case SC_STEELBODY: // 金剛 tick = 1000 * 30 * val1; break; + case SC_VOLCANO: + if( sc_data[SC_DELUGE].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_DELUGE,-1); + if( sc_data[SC_VIOLENTGALE].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_VIOLENTGALE,-1); + if( sc_data[SC_LANDPROTECTOR].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_LANDPROTECTOR,-1); + break; + case SC_DELUGE: + if( sc_data[SC_LANDPROTECTOR].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_LANDPROTECTOR,-1); + if( sc_data[SC_VIOLENTGALE].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_VIOLENTGALE,-1); + if( sc_data[SC_VOLCANO].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_VOLCANO,-1); + break; + case SC_VIOLENTGALE: + if( sc_data[SC_DELUGE].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_DELUGE,-1); + if( sc_data[SC_LANDPROTECTOR].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_LANDPROTECTOR,-1); + if( sc_data[SC_VOLCANO].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_VOLCANO,-1); + break; + case SC_LANDPROTECTOR: + tick=((struct skill_unit *)val2)->group->limit; + if( sc_data[SC_DELUGE].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_DELUGE,-1); + if( sc_data[SC_VIOLENTGALE].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_VIOLENTGALE,-1); + if( sc_data[SC_VOLCANO].timer!=-1 ) /* EP解除 */ + skill_status_change_end(bl,SC_VOLCANO,-1); + break; + case SC_LOKIWAIL: /* ニーベルングの指輪 */ + tick=((struct skill_unit *)val2)->group->limit; + break; + case SC_INTOABYSS: /* Into Abyss */ + tick = 1000 * 60; + val2 = (val1+2)*50; + break; + case SC_POEMBRAGI: /* サフラギム */ + tick = 1000 * (10 + val1 * 10); + break; + case SC_STRIPWEAPON: /* Strip Weapon */ + tick = 1000 * 60; + break; + case SC_STRIPHELM: /* Strip Helmet */ + tick = 1000 * 60; + break; + case SC_STRIPARMOR: /* Strip Armor */ + tick = 1000 * 60; + break; + case SC_STRIPSHIELD: /* Strip Shield */ + tick = 1000 * 60; + break; + case SC_AUTOCOUNTER: + tick = 300 * val1; + if(val1 == 4) + tick = 1500; + if(val1 == 5) + tick = 2000; + break; + case SC_AUTOGUARD: + tick = 500 * val1; + if(val1 == 4) + tick = 1500; + if(val1 == 5) + tick = 2000; + break; + case SC_REFLECTSHIELD: + tick = 1000 * val1; + if(val1 == 4) + tick = 1500; + if(val1 == 5) + tick = 2000; + break; /* option1 */ case SC_SPEEDPOTION0: /* 増速ポーション */ @@ -3943,7 +4763,6 @@ tick = 1000 * val1; val2 = 100- 5*(2+type-SC_SPEEDPOTION0); break; - case SC_STONE: /* 石化 */ if( (tick=val2)<=0 ) tick = 1000 * 600; /* とりあえず10分にしてみる(後はタイマ処理で延長する) */ @@ -3987,7 +4806,7 @@ tick=10; val2=40; /* 250*40=10秒 */ break; - + /* セーフティウォール、ニューマ */ case SC_SAFETYWALL: case SC_PNEUMA: tick=((struct skill_unit *)val2)->group->limit; @@ -4008,6 +4827,16 @@ case SC_RIDING: case SC_FALCON: case SC_WEIGHT50: case SC_WEIGHT90: tick=600*1000; break; + + case SC_CANNIBALIZE: /* RoVeRT */ + case SC_SPHEREMINE: + tick = 10 * val1 * 2 * 1000; + break; + + case SC_AUTOSPELL: + tick = 1000 * (90 + 30 * val1); /* SC_AUTOSPELL); */ + val1 = 5 + 2 * val1; + break; default: printf("UnknownStatusChange [%d]\n", type); @@ -4027,7 +4856,7 @@ if (ii != -1) clif_status_change(bl,ii,1); /* アイコン表示 */ } - + /* optionの変更 */ switch(type){ case SC_STONE: case SC_FREEZE: case SC_STAN: case SC_SLEEP: @@ -4050,22 +4879,26 @@ *opt2|= 1<<(type-SC_POISON); opt_flag = 1; break; - case SC_HIDDING: case SC_CLOAKING: + case SC_CLOAKING: case SC_HIDDING: battle_stopattack(bl); /* 攻撃停止 */ *option|= ((type==SC_HIDDING)?2:4); +/* if (type==SC_HIDDING) pc_stop_walking(sd,1); */ opt_flag =1 ; break; case SC_SIGHT: case SC_RUWACH: *option|=1; opt_flag=1; break; + case SC_BLADESTOP: + pc_stop_walking(sd,1); /* Blade Stop */ + break; } - + if(opt_flag) /* optionの変更 */ clif_changeoption(bl); - + (*sc_count)++; /* ステータス異常の数 */ - + sc_data[type].val1 = val1; sc_data[type].val2 = val2; sc_data[type].val3 = val3; @@ -4073,7 +4906,7 @@ /* タイマー設定 */ sc_data[type].timer = add_timer( gettick() + tick, skill_status_change_timer, bl->id, type); - + if(bl->type==BL_PC) pc_calcstatus(sd,0); /* ステータス再計算 */ @@ -4123,7 +4956,7 @@ if( bl->type==BL_PC ) clif_changeoption(bl); - + return 0; } @@ -4210,9 +5043,15 @@ unit->group=NULL; unit->alive=0; map_delobjectnofree(unit->bl.id); - if(group->alive_count>0 && (--group->alive_count)<=0) +//printf("%d %d\n",group->unit_id,group->alive_count); + if(group->alive_count>0 && (--group->alive_count)<=0) { + if (group->unit_id == 0x07f) + map_id2sd(group->src_id)->fwall_count--; + if (group->unit_id == 0x08d) + map_id2sd(group->src_id)->iwall_count--; skill_delunitgroup(group); - + } + return 0; } /*========================================== @@ -4226,7 +5065,7 @@ int i; struct skill_unit_group *group=NULL, *list=NULL; int maxsug=0; - + if(src->type==BL_PC){ list=((struct map_session_data *)src)->skillunit; maxsug=MAX_SKILLUNITGROUP; @@ -4705,6 +5544,7 @@ return 0; } + int skill_arrow_create( struct map_session_data *sd,int nameid) { int i,j,flag,index=-1; @@ -4734,7 +5574,7 @@ clif_additem(sd,0,0,flag); map_addflooritem(&tmp_item,tmp_item.amount,sd->bl.m,sd->bl.x,sd->bl.y); } -// printf("arrow create %d -> %d:%d\n",mate,tmp_item.nameid,tmp_item.amount); +/* printf("arrow create %d -> %d:%d\n",mate,tmp_item.nameid,tmp_item.amount); */ } return 0; @@ -4958,5 +5798,4 @@ return 0; } - diff -rNu athena-dev-2.1.1-mod0641/map/skill.h 641mod/map/skill.h --- athena-dev-2.1.1-mod0641/map/skill.h Mon Dec 8 01:09:22 2003 +++ 641mod/map/skill.h Wed Dec 24 23:33:43 2003 @@ -128,22 +128,21 @@ SC_CONFUSION =71, SC_BLIND =72, - SC_TRICKDEAD =29, + SC_DIVINA = SC_SILENCE, SC_PROVOKE = 0, SC_ENDURE = 1, - SC_SIGHT =75, - SC_ENERGYCOAT =31, + SC_TWOHANDQUICKEN = 2, SC_CONCENTRATE = 3, SC_HIDDING = 4, - SC_LOUD =30, - SC_RUWACH =76, - SC_INCREASEAGI =12, - SC_DECREASEAGI =13, - SC_SIGNUMCRUCIS =11, + SC_CLOAKING = 5, + SC_ENCPOISON = 6, + SC_POISONREACT = 7, + SC_QUAGMIRE = 8, SC_ANGELUS = 9, SC_BLESSING =10, - SC_TWOHANDQUICKEN = 2, - SC_AUTOCOUNTER =77, + SC_SIGNUMCRUCIS =11, + SC_INCREASEAGI =12, + SC_DECREASEAGI =13, SC_IMPOSITIO =15, SC_SUFFRAGIUM =16, SC_ASPERSIO =17, @@ -151,22 +150,14 @@ SC_KYRIE =19, SC_MAGNIFICAT =20, SC_GLORIA =21, - SC_DIVINA = SC_SILENCE, SC_AETERNA =22, - SC_QUAGMIRE = 8, SC_ADRENALINE =23, SC_WEAPONPERFECTION =24, SC_OVERTHRUST =25, SC_MAXIMIZEPOWER =26, - SC_CLOAKING = 5, - SC_ENCPOISON = 6, - SC_POISONREACT = 7, - SC_FLAMELAUNCHER =98, - SC_FROSTWEAPON =95, - SC_LIGHTNINGLOADER =96, - SC_SEISMICWEAPON =97, - SC_ASSNCROS =100, - SC_POEMBRAGI =101, + SC_TRICKDEAD =29, + SC_LOUD =30, + SC_ENERGYCOAT =31, SC_STRIPWEAPON =50, SC_STRIPSHIELD =51, SC_STRIPARMOR =52, @@ -177,26 +168,47 @@ SC_CP_HELM =57, SC_AUTOGUARD =58, SC_REFLECTSHIELD =59, + SC_DEVOTION =60, SC_PROVIDENCE =61, SC_DEFENDER =62, - SC_DEVOTION =60, - SC_SPEARSQUICKEN =99, + SC_CALLSPIRITS =63, + SC_SIGHTTRASHER =73, + SC_SIGHT =75, + SC_RUWACH =76, + SC_AUTOCOUNTER =77, SC_DRUMBATTLE =78, SC_SIEGFRIED =79, SC_WHISTLE =80, SC_APPLEIDUN =81, SC_FORTUNE =82, SC_SERVICE4U =83, + SC_CASTCANCEL =84, + SC_VOLCANO =85, + SC_EXPLOSIONSPIRITS =86, + SC_STEELBODY =87, + SC_SPELLBREAKER =88, + SC_DELUGE =89, + SC_FLAMELAUNCHER =95, + SC_FROSTWEAPON =96, + SC_LIGHTNINGLOADER =97, + SC_SEISMICWEAPON =98, + SC_SPEARSQUICKEN =99, + SC_ASSNCROS =100, + SC_POEMBRAGI =101, + SC_FREECAST =102, SC_NIBELUNGEN =103, SC_HUMMING =104, SC_ETERNALCHAOS =105, SC_DONTFORGETME =106, - SC_STEELBODY =87, - SC_VOLCANO =85, - SC_DELUGE =89, - SC_CASTCANCEL =84, - SC_SPELLBREAKER =88, - SC_EXPLOSIONSPIRITS =86, + SC_ABSORBSPIRIT =107, + SC_LOKIWAIL =108, + SC_INTOABYSS =109, + SC_BLADESTOP =110, + SC_VIOLENTGALE =111, + SC_LANDPROTECTOR =112, + SC_ADAPTATION =113, + SC_KIMARICHMAN =114, + SC_GANGSTER =119, SC_RIDING =27, SC_FALCON =28, @@ -209,186 +221,204 @@ SC_SAFETYWALL =90, SC_PNEUMA =91, SC_WATERBALL =92, + SC_METEOSTORM =93, SC_ANKLE =94, + + +// by RoVeRT + SC_SLOWPOISON = 14, + SC_BROKNARMOR = 32, + SC_BROKNWEAPON = 33, + +// for skill memory + SC_CANNIBALIZE = 115, + SC_SPHEREMINE = 116, + + SC_AUTOSPELL = 117, + SC_DISSONANCE = 118, + SC_UGLYDANCE = 120, + + +// unused 34, 40-49, 74 }; extern int SkillStatusChangeTable[]; enum { NV_BASIC = 1, - SM_SWORD, - SM_TWOHAND, - SM_RECOVERY, - SM_BASH, - SM_PROVOKE, - SM_MAGNUM, - SM_ENDURE, - - MG_SRECOVERY, - MG_SIGHT, - MG_NAPALMBEAT, - MG_SAFETYWALL, - MG_SOULSTRIKE, - MG_COLDBOLT, - MG_FROSTDIVER, - MG_STONECURSE, - MG_FIREBALL, - MG_FIREWALL, - MG_FIREBOLT, - MG_LIGHTNINGBOLT, - MG_THUNDERSTORM, - - AL_DP, - AL_DEMONBANE, - AL_RUWACH, - AL_PNEUMA, - AL_TELEPORT, - AL_WARP, - AL_HEAL, - AL_INCAGI, - AL_DECAGI, - AL_HOLYWATER, - AL_CRUCIS, - AL_ANGELUS, - AL_BLESSING, - AL_CURE, - - MC_INCCARRY, - MC_DISCOUNT, - MC_OVERCHARGE, - MC_PUSHCART, - MC_IDENTIFY, - MC_VENDING, - MC_MAMMONITE, - - AC_OWL, - AC_VULTURE, - AC_CONCENTRATION, - AC_DOUBLE, - AC_SHOWER, - - TF_DOUBLE, - TF_MISS, - TF_STEAL, - TF_HIDING, - TF_POISON, - TF_DETOXIFY, - - ALL_RESURRECTION, - - KN_SPEARMASTERY, - KN_PIERCE, - KN_BRANDISHSPEAR, - KN_SPEARSTAB, - KN_SPEARBOOMERANG, - KN_TWOHANDQUICKEN, - KN_AUTOCOUNTER, - KN_BOWLINGBASH, - KN_RIDING, - KN_CAVALIERMASTERY, - - PR_MACEMASTERY, - PR_IMPOSITIO, - PR_SUFFRAGIUM, - PR_ASPERSIO, - PR_BENEDICTIO, - PR_SANCTUARY, - PR_SLOWPOISON, - PR_STRECOVERY, - PR_KYRIE, - PR_MAGNIFICAT, - PR_GLORIA, - PR_LEXDIVINA, - PR_TURNUNDEAD, - PR_LEXAETERNA, - PR_MAGNUS, - - WZ_FIREPILLAR, - WZ_SIGHTRASHER, - WZ_FIREIVY, - WZ_METEOR, - WZ_JUPITEL, - WZ_VERMILION, - WZ_WATERBALL, - WZ_ICEWALL, - WZ_FROSTNOVA, - WZ_STORMGUST, - WZ_EARTHSPIKE, - WZ_HEAVENDRIVE, - WZ_QUAGMIRE, - WZ_ESTIMATION, - - BS_IRON, - BS_STEEL, - BS_ENCHANTEDSTONE, - BS_ORIDEOCON, - BS_DAGGER, - BS_SWORD, - BS_TWOHANDSWORD, - BS_AXE, - BS_MACE, - BS_KNUCKLE, - BS_SPEAR, - BS_HILTBINDING, - BS_FINDINGORE, - BS_WEAPONRESEARCH, - BS_REPAIRWEAPON, - BS_SKINTEMPER, - BS_HAMMERFALL, - BS_ADRENALINE, - BS_WEAPONPERFECT, - BS_OVERTHRUST, - BS_MAXIMIZE, - - HT_SKIDTRAP, - HT_LANDMINE, - HT_ANKLESNARE, - HT_SHOCKWAVE, - HT_SANDMAN, - HT_FLASHER, - HT_FREEZINGTRAP, - HT_BLASTMINE, - HT_CLAYMORETRAP, - HT_REMOVETRAP, - HT_TALKIEBOX, - HT_BEASTBANE, - HT_FALCON, - HT_STEELCROW, - HT_BLITZBEAT, - HT_DETECTING, - HT_SPRINGTRAP, - - AS_RIGHT, - AS_LEFT, - AS_KATAR, - AS_CLOAKING, - AS_SONICBLOW, - AS_GRIMTOOTH, - AS_ENCHANTPOISON, - AS_POISONREACT, - AS_VENOMDUST, - AS_SPLASHER, - - NV_FIRSTAID, - NV_TRICKDEAD, - SM_MOVINGRECOVERY, - SM_FATALBLOW, - SM_AUTOBERSERK, - AC_MAKINGARROW, - AC_CHARGEARROW, - TF_SPRINKLESAND, - TF_BACKSLIDING, - TF_PICKSTONE, - TF_THROWSTONE, - MC_CARTREVOLUTION, - MC_CHANGECART, - MC_LOUD, - AL_HOLYLIGHT, - MG_ENERGYCOAT, - - NPC_PIERCINGATT, - NPC_MENTALBREAKER, - NPC_RANGEATTACK, + SM_SWORD = 2, + SM_TWOHAND = 3, + SM_RECOVERY = 4, + SM_BASH = 5, + SM_PROVOKE = 6, + SM_MAGNUM = 7, + SM_ENDURE = 8, + + MG_SRECOVERY = 9, + MG_SIGHT = 10, + MG_NAPALMBEAT = 11, + MG_SAFETYWALL = 12, + MG_SOULSTRIKE = 13, + MG_COLDBOLT= 14, + MG_FROSTDIVER = 15, + MG_STONECURSE = 16, + MG_FIREBALL = 17, + MG_FIREWALL = 18, + MG_FIREBOLT = 19, + MG_LIGHTNINGBOLT = 20, + MG_THUNDERSTORM = 21, + + AL_DP = 22, + AL_DEMONBANE = 23, + AL_RUWACH = 24, + AL_PNEUMA = 25, + AL_TELEPORT = 26, + AL_WARP = 27, + AL_HEAL = 28, + AL_INCAGI = 29, + AL_DECAGI = 30, + AL_HOLYWATER = 31, + AL_CRUCIS = 32, + AL_ANGELUS = 33, + AL_BLESSING = 34, + AL_CURE = 35, + + MC_INCCARRY = 36, + MC_DISCOUNT = 37, + MC_OVERCHARGE = 38, + MC_PUSHCART = 39, + MC_IDENTIFY = 40, + MC_VENDING = 41, + MC_MAMMONITE = 42, + + AC_OWL = 43, + AC_VULTURE = 44, + AC_CONCENTRATION = 45, + AC_DOUBLE = 46, + AC_SHOWER = 47, + + TF_DOUBLE = 48, + TF_MISS = 49, + TF_STEAL = 50, + TF_HIDING = 51, + TF_POISON = 52, + TF_DETOXIFY = 53, + + ALL_RESURRECTION = 54, + + KN_SPEARMASTERY = 55, + KN_PIERCE = 56, + KN_BRANDISHSPEAR = 57, + KN_SPEARSTAB = 58, + KN_SPEARBOOMERANG = 59, + KN_TWOHANDQUICKEN = 60, + KN_AUTOCOUNTER = 61, + KN_BOWLINGBASH = 62, + KN_RIDING = 63, + KN_CAVALIERMASTERY = 64, + + PR_MACEMASTERY = 65, + PR_IMPOSITIO = 66, + PR_SUFFRAGIUM = 67, + PR_ASPERSIO = 68, + PR_BENEDICTIO = 69, + PR_SANCTUARY = 70, + PR_SLOWPOISON = 71, + PR_STRECOVERY = 72, + PR_KYRIE = 73, + PR_MAGNIFICAT = 74, + PR_GLORIA = 75, + PR_LEXDIVINA = 76, + PR_TURNUNDEAD = 77, + PR_LEXAETERNA = 78, + PR_MAGNUS = 79, + + WZ_FIREPILLAR = 80, + WZ_SIGHTRASHER = 81, + WZ_FIREIVY = 82, + WZ_METEOR = 83, + WZ_JUPITEL = 84, + WZ_VERMILION = 85, + WZ_WATERBALL = 86, + WZ_ICEWALL = 87, + WZ_FROSTNOVA = 88, + WZ_STORMGUST = 89, + WZ_EARTHSPIKE = 90, + WZ_HEAVENDRIVE = 91, + WZ_QUAGMIRE = 92, + WZ_ESTIMATION = 93, + + BS_IRON = 94, + BS_STEEL = 95, + BS_ENCHANTEDSTONE = 96, + BS_ORIDEOCON = 97, + BS_DAGGER = 98, + BS_SWORD = 99, + BS_TWOHANDSWORD = 100, + BS_AXE = 101, + BS_MACE = 102, + BS_KNUCKLE = 103, + BS_SPEAR = 104, + BS_HILTBINDING = 105, + BS_FINDINGORE = 106, + BS_WEAPONRESEARCH = 107, + BS_REPAIRWEAPON = 108, + BS_SKINTEMPER = 109, + BS_HAMMERFALL = 110, + BS_ADRENALINE = 111, + BS_WEAPONPERFECT = 112, + BS_OVERTHRUST = 113, + BS_MAXIMIZE = 114, + + HT_SKIDTRAP = 115, + HT_LANDMINE = 116, + HT_ANKLESNARE = 117, + HT_SHOCKWAVE = 118, + HT_SANDMAN = 119, + HT_FLASHER = 120, + HT_FREEZINGTRAP = 121, + HT_BLASTMINE = 122, + HT_CLAYMORETRAP = 123, + HT_REMOVETRAP = 124, + HT_TALKIEBOX = 125, + HT_BEASTBANE = 126, + HT_FALCON = 127, + HT_STEELCROW = 128, + HT_BLITZBEAT = 129, + HT_DETECTING = 130, + HT_SPRINGTRAP = 131, + + AS_RIGHT = 132, + AS_LEFT = 133, + AS_KATAR = 134, + AS_CLOAKING = 135, + AS_SONICBLOW = 136, + AS_GRIMTOOTH = 137, + AS_ENCHANTPOISON = 138, + AS_POISONREACT = 139, + AS_VENOMDUST = 140, + AS_SPLASHER = 141, + + NV_FIRSTAID = 142, + NV_TRICKDEAD = 143, + SM_MOVINGRECOVERY = 144, + SM_FATALBLOW = 145, + SM_AUTOBERSERK = 146, + AC_MAKINGARROW = 147, + AC_CHARGEARROW = 148, + TF_SPRINKLESAND = 149, + TF_BACKSLIDING = 150, + TF_PICKSTONE = 151, + TF_THROWSTONE = 152, + MC_CARTREVOLUTION = 153, + MC_CHANGECART = 154, + MC_LOUD = 155, + AL_HOLYLIGHT = 156, + MG_ENERGYCOAT = 157, + + NPC_PIERCINGATT = 158, + NPC_MENTALBREAKER = 159, + NPC_RANGEATTACK = 160, NPC_ATTRICHANGE, NPC_CHANGEWATER, NPC_CHANGEGROUND, @@ -398,7 +428,7 @@ NPC_CHANGEHOLY, NPC_CHANGEDARKNESS, NPC_CHANGETELEKINESIS, - NPC_CRITICALSLASH, + NPC_CRITICALSLASH = 170, NPC_COMBOATTACK, NPC_GUIDEDATTACK, NPC_SELFDESTRUCTION, @@ -408,7 +438,7 @@ NPC_BLINDATTACK, NPC_SILENCEATTACK, NPC_STUNATTACK, - NPC_PETRIFYATTACK, + NPC_PETRIFYATTACK = 180, NPC_CURSEATTACK, NPC_SLEEPATTACK, NPC_RANDOMATTACK, @@ -418,7 +448,7 @@ NPC_WINDATTACK, NPC_POISONATTACK, NPC_HOLYATTACK, - NPC_DARKNESSATTACK, + NPC_DARKNESSATTACK = 190, NPC_TELEKINESISATTACK, NPC_MAGICALATTACK, NPC_METAMORPHOSIS, @@ -428,7 +458,7 @@ NPC_EMOTION, NPC_TRANSFORMATION, NPC_BLOODDRAIN, - NPC_ENERGYDRAIN, + NPC_ENERGYDRAIN = 200, NPC_KEEPING, NPC_DARKBREATH, NPC_DARKBLESSING, @@ -437,136 +467,136 @@ NPC_LICK, NPC_HALLUCINATION, NPC_REBIRTH, - NPC_SUMMONMONSTER, + NPC_SUMMONMONSTER = 209, - RG_SNATCHER, - RG_STEALCOIN, - RG_BACKSTAP, - RG_TUNNELDRIVE, - RG_RAID, - RG_STRIPWEAPON, - RG_STRIPSHIELD, - RG_STRIPARMOR, - RG_STRIPHELM, - RG_INTIMIDATE, - RG_GRAFFITI, - RG_FLAGGRAFFITI, - RG_CLEANER, - RG_GANGSTER, - RG_COMPULSION, - RG_PLAGIARISM, - - AM_AXEMASTERY, - AM_LEARNINGPOTION, - AM_PHARMACY, - AM_DEMONSTRATION, - AM_ACIDTERROR, - AM_POTIONPITCHER, - AM_CANNIBALIZE, - AM_SPHEREMINE, - AM_CP_WEAPON, - AM_CP_SHIELD, - AM_CP_ARMOR, - AM_CP_HELM, - AM_BIOETHICS, - AM_BIOTECHNOLOGY, - AM_CREATECREATURE, - AM_CULTIVATION, - AM_FLAMECONTROL, - AM_CALLHOMUN, - AM_REST, - AM_DRILLMASTER, - AM_HEALHOMUN, - AM_RESURRECTHOMUN, - - CR_TRUST, - CR_AUTOGUARD, - CR_SHIELDCHARGE, - CR_SHIELDBOOMERANG, - CR_REFLECTSHIELD, - CR_HOLYCROSS, - CR_GRANDCROSS, - CR_DEVOTION, - CR_PROVIDENCE, - CR_DEFENDER, - CR_SPEARQUICKEN, - - MO_IRONHAND, - MO_SPIRITSRECOVERY, - MO_CALLSPIRITS, - MO_ABSORBSPIRITS, - MO_TRIPLEATTACK, - MO_BODYRELOCATION, - MO_DODGE, - MO_INVESTIGATE, - MO_FINGEROFFENSIVE, - MO_STEELBODY, - MO_BLADESTOP, - MO_EXPLOSIONSPIRITS, - MO_EXTREMITYFIST, - MO_CHAINCOMBO, - MO_COMBOFINISH, - - SA_ADVANCEDBOOK, - SA_CASTCANCEL, - SA_MAGICROD, - SA_SPELLBREAKER, - SA_FREECAST, - SA_AUTOSPELL, - SA_FLAMELAUNCHER, - SA_FROSTWEAPON, - SA_LIGHTNINGLOADER, - SA_SEISMICWEAPON, - SA_DRAGONOLOGY, - SA_VOLCANO, - SA_DELUGE, - SA_VIOLENTGALE, - SA_LANDPROTECTOR, - SA_DISPELL, - SA_ABRACADABRA, - SA_MONOCELL, - SA_CLASSCHANGE, - SA_SUMMONMONSTER, - SA_REVERSEORCISH, - SA_DEATH, - SA_FORTUNE, - SA_TAMINGMONSTER, - SA_QUESTION, - SA_GRAVITY, - SA_LEVELUP, - SA_INSTANTDEATH, - SA_FULLRECOVERY, - SA_COMA, - - BD_ADAPTATION, - BD_ENCORE, - BD_LULLABY, - BD_RICHMANKIM, - BD_ETERNALCHAOS, - BD_DRUMBATTLEFIELD, - BD_RINGNIBELUNGEN, - BD_ROKISWEIL, - BD_INTOABYSS, - BD_SIEGFRIED, - BD_RAGNAROK, - - BA_MUSICALLESSON, - BA_MUSICALSTRIKE, - BA_DISSONANCE, - BA_FROSTJOKE, - BA_WHISTLE, - BA_ASSASSINCROSS, - BA_POEMBRAGI, - BA_APPLEIDUN, - - DC_DANCINGLESSON, - DC_THROWARROW, - DC_UGLYDANCE, - DC_SCREAM, - DC_HUMMING, - DC_DONTFORGETME, - DC_FORTUNEKISS, - DC_SERVICEFORYOU, + RG_SNATCHER = 210, + RG_STEALCOIN = 211, + RG_BACKSTAP = 212, + RG_TUNNELDRIVE = 213, + RG_RAID = 214, + RG_STRIPWEAPON = 215, + RG_STRIPSHIELD = 216, + RG_STRIPARMOR = 217, + RG_STRIPHELM = 218, + RG_INTIMIDATE = 219, + RG_GRAFFITI = 220, + RG_FLAGGRAFFITI = 221, + RG_CLEANER = 222, + RG_GANGSTER = 223, + RG_COMPULSION = 224, + RG_PLAGIARISM = 225, + + AM_AXEMASTERY = 226, + AM_LEARNINGPOTION = 227, + AM_PHARMACY = 228, + AM_DEMONSTRATION = 229, + AM_ACIDTERROR = 230, + AM_POTIONPITCHER = 231, + AM_CANNIBALIZE = 232, + AM_SPHEREMINE = 233, + AM_CP_WEAPON = 234, + AM_CP_SHIELD = 235, + AM_CP_ARMOR = 236, + AM_CP_HELM = 237, + AM_BIOETHICS = 238, + AM_BIOTECHNOLOGY = 239, + AM_CREATECREATURE = 240, + AM_CULTIVATION = 241, + AM_FLAMECONTROL = 242, + AM_CALLHOMUN = 243, + AM_REST = 244, + AM_DRILLMASTER = 245, + AM_HEALHOMUN = 246, + AM_RESURRECTHOMUN = 247, + + CR_TRUST = 248, + CR_AUTOGUARD = 249, + CR_SHIELDCHARGE = 250, + CR_SHIELDBOOMERANG = 251, + CR_REFLECTSHIELD = 252, + CR_HOLYCROSS = 253, + CR_GRANDCROSS = 254, + CR_DEVOTION = 255, + CR_PROVIDENCE = 256, + CR_DEFENDER = 257, + CR_SPEARQUICKEN = 258, + + MO_IRONHAND = 259, + MO_SPIRITSRECOVERY = 260, + MO_CALLSPIRITS = 261, + MO_ABSORBSPIRITS = 262, + MO_TRIPLEATTACK = 263, + MO_BODYRELOCATION = 264, + MO_DODGE = 265, + MO_INVESTIGATE = 266, + MO_FINGEROFFENSIVE = 267, + MO_STEELBODY = 268, + MO_BLADESTOP = 269, + MO_EXPLOSIONSPIRITS = 270, + MO_EXTREMITYFIST = 271, + MO_CHAINCOMBO = 272, + MO_COMBOFINISH = 273, + + SA_ADVANCEDBOOK = 274, + SA_CASTCANCEL = 275, + SA_MAGICROD = 276, + SA_SPELLBREAKER = 277, + SA_FREECAST = 278, + SA_AUTOSPELL = 279, + SA_FLAMELAUNCHER = 280, + SA_FROSTWEAPON = 281, + SA_LIGHTNINGLOADER = 282, + SA_SEISMICWEAPON = 283, + SA_DRAGONOLOGY = 284, + SA_VOLCANO = 285, + SA_DELUGE = 286, + SA_VIOLENTGALE = 287, + SA_LANDPROTECTOR = 288, + SA_DISPELL = 289, + SA_ABRACADABRA = 290, + SA_MONOCELL = 291, + SA_CLASSCHANGE = 292, + SA_SUMMONMONSTER = 293, + SA_REVERSEORCISH = 294, + SA_DEATH = 295, + SA_FORTUNE = 296, + SA_TAMINGMONSTER = 297, + SA_QUESTION = 298, + SA_GRAVITY = 299, + SA_LEVELUP = 300, + SA_INSTANTDEATH = 301, + SA_FULLRECOVERY = 302, + SA_COMA = 303, + + BD_ADAPTATION = 304, + BD_ENCORE = 305, + BD_LULLABY = 306, + BD_RICHMANKIM = 307, + BD_ETERNALCHAOS = 308, + BD_DRUMBATTLEFIELD = 309, + BD_RINGNIBELUNGEN = 310, + BD_ROKISWEIL = 311, + BD_INTOABYSS = 312, + BD_SIEGFRIED = 313, + BD_RAGNAROK = 314, + + BA_MUSICALLESSON = 315, + BA_MUSICALSTRIKE = 316, + BA_DISSONANCE = 317, + BA_FROSTJOKE = 318, + BA_WHISTLE = 319, + BA_ASSASSINCROSS = 320, + BA_POEMBRAGI = 321, + BA_APPLEIDUN = 322, + + DC_DANCINGLESSON = 323, + DC_THROWARROW = 324, + DC_UGLYDANCE = 325, + DC_SCREAM = 326, + DC_HUMMING = 327, + DC_DONTFORGETME = 328, + DC_FORTUNEKISS = 329, + DC_SERVICEFORYOU = 330, GD_APPROVAL=10000, GD_KAFRACONTACT, Binary files athena-dev-2.1.1-mod0641/map-server.exe and 641mod/map-server.exe differ Binary files athena-dev-2.1.1-mod0641/tool/ladmin.exe and 641mod/tool/ladmin.exe differ