summaryrefslogtreecommitdiff
path: root/npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt
diff options
context:
space:
mode:
Diffstat (limited to 'npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt')
-rw-r--r--npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt1066
1 files changed, 533 insertions, 533 deletions
diff --git a/npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt b/npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt
index 0093fe2ae..766918fd0 100644
--- a/npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt
+++ b/npc/custom/eAAC_Scripts/kafraExpress/ke_jobchange.txt
@@ -1,533 +1,533 @@
-//===== eAthena Script =======================================
-//= Kafra Express - Job Changing Module
-//===== By: ==================================================
-//= Skotlex
-//===== Current Version: =====================================
-//= 3.5
-//===== Compatible With: =====================================
-//= eAthena SVN R3579+
-//===== Description: =========================================
-//= Part of the Kafra Express Script Package.
-//= Enables job changing through the class trees.
-//= Novice -> 1st Class, 1st Class -> 2nd Class, rebirths, etc
-//===== Additional Comments: =================================
-//= See config.txt for configuration.
-//= When using Upper Job policy, previous jobs are stored in
-//= the server wide variables kej_class1 and kej_class2
-//============================================================
-
-- script keInit_jobchange -1,{
-OnInit: //Load Config
- donpcevent "keConfig::OnLoadJobChange";
- end;
-}
-
-function script F_keJobChange {
-
- function SF_to1stJob;
- function SF_to2ndJob;
- function SF_getJobNames;
- function SF_testChangeJob;
- function SF_changeJob;
-
- set @job, callfunc("GF_getJobLevel", class);
- set @upper, Upper; //Because it is changed when rebirthing
- set @reset, 0; //Base Level is reset only on rebirths
- switch (@job) {
- case 0: //Novices
- if ($@kejc_skipNovice)
- set @jobLv, 0; //jobLv is used again when checking for S.Novice's base level restriction.
- else
- set @jobLv, 10;
- if (SF_testChangeJob(0,0,@jobLv))
- SF_to1stJob(0);
- break;
- case 1: //First Classes
- if (SF_testChangeJob($@kejc_cost2ND,$@kejc_base2ND,$@kejc_job2ND))
- SF_to2ndJob();
- break;
- case 2: //Second Classes
- if (Upper == 0 && BaseClass != Job_Taekwon) {
- if (SF_testChangeJob($@kejc_costRebirth,$@kejc_baseRebirth,$@kejc_jobRebirth)) {
- set @upper, 1;
- if ($@kejc_skipNovice)
- SF_to1stJob(1);
- else
- SF_changeJob @job,Upper,Job_Novice,1,0,0,$@kejc_costRebirth,1,$@kejc_rebirthReset;
- }
- break;
- }
- default: //Dead End
- callfunc "F_keIntro", e_swt2, "I cannot change you from your current job.";
- break;
- }
- return;
-
-//Handles changing to 1st job.
-function SF_to1stJob {
- do {
- set @submenu, 1;
- if (@upper == 1 && $@kejc_upperPolicy && kej_class1) {
- switch (kej_class1) {
- case Job_Acolyte:
- set @submenu, 2;
- break;
- case Job_Archer:
- set @submenu, 3;
- break;
- case Job_Mage:
- set @submenu, 4;
- break;
- case Job_Merchant:
- set @submenu, 5;
- break;
- case Job_Swordman:
- set @submenu, 6;
- break;
- case Job_Thief:
- set @submenu, 7;
- break;
- case Job_Taekwon:
- set @submenu, 8;
- break;
- }
- }
- if (@submenu == 1) {
- SF_getJobNames 8,Job_Acolyte,Job_Archer,Job_Mage,Job_Merchant,Job_Swordman,Job_Thief,Job_Taekwon,Job_SuperNovice;
- switch (@upper) {
- case 0: //All
- set @submenu, select(
- "- Cancel job change",
- "- "+@name1$,
- "- "+@name2$,
- "- "+@name3$,
- "- "+@name4$,
- "- "+@name5$,
- "- "+@name6$,
- "- "+@name7$,
- "- "+@name8$
- );
- break;
- case 1: //No Taekwon/S.Novice
- set @submenu, select(
- "- Cancel job change",
- "- "+@name1$,
- "- "+@name2$,
- "- "+@name3$,
- "- "+@name4$,
- "- "+@name5$,
- "- "+@name6$
- );
- break;
- case 2: //No Taekwon
- set @submenu, select(
- "- Cancel job change",
- "- "+@name1$,
- "- "+@name2$,
- "- "+@name3$,
- "- "+@name4$,
- "- "+@name5$,
- "- "+@name6$,
- "- "+@name8$
- );
- if (@submenu == 8)
- set @submenu, 9;
- break;
- }
- }
- switch (@submenu) {
- case 2: //Acolyte
- set @newJob,Job_Acolyte;
- set @weapon, $@kejc_wAcolyte;
- break;
- case 3: //Archer
- set @newJob,Job_Archer;
- set @weapon, $@kejc_wArcher;
- break;
- case 4: //Mage
- set @newJob,Job_Mage;
- set @weapon, $@kejc_wMage;
- break;
- case 5: //Merchant
- set @newJob,Job_Merchant;
- set @weapon, $@kejc_wMerchant;
- break;
- case 6: //Swordman
- set @newJob,Job_Swordman;
- set @weapon, $@kejc_wSwordman;
- break;
- case 7: //Thief
- set @newJob,Job_Thief;
- set @weapon, $@kejc_wThief;
- break;
- case 8: //Taekwon
- set @newJob,Job_Taekwon;
- set @weapon, $@kejc_wTaekwon;
- break;
- case 9: //S. Novice
- set @newJob,Job_SuperNovice;
- set @weapon, $@kejc_wSuperNovice;
- if (SF_testChangeJob(0,$@kejc_baseSN,@jobLv) == 0)
- return;
- break;
- }
- if (@submenu > 1) {
- if (getarg(0)) { //Skipping High Novice, charge rebirth costs.
- if (SF_changeJob(@job,Upper,@newJob,1,@weapon,0,$@kejc_costRebirth,2,$@kejc_rebirthReset))
- return;
- } else {
- if (SF_changeJob(@job,Upper,@newJob,@upper,@weapon,0,0,2,0))
- return;
- }
- }
- } while (@submenu > 1);
-}
-
-function SF_to2ndJob {
- do {
- set @submenu, 1;
- if (@upper == 1 && $@kejc_upperPolicy && kej_class2) {
- switch (kej_class2) {
- case Job_Priest:
- case Job_Hunter:
- case Job_Wizard:
- case Job_Blacksmith:
- case Job_Knight:
- case Job_Knight2:
- case Job_Assassin:
- case Job_Star_Gladiator:
- case Job_Star_Gladiator2:
- set @submenu, 2;
- break;
- case Job_Monk:
- case Job_Bard:
- case Job_Dancer:
- case Job_Sage:
- case Job_Alchem:
- case Job_Crusader:
- case Job_Crusader2:
- case Job_Rogue:
- case Job_Soul_Linker:
- set @submenu, 3;
- break;
- }
- }
- if (@submenu == 1) { //Fetch from menu.
- switch (BaseClass) {
- case Job_Acolyte:
- SF_getJobNames 2,Job_Priest,Job_Monk;
- break;
- case Job_Archer:
- SF_getJobNames 3,Job_Hunter,Job_Bard,Job_Dancer;
- if (sex == 0)
- set @name2$, @name3$;
- break;
- case Job_Mage:
- SF_getJobNames 2,Job_Wizard,Job_Sage;
- break;
- case Job_Merchant:
- SF_getJobNames 2,Job_Blacksmith,Job_Alchem;
- break;
- case Job_Swordman:
- SF_getJobNames 2,Job_Knight,Job_Crusader;
- break;
- case Job_Thief:
- SF_getJobNames 2,Job_Assassin,Job_Rogue;
- break;
- case Job_Taekwon:
- SF_getJobNames 2,Job_Star_Gladiator,Job_Soul_Linker;
- break;
- default:
- callfunc "F_keIntro", e_swt2, "I don't know how to change you from your current job.";
- return;
- }
- set @submenu, select(
- "- Cancel job change",
- "- "+@name1$,
- "- "+@name2$
- );
- }
- switch (BaseClass) {
- case Job_Acolyte:
- switch (@submenu) {
- case 2: //Priest
- set @newJob,Job_Priest;
- set @weapon,$@kejc_wPriest;
- set @weapon2,$@kejc_w2Priest;
- break;
- case 3: //Monk
- set @newJob,Job_Monk;
- set @weapon,$@kejc_wMonk;
- set @weapon2,$@kejc_w2Monk;
- break;
- }
- break;
- case Job_Archer:
- switch (@submenu) {
- case 2: //Hunter
- set @newJob,Job_Hunter;
- set @weapon,$@kejc_wHunter;
- set @weapon2,$@kejc_w2Hunter;
- break;
- case 3: //Bard/Dancer
- if (sex == 1) { //Bard
- set @newJob,Job_Bard;
- set @weapon,$@kejc_wBard;
- set @weapon2,$@kejc_w2Bard;
- } else { //Dancer
- set @newJob,Job_Dancer;
- set @weapon,$@kejc_wDancer;
- set @weapon2,$@kejc_w2Dancer;
- }
- break;
- }
- break;
- case Job_Mage:
- switch (@submenu) {
- case 2: //Wizard
- set @newJob,Job_Wizard;
- set @weapon,$@kejc_wWizard;
- set @weapon2,$@kejc_w2Wizard;
- break;
- case 3: //Sage
- set @newJob,Job_Sage;
- set @weapon,$@kejc_wSage;
- set @weapon2,$@kejc_w2Sage;
- break;
- }
- break;
- case Job_Merchant:
- switch (@submenu) {
- case 2: //Blacksmith
- set @newJob,Job_Blacksmith;
- set @weapon,$@kejc_wBlacksmith;
- set @weapon2,$@kejc_w2Blacksmith;
- break;
- case 3: //Alchemist
- set @newJob,Job_Alchem;
- set @weapon,$@kejc_wAlchemist;
- set @weapon2,$@kejc_w2Alchemist;
- break;
- }
- break;
- case Job_Swordman:
- switch (@submenu) {
- case 2: //Knight
- set @newJob,Job_Knight;
- set @weapon,$@kejc_wKnight;
- set @weapon2,$@kejc_w2Knight;
- break;
- case 3: //Crusader
- set @newJob,Job_Crusader;
- set @weapon,$@kejc_wCrusader;
- set @weapon2,$@kejc_w2Crusader;
- break;
- default:
- mes "uh oh";
- break;
- }
- break;
- case Job_Thief:
- switch (@submenu) {
- case 2: //Assassin
- set @newJob,Job_Assassin;
- set @weapon,$@kejc_wAssassin;
- set @weapon2,$@kejc_w2Assassin;
- break;
- case 3: //Rogue
- set @newJob,Job_Rogue;
- set @weapon,$@kejc_wRogue;
- set @weapon2,$@kejc_w2Rogue;
- break;
- }
- break;
- case Job_Taekwon:
- switch (@submenu) {
- case 2: //Star Gladiator
- set @newJob,Job_Star_Gladiator;
- set @weapon,$@kejc_wStarGladiator;
- set @weapon2,$@kejc_w2StarGladiator;
- break;
- case 3: //Soul Linker
- set @newJob,Job_Soul_Linker;
- set @weapon,$@kejc_wSoulLinker;
- set @weapon2,$@kejc_w2SoulLinker;
- break;
- }
- break;
- }
- if (@submenu > 1) {
- if (SF_changeJob(@job,Upper,@newJob,@upper,@weapon,@weapon2,$@kejc_cost2ND,0,0))
- return;
- }
- } while (@submenu > 1);
-}
-
-//SubFunction: SF_testChangeJob(Zeny, BaseLv, JobLv)
-//Function that checks if the player qualifies for job changing.
-function SF_testChangeJob {
- set @fail, 0;
- if (Zeny < getarg(0))
- set @fail, 1;
- if (BaseLevel < getarg(1))
- set @fail, @fail+2;
- if (JobLevel < getarg(2))
- set @fail, @fail+4;
- if (@fail > 0) {
- if (@fail&1)
- mes "You need "+getarg(0)+"z for the conversion process.";
- if (@fail&2)
- mes "You need to be at least Lv "+getarg(1)+".";
- if (@fail&4)
- mes "You need at least job Lv "+getarg(2)+".";
- callfunc "F_keIntro", e_pif, "Sorry, you don't qualify for a job change yet.";
- return 0;
- }
-
- if (SkillPoint > 0 && $@kejc_skillsPolicy == 0) {
- callfunc "F_keIntro", e_dots, "Sorry, use your remaining Skill points before being able to change class.";
- return 0;
- }
- return 1;
-}
-
-//SubFunction: SF_changeJob (CurrentJobLv, CurrentJobType, NewJobBase, NewJobType
-//Weapon, Weapon2, Zeny, WipeSkills, ResetLv)
-//Attempts to change to the Jobgiven.
-//CurrentJobLv is 0-3 (novice, 1st class, 2nd class, s.novice)
-//Type is 0-2 (Normal, Advanced Class, Baby)
-//Weapon is the ID of the weapon to grant
-//Weapon2 is the alternative weapon granted when your job level is above $@kejc_wBonusLv
-//Zeny is the money required (if negative, it is money awarded)
-//WipeSkills if 1, indicates that skills should be wiped,
-//if 2, it means basic skills have to be given back
-//Reset Level indicates the base lv must be reset to 1.
-//Note: Zeny/Base/Job requirements should had been checked with SF_testChangeJob already!
-function SF_changeJob {
- set @newjob,getarg(2);
- set @newtype,getarg(3);
- set @weapon,getarg(4);
- set @weapon2,getarg(5);
- set @cost,getarg(6);
- set @wipeSkill,getarg(7);
- set @resetLv,getarg(8);
-
- set @jobStr$, callfunc("GF_getJobName2",@newjob, @newtype);
- if (@wipeSkill == 0 && SkillPoint > 0 && $@kejc_skillsPolicy == 1) {
- set @selection, select(
- "- Do not change yet",
- "- Change to "+@jobStr$+" (skill points lost)",
- "- View details"
- );
- } else {
- set @selection, select(
- "- Cancel",
- "- Change to "+@jobStr$,
- "- View details"
- );
- }
- switch (@selection) {
- case 3: //Details
- mes "Okay.. listen up:";
- next;
- mes "["+@name$+"]";
- mes "Changing to "+@jobStr$+" now means:";
- if (@wipeSkill == 0 && SkillPoint > 0 && $@kejc_skillsPolicy == 1)
- mes "- You will lose your "+SkillPoint+" unused skill points.";
- else if (@wipeSkill == 1)
- mes "- You will lose all your skills.";
- if (@resetLv)
- mes "- Your base level will be reset to 1.";
- if (@cost > 0)
- mes "- You will be charged "+@cost+"z.";
- else if (@cost < 0)
- mes "- You will be aided with "+(0-@cost)+"z.";
- if (@weapon > 0) {
- if (@weapon2 > 0 && $@kejc_wBonusLv) {
- if (JobLevel < $@kejc_wBonusLv) {
- mes "- You will receive a "+getitemname(@weapon)+"["+getitemslots(@weapon)+"].";
- mes "- If you wait until Job Lv"+$@kejc_wBonusLv+", you can receive instead a "+getitemname(@weapon2)+"["+getitemslots(@weapon)+"].";
- } else {
- mes "- You will receive a "+getitemname(@weapon2)+"["+getitemslots(@weapon)+"] for reaching Job Lv"+$@kejc_wBonusLv+".";
- }
- } else
- mes "- You will receive a "+getitemname(@weapon)+".";
- }
- mes "So... will you change?";
- if (select(
- "- Cancel",
- "- Change to "+@jobStr$
- ) != 2) {
- callfunc "F_keIntro", e_dots, "...alright.";
- return 0;
- }
- callfunc "F_keIntro", -1, "Enjoy your new Job.";
- case 2: //Change
- //Set/Unset job path variables as needed.
- if($@kejc_upperPolicy) {
- set @class,getarg(0);
- set @type, getarg(1);
- if(@class == 1 && @type == 0)
- set kej_class1,class; //Advancing to second class, so...
- if(@class == 2)
- set kej_class2,class; //Only way of being here is by doing a rebirth
- if(@type > 0)
- set kej_class1,0; //Clear when one is a high class
- if(@type > 0 && @class == 1)
- set kej_class2,0; //Clear when leaving high 1st class
- }
- if (@resetLv) {
- jobchange Job_Novice_High; //Done to give players those 100 points from High classes
- resetlvl(1);
- }
- if (@wipeSkill) {
- resetskill;
- setoption(0);
- set SkillPoint,0;
- } else if ($@kejc_skillsPolicy == 1)
- set SkillPoint,0;
- if (@wipeSkill>1)
- skill 1,9,0;
- if($@kejc_resetDye)
- setlook 7,0;
- jobchange @newjob, @newtype;
- if ($@kejc_announce)
- announce strcharinfo(0)+" has been promoted to "+@jobStr$+"!",8;
- set Zeny,Zeny-@cost;
- if ($@kejc_weaponPolicy && @weapon > 0) {
- if ($@kejc_wBonusLv && @weapon2 > 0) {
- if (JobLevel < $@kejc_wBonusLv)
- getitem @weapon,1;
- else
- getitem @weapon2,1;
- } else
- getitem @weapon,1;
- }
- emotion e_grat;
- return 1;
- default: //Cancel...
- callfunc "F_keIntro", e_dots, "...alright.";
- return 0;
- }
-}
-//SubFunction: SF_getJobNames(Qty, Jobid1, Jobid2,...)
-//Workaround until eA gets a fix for the bug where you can't use callfunc or
-//callsub within a menu
-function SF_getJobNames {
- switch (getarg(0)) {
- case 8:
- set @name8$, callfunc("GF_getJobName2",getarg(8),@upper);
- set @name7$, callfunc("GF_getJobName2",getarg(7),@upper);
- set @name6$, callfunc("GF_getJobName2",getarg(6),@upper);
- set @name5$, callfunc("GF_getJobName2",getarg(5),@upper);
- set @name4$, callfunc("GF_getJobName2",getarg(4),@upper);
- case 3:
- set @name3$, callfunc("GF_getJobName2",getarg(3),@upper);
- case 2:
- set @name2$, callfunc("GF_getJobName2",getarg(2),@upper);
- set @name1$, callfunc("GF_getJobName2",getarg(1),@upper);
- }
- return;
-}
-
-}
+//===== eAthena Script =======================================
+//= Kafra Express - Job Changing Module
+//===== By: ==================================================
+//= Skotlex
+//===== Current Version: =====================================
+//= 3.5
+//===== Compatible With: =====================================
+//= eAthena SVN R3579+
+//===== Description: =========================================
+//= Part of the Kafra Express Script Package.
+//= Enables job changing through the class trees.
+//= Novice -> 1st Class, 1st Class -> 2nd Class, rebirths, etc
+//===== Additional Comments: =================================
+//= See config.txt for configuration.
+//= When using Upper Job policy, previous jobs are stored in
+//= the server wide variables kej_class1 and kej_class2
+//============================================================
+
+- script keInit_jobchange -1,{
+OnInit: //Load Config
+ donpcevent "keConfig::OnLoadJobChange";
+ end;
+}
+
+function script F_keJobChange {
+
+ function SF_to1stJob;
+ function SF_to2ndJob;
+ function SF_getJobNames;
+ function SF_testChangeJob;
+ function SF_changeJob;
+
+ set @job, callfunc("GF_getJobLevel", class);
+ set @upper, Upper; //Because it is changed when rebirthing
+ set @reset, 0; //Base Level is reset only on rebirths
+ switch (@job) {
+ case 0: //Novices
+ if ($@kejc_skipNovice)
+ set @jobLv, 0; //jobLv is used again when checking for S.Novice's base level restriction.
+ else
+ set @jobLv, 10;
+ if (SF_testChangeJob(0,0,@jobLv))
+ SF_to1stJob(0);
+ break;
+ case 1: //First Classes
+ if (SF_testChangeJob($@kejc_cost2ND,$@kejc_base2ND,$@kejc_job2ND))
+ SF_to2ndJob();
+ break;
+ case 2: //Second Classes
+ if (Upper == 0 && BaseClass != Job_Taekwon) {
+ if (SF_testChangeJob($@kejc_costRebirth,$@kejc_baseRebirth,$@kejc_jobRebirth)) {
+ set @upper, 1;
+ if ($@kejc_skipNovice)
+ SF_to1stJob(1);
+ else
+ SF_changeJob @job,Upper,Job_Novice,1,0,0,$@kejc_costRebirth,1,$@kejc_rebirthReset;
+ }
+ break;
+ }
+ default: //Dead End
+ callfunc "F_keIntro", e_swt2, "I cannot change you from your current job.";
+ break;
+ }
+ return;
+
+//Handles changing to 1st job.
+function SF_to1stJob {
+ do {
+ set @submenu, 1;
+ if (@upper == 1 && $@kejc_upperPolicy && kej_class1) {
+ switch (kej_class1) {
+ case Job_Acolyte:
+ set @submenu, 2;
+ break;
+ case Job_Archer:
+ set @submenu, 3;
+ break;
+ case Job_Mage:
+ set @submenu, 4;
+ break;
+ case Job_Merchant:
+ set @submenu, 5;
+ break;
+ case Job_Swordman:
+ set @submenu, 6;
+ break;
+ case Job_Thief:
+ set @submenu, 7;
+ break;
+ case Job_Taekwon:
+ set @submenu, 8;
+ break;
+ }
+ }
+ if (@submenu == 1) {
+ SF_getJobNames 8,Job_Acolyte,Job_Archer,Job_Mage,Job_Merchant,Job_Swordman,Job_Thief,Job_Taekwon,Job_SuperNovice;
+ switch (@upper) {
+ case 0: //All
+ set @submenu, select(
+ "- Cancel job change",
+ "- "+@name1$,
+ "- "+@name2$,
+ "- "+@name3$,
+ "- "+@name4$,
+ "- "+@name5$,
+ "- "+@name6$,
+ "- "+@name7$,
+ "- "+@name8$
+ );
+ break;
+ case 1: //No Taekwon/S.Novice
+ set @submenu, select(
+ "- Cancel job change",
+ "- "+@name1$,
+ "- "+@name2$,
+ "- "+@name3$,
+ "- "+@name4$,
+ "- "+@name5$,
+ "- "+@name6$
+ );
+ break;
+ case 2: //No Taekwon
+ set @submenu, select(
+ "- Cancel job change",
+ "- "+@name1$,
+ "- "+@name2$,
+ "- "+@name3$,
+ "- "+@name4$,
+ "- "+@name5$,
+ "- "+@name6$,
+ "- "+@name8$
+ );
+ if (@submenu == 8)
+ set @submenu, 9;
+ break;
+ }
+ }
+ switch (@submenu) {
+ case 2: //Acolyte
+ set @newJob,Job_Acolyte;
+ set @weapon, $@kejc_wAcolyte;
+ break;
+ case 3: //Archer
+ set @newJob,Job_Archer;
+ set @weapon, $@kejc_wArcher;
+ break;
+ case 4: //Mage
+ set @newJob,Job_Mage;
+ set @weapon, $@kejc_wMage;
+ break;
+ case 5: //Merchant
+ set @newJob,Job_Merchant;
+ set @weapon, $@kejc_wMerchant;
+ break;
+ case 6: //Swordman
+ set @newJob,Job_Swordman;
+ set @weapon, $@kejc_wSwordman;
+ break;
+ case 7: //Thief
+ set @newJob,Job_Thief;
+ set @weapon, $@kejc_wThief;
+ break;
+ case 8: //Taekwon
+ set @newJob,Job_Taekwon;
+ set @weapon, $@kejc_wTaekwon;
+ break;
+ case 9: //S. Novice
+ set @newJob,Job_SuperNovice;
+ set @weapon, $@kejc_wSuperNovice;
+ if (SF_testChangeJob(0,$@kejc_baseSN,@jobLv) == 0)
+ return;
+ break;
+ }
+ if (@submenu > 1) {
+ if (getarg(0)) { //Skipping High Novice, charge rebirth costs.
+ if (SF_changeJob(@job,Upper,@newJob,1,@weapon,0,$@kejc_costRebirth,2,$@kejc_rebirthReset))
+ return;
+ } else {
+ if (SF_changeJob(@job,Upper,@newJob,@upper,@weapon,0,0,2,0))
+ return;
+ }
+ }
+ } while (@submenu > 1);
+}
+
+function SF_to2ndJob {
+ do {
+ set @submenu, 1;
+ if (@upper == 1 && $@kejc_upperPolicy && kej_class2) {
+ switch (kej_class2) {
+ case Job_Priest:
+ case Job_Hunter:
+ case Job_Wizard:
+ case Job_Blacksmith:
+ case Job_Knight:
+ case Job_Knight2:
+ case Job_Assassin:
+ case Job_Star_Gladiator:
+ case Job_Star_Gladiator2:
+ set @submenu, 2;
+ break;
+ case Job_Monk:
+ case Job_Bard:
+ case Job_Dancer:
+ case Job_Sage:
+ case Job_Alchem:
+ case Job_Crusader:
+ case Job_Crusader2:
+ case Job_Rogue:
+ case Job_Soul_Linker:
+ set @submenu, 3;
+ break;
+ }
+ }
+ if (@submenu == 1) { //Fetch from menu.
+ switch (BaseClass) {
+ case Job_Acolyte:
+ SF_getJobNames 2,Job_Priest,Job_Monk;
+ break;
+ case Job_Archer:
+ SF_getJobNames 3,Job_Hunter,Job_Bard,Job_Dancer;
+ if (sex == 0)
+ set @name2$, @name3$;
+ break;
+ case Job_Mage:
+ SF_getJobNames 2,Job_Wizard,Job_Sage;
+ break;
+ case Job_Merchant:
+ SF_getJobNames 2,Job_Blacksmith,Job_Alchem;
+ break;
+ case Job_Swordman:
+ SF_getJobNames 2,Job_Knight,Job_Crusader;
+ break;
+ case Job_Thief:
+ SF_getJobNames 2,Job_Assassin,Job_Rogue;
+ break;
+ case Job_Taekwon:
+ SF_getJobNames 2,Job_Star_Gladiator,Job_Soul_Linker;
+ break;
+ default:
+ callfunc "F_keIntro", e_swt2, "I don't know how to change you from your current job.";
+ return;
+ }
+ set @submenu, select(
+ "- Cancel job change",
+ "- "+@name1$,
+ "- "+@name2$
+ );
+ }
+ switch (BaseClass) {
+ case Job_Acolyte:
+ switch (@submenu) {
+ case 2: //Priest
+ set @newJob,Job_Priest;
+ set @weapon,$@kejc_wPriest;
+ set @weapon2,$@kejc_w2Priest;
+ break;
+ case 3: //Monk
+ set @newJob,Job_Monk;
+ set @weapon,$@kejc_wMonk;
+ set @weapon2,$@kejc_w2Monk;
+ break;
+ }
+ break;
+ case Job_Archer:
+ switch (@submenu) {
+ case 2: //Hunter
+ set @newJob,Job_Hunter;
+ set @weapon,$@kejc_wHunter;
+ set @weapon2,$@kejc_w2Hunter;
+ break;
+ case 3: //Bard/Dancer
+ if (sex == 1) { //Bard
+ set @newJob,Job_Bard;
+ set @weapon,$@kejc_wBard;
+ set @weapon2,$@kejc_w2Bard;
+ } else { //Dancer
+ set @newJob,Job_Dancer;
+ set @weapon,$@kejc_wDancer;
+ set @weapon2,$@kejc_w2Dancer;
+ }
+ break;
+ }
+ break;
+ case Job_Mage:
+ switch (@submenu) {
+ case 2: //Wizard
+ set @newJob,Job_Wizard;
+ set @weapon,$@kejc_wWizard;
+ set @weapon2,$@kejc_w2Wizard;
+ break;
+ case 3: //Sage
+ set @newJob,Job_Sage;
+ set @weapon,$@kejc_wSage;
+ set @weapon2,$@kejc_w2Sage;
+ break;
+ }
+ break;
+ case Job_Merchant:
+ switch (@submenu) {
+ case 2: //Blacksmith
+ set @newJob,Job_Blacksmith;
+ set @weapon,$@kejc_wBlacksmith;
+ set @weapon2,$@kejc_w2Blacksmith;
+ break;
+ case 3: //Alchemist
+ set @newJob,Job_Alchem;
+ set @weapon,$@kejc_wAlchemist;
+ set @weapon2,$@kejc_w2Alchemist;
+ break;
+ }
+ break;
+ case Job_Swordman:
+ switch (@submenu) {
+ case 2: //Knight
+ set @newJob,Job_Knight;
+ set @weapon,$@kejc_wKnight;
+ set @weapon2,$@kejc_w2Knight;
+ break;
+ case 3: //Crusader
+ set @newJob,Job_Crusader;
+ set @weapon,$@kejc_wCrusader;
+ set @weapon2,$@kejc_w2Crusader;
+ break;
+ default:
+ mes "uh oh";
+ break;
+ }
+ break;
+ case Job_Thief:
+ switch (@submenu) {
+ case 2: //Assassin
+ set @newJob,Job_Assassin;
+ set @weapon,$@kejc_wAssassin;
+ set @weapon2,$@kejc_w2Assassin;
+ break;
+ case 3: //Rogue
+ set @newJob,Job_Rogue;
+ set @weapon,$@kejc_wRogue;
+ set @weapon2,$@kejc_w2Rogue;
+ break;
+ }
+ break;
+ case Job_Taekwon:
+ switch (@submenu) {
+ case 2: //Star Gladiator
+ set @newJob,Job_Star_Gladiator;
+ set @weapon,$@kejc_wStarGladiator;
+ set @weapon2,$@kejc_w2StarGladiator;
+ break;
+ case 3: //Soul Linker
+ set @newJob,Job_Soul_Linker;
+ set @weapon,$@kejc_wSoulLinker;
+ set @weapon2,$@kejc_w2SoulLinker;
+ break;
+ }
+ break;
+ }
+ if (@submenu > 1) {
+ if (SF_changeJob(@job,Upper,@newJob,@upper,@weapon,@weapon2,$@kejc_cost2ND,0,0))
+ return;
+ }
+ } while (@submenu > 1);
+}
+
+//SubFunction: SF_testChangeJob(Zeny, BaseLv, JobLv)
+//Function that checks if the player qualifies for job changing.
+function SF_testChangeJob {
+ set @fail, 0;
+ if (Zeny < getarg(0))
+ set @fail, 1;
+ if (BaseLevel < getarg(1))
+ set @fail, @fail+2;
+ if (JobLevel < getarg(2))
+ set @fail, @fail+4;
+ if (@fail > 0) {
+ if (@fail&1)
+ mes "You need "+getarg(0)+"z for the conversion process.";
+ if (@fail&2)
+ mes "You need to be at least Lv "+getarg(1)+".";
+ if (@fail&4)
+ mes "You need at least job Lv "+getarg(2)+".";
+ callfunc "F_keIntro", e_pif, "Sorry, you don't qualify for a job change yet.";
+ return 0;
+ }
+
+ if (SkillPoint > 0 && $@kejc_skillsPolicy == 0) {
+ callfunc "F_keIntro", e_dots, "Sorry, use your remaining Skill points before being able to change class.";
+ return 0;
+ }
+ return 1;
+}
+
+//SubFunction: SF_changeJob (CurrentJobLv, CurrentJobType, NewJobBase, NewJobType
+//Weapon, Weapon2, Zeny, WipeSkills, ResetLv)
+//Attempts to change to the Jobgiven.
+//CurrentJobLv is 0-3 (novice, 1st class, 2nd class, s.novice)
+//Type is 0-2 (Normal, Advanced Class, Baby)
+//Weapon is the ID of the weapon to grant
+//Weapon2 is the alternative weapon granted when your job level is above $@kejc_wBonusLv
+//Zeny is the money required (if negative, it is money awarded)
+//WipeSkills if 1, indicates that skills should be wiped,
+//if 2, it means basic skills have to be given back
+//Reset Level indicates the base lv must be reset to 1.
+//Note: Zeny/Base/Job requirements should had been checked with SF_testChangeJob already!
+function SF_changeJob {
+ set @newjob,getarg(2);
+ set @newtype,getarg(3);
+ set @weapon,getarg(4);
+ set @weapon2,getarg(5);
+ set @cost,getarg(6);
+ set @wipeSkill,getarg(7);
+ set @resetLv,getarg(8);
+
+ set @jobStr$, callfunc("GF_getJobName2",@newjob, @newtype);
+ if (@wipeSkill == 0 && SkillPoint > 0 && $@kejc_skillsPolicy == 1) {
+ set @selection, select(
+ "- Do not change yet",
+ "- Change to "+@jobStr$+" (skill points lost)",
+ "- View details"
+ );
+ } else {
+ set @selection, select(
+ "- Cancel",
+ "- Change to "+@jobStr$,
+ "- View details"
+ );
+ }
+ switch (@selection) {
+ case 3: //Details
+ mes "Okay.. listen up:";
+ next;
+ mes "["+@name$+"]";
+ mes "Changing to "+@jobStr$+" now means:";
+ if (@wipeSkill == 0 && SkillPoint > 0 && $@kejc_skillsPolicy == 1)
+ mes "- You will lose your "+SkillPoint+" unused skill points.";
+ else if (@wipeSkill == 1)
+ mes "- You will lose all your skills.";
+ if (@resetLv)
+ mes "- Your base level will be reset to 1.";
+ if (@cost > 0)
+ mes "- You will be charged "+@cost+"z.";
+ else if (@cost < 0)
+ mes "- You will be aided with "+(0-@cost)+"z.";
+ if (@weapon > 0) {
+ if (@weapon2 > 0 && $@kejc_wBonusLv) {
+ if (JobLevel < $@kejc_wBonusLv) {
+ mes "- You will receive a "+getitemname(@weapon)+"["+getitemslots(@weapon)+"].";
+ mes "- If you wait until Job Lv"+$@kejc_wBonusLv+", you can receive instead a "+getitemname(@weapon2)+"["+getitemslots(@weapon)+"].";
+ } else {
+ mes "- You will receive a "+getitemname(@weapon2)+"["+getitemslots(@weapon)+"] for reaching Job Lv"+$@kejc_wBonusLv+".";
+ }
+ } else
+ mes "- You will receive a "+getitemname(@weapon)+".";
+ }
+ mes "So... will you change?";
+ if (select(
+ "- Cancel",
+ "- Change to "+@jobStr$
+ ) != 2) {
+ callfunc "F_keIntro", e_dots, "...alright.";
+ return 0;
+ }
+ callfunc "F_keIntro", -1, "Enjoy your new Job.";
+ case 2: //Change
+ //Set/Unset job path variables as needed.
+ if($@kejc_upperPolicy) {
+ set @class,getarg(0);
+ set @type, getarg(1);
+ if(@class == 1 && @type == 0)
+ set kej_class1,class; //Advancing to second class, so...
+ if(@class == 2)
+ set kej_class2,class; //Only way of being here is by doing a rebirth
+ if(@type > 0)
+ set kej_class1,0; //Clear when one is a high class
+ if(@type > 0 && @class == 1)
+ set kej_class2,0; //Clear when leaving high 1st class
+ }
+ if (@resetLv) {
+ jobchange Job_Novice_High; //Done to give players those 100 points from High classes
+ resetlvl(1);
+ }
+ if (@wipeSkill) {
+ resetskill;
+ setoption(0);
+ set SkillPoint,0;
+ } else if ($@kejc_skillsPolicy == 1)
+ set SkillPoint,0;
+ if (@wipeSkill>1)
+ skill 1,9,0;
+ if($@kejc_resetDye)
+ setlook 7,0;
+ jobchange @newjob, @newtype;
+ if ($@kejc_announce)
+ announce strcharinfo(0)+" has been promoted to "+@jobStr$+"!",8;
+ set Zeny,Zeny-@cost;
+ if ($@kejc_weaponPolicy && @weapon > 0) {
+ if ($@kejc_wBonusLv && @weapon2 > 0) {
+ if (JobLevel < $@kejc_wBonusLv)
+ getitem @weapon,1;
+ else
+ getitem @weapon2,1;
+ } else
+ getitem @weapon,1;
+ }
+ emotion e_grat;
+ return 1;
+ default: //Cancel...
+ callfunc "F_keIntro", e_dots, "...alright.";
+ return 0;
+ }
+}
+//SubFunction: SF_getJobNames(Qty, Jobid1, Jobid2,...)
+//Workaround until eA gets a fix for the bug where you can't use callfunc or
+//callsub within a menu
+function SF_getJobNames {
+ switch (getarg(0)) {
+ case 8:
+ set @name8$, callfunc("GF_getJobName2",getarg(8),@upper);
+ set @name7$, callfunc("GF_getJobName2",getarg(7),@upper);
+ set @name6$, callfunc("GF_getJobName2",getarg(6),@upper);
+ set @name5$, callfunc("GF_getJobName2",getarg(5),@upper);
+ set @name4$, callfunc("GF_getJobName2",getarg(4),@upper);
+ case 3:
+ set @name3$, callfunc("GF_getJobName2",getarg(3),@upper);
+ case 2:
+ set @name2$, callfunc("GF_getJobName2",getarg(2),@upper);
+ set @name1$, callfunc("GF_getJobName2",getarg(1),@upper);
+ }
+ return;
+}
+
+}