//===== eAthena Script =======================================
//= Kafra Express - Main Module
//===== By: ==================================================
//= Skotlex
//===== Current Version: =====================================
//= 5.4
//===== Compatible With: =====================================
//= eAthena SVN R3424+
//===== Description: =========================================
//= Part of the Kafra Express Script Package.
//= This module contains the main menu, plus the healing and
//= storage services.
//===== Additional Comments: =================================
//= See <http://www.eathena.deltaanime.net/board/index.php?showtopic=20290>
//= for indepth explanation of the Kafra Express Script Package.
//= Services available: comment/uncomment what you want (lines 37-104)
//= See config.txt for per-module configuration.
//============================================================
// F_KafraExpress (String "Kafra's name", String "kafra image file",
//int location (0 = Town Kafra, 1 = Dungeon Kafra, 2 = Both),
//String "save map", int save x, int save y)
function script F_KafraExpress {
set @name$,getarg(0);
set @ke_type,getarg(2);
if ($@kekp_reset)
set @kafraPass,0;
if (getarg(1) != "")
cutin getarg(1),2;
callfunc "F_keIntro",-1,"";
M_INIT:
set @discount, callfunc("F_keCost",1,100);
if (@ke_type == 1) goto MD_INIT;
menu
"- Leave",L_END,
"- Heal Service ("+($@keh_hpCost*@discount)+"z/10HP - "+($@keh_spCost*@discount)+"z/10SP)",L_HEAL,
"- Warp Service",M_WARP,
"- Use Storage ("+($@kes_cost*@discount)+"z)",L_STORAGE,
"- Use Guild Storage ("+($@kegs_cost*@discount)+"z)",L_GUILD_STORAGE,
"- Job Services",M_JOB,
"- Other Services",M_OTHER,
"- Save Respawn point",L_SAVE;
MD_INIT:
menu
"- Leave",L_END,
"- Heal Service ("+($@keh_hpCost*@discount)+"z/10HP - "+($@keh_spCost*@discount)+"z/10SP)",L_HEAL,
"- Warp Service",M_WARP,
"- Use Storage ("+($@kes_cost*@discount)+"z)",L_STORAGE,
"- Use Guild Storage ("+($@kegs_cost*@discount)+"z)",L_GUILD_STORAGE,
"- Job Services",M_JOB,
"- Other Services",M_OTHER,
"- Save Respawn point",L_SAVE;
M_WARP:
if (@ke_type == 3 && nif_q_done != 1)
goto L_DENIED;
if (@ke_type == 1)
goto MD_WARP;
menu
"- Return",M_INIT,
"- Dungeons",L_DUNGEON,
"- PvP Arena",L_PVP,
"- Guild Wars",L_GUILD_DUNGEON,
"- Towns",L_TOWN;
MD_WARP:
menu
"- Return",M_INIT,
"- Dungeons",L_DUNGEON,
"- PvP Arena",L_PVP,
"- Guild Wars",L_GUILD_DUNGEON,
"- Towns",L_TOWN;
M_JOB:
if (@ke_type == 1) goto MD_JOB;
menu
"- Return", M_INIT,
"- Change Job",L_JOB_CHANGE,
"- Swap Job",L_JOB_SWAP,
"- Stat/Skill Services",L_STATS,
"- Stat/Skill Market",L_STAT_MARKET,
"- Rental Service",L_RENT;
MD_JOB:
menu
"- Return", M_INIT,
"- Change Job",L_JOB_CHANGE,
"- Swap Job",L_JOB_SWAP,
"- Stat/Skill Services",L_STATS,
"- Stat/Skill Market",L_STAT_MARKET,
"- Rental Service",L_RENT;
M_OTHER:
if (@ke_type == 1) goto MD_OTHER;
menu
"- Return",M_INIT,
"- Bank Services",L_BANK,
"- Use Kafra Shop",L_SHOP,
"- Broadcast a message",L_BROADCAST,
"- Refine Services",L_REFINE,
"- Uncard Services",L_UNCARD,
"- Stylist Service",L_STYLE,
"- Use a Kafra Pass",L_PASS;
MD_OTHER:
menu
"- Return",M_INIT,
"- Bank Services",L_BANK,
"- Use Kafra Shop",L_SHOP,
"- Broadcast a message",L_BROADCAST,
"- Refine Services",L_REFINE,
"- Uncard Services",L_UNCARD,
"- Stylist Service",L_STYLE,
"- Use a Kafra Pass",L_PASS;
L_HEAL:
callfunc "F_keHeal";
goto M_INIT;
L_TOWN:
callfunc "F_keWarpTown";
goto M_WARP;
L_DUNGEON:
callfunc "F_keDungeonWarps", getarg(3);
goto M_WARP;
L_GUILD_DUNGEON:
callfunc "F_keWarpWOE";
goto M_WARP;
L_PVP:
callfunc "F_keWarpPvp";
goto M_WARP;
L_STORAGE:
callfunc "F_keStorage", getarg(1);
goto M_INIT;
L_GUILD_STORAGE:
callfunc "F_keGuildStorage", getarg(1);
goto M_INIT;
L_BANK:
callfunc "F_keBank";
goto M_OTHER;
L_SHOP:
callfunc "F_keShop",@ke_type, getarg(1);
goto M_OTHER;
L_BROADCAST:
callfunc "F_keBroadcast",getarg(3);
goto M_OTHER;
L_PASS:
callfunc "F_kePass";
goto M_OTHER;
L_REFINE:
callfunc "F_keRefine";
goto M_OTHER;
L_UNCARD:
callfunc "F_keUncard";
goto M_OTHER;
L_STYLE:
callfunc "F_keStylist";
goto M_OTHER;
L_JOB_CHANGE:
callfunc "F_keJobChange";
goto M_JOB;
L_JOB_SWAP:
callfunc "F_keJobSwap";
goto M_JOB;
L_STATS:
callfunc "F_keStats";
goto M_JOB;
L_STAT_MARKET:
callfunc "F_keStatMarket";
goto M_JOB;
L_RENT:
callfunc "F_keRent";
goto M_JOB;
L_SAVE:
if (@ke_type == 3 && nif_q_done != 1)
goto L_DENIED;
if ($@kewt_travel && @ke_type != 1) {
callfunc "F_keAddTravelTown", getarg(3);
}
if ($@kewd_travel && @ke_type != 0) {
callfunc "F_keAddTravelDungeon", getarg(3);
}
if ($@ke_saveOnSpot) {
getmapxy @map$,@x,@y,0;
savepoint @map$,@x,@y;
} else {
savepoint getarg(3),getarg(4),getarg(5);
}
emotion e_scissors;
goto M_INIT;
L_DENIED:
callfunc "F_keIntro", e_gg, "...no.";
goto M_INIT;
L_END:
mes "Thank you for using Kafra Services.";
close2;
cutin getarg(1), 255;
end;
}
//Function F_keIntro (emotion, message)
//Displays a message followed by an emotion, then a next button, and finally
//shows the intro message.
function script F_keIntro {
if (getarg(0) >= 0)
emotion getarg(0);
if (getarg(1) != "") {
mes getarg(1);
next;
}
mes "["+@name$+"]";
mes "Welcome to Kafra Corp. Always by your side, wherever you go.";
if(@kafraPass) mes "Your Kafra Pass is active,";
mes "How may I be of help?";
return;
}
//Function Heal, offers the heal subsystem.
function script F_keHeal {
set @qtyHP,MaxHp-Hp;
set @qtySP,MaxSp-Sp;
set @costHP, $@keh_hpCost*(MaxHp-Hp)/10;
set @costSP, $@keh_spCost*(MaxSp-Sp)/10;
set @costHPSP, @costHP+@costSP;
set @discount, callfunc("F_keCost",1,100);
if (@qtyHP + @qtySP == 0) {
callfunc "F_keIntro", -1, "...you don't need to be healed.";
return;
}
if (@qtyHP == 0) goto M_NO_HP;
if (@qtySP == 0) goto M_NO_SP;
menu "- Cancel",-,
"- Heal HP ("+(@costHP*@discount)+"z)",L_HEAL_HP,
"- Heal SP ("+(@costSP*@discount)+"z)",L_HEAL_SP,
"- Heal Both ("+(@costHPSP*@discount)+"z)",L_HEAL_ALL;
return;
M_NO_HP:
menu "- Cancel",-,
"- Heal SP ("+(@costSP*@discount)+"z)",L_HEAL_SP;
return;
M_NO_SP:
menu "- Cancel",-,
"- Heal HP ("+(@costHP*@discount)+"z)",L_HEAL_HP;
return;
L_HEAL_HP:
if (!(callfunc("F_keCharge",@costHP,100,0))) {
callfunc "F_keIntro", e_sry, "Sorry, you don't have enough to be healed.";
return;
}
emotion e_no1;
heal @qtyHP,0;
return;
L_HEAL_SP:
if (!(callfunc("F_keCharge",@costSP,100,0))) {
callfunc "F_keIntro", e_sry, "Sorry, you don't have enough to be healed.";
return;
}
emotion e_no1;
heal 0,@qtySP;
return;
L_HEAL_ALL:
if (!(callfunc("F_keCharge",@costHPSP,100,0))) {
callfunc "F_keIntro", e_sry, "Sorry, you don't have enough to be healed.";
return;
}
emotion e_no1;
heal @qtyHP,@qtySP;
return;
}
//Function storage: allows access to the storage facility
//The sent argument is the displaying image, so we can clear it afterwards.
function script F_keStorage {
if(basicskillcheck() > 0 && getskilllv(1) < 6) {
callfunc "F_keIntro", -1, "I am sorry, but you beed basic skill level 6 to use the storage.";
return;
}
if (!(callfunc("F_keCharge",$@kes_cost,100,1))) {
callfunc "F_keIntro", e_an, "Sorry, but you don't have enough Zeny.";
return;
}
mes "Thank for you using Kafra services.";
emotion e_thx;
close2;
openstorage;
cutin getarg(0), 255;
end;
}
//Function G Storage: Allows access to the Guild Storage
function script F_keGuildStorage {
if(basicskillcheck() > 0 && getskilllv(1) < 6) {
callfunc "F_keIntro", -1, "I am sorry, but you beed basic skill level 6 to use the storage.";
return;
}
if(getcharid(2) < 1) {
callfunc "F_keIntro", e_swt, "You can't use the Guild Storage if you don't belong to a guild!";
return;
}
if (callfunc("F_keCost",$@kegs_cost,100) > Zeny) {
callfunc "F_keIntro", e_an, "Sorry, but you don't have enough Zeny.";
return;
}
if (guildopenstorage(0) == 1) {
callfunc "F_keIntro", -1, "Sorry, the guild storage is currently in use by someone else. Try again later.";
return;
}
callfunc "F_keCharge",$@kegs_cost,100,1;
mes "Thank for you using Kafra services.";
emotion e_thx;
close2;
cutin getarg(0), 255;
end;
}
function script F_kePass {
if (@kafraPass) {
callfunc "F_keIntro", -1, "You already are using a Kafra Pass...";
return;
}
if (countitem(1084)<1) {
callfunc "F_keIntro", -1, "You obviously need a 'Kafra Pass' if you want to activate it.";
return;
}
delitem 1084,1;
set @kafraPass,1;
callfunc "F_keIntro", e_lv, "Your Kafra Pass has been activated.";
return;
}
//F_keCost(int cost, int discount%)
//Returns what would be the cost of a service considering the KafraPass.
//The discount value should be between 0 and 100
function script F_keCost {
if (@kafraPass) {
return getarg(0)*(100-getarg(1))/100;
}
return getarg(0);
}
//F_keCharge(int cost, int discount%, bool appliesKP)
//Charges for a service, using the KafraPass state and discount value.
//appliesKP marks if the cost savings apply for stocking Kafra Reserve Points
//Function returns 1 if successful, 0 if there's not enough zeny.
function script F_keCharge {
set @savings, 0;
if (@kafraPass)
set @savings, getarg(0)*getarg(1)/100;
set @cost, getarg(0)-@savings;
if (@cost > Zeny || @cost < 0) { // (@cost < 0) for overflow protection
return 0;
}
set Zeny, Zeny-@cost;
if (getarg(2) && @savings > 0 && $@kekp_reserveCost > 0) {
set @savings, @savings/$@kekp_reserveCost;
if (@savings < $@kekp_minReserve)
set @savings, $@kekp_minReserve;
if (@savings > $@kekp_maxReserve)
set @savings, $@kekp_maxReserve;
set RESRVPTS, RESRVPTS + @savings;
}
return 1;
}
//Function F_keWarp (int cost, int discount, int emotion, String map, int x, int y)
function script F_keWarp {
if (!(callfunc("F_keCharge",getarg(0),getarg(1),1))) {
callfunc "F_keIntro", e_an, "You don't have enough Zeny...";
return;
}
emotion getarg(2);
warp getarg(3),getarg(4),getarg(5);
end;
}