//===== eAthena Script =======================================
//= Kafra Express - Refining Module
//===== By: ==================================================
//= Skotlex
//===== Current Version: =====================================
//= 2.7
//===== Compatible With: =====================================
//= eAthena SVN R3424+
//===== Description: =========================================
//= Part of the Kafra Express Script Package.
//= Does item forging, ore purifying and repairing.
//= Can also sell phracon/emveretarcon
//===== Additional Comments: =================================
//= See config.txt for configuration.
//============================================================
- script keInit_refine -1,{
OnInit: //Load Config
donpcevent "keConfig::OnLoadRefine";
end;
}
function script F_keRefine {
function SF_refine;
function SF_repair;
function SF_purify;
function SF_sellOres;
do {
set @kmenu, select(
"- Return",
"- Refine Equipment",
"- Repair Equipment",
"- Buy Ores",
"- Purify Ores"
);
switch(@kmenu) {
case 2: //Refine
SF_refine();
break;
case 3: //Repair
SF_repair();
break;
case 4: //Buy Ore
SF_sellOres();
break;
case 5: //Purify Ore
SF_purify();
break;
}
} while (@kmenu > 1);
return;
//Subfunction SF_refine, presents the refining menu.
function SF_refine {
do {
set @part, select(
"- Cancel upgrading",
"- "+getequipname(1),
"- "+getequipname(2),
"- "+getequipname(3),
"- "+getequipname(4),
"- "+getequipname(5),
"- "+getequipname(6),
"- "+getequipname(7),
"- "+getequipname(8),
"- "+getequipname(9),
"- "+getequipname(10)
);
set @part, @part-1;
if (@part == 0)
break;
if (getequipisequiped(@part) == 0) {
callfunc "F_keIntro", e_swt, "There is nothing to refine there...";
} else
if(getequipisenableref(@part) == 0 && $@kerf_refineAll == 0) {
callfunc "F_keIntro", -1, "Sorry, this item cannot be refined.";
} else
if(getequiprefinerycnt(@part) >= $@kerf_maxLv) {
callfunc "F_keIntro", -1, "This item cannot be refined further.";
break;
} else {
switch (getequipweaponlv(@part))
{
case 0: //Armor
set @mat,985;
set @cost,$@kerf_armorCost;
break;
case 1:
set @mat,1010;
set @cost,$@kerf_weaponLv1Cost;
break;
case 2:
set @mat,1011;
set @cost,$@kerf_weaponLv2Cost;
break;
case 3:
set @mat,984;
set @cost,$@kerf_weaponLv3Cost;
break;
default:
set @mat,984;
set @cost,$@kerf_weaponLv4Cost;
break;
}
set @cost, callfunc("F_keCost",@cost,$@kerf_discount);
do {
if ($@kerf_safe==0 && getequippercentrefinery(@part) < 100) {
if ($@kerf_showChance) {
if (select(
"- Return ("+(100-getequippercentrefinery(@part))+"% chance refine will fail)",
"- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)") != 2)
break;
} else {
if (select(
"- Return (Upgrade not safe, item might break!)",
"- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)") != 2)
break;
}
} else {
if (select(
"- Refine (Need "+getitemname(@mat)+" and "+@cost+"z)",
"- Cancel") != 1)
break;
}
if (getequiprefinerycnt(@part) >= $@kerf_maxLv) {
callfunc "F_keIntro", e_ok, "This item has reached it's maximum level.";
break;
}
if (countitem(@mat) < 1) {
callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
break;
}
if (!(callfunc("F_keCharge",@cost,$@kerf_discount,1))) {
callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
break;
}
delitem @mat,1;
if ($@kerf_safe || getequippercentrefinery(@part)>rand(100)) {
successrefitem @part;
emotion e_rock;
} else {
failedrefitem @part;
callfunc "F_keIntro", e_swt, "...sorry.";
break;
}
} while (1);
}
} while (@part > 0);
return;
}
//Subfunction: SF_repair()
function SF_repair {
set @cost,callfunc("F_keCost",$@kerf_repairCost,$@kerf_repairDiscount);
do {
set @broken1,getbrokenid(1);
if(@broken1==NULL) {
callfunc "F_keIntro", -1, "You don't need anything repaired for now.";
return;
}
set @broken2,getbrokenid(2);
set @broken3,getbrokenid(3);
set @broken4,getbrokenid(4);
set @broken5,getbrokenid(5);
set @broken6,getbrokenid(6);
set @broken7,getbrokenid(7);
set @broken8,getbrokenid(8);
set @broken9,getbrokenid(9);
set @broken10,getbrokenid(10);
if ($@kerf_repairSteel)
set @str$,"- Cancel (Repairing costs "+@cost+"z and 1 "+getitemname(999);
else
set @str$,"- Cancel (Repairing costs "+@cost+"z)";
set @idRepair, select(
@str$,
getitemname(@broken1),
getitemname(@broken2),
getitemname(@broken3),
getitemname(@broken4),
getitemname(@broken5),
getitemname(@broken6),
getitemname(@broken7),
getitemname(@broken8),
getitemname(@broken9),
getitemname(@broken10)
);
set @idRepair, @idRepair-1;
if (@idRepair == 0) break;
if ($@kerf_repairSteel && countitem(999) < 1) {
callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
return;
}
if (!(callfunc("F_keCharge", $@kerf_repairCost, $@kerf_repairDiscount,1))) {
callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
return;
}
if ($@kerf_repairSteel) delitem 999,1;
repair(@idRepair);
emotion e_lv2;
} while (@idRepair > 0);
}
//Subfunction: SF_purify()
function SF_purify {
if ($@kerf_purifyAll) {
set @submenu, select (
"- Return",
"- Purify "+getitemname(984)+" (need 5 "+getitemname(756)+")",
"- Purify "+getitemname(985)+" (need 5 "+getitemname(757)+")",
"- Purify "+getitemname(998)+" (need 2 "+getitemname(1002)+")",
"- Temper "+getitemname(999)+" (need 5 "+getitemname(998)+", 1 "+getitemname(1003)+")",
"- Temper "+getitemname(994)+" (need 10 "+getitemname(990)+")",
"- Temper "+getitemname(995)+" (need 10 "+getitemname(991)+")",
"- Temper "+getitemname(996)+" (need 10 "+getitemname(992)+")",
"- Temper "+getitemname(997)+" (need 10 "+getitemname(993)+")",
"- Temper "+getitemname(1000)+" (need 10 "+getitemname(1001)+")"
);
} else {
set @submenu, select(
"- Return",
"- Purify "+getitemname(984)+" (need 5 "+getitemname(756)+")",
"- Purify "+getitemname(985)+" (need 5 "+getitemname(757)+")"
);
}
switch (@submenu) {
case 2: //Oridecon
set @item, 984;
set @rough, 756;
set @qty, 5;
break;
case 3: //Elunium
set @item, 985;
set @rough, 757;
set @qty, 5;
break;
case 4: //Iron
set @item, 998;
set @rough, 1002;
set @qty, 2;
break;
case 5: //Steel
set @item,999;
set @rough,998;
set @qty,5;
set @rough2,1003;
set @qty2,1;
set @count,countitem(@rough1);
set @count2,countitem(@rough2);
if (@count < @qty || @count2 < @qty2) {
callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
return;
}
set @count, @count/@qty;
set @count2, @count2/@qty2;
if (@count2 < @count)
set @count,@count2;
delitem @rough2,@qty2*@count;
break;
case 6: //Fire
set @item, 994;
set @rough, 990;
set @qty, 10;
break;
case 7: //Ice
set @item, 995;
set @rough, 991;
set @qty, 10;
break;
case 8: //Wind
set @item, 996;
set @rough, 992;
set @qty, 10;
break;
case 9: //Earth
set @item, 997;
set @rough, 993;
set @qty, 10;
break;
case 10: //Star
set @item, 1000;
set @rough, 1001;
set @qty, 10;
break;
default:
return;
}
set @count,countitem(@rough);
if (@count < @qty) {
callfunc "F_keIntro", e_ag, "Sorry, you don't have the materials I need.";
return;
}
set @count, @count/@qty;
delitem @rough,@qty*@count;
getitem @item,@count;
emotion e_paper;
}
//Subfunction: SF_sellOres()
function SF_sellOres {
do {
set @submenu, select(
"- Return",
"- Buy "+getitemname(1010)+" (200z each)",
"- Buy "+getitemname(1011)+" (1000z each)"
);
switch (@submenu) {
case 2: //Phracon
set @mat, 1010;
set @cost, 200;
break;
case 3: //Emveratarcon
set @mat, 1011;
set @cost, 1000;
break;
default:
return;
}
input @qty;
set @cost,@cost*@qty;
if (@qty < 1) {
callfunc "F_keIntro", e_pif, "That is NOT a valid quantity...";
} else if (@cost > Zeny) {
callfunc "F_keIntro", e_ag, "Sorry, you don't have enough zeny.";
} else if (@cost < 0) {
callfunc "F_keIntro", e_swt2, "Sorry, that's too much! Try buying less...";
} else {
set Zeny,Zeny-@cost;
getitem @mat,@qty;
emotion e_paper;
}
} while (@submenu > 1);
}
}