//===== rAthena Script ======================================= //= Renewal Refining NPCs //===== By: ================================================== //= rAthena Dev Team //===== Current Version: ===================================== //= 1.4 //===== Compatible With: ===================================== //= rAthena Project //===== Description: ========================================= //= Renewal-specific refining NPCs and material merchants. //===== Additional Comments: ================================= //= 1.0 Moved some scripts to Renewal file, optimized "Austry" NPC. [Euphy] //= 1.0a Added 'disable_items' command. [Euphy] //= 1.1 Added Malangdo Refiner "Clink". [Euphy] //= 1.2 Added official success calculation, thanks to Helvetica. //= The safe/multiple refine feature is now functional. [Euphy] //= 1.3 Updated to match the latest official script. [Euphy] //= 1.4 Added correct safe refines. [Haruna] //= 1.5 Added Refine UI [Atemo, Lemongrass] //= 1.6 Added Barter exchange npcs [Atemo] //============================================================ // +11 and above Refiners //============================================================ prt_in,90,72,5 script Vestri#prt 4_M_DWARF,{ if( getbattleflag( "feature.refineui" ) ){ mes "[Vestri]"; mes "I'm the most skillful blacksmith!"; close2; refineui(); end; }else{ callfunc "refinenew","Vestri",0; end; } } morocc_in,64,41,5 duplicate(Vestri#prt) Vestri#moc 4_M_DWARF payon_in01,18,132,3 duplicate(Vestri#prt) Vestri#pay 4_M_DWARF //============================================================ // +11 and above Refiner Function //============================================================ //= To allow auto safe refining/multiple refining set the //= second argument to '1' in the function call. //= If you enable this function, be sure to edit the value of //= .@safe to the max safe refine in refine.yml as well. //= //= On official servers, if an item is unsuccessfully refined //= it will break at a 20% rate and downgrade at an 80% rate. //============================================================ function script refinenew { .@npc_name$ = getarg(0); disable_items; mes "["+ .@npc_name$ +"]"; mes "I am the best Armsmith ever!"; mes "I don't refine normal, boring items."; mes "I only refine items that are Level 10 or higher."; next; mes "["+ .@npc_name$ +"]"; mes "Anyway, you may use my services if your item is Level 10 or higher."; mes "What do you want me to refine?"; next; setarray .@indices[1], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW; for(.@i = 1; .@i<=10; ++.@i) { if (getequipisequiped(.@indices[.@i])) { .@menu$ = .@menu$ + F_getpositionname(.@indices[.@i]) + "-[" + getequipname(.@indices[.@i]) + "]"; .@equipped = 1; } .@menu$ = .@menu$ + ":"; } if (.@equipped == 0) { mes "["+ .@npc_name$ +"]"; mes "I don't think I can refine any items you have..."; close; } .@part = .@indices[ select(.@menu$) ]; if (!getequipisequiped(.@part)) { //custom check mes "["+ .@npc_name$ +"]"; mes "You're not wearing"; mes "anything there that"; mes "I can refine."; emotion ET_FRET; close; } if (!getequipisenableref(.@part)) { mes "["+ .@npc_name$ +"]"; mes "I don't think I can"; mes "refine this item at all..."; close; } .@refinerycnt = getequiprefinerycnt(.@part); //save refinery count if (.@refinerycnt < 10) { mes "["+ .@npc_name$ +"]"; mes "I said I don't work with items that are lower than Level 10."; close; } if (.@refinerycnt >= 20) { //custom check mes "["+ .@npc_name$ +"]"; mes "I can't refine this"; mes "any more. This is as"; mes "refined as it gets!"; close; } .@refineitemid = getequipid(.@part); // save id of the item setarray .@card[0], getequipcardid(.@part,0), getequipcardid(.@part,1), getequipcardid(.@part,2), getequipcardid(.@part,3); .@price = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_ZENY_COST); .@material = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_MATERIAL_ID); .@safe = 10; .@itemtype = getiteminfo( .@refineitemid, ITEMINFO_TYPE ); if( .@itemtype == IT_WEAPON ){ .@article$ = "a"; .@type$ = "weapon"; }else if( .@itemtype == IT_ARMOR ){ .@article$ = "an"; .@type$ = "armor"; }else{ // TODO: close; } mes "["+ .@npc_name$ +"]"; mes "Hmm " + .@article$ + " " + .@type$ + ", is that ok?"; mes "If you want to refine this " + .@type$ + ","; mes "I will need 1 ^003366" + getitemname(.@material) + "^000000 and " + callfunc("F_InsertComma",.@price) + " zeny."; mes "Are you sure you want to continue?"; next; if (select("Yes:No") == 2) { mes "["+ .@npc_name$ +"]"; mes "Hm... if you mind... never mind..."; close; } if (getarg(1) != 1) { if (getequippercentrefinery(.@part) < 100) { mes "["+ .@npc_name$ +"]"; mes "This "+.@type$+" already has been refined several times."; mes "It could be destroyed if I try again."; mes "It won't break for sure, but there is has a small chance."; next; mes "["+ .@npc_name$ +"]"; mes "You could be ^FF0000lowering the upgrade level^000000 of the "+.@type$+","; mes "or if it breaks, you will lose ^FF0000any cards^000000 or special properties added to it."; next; mes "["+ .@npc_name$ +"]"; mes "Do you still want me to refine it?"; mes "I think I have given you enough warning."; next; if(select("Yes.:No.") == 2) { mes "["+ .@npc_name$ +"]"; mes "Well, no challenge is one way to go..."; mes "No risk... that could be wise."; close; } } if (countitem(.@material) < 1 || Zeny < .@price) { mes "["+ .@npc_name$ +"]"; mes "Hm. You don't seem to have enough money or "+getitemname(.@material)+"."; mes "Please come back when you have them."; close; } Zeny = Zeny - .@price; delitem .@material,1; // anti-hack if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) || callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) { mes "["+ .@npc_name$ +"]"; emotion ET_FRET; mes "Wait a second..."; mes "Do you think I'm stupid?!"; mes "You switched the item while I wasn't looking! Get out of here!"; close; } if (getequippercentrefinery(.@part) > rand(100)) { mes "Clang! Clang! Clang! Clang!"; successrefitem .@part; next; emotion ET_BEST; mes "["+ .@npc_name$ +"]"; mes "Good! Succes!!!"; mes "I am the best Armsmith."; close; } else { if (rand(100) < 80) { mes "["+ .@npc_name$ +"]"; mes "Clang! Clang! Clang! Clang!"; downrefitem .@part,3; // Failed refine attempts decrease the item's refine level by 3 next; emotion (!rand(5))?ET_MONEY:ET_HUK; mes "["+ .@npc_name$ +"]"; mes "Ahhh!!!"; next; mes "["+ .@npc_name$ +"]"; mes "Oh my god!"; mes "The upgrade level has dropped..."; } else { mes "["+ .@npc_name$ +"]"; mes "Clang! Clang! Clang!"; failedrefitem .@part; next; emotion (!rand(5))?ET_MONEY:ET_HUK; mes "["+ .@npc_name$ +"]"; mes "Hmmm!"; next; mes "["+ .@npc_name$ +"]"; mes "Oh my! I've failed to refine stuff..."; mes "I didn't mean it!"; } mes "I could have made a mistake even though I am the best Armsmith ever."; mes "It just wasn't meant to be."; next; mes "["+ .@npc_name$ +"]"; mes "I will do a better job next time! Don't worry!"; close; } } // New +11 and above Refining Functions ======================== if (.@refinerycnt < .@safe) { mes "["+ .@npc_name$ +"]"; mes "I can refine this to the safe limit or a desired number of times. It's your choice."; next; .@menu2 = select("To the safe limit, please.","I'll decide how many times.","I've changed my mind..."); } else .@menu2 = 2; switch(.@menu2){ case 1: .@refinecnt = .@safe - .@refinerycnt; break; case 2: mes "["+ .@npc_name$ +"]"; mes "How many times would you like me to refine your item?"; next; input .@refinecnt; .@refinecheck = .@refinecnt + .@refinerycnt; if (.@refinecnt < 1 || .@refinecheck > 20) { mes "["+ .@npc_name$ +"]"; mes "I can't refine this item that many times."; close; } if (.@refinecheck > .@safe) { .@refinecheck = .@refinecheck - .@safe; mes "["+ .@npc_name$ +"]"; mes "This will try to refine the equipment " + .@refinecheck + " times past the safe limit. Your equipment may be destroyed... is that ok?"; next; if(select("Yes...","No...") == 2){ mes "["+ .@npc_name$ +"]"; mes "You said so... So be it."; close; } } break; case 3: mes "["+ .@npc_name$ +"]"; mes "You said so... So be it."; close; } .@fullprice = .@price * .@refinecnt; mes "["+ .@npc_name$ +"]"; mes "That will cost you " + .@refinecnt + " " + getitemname(.@material) + " and " + .@fullprice + " Zeny. Is that ok?"; next; if(select("Yes:No...") == 2){ mes "["+ .@npc_name$ +"]"; mes "You said so... So be it."; close; } if (countitem(.@material) < .@refinecnt || Zeny < .@fullprice) { mes "["+ .@npc_name$ +"]"; mes "Hm. You don't seem to have enough money or "+getitemname(.@material)+"."; mes "Please come back when you have them."; close; } Zeny = Zeny - .@fullprice; delitem .@material,.@refinecnt; while(.@refinecnt){ if (getequipisequiped(.@part) == 0) { mes "["+ .@npc_name$ +"]"; mes "Look here... you don't have any items on..."; close; } // anti-hack if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) || callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) close; if (getequipid(.@part) != .@refineitemid || (.@menu2 == 1 && getequippercentrefinery(.@part) < 100)) { mes "["+ .@npc_name$ +"]"; mes "Clang... No, but did you imagine I could be so stupid?!"; mes "You changed it..."; mes "Get out before I stun you with my Hammer!!"; close; } if (getequippercentrefinery(.@part) > rand(100)) { mes "Clang! Clang! Clang! Clang!"; successrefitem .@part; .@refinecnt = .@refinecnt - 1; next; } else { if (rand(100) < 80) { mes "["+ .@npc_name$ +"]"; mes "Clang! Clang! Clang! Clang!"; downrefitem .@part,3; // Failed refine attempts decrease the item's refine level by 3 next; emotion (!rand(5))?ET_MONEY:ET_HUK; mes "["+ .@npc_name$ +"]"; mes "Ahhh!!!"; next; mes "["+ .@npc_name$ +"]"; mes "Oh my god!"; mes "The upgrade level has dropped..."; } else { mes "["+ .@npc_name$ +"]"; mes "Clang! Clang! Clang!"; failedrefitem .@part; next; emotion (!rand(5))?ET_MONEY:ET_HUK; mes "["+ .@npc_name$ +"]"; mes "Hmmm!"; next; mes "["+ .@npc_name$ +"]"; mes "Oh my! I've failed to refine stuff..."; mes "I didn't mean it!"; } mes "I could have made a mistake even though I am the best Armsmith ever."; mes "It just wasn't meant to be."; next; mes "["+ .@npc_name$ +"]"; mes "I will do a better job next time! Don't worry!"; close; } .@refinerycnt = getequiprefinerycnt(.@part); } emotion ET_BEST; mes "["+ .@npc_name$ +"]"; mes "Good! Succes!!!"; mes "I am the best Blacksmith."; close; } // Ori/Elu to Carnium/Bradium Refiners //============================================================ - script Austri#ref -1,{ if (checkweight(1201,1) == 0) { mes "- Wait a minute !! -"; mes "- Currently you're carrying -"; mes "- too many items with you. -"; mes "- Please try again -"; mes "- after you lose some weight. -"; close; } mes "[Austri]"; mes "If you bring me 3"; mes "Oridecon or Elunium"; mes "I can exchange them for"; mes "Bradium or Carnium."; mes "Just give me 50,000z."; next; switch(select("Oridecon to Bradium.:Elunium to Carnium.:Purified Bradium to Carnium.:No thanks.")) { case 1: setarray .@i[0],984,3,6224; //Oridecon -> Bradium break; case 2: setarray .@i[0],985,3,6223; //Elunium -> Carnium break; case 3: setarray .@i[0],6090,1,6223; //Purified_Bradium -> Carnium break; case 4: mes "[Austri]"; mes "Hmm..."; close; } if (countitem(.@i[0]) >= .@i[1] && Zeny >= 50000) { delitem .@i[0],.@i[1]; Zeny = Zeny - 50000; getitem .@i[2],1; mes "[Austri]"; if (.@i[0] == 6090) { mes "Refining with Refined Bradium"; mes "can be a little expensive."; mes "I can exchange it for some Carnium."; } else mes "Ok! Here's your "+getitemname(.@i[2])+"."; mes "Take it and use it well."; close; } mes "[Austri]"; mes "You better not be trying"; mes "to cheat me because you"; mes "don't have enough money"; mes "or "+getitemname(.@i[0])+"."; close; } prt_in,85,71,5 duplicate(Austri#ref) Austri#prt 826 payon_in01,14,125,5 duplicate(Austri#ref) Austri#pay 826 morocc_in,60,38,5 duplicate(Austri#ref) Austri#moc 826 // Malangdo Refiner //============================================================ malangdo,224,172,6 script Clink#mal_normal 544,{ disable_items; mes "[Clink]"; mes "My cool dad Holink said I have the world's greatest refine hammer!!"; mes "Meow Meow~"; mes "Who do you think I am?"; mes "Yes!!! You!! You want to refine?"; next; setarray .@indices[1], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW; for(.@i = 1; .@i<=10; set .@i,.@i+1) .@menu$ = .@menu$ + ( getequipisequiped(.@indices[.@i]) ? getequipname(.@indices[.@i]) : F_getpositionname(.@indices[.@i]) +"-[Empty]" ) +":"; .@part = .@indices[ select(.@menu$) ]; if (!getequipisequiped(.@part)) { mes "[Clink]"; switch(.@part) { case EQI_HEAD_TOP: mes "Dad said. There's no cure for stupidity..."; break; case EQI_ARMOR: mes "There's nothing to see here!!"; break; case EQI_HAND_L: mes "What an arrogant left hand this is!"; break; case EQI_HAND_R: mes "What an arrogant right hand this is!"; break; case EQI_GARMENT: mes "Get that dirty thing off my face!!"; break; case EQI_SHOES: mes "Kyaong~! Do not provoke me."; break; case EQI_ACC_L: case EQI_ACC_R: mes "Where is the accessory?"; break; case EQI_HEAD_MID: case EQI_HEAD_LOW: mes "Are you talking about the other head part?"; break; } close; } if (!getequipisenableref(.@part)) { mes "[Clink]"; mes "This can't be refined!!"; close; } .@refinerycnt = getequiprefinerycnt(.@part); //save refinery count if (.@refinerycnt >= 10) { mes "[Clink]"; mes "Perfect refining. Did I do this for you?"; close; } .@refineitemid = getequipid(.@part); // save id of the item setarray .@card[0], getequipcardid(.@part,0), getequipcardid(.@part,1), getequipcardid(.@part,2), getequipcardid(.@part,3); .@price = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_ZENY_COST); .@material = getequiprefinecost(.@part, REFINE_COST_NORMAL, REFINE_MATERIAL_ID); .@itemtype = getiteminfo( .@refineitemid, ITEMINFO_TYPE ); mes "[Clink]"; if( .@itemtype == IT_ARMOR ){ switch( getequiparmorlv( .@part ) ){ case 1: // Armor .@type$ = "armor"; mes "Hmm, an armor refine? Someone like you?"; break; default: // TODO: close; } }else if( .@itemtype == IT_WEAPON ){ switch( getequipweaponlv( .@part ) ){ case 1: // Level 1 Weapon .@type$ = "weapon"; mes "A level 1 weapon?"; mes "Urr... Annoying... Okay, let's try..."; break; case 2: // Level 2 Weapon .@type$ = "weapon"; mes "A level 2 weapon?"; break; case 3: // Level 3 Weapon .@type$ = "weapon"; mes "Woot!! A level 3 weapon? Impressive~"; break; case 4: // Level 4 Weapon .@type$ = "weapon"; mes "Wow!... A level 4 weapon~!!"; break; default: // TODO: close; } }else{ // TODO: close; } mes "You need ^ff9999"+getitemname(.@material)+"^000000 and ^ff9999"+.@price+"^000000 Zeny. Do you have them?"; next; if(select("Yes, I do!!:Forget about it!!") == 2) { mes "[Clink]"; mes "I knew it!!"; mes "I knew you were not worth trying my magical refining hammer for."; close; } if (getequippercentrefinery(.@part) < 100) { mes "[Clink]"; mes "Wow!!"; mes "This "+.@type$+" has been refined quite a bit, huh?"; mes "You do know that this might break, right?"; next; mes "[Clink]"; mes "If you break the "+.@type$+", you can never use it again."; mes "Cards and enchant effects..."; mes "the ^ff0000whole thing will disappear^000000."; mes "You still up for this~?"; next; if(select("Yes, I am!!:Forget about it!!") == 2) { mes "[Clink]"; mes "I knew it!!"; mes "You can't even take this big step. Don't think about refining..."; close; } } if (countitem(.@material) == 0 || Zeny < .@price) { mes "[Clink]"; mes "Hey you!! Didn't I tell you"; mes "that you need ^ff9999"+getitemname(.@material)+"^000000 and ^ff9999"+.@price+"^000000 Zeny??!!"; close; } delitem .@material,1; Zeny = Zeny-.@price; // anti-hack if (callfunc("F_IsEquipIDHack", .@part, .@refineitemid) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) || callfunc("F_IsEquipRefineHack", .@part, .@refinerycnt)) { mes "[Clink]"; emotion ET_FRET; mes "Wait a second..."; mes "Do you think I'm stupid?!"; mes "You switched the item while I wasn't looking! Get out of here!"; close; } if (getequippercentrefinery(.@part) <= rand(100)) { failedrefitem .@part; mes "[Clink]"; mes "Cry Hammer!! Cry!!!"; next; switch(rand(1,5)) { case 1: emotion ET_CRY; break; case 2: emotion ET_PROFUSELY_SWEAT; break; case 3: emotion ET_KEK; break; case 4: emotion ET_SCRATCH; break; case 5: emotion ET_BIGTHROB; break; } mes "[Clink]"; mes "Huh?! I failed?!"; next; mes "[Clink]"; mes "Arrgg~ It's all~ Broken...? What a pity~"; next; mes "[Clink]"; mes "Hey...!! Get me another one."; mes "This is not possible."; mes "How can my hammer fail from refining?"; close; } successrefitem .@part; mes "[Clink]"; mes "Cry Hammer!! Cry!!!"; next; emotion ET_CHUP; mes "[Clink]"; mes "Ok!! Perfect!!"; mes "There's nothing I can't refine"; mes "with this special hammer."; mes "You can praise me!!"; mes "What a day!!"; close; } // Renewal barter shops - script refine_barter_init -1,{ end; OnInit: if (getbattleflag("feature.barter")) { unloadnpc "Vurewell"; unloadnpc "Begnahd"; unloadnpc "Sade"; unloadnpc "Kahlamanlith"; unloadnpc "Dilemma"; unloadnpc "Tirehaus"; unloadnpc "Krugg"; unloadnpc "Hakhim"; unloadnpc "Abdula"; unloadnpc "Xenophon"; unloadnpc "Delight"; unloadnpc "Matestein"; unloadnpc "Fruel"; npcshopupdate "market_refine_prt_in",1010,200,999999; npcshopupdate "market_refine_payon",1010,200,999999; npcshopupdate "market_refine_morocc_in",1010,200,999999; npcshopupdate "market_refine_alberta_in",1010,200,999999; npcshopupdate "market_refine_yuno_in01",1010,200,999999; npcshopupdate "market_refine_ein_in01",1010,200,999999; npcshopupdate "market_refine_lhz_in02",1010,200,999999; npcshopupdate "market_refine_prt_in",1011,1000,999999; npcshopupdate "market_refine_payon",1011,1000,999999; npcshopupdate "market_refine_morocc_in",1011,1000,999999; npcshopupdate "market_refine_alberta_in",1011,1000,999999; npcshopupdate "market_refine_yuno_in01",1011,1000,999999; npcshopupdate "market_refine_ein_in01",1011,1000,999999; npcshopupdate "market_refine_lhz_in02",1011,1000,999999; } else { unloadnpc "market_refine_prt_in"; unloadnpc "market_refine_payon"; unloadnpc "market_refine_morocc_in"; unloadnpc "market_refine_alberta_in"; unloadnpc "market_refine_yuno_in01"; unloadnpc "market_refine_ein_in01"; unloadnpc "market_refine_lhz_in02"; unloadnpc "Dietrich#ns_prt"; unloadnpc "Pauline"; } end; } - marketshop market_refine_prt_in -1,1010:-1:999999,1011:-1:999999 - marketshop market_refine_payon -1,1010:-1:999999,1011:-1:999999 - marketshop market_refine_morocc_in -1,1010:-1:999999,1011:-1:999999 - marketshop market_refine_alberta_in -1,1010:-1:999999,1011:-1:999999 - marketshop market_refine_yuno_in01 -1,1010:-1:999999,1011:-1:999999 - marketshop market_refine_ein_in01 -1,1010:-1:999999,1011:-1:999999 - marketshop market_refine_lhz_in02 -1,1010:-1:999999,1011:-1:999999 prt_in,63,69,3 script Dietrich#ns_prt 4_M_02,{ mes "[" + strnpcinfo(1) + "]"; mes "We sell and exchange various ores used in smelting."; next; switch( select( "View basic smelting ores", "View advanced smelting ores", "View Ether smelting ores", "Cancel" ) ) { case 1: mes "[" + strnpcinfo(1) + "]"; mes "Phracon and Emveretarcon are available for use in smelting low-level weapons."; close2; callshop "market_refine_" + strnpcinfo(4); end; case 2: mes "[" + strnpcinfo(1) + "]"; mes "We are purifying Elunium Stone or Oridecon Stone, or exchanging them with Bradium or Carnium."; close2; callshop "barter_refine_1"; end; case 3: mes "[" + strnpcinfo(1) + "]"; mes "We add Etel Dust to existing smelting ores and replace them with Ether-bearing smelting ores."; close2; callshop "barter_refine_2"; end; case 4: mes "[" + strnpcinfo(1) + "]"; mes "If you lack the materials used for smelting, come anytime."; close; } end; OnInit: setunittitle getnpcid(0), ""; end; } payon,137,178,5 duplicate(Dietrich#ns_prt) Hakhim#2 4_M_ORIENT01 morocc_in,72,32,3 duplicate(Dietrich#ns_prt) Abdula#2 4W_M_03 alberta_in,21,63,5 duplicate(Dietrich#ns_prt) Xenophon#ns_albe 4_M_02 yuno_in01,164,27,4 duplicate(Dietrich#ns_prt) Delight#2 4_M_ORIENT01 ein_in01,18,82,5 duplicate(Dietrich#ns_prt) Matestein#2 4_M_02 lhz_in02,281,24,5 duplicate(Dietrich#ns_prt) Fruel#2 4_M_02 // Shadowdecon/Zelunium exchange npcs prt_in,64,57,3 script Pauline 4_M_02,{ mes "[" + strnpcinfo(1) + "]"; mes "Do you have " + mesitemlink( 25728 ) + " or " + mesitemlink( 25730 ) + "?"; mes "We will exchange them for refined products for use as smelting goods."; close2; callshop "barter_refine_3"; end; } payon,142,179,3 duplicate(Pauline) Jihu 4_M_ORIENT01 morocc_in,64,37,3 duplicate(Pauline) Marik 4W_M_03 alberta_in,24,63,5 duplicate(Pauline) Satana 4_M_02 yuno_in01,164,31,6 duplicate(Pauline) Dimir 4_M_ORIENT01 lhz_in02,275,23,5 duplicate(Pauline) Nemil 4_M_02 ein_in01,30,88,5 duplicate(Pauline) Galan 4_M_02