diff --git a/conf/battle/exp.conf b/conf/battle/exp.conf index ec2b854aa8..352c189702 100644 --- a/conf/battle/exp.conf +++ b/conf/battle/exp.conf @@ -109,6 +109,3 @@ exp_cost_redemptio: 1 // If by default, the 'exp_cost_redemptio' is 1 (1%) and every single player revived the penalty is reduced to 0.2%, // it means 'exp_cost_redemptio_limit' is 5. exp_cost_redemptio_limit: 5 - -// EXP cost for cast LG_INSPIRATION (Note 2) -exp_cost_inspiration: 1 diff --git a/db/re/item_db_usable.yml b/db/re/item_db_usable.yml index d46b60e064..f30ddc860d 100644 --- a/db/re/item_db_usable.yml +++ b/db/re/item_db_usable.yml @@ -49472,6 +49472,13 @@ Body: NoAuction: true Script: | /* upgradeui 100368; */ + - Id: 100371 + AegisName: aegis_100371 + Name: Homunculus Nutritional Supplement + Type: Usable + Weight: 10 + Script: | + addhomintimacy 100; // !TODO: Confirm increase amount - Id: 100376 AegisName: Royal_Bow_K_Cube Name: Royal Bow Remodeling Cube diff --git a/db/re/produce_db.txt b/db/re/produce_db.txt index 2ae35cb47d..c7cddb1a66 100644 --- a/db/re/produce_db.txt +++ b/db/re/produce_db.txt @@ -379,6 +379,8 @@ 139,970,22,228,1,7127,0,713,1,7033,5,905,5,1092,1 //-- Embryo <-- AM_PHARMACY & Potion Creation Guide & 1 Seed of Life, 1 Morning Dew of Yggdrasil, 1 Glass Tube 140,7142,22,228,1,7144,0,7140,1,7141,1,7143,1 +//-- Homunculus Supplement <-- AM_BIOETHICS & Potion Creation Guide & 1 Seed of Life, 1 Yellow Herb, 1 Empty Bottle +141,100371,22,228,1,7144,0,7140,1,508,1,713,1 //---------------------------------------------- //============================================== @@ -387,63 +389,63 @@ //===== Elemental Converters === ItemLV=23 ===== //-- Fire Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Scorpion Tail -141,12114,23,1007,1,7433,1,904,3 +142,12114,23,1007,1,7433,1,904,3 //-- Water Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Snail's Shell -142,12115,23,1007,1,7433,1,946,3 +143,12115,23,1007,1,7433,1,946,3 //-- Earth Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Horn -143,12116,23,1007,1,7433,1,947,3 +144,12116,23,1007,1,7433,1,947,3 //-- Wind Elemental Converter <-- SA_CREATECON & 1 Blank Scroll, 3 Rainbow Shell -144,12117,23,1007,1,7433,1,1013,3 +145,12117,23,1007,1,7433,1,1013,3 //============================================== //===== Ancilla And Runes === ItemLV=24 ======== //---- Ancilla --------------------------------- //-- Ancilla <-- AB_ANCILLA & 1 Blue Gemstone -145,12333,24,2039,1,717,1 +146,12333,24,2039,1,717,1 //---- Rune Stones ----------------------------- //-- Runstone Nosiege <-- RK_RUNEMASTERY Lv8, 1 Broken Armor Piece, 1 Old Magic Circle, 1 Light Granule, 1 Elder Branch -146,12725,24,2010,8,7069,1,7099,1,7938,1,7939,1 +147,12725,24,2010,8,7069,1,7099,1,7938,1,7939,1 //-- Runstone Rhydo <-- RK_RUNEMASTERY Lv7, 1 Red Gemstone, 1 Light Granule, 1 Elder Branch -147,12726,24,2010,7,716,1,7938,1,7939,1 +148,12726,24,2010,7,716,1,7938,1,7939,1 //-- Runstone Verkana <-- RK_RUNEMASTERY Lv9, 1 Dullahan Armor, 1 Elder Branch -148,12727,24,2010,9,7210,1,7939,1 +149,12727,24,2010,9,7210,1,7939,1 //-- Runstone Isia <-- RK_RUNEMASTERY Lv2, 1 Burning Heart, 1 Elder Branch -149,12728,24,2010,2,7097,1,7939,1 +150,12728,24,2010,2,7097,1,7939,1 //-- Runstone Asir <-- RK_RUNEMASTERY Lv5, 1 Ogre Tooth, 1 Light Granule, 1 Elder Branch -150,12729,24,2010,5,7002,1,7938,1,7939,1 +151,12729,24,2010,5,7002,1,7938,1,7939,1 //-- Runstone Urj <-- RK_RUNEMASTERY Lv6, 1 Honey, 1 Slender Snake, 1 Elder Branch -151,12730,24,2010,6,518,1,1048,1,7939,1 +152,12730,24,2010,6,518,1,1048,1,7939,1 //-- Runstone Turisus <-- RK_RUNEMASTERY Lv1, 1 Cobold Hair, 1 Claw Of Desert Wolf, 1 Elder Branch -152,12731,24,2010,1,1034,1,7030,1,7939,1 +153,12731,24,2010,1,1034,1,7030,1,7939,1 //-- Runstone Pertz <-- RK_RUNEMASTERY Lv3, 1 Dragon Canine, 1 Tangled Chain, 1 Light Granule, 1 Elder Branch -153,12732,24,2010,3,1035,1,7221,1,7938,1,7939,1 +154,12732,24,2010,3,1035,1,7221,1,7938,1,7939,1 //-- Runstone Hagalas <-- RK_RUNEMASTERY Lv4, 1 Round Shell, 1 Dragon's Skin, 1 Elder Branch -154,12733,24,2010,4,1096,1,7123,1,7939,1 +155,12733,24,2010,4,1096,1,7123,1,7939,1 //-- Runstone Lux Anima <-- RK_RUNEMASTERY Lv10, 3 Gold, 3 Light Granule -155,22540,24,2010,10,969,3,7938,3 +156,22540,24,2010,10,969,3,7938,3 //============================================== //===== Guillotine Cross Poisons === ItemLv=25 = //-- Guillotine Antidote <-- GC_RESEARCHNEWPOISON Lv5, 1 White Herb, 1 Blue Herb, 2 Green Herb -156,6128,25,2024,5,509,1,510,1,511,2 +157,6128,25,2024,5,509,1,510,1,511,2 //-- Poison Paralysis <-- GC_RESEARCHNEWPOISON Lv1, 1 Medicine Bowl, 20 Poison Toad's Skin, 1 Poison Kit, 1 Poison Herb Amoena -157,12717,25,2024,1,7134,1,7155,20,7931,1,7937,1 +158,12717,25,2024,1,7134,1,7155,20,7931,1,7937,1 //-- Poison Leech <-- GC_RESEARCHNEWPOISON Lv4, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Nerium, 1 Poison Herb Scopolia -158,12718,25,2024,4,7134,1,7931,1,7932,1,7936,1 +159,12718,25,2024,4,7134,1,7931,1,7932,1,7936,1 //-- Poison Oblivion <-- GC_RESEARCHNEWPOISON Lv9, 1 Izidor, 10 Heart Of Mermaid, 1 Medicine Bowl, 1 Poison Kit -159,12719,25,2024,9,709,1,950,10,7134,1,7931,1 +160,12719,25,2024,9,709,1,950,10,7134,1,7931,1 //-- Poison Contamination <-- GC_RESEARCHNEWPOISON Lv3, 25 Decayed Nail, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Seratum -160,12720,25,2024,3,957,25,7134,1,7931,1,7935,1 +161,12720,25,2024,3,957,25,7134,1,7931,1,7935,1 //-- Poison Numb <-- GC_RESEARCHNEWPOISON Lv8, 1 Medicine Bowl, 10 Sticky Poison, 1 Poison Kit, 1 Poison Herb Nerium -161,12721,25,2024,8,7134,1,7565,10,7931,1,7932,1 +162,12721,25,2024,8,7134,1,7565,10,7931,1,7932,1 //-- Poison Fever <-- GC_RESEARCHNEWPOISON Lv2, 20 Anolian Skin, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Rantana -162,12722,25,2024,2,7003,20,7134,1,7931,1,7933,1 +163,12722,25,2024,2,7003,20,7134,1,7931,1,7933,1 //-- Poison Laughing <-- GC_RESEARCHNEWPOISON Lv7, 10 Poison Spore, 1 Medicine Bowl, 1 Poison Kit, 1 Poison Herb Makulata -163,12723,25,2024,7,7033,10,7134,1,7931,1,7934,1 +164,12723,25,2024,7,7033,10,7134,1,7931,1,7934,1 //-- Poison Fatigue <-- GC_RESEARCHNEWPOISON Lv6, 1 Izidor, 1 Medicine Bowl, 10 Sticky Poison, 1 Poison Kit -164,12724,25,2024,6,709,1,7134,1,7565,10,7931,1 +165,12724,25,2024,6,709,1,7134,1,7565,10,7931,1 //============================================== //============================================== @@ -451,244 +453,244 @@ //============================================== //----- Change Material ---- ItemLV=26 --------- //-- Sacred Masque <-- GN_CHANGEMATERIAL Lv1, 45 Grasshopper's Leg, 35 Yoyo Tail -165,1045,26,2494,1,940,45,942,35 +166,1045,26,2494,1,940,45,942,35 //-- Long Hair <-- GN_CHANGEMATERIAL Lv1, 40 Pencil Case, 5 Tiger's Skin -166,1020,26,2494,1,738,40,1029,5 +167,1020,26,2494,1,738,40,1029,5 //-- Phracon <-- GN_CHANGEMATERIAL Lv1, 45 Spawn, 40 Glass Bead -167,1010,26,2494,1,908,45,746,40 +168,1010,26,2494,1,908,45,746,40 //-- Lantern <-- GN_CHANGEMATERIAL Lv1, 10 Solid Shell, 20 Blossom Of Maneater -168,1041,26,2494,1,943,10,1032,20 +169,1041,26,2494,1,943,10,1032,20 //-- Acorn <-- GN_CHANGEMATERIAL Lv1, 30 Cactus Needle, 10 Snail's Shell -169,1026,26,2494,1,952,30,946,10 +170,1026,26,2494,1,952,30,946,10 //-- Frozen Heart <-- GN_CHANGEMATERIAL Lv1, 25 Raccoondog Doll, 35 Moth Dust -170,1008,26,2494,1,754,25,1057,35 +171,1008,26,2494,1,754,25,1057,35 //-- Horrendous Mouth <-- GN_CHANGEMATERIAL Lv1, 45 Stem, 45 Dragon Scale -171,958,26,2494,1,905,45,1036,45 +172,958,26,2494,1,905,45,1036,45 //-- Detrimindexta <-- GN_CHANGEMATERIAL Lv1, 40 Chrysalis, 10 Flesh Of Clam -172,971,26,2494,1,915,40,966,10 +173,971,26,2494,1,915,40,966,10 //-- Detonator <-- GN_CHANGEMATERIAL Lv1, 45 Nose Ring, 25 Feather Of Birds -173,1051,26,2494,1,941,45,916,25 +174,1051,26,2494,1,941,45,916,25 //-- Tweezer <-- GN_CHANGEMATERIAL Lv1, 40 Worm Peelings, 5 Monkey Doll -174,1046,26,2494,1,955,40,753,5 +175,1046,26,2494,1,955,40,753,5 //-- Petite DiablOfs Horn <-- GN_CHANGEMATERIAL Lv1, 5 Stone Heart, 10 Resin -175,1038,26,2494,1,953,5,907,10 +176,1038,26,2494,1,953,5,907,10 //-- Root Of Maneater <-- GN_CHANGEMATERIAL Lv1, 25 Talon, 20 Tooth Of -176,1033,26,2494,1,917,25,1044,20 +177,1033,26,2494,1,917,25,1044,20 //-- Conch <-- GN_CHANGEMATERIAL Lv1, 5 Gill, 25 Immortal Heart -177,961,26,2494,1,956,5,929,25 +178,961,26,2494,1,956,5,929,25 //-- Rotten Scale <-- GN_CHANGEMATERIAL Lv1, 20 Shell, 50 Thin N' Long Tongue -178,959,26,2494,1,935,20,1015,50 +179,959,26,2494,1,935,20,1015,50 //-- Elder Pixie's Beard <-- GN_CHANGEMATERIAL Lv1, 35 Bee Sting, 45 Petite DiablOfs Wing -179,1040,26,2494,1,939,35,1039,45 +180,1040,26,2494,1,939,35,1039,45 //-- Lizard Scruff <-- GN_CHANGEMATERIAL Lv1, 20 Scale Of Snakes, 15 Karvodailnirol -180,1012,26,2494,1,926,20,972,15 +181,1012,26,2494,1,926,20,972,15 //-- Emveretarcon <-- GN_CHANGEMATERIAL Lv1, 5 Heart Of Mermaid, 40 Grasshopper Doll -181,1011,26,2494,1,950,5,752,40 +182,1011,26,2494,1,950,5,752,40 //-- Chinese Ink <-- GN_CHANGEMATERIAL Lv1, 20 Bear's Foot, 25 Black Ladle -182,1024,26,2494,1,948,20,737,25 +183,1024,26,2494,1,948,20,737,25 //-- Spiderweb <-- GN_CHANGEMATERIAL Lv1, 50 Fin, 35 Slender Snake -183,1025,26,2494,1,951,50,1048,35 +184,1025,26,2494,1,951,50,1048,35 //-- Reins <-- GN_CHANGEMATERIAL Lv1, 30 Chonchon Doll, 50 Stuffed Doll -184,1064,26,2494,1,742,30,740,50 +185,1064,26,2494,1,742,30,740,50 //-- Wooden Block <-- GN_CHANGEMATERIAL Lv1, 10 Rotten Bandage, 10 Single Cell -185,1019,26,2494,1,930,10,1052,10 +186,1019,26,2494,1,930,10,1052,10 //-- Tentacle <-- GN_CHANGEMATERIAL Lv1, 40 Decayed Nail, 5 Wild Boar's Mane -186,962,26,2494,1,957,40,1028,5 +187,962,26,2494,1,957,40,1028,5 //-- Mixture <-- GN_CHANGEMATERIAL Lv1, 15 Posionous Canine, 30 Powder Of Butterfly -187,974,26,2494,1,937,15,924,30 +188,974,26,2494,1,937,15,924,30 //-- Colorful Shell <-- GN_CHANGEMATERIAL Lv1, 50 Horn, 45 Zargon -188,1013,26,2494,1,947,50,912,45 +189,1013,26,2494,1,947,50,912,45 //-- Wing Of Moth <-- GN_CHANGEMATERIAL Lv1, 20 Frozen Rose, 30 Reptile Tongue -189,1058,26,2494,1,749,20,903,30 +190,1058,26,2494,1,749,20,903,30 //-- Nipper <-- GN_CHANGEMATERIAL Lv1, 25 Sticky Mucus, 40 Earthworm Peeling -190,960,26,2494,1,938,25,1055,40 +191,960,26,2494,1,938,25,1055,40 //-- Turtle Shell <-- GN_CHANGEMATERIAL Lv1, 5 Fluff, 40 Poring Doll -191,967,26,2494,1,914,5,741,40 +192,967,26,2494,1,914,5,741,40 //-- Nail Of Orc <-- GN_CHANGEMATERIAL Lv1, 50 Raccoon Leaf, 10 Garlet -192,1043,26,2494,1,945,50,910,10 +193,1043,26,2494,1,945,50,910,10 //-- Dragon Canine <-- GN_CHANGEMATERIAL Lv1, 50 Osiris Doll, 35 Sticky Webfoot -193,1035,26,2494,1,751,50,918,35 +194,1035,26,2494,1,751,50,918,35 //-- Skirt Of Virgin <-- GN_CHANGEMATERIAL Lv1, 30 Scales Shell, 35 Head Of Medusa -194,1049,26,2494,1,936,30,1047,35 +195,1049,26,2494,1,936,30,1047,35 //-- Dragon Train <-- GN_CHANGEMATERIAL Lv1, 25 Tooth Of Bat, 35 Sharpened Cuspid -195,1037,26,2494,1,913,25,1063,35 +196,1037,26,2494,1,913,25,1063,35 //-- Dokkaebi Horn <-- GN_CHANGEMATERIAL Lv1, 15 Shining Scales, 25 Lip Of Ancient Fish -196,1021,26,2494,1,954,15,1054,25 +197,1021,26,2494,1,954,15,1054,25 //-- Grit <-- GN_CHANGEMATERIAL Lv1, 35 Crystal Mirror, 50 Limb Of Mantis -197,1056,26,2494,1,747,35,1031,50 +198,1056,26,2494,1,747,35,1031,50 //-- Sharp Scale <-- GN_CHANGEMATERIAL Lv1, 10 Horseshoe, 20 Clam Shell -198,963,26,2494,1,944,10,965,20 +199,963,26,2494,1,944,10,965,20 //-- Short Leg <-- GN_CHANGEMATERIAL Lv1, 20 Claw Of Wolves, 45 Scell -199,1042,26,2494,1,920,20,911,45 +200,1042,26,2494,1,920,20,911,45 //-- Starsand Of Witch <-- GN_CHANGEMATERIAL Lv1, 10 Insect Feeler, 15 Blue Porcelain -200,1061,26,2494,1,928,10,735,15 +201,1061,26,2494,1,928,10,735,15 //-- Fox Tail <-- GN_CHANGEMATERIAL Lv1, 10 Animal's Skin, 15 Rouge -201,1022,26,2494,1,919,10,739,15 +202,1022,26,2494,1,919,10,739,15 //-- Cobold Hair <-- GN_CHANGEMATERIAL Lv1, 45 Jellopy, 20 Wedding Bouquet -202,1034,26,2494,1,909,45,745,20 +203,1034,26,2494,1,909,45,745,20 //-- Jaws Of Ant <-- GN_CHANGEMATERIAL Lv1, 20 Spore Doll, 20 Witherless Rose -203,1014,26,2494,1,743,20,748,20 +204,1014,26,2494,1,743,20,748,20 //-- Voucher Of Orcish Hero <-- GN_CHANGEMATERIAL Lv1, 5 Tree Root, 45 Nail Of Mole -204,968,26,2494,1,902,5,1018,45 +205,968,26,2494,1,902,5,1018,45 //-- Sacred Marks <-- GN_CHANGEMATERIAL Lv1, 10 Scorpion's Tail, 30 Pumpkin Head -205,1009,26,2494,1,904,10,1062,30 +206,1009,26,2494,1,904,10,1062,30 //-- Alchol <-- GN_CHANGEMATERIAL Lv1, 50 Orcish Voucher, 40 Skel Bone -206,970,26,2494,1,931,50,932,40 +207,970,26,2494,1,931,50,932,40 //-- Crap Shell <-- GN_CHANGEMATERIAL Lv1, 50 Baphomet Doll, 30 Fish Tail -207,964,26,2494,1,750,50,1023,30 +208,964,26,2494,1,750,50,1023,30 //-- Tendon <-- GN_CHANGEMATERIAL Lv1, 25 Orcish Cuspid, 5 Feather -208,1050,26,2494,1,922,25,949,5 +209,1050,26,2494,1,922,25,949,5 //-- Tiger Footskin <-- GN_CHANGEMATERIAL Lv1, 5 Pointed Scale, 20 White Platter -209,1030,26,2494,1,906,5,736,20 +210,1030,26,2494,1,906,5,736,20 //-- Hinalle <-- GN_CHANGEMATERIAL Lv1, 45 Bunch Of Flowers, 40 Moustache Of Mole -210,703,26,2494,1,744,45,1017,40 +211,703,26,2494,1,744,45,1017,40 //-- Counteragent <-- GN_CHANGEMATERIAL Lv1, 15 Evil Horn, 30 Mementos -211,973,26,2494,1,923,15,934,30 +212,973,26,2494,1,923,15,934,30 //-- Tooth Of Ancient Fish <-- GN_CHANGEMATERIAL Lv1, 35 Bill Of Birds, 30 Transparent Cloth -212,1053,26,2494,1,925,35,1059,30 +213,1053,26,2494,1,925,35,1059,30 //-- Rat Tail <-- GN_CHANGEMATERIAL Lv1, 35 Mushroom Spore, 40 Golden Hair -213,1016,26,2494,1,921,35,1060,40 +214,1016,26,2494,1,921,35,1060,40 //-- Coal <-- GN_CHANGEMATERIAL Lv1, 1 Guard -214,1003,26,2494,1,2101,1 +215,1003,26,2494,1,2101,1 //-- Steel <-- GN_CHANGEMATERIAL Lv1, 1 Tsurugi -215,999,26,2494,1,1119,1 +216,999,26,2494,1,1119,1 //-- Cigar <-- GN_CHANGEMATERIAL Lv1, 1 Orcish Axe -216,2267,26,2494,1,1304,1 +217,2267,26,2494,1,1304,1 //-- Bone Wand <-- GN_CHANGEMATERIAL Lv1, 100 Clattering Skull, 100 Broken Farming Utensil -217,1615,26,2494,1,7752,100,7753,100 +218,1615,26,2494,1,7752,100,7753,100 //-- Cigar <-- GN_CHANGEMATERIAL Lv1, 1 Orcish Axe, 100 Orcish Voucher -218,2267,26,2494,1,1304,1,931,100 +219,2267,26,2494,1,1304,1,931,100 //-- Starsand Of Witch <-- GN_CHANGEMATERIAL Lv1, 100 Moth Dust, 100 Scell -219,1061,26,2494,1,1057,100,911,100 +220,1061,26,2494,1,1057,100,911,100 //-- Soft Feather <-- GN_CHANGEMATERIAL Lv1, 30 Feather, 30 Feather Of Birds -220,7063,26,2494,1,949,30,916,30 +221,7063,26,2494,1,949,30,916,30 //-- Wind Of Verdure <-- GN_CHANGEMATERIAL Lv1, 100 Ice Piece -221,992,26,2494,1,7066,100 +222,992,26,2494,1,7066,100 //-- Crystal Blue <-- GN_CHANGEMATERIAL Lv1, 100 Claw Of Wolves -222,991,26,2494,1,920,100 +223,991,26,2494,1,920,100 //-- Soft Silk Cloth <-- GN_CHANGEMATERIAL Lv1, 10 Transparent Cloth -223,7166,26,2494,1,1059,10 +224,7166,26,2494,1,1059,10 //-- Transparent Cloth <-- GN_CHANGEMATERIAL Lv1, 2 Soft Silk Cloth -224,1059,26,2494,1,7166,2 +225,1059,26,2494,1,7166,2 //-- Boost500 To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Boost500, 10 Flexible String -225,13269,26,2494,1,1093,10,12417,10,7200,10 +226,13269,26,2494,1,1093,10,12417,10,7200,10 //-- Full SwingK To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Full SwingK, 10 Flexible String -226,13270,26,2494,1,1093,10,12418,10,7200,10 +227,13270,26,2494,1,1093,10,12418,10,7200,10 //-- Mana Plus To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Mana Plus, 10 Flexible String -227,13271,26,2494,1,1093,10,12419,10,7200,10 +228,13271,26,2494,1,1093,10,12419,10,7200,10 //-- Cure Free To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Cure Free, 10 Flexible String -228,13272,26,2494,1,1093,10,12475,10,7200,10 +229,13272,26,2494,1,1093,10,12475,10,7200,10 //-- Stamina Up M To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Stamina Up M, 10 Flexible String -229,13273,26,2494,1,1093,10,12420,10,7200,10 +230,13273,26,2494,1,1093,10,12420,10,7200,10 //-- Digestive F To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Empty Potion, 10 Digestive F, 10 Flexible String -230,13274,26,2494,1,1093,10,12421,10,7200,10 +231,13274,26,2494,1,1093,10,12421,10,7200,10 //-- HP Inc PotS To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 HP Increase PotionS -231,13275,26,2494,1,6297,10,12422,10 +232,13275,26,2494,1,6297,10,12422,10 //-- HP Inc PotM To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 HP Increase PotionM -232,13276,26,2494,1,6297,10,12423,10 +233,13276,26,2494,1,6297,10,12423,10 //-- HP Inc PotL To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 HP Increase PotionL -233,13277,26,2494,1,6297,10,12424,10 +234,13277,26,2494,1,6297,10,12424,10 //-- SP Inc PotS To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 SP Increase PotionS -234,13278,26,2494,1,6297,10,12425,10 +235,13278,26,2494,1,6297,10,12425,10 //-- SP Inc PotM To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 SP Increase PotionM -235,13279,26,2494,1,6297,10,12426,10 +236,13279,26,2494,1,6297,10,12426,10 //-- SP Inc PotL To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 SP Increase PotionL -236,13280,26,2494,1,6297,10,12427,10 +237,13280,26,2494,1,6297,10,12427,10 //-- En White PotZ To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 Enrich White PotionZ -237,13281,26,2494,1,6297,10,12428,10 +238,13281,26,2494,1,6297,10,12428,10 //-- Vitata500 To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 Vitata500 -238,13282,26,2494,1,6297,10,12436,10 +239,13282,26,2494,1,6297,10,12436,10 //-- En Cel Juice To Throw <-- GN_CHANGEMATERIAL Lv1, 10 Bottle To Throw, 10 Enrich Celermine Juice -239,13283,26,2494,1,6297,10,12437,10 +240,13283,26,2494,1,6297,10,12437,10 //============================================== //---- Mix Cooking --- ItemLV=27 --------------- //-- Savage BBQ <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 1 Savage Meat, 1 Cooking Skewer, 1 Black Charcoal -240,12429,27,2495,1,11022,0,6248,1,6249,1,6250,1,6251,1 +241,12429,27,2495,1,11022,0,6248,1,6249,1,6250,1,6251,1 //-- Wug Blood Cocktail <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 3 Wolf Blood, 2 Cold Ice -241,12430,27,2495,1,11022,0,6248,1,6252,3,6253,2 +242,12430,27,2495,1,11022,0,6248,1,6252,3,6253,2 //-- Minor Brisket <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 2 Beef Head Meat, 1 Large Cookpot -242,12431,27,2495,1,11022,0,6248,1,6254,2,6255,1 +243,12431,27,2495,1,11022,0,6248,1,6254,2,6255,1 //-- Siroma Icetea <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 3 Ice Fragment, 2 Ice Crystal, 1 Comodo Tropic Fruit -243,12432,27,2495,1,11022,0,6248,1,6256,3,6257,2,6258,1 +244,12432,27,2495,1,11022,0,6248,1,6256,3,6257,2,6258,1 //-- Drocera Herb Stew <-- GN_MIX_COOKING Lv1, Mix Cook Book, 3 Red Herb, 3 White Herb, 3 Blue Herb, 1 Melange Pot, 1 Large Cookpot, 1 Drocera Tentacle -244,12433,27,2495,1,11022,0,507,3,509,3,510,3,6248,1,6255,1,6259,3 +245,12433,27,2495,1,11022,0,507,3,509,3,510,3,6248,1,6255,1,6259,3 //-- Petti Tail Noodle <-- GN_MIX_COOKING Lv1, Mix Cook Book, 1 Melange Pot, 2 Petti Tail, 1 Fine Noodle, 1 Cool Gravy -245,12434,27,2495,1,11022,0,6248,1,6260,2,6261,1,6262,1 +246,12434,27,2495,1,11022,0,6248,1,6260,2,6261,1,6262,1 //---- Create Bomb --- ItemLV=28 --------------- //-- Apple Bomb <-- GN_MAKEBOMB Lv1, Apple Bomb CB, 1 Apple, 1 Scell, 1 Detonator, 1 Gun Powder -//246,13260,28,2496,1,6279,0,512,1,911,1,1051,1,6244,1 +//247,13260,28,2496,1,6279,0,512,1,911,1,1051,1,6244,1 //-- Coconut Bomb <-- GN_MAKEBOMB Lv1, Coconut Bomb CB, 1 Detonator, 1 Coconut Fruit, 2 Gun Powder -//247,13261,28,2496,1,6281,0,1051,1,6263,1,6244,2 +//248,13261,28,2496,1,6281,0,1051,1,6263,1,6244,2 //-- Melon Bomb <-- GN_MAKEBOMB Lv1, Melon Bomb CB, 1 Sticky Mucus, 1 Detonator, 2 Gun Powder, 1 Melon -//248,13262,28,2496,1,6282,0,938,1,1051,1,6244,2,6264,1 +//249,13262,28,2496,1,6282,0,938,1,1051,1,6244,2,6264,1 //-- Pineapple Bomb <-- GN_MAKEBOMB Lv1, Pinepple Bomb CB, 1 Cactus Needle, 1 Detonator, 3 Gun Powder, 1 Pineapple -//249,13263,28,2496,1,6280,0,952,1,1051,1,6244,3,6265,1 +//250,13263,28,2496,1,6280,0,952,1,1051,1,6244,3,6265,1 //-- Banana Bomb <-- GN_MAKEBOMB Lv1, Banana Bomb CB, 1 Banana, 1 Detonator, 4 Gun Powder, 1 Mould Powder -//250,13264,28,2496,1,6283,0,513,1,1051,1,6244,4,7001,1 +//251,13264,28,2496,1,6283,0,513,1,1051,1,6244,4,7001,1 //---- Special Pharmacy --- ItemLV=29 ---------- //-- Seed Of Horny Plant <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Prickly Fruit -251,6210,29,2497,1,6284,0,576,10 +252,6210,29,2497,1,6284,0,576,10 //-- Bloodsuck Plant Seed <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Root Of Maneater -252,6211,29,2497,1,6284,0,1033,10 +253,6211,29,2497,1,6284,0,1033,10 //-- Bomb Mushroom Spore <-- GN_S_PHARMACY Lv1, Plant Genetic Grow, 10 Mushroom Spore, 2 Gun Powder, 5 Poison Spore -253,6212,29,2497,1,6284,0,921,10,6244,2,7033,5 +254,6212,29,2497,1,6284,0,921,10,6244,2,7033,5 //-- HP Increase Potion (Small) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 10 White Herb, 5 Monster's Feed, 10 Empty Bottle, 1 Hot Sauce -254,12422,29,2497,1,11023,0,509,10,528,5,713,10,7455,1 +255,12422,29,2497,1,11023,0,509,10,528,5,713,10,7455,1 //-- HP Increase Potion (Medium) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 10 Yellow Herb, 10 White Herb, 10 Empty Bottle, 1 Hot Sauce -255,12423,29,2497,1,11023,0,508,10,509,10,713,10,7455,1 +256,12423,29,2497,1,11023,0,508,10,509,10,713,10,7455,1 //-- HP Increase Potion (Large) <-- GN_S_PHARMACY Lv1, Increase Stamina Study, 15 White Herb, 3 Fruit Of Mastela, 1 Holy Water, 10 Empty Bottle, 1 Hot Sauce -256,12424,29,2497,1,11023,0,509,15,522,3,523,1,713,10,7455,1 +257,12424,29,2497,1,11023,0,509,15,522,3,523,1,713,10,7455,1 //-- SP Increase Potion (Small) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 10 Grape, 10 Lemon, 10 Empty Bottle, 1 Sweet Sauce -257,12425,29,2497,1,11024,0,514,10,568,10,713,10,7453,1 +258,12425,29,2497,1,11024,0,514,10,568,10,713,10,7453,1 //-- SP Increase Potion (Medium) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 10 Blue Herb, 10 Honey, 10 Empty Bottle, 1 Sweet Sauce -258,12426,29,2497,1,11024,0,510,10,518,10,713,10,7453,1 +259,12426,29,2497,1,11024,0,510,10,518,10,713,10,7453,1 //-- SP Increase Potion (Large) <-- GN_S_PHARMACY Lv1, Vital Drink CB, 15 Blue Herb, 10 Royal Jelly, 10 Empty Bottle, 1 Sweet Sauce -259,12427,29,2497,1,11024,0,510,15,526,10,713,10,7453,1 +260,12427,29,2497,1,11024,0,510,15,526,10,713,10,7453,1 //-- Enrich White Potion Z <-- GN_S_PHARMACY Lv1, Quality Potion Book, 20 White Potion, 10 White Herb, 1 Alchol, 10 Empty Cylinder -260,12428,29,2497,1,6285,0,504,20,509,10,970,1,1092,10 +261,12428,29,2497,1,6285,0,504,20,509,10,970,1,1092,10 //-- Vitata 500 <-- GN_S_PHARMACY Lv1, Quality Potion Book, 10 Blue Herb, 10 Grape, 10 Honey, 10 Empty Cylinder -261,12436,29,2497,1,6285,0,510,10,514,10,518,10,1092,10 +262,12436,29,2497,1,6285,0,510,10,514,10,518,10,1092,10 //-- Enrich Celermine Juice <-- GN_S_PHARMACY Lv1, Quality Potion Book, 5 Center Potion, 5 Awakening Potion, 10 Empty Cylinder, 5 Hot Sauce -262,12437,29,2497,1,6285,0,645,5,656,5,1092,10,7455,5 +263,12437,29,2497,1,6285,0,645,5,656,5,1092,10,7455,5 //-- Cure Free <-- GN_S_PHARMACY Lv1, Quality Potion Book, 20 Green Herb, 1 Fruit Of Mastela, 5 Panacea, 1 Leaf Of Yggdrasil, 10 Empty Cylinder -263,12475,29,2497,1,6285,0,511,20,522,1,525,5,610,1,1092,10 +264,12475,29,2497,1,6285,0,511,20,522,1,525,5,610,1,1092,10 //-- Golden X <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 10 Yggdrasilberry, 5 Gold -264,100231,29,2497,1,1092,10,607,10,969,5 +265,100231,29,2497,1,1092,10,607,10,969,5 //-- Red Herb Activator <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 45 Red Herb, 5 Yggdrasil Seed -265,100232,29,2497,1,1092,10,507,45,608,5 +266,100232,29,2497,1,1092,10,507,45,608,5 //-- Blue Herb Activator <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 15 Blue Herb, 5 Yggdrasil Seed -266,100233,29,2497,1,1092,10,510,15,608,5 +267,100233,29,2497,1,1092,10,510,15,608,5 //-- Concentrated Red Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 5 Empty Potion Bottle, 15 Red Syrup -267,1100003,29,2497,1,1092,10,1093,5,11621,15 +268,1100003,29,2497,1,1092,10,1093,5,11621,15 //-- Concentrated Blue Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 5 Empty Potion Bottle, 15 Blue Syrup -268,1100004,29,2497,1,1092,10,1093,5,11624,15 +269,1100004,29,2497,1,1092,10,1093,5,11624,15 //-- Concentrated Golden Syrup Potion <-- GN_S_PHARMACY Lvl, 10 Empty Testtube, 5 Empty Potion Bottle, 10 White Syrup, 10 Yellow Syrup -269,1100005,29,2497,1,1092,10,1093,5,11623,10,11622,10 +270,1100005,29,2497,1,1092,10,1093,5,11623,10,11622,10 //=============================================== //--------------------LEVEL 30----------- // Novice Red Potion (569) <-- 2 Red Herbs, 1 Apple -270,569,30,0,0,11058,0,507,2,512,1 +271,569,30,0,0,11058,0,507,2,512,1 // Novice Magnifier (12325) <-- 3 Fine-grained Trunk, 1 Jellopy -271,12325,30,0,0,11058,0,1066,3,909,1 +272,12325,30,0,0,11058,0,1066,3,909,1 // Novice Fly Wing (12323) <-- 2 Fluffs, 2 Feathers, 2 Jellopies -272,12323,30,0,0,11058,0,914,2,949,2,909,2 +273,12323,30,0,0,11058,0,914,2,949,2,909,2 // Novice Cutter (13040) <-- 10 Shells, 10 Worm Peelings, 1 Phracon -273,13040,30,0,0,11058,0,935,10,955,10,1010,1 +274,13040,30,0,0,11058,0,935,10,955,10,1010,1 // Little Unripe Apple (12846) <-- 1 Apple, 1 Green Herb -274,12846,30,0,0,11058,0,512,1,511,1 +275,12846,30,0,0,11058,0,512,1,511,1 // Four Leaf Clover (706) <-- 200 Clovers, 200 Sticky Mucus -275,706,30,0,0,11058,0,705,200,938,200 +276,706,30,0,0,11058,0,705,200,938,200 // Banana Juice (532) <-- 1 Banana, 1 Milk -276,532,30,0,0,11058,0,513,1,519,1 +277,532,30,0,0,11058,0,513,1,519,1 // Apple Juice (531) <-- 1 Apple, 1 Milk -277,531,30,0,0,11058,0,512,1,519,1 +278,531,30,0,0,11058,0,512,1,519,1 // Carrot Juice (534) <-- 1 Carrot, 1 Milk -278,534,30,0,0,11058,0,515,1,519,1 +279,534,30,0,0,11058,0,515,1,519,1 // Grape Juice (533) <-- 1 Grape, 1 Milk -279,533,30,0,0,11058,0,514,1,519,1 +280,533,30,0,0,11058,0,514,1,519,1 // Unripe Apple (619) <-- 10 Sticky Mucus, 20 Green Herbs, 10 Apples -280,619,30,0,0,11058,0,938,10,511,20,512,10 +281,619,30,0,0,11058,0,938,10,511,20,512,10 diff --git a/db/re/skill_db.yml b/db/re/skill_db.yml index de9e4a7dfc..d3c841473c 100644 --- a/db/re/skill_db.yml +++ b/db/re/skill_db.yml @@ -6970,11 +6970,14 @@ Body: DamageFlags: NoDamage: true SplashArea: 1 + Duration1: 1800000 Requires: SpCost: 10 ItemCost: - Item: Germination_Breed Amount: 1 + - Item: Seed_Of_Life + Amount: 1 - Id: 244 Name: AM_REST Description: Vaporize @@ -6982,6 +6985,7 @@ Body: TargetType: Self DamageFlags: NoDamage: true + Cooldown: 20000 Requires: SpCost: 50 - Id: 247 @@ -6995,6 +6999,7 @@ Body: Hit: Single SplashArea: 1 CastTime: 2000 + Cooldown: 20000 FixedCastTime: 1000 Requires: SpCost: @@ -9967,7 +9972,7 @@ Body: NoDamage: true Hit: Single HitCount: 1 - Duration1: 30000 + Duration1: 60000 FixedCastTime: 700 CastTimeFlags: IgnoreDex: true @@ -10368,14 +10373,14 @@ Body: TargetType: Attack DamageFlags: Critical: true - Range: 9 + Range: 4 Hit: Single HitCount: 1 Element: Weapon CastCancel: true CastTime: 250 - AfterCastActDelay: 2000 - Cooldown: 150 + AfterCastActDelay: 1000 + Cooldown: 250 FixedCastTime: 250 Requires: SpCost: 20 @@ -10451,11 +10456,11 @@ Body: Critical: true Flags: TargetTrap: true - Range: 9 + Range: 11 Hit: Multi_Hit HitCount: 1 Element: Weapon - SplashArea: 1 + SplashArea: 2 ActiveInstance: 14 CastCancel: true CastTime: 500 @@ -10464,15 +10469,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 18 + Amount: 16 - Level: 2 - Amount: 21 + Amount: 18 - Level: 3 - Amount: 24 + Amount: 20 - Level: 4 - Amount: 27 + Amount: 22 - Level: 5 - Amount: 30 + Amount: 24 Weapon: Bow: true Ammo: @@ -13272,15 +13277,15 @@ Body: Hit: Multi_Hit HitCount: - Level: 1 - Count: 10 + Count: 2 - Level: 2 - Count: 12 + Count: 4 - Level: 3 - Count: 14 + Count: 6 - Level: 4 - Count: 16 + Count: 8 - Level: 5 - Count: 18 + Count: 10 CastCancel: true CastTime: 5000 AfterCastActDelay: 1000 @@ -17626,8 +17631,8 @@ Body: CopyFlags: Skill: Reproduce: true - AfterCastActDelay: 1000 - Cooldown: 2000 + AfterCastActDelay: 500 + Cooldown: 1750 Requires: SpCost: - Level: 1 @@ -17773,30 +17778,30 @@ Body: CopyFlags: Skill: Reproduce: true - AfterCastActDelay: 1000 + AfterCastActDelay: 500 Cooldown: - Level: 1 - Time: 800 + Time: 900 - Level: 2 - Time: 650 + Time: 750 - Level: 3 - Time: 500 + Time: 600 - Level: 4 - Time: 350 + Time: 450 - Level: 5 - Time: 200 + Time: 300 Requires: SpCost: - Level: 1 - Amount: 34 + Amount: 23 - Level: 2 - Amount: 38 + Amount: 26 - Level: 3 - Amount: 42 + Amount: 29 - Level: 4 - Amount: 46 + Amount: 32 - Level: 5 - Amount: 50 + Amount: 35 Weapon: Dagger: true 1hSword: true @@ -17815,7 +17820,7 @@ Body: Hit: Single HitCount: 1 Element: Weapon - SplashArea: 5 + SplashArea: 4 CopyFlags: Skill: Reproduce: true @@ -19302,7 +19307,17 @@ Body: Time: 1000 - Level: 5 Time: 500 - Cooldown: 700 + Cooldown: # !TODO: Confirm cooldown + - Level: 1 + Time: 150 + - Level: 1 + Time: 200 + - Level: 1 + Time: 250 + - Level: 1 + Time: 300 + - Level: 1 + Time: 350 CastDelayFlags: IgnoreStatus: true Requires: @@ -19459,7 +19474,6 @@ Body: Area: 2 - Level: 10 Area: 2 - Knockback: 3 AfterCastActDelay: 2000 Requires: SpCost: @@ -19652,7 +19666,7 @@ Body: - Level: 5 Area: 3 AfterCastActDelay: 200 - Duration1: 5000 + Duration1: 10000 Requires: SpCost: 5 Weapon: @@ -19677,8 +19691,18 @@ Body: Hit: Single HitCount: 1 Element: Weapon - AfterCastActDelay: 500 - Cooldown: 500 + AfterCastActDelay: 300 + Cooldown: # !TODO: Confirm cooldown + - Level: 1 + Time: 0 + - Level: 1 + Time: 50 + - Level: 1 + Time: 100 + - Level: 1 + Time: 150 + - Level: 1 + Time: 200 Requires: SpCost: - Level: 1 @@ -20512,98 +20536,59 @@ Body: Element: Weapon SplashArea: - Level: 1 - Area: 3 + Area: 2 - Level: 2 - Area: 3 + Area: 2 - Level: 3 - Area: 3 + Area: 2 - Level: 4 - Area: 3 + Area: 2 - Level: 5 - Area: 3 + Area: 2 - Level: 6 - Area: 4 + Area: 3 - Level: 7 - Area: 4 + Area: 3 - Level: 8 - Area: 4 + Area: 3 - Level: 9 - Area: 4 + Area: 3 - Level: 10 - Area: 5 + Area: 4 CopyFlags: Skill: Reproduce: true CastCancel: true - CastTime: - - Level: 1 - Time: 2000 - - Level: 2 - Time: 2200 - - Level: 3 - Time: 2400 - - Level: 4 - Time: 2600 - - Level: 5 - Time: 2800 - - Level: 6 - Time: 3000 - - Level: 7 - Time: 3200 - - Level: 8 - Time: 3400 - - Level: 9 - Time: 3600 - - Level: 10 - Time: 3800 - Cooldown: - - Level: 1 - Time: 5000 - - Level: 2 - Time: 4800 - - Level: 3 - Time: 4600 - - Level: 4 - Time: 4400 - - Level: 5 - Time: 4200 - - Level: 6 - Time: 4000 - - Level: 7 - Time: 3800 - - Level: 8 - Time: 3600 - - Level: 9 - Time: 3400 - - Level: 10 - Time: 3200 + CastTime: 2000 + Cooldown: 3200 + FixedCastTime: 300 Requires: SpCost: - Level: 1 - Amount: 30 + Amount: 24 - Level: 2 - Amount: 32 + Amount: 28 - Level: 3 - Amount: 34 + Amount: 32 - Level: 4 Amount: 36 - Level: 5 - Amount: 38 - - Level: 6 Amount: 40 - - Level: 7 - Amount: 42 - - Level: 8 + - Level: 6 Amount: 44 - - Level: 9 - Amount: 46 - - Level: 10 + - Level: 7 Amount: 48 + - Level: 8 + Amount: 52 + - Level: 9 + Amount: 56 + - Level: 10 + Amount: 60 Weapon: Bow: true Ammo: Arrow: true - AmmoAmount: 10 + AmmoAmount: 5 - Id: 2234 Name: RA_FEARBREEZE Description: Fear Breeze @@ -20658,7 +20643,7 @@ Body: AlterRangeVulture: true Range: 9 Hit: Multi_Hit - HitCount: 1 + HitCount: 5 Element: Weapon CopyFlags: Skill: @@ -20674,7 +20659,7 @@ Body: Bow: true Ammo: Arrow: true - AmmoAmount: 1 + AmmoAmount: 3 - Id: 2237 Name: RA_DETONATOR Description: Detonator @@ -21192,27 +21177,27 @@ Body: Element: Weapon CastTime: - Level: 1 - Time: 200 + Time: 100 - Level: 2 - Time: 400 + Time: 200 - Level: 3 - Time: 600 + Time: 300 - Level: 4 - Time: 800 + Time: 400 - Level: 5 - Time: 1000 + Time: 500 Requires: SpCost: - Level: 1 - Amount: 3 + Amount: 5 - Level: 2 - Amount: 6 + Amount: 10 - Level: 3 - Amount: 9 - - Level: 4 - Amount: 12 - - Level: 5 Amount: 15 + - Level: 4 + Amount: 20 + - Level: 5 + Amount: 25 State: Mado - Id: 2257 Name: NC_PILEBUNKER @@ -21251,22 +21236,17 @@ Body: Hit: Single HitCount: 1 Element: Weapon - SplashArea: 1 - AfterCastActDelay: - - Level: 1 - Time: 300 - - Level: 2 - Time: 200 - - Level: 3 - Time: 100 + SplashArea: 2 + CastTime: 200 + AfterCastActDelay: 100 Requires: SpCost: - Level: 1 - Amount: 2 + Amount: 9 - Level: 2 - Amount: 4 + Amount: 12 - Level: 3 - Amount: 6 + Amount: 15 State: Mado ItemCost: - Item: Vulcan_Bullet @@ -21372,17 +21352,7 @@ Body: IgnoreFlee: true Flags: AllowOnMado: true - Range: - - Level: 1 - Size: 9 - - Level: 2 - Size: 9 - - Level: 3 - Size: 11 - - Level: 4 - Size: 11 - - Level: 5 - Size: 13 + Range: 9 Hit: Single HitCount: 1 Element: Weapon @@ -21392,45 +21362,45 @@ Body: - Level: 2 Area: 1 - Level: 3 - Area: 2 + Area: 1 - Level: 4 Area: 2 - Level: 5 - Area: 3 + Area: 2 CastTime: - Level: 1 - Time: 1400 + Time: 1000 - Level: 2 - Time: 1600 + Time: 1200 - Level: 3 - Time: 1800 + Time: 1600 - Level: 4 - Time: 2000 + Time: 1800 - Level: 5 - Time: 2200 + Time: 2000 AfterCastActDelay: 1000 Cooldown: - Level: 1 - Time: 150 + Time: 100 - Level: 2 + Time: 150 + - Level: 3 Time: 200 + - Level: 4 + Time: 250 + - Level: 5 + Time: 300 + FixedCastTime: + - Level: 1 + Time: 500 + - Level: 2 + Time: 400 - Level: 3 Time: 300 - - Level: 4 - Time: 450 - - Level: 5 - Time: 650 - FixedCastTime: - - Level: 1 - Time: 600 - - Level: 2 - Time: 400 - - Level: 3 - Time: 400 - Level: 4 Time: 200 - Level: 5 - Time: 200 + Time: 100 Requires: SpCost: - Level: 1 @@ -21935,15 +21905,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 20 + Amount: 25 - Level: 2 - Amount: 22 + Amount: 30 - Level: 3 - Amount: 24 + Amount: 35 - Level: 4 - Amount: 26 + Amount: 40 - Level: 5 - Amount: 28 + Amount: 45 Weapon: 1hAxe: true 2hAxe: true @@ -22041,28 +22011,7 @@ Body: - Level: 5 Time: 2000 Requires: - HpCost: - - Level: 1 - Amount: 20 - - Level: 2 - Amount: 40 - - Level: 3 - Amount: 60 - - Level: 4 - Amount: 80 - - Level: 5 - Amount: 100 - SpCost: - - Level: 1 - Amount: 18 - - Level: 2 - Amount: 20 - - Level: 3 - Amount: 22 - - Level: 4 - Amount: 24 - - Level: 5 - Amount: 26 + SpCost: 45 Weapon: 1hAxe: true 2hAxe: true @@ -22440,13 +22389,12 @@ Body: Hit: Multi_Hit HitCount: -3 Element: Weapon - Knockback: 3 CopyFlags: Skill: Reproduce: true CastCancel: true - CastTime: 1000 - AfterCastActDelay: 500 + AfterCastActDelay: 350 + Cooldown: 200 Requires: SpCost: - Level: 1 @@ -23134,25 +23082,38 @@ Body: MaxLevel: 5 Type: Weapon TargetType: Attack - Range: 11 + DamageFlags: + Splash: true + Critical: true + Range: 7 Hit: Multi_Hit HitCount: 1 Element: Weapon - SplashArea: 1 + SplashArea: + - Level: 1 + Area: 1 + - Level: 2 + Area: 1 + - Level: 3 + Area: 1 + - Level: 4 + Area: 2 + - Level: 5 + Area: 2 ActiveInstance: 11 Cooldown: 2000 Requires: SpCost: - Level: 1 - Amount: 12 + Amount: 30 - Level: 2 - Amount: 16 + Amount: 35 - Level: 3 - Amount: 20 + Amount: 40 - Level: 4 - Amount: 24 + Amount: 45 - Level: 5 - Amount: 28 + Amount: 50 Weapon: 1hSpear: true 2hSpear: true @@ -23249,7 +23210,7 @@ Body: State: Shield - Id: 2311 Name: LG_REFLECTDAMAGE - Description: Reflect Damage + Description: Reflect Damage Reduction MaxLevel: 5 TargetType: Self DamageFlags: @@ -23264,13 +23225,13 @@ Body: - Level: 1 Amount: 60 - Level: 2 - Amount: 80 + Amount: 70 - Level: 3 - Amount: 100 + Amount: 80 - Level: 4 - Amount: 120 + Amount: 90 - Level: 5 - Amount: 140 + Amount: 100 State: Shield - Id: 2312 Name: LG_PINPOINTATTACK @@ -23329,37 +23290,10 @@ Body: Description: Shield Spell MaxLevel: 3 TargetType: Self - DamageFlags: - Splash: true - Hit: Single - HitCount: 1 - Element: - - Level: 1 - Element: Neutral - - Level: 2 - Element: Holy - - Level: 3 - Element: Neutral - Knockback: - - Level: 1 - Amount: 2 - - Level: 2 - Amount: 0 - - Level: 3 - Amount: 0 - CopyFlags: - Skill: - Reproduce: true CastCancel: true CastTime: 1000 AfterCastActDelay: 1000 - Duration1: - - Level: 1 - Time: 3000 - - Level: 2 - Time: 30000 - - Level: 3 - Time: 30000 + Duration1: 90000 Cooldown: 2000 Requires: SpCost: 50 @@ -23407,15 +23341,15 @@ Body: Description: Over Brand MaxLevel: 5 Type: Weapon - TargetType: Ground + TargetType: Self DamageFlags: Splash: true Range: 2 - Hit: Single - HitCount: 1 + Hit: Multi_Hit + HitCount: 3 Element: Weapon + SplashArea: 3 CastCancel: true - CastTime: 500 AfterCastActDelay: 2000 Requires: SpCost: @@ -23479,19 +23413,19 @@ Body: Splash: true Hit: Single HitCount: 1 - SplashArea: 3 + SplashArea: 5 Duration1: -1 Duration2: - Level: 1 - Time: 2000 + Time: 60000 - Level: 2 - Time: 4000 + Time: 90000 - Level: 3 - Time: 6000 + Time: 120000 - Level: 4 - Time: 8000 + Time: 150000 - Level: 5 - Time: 10000 + Time: 180000 Requires: SpCost: - Level: 1 @@ -23529,6 +23463,17 @@ Body: CastTime: 1000 AfterCastActDelay: 1000 Duration1: 1000 + Duration2: + - Level: 1 + Time: 2000 + - Level: 2 + Time: 4000 + - Level: 3 + Time: 6000 + - Level: 4 + Time: 8000 + - Level: 5 + Time: 10000 Cooldown: - Level: 1 Time: 6000 @@ -23560,7 +23505,7 @@ Body: Description: Ray of Genesis MaxLevel: 10 Type: Magic - TargetType: Ground + TargetType: Self DamageFlags: Splash: true Range: 1 @@ -23597,46 +23542,25 @@ Body: Requires: SpCost: - Level: 1 - Amount: 45 + Amount: 30 - Level: 2 - Amount: 50 + Amount: 40 - Level: 3 - Amount: 55 + Amount: 50 - Level: 4 Amount: 60 - Level: 5 - Amount: 65 - - Level: 6 Amount: 70 - - Level: 7 - Amount: 75 - - Level: 8 - Amount: 80 - - Level: 9 - Amount: 85 - - Level: 10 - Amount: 90 - HpRateCost: - - Level: 1 - Amount: -3 - - Level: 2 - Amount: -3 - - Level: 3 - Amount: -6 - - Level: 4 - Amount: -6 - - Level: 5 - Amount: -9 - Level: 6 - Amount: -9 + Amount: 80 - Level: 7 - Amount: -12 + Amount: 90 - Level: 8 - Amount: -12 + Amount: 100 - Level: 9 - Amount: -15 + Amount: 110 - Level: 10 - Amount: -15 + Amount: 120 - Id: 2322 Name: LG_PIETY Description: Piety @@ -23698,7 +23622,7 @@ Body: TargetHidden: true Hit: Multi_Hit HitCount: -5 - Element: Earth + Element: Weapon SplashArea: - Level: 1 Area: 1 @@ -23768,15 +23692,15 @@ Body: Requires: SpCost: - Level: 1 - Amount: 80 + Amount: 37 - Level: 2 - Amount: 90 + Amount: 44 - Level: 3 - Amount: 100 + Amount: 51 - Level: 4 - Amount: 110 + Amount: 58 - Level: 5 - Amount: 120 + Amount: 65 Weapon: 1hSpear: true 2hSpear: true @@ -23794,15 +23718,15 @@ Body: AfterCastActDelay: 2000 Duration1: - Level: 1 - Time: 30000 - - Level: 2 - Time: 45000 - - Level: 3 Time: 60000 - - Level: 4 - Time: 75000 - - Level: 5 + - Level: 2 Time: 90000 + - Level: 3 + Time: 120000 + - Level: 4 + Time: 150000 + - Level: 5 + Time: 180000 Cooldown: - Level: 1 Time: 540000 @@ -23828,7 +23752,7 @@ Body: - Level: 5 Amount: 120 - Id: 2519 - Name: LG_OVERBRAND_BRANDISH + Name: LG_OVERBRAND_BRANDISH # Removed on kRO Description: Overbrand Brandish MaxLevel: 5 Type: Weapon @@ -23839,23 +23763,12 @@ Body: Hit: Single HitCount: 1 Element: Weapon - Knockback: - - Level: 1 - Amount: 3 - - Level: 2 - Amount: 4 - - Level: 3 - Amount: 5 - - Level: 4 - Amount: 6 - - Level: 5 - Amount: 7 CopyFlags: Skill: Reproduce: true CastCancel: true - Id: 2520 - Name: LG_OVERBRAND_PLUSATK + Name: LG_OVERBRAND_PLUSATK # Removed on kRO Description: Overbrand Plus Attack MaxLevel: 5 Type: Weapon @@ -23875,7 +23788,7 @@ Body: MaxLevel: 10 Type: Weapon TargetType: Attack - Range: 1 + Range: 2 Hit: Multi_Hit HitCount: -2 Element: Weapon @@ -23997,7 +23910,7 @@ Body: TargetType: Self Flags: NoTargetSelf: true - Range: 1 + Range: 2 Hit: Multi_Hit HitCount: -2 Element: Weapon @@ -24070,8 +23983,9 @@ Body: Description: Tiger Cannon MaxLevel: 10 Type: Weapon - TargetType: Attack + TargetType: Self DamageFlags: + NoDamage: true Splash: true IgnoreFlee: true Flags: @@ -24082,25 +23996,25 @@ Body: Element: Weapon SplashArea: - Level: 1 - Area: 1 + Area: 2 - Level: 2 - Area: 1 + Area: 2 - Level: 3 - Area: 1 + Area: 2 - Level: 4 - Area: 1 + Area: 2 - Level: 5 - Area: 1 + Area: 2 - Level: 6 - Area: 2 + Area: 3 - Level: 7 - Area: 2 + Area: 3 - Level: 8 - Area: 2 + Area: 3 - Level: 9 - Area: 2 + Area: 3 - Level: 10 - Area: 2 + Area: 3 CopyFlags: Skill: Reproduce: true @@ -24127,7 +24041,7 @@ Body: - Level: 10 Time: 2000 AfterCastActDelay: 1000 - Cooldown: 5000 + Cooldown: 3000 Requires: SpCost: - Level: 1 @@ -24205,7 +24119,7 @@ Body: SpCost: 100 Status: Explosionspirits: true - SpiritSphereCost: 5 + SpiritSphereCost: 3 - Id: 2333 Name: SR_CRESCENTELBOW Description: Crescent Elbow @@ -24461,25 +24375,25 @@ Body: AfterCastActDelay: 1000 Duration1: - Level: 1 - Time: 30000 - - Level: 2 - Time: 45000 - - Level: 3 - Time: 60000 - - Level: 4 - Time: 75000 - - Level: 5 - Time: 90000 - - Level: 6 - Time: 105000 - - Level: 7 Time: 120000 + - Level: 2 + Time: 140000 + - Level: 3 + Time: 160000 + - Level: 4 + Time: 180000 + - Level: 5 + Time: 200000 + - Level: 6 + Time: 220000 + - Level: 7 + Time: 240000 - Level: 8 - Time: 135000 + Time: 260000 - Level: 9 - Time: 150000 + Time: 280000 - Level: 10 - Time: 165000 + Time: 300000 Cooldown: 30000 Requires: SpCost: 120 @@ -24814,55 +24728,24 @@ Body: Element: Weapon SplashArea: - Level: 1 - Area: 3 + Area: 2 - Level: 2 - Area: 4 + Area: 2 - Level: 3 - Area: 5 + Area: 3 - Level: 4 - Area: 6 + Area: 3 - Level: 5 - Area: 7 + Area: 4 CopyFlags: Skill: Reproduce: true CastTime: 1000 - Duration1: - - Level: 1 - Time: 12000 - - Level: 2 - Time: 14000 - - Level: 3 - Time: 16000 - - Level: 4 - Time: 18000 - - Level: 5 - Time: 20000 Cooldown: 10000 FixedCastTime: 500 Requires: - SpCost: - - Level: 1 - Amount: 80 - - Level: 2 - Amount: 90 - - Level: 3 - Amount: 100 - - Level: 4 - Amount: 110 - - Level: 5 - Amount: 120 - SpiritSphereCost: - - Level: 1 - Amount: 1 - - Level: 2 - Amount: 2 - - Level: 3 - Amount: 3 - - Level: 4 - Amount: 4 - - Level: 5 - Amount: 5 + SpCost: 70 + SpiritSphereCost: 3 - Id: 2518 Name: SR_RIDEINLIGHTNING Description: Ride In Lightening @@ -24891,16 +24774,16 @@ Body: Reproduce: true CastTime: - Level: 1 - Time: 1000 + Time: 200 - Level: 2 - Time: 2000 + Time: 400 - Level: 3 - Time: 3000 + Time: 600 - Level: 4 - Time: 4000 + Time: 800 - Level: 5 - Time: 5000 - Cooldown: 1000 + Time: 1000 + Cooldown: 500 Requires: SpCost: - Level: 1 @@ -24913,17 +24796,7 @@ Body: Amount: 70 - Level: 5 Amount: 80 - SpiritSphereCost: - - Level: 1 - Amount: 1 - - Level: 2 - Amount: 2 - - Level: 3 - Amount: 3 - - Level: 4 - Amount: 4 - - Level: 5 - Amount: 5 + SpiritSphereCost: 2 - Id: 2350 Name: WA_SWING_DANCE Description: Swing Dance @@ -25192,17 +25065,7 @@ Body: Range: 9 Hit: Multi_Hit HitCount: -10 - SplashArea: - - Level: 1 - Area: 2 - - Level: 2 - Area: 2 - - Level: 3 - Area: 2 - - Level: 4 - Area: 3 - - Level: 5 - Area: 3 + SplashArea: 2 CopyFlags: Skill: Reproduce: true @@ -25214,18 +25077,18 @@ Body: Requires: SpCost: - Level: 1 - Amount: 28 + Amount: 56 - Level: 2 - Amount: 32 + Amount: 62 - Level: 3 - Amount: 38 + Amount: 68 - Level: 4 - Amount: 42 + Amount: 74 - Level: 5 - Amount: 48 + Amount: 80 Ammo: Arrow: true - AmmoAmount: 10 + AmmoAmount: 5 - Id: 2415 # Removed on kRO Name: WM_REVERBERATION_MELEE Description: Reverberation Melee @@ -25326,7 +25189,7 @@ Body: Whip: true Ammo: Arrow: true - AmmoAmount: 20 + AmmoAmount: 10 Unit: Id: Severe_Rainstorm Range: 5 @@ -26295,25 +26158,25 @@ Body: AfterCastActDelay: 1000 Duration1: - Level: 1 - Time: 15000 - - Level: 2 - Time: 20000 - - Level: 3 - Time: 25000 - - Level: 4 - Time: 30000 - - Level: 5 - Time: 35000 - - Level: 6 - Time: 40000 - - Level: 7 Time: 45000 - - Level: 8 - Time: 50000 - - Level: 9 - Time: 55000 - - Level: 10 + - Level: 2 Time: 60000 + - Level: 3 + Time: 75000 + - Level: 4 + Time: 90000 + - Level: 5 + Time: 105000 + - Level: 6 + Time: 120000 + - Level: 7 + Time: 135000 + - Level: 8 + Time: 150000 + - Level: 9 + Time: 165000 + - Level: 10 + Time: 180000 Requires: SpCost: - Level: 1 @@ -26510,17 +26373,7 @@ Body: Hit: Single HitCount: 1 Element: Poison - SplashArea: - - Level: 1 - Area: 1 - - Level: 2 - Area: 1 - - Level: 3 - Area: 1 - - Level: 4 - Area: 1 - - Level: 5 - Area: 2 + SplashArea: 3 CopyFlags: Skill: Reproduce: true @@ -26665,28 +26518,7 @@ Body: - Level: 5 Time: 3100 AfterCastActDelay: 1000 - Duration1: - - Level: 1 - Time: 8000 - - Level: 2 - Time: 10000 - - Level: 3 - Time: 12000 - - Level: 4 - Time: 14000 - - Level: 5 - Time: 16000 - Duration2: - - Level: 1 - Time: 4000 - - Level: 2 - Time: 8000 - - Level: 3 - Time: 12000 - - Level: 4 - Time: 16000 - - Level: 5 - Time: 20000 + Duration1: 5000 Cooldown: 5000 FixedCastTime: - Level: 1 @@ -26711,9 +26543,6 @@ Body: Amount: 70 - Level: 5 Amount: 78 - ItemCost: - - Item: Red_Gemstone - Amount: 2 Unit: Id: Cloud_Kill Range: 3 @@ -26735,7 +26564,7 @@ Body: CastCancel: true CastTime: 1000 AfterCastActDelay: 1000 - Duration1: 60000 + Duration1: 90000 Cooldown: 2000 Requires: SpCost: @@ -27687,9 +27516,11 @@ Body: Description: Blood Sucker MaxLevel: 5 Type: Misc - TargetType: Attack + TargetType: Support DamageFlags: NoDamage: true + Flags: + PartyOnly: true Range: 11 Hit: Single HitCount: 1 @@ -27702,30 +27533,30 @@ Body: AfterCastActDelay: 500 Duration1: - Level: 1 - Time: 20000 + Time: 40000 - Level: 2 - Time: 22000 + Time: 100000 - Level: 3 - Time: 24000 + Time: 160000 - Level: 4 - Time: 26000 + Time: 220000 - Level: 5 - Time: 28000 + Time: 280000 Requires: SpCost: - Level: 1 - Amount: 30 - - Level: 2 - Amount: 35 - - Level: 3 - Amount: 40 - - Level: 4 - Amount: 45 - - Level: 5 Amount: 50 + - Level: 2 + Amount: 55 + - Level: 3 + Amount: 60 + - Level: 4 + Amount: 65 + - Level: 5 + Amount: 70 ItemCost: - Item: Bloodsuck_Plant_Seed - Amount: 1 + Amount: 5 - Id: 2481 Name: GN_SPORE_EXPLOSION Description: Spore Explosion @@ -27733,7 +27564,6 @@ Body: Type: Weapon TargetType: Attack DamageFlags: - NoDamage: true Splash: true Range: 11 Hit: Multi_Hit @@ -27766,7 +27596,7 @@ Body: CastCancel: true CastTime: 1500 AfterCastActDelay: 500 - Duration1: 500 + Duration1: 5000 Cooldown: 5000 Requires: SpCost: @@ -31644,7 +31474,7 @@ Body: CopyFlags: Skill: Reproduce: true - Duration1: 10000 + Duration1: 20000 Cooldown: 60000 Requires: SpCost: @@ -31668,7 +31498,7 @@ Body: Hit: Single HitCount: 1 AfterCastActDelay: 500 - Duration1: 60000 + Duration1: 150000 Cooldown: 300000 FixedCastTime: 1000 Requires: @@ -31964,15 +31794,15 @@ Body: Duration1: 3000 Cooldown: - Level: 1 - Time: 12000 - - Level: 2 Time: 10000 - - Level: 3 + - Level: 2 Time: 8000 + - Level: 3 + Time: 7000 - Level: 4 - Time: 6000 + Time: 5000 - Level: 5 - Time: 4000 + Time: 3000 Requires: SpCost: 65 SpiritSphereCost: @@ -34023,16 +33853,16 @@ Body: Time: 1300 Duration1: - Level: 1 - Time: 12000 + Time: 3000 - Level: 2 - Time: 14000 + Time: 6000 - Level: 3 - Time: 16000 + Time: 9000 - Level: 4 - Time: 18000 + Time: 12000 - Level: 5 - Time: 20000 - Duration2: + Time: 15000 + Duration2: # !TODO: Confirm SC_POISON_MIST duration - Level: 1 Time: 4000 - Level: 2 @@ -34059,7 +33889,7 @@ Body: Unit: Id: Poison_Mist Layout: 3 - Interval: 2300 + Interval: 1000 Target: Enemy Flag: NoOverlap: true @@ -34097,25 +33927,25 @@ Body: Time: 1900 Duration1: - Level: 1 - Time: 30000 + Time: 330000 - Level: 2 - Time: 40000 + Time: 360000 - Level: 3 - Time: 50000 + Time: 390000 - Level: 4 - Time: 60000 + Time: 420000 - Level: 5 - Time: 70000 + Time: 450000 - Level: 6 - Time: 80000 + Time: 480000 - Level: 7 - Time: 90000 + Time: 510000 - Level: 8 - Time: 100000 + Time: 540000 - Level: 9 - Time: 110000 + Time: 570000 - Level: 10 - Time: 120000 + Time: 600000 FixedCastTime: - Level: 1 Time: 1000 @@ -34268,27 +34098,27 @@ Body: Hit: Multi_Hit HitCount: -6 CastCancel: true - CastTime: + CastTime: # !TODO: Confirm cast time - Level: 1 - Time: 1500 + Time: 600 - Level: 2 - Time: 1500 + Time: 700 - Level: 3 - Time: 1500 + Time: 800 - Level: 4 - Time: 2000 + Time: 900 - Level: 5 - Time: 2000 + Time: 1000 - Level: 6 - Time: 2000 + Time: 1100 - Level: 7 - Time: 2500 + Time: 1200 - Level: 8 - Time: 2500 + Time: 1300 - Level: 9 - Time: 2500 + Time: 1400 - Level: 10 - Time: 3000 + Time: 1500 Requires: SpCost: - Level: 1 @@ -34345,27 +34175,27 @@ Body: Area: 3 - Level: 10 Area: 4 - CastTime: + CastTime: # !TODO: Confirm cast time - Level: 1 - Time: 1700 + Time: 600 - Level: 2 - Time: 1900 + Time: 700 - Level: 3 - Time: 2100 + Time: 800 - Level: 4 - Time: 2300 + Time: 900 - Level: 5 - Time: 2500 + Time: 1000 - Level: 6 - Time: 2700 + Time: 1100 - Level: 7 - Time: 2900 + Time: 1200 - Level: 8 - Time: 3100 + Time: 1300 - Level: 9 - Time: 3300 + Time: 1400 - Level: 10 - Time: 3500 + Time: 1500 Duration1: 500 Duration2: 120000 Requires: @@ -34622,7 +34452,6 @@ Body: Size: 9 Hit: Single HitCount: 1 - Knockback: 3 Duration1: 5000 FixedCastTime: 500 Requires: @@ -34711,6 +34540,17 @@ Body: Time: 75000 - Level: 5 Time: 90000 + Cooldown: # !TODO: Confirm cooldown + - Level: 1 + Time: 12000 + - Level: 2 + Time: 14000 + - Level: 3 + Time: 16000 + - Level: 4 + Time: 18000 + - Level: 5 + Time: 20000 Requires: SpCost: - Level: 1 @@ -34763,27 +34603,27 @@ Body: Area: 3 - Level: 10 Area: 3 - CastTime: + CastTime: # !TODO: Confirm cast time - Level: 1 - Time: 200 - - Level: 2 - Time: 400 - - Level: 3 Time: 600 - - Level: 4 + - Level: 2 + Time: 700 + - Level: 3 Time: 800 + - Level: 4 + Time: 900 - Level: 5 Time: 1000 - Level: 6 - Time: 1200 + Time: 1100 - Level: 7 - Time: 1400 + Time: 1200 - Level: 8 - Time: 1600 + Time: 1300 - Level: 9 - Time: 1800 + Time: 1400 - Level: 10 - Time: 2000 + Time: 1500 FixedCastTime: - Level: 1 Time: 2000 @@ -35094,26 +34934,25 @@ Body: AfterCastActDelay: 1000 Duration1: - Level: 1 - Time: 8000 + Time: 6000 - Level: 2 - Time: 10000 + Time: 7000 - Level: 3 - Time: 12000 + Time: 8000 - Level: 4 - Time: 14000 + Time: 9000 - Level: 5 - Time: 16000 + Time: 10000 - Level: 6 - Time: 18000 + Time: 11000 - Level: 7 - Time: 20000 + Time: 12000 - Level: 8 - Time: 22000 + Time: 13000 - Level: 9 - Time: 24000 + Time: 14000 - Level: 10 - Time: 26000 - Duration2: 20000 + Time: 15000 FixedCastTime: 1000 Requires: SpCost: @@ -35139,28 +34978,8 @@ Body: Amount: 85 Unit: Id: Lava_Slide - Layout: - - Level: 1 - Size: 1 - - Level: 2 - Size: 1 - - Level: 3 - Size: 1 - - Level: 4 - Size: 2 - - Level: 5 - Size: 2 - - Level: 6 - Size: 2 - - Level: 7 - Size: 3 - - Level: 8 - Size: 3 - - Level: 9 - Size: 3 - - Level: 10 - Size: 4 - Interval: 2000 + Layout: 3 + Interval: 1000 Target: Enemy Flag: NoReiteration: true @@ -35200,25 +35019,25 @@ Body: AfterCastActDelay: 1000 Duration1: - Level: 1 - Time: 60000 + Time: 330000 - Level: 2 - Time: 80000 + Time: 360000 - Level: 3 - Time: 100000 + Time: 390000 - Level: 4 - Time: 120000 + Time: 420000 - Level: 5 - Time: 140000 + Time: 450000 - Level: 6 - Time: 160000 + Time: 480000 - Level: 7 - Time: 180000 + Time: 510000 - Level: 8 - Time: 200000 + Time: 540000 - Level: 9 - Time: 220000 + Time: 570000 - Level: 10 - Time: 240000 + Time: 600000 FixedCastTime: 200 Requires: SpCost: diff --git a/db/status_disabled.txt b/db/status_disabled.txt index 17058ef039..6a5005ff0b 100644 --- a/db/status_disabled.txt +++ b/db/status_disabled.txt @@ -118,9 +118,9 @@ SC_LEECHESEND,16 // ROYAL_GUARD SC_REFLECTDAMAGE,16 SC_FORCEOFVANGUARD,16 -SC_SHIELDSPELL_DEF,16 -SC_SHIELDSPELL_MDEF,16 -SC_SHIELDSPELL_REF,16 +SC_SHIELDSPELL_HP,16 +SC_SHIELDSPELL_SP,16 +SC_SHIELDSPELL_ATK,16 SC_EXEEDBREAK,16 SC_PRESTIGE,16 SC_BANDING,16 diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 8bb7996eb6..46a52baf88 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -9961,6 +9961,12 @@ current invoking character. --------------------------------------- +*addhomintimacy {,}; + +Increase or decrease a homunculus' intimacy value by the given . 100000 is full loyalty. + +--------------------------------------- + ========================== |12.- Mercenary commands.| ========================== diff --git a/src/map/battle.cpp b/src/map/battle.cpp index b748598c2b..164e45b566 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -540,6 +540,13 @@ int64 battle_attr_fix(struct block_list *src, struct block_list *target, int64 d #else damage += (int64)(damage * tsc->data[SC_VENOMIMPRESS]->val2 / 100); #endif + if (tsc->data[SC_CLOUD_POISON]) { +#ifdef RENEWAL + ratio += 5 * tsc->data[SC_CLOUD_POISON]->val1; +#else + damage += (int64)(damage * 5 * tsc->data[SC_CLOUD_POISON]->val1 / 100); +#endif + } break; case ELE_WIND: if (tsc->data[SC_WATER_INSIGNIA]) @@ -1411,7 +1418,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam switch (skill_id) { #ifndef RENEWAL - case PA_PRESSURE: + case PA_PRESSURE: case HW_GRAVITATION: #endif case SP_SOULEXPLOSION: @@ -1488,8 +1495,11 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if (sc->data[SC_SOUNDOFDESTRUCTION]) damage <<= 1; - if (sc->data[SC_DARKCROW] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT) - damage += damage * sc->data[SC_DARKCROW]->val2 / 100; + if (sc->data[SC_DARKCROW] && (flag&(BF_SHORT|BF_MAGIC)) == BF_SHORT) { + damage += damage * sc->data[SC_DARKCROW]->val2 / 100; + if (status_get_class_(bl) == CLASS_BOSS) + damage /= 2; + } // Damage reductions // Assumptio increases DEF on RE mode, otherwise gives a reduction on the final damage. [Igniz] @@ -1515,6 +1525,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam damage >>= 2; //75% reduction } + if (sc->data[SC_SPORE_EXPLOSION] && (flag & BF_LONG) == BF_LONG) + damage += damage * (status_get_class(bl) == CLASS_BOSS ? 5 : 10) / 100; + if(sc->data[SC_ARMORCHANGE]) { //On official servers, SC_ARMORCHANGE does not change DEF/MDEF but rather increases/decreases the damage if(flag&BF_WEAPON) @@ -1603,7 +1616,7 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam damage -= damage * sc->data[SC_GRANITIC_ARMOR]->val2 / 100; if(sc->data[SC_PAIN_KILLER]) { - damage -= sc->data[SC_PAIN_KILLER]->val3; + damage -= sc->data[SC_PAIN_KILLER]->val2; damage = i64max(damage, 1); } @@ -1674,6 +1687,9 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam if ((sce = sc->data[SC_BLOODLUST]) && flag&BF_WEAPON && damage > 0 && rnd()%100 < sce->val3) status_heal(src, damage * sce->val4 / 100, 0, 3); + if ((sce = sc->data[SC_BLOODSUCKER]) && flag & BF_WEAPON && damage > 0 && rnd() % 100 < (2 * sce->val1 - 1)) + status_heal(src, damage * sce->val1 / 100, 0, 3); + if (flag&BF_MAGIC && bl->type == BL_PC && sc->data[SC_GVG_GIANT] && sc->data[SC_GVG_GIANT]->val4) damage += damage * sc->data[SC_GVG_GIANT]->val4 / 100; @@ -1716,11 +1732,6 @@ int64 battle_calc_damage(struct block_list *src,struct block_list *bl,struct Dam } } } - /* Self Buff that destroys the armor of any target hit with melee or ranged physical attacks */ - if( sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 1 && flag&BF_WEAPON ) { - skill_break_equip(src,bl, EQP_ARMOR, 10000, BCT_ENEMY); // 100% chance (http://irowiki.org/wiki/Shield_Spell#Level_3_spells_.28refine_based.29) - status_change_end(src,SC_SHIELDSPELL_REF,INVALID_TIMER); - } if (sc->data[SC_POISONINGWEAPON] && flag&BF_SHORT && (skill_id == 0 || skill_id == GC_VENOMPRESSURE) && damage > 0) { damage += damage * 10 / 100; @@ -2722,7 +2733,7 @@ static bool is_attack_critical(struct Damage* wd, struct block_list *src, struct #ifdef RENEWAL case ASC_BREAKER: #endif - case RK_IGNITIONBREAK: + case LG_CANNONSPEAR: case GC_CROSSIMPACT: cri /= 2; break; @@ -3213,7 +3224,6 @@ static void battle_calc_element_damage(struct Damage* wd, struct block_list *src case MC_CARTREVOLUTION: case HW_MAGICCRASHER: case SR_FALLENEMPIRE: - case SR_TIGERCANNON: case SR_CRESCENTELBOW_AUTOSPELL: case SR_GATEOFHELL: wd->damage = battle_attr_fix(src, target, wd->damage, ELE_NEUTRAL, tstatus->def_ele, tstatus->ele_lv); @@ -3526,9 +3536,9 @@ static void battle_calc_skill_base_damage(struct Damage* wd, struct block_list * int damagevalue = (sstatus->hp / 50 + status_get_max_sp(src) / 4) * skill_lv; if(status_get_lv(src) > 100) - damagevalue = damagevalue * status_get_lv(src) / 150; + damagevalue = damagevalue * status_get_lv(src) / 100; if(sd) - damagevalue = damagevalue * (100 + 5 * (pc_checkskill(sd,RK_DRAGONTRAINING) - 1)) / 100; + damagevalue = damagevalue * (90 + 10 * pc_checkskill(sd, RK_DRAGONTRAINING)) / 100; ATK_ADD(wd->damage, wd->damage2, damagevalue); #ifdef RENEWAL ATK_ADD(wd->weaponAtk, wd->weaponAtk2, damagevalue); @@ -3742,9 +3752,6 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s if (sd && sd->weapontype1 == W_2HSWORD) wd->div_ = 2; break; - case RA_AIMEDBOLT: - wd->div_ = 2 + tstatus->size + rnd()%2; - break; case SC_FATALMENACE: if (sd && sd->weapontype1 == W_DAGGER) wd->div_++; @@ -4131,7 +4138,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * // Fall through case MA_SHARPSHOOTING: #ifdef RENEWAL - skillratio += 50 + 200 * skill_lv; + skillratio += -100 + 300 + 300 * skill_lv; RE_LVL_DMOD(100); #else skillratio += 100 + 50 * skill_lv; @@ -4164,7 +4171,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; case ASC_BREAKER: #ifdef RENEWAL - skillratio += -100 + 140 * skill_lv + sstatus->str + sstatus->int_; // !TODO: Confirm stat modifier + skillratio += -100 + 150 * skill_lv + sstatus->str + sstatus->int_; // !TODO: Confirm stat modifier RE_LVL_DMOD(100); #else // Pre-Renewal: skill ratio for weapon part of damage [helvetica] @@ -4318,7 +4325,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += ((skill_lv - 1) % 5 + 1) * 100; break; case RK_SONICWAVE: - skillratio += -100 + 500 + 100 * skill_lv; + skillratio += -100 + 1050 + 150 * skill_lv; RE_LVL_DMOD(100); break; case RK_HUNDREDSPEAR: @@ -4340,7 +4347,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case RK_IGNITIONBREAK: - skillratio += -100 + 400 * skill_lv; + skillratio += -100 + 450 * skill_lv; RE_LVL_DMOD(100); break; case NPC_IGNITIONBREAK: @@ -4356,7 +4363,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + 500 * skill_lv; break; case RK_STORMBLAST: - skillratio += -100 + (((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : 0) + status_get_str(src) / 8) * 100; // ATK = [{Rune Mastery Skill Level + (Caster's STR / 8)} x 100] % + skillratio += -100 + (((sd) ? pc_checkskill(sd,RK_RUNEMASTERY) : 0) + sstatus->str / 6) * 100; // ATK = [{Rune Mastery Skill Level + (Caster's STR / 6)} x 100] % RE_LVL_DMOD(100); break; case RK_PHANTOMTHRUST: // ATK = [{(Skill Level x 50) + (Spear Master Level x 10)} x Caster's Base Level / 150] % @@ -4365,7 +4372,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; // case NPC_PHANTOMTHRUST: // ATK = 100% for all level case GC_CROSSIMPACT: - skillratio += -100 + 1000 + 150 * skill_lv; + skillratio += -100 + 1400 + 150 * skill_lv; RE_LVL_DMOD(100); break; case GC_COUNTERSLASH: @@ -4395,13 +4402,21 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * case AB_DUPLELIGHT_MELEE: skillratio += 50 + 15 * skill_lv; break; - case RA_ARROWSTORM: case NPC_ARROWSTORM: skillratio += 900 + 80 * skill_lv; + break; + case RA_ARROWSTORM: + if (sc && sc->data[SC_FEARBREEZE]) + skillratio += -100 + 200 + 250 * skill_lv; + else + skillratio += -100 + 200 + 180 * skill_lv; RE_LVL_DMOD(100); break; case RA_AIMEDBOLT: - skillratio += 100 + 20 * skill_lv + 500; + if (sc && sc->data[SC_FEARBREEZE]) + skillratio += -100 + 800 + 35 * skill_lv; + else + skillratio += -100 + 500 + 20 * skill_lv; RE_LVL_DMOD(100); break; case RA_CLUSTERBOMB: @@ -4422,16 +4437,16 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 50 * skill_lv; break; case NC_BOOSTKNUCKLE: - skillratio += 100 + 100 * skill_lv + status_get_dex(src); - RE_LVL_DMOD(120); + skillratio += 200 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus? + RE_LVL_DMOD(100); break; case NC_PILEBUNKER: skillratio += 200 + 100 * skill_lv + status_get_str(src); RE_LVL_DMOD(100); break; case NC_VULCANARM: - skillratio += -100 + 70 * skill_lv + status_get_dex(src); - RE_LVL_DMOD(120); + skillratio += -100 + 140 * skill_lv + sstatus->dex / 6; // !TODO: What's the DEX bonus? + RE_LVL_DMOD(100); break; case NC_FLAMELAUNCHER: case NC_COLDSLOWER: @@ -4439,12 +4454,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(150); break; case NC_ARMSCANNON: - switch( tstatus->size ) { - case SZ_SMALL: skillratio += 200 + 400 * skill_lv; break;// Small - case SZ_MEDIUM: skillratio += 200 + 350 * skill_lv; break;// Medium - case SZ_BIG: skillratio += 200 + 300 * skill_lv; break;// Large - } - RE_LVL_DMOD(120); + skillratio += -100 + 400 + 300 * skill_lv; + RE_LVL_DMOD(100); break; case NC_AXEBOOMERANG: skillratio += 150 + 50 * skill_lv; @@ -4457,37 +4468,34 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * RE_LVL_DMOD(100); break; case NC_POWERSWING: // According to current sources, only the str + dex gets modified by level [Akinari] - skillratio += -100 + status_get_str(src) + status_get_dex(src); + skillratio += -100 + ((sstatus->str + sstatus->dex)/ 2) + 300 + 100 * skill_lv; RE_LVL_DMOD(100); - skillratio += 300 + 100 * skill_lv; break; case NC_MAGMA_ERUPTION: // 'Slam' damage skillratio += 350 + 50 * skill_lv; break; case NC_AXETORNADO: - skillratio += 100 + 100 * skill_lv + status_get_vit(src); + skillratio += -100 + 200 + 180 * skill_lv + sstatus->vit / 6; // !TODO: What's the VIT bonus? RE_LVL_DMOD(100); - if (distance_bl(src, target) > 2) // Will deal 75% damage outside of 5x5 area. - skillratio = skillratio * 75 / 100; break; case SC_FATALMENACE: - skillratio += 100 * skill_lv; + skillratio += 120 * skill_lv + sstatus->agi / 6; // !TODO: What's the AGI bonus? RE_LVL_DMOD(100); break; case SC_TRIANGLESHOT: - skillratio += 200 + (skill_lv - 1) * status_get_agi(src) / 2; - RE_LVL_DMOD(120); + skillratio += -100 + 230 * skill_lv + 3 * sstatus->agi; + RE_LVL_DMOD(100); break; case SC_FEINTBOMB: - skillratio += -100 + (skill_lv + 1) * status_get_dex(src) / 2 * ((sd) ? sd->status.job_level / 10 : 1); + skillratio += -100 + (skill_lv + 1) * sstatus->dex / 2 * ((sd) ? sd->status.job_level / 10 : 1); RE_LVL_DMOD(120); break; case LG_CANNONSPEAR: - skillratio += -100 + skill_lv * (50 + status_get_str(src)); + skillratio += -100 + skill_lv * (50 + sstatus->str); RE_LVL_DMOD(100); break; case LG_BANISHINGPOINT: - skillratio += -100 + (50 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 30 : 0); + skillratio += -100 + (80 * skill_lv) + ((sd) ? pc_checkskill(sd,SM_BASH) * 30 : 0); RE_LVL_DMOD(100); break; case LG_SHIELDPRESS: @@ -4511,51 +4519,29 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += 2900 + (status_get_max_hp(src) - status_get_hp(src)); RE_LVL_DMOD(100); break; - case LG_SHIELDSPELL: - if (sd && skill_lv == 1) { // [(Casters Base Level x 4) + (Shield DEF x 10) + (Casters VIT x 2)] % - short index = sd->equip_index[EQI_HAND_L]; - - skillratio += -100 + status_get_lv(src) * 4 + status_get_vit(src) * 2; - if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR) - skillratio += sd->inventory_data[index]->def * 10; - } else - skillratio = 0; // Prevent damage since level 2 is MATK. [Aleos] - break; case LG_MOONSLASHER: skillratio += -100 + 120 * skill_lv + ((sd) ? pc_checkskill(sd,LG_OVERBRAND) * 80 : 0); RE_LVL_DMOD(100); break; case LG_OVERBRAND: - skillratio += -100 + 400 * skill_lv + ((sd) ? pc_checkskill(sd,CR_SPEARQUICKEN) * 50 : 0); + if(sc && sc->data[SC_OVERBRANDREADY]) + skillratio += -100 + 450 * skill_lv; + else + skillratio += -100 + 300 * skill_lv; + skillratio += ((sd) ? pc_checkskill(sd, CR_SPEARQUICKEN) * 50 : 0); RE_LVL_DMOD(100); break; - case LG_OVERBRAND_BRANDISH: - skillratio += -100 + 300 * skill_lv + status_get_str(src) + status_get_dex(src); - RE_LVL_DMOD(100); - break; - case LG_OVERBRAND_PLUSATK: // Only Piercing and Swing damage get RE_LVL_DMOD bonus damage - skillratio += -100 + 200 * skill_lv + rnd()%90 + 10; - break; case LG_EARTHDRIVE: - if (sd) { - short index = sd->equip_index[EQI_HAND_L]; - - if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR) - skillratio += -100 + (skill_lv + 1) * sd->inventory_data[index]->weight / 10; - } + skillratio += -100 + 380 * skill_lv + ((sstatus->str + sstatus->vit) / 6); // !TODO: What's the STR/VIT bonus? RE_LVL_DMOD(100); break; case LG_HESPERUSLIT: - if (sc) { - if (sc->data[SC_INSPIRATION]) - skillratio += 1100; - if (sc->data[SC_BANDING]) { - skillratio += -100 + 120 * skill_lv + 200 * sc->data[SC_BANDING]->val2; - if (sc->data[SC_BANDING]->val2 > 5) - skillratio = skillratio * 150 / 100; - } - RE_LVL_DMOD(100); - } + if (sc && sc->data[SC_INSPIRATION]) + skillratio += -100 + 450 * skill_lv; + else + skillratio += -100 + 300 * skill_lv; + skillratio += sstatus->vit / 6; // !TODO: What's the VIT bonus? + RE_LVL_DMOD(100); break; case SR_EARTHSHAKER: if (tsc && ((tsc->option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK)) || tsc->data[SC_CAMOUFLAGE] || tsc->data[SC_STEALTHFIELD] || tsc->data[SC__SHADOWFORM])) { @@ -4571,12 +4557,12 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * break; case SR_DRAGONCOMBO: - skillratio += 40 * skill_lv; + skillratio += 100 + 80 * skill_lv; RE_LVL_DMOD(100); break; case SR_FALLENEMPIRE: - // ATK [(Skill Level x 250 + 100) x Caster Base Level / 150] % - skillratio += -100 + 250 * skill_lv + 100; + // ATK [(Skill Level x 300 + 100) x Caster Base Level / 150] % + skillratio += 300 * skill_lv; RE_LVL_DMOD(150); break; case SR_TIGERCANNON: @@ -4596,8 +4582,8 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += skillratio * 30 / 100; break; case SR_SKYNETBLOW: - //ATK [{(Skill Level x 80) + (Caster AGI)} x Caster Base Level / 100] % - skillratio += -100 + 80 * skill_lv + sstatus->agi; + //ATK [{(Skill Level x 200) + (Caster AGI)} x Caster Base Level / 100] % + skillratio += -100 + 200 * skill_lv + sstatus->agi / 6; // !TODO: Confirm AGI bonus RE_LVL_DMOD(100); break; @@ -4629,7 +4615,7 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += skillratio * 30 / 100; break; case SR_WINDMILL: // ATK [(Caster Base Level + Caster DEX) x Caster Base Level / 100] % - skillratio += -100 + status_get_lv(src) + status_get_dex(src); + skillratio += -100 + status_get_lv(src) + sstatus->dex; RE_LVL_DMOD(100); break; case SR_GATEOFHELL: @@ -4642,24 +4628,24 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += skillratio * 30 / 100; break; case SR_GENTLETOUCH_QUIET: - skillratio += -100 + 100 * skill_lv + status_get_dex(src); + skillratio += -100 + 100 * skill_lv + sstatus->dex; RE_LVL_DMOD(100); break; case SR_HOWLINGOFLION: - skillratio += -100 + 300 * skill_lv; - RE_LVL_DMOD(150); + skillratio += -100 + 500 * skill_lv; + RE_LVL_DMOD(100); break; - case SR_RIDEINLIGHTNING: // ATK [{(Skill Level x 40) + Additional Damage} x Caster Base Level / 100] % + case SR_RIDEINLIGHTNING: skillratio += -100 + 40 * skill_lv; if (sd && sd->status.weapon == W_KNUCKLE) - skillratio += skillratio * 25 / 100; + skillratio += 50 * skill_lv; RE_LVL_DMOD(100); break; case WM_SEVERE_RAINSTORM_MELEE: - //ATK [{(Caster DEX + AGI) x (Skill Level / 5)} x Caster Base Level / 100] % - skillratio = (status_get_dex(src) + status_get_agi(src)) * skill_lv / 5; + //ATK [{(Caster DEX / 300 + AGI / 200)} x Caster Base Level / 100] % + skillratio += -100 + 100 * skill_lv + (sstatus->dex / 300 + sstatus->agi / 200); if (wd->miscflag&4) // Whip/Instrument equipped - skillratio += 100; // !TODO: What's the weapon bonus? + skillratio += 20 * skill_lv; RE_LVL_DMOD(100); break; case WM_GREAT_ECHO: @@ -4671,21 +4657,18 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * } RE_LVL_DMOD(100); break; - case GN_CART_TORNADO: { // ATK [( Skill Level x 100 ) + ( Cart Weight / ( 150 - Caster Base STR ))] + ( Cart Remodeling Skill Level x 50 )] % - skillratio += -100 + 100 * skill_lv; + case GN_CART_TORNADO: { // ATK [( Skill Level x 200 ) + ( Cart Weight / ( 150 - Caster Base STR ))] + ( Cart Remodeling Skill Level x 50 )] % + skillratio += -100 + 200 * skill_lv; if(sd && sd->cart_weight) skillratio += sd->cart_weight / 10 / (150 - min(sd->status.str,120)) + pc_checkskill(sd,GN_REMODELING_CART) * 50; } break; case GN_CARTCANNON: - // ATK [{( INT / (6 - ( Cart Remodeling Skill Level ) )} + ( Cart Cannon Skill Level x 350 )] % - skillratio += -100 + 350 * skill_lv + sstatus->int_ / (6 - (sd ? pc_checkskill(sd, GN_REMODELING_CART) : 1)); + skillratio += -100 + (250 + 20 * pc_checkskill(sd, GN_REMODELING_CART)) * skill_lv + 2 * sstatus->int_ / (6 - pc_checkskill(sd, GN_REMODELING_CART)); RE_LVL_DMOD(100); break; case GN_SPORE_EXPLOSION: - skillratio += -100 + 180 * skill_lv; - if (wd->miscflag & 8) - skillratio += 200 + sstatus->int_; // Target receives extra damage + skillratio += -100 + 400 + 200 * skill_lv; RE_LVL_DMOD(100); break; case GN_WALLOFTHORN: @@ -4791,22 +4774,22 @@ static int battle_calc_attack_skill_ratio(struct Damage* wd, struct block_list * skillratio += -100 + 20 * skill_lv; break; case MH_NEEDLE_OF_PARALYZE: - skillratio += -100 + 300 * skill_lv * status_get_lv(src) / 100 + sstatus->dex; // !TODO: Confirm Base Level and DEX bonus + skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->dex / 6; // !TODO: Confirm Base Level and DEX bonus break; case MH_STAHL_HORN: - skillratio += 900 + 100 * skill_lv * status_get_lv(src) / 150 + sstatus->vit; // !TODO: Confirm VIT bonus + skillratio += -100 + 1000 + 300 * skill_lv * status_get_lv(src) / 150 + sstatus->vit / 6; // !TODO: Confirm VIT bonus break; case MH_LAVA_SLIDE: - skillratio += -100 + 70 * skill_lv; + skillratio += -100 + 50 * skill_lv; break; case MH_SONIC_CRAW: skillratio += -100 + 60 * skill_lv * status_get_lv(src) / 150; break; case MH_SILVERVEIN_RUSH: - skillratio += -100 + 250 * skill_lv * status_get_lv(src) / 100 + sstatus->str; // !TODO: Confirm STR bonus + skillratio += -100 + 250 * skill_lv * status_get_lv(src) / 100 + sstatus->str / 6; // !TODO: Confirm STR bonus break; case MH_MIDNIGHT_FRENZY: - skillratio += -100 + 350 * skill_lv * status_get_lv(src) / 150 + sstatus->str; // !TODO: Confirm STR bonus + skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 150 + sstatus->str / 6; // !TODO: Confirm STR bonus break; case MH_MAGMA_FLOW: skillratio += -100 + (100 * skill_lv + 3 * status_get_lv(src)) * status_get_lv(src) / 120; @@ -4979,14 +4962,6 @@ static int64 battle_calc_skill_constant_addition(struct Damage* wd, struct block atk = damagevalue; } break; - case SR_FALLENEMPIRE: - // [(Target Size value + Skill Level - 1) x Caster STR] + [(Target current weight x Caster DEX / 120)] - atk = ( ((tstatus->size+1)*2 + skill_lv - 1) * sstatus->str); - if( tsd && tsd->weight ) - atk += ( (tsd->weight/10) * sstatus->dex / 120 ); - else - atk += ( status_get_lv(target) * 50 ); //mobs - break; } return atk; } @@ -5395,11 +5370,6 @@ static void battle_calc_attack_post_defense(struct Damage* wd, struct block_list if(sd && pc_checkskill(sd,AS_SONICACCEL)>0) ATK_ADDRATE(wd->damage, wd->damage2, 10); break; - - case NC_AXETORNADO: - if( (sstatus->rhw.ele) == ELE_WIND || (sstatus->lhw.ele) == ELE_WIND ) - ATK_ADDRATE(wd->damage, wd->damage2, 25); - break; } } @@ -5807,13 +5777,6 @@ static struct Damage initialize_weapon_data(struct block_list *src, struct block case RK_WINDCUTTER: if (sd && (sd->status.weapon == W_1HSPEAR || sd->status.weapon == W_2HSPEAR)) wd.flag |= BF_LONG; - - // The number of hits is set to 3 by default for use in Inspiration status. - // When in Banding, the number of hits is equal to the number of Royal Guards in Banding. - case LG_HESPERUSLIT: - if( sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 3 ) - wd.div_ = sc->data[SC_BANDING]->val2; - break; } } else { wd.flag |= is_skill_using_arrow(src, skill_id)?BF_LONG:BF_SHORT; @@ -6037,9 +6000,16 @@ static struct Damage battle_calc_weapon_attack(struct block_list *src, struct bl #ifdef RENEWAL if (is_attack_critical(&wd, src, target, skill_id, skill_lv, false)) { if (sd) { //Check for player so we don't crash out, monsters don't have bonus crit rates [helvetica] - wd.damage = (int64)floor((float)((wd.damage * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100); - if (is_attack_left_handed(src, skill_id)) - wd.damage2 = (int64)floor((float)((wd.damage2 * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100); + if (skill_id > 0) + wd.damage = (int64)floor((float)((wd.damage * 140) / 100 * (100 + (sd->bonus.crit_atk_rate / 2))) / 100); + else + wd.damage = (int64)floor((float)((wd.damage * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100); + if (is_attack_left_handed(src, skill_id)) { + if (skill_id > 0) + wd.damage2 = (int64)floor((float)((wd.damage2 * 140) / 100 * (100 + (sd->bonus.crit_atk_rate / 2))) / 100); + else + wd.damage2 = (int64)floor((float)((wd.damage2 * 140) / 100 * (100 + sd->bonus.crit_atk_rate)) / 100); + } } else wd.damage = (int64)floor((float)(wd.damage * 140) / 100); @@ -6251,10 +6221,6 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case NPC_EARTHQUAKE: s_ele = ELE_NEUTRAL; break; - case LG_SHIELDSPELL: - if (skill_lv == 2) - s_ele = ELE_HOLY; - break; case WL_HELLINFERNO: if (mflag & 2) { // ELE_DARK s_ele = ELE_DARK; @@ -6266,6 +6232,8 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list s_ele = sd->bonus.arrow_ele; break; case SO_PSYCHIC_WAVE: + if (sd && (sd->weapontype1 == W_STAFF || sd->weapontype1 == W_2HSTAFF || sd->weapontype1 == W_BOOK)) + ad.div_ = 2; if( sc && sc->count ) { if( sc->data[SC_HEATER_OPTION] ) s_ele = sc->data[SC_HEATER_OPTION]->val3; @@ -6281,6 +6249,14 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list if(sd && sd->spiritcharm_type != CHARM_TYPE_NONE && sd->spiritcharm > 0) s_ele = sd->spiritcharm_type; break; + case AB_ADORAMUS: + if (sc && sc->data[SC_ANCILLA]) + s_ele = ELE_NEUTRAL; + break; + case LG_RAYOFGENESIS: + if (sc && sc->data[SC_INSPIRATION]) + s_ele = ELE_NEUTRAL; + break; } //Set miscellaneous data that needs be filled @@ -6427,7 +6403,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case MG_COLDBOLT: case MG_LIGHTNINGBOLT: if (sc && sc->data[SC_SPELLFIST] && mflag&BF_SHORT) { - skillratio += (sc->data[SC_SPELLFIST]->val4 * 100) + (sc->data[SC_SPELLFIST]->val1 * 50) - 100;// val4 = used bolt level, val2 = used spellfist level. [Rytech] + skillratio += (sc->data[SC_SPELLFIST]->val3 * 100) + (sc->data[SC_SPELLFIST]->val1 * 50 - 50) - 100; // val3 = used bolt level, val1 = used spellfist level. [Rytech] ad.div_ = 1; // ad mods, to make it work similar to regular hits [Xazax] ad.flag = BF_WEAPON|BF_SHORT; ad.type = DMG_NORMAL; @@ -6570,7 +6546,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += 3 * pc_checkskill(sd, BA_MUSICALLESSON); break; case HW_GRAVITATION: - skillratio += -100 + 50 * skill_lv; + skillratio += -100 + 100 * skill_lv; RE_LVL_DMOD(100); break; case PA_PRESSURE: @@ -6583,18 +6559,18 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; #endif case AB_JUDEX: - skillratio += -100 + 300 + 40 * skill_lv; + skillratio += -100 + 300 + 70 * skill_lv; RE_LVL_DMOD(100); break; case AB_ADORAMUS: - skillratio += 230 + 70 * skill_lv; + skillratio += - 100 + 300 + 250 * skill_lv; RE_LVL_DMOD(100); break; case AB_DUPLELIGHT_MAGIC: skillratio += 300 + 40 * skill_lv; break; case WL_SOULEXPANSION: - skillratio += -100 + 750 + skill_lv * 150 + sstatus->int_; + skillratio += -100 + 1000 + skill_lv * 200 + sstatus->int_ / 6; // !TODO: Confirm INT bonus RE_LVL_DMOD(100); break; case WL_FROSTMISTY: @@ -6632,7 +6608,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); break; case WL_COMET: - skillratio += -100 + 2500 + 500 * skill_lv; + skillratio += -100 + 2500 + 700 * skill_lv; RE_LVL_DMOD(100); break; case WL_CHAINLIGHTNING_ATK: @@ -6649,10 +6625,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case WL_TETRAVORTEX_WATER: case WL_TETRAVORTEX_WIND: case WL_TETRAVORTEX_GROUND: - if (skill_lv < 6) - skillratio += -100 + 500 + 500 * skill_lv; - else - skillratio += -100 + 3000 + 200 * (skill_lv - 5); + skillratio += -100 + 800 + 400 * skill_lv; break; case WL_SUMMON_ATK_FIRE: case WL_SUMMON_ATK_WATER: @@ -6662,17 +6635,11 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list RE_LVL_DMOD(100); // ! TODO: Confirm new formula break; case LG_RAYOFGENESIS: - skillratio += -100 + 200 * skill_lv; - if(sc && sc->data[SC_INSPIRATION]) - skillratio += 1400; + skillratio += -100 + 230 * skill_lv + sstatus->int_ / 6; // !TODO: What's the INT bonus? + if (sc && sc->data[SC_INSPIRATION]) + skillratio += 70 * skill_lv; RE_LVL_DMOD(100); break; - case LG_SHIELDSPELL: // [(Casters Base Level x 4) + (Shield MDEF x 100) + (Casters INT x 2)] % - if (sd && skill_lv == 2) - skillratio += -100 + status_get_lv(src) * 4 + sd->bonus.shieldmdef * 100 + status_get_int(src) * 2; - else - skillratio = 0; - break; case WM_METALICSOUND: skillratio += -100 + 120 * skill_lv + 60 * ((sd) ? pc_checkskill(sd, WM_LESSON) : 1); if (tsc && tsc->data[SC_SLEEP]) @@ -6700,21 +6667,23 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list case NPC_ELECTRICWALK: skillratio += -100 + 100 * skill_lv; break; - case SO_EARTHGRAVE: - skillratio += -100 + sstatus->int_ * skill_lv + ((sd) ? pc_checkskill(sd, SA_SEISMICWEAPON) * 200 : 0); + case SO_EARTHGRAVE: // !TODO: Confirm formula + skillratio += -100 + sstatus->int_ / 6 * skill_lv + ((sd) ? pc_checkskill(sd, SA_SEISMICWEAPON) * 200 : 0); RE_LVL_DMOD(100); if( sc && sc->data[SC_CURSED_SOIL_OPTION] ) skillratio += (sd ? sd->status.job_level * 5 : 0); break; - case SO_DIAMONDDUST: - skillratio = ( 200 * ((sd) ? pc_checkskill(sd, SA_FROSTWEAPON) : 0) + sstatus->int_ * skill_lv ); + case SO_DIAMONDDUST: // !TODO: Confirm formula + skillratio += -100 + 200 * ((sd) ? pc_checkskill(sd, SA_FROSTWEAPON) : 0) + sstatus->int_ / 6 * skill_lv; RE_LVL_DMOD(100); if( sc && sc->data[SC_COOLER_OPTION] ) skillratio += (sd ? sd->status.job_level * 5 : 0); break; case SO_POISON_BUSTER: - skillratio += 900 + 300 * skill_lv; - RE_LVL_DMOD(120); + skillratio += -100 + 1000 + 300 * skill_lv + sstatus->int_ / 6; // !TODO: Confirm INT bonus + if( tsc && tsc->data[SC_CLOUD_POISON] ) + skillratio += 200 * skill_lv; + RE_LVL_DMOD(100); if( sc && sc->data[SC_CURSED_SOIL_OPTION] ) skillratio += (sd ? sd->status.job_level * 5 : 0); break; @@ -6738,7 +6707,7 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list skillratio += -100 + 50 * skill_lv; break; case SO_VARETYR_SPEAR: //MATK [{( Endow Tornado skill level x 50 ) + ( Caster INT x Varetyr Spear Skill level )} x Caster Base Level / 100 ] % - skillratio += -100 + status_get_int(src) * skill_lv + ((sd) ? pc_checkskill(sd, SA_LIGHTNINGLOADER) * 50 : 0); + skillratio += -100 + sstatus->int_ / 6 * skill_lv + ((sd) ? pc_checkskill(sd, SA_LIGHTNINGLOADER) * 50 : 0); // !TODO: Confirm new formula RE_LVL_DMOD(100); if (sc && sc->data[SC_BLAST_OPTION]) skillratio += (sd ? sd->status.job_level * 5 : 0); @@ -6779,13 +6748,13 @@ struct Damage battle_calc_magic_attack(struct block_list *src,struct block_list break; case MH_ERASER_CUTTER: case MH_XENO_SLASHER: - skillratio += -100 + 350 * skill_lv * status_get_lv(src) / 100 + sstatus->int_; // !TODO: Confirm Base Level and INT bonus + skillratio += -100 + 450 * skill_lv * status_get_lv(src) / 100 + sstatus->int_ / 6; // !TODO: Confirm Base Level and INT bonus break; case MH_HEILIGE_STANGE: - skillratio += -100 + 1000 + 250 * skill_lv * status_get_lv(src) / 150 + sstatus->vit; // !TODO: Confirm VIT bonus + skillratio += -100 + 1500 + 250 * skill_lv * status_get_lv(src) / 150 + sstatus->vit / 6; // !TODO: Confirm VIT bonus break; case MH_POISON_MIST: - skillratio += -100 + 40 * skill_lv * status_get_lv(src) / 100; + skillratio += -100 + 200 * skill_lv * status_get_lv(src) / 100 + sstatus->dex / 6; // ! TODO: Confirm DEX bonus break; case SU_SV_STEMSPEAR: skillratio += 600; @@ -7446,9 +7415,8 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i ssc = status_get_sc(src); if (sc) { // These statuses do not reflect any damage (off the target) - if (sc->data[SC_WHITEIMPRISON] || sc->data[SC_DARKCROW] || - (sc->data[SC_KYOMU] && (!ssc || !ssc->data[SC_SHIELDSPELL_DEF]))) // Nullify reflecting ability except for Shield Spell - Def - return 0; + if (sc->data[SC_WHITEIMPRISON] || sc->data[SC_DARKCROW] || sc->data[SC_KYOMU]) + return 0; } if (ssc) { @@ -7474,40 +7442,25 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i return 0; } } - if( sc->data[SC_REFLECTDAMAGE] && !skill_get_inf2(skill_id, INF2_ISTRAP)) { - if( rnd()%100 <= sc->data[SC_REFLECTDAMAGE]->val1*10 + 30 ){ - max_damage = (int64)max_damage * status_get_lv(bl) / 100; - rdamage = (*dmg) * sc->data[SC_REFLECTDAMAGE]->val2 / 100; - if( --(sc->data[SC_REFLECTDAMAGE]->val3) < 1) - status_change_end(bl,SC_REFLECTDAMAGE,INVALID_TIMER); - } - } else { - if ( sc->data[SC_REFLECTSHIELD] && skill_id != WS_CARTTERMINATION ) { - // Don't reflect non-skill attack if has SC_REFLECTSHIELD from Devotion bonus inheritance - if (!skill_id && battle_config.devotion_rdamage_skill_only && sc->data[SC_REFLECTSHIELD]->val4) - rdamage = 0; - else { - rdamage += damage * sc->data[SC_REFLECTSHIELD]->val2 / 100; - rdamage = i64max(rdamage, 1); - } + if ( sc->data[SC_REFLECTSHIELD] && skill_id != WS_CARTTERMINATION ) { + // Don't reflect non-skill attack if has SC_REFLECTSHIELD from Devotion bonus inheritance + if (!skill_id && battle_config.devotion_rdamage_skill_only && sc->data[SC_REFLECTSHIELD]->val4) + rdamage = 0; + else { + rdamage += damage * sc->data[SC_REFLECTSHIELD]->val2 / 100; + rdamage = i64max(rdamage, 1); } + } - if (sc->data[SC_DEATHBOUND] && skill_id != WS_CARTTERMINATION && skill_id != GN_HELLS_PLANT_ATK && !status_bl_has_mode(src,MD_STATUSIMMUNE)) { - if (distance_bl(src,bl) <= 0 || !map_check_dir(map_calc_dir(bl,src->x,src->y), unit_getdir(bl))) { - int64 rd1 = 0; + if (sc->data[SC_DEATHBOUND] && skill_id != WS_CARTTERMINATION && skill_id != GN_HELLS_PLANT_ATK && !status_bl_has_mode(src,MD_STATUSIMMUNE)) { + if (distance_bl(src,bl) <= 0 || !map_check_dir(map_calc_dir(bl,src->x,src->y), unit_getdir(bl))) { + int64 rd1 = min(damage, status_get_max_hp(bl)) * sc->data[SC_DEATHBOUND]->val2 / 100; // Amplify damage. - rd1 = min(damage,status_get_max_hp(bl)) * sc->data[SC_DEATHBOUND]->val2 / 100; // Amplify damage. - *dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage. - clif_skill_damage(src, bl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, sc->data[SC_DEATHBOUND]->val1, DMG_SINGLE); - skill_blown(bl, src, skill_get_blewcount(RK_DEATHBOUND, 1), unit_getdir(src), BLOWN_NONE); - status_change_end(bl, SC_DEATHBOUND, INVALID_TIMER); - rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech] - } - } - - if( sc->data[SC_SHIELDSPELL_DEF] && sc->data[SC_SHIELDSPELL_DEF]->val1 == 2 && !status_bl_has_mode(src,MD_STATUSIMMUNE) ){ - rdamage += damage * sc->data[SC_SHIELDSPELL_DEF]->val2 / 100; - rdamage = i64max(rdamage, 1); + *dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage. + clif_skill_damage(src, bl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, sc->data[SC_DEATHBOUND]->val1, DMG_SINGLE); + skill_blown(bl, src, skill_get_blewcount(RK_DEATHBOUND, 1), unit_getdir(src), BLOWN_NONE); + status_change_end(bl, SC_DEATHBOUND, INVALID_TIMER); + rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech] } } } @@ -7527,13 +7480,10 @@ int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, i } if (ssc) { - if (ssc->data[SC_INSPIRATION]) { - rdamage += damage / 100; -#ifdef RENEWAL - rdamage = cap_value(rdamage, 1, max_damage); -#else - rdamage = i64max(rdamage, 1); -#endif + if (ssc->data[SC_REFLECTDAMAGE]) { + rdamage -= damage * ssc->data[SC_REFLECTDAMAGE]->val2 / 100; + if (--(ssc->data[SC_REFLECTDAMAGE]->val3) < 1) // TODO: Confirm if reflect count still exists + status_change_end(bl, SC_REFLECTDAMAGE, INVALID_TIMER); } if (ssc->data[SC_VENOMBLEED] && ssc->data[SC_VENOMBLEED]->val3 == 0) rdamage -= damage * ssc->data[SC_VENOMBLEED]->val2 / 100; @@ -7901,10 +7851,10 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t if( sc && sc->count ) { if (sc->data[SC_EXEEDBREAK]) status_change_end(src, SC_EXEEDBREAK, INVALID_TIMER); - if( sc->data[SC_SPELLFIST] ) { - if( --(sc->data[SC_SPELLFIST]->val1) >= 0 && !vellum_damage ){ + if( sc->data[SC_SPELLFIST] && !vellum_damage ){ + if (status_charge(src, 0, 20)) { if (!is_infinite_defense(target, wd.flag)) { - struct Damage ad = battle_calc_attack(BF_MAGIC, src, target, sc->data[SC_SPELLFIST]->val3, sc->data[SC_SPELLFIST]->val4, flag | BF_SHORT); + struct Damage ad = battle_calc_attack(BF_MAGIC, src, target, sc->data[SC_SPELLFIST]->val2, sc->data[SC_SPELLFIST]->val3, flag | BF_SHORT); wd.damage = ad.damage; DAMAGE_DIV_FIX(wd.damage, wd.div_); // Double the damage for multiple hits. @@ -8058,10 +8008,9 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t (r_skill = (uint16)sc->data[SC__AUTOSHADOWSPELL]->val1) && (sk_idx = skill_get_index(r_skill)) && sd->status.skill[sk_idx].id != 0 && sd->status.skill[sk_idx].flag == SKILL_FLAG_PLAGIARIZED ) { - int r_lv = sc->data[SC__AUTOSHADOWSPELL]->val2; - if (r_skill != AL_HOLYLIGHT && r_skill != PR_MAGNUS) { - int type; + int r_lv = sc->data[SC__AUTOSHADOWSPELL]->val2, type; + if( (type = skill_get_casttype(r_skill)) == CAST_GROUND ) { int maxcount = 0; std::shared_ptr skill = skill_db.find(r_skill); @@ -9106,7 +9055,6 @@ static const struct _battle_data { { "death_penalty_maxlv", &battle_config.death_penalty_maxlv, 0, 0, 3, }, { "exp_cost_redemptio", &battle_config.exp_cost_redemptio, 1, 0, 100, }, { "exp_cost_redemptio_limit", &battle_config.exp_cost_redemptio_limit, 5, 0, MAX_PARTY, }, - { "exp_cost_inspiration", &battle_config.exp_cost_inspiration, 1, 0, 100, }, { "mvp_exp_reward_message", &battle_config.mvp_exp_reward_message, 0, 0, 1, }, { "can_damage_skill", &battle_config.can_damage_skill, 1, 0, BL_ALL, }, { "atcommand_levelup_events", &battle_config.atcommand_levelup_events, 0, 0, 1, }, diff --git a/src/map/battle.hpp b/src/map/battle.hpp index d3dd62836a..c8363ebc2f 100644 --- a/src/map/battle.hpp +++ b/src/map/battle.hpp @@ -625,7 +625,6 @@ struct Battle_Config int death_penalty_maxlv; int exp_cost_redemptio; int exp_cost_redemptio_limit; - int exp_cost_inspiration; int mvp_exp_reward_message; int can_damage_skill; //Which BL types can damage traps int atcommand_levelup_events; diff --git a/src/map/homunculus.cpp b/src/map/homunculus.cpp index ee43f9ba0e..79846f2a0e 100644 --- a/src/map/homunculus.cpp +++ b/src/map/homunculus.cpp @@ -210,6 +210,11 @@ int hom_dead(struct homun_data *hd) return 3; clif_emotion(&sd->bl, ET_CRY); + +#ifdef RENEWAL + status_change_end(&sd->bl, status_skill2sc(AM_CALLHOMUN), INVALID_TIMER); +#endif + //Remove from map (if it has no intimacy, it is auto-removed from memory) return 3; } @@ -245,6 +250,11 @@ int hom_vaporize(struct map_session_data *sd, int flag) } clif_hominfo(sd, sd->hd, 0); hom_save(hd); + +#ifdef RENEWAL + status_change_end(&sd->bl, status_skill2sc(AM_CALLHOMUN), INVALID_TIMER); +#endif + return unit_remove_map(&hd->bl, CLR_OUTSIGHT); } @@ -715,7 +725,7 @@ void hom_gainexp(struct homun_data *hd,t_exp exp) } /** -* Increase homunculu sintimacy +* Increase homunculus intimacy * @param hd * @param value Added intimacy * @return New intimacy value @@ -734,7 +744,7 @@ int hom_increase_intimacy(struct homun_data * hd, unsigned int value) } /** -* Decrease homunculu sintimacy +* Decrease homunculus intimacy * @param hd * @param value Reduced intimacy * @return New intimacy value @@ -1113,6 +1123,11 @@ bool hom_call(struct map_session_data *sd) } else //Warp him to master. unit_warp(&hd->bl,sd->bl.m, sd->bl.x, sd->bl.y,CLR_OUTSIGHT); + +#ifdef RENEWAL + sc_start(&sd->bl, &sd->bl, status_skill2sc(AM_CALLHOMUN), 100, 1, skill_get_time(AM_CALLHOMUN, 1)); +#endif + return true; } @@ -1168,6 +1183,11 @@ int hom_recv_data(uint32 account_id, struct s_homunculus *sh, int flag) clif_homskillinfoblock(sd); hom_init_timers(hd); } + +#ifdef RENEWAL + sc_start(&sd->bl, &sd->bl, status_skill2sc(AM_CALLHOMUN), 100, 1, skill_get_time(AM_CALLHOMUN, 1)); +#endif + return 1; } @@ -1252,6 +1272,11 @@ int hom_ressurect(struct map_session_data* sd, unsigned char per, short x, short return 0; clif_spawn(&hd->bl); } + +#ifdef RENEWAL + sc_start(&sd->bl, &sd->bl, status_skill2sc(AM_CALLHOMUN), 100, 1, skill_get_time(AM_CALLHOMUN, 1)); +#endif + return status_revive(&hd->bl, per, 0); } diff --git a/src/map/itemdb.hpp b/src/map/itemdb.hpp index e03f000ede..95afae8828 100644 --- a/src/map/itemdb.hpp +++ b/src/map/itemdb.hpp @@ -124,6 +124,7 @@ enum item_itemid : t_itemid ITEMID_WOB_LOCAL = 14585, ITEMID_SIEGE_TELEPORT_SCROLL = 14591, ITEMID_WL_MB_SG = 100065, + ITEMID_HOMUNCULUS_SUPPLEMENT = 100371, }; ///Rune Knight diff --git a/src/map/party.cpp b/src/map/party.cpp index 11c553816b..f9e70b1310 100644 --- a/src/map/party.cpp +++ b/src/map/party.cpp @@ -1249,35 +1249,6 @@ int party_sub_count_class(struct block_list *bl, va_list ap) return 1; } -/** - * Special check for Royal Guard's Banding skill. - * @param bl: Object invoking the counter - * @param ap: List of parameters: Check Type - * @return 1 or total HP on success or 0 otherwise - */ -int party_sub_count_banding(struct block_list *bl, va_list ap) -{ - struct map_session_data *sd = (TBL_PC *)bl; - int type = va_arg(ap, int); // 0 = Banding Count, 1 = HP Check - - if (sd->state.autotrade) - return 0; - - if (battle_config.idle_no_share && pc_isidle_party(sd)) - return 0; - - if ((sd->class_&MAPID_THIRDMASK) != MAPID_ROYAL_GUARD) - return 0; - - if (!sd->sc.data[SC_BANDING]) - return 0; - - if (type == 1) - return status_get_hp(bl); - - return 1; -} - /// Executes 'func' for each party member on the same map and in range (0:whole map) int party_foreachsamemap(int (*func)(struct block_list*,va_list),struct map_session_data *sd,int range,...) { diff --git a/src/map/party.hpp b/src/map/party.hpp index 321fd64886..61990460bb 100644 --- a/src/map/party.hpp +++ b/src/map/party.hpp @@ -89,7 +89,6 @@ int party_share_loot(struct party_data* p, struct map_session_data* sd, struct i int party_send_dot_remove(struct map_session_data *sd); int party_sub_count(struct block_list *bl, va_list ap); int party_sub_count_class(struct block_list *bl, va_list ap); -int party_sub_count_banding(struct block_list *bl, va_list ap); int party_foreachsamemap(int (*func)(struct block_list *,va_list),struct map_session_data *sd,int range,...); /*========================================== diff --git a/src/map/script.cpp b/src/map/script.cpp index 234427b7c5..e5efa9bdce 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -15111,6 +15111,27 @@ BUILDIN_FUNC(gethominfo) return SCRIPT_CMD_SUCCESS; } +BUILDIN_FUNC(addhomintimacy) +{ + map_session_data *sd; + homun_data *hd; + + if (!script_charid2sd(3, sd) || !(hd = sd->hd)) + return SCRIPT_CMD_FAILURE; + + int32 value = script_getnum(st, 2); + + if (value == 0) // Nothing to change + return SCRIPT_CMD_SUCCESS; + + if (value > 0) + hom_increase_intimacy(hd, (uint32)value); + else + hom_decrease_intimacy(hd, (uint32)abs(value)); + clif_send_homdata(sd, SP_INTIMATE, hd->homunculus.intimacy / 100); + return SCRIPT_CMD_SUCCESS; +} + /// Retrieves information about character's mercenary /// getmercinfo [,]; BUILDIN_FUNC(getmercinfo) @@ -25405,6 +25426,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(recovery,"i???"), BUILDIN_DEF(getpetinfo,"i?"), BUILDIN_DEF(gethominfo,"i?"), + BUILDIN_DEF(addhomintimacy,"i?"), BUILDIN_DEF(getmercinfo,"i?"), BUILDIN_DEF(checkequipedcard,"i"), BUILDIN_DEF(jump_zero,"il"), //for future jA script compatibility diff --git a/src/map/script_constants.hpp b/src/map/script_constants.hpp index 74245bd165..1263189494 100644 --- a/src/map/script_constants.hpp +++ b/src/map/script_constants.hpp @@ -1240,9 +1240,9 @@ export_constant(SC_LEECHESEND); export_constant(SC_REFLECTDAMAGE); export_constant(SC_FORCEOFVANGUARD); - export_constant(SC_SHIELDSPELL_DEF); - export_constant(SC_SHIELDSPELL_MDEF); - export_constant(SC_SHIELDSPELL_REF); + export_constant(SC_SHIELDSPELL_HP); + export_constant(SC_SHIELDSPELL_SP); + export_constant(SC_SHIELDSPELL_ATK); export_constant(SC_EXEEDBREAK); export_constant(SC_PRESTIGE); export_constant(SC_BANDING); @@ -1612,6 +1612,11 @@ export_constant(SC_EMERGENCY_MOVE); export_constant(SC_MADOGEAR); export_constant(SC_NPC_HALLUCINATIONWALK); + export_constant(SC_OVERBRANDREADY); + export_constant(SC_POISON_MIST); + export_constant(SC_STONE_WALL); + export_constant(SC_CLOUD_POISON); + export_constant(SC_HOMUN_TIME); #ifdef RENEWAL export_constant(SC_EXTREMITYFIST2); #endif diff --git a/src/map/skill.cpp b/src/map/skill.cpp index c29a046819..fa2a7feeb7 100755 --- a/src/map/skill.cpp +++ b/src/map/skill.cpp @@ -113,8 +113,6 @@ int firerain_unit_pos; int wallofthorn_unit_pos; struct s_skill_nounit_layout skill_nounit_layout[MAX_SKILL_UNIT_LAYOUT2]; -int overbrand_nounit_pos; -int overbrand_brandish_nounit_pos; static char dir_ka = -1; // Holds temporary direction to the target for SR_KNUCKLEARROW @@ -1148,17 +1146,6 @@ struct s_skill_unit_layout *skill_get_unit_layout(uint16 skill_id, uint16 skill_ return &skill_unit_layout[0]; // default 1x1 layout } -struct s_skill_nounit_layout* skill_get_nounit_layout(uint16 skill_id, uint16 skill_lv, struct block_list* src, int x, int y, int dir) -{ - if( skill_id == LG_OVERBRAND ) - return &skill_nounit_layout[overbrand_nounit_pos + dir]; - else if( skill_id == LG_OVERBRAND_BRANDISH ) - return &skill_nounit_layout[overbrand_brandish_nounit_pos + dir]; - - ShowError("skill_get_nounit_layout: unknown no-unit layout for skill %d (level %d)\n", skill_id, skill_lv); - return &skill_nounit_layout[0]; -} - /** Stores temporary values. * Common usages: * [0] holds number of targets in area @@ -1334,8 +1321,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 else clif_skill_fail(sd,RG_SNATCHER,USESKILL_FAIL_LEVEL,0); } - if(sc && sc->data[SC_PYROCLASTIC] && ((rnd()%100)<=sc->data[SC_PYROCLASTIC]->val3) ) - skill_castend_pos2(src, bl->x, bl->y, BS_HAMMERFALL,sc->data[SC_PYROCLASTIC]->val1, tick, 0); } if (sc) { @@ -1762,9 +1747,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 break; case NC_POWERSWING: sc_start(src,bl, SC_STUN, 10, skill_lv, skill_get_time(skill_id, skill_lv)); - skill = pc_checkskill(sd, NC_AXEBOOMERANG); - if (sd && skill > 0 && (sd->status.weapon == W_1HAXE || sd->status.weapon == W_2HAXE) && rnd() % 100 < 5 * skill_lv) - skill_castend_damage_id(src, bl, NC_AXEBOOMERANG, skill, tick, 1); break; case GC_WEAPONCRUSH: skill_castend_nodamage_id(src,bl,skill_id,skill_lv,tick,BCT_ENEMY); @@ -1789,33 +1771,21 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 break; } break; + case LG_MOONSLASHER: - rate = 32 + 8 * skill_lv; - if( rnd()%100 < rate && dstsd ) // Uses skill_addtimerskill to avoid damage and setsit packet overlaping. Officially clif_setsit is received about 500 ms after damage packet. - skill_addtimerskill(src,tick+500,bl->id,0,0,skill_id,skill_lv,BF_WEAPON,0); - else if( dstmd ) - sc_start(src,bl,SC_STOP,100,skill_lv,skill_get_time(skill_id,skill_lv) + 1000 * (rnd()%3)); + sc_start(src,src,SC_OVERBRANDREADY,100,skill_lv,skill_get_time2(skill_id,skill_lv)); break; case LG_RAYOFGENESIS: // 50% chance to cause Blind on Undead and Demon monsters. - if ( battle_check_undead(status_get_race(bl), status_get_element(bl)) || status_get_race(bl) == RC_DEMON ) + if ( battle_check_undead(tstatus->race, tstatus->def_ele) || tstatus->race == RC_DEMON ) sc_start(src,bl, SC_BLIND, 50, skill_lv, skill_get_time(skill_id,skill_lv)); break; - case LG_EARTHDRIVE: - skill_break_equip(src,src, EQP_SHIELD, 100 * skill_lv, BCT_SELF); - sc_start(src,bl, SC_EARTHDRIVE, 100, skill_lv, skill_get_time(skill_id, skill_lv)); - break; case LG_HESPERUSLIT: - if( sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 3 ) - status_change_start(src,bl, SC_STUN, 10000, skill_lv, 0, 0, 0, rnd_value(4000, 8000), SCSTART_NOTICKDEF); if( pc_checkskill(sd,LG_PINPOINTATTACK) > 0 && sc && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 5 ) skill_castend_damage_id(src,bl,LG_PINPOINTATTACK,rnd_value(1, pc_checkskill(sd,LG_PINPOINTATTACK)),tick,0); break; case SR_DRAGONCOMBO: sc_start(src,bl, SC_STUN, 1 + skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); break; - case SR_FALLENEMPIRE: - sc_start(src,bl, SC_STOP, 100, skill_lv, skill_get_time(skill_id, skill_lv)); - break; case SR_WINDMILL: if( dstsd ) skill_addtimerskill(src,tick+status_get_amotion(src),bl->id,0,0,skill_id,skill_lv,BF_WEAPON,0); @@ -1830,9 +1800,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 sc_start(src, bl, SC_EARTHSHAKER, 100, skill_lv, skill_get_time2(skill_id, skill_lv)); status_change_end(bl, SC_SV_ROOTTWIST, INVALID_TIMER); break; - case SR_HOWLINGOFLION: - sc_start(src,bl, SC_FEAR, 5 + 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); - break; case SO_EARTHGRAVE: sc_start2(src,bl, SC_BLEEDING, 5 * skill_lv, skill_lv, src->id, skill_get_time2(skill_id, skill_lv)); // Need official rate. [LimitLine] break; @@ -1845,6 +1812,12 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case SO_VARETYR_SPEAR: sc_start(src,bl, SC_STUN, 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); break; + case SO_POISON_BUSTER: + sc_start(src,bl, SC_POISON, 5 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); + break; + case GN_SPORE_EXPLOSION: + sc_start(src, bl, status_skill2sc(skill_id), 100, skill_lv, skill_get_time(skill_id, skill_lv)); + break; case GN_SLINGITEM_RANGEMELEEATK: if( sd ) { switch( sd->itemid ) { // Starting SCs here instead of do it in skill_additional_effect to simplify the code. @@ -1909,9 +1882,6 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 } } break; - case MH_LAVA_SLIDE: - sc_start4(src,bl, SC_BURNING, 5 * skill_lv, skill_lv, 1000, src->id, 0, skill_get_time2(skill_id, skill_lv)); - break; case MH_STAHL_HORN: sc_start(src,bl, SC_STUN, 20 + 2 * skill_lv, skill_lv, skill_get_time(skill_id, skill_lv)); break; @@ -2033,7 +2003,7 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY: case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC: - case SC_EMERGENCY_MOVE: case SC_MADOGEAR: + case SC_EMERGENCY_MOVE: case SC_MADOGEAR: case SC_HOMUN_TIME: continue; case SC_WHISTLE: case SC_ASSNCROS: case SC_POEMBRAGI: case SC_APPLEIDUN: case SC_HUMMING: case SC_DONTFORGETME: @@ -2242,7 +2212,9 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1 sd->state.autocast = 1; skill_consume_requirement(sd,skill,autospl_skill_lv,1); +#ifndef RENEWAL skill_toggle_magicpower(src, skill); +#endif switch (type) { case CAST_GROUND: skill_castend_pos2(src, tbl->x, tbl->y, skill, autospl_skill_lv, tick, 0); @@ -2438,8 +2410,9 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list * break; case LG_HESPERUSLIT: { - struct status_change *sc = status_get_sc(src); - if( sc && sc->data[SC_FORCEOFVANGUARD] && sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 6 ) { + status_change *sc = status_get_sc(src); + + if( sc && sc->data[SC_FORCEOFVANGUARD]) { for(int i = 0; i < sc->data[SC_FORCEOFVANGUARD]->val3; i++ ) pc_addspiritball(sd, skill_get_time(LG_FORCEOFVANGUARD,1),sc->data[SC_FORCEOFVANGUARD]->val3); } @@ -3236,11 +3209,6 @@ void skill_attack_blow(struct block_list *src, struct block_list *dsrc, struct b // Blown-specific handling switch( skill_id ) { - case LG_OVERBRAND_BRANDISH: - // Give knockback damage bonus only hits the wall. (bugreport:9096) - if (skill_blown(dsrc,target,blewcount,dir,(enum e_skill_blown)(BLOWN_NO_KNOCKBACK_MAP|BLOWN_MD_KNOCKBACK_IMMUNE|BLOWN_TARGET_NO_KNOCKBACK|BLOWN_TARGET_BASILICA)) < blewcount) - skill_addtimerskill(src, tick + status_get_amotion(src), target->id, 0, 0, LG_OVERBRAND_PLUSATK, skill_lv, BF_WEAPON, flag|SD_ANIMATION); - break; case SR_KNUCKLEARROW: // Ignore knockback damage bonus if in WOE (player cannot be knocked in WOE) // Boss & Immune Knockback stay in place and don't get bonus damage @@ -3565,12 +3533,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * case LG_SHIELDPRESS: dmg.dmotion = clif_skill_damage(dsrc, bl, tick, status_get_amotion(src), dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_SINGLE); break; - case LG_OVERBRAND: - case LG_OVERBRAND_BRANDISH: - dmg.amotion = status_get_amotion(src) * 2; - case LG_OVERBRAND_PLUSATK: - dmg.dmotion = clif_skill_damage(dsrc,bl,tick,status_get_amotion(src),dmg.dmotion,damage,dmg.div_,skill_id,-1,DMG_SPLASH); - break; case NPC_EARTHQUAKE: dmg.dmotion = clif_skill_damage(src, bl, tick, dmg.amotion, dmg.dmotion, damage, dmg.div_, skill_id, -1, DMG_ENDURE); break; @@ -3608,9 +3570,6 @@ int64 skill_attack (int attack_type, struct block_list* src, struct block_list * case WM_SEVERE_RAINSTORM_MELEE: dmg.dmotion = clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,WM_SEVERE_RAINSTORM,-2,DMG_SPLASH); break; - case SR_TIGERCANNON: - dmg.dmotion = clif_skill_damage(src, bl, tick, status_get_amotion(bl), dmg.dmotion, damage, dmg.div_, skill_id, skill_lv, DMG_SINGLE); - break; case HT_CLAYMORETRAP: case HT_BLASTMINE: case HT_FLASHER: @@ -4217,7 +4176,6 @@ static TIMER_FUNC(skill_timerskill){ case SR_DRAGONCOMBO: case SR_FALLENEMPIRE: case SR_TIGERCANNON: - case SR_SKYNETBLOW: if (src->type != BL_PC) continue; break; // Exceptions @@ -4295,7 +4253,9 @@ static TIMER_FUNC(skill_timerskill){ } break; case WL_CHAINLIGHTNING_ATK: { +#ifndef RENEWAL skill_toggle_magicpower(src, skl->skill_id); // Only the first hit will be amplified +#endif skill_attack(BF_MAGIC,src,src,target,skl->skill_id,skl->skill_lv,tick,9 - skl->type); // Hit a Lightning on the current Target if( skl->type < (4 + skl->skill_lv - 1) && skl->x < 3 ) { // Remaining Chains Hit @@ -4338,7 +4298,6 @@ static TIMER_FUNC(skill_timerskill){ case NPC_REVERBERATION_ATK: skill_castend_damage_id(src,target,skl->skill_id,skl->skill_lv,tick,skl->flag|SD_LEVEL|SD_ANIMATION); break; - case LG_MOONSLASHER: case SR_WINDMILL: if( target->type == BL_PC ) { struct map_session_data *tsd = NULL; @@ -4368,7 +4327,6 @@ static TIMER_FUNC(skill_timerskill){ case SR_DRAGONCOMBO: case SR_FALLENEMPIRE: case SR_TIGERCANNON: - case SR_SKYNETBLOW: if( src->type == BL_PC ) { if( distance_xy(src->x, src->y, target->x, target->y) >= 3 ) break; @@ -4404,15 +4362,6 @@ static TIMER_FUNC(skill_timerskill){ case WL_EARTHSTRAIN: skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,(skl->type<<16)|skl->flag); break; - case LG_OVERBRAND_BRANDISH: { - int i, dir = map_calc_dir(src,skl->x,skl->y); - int x = src->x, y = src->y; - struct s_skill_nounit_layout *layout = skill_get_nounit_layout(skl->skill_id,skl->skill_lv,src,x,y,dir); - - for( i = 0; i < layout->count; i++ ) - map_foreachincell(skill_area_sub,src->m,x+layout->dx[i],y+layout->dy[i],BL_CHAR,src,skl->skill_id,skl->skill_lv,tick,skl->flag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id); - } - break; case RL_FIRE_RAIN: { int dummy = 1, i = skill_get_splash(skl->skill_id,skl->skill_lv); @@ -4484,7 +4433,6 @@ int skill_cleartimerskill (struct block_list *src) case SR_DRAGONCOMBO: case SR_FALLENEMPIRE: case SR_TIGERCANNON: - case SR_SKYNETBLOW: if (src->type != BL_PC) break; continue; @@ -4836,8 +4784,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case LG_SHIELDPRESS: case LG_RAGEBURST: case LG_HESPERUSLIT: - case LG_OVERBRAND: - case LG_OVERBRAND_BRANDISH: + case SR_DRAGONCOMBO: case SR_FALLENEMPIRE: case SR_CRESCENTELBOW_AUTOSPELL: case SR_GATEOFHELL: @@ -4916,9 +4863,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case NC_FLAMELAUNCHER: - case LG_CANNONSPEAR: - if(skill_id == LG_CANNONSPEAR) - clif_skill_damage(src, bl, tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); skill_area_temp[1] = bl->id; if (battle_config.skill_eightpath_algorithm) { //Use official AoE algorithm @@ -4932,8 +4876,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint } break; +#ifndef RENEWAL case SN_SHARPSHOOTING: flag |= 2; // Flag for specific mob damage formula +#endif case MA_SHARPSHOOTING: case NJ_KAMAITACHI: case NPC_DARKPIERCING: @@ -4948,8 +4894,10 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (!(map_foreachindir(skill_attack_area, src->m, src->x, src->y, bl->x, bl->y, skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), 0, splash_target(src), skill_get_type(skill_id), src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY))) { +#ifndef RENEWAL if (skill_id == SN_SHARPSHOOTING) flag &= ~2; // Only targets in the splash area are affected +#endif //These skills hit at least the target if the AoE doesn't hit skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); @@ -4959,8 +4907,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_get_splash(skill_id, skill_lv), skill_get_maxcount(skill_id, skill_lv), splash_target(src), skill_get_type(skill_id), src, src, skill_id, skill_lv, tick, flag, BCT_ENEMY); } - if (skill_id == SN_SHARPSHOOTING) - status_change_end(src, SC_CAMOUFLAGE, INVALID_TIMER); break; case MO_INVESTIGATE: @@ -5103,6 +5049,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case MG_NAPALMBEAT: case MG_FIREBALL: case RG_RAID: +#ifdef RENEWAL + case SN_SHARPSHOOTING: +#endif case HW_NAPALMVULCAN: case NJ_HUUMA: case ASC_METEORASSAULT: @@ -5130,13 +5079,17 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case NC_AXETORNADO: case GC_ROLLINGCUTTER: case GC_COUNTERSLASH: + case LG_CANNONSPEAR: + case LG_OVERBRAND: case LG_MOONSLASHER: + case LG_RAYOFGENESIS: case LG_EARTHDRIVE: case SR_RAMPAGEBLASTER: case SR_SKYNETBLOW: case SR_WINDMILL: case SR_RIDEINLIGHTNING: case SO_VARETYR_SPEAR: + case SO_POISON_BUSTER: case GN_CART_TORNADO: case GN_CARTCANNON: case GN_SPORE_EXPLOSION: @@ -5186,13 +5139,23 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; heal = (int)skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag); - if( skill_id == NPC_VAMPIRE_GIFT && heal > 0 ) { - clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); - status_heal(src,heal,0,0); - } - if (skill_id == SJ_PROMINENCEKICK) // Trigger the 2nd hit. (100% fire damage.) - skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag|8|SD_ANIMATION); + switch (skill_id) { + case NPC_VAMPIRE_GIFT: + if (heal > 0) { + clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); + status_heal(src, heal, 0, 0); + } + break; +#ifdef RENEWAL + case SN_SHARPSHOOTING: + status_change_end(src, SC_CAMOUFLAGE, INVALID_TIMER); + break; +#endif + case SJ_PROMINENCEKICK: // Trigger the 2nd hit. (100% fire damage.) + skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag|8|SD_ANIMATION); + break; + } } else { int starget = BL_CHAR|BL_SKILL; @@ -5449,7 +5412,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint case NJ_HUUJIN: case AB_HIGHNESSHEAL: case AB_DUPLELIGHT_MAGIC: - case LG_RAYOFGENESIS: case WM_METALICSOUND: case KO_KAIHOU: case MH_ERASER_CUTTER: @@ -5802,7 +5764,9 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint if (sd) { int i; +#ifndef RENEWAL skill_toggle_magicpower(src, skill_id); // No hit will be amplified +#endif if (skill_lv == 1) { // SpellBook if (sc->data[SC_FREEZE_SP] == nullptr) break; @@ -5964,17 +5928,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); break; - case LG_SHIELDSPELL: - if (skill_lv == 1) - skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); - else if (skill_lv == 2) - skill_attack(BF_MAGIC,src,src,bl,skill_id,skill_lv,tick,flag); - break; - - case SR_DRAGONCOMBO: - skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag); - break; - case SR_KNUCKLEARROW: // Holds current direction of bl/target to src/attacker before the src is moved to bl location dir_ka = map_calc_dir(bl, src->x, src->y); @@ -6020,16 +5973,12 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case SR_TIGERCANNON: - if (flag&1) { - if (skill_area_temp[1] != bl->id && skill_area_temp[3] == skill_id) - skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); + if (flag & 1) { + skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); } else if (sd) { - skill_area_temp[1] = bl->id; - skill_area_temp[3] = skill_id; if (sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_FALLENEMPIRE && !sc->data[SC_FLASHCOMBO]) flag |= 8; // Only apply Combo bonus when Tiger Cannon is not used through Flash Combo - skill_attack(BF_WEAPON, src, src, bl, skill_id, skill_lv, tick, flag); - map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); + map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR | BL_SKILL, src, skill_id, skill_lv, tick, flag | BCT_ENEMY | SD_SPLASH | 1, skill_castend_damage_id); } break; @@ -6044,7 +5993,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint break; case NPC_POISON_BUSTER: - case SO_POISON_BUSTER: if( tsc && tsc->data[SC_POISON] ) { skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag); status_change_end(bl, SC_POISON, INVALID_TIMER); @@ -7091,9 +7039,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_DEADLYINFECT: case LG_EXEEDBREAK: case LG_PRESTIGE: + case LG_INSPIRATION: case SR_CRESCENTELBOW: case SR_LIGHTNINGWALK: case GN_CARTBOOST: + case GN_BLOOD_SUCKER: case GN_HELLS_PLANT: case KO_MEIKYOUSISUI: case ALL_ODINS_POWER: @@ -7117,6 +7067,18 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; + case LG_SHIELDSPELL: + if (skill_lv == 1) + type = SC_SHIELDSPELL_HP; + else if (skill_lv == 2) + type = SC_SHIELDSPELL_SP; + else + type = SC_SHIELDSPELL_ATK; + + clif_skill_nodamage(src, bl, skill_id, skill_lv, + sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); + break; + case SJ_GRAVITYCONTROL: { int fall_damage = sstatus->batk + sstatus->rhw.atk - tstatus->def2; @@ -7149,10 +7111,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui short index = dstsd->equip_index[EQI_HAND_R]; if (index >= 0 && dstsd->inventory_data[index] && dstsd->inventory_data[index]->type == IT_WEAPON) - bonus = (8 + 2 * skill_lv) * dstsd->inventory_data[index]->wlv; + bonus = (20 * skill_lv) * dstsd->inventory_data[index]->wlv; } - if (sd) - bonus += (pc_checkskill(sd, SA_FLAMELAUNCHER) + pc_checkskill(sd, SA_FROSTWEAPON) + pc_checkskill(sd, SA_LIGHTNINGLOADER) + pc_checkskill(sd, SA_SEISMICWEAPON)) * 5; clif_skill_nodamage(src, bl, skill_id, skill_lv, sc_start2(src,bl, type, 100, skill_lv, bonus, skill_get_time(skill_id, skill_lv))); } else if (sd) @@ -7519,10 +7479,13 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SR_SKYNETBLOW: case SR_RAMPAGEBLASTER: case SR_HOWLINGOFLION: + case LG_CANNONSPEAR: + case LG_OVERBRAND: + case LG_RAYOFGENESIS: case KO_HAPPOKUNAI: case RL_FIREDANCE: case RL_R_TRIP: - case SJ_FULLMOONKICK: + case SJ_FULLMOONKICK: case SJ_NEWMOONKICK: case SJ_SOLARBURST: case SJ_STAREMPEROR: @@ -7555,7 +7518,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_nodamage(src,bl,skill_id,skill_lv,1); i = map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), starget, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); - if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) ) + if( !i && ( skill_id == RK_WINDCUTTER || skill_id == NC_AXETORNADO || skill_id == LG_CANNONSPEAR || skill_id == SR_SKYNETBLOW || skill_id == KO_HAPPOKUNAI ) ) clif_skill_damage(src,src,tick, status_get_amotion(src), 0, -30000, 1, skill_id, skill_lv, DMG_SINGLE); } break; @@ -7571,6 +7534,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui map_foreachinrange(skill_area_sub, bl, skill_get_splash(skill_id, skill_lv), BL_CHAR|BL_SKILL, src, skill_id, skill_lv, tick, flag|BCT_ENEMY|SD_SPLASH|1, skill_castend_damage_id); break; + case SR_TIGERCANNON: case SR_WINDMILL: case GN_CART_TORNADO: clif_skill_nodamage(src,bl,skill_id,skill_lv,1); @@ -8221,7 +8185,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } case AM_BERSERKPITCHER: - case AM_POTIONPITCHER: + case AM_POTIONPITCHER: { int j,hp = 0,sp = 0; if( dstmd && dstmd->mob_id == MOBID_EMPERIUM ) { @@ -8323,6 +8287,12 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sp -= sp * penalty / 100; } } + +#ifdef RENEWAL + if (bl->type == BL_HOM) + hp *= 3; // Heal effectiveness is 3x for Homunculus +#endif + clif_skill_nodamage(src,bl,skill_id,skill_lv,1); if( hp > 0 || (skill_id == AM_POTIONPITCHER && sp <= 0) ) clif_skill_nodamage(NULL,bl,AL_HEAL,hp,1); @@ -8509,7 +8479,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_LHZ_DUN_N1: case SC_LHZ_DUN_N2: case SC_LHZ_DUN_N3: case SC_LHZ_DUN_N4: case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY: case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC: - case SC_EMERGENCY_MOVE: + case SC_EMERGENCY_MOVE: case SC_HOMUN_TIME: continue; case SC_WHISTLE: case SC_ASSNCROS: @@ -8591,7 +8561,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui if(sd) { int sp = skill_get_sp(sd->skill_id_old,sd->skill_lv_old); if( skill_id == SO_SPELLFIST ){ - sc_start4(src,src,type,100,skill_lv * 3,skill_lv,sd->skill_id_old,sd->skill_lv_old,skill_get_time(skill_id,skill_lv)); + sc_start4(src,src,type,100,skill_lv,sd->skill_id_old,sd->skill_lv_old,0,skill_get_time(skill_id,skill_lv)); sd->skill_id_old = sd->skill_lv_old = 0; break; } @@ -9531,6 +9501,10 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case AM_CALLHOMUN: //[orn] if (sd && !hom_call(sd)) clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); +#ifdef RENEWAL + else if (sd && hom_is_active(sd->hd)) + skill_area_temp[0] = 1; // Already passed pre-cast checks +#endif break; case AM_REST: @@ -10039,7 +10013,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: case SC_REUSE_LIMIT_LUXANIMA: case SC_LUXANIMA: case SC_SOULENERGY: case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC: - case SC_EMERGENCY_MOVE: case SC_MADOGEAR: + case SC_EMERGENCY_MOVE: case SC_MADOGEAR: case SC_HOMUN_TIME: continue; case SC_ASSUMPTIO: if( bl->type == BL_MOB ) @@ -10436,124 +10410,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui clif_skill_nodamage(src,bl,skill_id,skill_lv,1); break; - case LG_SHIELDSPELL: - if (sd) { - int opt = 0; - short index = sd->equip_index[EQI_HAND_L], shield_def = 0, shield_mdef = 0, shield_refine = 0; - struct item_data *shield_data = NULL; - - if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR) - shield_data = sd->inventory_data[index]; - if (!shield_data || shield_data->type != IT_ARMOR) // Group with 'skill_unconditional' gets these as default - shield_def = shield_mdef = shield_refine = 10; - else { - shield_def = shield_data->def; - shield_mdef = sd->bonus.shieldmdef; - shield_refine = sd->inventory.u.items_inventory[sd->equip_index[EQI_HAND_L]].refine; - } - if (flag&1) { - sc_start(src,bl,SC_SILENCE,100,skill_lv,shield_mdef * 30000); - break; - } - - opt = rnd()%3 + 1; // Generates a number between 1 - 3. The number generated will determine which effect will be triggered. - switch(skill_lv) { - case 1: { // DEF Based - int splashrange = 0; - -#ifdef RENEWAL - if (shield_def >= 0 && shield_def <= 40) -#else - if (shield_def >= 0 && shield_def <= 4) -#endif - splashrange = 1; -#ifdef RENEWAL - else if (shield_def >= 41 && shield_def <= 80) -#else - else if (shield_def >= 5 && shield_def <= 9) -#endif - splashrange = 2; - else - splashrange = 3; - switch(opt) { - case 1: // Splash AoE ATK - sc_start(src,bl,SC_SHIELDSPELL_DEF,100,opt,INFINITE_TICK); - clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE); - map_foreachinrange(skill_area_sub,src,splashrange,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); - status_change_end(bl,SC_SHIELDSPELL_DEF,INVALID_TIMER); - break; - case 2: // % Damage Reflecting Increase -#ifdef RENEWAL - sc_start2(src,bl,SC_SHIELDSPELL_DEF,100,opt,shield_def / 10,shield_def * 1000); -#else - sc_start2(src,bl,SC_SHIELDSPELL_DEF,100,opt,shield_def,shield_def * 1000 * 10); -#endif - break; - case 3: // Equipment Attack Increase -#ifdef RENEWAL - sc_start2(src,bl,SC_SHIELDSPELL_DEF,100,opt,shield_def,shield_def * 3000); -#else - sc_start2(src,bl,SC_SHIELDSPELL_DEF,100,opt,shield_def * 10,shield_def * 3000 * 10); -#endif - break; - } - } - break; - - case 2: { // MDEF Based - int splashrange = 0; - - if (shield_mdef >= 1 && shield_mdef <= 3) - splashrange = 1; - else if (shield_mdef >= 4 && shield_mdef <= 5) - splashrange = 2; - else - splashrange = 3; - switch(opt) { - case 1: // Splash AoE MATK - sc_start(src,bl,SC_SHIELDSPELL_MDEF,100,opt,INFINITE_TICK); - clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE); - map_foreachinrange(skill_area_sub,src,splashrange,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); - status_change_end(bl,SC_SHIELDSPELL_MDEF,INVALID_TIMER); - break; - case 2: // Splash AoE Lex Divina - sc_start(src,bl,SC_SHIELDSPELL_MDEF,100,opt,shield_mdef * 2000); - clif_skill_damage(src,src,tick,status_get_amotion(src),0,-30000,1,skill_id,skill_lv,DMG_SINGLE); - map_foreachinallrange(skill_area_sub,src,splashrange,BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_nodamage_id); - break; - case 3: // Casts Magnificat. - if (sc_start(src,bl,SC_SHIELDSPELL_MDEF,100,opt,shield_mdef * 30000)) - clif_skill_nodamage(src,bl,PR_MAGNIFICAT,skill_lv, - sc_start(src,bl,SC_MAGNIFICAT,100,1,shield_mdef * 30000)); - break; - } - } - break; - - case 3: // Refine Based - switch(opt) { - case 1: // Allows you to break armor at a 100% rate when you do damage. - sc_start(src,bl,SC_SHIELDSPELL_REF,100,opt,shield_refine * 30000); - break; - case 2: // Increases DEF and Status Effect resistance depending on Shield refine rate. -#ifdef RENEWAL - sc_start4(src,bl,SC_SHIELDSPELL_REF,100,opt,shield_refine * 10 * status_get_lv(src) / 100,(shield_refine * 2) + (sstatus->luk / 10),0,shield_refine * 20000); -#else - sc_start4(src,bl,SC_SHIELDSPELL_REF,100,opt,shield_refine,(shield_refine * 2) + (sstatus->luk / 10),0,shield_refine * 20000); -#endif - break; - case 3: // Recovers HP depending on Shield refine rate. - sc_start(src,bl,SC_SHIELDSPELL_REF,100,opt,INFINITE_TICK); //HP Recovery. - status_heal(bl,sstatus->max_hp * ((status_get_lv(src) / 10) + (shield_refine + 1)) / 100,0,2); - status_change_end(bl,SC_SHIELDSPELL_REF,INVALID_TIMER); - break; - } - break; - } - clif_skill_nodamage(src,bl,skill_id,skill_lv,1); - } - break; - case LG_PIETY: if( flag&1 ) sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv)); @@ -10564,11 +10420,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } break; - case LG_INSPIRATION: - if( sd && !map_getmapflag(sd->bl.m, MF_NOEXPPENALTY) && battle_config.exp_cost_inspiration ) - pc_lostexp(sd, u64min(sd->status.base_exp, pc_nextbaseexp(sd) * battle_config.exp_cost_inspiration / 100), 0); // 1% penalty. - clif_skill_nodamage(bl,src,skill_id,skill_lv, sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv))); - break; case SR_CURSEDCIRCLE: if( flag&1 ) { if( status_get_class_(bl) == CLASS_BOSS ) @@ -10666,11 +10517,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui sc_start(src,bl,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); break; case SR_FLASHCOMBO: { - const int combo[] = { SR_DRAGONCOMBO, SR_FALLENEMPIRE, SR_TIGERCANNON, SR_SKYNETBLOW }; - const int delay[] = { 0, 250, 500, 2000 }; + const int combo[] = { SR_DRAGONCOMBO, SR_FALLENEMPIRE, SR_TIGERCANNON }; + const int delay[] = { 0, 750, 1250 }; if (sd) // Disable attacking/acting/moving for skill's duration. - sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick = tick + delay[3]; + sd->ud.attackabletime = sd->canuseitem_tick = sd->ud.canact_tick = tick + delay[2]; clif_skill_nodamage(src,bl,skill_id,skill_lv, sc_start(src,src,type,100,skill_lv,skill_get_time(skill_id,skill_lv))); for (i = 0; i < ARRAYLENGTH(combo); i++) @@ -11023,29 +10874,6 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui } break; - case GN_BLOOD_SUCKER: - { - struct status_change *sc = status_get_sc(src); - - if( sc && sc->bs_counter < skill_get_maxcount( skill_id , skill_lv) ) { - if( tsc && tsc->data[type] ){ - sc->bs_counter--; - status_change_end(src, type, INVALID_TIMER); // the first one cancels and the last one will take effect resetting the timer - } - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - sc_start2(src,bl, type, 100, skill_lv, src->id, skill_get_time(skill_id,skill_lv)); - sc->bs_counter++; - } else if( sd ) { - clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0); - break; - } - } - break; - case GN_SPORE_EXPLOSION: - clif_skill_nodamage(src, bl, skill_id, skill_lv, 1); - skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, flag|8); - sc_start4(src, bl, type, 100, skill_lv, skill_id, src->id, 0, skill_get_time(skill_id, skill_lv)); - break; case GN_MANDRAGORA: if( flag&1 ) { int rate = 25 + (10 * skill_lv) - (tstatus->vit + tstatus->luk) / 5; @@ -11382,8 +11210,14 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui else sc_start(&hd->bl,&hd->bl, SC_STYLE_CHANGE, 100, MH_MD_FIGHTING, INFINITE_TICK); } break; - case MH_MAGMA_FLOW: case MH_PAIN_KILLER: + bl = battle_get_master(src); + if (bl != nullptr) + sc_start(src, bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); + if (hd) + skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv)); + break; + case MH_MAGMA_FLOW: sc_start(src,bl, type, 100, skill_lv, skill_get_time(skill_id, skill_lv)); if (hd) skill_blockhomun_start(hd, skill_id, skill_get_cooldown(skill_id, skill_lv)); @@ -12914,17 +12748,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui flag |= 1; break; - case LG_OVERBRAND: { - int dir = map_calc_dir(src,x,y); - int sx = src->x, sy = src->y; - struct s_skill_nounit_layout *layout = skill_get_nounit_layout(skill_id,skill_lv,src,sx,sy,dir); - - for( i = 0; i < layout->count; i++ ) - map_foreachincell(skill_area_sub,src->m,sx+layout->dx[i],sy+layout->dy[i],BL_CHAR,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|SD_ANIMATION|1,skill_castend_damage_id); - skill_addtimerskill(src,gettick() + status_get_amotion(src),0,x,y,LG_OVERBRAND_BRANDISH,skill_lv,dir,flag); - } - break; - case LG_BANDING: if( sc && sc->data[SC_BANDING] ) status_change_end(src,SC_BANDING,INVALID_TIMER); @@ -12933,11 +12756,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui clif_skill_nodamage(src,src,skill_id,skill_lv,1); break; - case LG_RAYOFGENESIS: - i = skill_get_splash(skill_id,skill_lv); - map_foreachinarea(skill_area_sub,src->m,x-i,y-i,x+i,y+i,BL_CHAR|BL_SKILL,src,skill_id,skill_lv,tick,flag|BCT_ENEMY|1,skill_castend_damage_id); - break; - case WM_DOMINION_IMPULSE: i = skill_get_splash(skill_id, skill_lv); map_foreachinallarea(skill_active_reverberation, src->m, x-i, y-i, x+i,y+i,BL_SKILL); @@ -13728,6 +13546,10 @@ struct skill_unit_group *skill_unitsetting(struct block_list *src, uint16 skill_ val2 = y; val3 = 0; // Suck target at n seconds. break; + case MH_POISON_MIST: + case MH_LAVA_SLIDE: + skill_clear_group(src, 1); + break; case MH_VOLCANIC_ASH: if (!map_flag_vs(src->m)) target = BCT_ENEMY; @@ -14339,6 +14161,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t case UNT_FIREWALK: case UNT_ELECTRICWALK: case UNT_PSYCHIC_WAVE: + case UNT_LAVA_SLIDE: case UNT_MAKIBISHI: case UNT_VENOMFOG: case UNT_ICEMINE: @@ -14807,14 +14630,8 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t break; case UNT_SEVERE_RAINSTORM: - if( battle_check_target(&unit->bl, bl, BCT_ENEMY) > 0 ) { - struct map_session_data *sd = BL_CAST(BL_PC, ss); - int weapon_flag = 0; - - if (sd && (sd->status.weapon == W_MUSICAL || sd->status.weapon == W_WHIP)) - weapon_flag = 4; - skill_attack(BF_WEAPON,ss,&unit->bl,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,weapon_flag); - } + if( battle_check_target(&unit->bl, bl, BCT_ENEMY) > 0 ) + skill_attack(BF_WEAPON,ss,&unit->bl,bl,WM_SEVERE_RAINSTORM_MELEE,sg->skill_lv,tick,0); break; case UNT_NETHERWORLD: if (!status_bl_has_mode(bl,MD_STATUSIMMUNE) || (!map_flag_gvg2(ss->m) && battle_check_target(&unit->bl,bl,BCT_PARTY) < 0)) { @@ -14871,7 +14688,7 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t case UNT_CLOUD_KILL: if (tsc && !tsc->data[type]) - status_change_start(ss, bl, type, 10000, sg->skill_lv, ss->id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF); + status_change_start(ss, bl, type, 10000, sg->skill_lv, ss->id, 0, 0, skill_get_time(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF); skill_attack(skill_get_type(sg->skill_id), ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0); break; @@ -14941,14 +14758,9 @@ int skill_unit_onplace_timer(struct skill_unit *unit, struct block_list *bl, t_t sc_start2(ss, bl,type,100,sg->val1,sg->val2,skill_get_time(sg->skill_id, sg->skill_lv)); break; - case UNT_LAVA_SLIDE: - skill_attack(BF_WEAPON, ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0); - if(++sg->val1 > 4) //after 5 stop hit and destroy me - sg->limit = DIFF_TICK(tick, sg->tick); - break; case UNT_POISON_MIST: skill_attack(BF_MAGIC, ss, &unit->bl, bl, sg->skill_id, sg->skill_lv, tick, 0); - status_change_start(ss, bl, SC_BLIND, (10 + 10 * sg->skill_lv)*100, sg->skill_lv, sg->skill_id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF|SCSTART_NORATEDEF); + status_change_start(ss, bl, SC_POISON_MIST, (10 + 10 * sg->skill_lv)*100, sg->skill_lv, sg->skill_id, 0, 0, skill_get_time2(sg->skill_id, sg->skill_lv), SCSTART_NOTICKDEF|SCSTART_NORATEDEF); break; case UNT_CHAOSPANIC: @@ -15886,19 +15698,11 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } break; case PR_REDEMPTIO: - case LG_INSPIRATION: { - t_exp exp; - uint32 exp_needp; - switch (skill_id) { - case PR_REDEMPTIO: - exp_needp = battle_config.exp_cost_redemptio; - break; - case LG_INSPIRATION: - exp_needp = battle_config.exp_cost_inspiration; - break; - } - if (exp_needp && ((exp = pc_nextbaseexp(sd)) > 0 && get_percentage_exp(sd->status.base_exp, exp) < exp_needp)) { + t_exp exp = pc_nextbaseexp(sd); + uint32 exp_needp = battle_config.exp_cost_redemptio; + + if (exp_needp && (exp > 0 && get_percentage_exp(sd->status.base_exp, exp) < exp_needp)) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); //Not enough exp. return false; } @@ -16144,14 +15948,15 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } } break; + case LG_RAYOFGENESIS: case LG_BANDING: - if( sc && sc->data[SC_INSPIRATION] ) { - clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); - return false; - } + if( sc && sc->data[SC_INSPIRATION] ) + return true; // Don't check for partner. break; case LG_PRESTIGE: - if( sc && (sc->data[SC_BANDING] || sc->data[SC_INSPIRATION]) ) { + if( sc && sc->data[SC_INSPIRATION] ) + return true; // Don't check for partner. + if( sc && sc->data[SC_BANDING] ) { clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); return false; } @@ -16163,32 +15968,6 @@ bool skill_check_condition_castbegin(struct map_session_data* sd, uint16 skill_i } sd->spiritball_old = require.spiritball = sd->spiritball; break; - case LG_SHIELDSPELL: { - short index = sd->equip_index[EQI_HAND_L]; - struct item_data *shield_data = NULL; - - if (index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == IT_ARMOR) - shield_data = sd->inventory_data[index]; - if (!shield_data || shield_data->type != IT_ARMOR) { // Skill will first check if a shield is equipped. If none is found the skill will fail. - clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); - break; - } - } - break; - case LG_HESPERUSLIT: - if (sc && sc->data[SC_INSPIRATION]) - return true; // Don't check for partner. - if (!(sc && sc->data[SC_BANDING])) { - clif_skill_fail(sd,skill_id,USESKILL_FAIL,0); - return false; - } - if (sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 < 3) - return false; // Just fails, no msg here. - break; - case LG_RAYOFGENESIS: - if (sc && sc->data[SC_INSPIRATION]) - return true; // Don't check for partner. - break; case SR_FALLENEMPIRE: if( !(sc && sc->data[SC_COMBO] && sc->data[SC_COMBO]->val1 == SR_DRAGONCOMBO) ) return false; @@ -17046,10 +16825,30 @@ struct s_skill_condition skill_get_requirement(struct map_session_data* sd, uint if (i != skill_lv%11 - 1) continue; break; +#ifdef RENEWAL + case AM_CALLHOMUN: + // Player has no homunculus, only requires first item + if (i > 0 && sd->hd == nullptr) { + i = MAX_SKILL_ITEM_REQUIRE; + continue; + } + + // Recalling from Rest state has a different consume item (stored as second item) + if (skill_area_temp[0] == 1 || (sd->hd != nullptr && sd->hd->homunculus.vaporize == HOM_ST_REST)) { + req.itemid[0] = skill->require.itemid[1]; + req.amount[0] = skill->require.amount[1]; + if (skill_area_temp[0] == 1 && hom_is_active(sd->hd)) + skill_area_temp[0] = 0; + i = MAX_SKILL_ITEM_REQUIRE; + continue; + } + break; +#else case AM_CALLHOMUN: if (sd->status.hom_id) //Don't delete items when hom is already out. continue; break; +#endif case AB_ADORAMUS: if( itemdb_group_item_exists(IG_GEMSTONE, skill->require.itemid[i]) && (sd->special_state.no_gemstone == 2 || skill_check_pc_partner(sd,skill_id,&skill_lv, 1, 2)) ) continue; @@ -18017,12 +17816,7 @@ int skill_attack_area(struct block_list *bl, va_list ap) type = va_arg(ap,int); if (skill_area_temp[1] == bl->id) { //This is the target of the skill, do a full attack and skip target checks. - switch (skill_id) { - case LG_CANNONSPEAR: - return (int)skill_attack(atk_type,src,dsrc,bl,skill_id,skill_lv,tick,flag|SD_ANIMATION); - default: - return (int)skill_attack(atk_type,src,dsrc,bl,skill_id,skill_lv,tick,flag); - } + return (int)skill_attack(atk_type,src,dsrc,bl,skill_id,skill_lv,tick,flag); } if(battle_check_target(dsrc,bl,type) <= 0 || @@ -18072,6 +17866,8 @@ int skill_clear_group(struct block_list *bl, int flag) case NJ_SUITON: case NJ_KAENSIN: case SC_CHAOSPANIC: + case MH_POISON_MIST: + case MH_LAVA_SLIDE: if (flag&1) group[count++] = ud->skillunit[i]; break; @@ -18122,6 +17918,8 @@ struct skill_unit_group *skill_locate_element_field(struct block_list *bl) case NPC_CLOUD_KILL: case SO_WARMER: case SC_CHAOSPANIC: + case MH_POISON_MIST: + case MH_LAVA_SLIDE: return ud->skillunit[i]; } } @@ -18228,22 +18026,7 @@ int skill_banding_count(struct map_session_data *sd) { nullpo_ret(sd); - int range = skill_get_splash(LG_BANDING, 1); - uint8 count = party_foreachsamemap(party_sub_count_banding, sd, range, 0); - unsigned int group_hp = party_foreachsamemap(party_sub_count_banding, sd, range, 1); - - // HP is set to the average HP of the Banding group - if (count > 1) - status_set_hp(&sd->bl, group_hp / count, 0); - - // Royal Guard count check for Banding - if (sd && sd->status.party_id) { - if (count > MAX_PARTY) - return MAX_PARTY; - else if (count > 1) - return count; // Effect bonus from additional Royal Guards if not above the max - } - return 0; + return cap_value(party_foreachsamemap(party_sub_count, sd, skill_get_splash(LG_BANDING, 1)), 0, MAX_PARTY); } /** @@ -19864,6 +19647,11 @@ short skill_can_produce_mix(struct map_session_data *sd, t_itemid nameid, int tr } } + if (nameid == ITEMID_HOMUNCULUS_SUPPLEMENT) { // Temporary check since the produce_db specifically wants the Pharmacy skill to use + if (pc_checkskill(sd, AM_BIOETHICS) == 0) + return 0; + } + if (i >= MAX_SKILL_PRODUCE_DB) return 0; @@ -20636,6 +20424,11 @@ int skill_poisoningweapon(struct map_session_data *sd, t_itemid nameid) return 0; } +/** + * Toggles the effect of Mystical Amplifcation (Pre-renewal). + * @param bl: Object + * @param skill_id: Skill invoking to determine if Magic type + */ void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id) { struct status_change *sc = status_get_sc(bl); @@ -20650,17 +20443,15 @@ void skill_toggle_magicpower(struct block_list *bl, uint16 skill_id) } else { sc->data[SC_MAGICPOWER]->val4 = 1; status_calc_bl(bl, status_sc2scb_flag(SC_MAGICPOWER)); -#ifndef RENEWAL if(bl->type == BL_PC){// update current display. clif_updatestatus(((TBL_PC *)bl),SP_MATK1); clif_updatestatus(((TBL_PC *)bl),SP_MATK2); } -#endif + } } } - int skill_magicdecoy(struct map_session_data *sd, t_itemid nameid) { int x, y, i, class_, skill; struct mob_data *md; @@ -20747,7 +20538,7 @@ void skill_spellbook(struct map_session_data *sd, t_itemid nameid) { int points = spell->points; if (sc && sc->data[SC_FREEZE_SP]) { - if ((sc->data[SC_FREEZE_SP]->val2 + points) > 4 * pc_checkskill(sd, WL_FREEZE_SP) + status_get_int(&sd->bl) / 10 + sd->status.base_level / 10) { + if ((sc->data[SC_FREEZE_SP]->val2 + points) > 8 * pc_checkskill(sd, WL_FREEZE_SP) + status_get_int(&sd->bl) / 10 + sd->status.base_level / 10) { clif_skill_fail(sd, WL_READING_SB, USESKILL_FAIL_SPELLBOOK_PRESERVATION_POINT, 0); return; } @@ -20788,7 +20579,7 @@ int skill_select_menu(struct map_session_data *sd,uint16 skill_id) { lv = (aslvl + 5) / 2; // The level the skill will be autocasted lv = min(lv,sd->status.skill[sk_idx].lv); prob = (aslvl >= 10) ? 15 : (30 - 2 * aslvl); // Probability at level 10 was increased to 15. - sc_start4(&sd->bl,&sd->bl,SC__AUTOSHADOWSPELL,100,id,lv,prob,0,skill_get_time(SC_AUTOSHADOWSPELL,aslvl)); + sc_start4(&sd->bl,&sd->bl,SC__AUTOSHADOWSPELL,100,id,lv,prob,aslvl,skill_get_time(SC_AUTOSHADOWSPELL,aslvl)); return 0; } @@ -21478,7 +21269,6 @@ void skill_init_nounit_layout (void) { memset(skill_nounit_layout,0,sizeof(skill_nounit_layout)); - overbrand_nounit_pos = pos; for( i = 0; i < 8; i++ ) { if( i&1 ) { skill_nounit_layout[pos].count = 33; @@ -21546,7 +21336,6 @@ void skill_init_nounit_layout (void) { pos++; } - overbrand_brandish_nounit_pos = pos; for( i = 0; i < 8; i++ ) { if( i&1 ) { skill_nounit_layout[pos].count = 74; diff --git a/src/map/skill.hpp b/src/map/skill.hpp index 3cbc92def2..ec478f7e62 100644 --- a/src/map/skill.hpp +++ b/src/map/skill.hpp @@ -27,7 +27,7 @@ struct skill_unit; struct skill_unit_group; struct status_change_entry; -#define MAX_SKILL_PRODUCE_DB 281 /// Max Produce DB +#define MAX_SKILL_PRODUCE_DB 282 /// Max Produce DB #define MAX_PRODUCE_RESOURCE 12 /// Max Produce requirements #define MAX_SKILL_ARROW_DB 150 /// Max Arrow Creation DB #define MAX_ARROW_RESULT 5 /// Max Arrow results/created diff --git a/src/map/status.cpp b/src/map/status.cpp index fba0c7af2d..f00c0641bf 100644 --- a/src/map/status.cpp +++ b/src/map/status.cpp @@ -800,6 +800,9 @@ void initChangeTables(void) set_sc( AM_CP_SHIELD , SC_CP_SHIELD , EFST_PROTECTSHIELD, SCB_NONE ); set_sc( AM_CP_ARMOR , SC_CP_ARMOR , EFST_PROTECTARMOR, SCB_NONE ); set_sc( AM_CP_HELM , SC_CP_HELM , EFST_PROTECTHELM, SCB_NONE ); +#ifdef RENEWAL + set_sc( AM_CALLHOMUN , SC_HOMUN_TIME , EFST_HOMUN_TIME, SCB_NONE ); +#endif set_sc( CR_AUTOGUARD , SC_AUTOGUARD , EFST_AUTOGUARD , SCB_NONE ); add_sc( CR_SHIELDCHARGE , SC_STUN ); set_sc( CR_REFLECTSHIELD , SC_REFLECTSHIELD , EFST_REFLECTSHIELD , SCB_NONE ); @@ -1083,17 +1086,16 @@ void initChangeTables(void) add_sc(MH_STAHL_HORN , SC_STUN ); set_sc(MH_ANGRIFFS_MODUS , SC_ANGRIFFS_MODUS , EFST_ANGRIFFS_MODUS , SCB_BATK|SCB_DEF|SCB_FLEE|SCB_MAXHP ); set_sc(MH_GOLDENE_FERSE , SC_GOLDENE_FERSE , EFST_GOLDENE_FERSE , SCB_ASPD|SCB_FLEE ); - add_sc(MH_STEINWAND , SC_SAFETYWALL ); + set_sc(MH_STEINWAND , SC_STONE_WALL , EFST_STONE_WALL , SCB_DEF|SCB_MDEF ); set_sc(MH_OVERED_BOOST , SC_OVERED_BOOST , EFST_OVERED_BOOST , SCB_FLEE|SCB_ASPD|SCB_DEF ); set_sc(MH_LIGHT_OF_REGENE , SC_LIGHT_OF_REGENE, EFST_LIGHT_OF_REGENE, SCB_NONE); set_sc(MH_VOLCANIC_ASH , SC_ASH , EFST_VOLCANIC_ASH , SCB_DEF|SCB_DEF2|SCB_HIT|SCB_BATK|SCB_FLEE ); set_sc(MH_GRANITIC_ARMOR , SC_GRANITIC_ARMOR , EFST_GRANITIC_ARMOR , SCB_NONE ); set_sc(MH_MAGMA_FLOW , SC_MAGMA_FLOW , EFST_MAGMA_FLOW , SCB_NONE ); - set_sc(MH_PYROCLASTIC , SC_PYROCLASTIC , EFST_PYROCLASTIC , SCB_BATK|SCB_ATK_ELE ); - set_sc(MH_LAVA_SLIDE , SC_BURNING , EFST_BURNT , SCB_MDEF ); + set_sc(MH_PYROCLASTIC , SC_PYROCLASTIC , EFST_PYROCLASTIC , SCB_BATK|SCB_WATK|SCB_ATK_ELE ); set_sc(MH_NEEDLE_OF_PARALYZE , SC_PARALYSIS , EFST_NEEDLE_OF_PARALYZE , SCB_DEF2 ); - add_sc(MH_POISON_MIST , SC_BLIND ); - set_sc(MH_PAIN_KILLER , SC_PAIN_KILLER , EFST_PAIN_KILLER , SCB_ASPD ); + set_sc(MH_POISON_MIST , SC_POISON_MIST , EFST_POISON_MIST , SCB_FLEE ); + set_sc(MH_PAIN_KILLER , SC_PAIN_KILLER , EFST_PAIN_KILLER , SCB_NONE ); add_sc(MH_STYLE_CHANGE , SC_STYLE_CHANGE ); set_sc(MH_TINDER_BREAKER , SC_TINDER_BREAKER2 , EFST_TINDER_BREAKER , SCB_FLEE ); @@ -1197,7 +1199,7 @@ void initChangeTables(void) set_sc( RA_CAMOUFLAGE , SC_CAMOUFLAGE , EFST_CAMOUFLAGE , SCB_SPEED ); set_sc( RA_FIRINGTRAP , SC_BURNING , EFST_BURNT , SCB_MDEF ); set_sc_with_vfx( RA_ICEBOUNDTRAP, SC_FREEZING , EFST_FROSTMISTY , SCB_SPEED|SCB_ASPD|SCB_DEF ); - set_sc( RA_UNLIMIT , SC_UNLIMIT , EFST_UNLIMIT , SCB_DEF|SCB_DEF2|SCB_MDEF|SCB_MDEF2 ); + set_sc( RA_UNLIMIT , SC_UNLIMIT , EFST_UNLIMIT , SCB_NONE ); /* Mechanic */ set_sc( NC_ACCELERATION , SC_ACCELERATION , EFST_ACCELERATION , SCB_SPEED ); @@ -1218,13 +1220,13 @@ void initChangeTables(void) set_sc( LG_PRESTIGE , SC_PRESTIGE , EFST_PRESTIGE , SCB_DEF ); set_sc( LG_BANDING , SC_BANDING , EFST_BANDING , SCB_DEF|SCB_WATK|SCB_REGEN ); set_sc( LG_PIETY , SC_BENEDICTIO , EFST_BENEDICTIO , SCB_DEF_ELE ); - set_sc( LG_EARTHDRIVE , SC_EARTHDRIVE , EFST_EARTHDRIVE , SCB_DEF|SCB_ASPD ); set_sc( LG_INSPIRATION , SC_INSPIRATION , EFST_INSPIRATION , SCB_WATK|SCB_STR|SCB_AGI|SCB_VIT|SCB_INT|SCB_DEX|SCB_LUK|SCB_HIT|SCB_MAXHP); set_sc( LG_KINGS_GRACE , SC_KINGS_GRACE , EFST_KINGS_GRACE , SCB_NONE ); + set_sc( LG_MOONSLASHER , SC_OVERBRANDREADY , EFST_OVERBRANDREADY , SCB_NONE ); /* Shadow Chaser */ set_sc( SC_REPRODUCE , SC__REPRODUCE , EFST_REPRODUCE , SCB_NONE ); - set_sc( SC_AUTOSHADOWSPELL , SC__AUTOSHADOWSPELL , EFST_AUTOSHADOWSPELL , SCB_NONE ); + set_sc( SC_AUTOSHADOWSPELL , SC__AUTOSHADOWSPELL , EFST_AUTOSHADOWSPELL , SCB_MATK ); set_sc( SC_SHADOWFORM , SC__SHADOWFORM , EFST_SHADOWFORM , SCB_NONE ); set_sc( SC_BODYPAINT , SC__BODYPAINT , EFST_BODYPAINT , SCB_ASPD ); set_sc( SC_INVISIBILITY , SC__INVISIBILITY , EFST_INVISIBILITY , SCB_ASPD|SCB_CRI|SCB_ATK_ELE ); @@ -1248,7 +1250,7 @@ void initChangeTables(void) set_sc( SR_CRESCENTELBOW , SC_CRESCENTELBOW , EFST_CRESCENTELBOW , SCB_NONE ); set_sc_with_vfx( SR_CURSEDCIRCLE , SC_CURSEDCIRCLE_TARGET, EFST_CURSEDCIRCLE_TARGET , SCB_NONE ); set_sc( SR_LIGHTNINGWALK , SC_LIGHTNINGWALK , EFST_LIGHTNINGWALK , SCB_NONE ); - set_sc( SR_RAISINGDRAGON , SC_RAISINGDRAGON , EFST_RAISINGDRAGON , SCB_REGEN|SCB_MAXHP|SCB_MAXSP ); + set_sc( SR_RAISINGDRAGON , SC_RAISINGDRAGON , EFST_RAISINGDRAGON , SCB_MAXHP|SCB_MAXSP ); set_sc( SR_GENTLETOUCH_ENERGYGAIN , SC_GT_ENERGYGAIN , EFST_GENTLETOUCH_ENERGYGAIN , SCB_NONE ); set_sc( SR_GENTLETOUCH_CHANGE , SC_GT_CHANGE , EFST_GENTLETOUCH_CHANGE , SCB_WATK|SCB_ASPD ); set_sc( SR_GENTLETOUCH_REVITALIZE , SC_GT_REVITALIZE , EFST_GENTLETOUCH_REVITALIZE , SCB_MAXHP|SCB_REGEN ); @@ -1281,8 +1283,9 @@ void initChangeTables(void) set_sc( SO_ELECTRICWALK , SC_PROPERTYWALK , EFST_PROPERTYWALK , SCB_NONE ); set_sc( SO_SPELLFIST , SC_SPELLFIST , EFST_SPELLFIST , SCB_NONE ); set_sc_with_vfx( SO_DIAMONDDUST , SC_CRYSTALIZE , EFST_COLD , SCB_NONE ); - set_sc( SO_CLOUD_KILL , SC_POISON , EFST_CLOUD_KILL, SCB_NONE ); - set_sc( SO_STRIKING , SC_STRIKING , EFST_STRIKING , SCB_WATK|SCB_CRI ); + set_sc( SO_CLOUD_KILL , SC_CLOUD_POISON , EFST_CLOUD_POISON, SCB_NONE ); + add_sc( SO_POISON_BUSTER , SC_POISON ); + set_sc( SO_STRIKING , SC_STRIKING , EFST_STRIKING , SCB_ALL ); set_sc( SO_WARMER , SC_WARMER , EFST_WARMER , SCB_NONE ); set_sc( SO_VACUUM_EXTREME , SC_VACUUM_EXTREME , EFST_VACUUM_EXTREME , SCB_NONE ); set_sc( SO_ARRULLO , SC_DEEPSLEEP , EFST_HANDICAPSTATE_DEEP_SLEEP, SCB_NONE ); @@ -1294,8 +1297,8 @@ void initChangeTables(void) /* Genetic */ set_sc( GN_CARTBOOST , SC_GN_CARTBOOST , EFST_GN_CARTBOOST , SCB_SPEED ); set_sc( GN_THORNS_TRAP , SC_THORNSTRAP , EFST_THORNS_TRAP, SCB_NONE ); - set_sc_with_vfx( GN_BLOOD_SUCKER , SC_BLOODSUCKER , EFST_BLOOD_SUCKER, SCB_NONE ); - set_sc( GN_SPORE_EXPLOSION , SC_SPORE_EXPLOSION , EFST_SPORE_EXPLOSION, SCB_NONE ); + set_sc( GN_BLOOD_SUCKER , SC_BLOODSUCKER , EFST_BLOOD_SUCKER, SCB_NONE ); + set_sc( GN_SPORE_EXPLOSION , SC_SPORE_EXPLOSION , EFST_SPORE_EXPLOSION_DEBUFF, SCB_NONE ); set_sc( GN_FIRE_EXPANSION_SMOKE_POWDER , SC_SMOKEPOWDER , EFST_FIRE_EXPANSION_SMOKE_POWDER, SCB_FLEE ); set_sc( GN_FIRE_EXPANSION_TEAR_GAS , SC_TEARGAS , EFST_FIRE_EXPANSION_TEAR_GAS , SCB_HIT|SCB_FLEE ); set_sc_with_vfx( GN_HELLS_PLANT , SC_HELLS_PLANT , EFST_HELLS_PLANT_ARMOR , SCB_NONE ); @@ -1546,9 +1549,9 @@ void initChangeTables(void) StatusIconChangeTable[SC_OBLIVIONCURSE] = EFST_OBLIVIONCURSE; StatusIconChangeTable[SC_LEECHESEND] = EFST_LEECHESEND; StatusIconChangeTable[SC_BANDING_DEFENCE] = EFST_BANDING_DEFENCE; - StatusIconChangeTable[SC_SHIELDSPELL_DEF] = EFST_SHIELDSPELL_DEF; - StatusIconChangeTable[SC_SHIELDSPELL_MDEF] = EFST_SHIELDSPELL_MDEF; - StatusIconChangeTable[SC_SHIELDSPELL_REF] = EFST_SHIELDSPELL_REF; + StatusIconChangeTable[SC_SHIELDSPELL_HP] = EFST_SHIELDSPELL; + StatusIconChangeTable[SC_SHIELDSPELL_SP] = EFST_SHIELDSPELL; + StatusIconChangeTable[SC_SHIELDSPELL_ATK] = EFST_SHIELDSPELL; StatusIconChangeTable[SC_GLOOMYDAY_SK] = EFST_GLOOMYDAY; StatusIconChangeTable[SC_CURSEDCIRCLE_ATKER] = EFST_CURSEDCIRCLE_ATKER; @@ -1821,8 +1824,7 @@ void initChangeTables(void) StatusChangeFlagTable[SC_PYREXIA] |= SCB_ALL; StatusChangeFlagTable[SC_OBLIVIONCURSE] |= SCB_REGEN; StatusChangeFlagTable[SC_BANDING_DEFENCE] |= SCB_SPEED; - StatusChangeFlagTable[SC_SHIELDSPELL_DEF] |= SCB_WATK; - StatusChangeFlagTable[SC_SHIELDSPELL_REF] |= SCB_DEF; + StatusChangeFlagTable[SC_SHIELDSPELL_ATK] |= SCB_WATK|SCB_MATK; StatusChangeFlagTable[SC_STOMACHACHE] |= SCB_STR|SCB_AGI|SCB_VIT|SCB_DEX|SCB_INT|SCB_LUK; StatusChangeFlagTable[SC_MYSTERIOUS_POWDER] |= SCB_MAXHP; StatusChangeFlagTable[SC_MELON_BOMB] |= SCB_SPEED|SCB_ASPD; @@ -1950,7 +1952,6 @@ void initChangeTables(void) StatusDisplayType[SC_CURSEDCIRCLE_TARGET] = BL_PC; StatusDisplayType[SC_NETHERWORLD] = BL_PC; StatusDisplayType[SC_VOICEOFSIREN] = BL_PC; - StatusDisplayType[SC_BLOODSUCKER] = BL_PC; StatusDisplayType[SC__SHADOWFORM] = BL_PC; StatusDisplayType[SC__MANHOLE] = BL_PC; StatusDisplayType[SC_JYUMONJIKIRI] = BL_PC; @@ -3697,8 +3698,6 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { bonus += 500; if (sc->data[SC_PROMOTE_HEALTH_RESERCH]) bonus += sc->data[SC_PROMOTE_HEALTH_RESERCH]->val3; - if(sc->data[SC_INSPIRATION]) - bonus += (600 * sc->data[SC_INSPIRATION]->val1); if(sc->data[SC_SOLID_SKIN_OPTION]) bonus += 2000; if(sc->data[SC_MTF_MHP]) @@ -3745,9 +3744,9 @@ static int status_get_hpbonus(struct block_list *bl, enum e_status_bonus type) { if(sc->data[SC_FORCEOFVANGUARD]) bonus += (3 * sc->data[SC_FORCEOFVANGUARD]->val1); if(sc->data[SC_INSPIRATION]) - bonus += (5 * sc->data[SC_INSPIRATION]->val1); + bonus += (4 * sc->data[SC_INSPIRATION]->val1); if(sc->data[SC_RAISINGDRAGON]) - bonus += (2 + sc->data[SC_RAISINGDRAGON]->val1); + bonus += sc->data[SC_RAISINGDRAGON]->val1; if(sc->data[SC_GT_REVITALIZE]) bonus += sc->data[SC_GT_REVITALIZE]->val2; if(sc->data[SC_ANGRIFFS_MODUS]) @@ -3905,7 +3904,7 @@ static int status_get_spbonus(struct block_list *bl, enum e_status_bonus type) { if(sc->data[SC_INCMSPRATE]) bonus += sc->data[SC_INCMSPRATE]->val1; if(sc->data[SC_RAISINGDRAGON]) - bonus += (2 + sc->data[SC_RAISINGDRAGON]->val1); + bonus += sc->data[SC_RAISINGDRAGON]->val1; if(sc->data[SC_SERVICE4U]) bonus += sc->data[SC_SERVICE4U]->val2; if(sc->data[SC_MERC_SPUP]) @@ -5027,6 +5026,8 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt) sd->bonus.short_attack_atk_rate += sc->data[SC_LUXANIMA]->val3; sd->bonus.long_attack_atk_rate += sc->data[SC_LUXANIMA]->val3; } + if (sc->data[SC_STRIKING]) + sd->bonus.perfect_hit += 20 + 10 * pc_checkskill(sd, SO_STRIKING); } status_cpy(&sd->battle_status, base_status); @@ -5484,8 +5485,6 @@ void status_calc_regen_rate(struct block_list *bl, struct regen_data *regen, str } else regen->flag &= ~sce->val4; // Remove regen as specified by val4 } - if (sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 1) - regen->hp += cap_value(regen->hp * 50 / 100, 1, SHRT_MAX); if(sc->data[SC_GT_REVITALIZE]) { regen->hp += cap_value(regen->hp * sc->data[SC_GT_REVITALIZE]->val3/100, 1, SHRT_MAX); regen->state.walk = 1; @@ -6913,12 +6912,10 @@ static unsigned short status_calc_watk(struct block_list *bl, struct status_chan watk -= watk * sc->data[SC_STRIPWEAPON]->val2/100; if(sc->data[SC_FIGHTINGSPIRIT]) watk += sc->data[SC_FIGHTINGSPIRIT]->val1; - if(sc->data[SC_SHIELDSPELL_DEF] && sc->data[SC_SHIELDSPELL_DEF]->val1 == 3) - watk += sc->data[SC_SHIELDSPELL_DEF]->val2; - if(sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 1) - watk += (10 + 10 * sc->data[SC_BANDING]->val1) * sc->data[SC_BANDING]->val2; + if (sc->data[SC_SHIELDSPELL_ATK]) + watk += sc->data[SC_SHIELDSPELL_ATK]->val2; if(sc->data[SC_INSPIRATION]) - watk += 40 * sc->data[SC_INSPIRATION]->val1 + 3 * sc->data[SC_INSPIRATION]->val2; + watk += sc->data[SC_INSPIRATION]->val2; if(sc->data[SC_GT_CHANGE]) watk += sc->data[SC_GT_CHANGE]->val2; if(sc->data[SC__ENERVATION]) @@ -7017,6 +7014,10 @@ static unsigned short status_calc_ematk(struct block_list *bl, struct status_cha matk += sc->data[SC_DORAM_MATK]->val1; if (sc->data[SC_SOULFAIRY]) matk += sc->data[SC_SOULFAIRY]->val2; + if (sc->data[SC__AUTOSHADOWSPELL]) + matk += sc->data[SC__AUTOSHADOWSPELL]->val4 * 5; + if (sc->data[SC_INSPIRATION]) + matk += sc->data[SC_INSPIRATION]->val2; return (unsigned short)cap_value(matk,0,USHRT_MAX); } @@ -7066,7 +7067,11 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan matk += sc->data[SC_QUEST_BUFF2]->val1; if (sc->data[SC_QUEST_BUFF3]) matk += sc->data[SC_QUEST_BUFF3]->val1; - if (sc->data[SC_MAGICPOWER] && sc->data[SC_MAGICPOWER]->val4) + if (sc->data[SC_MAGICPOWER] +#ifndef RENEWAL + && sc->data[SC_MAGICPOWER]->val4 +#endif + ) matk += matk * sc->data[SC_MAGICPOWER]->val3/100; if (sc->data[SC_MINDBREAKER]) matk += matk * sc->data[SC_MINDBREAKER]->val2/100; @@ -7086,6 +7091,8 @@ static unsigned short status_calc_matk(struct block_list *bl, struct status_chan if (sc->data[SC_NIBELUNGEN] && sc->data[SC_NIBELUNGEN]->val2 == RINGNBL_MATKRATE) matk += matk * 20 / 100; #endif + if (sc->data[SC_SHIELDSPELL_ATK]) + matk += sc->data[SC_SHIELDSPELL_ATK]->val2; return (unsigned short)cap_value(matk,0,USHRT_MAX); } @@ -7116,8 +7123,6 @@ static signed short status_calc_critical(struct block_list *bl, struct status_ch critical += sc->data[SC_TRUESIGHT]->val2; if (sc->data[SC_CLOAKING]) critical += critical; - if (sc->data[SC_STRIKING]) - critical += critical * sc->data[SC_STRIKING]->val1 / 100; #ifdef RENEWAL if (sc->data[SC_SPEARQUICKEN]) critical += 3*sc->data[SC_SPEARQUICKEN]->val1*10; @@ -7159,7 +7164,7 @@ static signed short status_calc_hit(struct block_list *bl, struct status_change if(sc->data[SC_CONCENTRATION]) hit += sc->data[SC_CONCENTRATION]->val3; if(sc->data[SC_INSPIRATION]) - hit += 5 * sc->data[SC_INSPIRATION]->val1 + sc->data[SC_INSPIRATION]->val2 / 2; + hit += 12 * sc->data[SC_INSPIRATION]->val1; if(sc->data[SC_ADJUSTMENT]) hit -= 30; if(sc->data[SC_INCREASING]) @@ -7224,6 +7229,8 @@ static signed short status_calc_flee(struct block_list *bl, struct status_change if(!sc || !sc->count) return cap_value(flee,1,SHRT_MAX); + if (sc->data[SC_POISON_MIST]) + return 0; if(sc->data[SC_OVERED_BOOST]) //Should be final and unmodifiable by any means return sc->data[SC_OVERED_BOOST]->val2; @@ -7412,16 +7419,12 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc, def -= def * (14 * sc->data[SC_ANALYZE]->val1) / 100; if( sc->data[SC_NEUTRALBARRIER] ) def += def * sc->data[SC_NEUTRALBARRIER]->val2 / 100; - if( sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 2 ) - def += sc->data[SC_SHIELDSPELL_REF]->val2; if( sc->data[SC_PRESTIGE] ) def += sc->data[SC_PRESTIGE]->val3; if( sc->data[SC_BANDING] && sc->data[SC_BANDING]->val2 > 1 ) - def += (5 + sc->data[SC_BANDING]->val1) * sc->data[SC_BANDING]->val2 / 10; + def += 6 * sc->data[SC_BANDING]->val1; if( sc->data[SC_ECHOSONG] ) def += sc->data[SC_ECHOSONG]->val3; - if( sc->data[SC_EARTHDRIVE] ) - def -= def * 25 / 100; if( sc->data[SC_CAMOUFLAGE] ) def -= def * 5 * sc->data[SC_CAMOUFLAGE]->val3 / 100; if( sc->data[SC_SOLID_SKIN_OPTION] ) @@ -7438,6 +7441,8 @@ static defType status_calc_def(struct block_list *bl, struct status_change *sc, def += sc->data[SC_GLASTHEIM_ITEMDEF]->val1; if (sc->data[SC_SOULGOLEM]) def += sc->data[SC_SOULGOLEM]->val2; + if (sc->data[SC_STONE_WALL]) + def += sc->data[SC_STONE_WALL]->val2; return (defType)cap_value(def,DEFTYPE_MIN,DEFTYPE_MAX); } @@ -7564,6 +7569,8 @@ static defType status_calc_mdef(struct block_list *bl, struct status_change *sc, mdef += sc->data[SC_GLASTHEIM_ITEMDEF]->val2; if (sc->data[SC_SOULGOLEM]) mdef += sc->data[SC_SOULGOLEM]->val3; + if (sc->data[SC_STONE_WALL]) + mdef += sc->data[SC_STONE_WALL]->val3; return (defType)cap_value(mdef,DEFTYPE_MIN,DEFTYPE_MAX); } @@ -7712,8 +7719,6 @@ static unsigned short status_calc_speed(struct block_list *bl, struct status_cha val = max( val, 20 ); if( sc->data[SC__LAZINESS] ) val = max( val, 25 ); - if( sc->data[SC_BANDING_DEFENCE] ) - val = max( val, sc->data[SC_BANDING_DEFENCE]->val1 ); // +90% walking speed. if( sc->data[SC_ROCK_CRUSHER_ATK] ) val = max( val, sc->data[SC_ROCK_CRUSHER_ATK]->val2 ); if( sc->data[SC_POWER_OF_GAIA] ) @@ -7921,14 +7926,10 @@ static short status_calc_aspd(struct block_list *bl, struct status_change *sc, b bonus += sc->data[SC_DANCEWITHWUG]->val3; if (sc->data[SC_GLOOMYDAY]) bonus -= sc->data[SC_GLOOMYDAY]->val3; - if (sc->data[SC_EARTHDRIVE]) - bonus -= 25; if (sc->data[SC_GT_CHANGE]) bonus += sc->data[SC_GT_CHANGE]->val3; if (sc->data[SC_MELON_BOMB]) bonus -= sc->data[SC_MELON_BOMB]->val3; - if (sc->data[SC_PAIN_KILLER]) - bonus -= sc->data[SC_PAIN_KILLER]->val2; if (sc->data[SC_BOOST500]) bonus += sc->data[SC_BOOST500]->val1; if (sc->data[SC_EXTRACT_SALAMINE_JUICE]) @@ -8126,8 +8127,6 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change * aspd_rate -= sc->data[SC_DANCEWITHWUG]->val3 * 10; if( sc->data[SC_GLOOMYDAY] ) aspd_rate += sc->data[SC_GLOOMYDAY]->val3 * 10; - if( sc->data[SC_EARTHDRIVE] ) - aspd_rate += 250; if( sc->data[SC_GT_CHANGE] ) aspd_rate -= sc->data[SC_GT_CHANGE]->val3 * 10; if( sc->data[SC_MELON_BOMB] ) @@ -8138,8 +8137,6 @@ static short status_calc_aspd_rate(struct block_list *bl, struct status_change * aspd_rate -= sc->data[SC_EXTRACT_SALAMINE_JUICE]->val1 * 10; if( sc->data[SC_INCASPDRATE] ) aspd_rate -= sc->data[SC_INCASPDRATE]->val1 * 10; - if( sc->data[SC_PAIN_KILLER]) - aspd_rate += sc->data[SC_PAIN_KILLER]->val2 * 10; if( sc->data[SC_GOLDENE_FERSE]) aspd_rate -= sc->data[SC_GOLDENE_FERSE]->val3 * 10; if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 2) @@ -8305,8 +8302,6 @@ unsigned char status_calc_attack_element(struct block_list *bl, struct status_ch return ELE_GHOST; if(sc->data[SC_TIDAL_WEAPON_OPTION] || sc->data[SC_TIDAL_WEAPON] ) return ELE_WATER; - if(sc->data[SC_PYROCLASTIC]) - return ELE_FIRE; return (unsigned char)cap_value(element,0,UCHAR_MAX); } @@ -9197,8 +9192,6 @@ t_tick status_get_sc_def(struct block_list *src, struct block_list *bl, enum sc_ else if (sc->data[SC_SIEGFRIED]) sc_def += sc->data[SC_SIEGFRIED]->val3*100; // Status resistance. #endif - else if (sc->data[SC_SHIELDSPELL_REF] && sc->data[SC_SHIELDSPELL_REF]->val1 == 2) - sc_def += sc->data[SC_SHIELDSPELL_REF]->val3*100; else if (sc->data[SC_LEECHESEND] && sc->data[SC_LEECHESEND]->val3 == 0) { switch (type) { case SC_BLIND: @@ -10300,16 +10293,15 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_REFLECTDAMAGE: status_change_end(bl, SC_REFLECTSHIELD, INVALID_TIMER); break; - case SC_SHIELDSPELL_DEF: - case SC_SHIELDSPELL_MDEF: - case SC_SHIELDSPELL_REF: - status_change_end(bl, SC_MAGNIFICAT, INVALID_TIMER); - if( type != SC_SHIELDSPELL_DEF ) - status_change_end(bl, SC_SHIELDSPELL_DEF, INVALID_TIMER); - if( type != SC_SHIELDSPELL_MDEF ) - status_change_end(bl, SC_SHIELDSPELL_MDEF, INVALID_TIMER); - if( type != SC_SHIELDSPELL_REF ) - status_change_end(bl, SC_SHIELDSPELL_REF, INVALID_TIMER); + case SC_SHIELDSPELL_HP: + case SC_SHIELDSPELL_SP: + case SC_SHIELDSPELL_ATK: + if( type != SC_SHIELDSPELL_HP ) + status_change_end(bl, SC_SHIELDSPELL_HP, INVALID_TIMER); + if( type != SC_SHIELDSPELL_SP ) + status_change_end(bl, SC_SHIELDSPELL_SP, INVALID_TIMER); + if( type != SC_SHIELDSPELL_ATK ) + status_change_end(bl, SC_SHIELDSPELL_ATK, INVALID_TIMER); break; case SC_BANDING: status_change_end(bl, SC_PRESTIGE, INVALID_TIMER); @@ -10653,14 +10645,13 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty } break; case SC_MAGICPOWER: - // val1: Skill lv - val2 = 1; // Lasts 1 invocation #ifdef RENEWAL - val3 = 10 * val1; // Matk% increase -#else val3 = 5 * val1; // Matk% increase -#endif +#else + val2 = 1; // Lasts 1 invocation + val3 = 10 * val1; // Matk% increase val4 = 0; // 0 = ready to be used, 1 = activated and running +#endif break; case SC_SACRIFICE: val2 = 5; // Lasts 5 hits @@ -11763,10 +11754,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty tick = INFINITE_TICK; // Duration sent to the client should be infinite tick_time = 3000; break; - case SC_BLOODSUCKER: - val4 = tick / 1000; - tick_time = 1000; // [GodLesZ] tick time - break; case SC_HELLS_PLANT: tick_time = 333; val4 = tick / tick_time; @@ -11848,7 +11835,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val3 = 4 * val1 + min(3 * val2, 15); // !TODO: What's the Lesson bonus? break; case SC_REFLECTDAMAGE: - val2 = 15 + 5 * val1; // Reflect amount + val2 = 10 * val1; // Reflect reduction amount val3 = val1*5 + 25; // Number of reflects val4 = tick/1000; // Number of SP cycles (duration) tick_time = 1000; // [GodLesZ] tick time @@ -11873,6 +11860,19 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val2 = (status->int_ + status->luk) * val1 / 20 * status_get_lv(bl) / 200 + val1; // Chance to evade magic damage. val3 = ((val1 * 15) + (10 * (sd?pc_checkskill(sd,CR_DEFENDER):skill_get_max(CR_DEFENDER)))) * status_get_lv(bl) / 100; // Defence added break; + case SC_SHIELDSPELL_HP: + val2 = 3; // 3% HP every 3 seconds + tick_time = 3000; + val4 = tick / tick_time; + break; + case SC_SHIELDSPELL_SP: + val2 = 3; // 3% SP every 5 seconds + tick_time = 5000; + val4 = tick / tick_time; + break; + case SC_SHIELDSPELL_ATK: + val2 = 150; // WATK/MATK bonus + break; case SC_BANDING: val2 = (sd ? skill_banding_count(sd) : 1); tick_time = 5000; // [GodLesZ] tick time @@ -11882,11 +11882,11 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val4 = tick / tick_time; break; case SC_INSPIRATION: - val2 = (sd?sd->status.job_level:50); - val3 = status_get_lv(bl) / 10 + val2 / 5; //All stat bonus + val2 = 40 * val1; // ATK/MATK + val3 = 6 * val1; //All stat bonus val4 = tick / 5000; tick_time = 5000; // [GodLesZ] tick time - status_change_clear_buffs(bl, SCCB_BUFFS|SCCB_DEBUFFS); // Remove buffs/debuffs + status_change_clear_buffs(bl, SCCB_DEBUFFS); // Remove debuffs break; case SC_CRESCENTELBOW: val2 = (sd?sd->status.job_level:50) / 2 + (50 + 5 * val1); @@ -11894,10 +11894,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC_LIGHTNINGWALK: // [(Job Level / 2) + (40 + 5 * Skill Level)] % val1 = (sd?sd->status.job_level:2)/2 + 40 + 5 * val1; break; - case SC_RAISINGDRAGON: - val3 = tick / 5000; - tick_time = 5000; // [GodLesZ] tick time - break; case SC_GT_ENERGYGAIN: val2 = 10 + 5 * val1; // Sphere gain chance. break; @@ -12102,6 +12098,10 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val3 = 6 + 4 * val1; // Aspd Bonus val4 = 2 + 2 * val1; // Chance of holy attack break; + case SC_STONE_WALL: + val2 = 100 * val1; // DEF bonus + val3 = 30 * val1; // MDEF bonus + break; case SC_OVERED_BOOST: val2 = 400 + 40 * val1; // flee bonus val3 = 180 + 2 * val1; // aspd bonus @@ -12116,8 +12116,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val2 = 3*val1; // Activation chance break; case SC_PYROCLASTIC: - val2 += 10*val1; // atk bonus - val3 = 2*val1; // Chance To AutoCast Hammer Fall % + val2 += 100 + 10*val1; // atk bonus // !TODO: Confirm formula break; case SC_PARALYSIS: // [Lighta] need real info val2 = 2*val1; // def reduction @@ -12127,8 +12126,7 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty val2 = 20 * val1; // hp reco on death % break; case SC_PAIN_KILLER: // Yommy leak need confirm - val2 = 10 * val1; // aspd reduction % - val3 = min((( 200 * val1 ) * status_get_lv(src)) / 150, 1000); // dmg reduction linear. upto a maximum of 1000 [iRO Wiki] + val2 = min((( 200 * val1 ) * status_get_lv(src)) / 150, 1000); // dmg reduction linear. upto a maximum of 1000 [iRO Wiki] if(sc->data[SC_PARALYSIS]) sc_start(src,bl, SC_ENDURE, 100, val1, tick); // Start endure for same duration break; @@ -12194,8 +12192,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; case SC_UNLIMIT: val2 = 50 * val1; - status_change_start(bl, bl, SC_DEFSET, 10000, 1, 0, 0, 0, tick, SCSTART_NOTICKDEF); - status_change_start(bl, bl, SC_MDEFSET, 10000, 1, 0, 0, 0, tick, SCSTART_NOTICKDEF); break; case SC_MONSTER_TRANSFORM: case SC_ACTIVE_MONSTER_TRANSFORM: @@ -12607,9 +12603,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty case SC__WEAKNESS: case SC_PROPERTYWALK: case SC_PRESTIGE: - case SC_SHIELDSPELL_DEF: - case SC_SHIELDSPELL_MDEF: - case SC_SHIELDSPELL_REF: case SC_CRESCENTELBOW: case SC_CHILLY_AIR_OPTION: case SC_GUST_OPTION: @@ -13079,9 +13072,6 @@ int status_change_start(struct block_list* src, struct block_list* bl,enum sc_ty break; } break; - case SC_RAISINGDRAGON: - sce->val2 = status->max_hp / 100; // Officially tested its 1%hp drain. [Jobbie] - break; case SC_C_MARKER: //Send mini-map, don't wait for first timer triggered if (src->type == BL_PC && (sd = map_id2sd(src->id))) @@ -13134,7 +13124,6 @@ int status_change_clear(struct block_list* bl, int type) #ifndef RENEWAL sc->sg_counter = 0; #endif - sc->bs_counter = 0; if (!sc->count) return 0; @@ -13243,6 +13232,7 @@ int status_change_clear(struct block_list* bl, int type) case SC_REUSE_LIMIT_LUXANIMA: case SC_SOULENERGY: case SC_MADOGEAR: + case SC_HOMUN_TIME: // Costumes case SC_MOONSTAR: case SC_SUPER_STAR: @@ -13280,6 +13270,7 @@ int status_change_clear(struct block_list* bl, int type) case SC_ENTRY_QUEUE_APPLY_DELAY: case SC_ENTRY_QUEUE_NOTIFY_ADMISSION_TIME_OUT: case SC_MADOGEAR: + case SC_HOMUN_TIME: // Costumes case SC_MOONSTAR: case SC_SUPER_STAR: @@ -13594,7 +13585,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const } break; case SC_SPLASHER: - case SC_SPORE_EXPLOSION: { struct block_list *src=map_id2bl(sce->val3); if(src && tid != INVALID_TIMER) @@ -13780,7 +13770,7 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const map_foreachinallrange(status_change_timer_sub, bl, AREA_SIZE + 3, BL_CHAR, bl, sce, SC_CURSEDCIRCLE_TARGET, gettick()); break; case SC_RAISINGDRAGON: - if( sd && sce->val2 && !pc_isdead(sd) ) { + if( sd && !pc_isdead(sd) ) { int i = min(sd->spiritball,5); pc_delspiritball(sd, sd->spiritball, 0); status_change_end(bl, SC_EXPLOSIONSPIRITS, INVALID_TIMER); @@ -13801,18 +13791,6 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const } } break; - case SC_BLOODSUCKER: - if( sce->val2 ) { - struct block_list *src = map_id2bl(sce->val2); - - if (src && !status_isdead(src)) { - struct status_change *sc2 = status_get_sc(src); - - if (sc2) - sc2->bs_counter--; - } - } - break; case SC_TEARGAS: status_change_end(bl,SC_TEARGAS_SOB,INVALID_TIMER); break; @@ -13949,6 +13927,10 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const if (sd) pc_bonus_script_clear(sd, BSF_REM_ON_MADOGEAR); break; + case SC_HOMUN_TIME: + if (sd && hom_is_active(sd->hd)) + hom_vaporize(sd, HOM_ST_REST); + break; } opt_flag = 1; @@ -14168,15 +14150,13 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const } } if (calc_flag) { - switch (type) { - case SC_MAGICPOWER: +#ifndef RENEWAL + if (type == SC_MAGICPOWER) { //If Mystical Amplification ends, MATK is immediately recalculated status_calc_bl_(bl, calc_flag, SCO_FORCE); - break; - default: + } else +#endif status_calc_bl(bl, calc_flag); - break; - } } if(opt_flag&4) // Out of hiding, invoke on place. @@ -14735,28 +14715,6 @@ TIMER_FUNC(status_change_timer){ return 0; } - case SC_BLOODSUCKER: - if( --(sce->val4) >= 0 ) { - struct block_list *src = map_id2bl(sce->val2); - int damage; - if( !src || (src && (status_isdead(src) || src->m != bl->m || distance_bl(src, bl) >= 12)) ) - break; - map_freeblock_lock(); - if (is_infinite_defense(bl, BF_MISC)) // Only does 1 damage to infinte defense type. - damage = 1; - else - damage = 200 + 100 * sce->val1 + status_get_int(src); - status_damage(src, bl, damage, 0, clif_damage(bl,bl,tick,status->amotion,status->dmotion+200,damage,1,DMG_NORMAL,0,false), 0, 0); - unit_skillcastcancel(bl,1); - if ( sc->data[type] ) { - sc_timer_next(1000 + tick); - } - map_freeblock_unlock(); - status_heal(src, damage*(5 + 5 * sce->val1)/100, 0, 0); // 5 + 5% per level - return 0; - } - break; - case SC_HELLS_PLANT: if (--(sce->val4) > 0) { skill_castend_damage_id(bl, bl, GN_HELLS_PLANT_ATK, sce->val1, tick, 0); @@ -14870,20 +14828,27 @@ TIMER_FUNC(status_change_timer){ case SC_INSPIRATION: if(--(sce->val4) >= 0) { - int hp = status->max_hp * (35 - 5 * sce->val1) / 1000; - int sp = status->max_sp * (45 - 5 * sce->val1) / 1000; - - if( !status_charge(bl,hp,sp) ) break; + if (!status_charge(bl, status->max_hp * (35 - 5 * sce->val1) / 1000, status->max_sp * (45 - 5 * sce->val1) / 1000)) + break; sc_timer_next(5000+tick); return 0; } break; - case SC_RAISINGDRAGON: - // 1% every 5 seconds [Jobbie] - if( --(sce->val3)>0 && status_charge(bl, sce->val2, 0) ) { - if( !sc->data[type] ) return 0; + case SC_SHIELDSPELL_HP: + if (sce->val4 >= 0) { + if (status->hp < status->max_hp) + status_heal(bl, status->max_hp * sce->val2 / 100, 0, 1); + sc_timer_next(3000 + tick); + return 0; + } + break; + + case SC_SHIELDSPELL_SP: + if (sce->val4 >= 0) { + if (status->sp < status->max_sp) + status_heal(bl, 0, status->max_sp * sce->val2 / 100, 1); sc_timer_next(5000 + tick); return 0; } @@ -15423,6 +15388,7 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type) case SC_EP16_2_BUFF_SS: case SC_EP16_2_BUFF_SC: case SC_EP16_2_BUFF_AC: + case SC_HOMUN_TIME: // Clans case SC_CLAN_INFO: case SC_SWORDCLAN: @@ -15527,7 +15493,6 @@ void status_change_clear_buffs(struct block_list* bl, uint8 type) #ifndef RENEWAL sc->sg_counter = 0; #endif - sc->bs_counter = 0; return; } diff --git a/src/map/status.hpp b/src/map/status.hpp index 634db44b8e..9ed753f3e7 100644 --- a/src/map/status.hpp +++ b/src/map/status.hpp @@ -521,9 +521,9 @@ enum sc_type : int16 { **/ SC_REFLECTDAMAGE, SC_FORCEOFVANGUARD, - SC_SHIELDSPELL_DEF, - SC_SHIELDSPELL_MDEF, - SC_SHIELDSPELL_REF,//380 + SC_SHIELDSPELL_HP, + SC_SHIELDSPELL_SP, + SC_SHIELDSPELL_ATK,//380 SC_EXEEDBREAK, SC_PRESTIGE, SC_BANDING, @@ -975,6 +975,13 @@ enum sc_type : int16 { SC_EP16_2_BUFF_SS, SC_EP16_2_BUFF_SC, SC_EP16_2_BUFF_AC, + + // Job Improvement Bundle + SC_OVERBRANDREADY, + SC_POISON_MIST, + SC_STONE_WALL, + SC_CLOUD_POISON, + SC_HOMUN_TIME, SC_EMERGENCY_MOVE, SC_MADOGEAR, @@ -2665,7 +2672,6 @@ struct status_change { #ifndef RENEWAL unsigned char sg_counter; //Storm gust counter (previous hits from storm gust) #endif - unsigned char bs_counter; // Blood Sucker counter struct status_change_entry *data[SC_MAX]; }; diff --git a/src/map/unit.cpp b/src/map/unit.cpp index 75e1465299..81c6b2907b 100644 --- a/src/map/unit.cpp +++ b/src/map/unit.cpp @@ -1955,7 +1955,9 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui unit_stop_walking(src, 1); // Even though this is not how official works but this will do the trick. bugreport:6829 // SC_MAGICPOWER needs to switch states at start of cast +#ifndef RENEWAL skill_toggle_magicpower(src, skill_id); +#endif // In official this is triggered even if no cast time. clif_skillcasting(src, src->id, target_id, 0,0, skill_id, skill_lv, skill_get_ele(skill_id, skill_lv), casttime); @@ -2214,7 +2216,9 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui unit_stop_walking(src,1); // SC_MAGICPOWER needs to switch states at start of cast +#ifndef RENEWAL skill_toggle_magicpower(src, skill_id); +#endif // In official this is triggered even if no cast time. clif_skillcasting(src, src->id, 0, skill_x, skill_y, skill_id, skill_lv, skill_get_ele(skill_id, skill_lv), casttime); @@ -3515,6 +3519,10 @@ int unit_free(struct block_list *bl, clr_type clrtype) if( sd ) sd->status.hom_id = 0; + +#ifdef RENEWAL + status_change_end(&sd->bl, status_skill2sc(AM_CALLHOMUN), INVALID_TIMER); +#endif } if( sd )